예제 #1
0
파일: ui_panel.py 프로젝트: witheld9/r3-tdw
def show_weapons(entity):
	global ACTIVE_MENU, REDRAW_TIMES

	_holder_menu = ui_menu.create(1, 1, title='Weapons', surface='ui_inventory', click_offset=(constants.MAP_VIEW_WIDTH-35, 0))
	ACTIVE_MENU = _holder_menu
	REDRAW_TIMES = 3

	_equipped_weapon = items.get_items_in_holder(entity, 'weapon')
	_weapons = []
	
	if _equipped_weapon:
		_weapons.append(_equipped_weapon[0])
	
	for item_id in items.get_items_matching(entity, {'type': 'weapon'}):
		if item_id in _weapons:
			continue
		
		_weapons.add(item_id)
	
	for item_id in _weapons:
		_item = entities.get_entity(item_id)
		
		entities.trigger_event(_item, 'get_display_name')
		
		if item_id in _equipped_weapon:
			_fg = (245, 245, 245)
		else:
			_fg = (230, 230, 230)

		ui_menu.add_selectable(_holder_menu,
		                       _item['stats']['display_name'],
		                       show_weapon_menu,
		                       fore_color=_fg,
		                       item_id=item_id)
예제 #2
0
def give_item(entity, target_id, item_match):
	_items = items.get_items_matching(entity, item_match)
	
	if not _items:
		entities.trigger_event(entity, 'receive_memory',
		                       member_id=entity['_id'],
		                       memory={},
		                       message='You got the item yet?')
		return None
	
	entities.trigger_event(entity, 'give_item', item_id=_items[0], target_id=target_id)
예제 #3
0
파일: life.py 프로젝트: witheld9/r3-tdw
def reload_weapon(entity):
	if timers.has_timer_with_name(entity, 'Reloading'):
		return

	_weapon = items.get_items_in_holder(entity, 'weapon')[0]
	_ammo = items.get_items_matching(entity, {'type': 'ammo'})[0]

	entities.trigger_event(entity,
		                   'create_timer',
		                   time=30,
		                   name='Reloading',
		                   exit_callback=lambda _: _reload_weapon(entity, _weapon, _ammo))
예제 #4
0
def _return_item_message(goal, member_id):
    _item_name = goal['item_name']
    _target_id = goal['target_id']
    _member = entities.get_entity(member_id)
    _mission = entities.get_entity(goal['mission_id'])

    if not items.get_items_matching(_member, {'name': _item_name}):
        goal['draw'] = False

    else:
        goal['draw'] = True
        goal['message'] = 'Return the item.'  #TODO: To who?
예제 #5
0
파일: missions.py 프로젝트: witheld9/r3-tdw
def _return_item_message(goal, member_id):
	_item_name = goal['item_name']
	_target_id = goal['target_id']
	_member = entities.get_entity(member_id)
	_mission = entities.get_entity(goal['mission_id'])
	
	if not items.get_items_matching(_member, {'name': _item_name}):
		goal['draw'] = False
		
	else:
		goal['draw'] = True
		goal['message'] = 'Return the item.' #TODO: To who?
예제 #6
0
def reload_weapon(entity):
    if timers.has_timer_with_name(entity, 'Reloading'):
        return

    _weapon = items.get_items_in_holder(entity, 'weapon')[0]
    _ammo = items.get_items_matching(entity, {'type': 'ammo'})[0]

    entities.trigger_event(
        entity,
        'create_timer',
        time=30,
        name='Reloading',
        exit_callback=lambda _: _reload_weapon(entity, _weapon, _ammo))
예제 #7
0
def give_item(entity, target_id, item_match):
    _items = items.get_items_matching(entity, item_match)

    if not _items:
        entities.trigger_event(entity,
                               'receive_memory',
                               member_id=entity['_id'],
                               memory={},
                               message='You got the item yet?')
        return None

    entities.trigger_event(entity,
                           'give_item',
                           item_id=_items[0],
                           target_id=target_id)
예제 #8
0
파일: missions.py 프로젝트: witheld9/r3-tdw
def _locate_item_message(goal, member_id):
	_item_name = goal['item_name']
	_member = entities.get_entity(member_id)
	_mission = entities.get_entity(goal['mission_id'])
	
	#TODO: Check if item visible and show something different
	
	if not items.get_items_matching(_member, {'name': _item_name}):
		goal['message'] = 'Find item.'
		
		entities.trigger_event(_member, 'uncomplete_goal', mission_id=goal['mission_id'], goal_id=goal['_id'])
		
	else:
		goal['message'] = 'Item found.'
		
		entities.trigger_event(_member, 'complete_goal', mission_id=goal['mission_id'], goal_id=goal['_id'])
