def check_for_collisions(entity): _x, _y = movement.get_position(entity) if _x < 0 or _x >= zones.get_active_size( )[0] - 1 or _y < 0 or _y >= zones.get_active_size()[1] - 1: entities.delete_entity(entity) return if (_x, _y) in zones.get_active_solids(entity): entities.trigger_event(entity, 'collision_with_solid') return for entity_id in entities.get_entity_group('life'): if entity_id == entity['owner']: continue if movement.get_position(entity) == movement.get_position_via_id( entity_id): entities.trigger_event(entity, 'collision_with_entity', target_id=entity_id) return
def _reload_weapon(entity, weapon_id, ammo_id): _weapon = entities.get_entity(weapon_id) _ammo = entities.get_entity(ammo_id) _weapon_ammo = flags.get_flag(_weapon, 'ammo') _weapon_ammo_max = flags.get_flag(_weapon, 'ammo_max') _ammo_count = flags.get_flag(_ammo, 'ammo') if _weapon_ammo == _weapon_ammo_max: return _need_ammo = numbers.clip(_weapon_ammo_max - _weapon_ammo, 1, _ammo_count) _ammo_count -= _need_ammo entities.trigger_event(_weapon, 'set_flag', flag='ammo', value=_weapon_ammo + _need_ammo) if _ammo_count: entities.trigger_event(_ammo, 'set_flag', flag='ammo', value=_ammo_count) else: entities.delete_entity(_ammo)
def hit(entity, projectile, damage_mod=1.0): _accuracy = random.uniform(.7, 1) _hit_map = [] for limb_name in entity['skeleton']['limbs']: _limb = entity['skeleton']['limbs'][limb_name] for i in range(int(round(_limb['health'] * _limb['accuracy']))): _hit_map.append(limb_name) _limb_name = random.choice(_hit_map) _limb = entity['skeleton']['limbs'][_limb_name] _damage = int( round((projectile['damage'] * _accuracy) * (numbers.clip( (1 - _limb['accuracy']), 0.25, .6) + .4))) _damage = int(round(_damage * damage_mod)) _limb['health'] -= _damage _x, _y = movement.get_position(entity) _x += int(round(random.uniform(-1, 1))) _y += int(round(random.uniform(-1, 1))) _mod = _limb['health'] / float(_limb['max_health']) #effects.explosion(_x, _y, 6) if not (_x, _y) in zones.get_active_solids(entity, ignore_calling_entity=True): #effects.blood(_x, _y) effects.blood_splatter( _x, _y, movement.get_direction(projectile) + random.randint(-5, 5)) entities.trigger_event(entity, 'animate', animation=['X', '@@'], repeat=4 * int(round((1 - _mod))), delay=20 * _mod) if _limb['health'] <= 0: if _limb['critical']: if projectile['owner'] in entities.ENTITIES: entities.trigger_event(entities.get_entity( projectile['owner']), 'log_kill', target_id=entity['_id']) entities.trigger_event(entity, 'killed_by', target_id=projectile['owner']) #entity['stats']['grave'] = {'':} entities.delete_entity(entity) else: if projectile['owner'] in entities.ENTITIES: entities.trigger_event(entities.get_entity(projectile['owner']), 'did_damage', target_id=entity['_id'], damage=_damage) entities.trigger_event(entity, 'damage', limb=_limb_name, damage=_damage)
def _tick_fire(entity): _x, _y = movement.get_position(entity) _alpha = flags.get_flag(entity, 'alpha') _alpha += random.uniform(-.3, .3) _alpha = numbers.clip(_alpha, 0, 1) if not _alpha: #char(_x, _y, numbers.clip(flags.get_flag(entity, 'alpha_max') - random.uniform(.1, .2), 0, 1)) entities.delete_entity(entity) return #entities.trigger_event(entity, 'set_char', char=random.choice(['*', '&', '%'])) _color = list(display.get_color_at('tiles', _x, _y)) _color[0] = numbers.interp_velocity(_color[0], random.choice([constants.FIRE_1, constants.FIRE_2, constants.FIRE_3]), _alpha) _color[1] = numbers.interp_velocity(_color[1], random.choice([constants.FIRE_1, constants.FIRE_2, constants.FIRE_3]), _alpha) for c in range(len(_color)): for i in range(len(_color)): _color[c][i] = int((round(_color[c][i]))) entities.trigger_event(entity, 'set_fore_color', color=_color[0]) entities.trigger_event(entity, 'set_back_color', color=_color[1]) entities.trigger_event(entity, 'set_flag', flag='alpha', value=_alpha)
def _smoke_shooter_push(entity): _x, _y = movement.get_position(entity) _direction = movement.get_direction(entity) _mod = random.randint(-35, 35) _alpha = flags.get_flag(entity, 'alpha') if _mod < 0: _mod = numbers.clip(_mod, -35, -20) else: _mod = numbers.clip(_mod, 20, 35) _direction += _mod _v_x, _v_y = numbers.velocity(_direction, random.uniform(.65, .85)) if not int(round(_x + _v_x)) == int(round(_x)) or not int(round(_y + _v_y)) == int(round(_y)): #smoke_cloud(_x + _v_x, _y + _v_y, random.randint(1, 2), start_alpha=_alpha, decay_amount=1.2) smoke(_x + _v_x, _y + _v_y, .75, start_amount=_alpha, decay_amount=random.uniform(3.0, 4.0)) _x += _v_x _y += _v_y if (int(round(_x)), int(round(_y))) in zones.get_active_solids({}, no_life=True): entities.delete_entity(entity) return entities.trigger_event(entity, 'set_direction', direction=_direction) entities.trigger_event(entity, 'set_position', x=_x, y=_y) entities.trigger_event(entity, 'set_flag', flag='alpha', value=_alpha - .05)
def clear_path(entity): for node_id in entity['node_grid']['path']: _last_node = entity['node_grid']['nodes'][node_id] entities.delete_entity(_last_node['node']) entities.trigger_event(entity, 'stop') entity['node_grid']['path'] = [] entity['node_grid']['nodes'] = {}
def _bullet_tick(entity): _direction = movement.get_direction(entity) entities.trigger_event(entity, 'push_tank', direction=_direction) _x, _y = movement.get_position(entity) _distance = numbers.distance((_x, _y), entity['start_position']) _starting_target_distance = numbers.distance(entity['start_position'], entity['end_position']) if _distance > _starting_target_distance + (12 - (entity['speed'] * 2)): entities.delete_entity(entity)
def delete(dialog): global ACTIVE_DIALOG entities.delete_entity(dialog) if ACTIVE_DIALOG == dialog: _dialogs = entities.get_entity_group('ui_dialogs') if _dialogs: ACTIVE_DIALOG = entities.get_entity(_dialogs[len(_dialogs) - 1]) entities.trigger_event(ACTIVE_DIALOG, 'reactivated') else: ACTIVE_DIALOG = None
def delete(dialog): global ACTIVE_DIALOG entities.delete_entity(dialog) if ACTIVE_DIALOG == dialog: _dialogs = entities.get_entity_group('ui_dialogs') if _dialogs: ACTIVE_DIALOG = entities.get_entity(_dialogs[len(_dialogs)-1]) entities.trigger_event(ACTIVE_DIALOG, 'reactivated') else: ACTIVE_DIALOG = None
def bullet(entity, x, y, tx, ty, speed, accuracy, damage): _entity = _create(x, y, 'Bullet', '.', 0, 'bullet') _entity['owner'] = entity['_id'] _entity['start_position'] = (x, y) _entity['end_position'] = (tx, ty) _entity['speed'] = speed _entity['damage'] = damage entities.add_entity_to_group(_entity, 'bullets') timers.register(_entity) entities.trigger_event(_entity, 'set_direction', direction=numbers.direction_to( (x, y), (tx, ty)) + random.uniform(-accuracy, accuracy)) entities.trigger_event(_entity, 'create_timer', time=speed, repeat=-1, enter_callback=_bullet_tick, repeat_callback=_bullet_tick) entities.register_event(_entity, 'position_changed', lambda e, **kwargs: check_for_collisions(e)) entities.register_event( _entity, 'collision_with_entity', lambda e, target_id: entities. trigger_event(entities.get_entity(target_id), 'hit', projectile=e)) entities.register_event(_entity, 'collision_with_entity', lambda e, target_id: entities.delete_entity(e)) entities.register_event( _entity, 'collision_with_solid', lambda e: effects.light( movement.get_position(e)[0], movement.get_position(e)[1], random.randint(3, 4))) entities.register_event(_entity, 'collision_with_solid', lambda e: entities.delete_entity(e)) entities.register_event( _entity, 'collision_with_solid', lambda e: effects.smoke_cloud(movement.get_position(e)[0], movement.get_position(e)[1], random.uniform(2, 2.75), start_alpha=random.uniform(0.45, .65), decay_amount=1.5)) entities.register_event(_entity, 'check_next_position', check_next_position) if not '--no-fx' in sys.argv: entities.register_event( _entity, 'position_changed', lambda e, x, y, **kwargs: _bullet_effects(e, x, y))
def delete(menu): global ACTIVE_MENU, DELAY entities.delete_entity(menu) if ACTIVE_MENU == menu: _menus = entities.get_entity_group('ui_menus') if _menus: ACTIVE_MENU = entities.get_entity(_menus[len(_menus)-1]) entities.trigger_event(ACTIVE_MENU, 'reactivated') else: ACTIVE_MENU = None DELAY = 30
def delete(menu): global ACTIVE_MENU, DELAY entities.delete_entity(menu) if ACTIVE_MENU == menu: _menus = entities.get_entity_group('ui_menus') if _menus: ACTIVE_MENU = entities.get_entity(_menus[len(_menus) - 1]) entities.trigger_event(ACTIVE_MENU, 'reactivated') else: ACTIVE_MENU = None DELAY = 30
def _vapor_fade(entity): entity['alpha'] -= entity['fade_rate'] if entity['alpha'] <= 0: entities.delete_entity(entity) return _x, _y = movement.get_position(entity) _color = list(display.get_color_at('tiles', _x, _y)) _color[0] = numbers.interp_velocity(_color[0], (255, 255, 255), entity['alpha']) _color[1] = numbers.interp_velocity(_color[1], (255, 255, 255), entity['alpha']) for c in range(len(_color)): for i in range(len(_color)): _color[c][i] = int((round(_color[c][i]))) entities.trigger_event(entity, 'set_fore_color', color=_color[0]) entities.trigger_event(entity, 'set_back_color', color=_color[1])
def _tick_smoke(entity): _x, _y = movement.get_position(entity) _alpha = flags.get_flag(entity, 'alpha') _alpha_mode = flags.get_flag(entity, 'alpha_mode') _alpha_max = flags.get_flag(entity, 'alpha_max') _fore_color = flags.get_flag(entity, 'fore_color') _back_color = flags.get_flag(entity, 'back_color') _decay_mod = flags.get_flag(entity, 'decay') if _alpha_mode: _alpha -= random.uniform(.001 * _decay_mod, .005 * _decay_mod) if _alpha <= 0: display._set_char('tiles', _x, _y, ' ', (0, 0, 0), None) entities.delete_entity(entity) return else: _alpha += random.uniform(.01, .05) if _alpha > _alpha_max: _alpha_mode = 1 _alpha = numbers.clip(_alpha, 0, 1) #entities.trigger_event(entity, 'set_char', char=random.choice(['*', '&', '%'])) _color = list(display.get_color_at('tiles', _x, _y)) _color[0] = numbers.interp_velocity(_color[0], _fore_color, _alpha) _color[1] = numbers.interp_velocity(_color[1], _back_color, _alpha) for c in range(len(_color)): for i in range(len(_color)): _color[c][i] = int((round(_color[c][i]))) entities.trigger_event(entity, 'set_fore_color', color=_color[0]) entities.trigger_event(entity, 'set_back_color', color=_color[1]) entities.trigger_event(entity, 'set_flag', flag='alpha', value=_alpha) entities.trigger_event(entity, 'set_flag', flag='alpha_mode', value=_alpha_mode)
def cleanup(entity): _squad = ai_squads.get_assigned_squad(entity) _squad['members'].remove(entity['_id']) if _squad['leader'] == entity['_id']: logging.warning('Leader of squad died. Handle this.') if _squad['members']: _squad['leader'] = list(_squad['members'])[0] else: _squad['leader'] = None if entity['_id'] in _squad['member_info']: del _squad['member_info'][entity['_id']] if not _squad['members']: del FACTIONS[_squad['faction']]['squads'][_squad['squad_id']] entities.delete_entity(_squad)
def check_for_collisions(entity): _x, _y = movement.get_position(entity) if _x < 0 or _x >= zones.get_active_size()[0]-1 or _y < 0 or _y >= zones.get_active_size()[1]-1: entities.delete_entity(entity) return if (_x, _y) in zones.get_active_solids(entity): entities.trigger_event(entity, 'collision_with_solid') return for entity_id in entities.get_entity_group('life'): if entity_id == entity['owner']: continue if movement.get_position(entity) == movement.get_position_via_id(entity_id): entities.trigger_event(entity, 'collision_with_entity', target_id=entity_id) return
def bullet(entity, x, y, tx, ty, speed, accuracy, damage): _entity = _create(x, y, 'Bullet', '.', 0, 'bullet') _entity['owner'] = entity['_id'] _entity['start_position'] = (x, y) _entity['end_position'] = (tx, ty) _entity['speed'] = speed _entity['damage'] = damage entities.add_entity_to_group(_entity, 'bullets') timers.register(_entity) entities.trigger_event(_entity, 'set_direction', direction=numbers.direction_to((x, y), (tx, ty))+random.uniform(-accuracy, accuracy)) entities.trigger_event(_entity, 'create_timer', time=speed, repeat=-1, enter_callback=_bullet_tick, repeat_callback=_bullet_tick) entities.register_event(_entity, 'position_changed', lambda e, **kwargs: check_for_collisions(e)) entities.register_event(_entity, 'collision_with_entity', lambda e, target_id: entities.trigger_event(entities.get_entity(target_id), 'hit', projectile=e)) entities.register_event(_entity, 'collision_with_entity', lambda e, target_id: entities.delete_entity(e)) entities.register_event(_entity, 'collision_with_solid', lambda e: effects.light(movement.get_position(e)[0], movement.get_position(e)[1], random.randint(3, 4))) entities.register_event(_entity, 'collision_with_solid', lambda e: entities.delete_entity(e)) entities.register_event(_entity, 'collision_with_solid', lambda e: effects.smoke_cloud(movement.get_position(e)[0], movement.get_position(e)[1], random.uniform(2, 2.75), start_alpha=random.uniform(0.45, .65), decay_amount=1.5)) entities.register_event(_entity, 'check_next_position', check_next_position) if not '--no-fx' in sys.argv: entities.register_event(_entity, 'position_changed', lambda e, x, y, **kwargs: _bullet_effects(e, x, y))
def _counter_2d_tick(entity): for i in range(int(entity['passes'])): if entity['x']['current'] < entity['x']['max']-1: entity['callback'](entity['x']['current'], entity['y']['current']) if entity['y']['current'] < entity['y']['max']-1: entity['y']['current'] += 1 else: entity['y']['current'] = 0 entity['x']['current'] += 1 else: entity['callback'](entity['x']['current'], entity['y']['current']) entities.trigger_event(entity, 'finish') return entities.delete_entity(entity)
def _muzzle_delete(entity): entities.delete_entity(entity)
def _fire_movement(entity, x, y, **kwargs): _solids = zones.get_active_solids({}, no_life=True) if (x, y) in _solids: entities.delete_entity(entity)
def handle_mouse_pressed(entity, x, y, button): global DRAGGING_NODE, LAST_CLICKED_POS, SELECTING_TARGET_CALLBACK if ui_menu.get_active_menu() or ui_menu.DELAY: return if timers.has_timer_with_name(entity, 'passout'): return _x = x + camera.X _y = y + camera.Y if button == 1: if DRAGGING_NODE: DRAGGING_NODE = None elif not (_x, _y) in zones.get_active_solids(entity): if not DRAGGING_NODE: for entity_id in [ t for t in entity['ai']['visible_life'] if entity['ai']['life_memory'][t]['can_see'] ]: if entity['_id'] == entity_id: continue _entity = entities.get_entity(entity_id) _tx, _ty = movement.get_position(_entity) if (_x, _y) == (_tx, _ty): if SELECTING_TARGET_CALLBACK: SELECTING_TARGET_CALLBACK(entity, entity_id) SELECTING_TARGET_CALLBACK = None else: LAST_CLICKED_POS = (_x, _y) create_life_interact_menu(entity, entity_id) return else: for entity_id in entities.get_entity_group('contexts'): _entity = entities.get_entity(entity_id) if not _entity['callback']: continue if (_entity['tile']['x'], _entity['tile']['y']) == (_x, _y): _entity['callback'](x + 2, y - 3) return else: for entity_id in list(entity['ai']['targets'] - entity['ai']['visible_life']): _tx, _ty = entity['ai']['life_memory'][entity_id][ 'last_seen_at'] if (_tx, _ty - 2) == (_x, _y): ui_dialog.create( x + 2, y - 3, '%s - Last seen <time>' % entities.get_entity( entity_id)['stats']['name']) return else: for entity_id in entities.get_entity_group( 'items'): _item = entities.get_entity(entity_id) if _item['stats']['owner']: continue if (_x, _y) == movement.get_position(_item): create_item_menu(entity, _item, _x, _y) return create_walk_node(entity, _x, _y, clear=True) return for node in entity['node_grid']['nodes'].values(): if (_x, _y) == (node['node']['x'], node['node']['y']): DRAGGING_NODE = node entities.trigger_event(DRAGGING_NODE['node'], 'set_fore_color', color=(255, 255, 0)) break if (_x, _y) in node['node']['path']: if not (_x, _y) in node['node']['busy_pos']: LAST_CLICKED_POS = (_x, _y) create_action_menu(entity, LAST_CLICKED_POS[0], LAST_CLICKED_POS[1], on_path=True) else: LAST_CLICKED_POS = None return elif button == 2: if DRAGGING_NODE: entities.trigger_event(DRAGGING_NODE['node'], 'set_fore_color', color=(255, 255, 255)) DRAGGING_NODE = None else: for node in entity['node_grid']['nodes'].values(): if (_x, _y) == (node['node']['x'], node['node']['y']): entity['node_grid']['path'].remove(node['node']['_id']) entities.delete_entity(node['node']) redraw_path(entity) del entity['node_grid']['nodes'][node['node']['_id']] if not entity['node_grid']['nodes']: clear_path(entity) break else: create_walk_node(entity, _x, _y)
def complete_mission(mission): entities.delete_entity(mission) logging.info('STUB: Mission complete.')
def _printer_exit(entity): entities.delete_entity(entity)
def handle_mouse_pressed(entity, x, y, button): global DRAGGING_NODE, LAST_CLICKED_POS, SELECTING_TARGET_CALLBACK if ui_menu.get_active_menu() or ui_menu.DELAY: return if timers.has_timer_with_name(entity, 'passout'): return _x = x+camera.X _y = y+camera.Y if button == 1: if DRAGGING_NODE: DRAGGING_NODE = None elif not (_x, _y) in zones.get_active_solids(entity): if not DRAGGING_NODE: for entity_id in [t for t in entity['ai']['visible_life'] if entity['ai']['life_memory'][t]['can_see']]: if entity['_id'] == entity_id: continue _entity = entities.get_entity(entity_id) _tx, _ty = movement.get_position(_entity) if (_x, _y) == (_tx, _ty): if SELECTING_TARGET_CALLBACK: SELECTING_TARGET_CALLBACK(entity, entity_id) SELECTING_TARGET_CALLBACK = None else: LAST_CLICKED_POS = (_x, _y) create_life_interact_menu(entity, entity_id) return else: for entity_id in entities.get_entity_group('contexts'): _entity = entities.get_entity(entity_id) if not _entity['callback']: continue if (_entity['tile']['x'], _entity['tile']['y']) == (_x, _y): _entity['callback'](x+2, y-3) return else: for entity_id in list(entity['ai']['targets'] - entity['ai']['visible_life']): _tx, _ty = entity['ai']['life_memory'][entity_id]['last_seen_at'] if (_tx, _ty-2) == (_x, _y): ui_dialog.create(x + 2, y - 3, '%s - Last seen <time>' % entities.get_entity(entity_id)['stats']['name']) return else: for entity_id in entities.get_entity_group('items'): _item = entities.get_entity(entity_id) if _item['stats']['owner']: continue if (_x, _y) == movement.get_position(_item): create_item_menu(entity, _item, _x, _y) return create_walk_node(entity, _x, _y, clear=True) return for node in entity['node_grid']['nodes'].values(): if (_x, _y) == (node['node']['x'], node['node']['y']): DRAGGING_NODE = node entities.trigger_event(DRAGGING_NODE['node'], 'set_fore_color', color=(255, 255, 0)) break if (_x, _y) in node['node']['path']: if not (_x, _y) in node['node']['busy_pos']: LAST_CLICKED_POS = (_x, _y) create_action_menu(entity, LAST_CLICKED_POS[0], LAST_CLICKED_POS[1], on_path=True) else: LAST_CLICKED_POS = None return elif button == 2: if DRAGGING_NODE: entities.trigger_event(DRAGGING_NODE['node'], 'set_fore_color', color=(255, 255, 255)) DRAGGING_NODE = None else: for node in entity['node_grid']['nodes'].values(): if (_x, _y) == (node['node']['x'], node['node']['y']): entity['node_grid']['path'].remove(node['node']['_id']) entities.delete_entity(node['node']) redraw_path(entity) del entity['node_grid']['nodes'][node['node']['_id']] if not entity['node_grid']['nodes']: clear_path(entity) break else: create_walk_node(entity, _x, _y)
def kill(entity, **kwargs): entities.delete_entity(entity)