def tick_track(entity): #_target_id = find_target(entity) _target_id = entity['current_target'] if 'in_space' in entity and entity['in_space']: return False if entity['hp'] <= 0 or not _target_id in entities.ENTITIES: entity['current_target'] = None entities.unregister_event(entity, 'tick', tick_track) return False if not _target_id: entities.trigger_event(entity, 'accelerate', velocity=(0, 0)) return False _target = entities.get_entity(_target_id) _direction_to = numbers.direction_to(entity['position'], _target['position']) _degrees_to = abs(entity['direction'] - _direction_to) if _degrees_to >= 180: _direction_to += 360 _new_direction = numbers.interp(entity['direction'], _direction_to, entity['turn_rate']) _direction_difference = abs(entity['direction'] - _new_direction) entity['direction'] = _new_direction entities.trigger_event(entity, 'thrust')
def loop(entity): if not entity['smooth_draw']: entity['sprite'].set_position_and_rotate_and_scale(entity['position'][0], display.get_window_size()[1]+entity['position'][1], entity['next_rotation'], entity['next_scale']) if not entity['last_scale'] and not entity['next_scale']: entities.unregister_event(entity, 'loop', loop) else: _dt = worlds.get_interp() img = entity['sprite']._texture _scale = numbers.interp(entity['last_scale'], entity['next_scale'], _dt) x1 = int(entity['sprite']._x - img.anchor_x * _scale) y1 = int(entity['sprite']._y - img.anchor_y * _scale) x2 = int(x1 + img.width * _scale) y2 = int(y1 + img.height * _scale) entity['sprite']._scale = _scale if not entity['sprite']._visible: entity['sprite']._vertex_list.vertices[:] = [0, 0, 0, 0, 0, 0, 0, 0] else: entity['sprite']._vertex_list.vertices[:] = [x1, y1, x2, y1, x2, y2, x1, y2] return False _dt = worlds.get_interp() _rot = numbers.interp(entity['last_rotation'], entity['next_rotation'], _dt) entity['sprite'].set_position_and_rotate_and_scale(int(round(numbers.interp(entity['last_position'][0], entity['position'][0], _dt))), numbers.interp(display.get_window_size()[1]+entity['last_position'][1], display.get_window_size()[1]+entity['position'][1], _dt), _rot, numbers.interp(entity['last_scale'], entity['next_scale'], _dt))
def tick_track(entity): #_target_id = find_target(entity) _target_id = entity['current_target'] if 'in_space' in entity and entity['in_space']: return False if entity['hp']<=0 or not _target_id in entities.ENTITIES: entity['current_target'] = None entities.unregister_event(entity, 'tick', tick_track) return False if not _target_id: entities.trigger_event(entity, 'accelerate', velocity=(0, 0)) return False _target = entities.get_entity(_target_id) _direction_to = numbers.direction_to(entity['position'], _target['position']) _degrees_to = abs(entity['direction']-_direction_to) if _degrees_to>=180: _direction_to += 360 _new_direction = numbers.interp(entity['direction'], _direction_to, entity['turn_rate']) _direction_difference = abs(entity['direction']-_new_direction) entity['direction'] = _new_direction entities.trigger_event(entity, 'thrust')
def tick(entity): entity['recoil_time'] -= 1 if not entity['owner_id'] in entities.ENTITIES: entities.unregister_event(entity, 'tick', tick) return False if entity['recoil_time']>0: return False elif not entity['rounds']: if entity['reload_time']: if entity['owner_id'] in entities.ENTITIES and 'player' in entities.get_entity(entity['owner_id']) and entity['reload_time'] == entity['reload_time_max']: display.print_text(0, 0, 'RELOADING', show_for=(entity['reload_time']/display.get_tps())*2, fade_out_speed=255) entity['reload_time'] -= 1 else: entity['reload_time'] = entity['reload_time_max'] entity['recoil_time'] = 1 entity['rounds'] = entity['max_rounds'] entity['firing'] = False entities.unregister_event(entity, 'tick', tick) return False _owner = entities.get_entity(entity['owner_id']) if 'shoot_direction' in entity: _direction = entity['shoot_direction'] elif 'shoot_direction' in _owner: _direction = _owner['shoot_direction'] else: _direction = _owner['direction'] if entity['kickback']: entities.trigger_event(entities.get_entity(entity['owner_id']), 'push', velocity=numbers.velocity(_direction+180, entity['kickback'])) if entity['missile']: bullet.create_missile(_owner['position'][0], _owner['position'][1], _direction, entity['speed'], 'bullet.png', entity['owner_id'], turn_rate=entity['turn_rate'], tracking=entity['tracking'], radius=entity['damage_radius']) if entity['bullet']: bullet.create_bullet(_owner['position'][0], _owner['position'][1], _direction+random.randint(-entity['spray'], entity['spray']), entity['speed'], 'bullet.png', entity['owner_id'], scale=.6, radius=entity['damage_radius']) entity['recoil_time'] = entity['recoil_time_max'] entity['rounds'] -= 1
def tick_guard(entity): if 'in_space' in entity and entity['in_space']: return False if entity['hp']<=0: entities.unregister_event(entity, 'tick', tick_guard) return False if not entity['current_target']: _target_id = find_target(entity, max_distance=350) if _target_id: entities.trigger_event(entity, 'set_direction', direction=numbers.direction_to(entity['position'], entities.get_entity(_target_id)['position'])) track_target(entity, _target_id)
def tick_guard(entity): if 'in_space' in entity and entity['in_space']: return False if entity['hp'] <= 0: entities.unregister_event(entity, 'tick', tick_guard) return False if not entity['current_target']: _target_id = find_target(entity, max_distance=350) if _target_id: entities.trigger_event( entity, 'set_direction', direction=numbers.direction_to( entity['position'], entities.get_entity(_target_id)['position'])) track_target(entity, _target_id)
def create_particle(x, y, sprite_name, background=True, scale=1, rotation=0, friction=0, scale_min=0.15, scale_max=5, direction=0, speed=0, scale_rate=1.0, fade_rate=1.0, spin=0, flashes=-1, flash_chance=0, streamer=False, streamer_chance=0.3, swerve_rate=0, swerve_speed=25, force_smooth_draw=False): _entity = entities.create_entity() _entity['scale_rate'] = scale_rate _entity['scale_min'] = scale_min _entity['scale_max'] = scale_max _entity['fade_rate'] = fade_rate _entity['flash_chance'] = flash_chance _entity['flashes'] = flashes _entity['spin'] = spin _entity['streamer'] = streamer _entity['swerve_rate'] = swerve_rate _entity['swerve_speed'] = swerve_speed _entity['swerve_speed_max'] = swerve_speed _entity['NO_BOUNCE'] = True if streamer: _entity['sprite_name'] = sprite_name _entity['background'] = background _entity['streamer_chance'] = streamer_chance movement.register_entity(_entity, x=x, y=y) entities.add_entity_to_group('effects', _entity) entities.trigger_event(_entity, 'set_direction', direction=direction) entities.trigger_event(_entity, 'set_speed', speed=speed) entities.trigger_event(_entity, 'thrust') if _entity['speed'] or force_smooth_draw: _smooth_draw = True else: _smooth_draw = False entities.register_event(_entity, 'moved', lambda entity, **kwargs: entities.trigger_event(entity, 'redraw')) #TODO: Hack entities.register_event(_entity, 'moved', lambda entity, **kwargs: entities.unregister_event(entity, 'tick', movement.tick)) if background: sprites.register_entity(_entity, 'effects_background', sprite_name, scale=scale, smooth_draw=_smooth_draw) else: sprites.register_entity(_entity, 'effects_foreground', sprite_name, scale=scale, smooth_draw=_smooth_draw) if swerve_rate: _entity['sprite'].opacity = 0 entities.register_event(_entity, 'tick', tick_particle) entities.trigger_event(_entity, 'set_friction', friction=friction) entities.trigger_event(_entity, 'set_rotation', degrees=rotation) return _entity
def create_missile(x, y, direction, speed, sprite_name, owner_id, life=3000, scale=.2, turn_rate=.15, tracking=True, drunk=True, radius=50): _bullet = create(x, y, direction, speed, sprite_name, owner_id, life=life, turn_rate=turn_rate, radius=radius) _owner = entities.get_entity(_bullet['owner_id']) _bullet['sprite'].anchor_x = 0 _bullet['sprite'].anchor_y = sprites.get_size(_bullet['sprite'])[1]/2 entities.trigger_event(_bullet, 'set_scale', scale=scale) entities.register_event(_bullet, 'tick', tick_missile) entities.register_event(_bullet, 'hit', hit_missile) if drunk: entities.register_event(_bullet, 'tick', tick_drunk) if tracking: _bullet['target_id'] = ai.find_target(_owner, max_distance=1600) if _bullet['target_id']: _target = entities.get_entity(_bullet['target_id']) entities.register_event(_bullet, 'tick', tick_track) entities.register_event(_target, 'delete', lambda target: _bullet['_id'] in entities.ENTITIES and entities.unregister_event(_bullet, 'tick', tick_track)) if 'player' in _owner and _owner['player']: effects.create_particle(_target['position'][0], _target['position'][1], 'crosshair.png', background=False, scale_rate=.95, fade_rate=.98, spin=random.choice([-3, -6, 3, 6])) else: _bullet['target_id'] = None _bullet['engine_power'] = 100 return _bullet