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 _explosive_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['end_position']) _starting_target_distance = numbers.distance(entity['start_position'], entity['end_position']) if _distance <= entity['accuracy'] * 2.5: entity['slow_down'] = True if entity['slow_down']: entity['speed'] = numbers.clip(entity['speed'] * 1.2, 0, 40) if entity['speed'] < 40: entities.trigger_event(entity, 'create_timer', time=int(round(entity['speed'])), name='movement', exit_callback=_explosive_tick) else: entities.trigger_event(entity, 'activate_explosive')
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 _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 _blood_splatter_push(entity): _x, _y = movement.get_position(entity) _direction = movement.get_direction(entity) + random.randint(-25, 25) _v_x, _v_y = numbers.velocity(_direction, random.uniform(.55, .75)) if not int(round(_x + _v_x)) == int(round(_x)) or not int(round(_y + _v_y)) == int(round(_y)): blood(_x + _v_x, _y + _v_y) _x += _v_x _y += _v_y entities.trigger_event(entity, 'set_direction', direction=_direction) entities.trigger_event(entity, 'set_position', x=_x, y=_y)
def _muzzle_flash_move(entity): _direction = movement.get_direction(entity) _nx, _ny = numbers.velocity(_direction, 1) movement.push(entity, _nx, _ny, time=3)