Beispiel #1
0
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')
Beispiel #2
0
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))
Beispiel #3
0
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')
Beispiel #4
0
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
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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
Beispiel #8
0
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