예제 #9
0
def show_weapons(entity):
    global ACTIVE_MENU, REDRAW_TIMES

    _holder_menu = ui_menu.create(1,
                                  1,
                                  title='Weapons',
                                  surface='ui_inventory',
                                  click_offset=(constants.MAP_VIEW_WIDTH - 35,
                                                0))
    ACTIVE_MENU = _holder_menu
    REDRAW_TIMES = 3

    _equipped_weapon = items.get_items_in_holder(entity, 'weapon')
    _weapons = []

    if _equipped_weapon:
        _weapons.append(_equipped_weapon[0])

    for item_id in items.get_items_matching(entity, {'type': 'weapon'}):
        if item_id in _weapons:
            continue

        _weapons.add(item_id)

    for item_id in _weapons:
        _item = entities.get_entity(item_id)

        entities.trigger_event(_item, 'get_display_name')

        if item_id in _equipped_weapon:
            _fg = (245, 245, 245)
        else:
            _fg = (230, 230, 230)

        ui_menu.add_selectable(_holder_menu,
                               _item['stats']['display_name'],
                               show_weapon_menu,
                               fore_color=_fg,
                               item_id=item_id)
예제 #10
0
def _locate_item_message(goal, member_id):
    _item_name = goal['item_name']
    _member = entities.get_entity(member_id)
    _mission = entities.get_entity(goal['mission_id'])

    #TODO: Check if item visible and show something different

    if not items.get_items_matching(_member, {'name': _item_name}):
        goal['message'] = 'Find item.'

        entities.trigger_event(_member,
                               'uncomplete_goal',
                               mission_id=goal['mission_id'],
                               goal_id=goal['_id'])

    else:
        goal['message'] = 'Item found.'

        entities.trigger_event(_member,
                               'complete_goal',
                               mission_id=goal['mission_id'],
                               goal_id=goal['_id'])
