def tick_eyemine(entity): if 'max_explode_velocity' in entity and entity['current_speed']>=entity['max_explode_velocity']: entities.trigger_event(entity, 'kill') entities.trigger_event(entity, 'explode') return entities.delete_entity(entity) if entity['current_target'] and entity['current_target'] in entities.ENTITIES: _target_object = entities.get_entity(entity['current_target']) else: _target_object = None for soldier_id in entities.get_sprite_groups(['enemies', 'players']): if entity['_id'] == soldier_id: continue if numbers.distance(entity['position'], entities.get_entity(soldier_id)['position'], old=True)>50: continue if _target_object and not entity['current_target'] == soldier_id and 'player' in _target_object: entities.trigger_event(_target_object, 'score', target_id=entity['_id'], amount=10, text='Creative Escape') entities.trigger_event(entities.get_entity(soldier_id), 'hit', damage=6, target_id=entity['_id']) entities.trigger_event(entity, 'kill') entities.trigger_event(entity, 'explode') entities.delete_entity(entity) break
def handle_camera(entity_id, min_zoom=3.5, max_zoom=14.5, max_enemy_distance=2400, center_distance=600.0): if not entity_id in entities.ENTITIES: display.CAMERA['zoom_speed'] = .005 display.CAMERA['next_zoom'] = 4.5 return False if not clock.is_ticking(): return False _player = entities.get_entity(entity_id) _center_pos = _player['position'].copy() _median_distance = [] if 'in_space' in _player and _player['in_space']: _distance_to_center = numbers.distance(_player['position'], (worlds.get_size()[0]/2, worlds.get_size()[1]/2)) _min_zoom = 2.0 _max_zoom = max_zoom display.CAMERA['next_zoom'] = numbers.clip(_max_zoom*((_distance_to_center/3000.0)-1), _min_zoom, _max_zoom) elif _player['death_timer'] == -1: for enemy_id in entities.get_sprite_groups(['enemies', 'hazards']): _enemy = entities.get_entity(enemy_id) if 'player' in _enemy: continue _dist = numbers.distance(_player['position'], _enemy['position']) if _dist>=max_enemy_distance: continue _median_distance.append(_dist) _center_pos = numbers.interp_velocity(_center_pos, _enemy['position'], 0.5) if not _median_distance: _median_distance = [0] _distance_to_nearest_enemy = sum(_median_distance)/len(_median_distance) _min_zoom = min_zoom _max_zoom = max_zoom display.CAMERA['next_zoom'] = numbers.clip(_max_zoom*(_distance_to_nearest_enemy/float(center_distance)), _min_zoom, _max_zoom) else: display.CAMERA['zoom_speed'] = .05 display.CAMERA['next_zoom'] = 1.5 if display.CAMERA['next_zoom'] < 5: display.CAMERA['next_center_on'] = _center_pos else: display.CAMERA['next_center_on'] = _player['position'].copy()
def create_planet(): for entity_id in entities.get_sprite_groups(['items', 'planets']): entities.delete_entity(entities.ENTITIES[entity_id]) if LEVEL == 1: _planet = entities.create_entity(group='planets') sprites.register_entity(_planet, 'effects_foreground', 'planet.png', scale=1.0) movement.register_entity(_planet, x=worlds.get_size()[0]/2, y=worlds.get_size()[1]/2, speed=0) effects.create_image(_planet['position'][0], _planet['position'][1], 'ring.png', background=2, scale=2, parent_entity=_planet) items.create_gravity_well(x=worlds.get_size()[0]/2, y=worlds.get_size()[1]/2, strength=0.25) elif LEVEL == 2: ships.create_ivan_large(x=worlds.get_size()[0]/2, y=worlds.get_size()[1]/2) items.create_gravity_well(x=worlds.get_size()[0]/2, y=worlds.get_size()[1]/2, min_distance=1000, kill_engines=False, strength=0.75) return True
def _gravity_well(entity): _moving_groups = [name for name in entities.GROUPS if not name in entity['_groups'] and not name in entities.IGNORE_ENTITY_GROUPS] for entity_id in entities.get_sprite_groups(_moving_groups): _entity = entities.get_entity(entity_id) if numbers.distance(entity['position'], _entity['position'])<entity['min_distance']: _entity['in_space'] = False continue if entity['kill_engines']: _entity['in_space'] = True _velocity = numbers.velocity(numbers.direction_to(_entity['position'], entity['position']), entity['strength']) entities.trigger_event(_entity, 'push', velocity=_velocity)
def find_target(entity, max_distance=-1): _closest_target = {'enemy_id': None, 'distance': 0} _enemy_sprite_groups = [name for name in entities.GROUPS if not name in entity['_groups'] and not name in entities.IGNORE_ENTITY_GROUPS] for soldier_id in entities.get_sprite_groups(_enemy_sprite_groups): if entity['_id'] == soldier_id: continue _distance = numbers.distance(entity['position'], entities.get_entity(soldier_id)['position']) if max_distance>-1 and _distance>max_distance: continue if not _closest_target['enemy_id'] or _distance<_closest_target['distance']: _closest_target['distance'] = _distance _closest_target['enemy_id'] = soldier_id return _closest_target['enemy_id']
def tick(bullet): for soldier_id in entities.get_sprite_groups(bullet['enemy_sprite_groups']): if bullet['owner_id'] == soldier_id: continue _entity = entities.get_entity(soldier_id) if numbers.distance(bullet['position'], _entity['position'], old=True)-_entity['collision_radius']>bullet['damage_radius']: continue if bullet['owner_id'] in entities.ENTITIES and 'player' in entities.get_entity(bullet['owner_id']): effects.create_particle(bullet['position'][0], bullet['position'][1], 'hitmarker.png', direction=random.randint(0, 359), speed=random.randint(25, 30), background=False, fade_rate=0.8, scale_rate=1.02) entities.trigger_event(bullet, 'hit', target_id=soldier_id) entities.trigger_event(_entity, 'hit', damage=bullet['damage'], target_id=bullet['owner_id']) entities.delete_entity(bullet)
def find_target(entity, max_distance=-1): _closest_target = {'enemy_id': None, 'distance': 0} _enemy_sprite_groups = [ name for name in entities.GROUPS if not name in entity['_groups'] and not name in entities.IGNORE_ENTITY_GROUPS ] for soldier_id in entities.get_sprite_groups(_enemy_sprite_groups): if entity['_id'] == soldier_id: continue _distance = numbers.distance( entity['position'], entities.get_entity(soldier_id)['position']) if max_distance > -1 and _distance > max_distance: continue if not _closest_target[ 'enemy_id'] or _distance < _closest_target['distance']: _closest_target['distance'] = _distance _closest_target['enemy_id'] = soldier_id return _closest_target['enemy_id']
def handle_input(entity_id): if not entity_id in entities.ENTITIES or not 'player' in entities.ENTITIES[entity_id]: if controls.key_pressed(' '): battlefield.clean() battlefield.create_player() battlefield.spawn_enemies() return False if not clock.is_ticking() and controls.key_pressed(' '): clock.hang_for(0) _entity = entities.get_entity(entity_id) _move_speed = _entity['speed'] if controls.key_held('s'): #entities.trigger_event(_entity, 'accelerate', velocity=[0, _move_speed]) entities.trigger_event(_entity, 'set_direction', direction=270) entities.trigger_event(_entity, 'thrust') if controls.key_held('a'): #entities.trigger_event(_entity, 'accelerate', velocity=[-_move_speed, 0]) entities.trigger_event(_entity, 'set_direction', direction=180) entities.trigger_event(_entity, 'thrust') if controls.key_held('d'): #entities.trigger_event(_entity, 'accelerate', velocity=[_move_speed, 0]) entities.trigger_event(_entity, 'set_direction', direction=0) entities.trigger_event(_entity, 'thrust') if controls.key_held('w'): #entities.trigger_event(_entity, 'accelerate', velocity=[0, -_move_speed]) entities.trigger_event(_entity, 'set_direction', direction=90) entities.trigger_event(_entity, 'thrust') if controls.key_pressed('q'): entities.trigger_event(_entity, 'create_timer', time=120, enter_callback=lambda entity: entities.trigger_event(_entity, 'set_maximum_velocity', velocity=[80, 80]) and entities.trigger_event(_entity, 'set_speed', speed=80), exit_callback=lambda entity: entities.trigger_event(_entity, 'set_maximum_velocity', velocity=[30, 30])) if controls.key_pressed('v'): for entity_id in entities.get_sprite_groups(['hazards', 'enemies']): entities.delete_entity_via_id(entity_id) if controls.key_held_ord(controls.NUM_1): entities.trigger_event(_entity, 'shoot', direction=225) if controls.key_held_ord(controls.NUM_2): entities.trigger_event(_entity, 'shoot', direction=270) if controls.key_held_ord(controls.NUM_3): entities.trigger_event(_entity, 'shoot', direction=315) if controls.key_held_ord(controls.NUM_4): entities.trigger_event(_entity, 'shoot', direction=180) if controls.key_held_ord(controls.NUM_6): entities.trigger_event(_entity, 'shoot', direction=0) if controls.key_held_ord(controls.NUM_7): entities.trigger_event(_entity, 'shoot', direction=135) if controls.key_held_ord(controls.NUM_8): entities.trigger_event(_entity, 'shoot', direction=90) if controls.key_held_ord(controls.NUM_9): entities.trigger_event(_entity, 'shoot', direction=45) if controls.key_held_ord(controls.NUM_5): entities.trigger_event(_entity, 'shoot_alt') if controls.key_held('x'): battlefield.clean()