def update_targets_around_noise(life, noise): _most_likely_target = {'target': None, 'last_seen_time': 0} if 'target' in noise and not life['id'] == noise['target']: _visiblity = bad_numbers.clip(sight.get_stealth_coverage(LIFE[noise['target']]), 0.0, 1.0) _visiblity = bad_numbers.clip(_visiblity+(bad_numbers.distance(life['pos'], LIFE[noise['target']]['pos']))/(sight.get_vision(life)/2), 0, 1.0) if _visiblity >= sight.get_visiblity_of_position(life, LIFE[noise['target']]['pos']): brain.meet_alife(life, LIFE[noise['target']]) life['know'][noise['target']]['escaped'] = 1 life['know'][noise['target']]['last_seen_at'] = noise['pos'][:] life['know'][noise['target']]['last_seen_time'] = 0 for target in life['know'].values(): if not target['escaped'] or not target['last_seen_at'] or target['dead']: continue if bad_numbers.distance(target['last_seen_at'], noise['pos']) > noise['volume']: continue if judgement.is_target_threat(life, target['life']['id']): if not _most_likely_target['target'] or target['last_seen_time'] < _most_likely_target['last_seen_time']: _most_likely_target['last_seen_time'] = target['last_seen_time'] _most_likely_target['target'] = target if _most_likely_target['target']: _most_likely_target['target']['escaped'] = 1 _most_likely_target['target']['last_seen_at'] = noise['pos'][:] _most_likely_target['target']['last_seen_time'] = 1 logging.debug('%s heard a noise, attributing it to %s.' % (' '.join(life['name']), ' '.join(_most_likely_target['target']['life']['name'])))
def change_alignment(life, life_id, alignment): _knows = brain.knows_alife_by_id(life, life_id) if not _knows: brain.meet_alife(life, LIFE[life_id]) _knows = brain.knows_alife_by_id(life, life_id) logging.debug('%s changed alignment of %s: %s' % (' '.join(life['name']), ' '.join(LIFE[life_id]['name']), alignment)) _knows['alignment'] = alignment
def defend_camp(camp_id, life_id): _camp = camps.get_camp(camp_id) if not life_id in _camp['raid']['defenders']: _camp['raid']['defenders'].append(life_id) logging.debug('%s is now defending camp %s' % (' '.join(LIFE[life_id]['name']), _camp['name'])) for raider in get_raiders(camp_id): if not brain.knows_alife_by_id(LIFE[life_id], raider): brain.meet_alife(LIFE[life_id], LIFE[raider])
def change_alignment(life, life_id, alignment): _knows = brain.knows_alife_by_id(life, life_id) if not _knows: brain.meet_alife(life, LIFE[life_id]) _knows = brain.knows_alife_by_id(life, life_id) logging.debug( '%s changed alignment of %s: %s' % (' '.join(life['name']), ' '.join(LIFE[life_id]['name']), alignment)) _knows['alignment'] = alignment
def add_member(life, group_id, life_id): if is_member(life, group_id, life_id): raise Exception( '%s failed to add new member: %s is already a member of group: %s' % (' '.join(life['name']), ' '.join( LIFE[life_id]['name']), group_id)) if not life['id'] == life_id: _target = brain.knows_alife_by_id(life, life_id) if _target: if _target['group'] == group_id: pass elif _target and _target['group']: lfe.memory(LIFE[life_id], 'left group for group', left_group=_target['group'], group=group_id) remove_member(life, _target['group'], life_id) _target['group'] = group_id else: _target = brain.meet_alife(life, LIFE[life_id]) stats.establish_trust(life, life_id) elif life['id'] == life_id and life[ 'group'] and not life['group'] == group_id: remove_member(life, life['group'], life_id) _group = get_group(life, group_id) for member in _group['members']: brain.meet_alife(LIFE[member], LIFE[life_id]) if _group['shelter']: LIFE[life_id]['shelter'] = _group['shelter'] lfe.memory(LIFE[life_id], 'shelter founder', shelter=_group['shelter'], founder=_group['leader']) _group['members'].append(life_id) if _group['leader'] and 'player' in LIFE[_group['leader']]: _text = '%s has joined your group.' % ' '.join(LIFE[life_id]['name']) gfx.message(_text, style='good') if sight.can_see_target(LIFE[_group['leader']], life_id): logic.show_event(_text, life=LIFE[life_id], delay=1) logging.debug( '%s added %s to group \'%s\'' % (' '.join(life['name']), ' '.join(LIFE[life_id]['name']), group_id))
def add_raiders(camp_id, raiders): _camp = camps.get_camp(camp_id) for raider in [r for r in raiders if not r in _camp['raid']['raiders']]: _camp['raid']['raiders'].append(raider) logging.debug('%s added to raid of camp %s' % (' '.join(LIFE[raider]['name']), _camp['name'])) for defender in get_defenders(camp_id): if not brain.knows_alife_by_id(LIFE[defender], raider): if defender == raider: logging.warning('FIXME: Raider is member of camp.') continue brain.meet_alife(LIFE[defender], LIFE[raider])
def add_member(life, group_id, life_id): if not group_id in LIFE[life_id]['known_groups']: raise Exception('DOES NOT KNOW') if is_member(life, group_id, life_id): raise Exception('%s failed to add new member: %s is already a member of group: %s' % (' '.join(life['name']), ' '.join(LIFE[life_id]['name']), group_id)) if not life['id'] == life_id: _target = brain.knows_alife_by_id(life, life_id) if _target: if _target['group'] == group_id: pass elif _target and _target['group']: lfe.memory(LIFE[life_id], 'left group for group', left_group=_target['group'], group=group_id) remove_member(life, _target['group'], life_id) _target['group'] = group_id else: brain.meet_alife(life, LIFE[life_id]) elif life['id'] == life_id and life['group'] and not life['group'] == group_id: remove_member(life, life['group'], life_id) _group = get_group(life, group_id) for member in _group['members']: brain.meet_alife(LIFE[member], LIFE[life_id]) if _group['shelter']: LIFE[life_id]['shelter'] = _group['shelter'] lfe.memory(LIFE[life_id], 'shelter founder', shelter=_group['shelter'], founder=_group['leader']) _group['members'].append(life_id) if _group['leader'] and 'player' in LIFE[_group['leader']]: _text = '%s has joined your group.' % ' '.join(LIFE[life_id]['name']) gfx.message(_text, style='good') if sight.can_see_target(LIFE[_group['leader']], life_id): logic.show_event(_text, life=LIFE[life_id], delay=1) logging.debug('%s added %s to group \'%s\'' % (' '.join(life['name']), ' '.join(LIFE[life_id]['name']), group_id))
def look(life): if not 'CAN_SEE' in life['life_flags']: return False for target_id in life['know']: if life['know'][target_id]['last_seen_time']: life['know'][target_id]['last_seen_time'] += 1 life['know'][target_id]['time_visible'] = 0 else: life['know'][target_id]['time_visible'] += 1 if 'player' in life: if life['path'] or not brain.get_flag(life, 'visible_chunks'): if SETTINGS['smp']: _visible_chunks = post_scan_surroundings(life) else: _visible_chunks = scan_surroundings(life, judge=False, get_chunks=True, ignore_chunks=0) _chunks = [maps.get_chunk(c) for c in _visible_chunks] brain.flag(life, 'visible_chunks', value=_visible_chunks) elif 'player' in life: _visible_chunks = brain.get_flag(life, 'visible_chunks') _chunks = [maps.get_chunk(c) for c in _visible_chunks] else: #This is for optimizing. Be careful if you mess with this... _nearby_alife = {} for alife in LIFE.values(): if alife['id'] == life['id']: continue if bad_numbers.distance( life['pos'], alife['pos']) <= get_vision(life) and can_see_position( life, alife['pos']): _nearby_alife[alife['id']] = { 'pos': alife['pos'][:], 'stance': alife['stance'] } _last_nearby_alife = brain.get_flag(life, '_nearby_alife') if not _last_nearby_alife == _nearby_alife: brain.flag(life, '_nearby_alife', value=_nearby_alife) else: for target_id in life['seen']: if life['know'][target_id]['last_seen_time']: life['know'][target_id]['last_seen_time'] = 0 return False _chunks = [ maps.get_chunk(c) for c in brain.get_flag(life, 'visible_chunks') ] life['seen'] = [] life['seen_items'] = [] for item_uid in life['know_items']: life['know_items'][item_uid]['last_seen_time'] += 1 for target_id in life['know']: life['know'][target_id]['last_seen_time'] += 1 if life['know'][target_id]['last_seen_time'] >= 10 and not life[ 'know'][target_id]['escaped']: life['know'][target_id]['escaped'] = 1 if not 'player' in life: quick_look(life) return False for chunk in _chunks: judgement.judge_chunk_visually( life, '%s,%s' % (chunk['pos'][0], chunk['pos'][1])) judgement.judge_chunk_life( life, '%s,%s' % (chunk['pos'][0], chunk['pos'][1])) for ai in [LIFE[i] for i in chunk['life']]: if ai['id'] == life['id']: continue if not is_in_fov(life, ai['pos']): if ai['id'] in life['know']: life['know'][ai['id']]['time_visible'] = 0 continue if not ai['id'] in life['know']: brain.meet_alife(life, ai) _visibility = get_visiblity_of_position(life, ai['pos']) _stealth_coverage = get_stealth_coverage(ai) if _visibility < 1 - _stealth_coverage: continue life['seen'].append(ai['id']) if life['think_rate'] == life['think_rate_max']: lfe.create_and_update_self_snapshot(LIFE[ai['id']]) judgement.judge_life(life, ai['id']) if ai['dead']: if 'player' in life and not life['know'][ ai['id']]['dead'] and life['know'][ ai['id']]['last_seen_time'] > 25: logic.show_event('You discover the body of %s.' % ' '.join(ai['name']), life=ai) if life['know'][ai['id']]['group']: groups.remove_member(life, life['know'][ai['id']]['group'], ai['id']) life['know'][ai['id']]['group'] = None core.record_loss(1) life['know'][ai['id']]['dead'] = True elif ai['asleep']: life['know'][ai['id']]['asleep'] = True elif not ai['asleep']: life['know'][ai['id']]['asleep'] = False life['know'][ai['id']]['last_seen_time'] = 0 life['know'][ai['id']]['last_seen_at'] = ai['pos'][:] life['know'][ai['id']]['escaped'] = False life['know'][ai['id']]['state'] = ai['state'] life['know'][ai['id']]['state_tier'] = ai['state_tier'] if brain.alife_has_flag(life, ai['id'], 'search_map'): brain.unflag_alife(life, ai['id'], 'search_map') _chunk_id = lfe.get_current_chunk_id(ai) judgement.judge_chunk(life, _chunk_id, seen=True) for item in [ITEMS[i] for i in chunk['items'] if i in ITEMS]: if not is_in_fov(life, item['pos']): continue if not item['uid'] in life['know_items']: brain.remember_item(life, item) if items.is_item_owned(item['uid']): #TODO: This doesn't work because we are specifically checking chunks if item['owner'] and lfe.item_is_equipped( LIFE[item['owner']], item['uid']): life['know_items'][item['uid']]['last_seen_at'] = LIFE[ item['owner']]['pos'] life['know_items'][ item['uid']]['last_owned_by'] = item['owner'] life['know_items'][item['uid']]['last_seen_time'] = 0 continue life['seen_items'].append(item['uid']) life['know_items'][item['uid']]['last_seen_at'] = item['pos'][:] life['know_items'][item['uid']]['last_seen_time'] = 0 life['know_items'][item['uid']]['last_owned_by'] = None life['know_items'][item['uid']]['score'] = judgement.judge_item( life, item['uid']) life['know_items'][item['uid']]['lost'] = False
def quick_look(life): _life = [] _items = [] _current_chunk = lfe.get_current_chunk_id(life) _current_chunk_pos = chunks.get_chunk(_current_chunk)['pos'] _x_chunk_min = bad_numbers.clip( _current_chunk_pos[0] - ((get_vision(life) / WORLD_INFO['chunk_size']) * WORLD_INFO['chunk_size']), 0, MAP_SIZE[0] - WORLD_INFO['chunk_size']) _y_chunk_min = bad_numbers.clip( _current_chunk_pos[1] - ((get_vision(life) / WORLD_INFO['chunk_size']) * WORLD_INFO['chunk_size']), 0, MAP_SIZE[1] - WORLD_INFO['chunk_size']) _x_chunk_max = bad_numbers.clip( _current_chunk_pos[0] + ((get_vision(life) / WORLD_INFO['chunk_size']) * WORLD_INFO['chunk_size']), 0, MAP_SIZE[0] - WORLD_INFO['chunk_size']) _y_chunk_max = bad_numbers.clip( _current_chunk_pos[1] + ((get_vision(life) / WORLD_INFO['chunk_size']) * WORLD_INFO['chunk_size']), 0, MAP_SIZE[1] - WORLD_INFO['chunk_size']) _has_ready_weapon = combat.has_ready_weapon(life) for y in range(_y_chunk_min, _y_chunk_max, WORLD_INFO['chunk_size']): for x in range(_x_chunk_min, _x_chunk_max, WORLD_INFO['chunk_size']): _chunk_key = '%s,%s' % (x, y) _chunk = chunks.get_chunk(_chunk_key) for life_id in _chunk['life']: ai = LIFE[life_id] if ai['dead']: continue if life_id == life['id']: continue if not can_see_position(life, LIFE[life_id]['pos']): continue _visibility = get_visiblity_of_position(life, ai['pos']) _stealth_coverage = get_stealth_coverage(ai) if _visibility < 1 - _stealth_coverage: continue if not ai['id'] in life['know']: brain.meet_alife(life, ai) life['seen'].append(ai['id']) if life['think_rate'] == life['think_rate_max']: lfe.create_and_update_self_snapshot(LIFE[ai['id']]) judgement.judge_life(life, ai['id']) if ai['dead']: if life['know'][ai['id']]['group']: groups.remove_member(life, life['know'][ai['id']]['group'], ai['id']) life['know'][ai['id']]['group'] = None life['know'][ai['id']]['dead'] = True elif ai['asleep']: life['know'][ai['id']]['asleep'] = True elif not ai['asleep']: life['know'][ai['id']]['asleep'] = False life['know'][ai['id']]['last_seen_time'] = 0 life['know'][ai['id']]['last_seen_at'] = ai['pos'][:] life['know'][ai['id']]['escaped'] = False life['know'][ai['id']]['state'] = ai['state'] life['know'][ai['id']]['state_tier'] = ai['state_tier'] if brain.alife_has_flag(life, ai['id'], 'search_map'): brain.unflag_alife(life, ai['id'], 'search_map') _chunk_id = lfe.get_current_chunk_id(ai) judgement.judge_chunk(life, _chunk_id, seen=True) _life.append(life_id) for item_uid in _chunk['items']: if not item_uid in ITEMS: continue item = ITEMS[item_uid] if not item['uid'] in life['know_items']: brain.remember_item(life, item) if items.is_item_owned(item['uid']): continue # #TODO: This doesn't work because we are specifically checking chunks # if item['owner'] and lfe.item_is_equipped(LIFE[item['owner']], item['uid']): # life['know_items'][item['uid']]['last_seen_at'] = LIFE[item['owner']]['pos'] # life['know_items'][item['uid']]['last_owned_by'] = item['owner'] # life['know_items'][item['uid']]['last_seen_time'] = 0 # # continue if not can_see_position(life, item['pos']): continue if not item['uid'] in life['know_items']: brain.remember_item(life, item) life['seen_items'].append(item['uid']) life['know_items'][ item['uid']]['last_seen_at'] = item['pos'][:] life['know_items'][item['uid']]['last_seen_time'] = 0 life['know_items'][item['uid']]['last_owned_by'] = None life['know_items'][ item['uid']]['score'] = judgement.judge_item( life, item['uid']) life['know_items'][item['uid']]['lost'] = False _items.append(item_uid)
def create_function_map(): FUNCTION_MAP.update({'is_family': stats.is_family, 'name': lambda life: ' '.join(life['name']), 'is_same_species': stats.is_same_species, 'can_trust': judgement.can_trust, 'is_dangerous': judgement.is_target_dangerous, 'can_bite': stats.can_bite, 'can_scratch': stats.can_scratch, 'weapon_equipped_and_ready': combat.weapon_equipped_and_ready, 'prepare_for_ranged': combat.prepare_for_ranged, 'explore_unknown_chunks': survival.explore_unknown_chunks, 'is_nervous': stats.is_nervous, 'is_aggravated': stats.is_aggravated, 'is_scared': judgement.is_scared, 'is_safe': judgement.is_safe, 'is_healthy': None, 'is_intimidated': stats.is_intimidated, 'is_intimidating': lambda life, life_id: stats.is_intimidated_by(LIFE[life_id], life['id']), 'is_confident': stats.is_confident, 'is_situation_tense': lambda life: judgement.get_tension(life)>=10, 'is_combat_ready': lambda life, life_id: not LIFE[life_id]['state'] in ['hiding', 'hidden'], 'is_surrendering': lambda life, life_id: LIFE[life_id]['state'] == 'surrender', 'is_being_surrendered_to': lambda life: len(judgement.get_combat_targets(life, ignore_escaped=True, filter_func=lambda life, life_id: LIFE[life_id]['state'] == 'surrender'))>0, 'closest': None, 'kill': lambda life: lfe.kill(life, 'their own dumb self'), 'has_attacked_trusted': stats.has_attacked_trusted, 'has_attacked_self': stats.has_attacked_self, 'distance_to_pos': stats.distance_from_pos_to_pos, 'current_chunk_has_flag': lambda life, flag: chunks.get_flag(life, lfe.get_current_chunk_id(life), flag)>0, 'is_idle': lambda life: life['state'] == 'idle', 'is_relaxed': lambda life: life['state_tier'] == TIER_RELAXED, 'is_child_of': stats.is_child_of, 'is_parent_of': stats.is_parent_of, 'has_parent': stats.has_parent, 'has_child': stats.has_child, 'is_night': logic.is_night, 'is_born_leader': stats.is_born_leader, 'is_psychotic': stats.is_psychotic, 'is_safe_in_shelter': stats.is_safe_in_shelter, 'is_incapacitated': stats.is_incapacitated, 'is_target': lambda life, life_id: life_id in judgement.get_targets(life) or life_id in judgement.get_combat_targets(life), 'seen_target_recently': lambda life, life_id: brain.knows_alife_by_id(life, life_id)['last_seen_time']<=150, 'is_combat_target': lambda life, life_id: life_id in judgement.get_combat_targets(life), 'is_traitor': lambda life, life_id: len(lfe.get_memory(life, matches={'text': 'traitor', 'target': life_id}))>0, 'is_awake': judgement.is_target_awake, 'is_dead': judgement.is_target_dead, 'is_target_dead': judgement.is_target_dead, 'is_raiding': lambda life: (life['group'] and groups.get_stage(life, life['group'])==STAGE_RAIDING)==True, 'find_and_announce_shelter': groups.find_and_announce_shelter, 'desires_shelter': stats.desires_shelter, 'travel_to_position': movement.travel_to_position, 'find_target': movement.find_target, 'can_see_target': sight.can_see_target, 'has_threats': lambda life: len(judgement.get_threats(life, ignore_escaped=1))>0, 'has_visible_threat': lambda life: len(judgement.get_visible_threats(life))>0, 'has_combat_targets': lambda life: len(judgement.get_combat_targets(life))>0, 'has_lost_threat': lambda life: len(judgement.get_threats(life, escaped_only=True, ignore_escaped=2))>0, 'has_ready_combat_targets': lambda life: len(judgement.get_ready_combat_targets(life, recent_only=True, limit_distance=sight.get_vision(life)+10))>0, 'danger_close': stats.is_threat_too_close, 'number_of_alife_in_chunk_matching': lambda life, chunk_key, matching, amount: len(chunks.get_alife_in_chunk_matching(chunk_key, matching))>amount, 'number_of_alife_in_reference_matching': lambda life, reference_id, matching, amount: len(references.get_alife_in_reference_matching(reference_id, matching))>amount, 'announce_to_group': groups.announce, 'is_in_chunk': chunks.is_in_chunk, 'is_in_shelter': lfe.is_in_shelter, 'has_shelter': lambda life: len(judgement.get_known_shelters(life))>0, 'has_completed_job': lambda life, job_id: job_id in life['completed_jobs'], 'has_completed_task': lambda life, job_id: job_id in life['completed_jobs'], 'retrieve_from_memory': brain.retrieve_from_memory, 'pick_up_and_hold_item': lfe.pick_up_and_hold_item, 'has_usable_weapon': lambda life: not combat.has_ready_weapon(life) == False, 'has_potentially_usable_weapon': lambda life: combat.has_potentially_usable_weapon(life) == True, 'target_is_combat_ready': judgement.target_is_combat_ready, 'create_item_need': survival.add_needed_item, 'group_needs_resources': lambda life, group_id: groups.needs_resources(group_id), 'has_needs_to_meet': survival.has_needs_to_meet, 'has_unmet_needs': survival.has_unmet_needs, 'has_needs_to_satisfy': survival.has_needs_to_satisfy, 'has_needs': lambda life: survival.has_needs_to_meet(life) or survival.has_unmet_needs(life) or survival.has_needs_to_satisfy(life), 'has_number_of_items_matching': lambda life, matching, amount: len(lfe.get_all_inventory_items(life, matches=matching))>=amount, 'flag_item_matching': lambda life, matching, flag: lfe.get_all_inventory_items(life, matches=[matching]) and brain.flag_item(life, lfe.get_all_inventory_items(life, matches=[matching])[0], flag)>0, 'drop_item_matching': lambda life, matching: lfe.get_all_inventory_items(life, matches=[matching]) and lfe.drop_item(life, lfe.get_all_inventory_items(life, matches=[matching])[0]['uid'])>0, 'has_target_to_follow': lambda life: judgement.get_target_to_follow(life)>0, 'has_target_to_guard': lambda life: judgement.get_target_to_guard(life)>0, 'get_recent_events': speech.get_recent_events, 'get_target': lambda life, life_id: speech.get_target(life, lfe.has_dialog_with(life, life_id), dialog.get_flag(lfe.has_dialog_with(life, life_id), 'NEXT_GIST')), 'get_needs': lambda life, life_id: speech.get_needs(life, lfe.has_dialog_with(life, life_id), dialog.get_flag(lfe.has_dialog_with(life, life_id), 'NEXT_GIST')), 'get_location': lambda life: '%s, %s' % (life['pos'][0], life['pos'][1]), 'join_group': lambda life, **kwargs: groups.join_group(life, kwargs['group_id']), 'add_group_member': lambda life, life_id: groups.add_member(life, life['group'], life_id), 'claim_to_be_group_leader': lambda life, life_id: groups.set_leader(life, life['group'], life['id']), 'is_group_leader': lambda life: groups.is_leader_of_any_group(life)==True, 'is_in_same_group': lambda life, life_id: (life['group'] and LIFE[life_id]['group'] == life['group'])>0, 'is_target_group_leader': lambda life, life_id: (groups.is_leader_of_any_group(LIFE[life_id]))==True, 'is_in_group': lambda life: life['group']>0, 'is_target_hostile': lambda life, life_id: brain.knows_alife_by_id(life, life_id) and brain.knows_alife_by_id(life, life_id)['alignment'] == 'hostile', 'is_target_in_group': lambda life, life_id, **kwargs: brain.knows_alife_by_id(life, life_id) and brain.knows_alife_by_id(life, life_id)['group']==kwargs['group'], 'is_target_in_any_group': lambda life, life_id: brain.knows_alife_by_id(life, life_id) and brain.knows_alife_by_id(life, life_id)['group']>0, 'is_target_group_friendly': lambda life, life_id: brain.knows_alife_by_id(life, life_id) and brain.knows_alife_by_id(life, life_id)['group'] and groups.get_group_memory(life, brain.knows_alife_by_id(life, life_id)['group'], 'alignment')=='trust', 'is_target_group_hostile': groups.is_target_group_hostile, 'is_target_group_neutral': lambda life, life_id: brain.knows_alife_by_id(life, life_id) and brain.knows_alife_by_id(life, life_id)['group'] and groups.get_group_memory(life, brain.knows_alife_by_id(life, life_id)['group'], 'alignment')=='neutral', 'is_group_hostile': lambda life, **kwargs: groups.get_group_memory(life, kwargs['group_id'], 'alignment')=='hostile', 'is_injured': lambda life: len(lfe.get_cut_limbs(life)) or len(lfe.get_bleeding_limbs(life)), 'inform_of_group_members': speech.inform_of_group_members, 'update_group_members': speech.update_group_members, 'get_group_flag': groups.get_flag, 'get_flag': brain.get_flag, 'get_group': lambda life: life['group'], 'discover_group': lambda life, **kwargs: groups.discover_group(life, kwargs['group_id']), 'add_target_to_known_group': lambda life, life_id, **kwargs: groups.add_member(life, kwargs['group_id'], life_id), 'knows_about_group': lambda life, **kwargs: groups.group_exists(life, kwargs['group_id']), 'group_has_shelter': lambda life: groups.get_shelter(life, life['group'])>0, 'declare_group_hostile': lambda life, **kwargs: stats.declare_group_hostile(life, kwargs['group_id']), 'declare_group_trusted': lambda life, **kwargs: stats.declare_group_trusted(life, kwargs['group_id']), 'declare_group_target': lambda life, life_id: stats.declare_group_target(life, life_id, 'hostile'), 'get_group_shelter': lambda life: groups.get_shelter(life, life['group']), 'set_group_shelter': lambda life, **kwargs: groups.set_shelter(life, kwargs['group_id'], kwargs['shelter']), 'get_group_stage': lambda life: groups.get_stage(life, life['group']), 'get_group_stage_message': speech.get_group_stage_message, 'set_group_stage': lambda life, **kwargs: groups.set_stage(life, kwargs['group_id'], kwargs['stage']), 'is_group_motivated_for_crime': lambda life: life['group'] and groups.get_motive(life, life['group']) == 'crime', 'wants_to_leave_group_for_group': lambda life: stats.wants_to_abandon_group(life, life['group']), 'knows_items_matching': lambda life, **kwargs: len(brain.get_multi_matching_remembered_items(life, kwargs['items'], no_owner=True))>0, 'get_known_group': speech.get_known_group, 'inform_of_group': speech.inform_of_group, 'force_inform_of_group': speech.force_inform_of_group, 'inform_of_items': lambda life, life_id, **kwargs: speech.inform_of_items(life, life_id, kwargs['items']), 'update_location': lambda life, life_id: brain.update_known_life(life, life_id, 'last_seen_at', LIFE[life_id]['pos'][:]), 'has_questions_for_target': lambda life, life_id: len(memory.get_questions_for_target(life, life_id))>0, 'has_orders_for_target': lambda life, life_id: len(memory.get_orders_for_target(life, life_id))>0, 'ask_target_question': memory.ask_target_question, 'give_target_order_message': memory.give_target_order_message, 'give_target_order': memory.give_target_order, 'take_order': memory.take_order, 'reject_order': memory.reject_order, 'get_introduction_message': speech.get_introduction_message, 'get_introduction_gist': speech.get_introduction_gist, 'establish_trust': stats.establish_trust, 'establish_feign_trust': stats.establish_feign_trust, 'establish_aggressive': stats.establish_aggressive, 'establish_hostile': stats.establish_hostile, 'establish_scared': stats.establish_scared, 'claim_hostile': lambda life, target, **kwargs: stats.establish_hostile(life, kwargs['target_id']), 'describe_target': lambda life, life_id, **kwargs: speech.describe_target(life, kwargs['target']), 'consume': lfe.consume, 'explode': items.explode, 'is_player': lambda life: 'player' in life, 'is_neutral': lambda life, life_id: brain.knows_alife_by_id(life, life_id)['alignment'] == 'neutral', 'reset_think_timer': lfe.reset_think_rate, 'mark_target_as_combat_ready': lambda life, life_id: brain.flag_alife(life, life_id, 'combat_ready'), 'mark_target_as_not_combat_ready': lambda life, life_id: brain.flag_alife(life, life_id, 'combat_ready', value=False), 'saw_target_recently': lambda life, **kwargs: brain.knows_alife_by_id(life, kwargs['target_id']) and -1<brain.knows_alife_by_id(life, kwargs['target_id'])['last_seen_time']<6000, 'update_location_of_target_from_target': speech.update_location_of_target_from_target, 'ping': lambda life: logging.debug('%s: Ping!' % ' '.join(life['name'])), 'wander': lambda life: alife_discover.tick(life), 'pick_up_item': lambda life: alife_needs.tick(life), 'take_shelter': lambda life: alife_shelter.tick(life), 'has_non_relaxed_goal': lambda life: life['state_tier']>TIER_RELAXED, 'needs_to_manage_inventory': lambda life: alife_manage_items.conditions(life) == True, 'manage_inventory': lambda life: alife_manage_items.tick(life), 'cover_exposed': lambda life: len(combat.get_exposed_positions(life))>0, 'ranged_ready': lambda life: lfe.execute_raw(life, 'combat', 'ranged_ready'), 'ranged_attack': lambda life: alife_combat.ranged_attack(life), 'melee_ready': lambda life: lfe.execute_raw(life, 'combat', 'melee_ready'), 'melee_attack': lambda life: alife_combat.melee_attack(life), 'take_cover': lambda life: alife_cover.tick(life), 'hide': lambda life: alife_escape.tick(life), 'stop': lfe.stop, 'search_for_threat': lambda life: alife_search.tick(life), 'has_low_recoil': lambda life: life['recoil']>=.25, 'has_medium_recoil': lambda life: life['recoil']>=.5, 'has_high_recoil': lambda life: life['recoil']>=.75, 'has_focus_point': lambda life: len(lfe.get_memory(life, matches={'text': 'focus_on_chunk'}))>0, 'walk_to': lambda life: movement.travel_to_chunk(life, lfe.get_memory(life, matches={'text': 'focus_on_chunk'})[len(lfe.get_memory(life, matches={'text': 'focus_on_chunk'}))-1]['chunk_key']), 'follow_target': alife_follow.tick, 'guard_focus_point': lambda life: movement.guard_chunk(life, lfe.get_memory(life, matches={'text': 'focus_on_chunk'})[0]['chunk_key']), 'disarm': lambda life, life_id: brain.flag_alife(life, life_id, 'disarm', value=WORLD_INFO['ticks']), 'drop_weapon': lambda life: lfe.drop_item(life, lfe.get_held_items(life, matches={'type': 'gun'})[0]), 'is_disarming': lambda life, life_id: brain.get_alife_flag(life, life_id, 'disarm')>0, 'set_raid_location': lambda life, **kwargs: lfe.memory(life, 'focus_on_chunk', chunk_key=kwargs['chunk_key']), 'move_to_chunk': lambda life, **kwargs: movement.set_focus_point(life, kwargs['chunk_key']), 'move_to_chunk_key': movement.set_focus_point, 'recruiting': lambda life, life_id: speech.send(life, life_id, 'recruit'), 'is_raiding': lambda life: life['group'] and groups.get_stage(life, life['group']) == STAGE_ATTACKING, 'is_in_target_chunk': lambda life, target_id: lfe.get_current_chunk_id(life) == lfe.get_current_chunk_id(LIFE[target_id]), 'get_chunk_key': lfe.get_current_chunk_id, 'has_threat_in_combat_range': stats.has_threat_in_combat_range, 'find_nearest_chunk_in_reference': references.find_nearest_chunk_key_in_reference_of_type, 'has_item_type': lambda life, item_match: not lfe.get_inventory_item_matching(life, item_match) == None, 'move_to_target': lambda life, target_id: movement.travel_to_position(life, LIFE[target_id]['pos']), 'is_in_range_of_target': lambda life, target_id, distance: numbers.distance(life['pos'], LIFE[target_id]['pos'])<=int(distance), 'track_target': lambda life, target_id: brain.meet_alife(life, LIFE[target_id]) and judgement.track_target(life, target_id), 'untrack_target': judgement.untrack_target, 'clear_tracking': lambda life: brain.flag(life, 'tracking_targets', []), 'can_see_item': lambda life, item_uid: item_uid in life['seen_items'], 'has_item': lambda life, item_uid: item_uid in life['inventory'], 'pick_up_item': movement.pick_up_item, 'create_mission': missions.create_mission_for_self, 'give_mission': missions.create_mission_and_give, 'do_mission': alife_work.tick, 'has_mission': lambda life: len(life['missions'])>0, 'drop_item': lfe.drop_item, 'get_id': lambda life: life['id'], 'always': lambda life: 1==1, 'pass': lambda life, *a, **k: True, 'never': lambda life: 1==2})
def listen(life): for event in life['heard'][:]: if not event['from']['id'] in life['know']: pass if not brain.knows_alife(life, event['from']): brain.meet_alife(life, event['from']) logging.info( '%s learned about %s via listen.' % (' '.join(life['name']), ' '.join(event['from']['name']))) if event['gist'] == 'looks_hostile': #speech.communicate(life, 'surrender', matches=[{'id': event['from']['id']}]) pass elif event['gist'] == 'camp_raid': print '*' * 10 print 'RAID IN EFFECT!!!!!!!!!!' print '*' * 10 _knows = brain.knows_alife(life, event['from']) _raid = raids.defend_camp(event['camp']['id'], life['id']) if _knows and not judgement.is_target_dangerous( life, _knows['life']['id']): lfe.memory(life, 'heard about a camp raid', camp=event['camp']['id']) _raid_score = judgement.judge_raid(life, event['raiders'], event['camp']['id']) speech.announce(life, 'raid_score', raid_score=_raid_score) elif event['gist'] == 'raid_score': print life['name'], 'Got friendly raid score:', event['raid_score'] elif event['gist'] == 'share_item_info': if event['item'] in ITEMS: if not brain.has_remembered_item(life, event['item']): lfe.memory(life, 'heard about an item', item=event['item'], target=event['from']['id']) brain.remember_item(life, ITEMS[event['item']]) elif event['gist'] == 'camp_founder': lfe.memory(life, 'heard about camp', camp=event['camp'], target=event['founder'], founder=event['founder']) print 'Thanks for the camp founder info!' elif event['gist'] == 'under_attack': _knows_attacker = True if life['id'] == event['attacker']: pass else: print life['name'], 'HEARD CALL FOR HELP FROM', event['from'][ 'name'] if not brain.knows_alife_by_id(life, event['attacker']): brain.meet_alife(life, LIFE[event['attacker']]) _knows_attacker = False _target = brain.knows_alife_by_id(life, event['attacker']) _believes = judgement.believe_which_alife( life, [event['from']['id'], event['attacker']]) #SITUATION 1: We believe it if _believes == event['from']['id']: lfe.memory(life, 'heard about attack', attacker=event['attacker'], target=event['from']['id']) lfe.memory(life, 'target attacked victim', target=event['attacker'], victim=event['from']['id']) if event['last_seen_at']: _target['last_seen_at'] = event['last_seen_at'][:] else: _target['last_seen_at'] = event['from']['pos'][:] judgement.judge_life(life, event['attacker']) else: lfe.memory(life, 'reject under_attack: attacker is trusted', attacker=event['attacker'], target=event['from']['id']) elif event['gist'] == 'bit': #React to attack... this needs to be a function in stats.py if event['target'] == life['id']: pass else: _trust_sender = judgement.can_trust(life, event['from']['id']) if brain.knows_alife_by_id(life, event['target']): _trust_target = judgement.can_trust(life, event['target'], low=5) else: brain.meet_alife(life, LIFE[event['target']]) _trust_target = False if _trust_target and not _trust_sender and 1 == 4: lfe.memory(life, 'trusted target attacked by', victim=event['target'], target=event['from']['id']) elif event['gist'] == 'consume_item': lfe.memory(life, 'consume_item', target=event['from']['id']) elif event['gist'] == 'call': if judgement.can_trust(life, event['from']['id']): speech.start_dialog(life, event['from']['id'], 'call_accepted', remote=True) elif event['gist'] == 'order_attack': lfe.memory(life, 'ordered to attack', target=event['target']) elif event['gist'] == 'threw_an_item': print 'CHECK THIS HERE' * 100 pass elif event['gist'] == '_group_leader_state_change': life['think_rate'] = 0 elif event['gist'] == 'dialog': if not 'player' in life and not event['dialog_id'] in life[ 'dialogs']: life['dialogs'].append(event['dialog_id']) else: logging.warning('Unhandled ALife context: %s' % event['gist']) life['heard'].remove(event)
def listen(life): for event in life['heard'][:]: if not event['from']['id'] in life['know']: pass if not brain.knows_alife(life, event['from']): brain.meet_alife(life, event['from']) logging.info('%s learned about %s via listen.' % (' '.join(life['name']), ' '.join(event['from']['name']))) if event['gist'] == 'looks_hostile': #speech.communicate(life, 'surrender', matches=[{'id': event['from']['id']}]) pass elif event['gist'] == 'camp_raid': print '*' * 10 print 'RAID IN EFFECT!!!!!!!!!!' print '*' * 10 _knows = brain.knows_alife(life, event['from']) _raid = raids.defend_camp(event['camp']['id'], life['id']) if _knows and not judgement.is_target_dangerous(life, _knows['life']['id']): lfe.memory(life, 'heard about a camp raid', camp=event['camp']['id']) _raid_score = judgement.judge_raid(life, event['raiders'], event['camp']['id']) speech.announce(life, 'raid_score', raid_score=_raid_score) elif event['gist'] == 'raid_score': print life['name'],'Got friendly raid score:', event['raid_score'] elif event['gist'] == 'share_item_info': if event['item'] in ITEMS: if not brain.has_remembered_item(life, event['item']): lfe.memory(life, 'heard about an item', item=event['item'], target=event['from']['id']) brain.remember_item(life, ITEMS[event['item']]) elif event['gist'] == 'camp_founder': lfe.memory(life, 'heard about camp', camp=event['camp'], target=event['founder'], founder=event['founder']) print 'Thanks for the camp founder info!' elif event['gist'] == 'under_attack': _knows_attacker = True if life['id'] == event['attacker']: pass else: print life['name'], 'HEARD CALL FOR HELP FROM', event['from']['name'] if not brain.knows_alife_by_id(life, event['attacker']): brain.meet_alife(life, LIFE[event['attacker']]) _knows_attacker = False _target = brain.knows_alife_by_id(life, event['attacker']) _believes = judgement.believe_which_alife(life, [event['from']['id'], event['attacker']]) #SITUATION 1: We believe it if _believes == event['from']['id']: lfe.memory(life, 'heard about attack', attacker=event['attacker'], target=event['from']['id']) lfe.memory(life, 'target attacked victim', target=event['attacker'], victim=event['from']['id']) if event['last_seen_at']: _target['last_seen_at'] = event['last_seen_at'][:] else: _target['last_seen_at'] = event['from']['pos'][:] judgement.judge_life(life, event['attacker']) else: lfe.memory(life, 'reject under_attack: attacker is trusted', attacker=event['attacker'], target=event['from']['id']) elif event['gist'] == 'bit': #React to attack... this needs to be a function in stats.py if event['target'] == life['id']: pass else: _trust_sender = judgement.can_trust(life, event['from']['id']) if brain.knows_alife_by_id(life, event['target']): _trust_target = judgement.can_trust(life, event['target'], low=5) else: brain.meet_alife(life, LIFE[event['target']]) _trust_target = False if _trust_target and not _trust_sender and 1==4: lfe.memory(life, 'trusted target attacked by', victim=event['target'], target=event['from']['id']) elif event['gist'] == 'consume_item': lfe.memory(life, 'consume_item', target=event['from']['id']) elif event['gist'] == 'call': if judgement.can_trust(life, event['from']['id']): speech.start_dialog(life, event['from']['id'], 'call_accepted', remote=True) elif event['gist'] == 'order_attack': lfe.memory(life, 'ordered to attack', target=event['target']) elif event['gist'] == 'threw_an_item': print 'CHECK THIS HERE' * 100 pass elif event['gist'] == '_group_leader_state_change': life['think_rate'] = 0 elif event['gist'] == 'dialog': if not 'player' in life and not event['dialog_id'] in life['dialogs']: life['dialogs'].append(event['dialog_id']) else: logging.warning('Unhandled ALife context: %s' % event['gist']) life['heard'].remove(event)
def look(life): if not 'CAN_SEE' in life['life_flags']: return False for target_id in life['know']: if life['know'][target_id]['last_seen_time']: life['know'][target_id]['last_seen_time'] += 1 life['know'][target_id]['time_visible'] = 0 else: life['know'][target_id]['time_visible'] += 1 if 'player' in life: if life['path'] or not brain.get_flag(life, 'visible_chunks'): if SETTINGS['smp']: _visible_chunks = post_scan_surroundings(life) else: _visible_chunks = scan_surroundings(life, judge=False, get_chunks=True, ignore_chunks=0) _chunks = [maps.get_chunk(c) for c in _visible_chunks] brain.flag(life, 'visible_chunks', value=_visible_chunks) elif 'player' in life: _visible_chunks = brain.get_flag(life, 'visible_chunks') _chunks = [maps.get_chunk(c) for c in _visible_chunks] else: #This is for optimizing. Be careful if you mess with this... _nearby_alife = {} for alife in LIFE.values(): if alife['id'] == life['id']: continue if bad_numbers.distance(life['pos'], alife['pos'])<=get_vision(life) and can_see_position(life, alife['pos']): _nearby_alife[alife['id']] = {'pos': alife['pos'][:], 'stance': alife['stance']} _last_nearby_alife = brain.get_flag(life, '_nearby_alife') if not _last_nearby_alife == _nearby_alife: brain.flag(life, '_nearby_alife', value=_nearby_alife) else: for target_id in life['seen']: if life['know'][target_id]['last_seen_time']: life['know'][target_id]['last_seen_time'] = 0 return False _chunks = [maps.get_chunk(c) for c in brain.get_flag(life, 'visible_chunks')] life['seen'] = [] life['seen_items'] = [] for item_uid in life['know_items']: life['know_items'][item_uid]['last_seen_time'] += 1 for target_id in life['know']: life['know'][target_id]['last_seen_time'] += 1 if life['know'][target_id]['last_seen_time']>=10 and not life['know'][target_id]['escaped']: life['know'][target_id]['escaped'] = 1 if not 'player' in life: quick_look(life) return False for chunk in _chunks: judgement.judge_chunk_visually(life, '%s,%s' % (chunk['pos'][0], chunk['pos'][1])) judgement.judge_chunk_life(life, '%s,%s' % (chunk['pos'][0], chunk['pos'][1])) for ai in [LIFE[i] for i in chunk['life']]: if ai['id'] == life['id']: continue if not is_in_fov(life, ai['pos']): if ai['id'] in life['know']: life['know'][ai['id']]['time_visible'] = 0 continue if not ai['id'] in life['know']: brain.meet_alife(life, ai) _visibility = get_visiblity_of_position(life, ai['pos']) _stealth_coverage = get_stealth_coverage(ai) if _visibility < 1-_stealth_coverage: continue life['seen'].append(ai['id']) if life['think_rate'] == life['think_rate_max']: lfe.create_and_update_self_snapshot(LIFE[ai['id']]) judgement.judge_life(life, ai['id']) if ai['dead']: if 'player' in life and not life['know'][ai['id']]['dead'] and life['know'][ai['id']]['last_seen_time']>25: logic.show_event('You discover the body of %s.' % ' '.join(ai['name']), life=ai) if life['know'][ai['id']]['group']: groups.remove_member(life, life['know'][ai['id']]['group'], ai['id']) life['know'][ai['id']]['group'] = None core.record_loss(1) life['know'][ai['id']]['dead'] = True elif ai['asleep']: life['know'][ai['id']]['asleep'] = True elif not ai['asleep']: life['know'][ai['id']]['asleep'] = False life['know'][ai['id']]['last_seen_time'] = 0 life['know'][ai['id']]['last_seen_at'] = ai['pos'][:] life['know'][ai['id']]['escaped'] = False life['know'][ai['id']]['state'] = ai['state'] life['know'][ai['id']]['state_tier'] = ai['state_tier'] if brain.alife_has_flag(life, ai['id'], 'search_map'): brain.unflag_alife(life, ai['id'], 'search_map') _chunk_id = lfe.get_current_chunk_id(ai) judgement.judge_chunk(life, _chunk_id, seen=True) for item in [ITEMS[i] for i in chunk['items'] if i in ITEMS]: if not is_in_fov(life, item['pos']): continue if not item['uid'] in life['know_items']: brain.remember_item(life, item) if items.is_item_owned(item['uid']): #TODO: This doesn't work because we are specifically checking chunks if item['owner'] and lfe.item_is_equipped(LIFE[item['owner']], item['uid']): life['know_items'][item['uid']]['last_seen_at'] = LIFE[item['owner']]['pos'] life['know_items'][item['uid']]['last_owned_by'] = item['owner'] life['know_items'][item['uid']]['last_seen_time'] = 0 continue life['seen_items'].append(item['uid']) life['know_items'][item['uid']]['last_seen_at'] = item['pos'][:] life['know_items'][item['uid']]['last_seen_time'] = 0 life['know_items'][item['uid']]['last_owned_by'] = None life['know_items'][item['uid']]['score'] = judgement.judge_item(life, item['uid']) life['know_items'][item['uid']]['lost'] = False
def quick_look(life): _life = [] _items = [] _current_chunk = lfe.get_current_chunk_id(life) _current_chunk_pos = chunks.get_chunk(_current_chunk)['pos'] _x_chunk_min = bad_numbers.clip(_current_chunk_pos[0]-((get_vision(life)/WORLD_INFO['chunk_size'])*WORLD_INFO['chunk_size']), 0, MAP_SIZE[0]-WORLD_INFO['chunk_size']) _y_chunk_min = bad_numbers.clip(_current_chunk_pos[1]-((get_vision(life)/WORLD_INFO['chunk_size'])*WORLD_INFO['chunk_size']), 0, MAP_SIZE[1]-WORLD_INFO['chunk_size']) _x_chunk_max = bad_numbers.clip(_current_chunk_pos[0]+((get_vision(life)/WORLD_INFO['chunk_size'])*WORLD_INFO['chunk_size']), 0, MAP_SIZE[0]-WORLD_INFO['chunk_size']) _y_chunk_max = bad_numbers.clip(_current_chunk_pos[1]+((get_vision(life)/WORLD_INFO['chunk_size'])*WORLD_INFO['chunk_size']), 0, MAP_SIZE[1]-WORLD_INFO['chunk_size']) _has_ready_weapon = combat.has_ready_weapon(life) for y in range(_y_chunk_min, _y_chunk_max, WORLD_INFO['chunk_size']): for x in range(_x_chunk_min, _x_chunk_max, WORLD_INFO['chunk_size']): _chunk_key = '%s,%s' % (x, y) _chunk = chunks.get_chunk(_chunk_key) for life_id in _chunk['life']: ai = LIFE[life_id] if ai['dead']: continue if life_id == life['id']: continue if not can_see_position(life, LIFE[life_id]['pos']): continue _visibility = get_visiblity_of_position(life, ai['pos']) _stealth_coverage = get_stealth_coverage(ai) if _visibility < 1-_stealth_coverage: continue if not ai['id'] in life['know']: brain.meet_alife(life, ai) life['seen'].append(ai['id']) if life['think_rate'] == life['think_rate_max']: lfe.create_and_update_self_snapshot(LIFE[ai['id']]) judgement.judge_life(life, ai['id']) if ai['dead']: if life['know'][ai['id']]['group']: groups.remove_member(life, life['know'][ai['id']]['group'], ai['id']) life['know'][ai['id']]['group'] = None life['know'][ai['id']]['dead'] = True elif ai['asleep']: life['know'][ai['id']]['asleep'] = True elif not ai['asleep']: life['know'][ai['id']]['asleep'] = False life['know'][ai['id']]['last_seen_time'] = 0 life['know'][ai['id']]['last_seen_at'] = ai['pos'][:] life['know'][ai['id']]['escaped'] = False life['know'][ai['id']]['state'] = ai['state'] life['know'][ai['id']]['state_tier'] = ai['state_tier'] if brain.alife_has_flag(life, ai['id'], 'search_map'): brain.unflag_alife(life, ai['id'], 'search_map') _chunk_id = lfe.get_current_chunk_id(ai) judgement.judge_chunk(life, _chunk_id, seen=True) _life.append(life_id) for item_uid in _chunk['items']: if not item_uid in ITEMS: continue item = ITEMS[item_uid] if not item['uid'] in life['know_items']: brain.remember_item(life, item) if items.is_item_owned(item['uid']): continue # #TODO: This doesn't work because we are specifically checking chunks # if item['owner'] and lfe.item_is_equipped(LIFE[item['owner']], item['uid']): # life['know_items'][item['uid']]['last_seen_at'] = LIFE[item['owner']]['pos'] # life['know_items'][item['uid']]['last_owned_by'] = item['owner'] # life['know_items'][item['uid']]['last_seen_time'] = 0 # # continue if not can_see_position(life, item['pos']): continue if not item['uid'] in life['know_items']: brain.remember_item(life, item) life['seen_items'].append(item['uid']) life['know_items'][item['uid']]['last_seen_at'] = item['pos'][:] life['know_items'][item['uid']]['last_seen_time'] = 0 life['know_items'][item['uid']]['last_owned_by'] = None life['know_items'][item['uid']]['score'] = judgement.judge_item(life, item['uid']) life['know_items'][item['uid']]['lost'] = False _items.append(item_uid)