예제 #11
0
파일: ai.py 프로젝트: witheld9/r3-tdw
def _human_logic(entity):
    _t = time.time()
    ai_visuals.build_item_list(entity)
    ai_visuals.build_life_list(entity)

    if ai_flow.is_flow_active() and not ai_flow.can_act(entity):
        return

    if timers.has_timer_with_name(entity, "passout"):
        return

        # if not ai_squads.is_active(ai_squads.get_assigned_squad(entity)) or entity['stats']['action_points'] <= 0:
        # 	return

    _old_meta = entity["ai"]["meta"].copy()

    entity["ai"]["meta"]["sees_item_type_weapon"] = len(entity["ai"]["visible_items"]["weapon"]) > 0
    entity["ai"]["meta"]["sees_item_type_ammo"] = len(entity["ai"]["visible_items"]["ammo"]) > 0
    entity["ai"]["meta"]["sees_item_type_container"] = len(entity["ai"]["visible_items"]["container"]) > 0
    entity["ai"]["meta"]["has_weapon"] = len(items.get_items_in_holder(entity, "weapon")) > 0
    entity["ai"]["meta"]["has_ammo"] = len(items.get_items_matching(entity, {"type": "ammo"})) > 0
    entity["ai"]["meta"]["has_container"] = len(items.get_items_matching(entity, {"type": "container"})) > 0
    entity["ai"]["meta"]["weapon_loaded"] = (
        len(
            [
                w
                for w in items.get_items_in_holder(entity, "weapon")
                if entities.get_entity(w)["flags"]["ammo"]["value"] > 0
            ]
        )
        > 0
    )
    entity["ai"]["meta"]["in_engagement"] = (
        len([t for t in entity["ai"]["targets"] if not entity["ai"]["life_memory"][t]["is_lost"]]) > 0
    )
    entity["ai"]["meta"]["has_lost_target"] = len(entity["ai"]["targets_to_search"]) > 0
    entity["ai"]["meta"]["in_enemy_los"] = (
        len([t for t in entity["ai"]["targets"] if entity["ai"]["life_memory"][t]["in_los"]]) > 0
    )
    entity["ai"]["meta"]["has_needs"] = (
        not entity["ai"]["meta"]["has_weapon"]
        or not entity["ai"]["meta"]["has_container"]
        or not entity["ai"]["meta"]["weapon_loaded"]
    )
    entity["ai"]["meta"]["is_injured"] = skeleton.has_critical_injury(entity)

    if not entity["ai"]["meta"] == _old_meta:
        entities.trigger_event(entity, "meta_change")

    if entity["ai"]["meta"]["in_engagement"]:
        _target = entity["ai"]["nearest_target"]
        _target_distance = numbers.distance(movement.get_position_via_id(_target), movement.get_position(entity))
        _engage_distance = stats.get_vision(entity) * 0.75
        _weapon = entities.get_entity(items.get_items_in_holder(entity, "weapon")[0])
        _engage_distance = numbers.clip(
            _engage_distance - (flags.get_flag(_weapon, "accuracy") * 3), 1, stats.get_vision(entity)
        )
        _min_engage_distance = 3

        if _weapon["stats"]["kind"] == "explosive":
            _engage_distance /= 2
            _min_engage_distance = 8

        entities.trigger_event(entity, "set_flag", flag="engage_distance", value=_engage_distance)
        entities.trigger_event(entity, "set_flag", flag="min_engage_distance", value=_min_engage_distance)

        # NOTE: Mirror change in ai_logic!
        entity["ai"]["meta"]["in_firing_range"] = (
            _target_distance <= _engage_distance and _target_distance >= _min_engage_distance
        )

        if entity["ai"]["meta"]["in_enemy_los"]:
            if flags.has_flag(entity, "search_nodes"):
                flags.delete_flag(entity, "search_nodes")

            entity["ai"]["meta"]["is_in_melee_range"] = _target_distance == 1

    else:
        entity["ai"]["meta"]["is_target_near"] = False
        entity["ai"]["meta"]["in_firing_range"] = False

    entity["ai"]["meta"]["is_target_armed"] = (
        len([t for t in entity["ai"]["targets"] if entity["ai"]["life_memory"][t]["is_armed"]]) > 0
    )
    entity["ai"]["meta"]["is_panicked"] = (
        not entity["ai"]["meta"]["weapon_loaded"] and entity["ai"]["meta"]["is_target_armed"]
    )

    if entity["ai"]["is_player"]:
        return

        # TODO: Experimental!
        # if entity['ai']['meta'] == _old_meta:
        # print 'Something changed...'

        # return

    if (
        timers.has_timer_with_name(entity, "shoot")
        or entity["movement"]["path"]["positions"]
        or timers.has_timer_with_name(entity, "move")
    ):
        # print 'Clearing existing action...'
        return

    _goap = _handle_goap(entity)

    if not _goap:
        entity["ai"]["current_action"] = "idle"

        entities.trigger_event(entity, "finish_turn")
        entities.trigger_event(entity, "stop")

        # print
        # print entity['stats']['name'], 'no possible action'
        # print

        # for meta_name in entity['ai']['meta']:
        # 	print meta_name, '\t', entity['ai']['meta'][meta_name]

        return

    _plan = _goap[0]

    if not entity["ai"]["last_action"] == _plan["actions"][0]["name"]:
        if entity["_id"] in ai_debugger.WATCHING:
            logging.info("%s: %s -> %s" % (entity["_id"], entity["ai"]["last_action"], _plan["actions"][0]["name"]))

            # TODO: Only do this if the action requires movement changes
        entities.trigger_event(entity, "stop")

        entity["ai"]["last_action"] = _plan["actions"][0]["name"]

        # print entity['stats']['name'], _plan['actions'][0]['name']

    _plan["planner"].trigger_callback(entity, _plan["actions"][0]["name"])

    # print time.time() - _t

    entity["ai"]["current_action"] = _plan["actions"][0]["name"]
예제 #12
0
파일: ai.py 프로젝트: penny64/r3-tdw
def _human_logic(entity):
    _t = time.time()
    ai_visuals.build_item_list(entity)
    ai_visuals.build_life_list(entity)

    if ai_flow.is_flow_active() and not ai_flow.can_act(entity):
        return

    if timers.has_timer_with_name(entity, 'passout'):
        return

    #if not ai_squads.is_active(ai_squads.get_assigned_squad(entity)) or entity['stats']['action_points'] <= 0:
    #	return

    _old_meta = entity['ai']['meta'].copy()

    entity['ai']['meta']['sees_item_type_weapon'] = len(
        entity['ai']['visible_items']['weapon']) > 0
    entity['ai']['meta']['sees_item_type_ammo'] = len(
        entity['ai']['visible_items']['ammo']) > 0
    entity['ai']['meta']['sees_item_type_container'] = len(
        entity['ai']['visible_items']['container']) > 0
    entity['ai']['meta']['has_weapon'] = len(
        items.get_items_in_holder(entity, 'weapon')) > 0
    entity['ai']['meta']['has_ammo'] = len(
        items.get_items_matching(entity, {'type': 'ammo'})) > 0
    entity['ai']['meta']['has_container'] = len(
        items.get_items_matching(entity, {'type': 'container'})) > 0
    entity['ai']['meta']['weapon_loaded'] = len([
        w for w in items.get_items_in_holder(entity, 'weapon')
        if entities.get_entity(w)['flags']['ammo']['value'] > 0
    ]) > 0
    entity['ai']['meta']['in_engagement'] = len([
        t for t in entity['ai']['targets']
        if not entity['ai']['life_memory'][t]['is_lost']
    ]) > 0
    entity['ai']['meta']['has_lost_target'] = len(
        entity['ai']['targets_to_search']) > 0
    entity['ai']['meta']['in_enemy_los'] = len([
        t for t in entity['ai']['targets']
        if entity['ai']['life_memory'][t]['in_los']
    ]) > 0
    entity['ai']['meta']['has_needs'] = not entity['ai']['meta'][
        'has_weapon'] or not entity['ai']['meta'][
            'has_container'] or not entity['ai']['meta']['weapon_loaded']
    entity['ai']['meta']['is_injured'] = skeleton.has_critical_injury(entity)

    if not entity['ai']['meta'] == _old_meta:
        entities.trigger_event(entity, 'meta_change')

    if entity['ai']['meta']['in_engagement']:
        _target = entity['ai']['nearest_target']
        _target_distance = numbers.distance(
            movement.get_position_via_id(_target),
            movement.get_position(entity))
        _engage_distance = stats.get_vision(entity) * .75
        _weapon = entities.get_entity(
            items.get_items_in_holder(entity, 'weapon')[0])
        _engage_distance = numbers.clip(
            _engage_distance - (flags.get_flag(_weapon, 'accuracy') * 3), 1,
            stats.get_vision(entity))
        _min_engage_distance = 3

        if _weapon['stats']['kind'] == 'explosive':
            _engage_distance /= 2
            _min_engage_distance = 8

        entities.trigger_event(entity,
                               'set_flag',
                               flag='engage_distance',
                               value=_engage_distance)
        entities.trigger_event(entity,
                               'set_flag',
                               flag='min_engage_distance',
                               value=_min_engage_distance)

        #NOTE: Mirror change in ai_logic!
        entity['ai']['meta'][
            'in_firing_range'] = _target_distance <= _engage_distance and _target_distance >= _min_engage_distance

        if entity['ai']['meta']['in_enemy_los']:
            if flags.has_flag(entity, 'search_nodes'):
                flags.delete_flag(entity, 'search_nodes')

            entity['ai']['meta']['is_in_melee_range'] = _target_distance == 1

    else:
        entity['ai']['meta']['is_target_near'] = False
        entity['ai']['meta']['in_firing_range'] = False

    entity['ai']['meta']['is_target_armed'] = len([
        t for t in entity['ai']['targets']
        if entity['ai']['life_memory'][t]['is_armed']
    ]) > 0
    entity['ai']['meta']['is_panicked'] = (
        not entity['ai']['meta']['weapon_loaded']
        and entity['ai']['meta']['is_target_armed'])

    if entity['ai']['is_player']:
        return

    #TODO: Experimental!
    #if entity['ai']['meta'] == _old_meta:
    #print 'Something changed...'

    #return

    if timers.has_timer_with_name(
            entity, 'shoot'
    ) or entity['movement']['path']['positions'] or timers.has_timer_with_name(
            entity, 'move'):
        #print 'Clearing existing action...'
        return

    _goap = _handle_goap(entity)

    if not _goap:
        entity['ai']['current_action'] = 'idle'

        entities.trigger_event(entity, 'finish_turn')
        entities.trigger_event(entity, 'stop')

        #print
        #print entity['stats']['name'], 'no possible action'
        #print

        #for meta_name in entity['ai']['meta']:
        #	print meta_name, '\t', entity['ai']['meta'][meta_name]

        return

    _plan = _goap[0]

    if not entity['ai']['last_action'] == _plan['actions'][0]['name']:
        if entity['_id'] in ai_debugger.WATCHING:
            logging.info('%s: %s -> %s' %
                         (entity['_id'], entity['ai']['last_action'],
                          _plan['actions'][0]['name']))

        #TODO: Only do this if the action requires movement changes
        entities.trigger_event(entity, 'stop')

        entity['ai']['last_action'] = _plan['actions'][0]['name']

    #print entity['stats']['name'], _plan['actions'][0]['name']

    _plan['planner'].trigger_callback(entity, _plan['actions'][0]['name'])

    #print time.time() - _t

    entity['ai']['current_action'] = _plan['actions'][0]['name']