def path_along_reference(life, ref_type): _best_reference = _find_best_unknown_reference(life, ref_type)["reference"] if not _best_reference: print "NO BEST", ref_type return False _starting_chunk_key = find_nearest_key_in_reference(life, _best_reference) _chunk_path_keys = [] _directions = {} for neighbor_key in mapgen.get_neighbors_of_type(WORLD_INFO, _starting_chunk_key, ref_type, diagonal=True): if maps.get_chunk(neighbor_key) == lfe.get_current_chunk(life): continue _neighbor_pos = [int(val) + (WORLD_INFO["chunk_size"] / 2) for val in neighbor_key.split(",")] _cent = ( lfe.get_current_chunk(life)["pos"][0] + (WORLD_INFO["chunk_size"] / 2), lfe.get_current_chunk(life)["pos"][1] + (WORLD_INFO["chunk_size"] / 2), ) _neighbor_direction = numbers.direction_to(_cent, _neighbor_pos) _directions[_neighbor_direction] = {"key": neighbor_key, "score": 9999} _best_dir = {"dir": -1, "score": 0} for mod in range(-45, 361, 45): _new_dir = life["discover_direction"] + mod if _new_dir >= 360: _new_dir -= 360 if _new_dir in _directions: _score = 0 if _directions[_new_dir]["key"] in life["known_chunks"]: continue _score += (180 - (abs(_new_dir - life["discover_direction"]))) / 45 _score += life["discover_direction_history"].count(_new_dir) if _score >= _best_dir["score"]: if _score == _best_dir["score"]: _chunk = maps.get_chunk(_directions[_new_dir]["key"]) _best_dir["dir"] = _new_dir _best_dir["score"] = _score if _best_dir["dir"] == -1: return None # print _best_dir,_directions[_best_dir['dir']] life["discover_direction_history"].append(life["discover_direction"]) if len(life["discover_direction_history"]) >= 5: life["discover_direction_history"].pop(0) life["discover_direction"] = _best_dir["dir"] return _directions[_best_dir["dir"]]["key"]
def path_along_reference(life, ref_type): _reference = WORLD_INFO['references'][WORLD_INFO['reference_map']['roads'][0]] _visible_chunks = alife.brain.get_flag(life, 'visible_chunks') _starting_chunk_key = alife.chunks.get_nearest_chunk_in_list(life['pos'], _reference, check_these_chunks_first=_visible_chunks) _chunk_path_keys = [] _directions = {} for neighbor_key in mapgen.get_neighbors_of_type(WORLD_INFO, _starting_chunk_key, ref_type, diagonal=True): if maps.get_chunk(neighbor_key) == lfe.get_current_chunk(life): continue _neighbor_pos = [int(val)+(WORLD_INFO['chunk_size']/2) for val in neighbor_key.split(',')] _cent = (lfe.get_current_chunk(life)['pos'][0]+(WORLD_INFO['chunk_size']/2), lfe.get_current_chunk(life)['pos'][1]+(WORLD_INFO['chunk_size']/2)) _neighbor_direction = numbers.direction_to(_cent, _neighbor_pos) _directions[_neighbor_direction] = {'key': neighbor_key, 'score': 9999} _best_dir = {'dir': -1, 'score': 0} for mod in range(-45, 361, 45): _new_dir = life['discover_direction']+mod if _new_dir>=360: _new_dir -= 360 if _new_dir in _directions: _score = 0 if _directions[_new_dir]['key'] in life['known_chunks']: continue _score += (180-(abs(_new_dir-life['discover_direction'])))/45 _score += life['discover_direction_history'].count(_new_dir) if _score>=_best_dir['score']: if _score==_best_dir['score']: _chunk = maps.get_chunk(_directions[_new_dir]['key']) _best_dir['dir'] = _new_dir _best_dir['score'] = _score if _best_dir['dir'] == -1: return None #print _best_dir,_directions[_best_dir['dir']] life['discover_direction_history'].append(life['discover_direction']) if len(life['discover_direction_history'])>=5: life['discover_direction_history'].pop(0) life['discover_direction'] = _best_dir['dir'] return _directions[_best_dir['dir']]['key']
def _find_nearest_reference(life, ref_type, skip_current=False, skip_known=False, skip_unknown=False, ignore_array=[]): _lowest = {"chunk_key": None, "reference": None, "distance": -1} for reference in WORLD_INFO["reference_map"][ref_type]: if reference in ignore_array: continue _nearest_key = find_nearest_key_in_reference(life, reference) if skip_current and maps.get_chunk(_nearest_key) == lfe.get_current_chunk(life): continue if skip_known and _nearest_key in life["known_chunks"]: continue if skip_unknown and not _nearest_key in life["known_chunks"]: continue _center = [int(val) + (WORLD_INFO["chunk_size"] / 2) for val in _nearest_key.split(",")] _distance = numbers.distance(life["pos"], _center) if not _lowest["chunk_key"] or _distance < _lowest["distance"]: _lowest["distance"] = _distance _lowest["chunk_key"] = _nearest_key _lowest["reference"] = reference return _lowest
def _find_nearest_reference(life, ref_type, skip_current=False, skip_known=False, skip_unknown=False, ignore_array=[]): _lowest = {'chunk_key': None, 'reference': None, 'distance': -1} for reference in WORLD_INFO['reference_map'][ref_type]: if reference in ignore_array: continue _nearest_key = find_nearest_key_in_reference(life, reference) if skip_current and maps.get_chunk(_nearest_key) == lfe.get_current_chunk(life): continue if skip_known and _nearest_key in life['known_chunks']: continue if skip_unknown and not _nearest_key in life['known_chunks']: continue _center = [int(val)+(WORLD_INFO['chunk_size']/2) for val in _nearest_key.split(',')] _distance = numbers.distance(life['pos'], _center) if not _lowest['chunk_key'] or _distance<_lowest['distance']: _lowest['distance'] = _distance _lowest['chunk_key'] = _nearest_key _lowest['reference'] = reference return _lowest
def get_jobs(life, group_id): _group = get_group(life, group_id) _jobs = [] _leader = LIFE[_group['leader']] if not has_camp(group_id): _nearest_camp = camps.get_nearest_known_camp(_leader) if _leader['known_camps']: _j = jobs.create_job(_leader, 'Raid', gist='start_raid', description='Raid camp %s.' % _nearest_camp['id']) _pos = lfe.get_current_chunk(_leader)['pos'] _chunk_key = lfe.get_current_chunk_id(_leader) jobs.add_task(_j, '0', 'announce_to_group', action.make_small_script(function='announce_to_group', kwargs={'group_id': group_id, 'gist': 'announce_group_job', 'message': jobs.get_job(_j)['description'], 'job_id': _j}), player_action=action.make_small_script(function='always'), description='Gather group members.') jobs.add_task(_j, '1', 'move_to_chunk', action.make_small_script(function='travel_to_position', kwargs={'pos': _pos}), player_action=action.make_small_script(function='is_in_chunk', kwargs={'chunk_key': _chunk_key}), description='Travel to position %s, %s' % (_pos[0], _pos[1]), delete_on_finish=False) jobs.add_task(_j, '2', 'wait_for_number_of_group_members_in_chunk', action.make_small_script(function='number_of_alife_in_chunk_matching', kwargs={'amount': 2, 'chunk_key': _chunk_key, 'matching': {'group': _leader['group']}}), description='Wait until everyone arrives.') #jobs.add_task(_j, '3', 'talk', # action.make_small_script(function='travel_to_position', # kwargs={'pos': chunks.get_nearest_chunk_in_list(_leader['pos'], camps.get_camp(_nearest_camp['id'])['reference'])}), # requires=['1'], # delete_on_finish=False) _jobs.append(_j) if len(_leader['known_groups'])>1: _lowest = {'score': 0, 'group': None} for group_id in [g for g in _leader['known_groups'] if not g==_leader['group']]: _score = judgement.judge_group(_leader, group_id) if not _lowest['group'] or _score < _lowest['score']: _lowest['score'] = _score _lowest['group'] = group_id print 'RAID', _lowest else: print 'ony one' return _jobs
def get_jobs(life, group_id): _group = get_group(life, group_id) _jobs = [] _leader = LIFE[_group['leader']] if not has_camp(group_id): _nearest_camp = camps.get_nearest_known_camp(_leader) if _leader['known_camps']: _j = jobs.create_job(_leader, 'Raid', gist='start_raid', description='Raid camp %s.' % _nearest_camp['id']) _pos = lfe.get_current_chunk(_leader)['pos'] _chunk_key = lfe.get_current_chunk_id(_leader) jobs.add_task( _j, '0', 'announce_to_group', action.make_small_script(function='announce_to_group', kwargs={ 'group_id': group_id, 'gist': 'announce_group_job', 'message': jobs.get_job(_j)['description'], 'job_id': _j }), player_action=action.make_small_script(function='always'), description='Gather group members.') jobs.add_task( _j, '1', 'move_to_chunk', action.make_small_script(function='travel_to_position', kwargs={'pos': _pos}), player_action=action.make_small_script( function='is_in_chunk', kwargs={'chunk_key': _chunk_key}), description='Travel to position %s, %s' % (_pos[0], _pos[1]), delete_on_finish=False) jobs.add_task(_j, '2', 'wait_for_number_of_group_members_in_chunk', action.make_small_script( function='number_of_alife_in_chunk_matching', kwargs={ 'amount': 2, 'chunk_key': _chunk_key, 'matching': { 'group': _leader['group'] } }), description='Wait until everyone arrives.') #jobs.add_task(_j, '3', 'talk', # action.make_small_script(function='travel_to_position', # kwargs={'pos': chunks.get_nearest_chunk_in_list(_leader['pos'], camps.get_camp(_nearest_camp['id'])['reference'])}), # requires=['1'], # delete_on_finish=False) _jobs.append(_j) if len(_leader['known_groups']) > 1: _lowest = {'score': 0, 'group': None} for group_id in [ g for g in _leader['known_groups'] if not g == _leader['group'] ]: _score = judgement.judge_group(_leader, group_id) if not _lowest['group'] or _score < _lowest['score']: _lowest['score'] = _score _lowest['group'] = group_id print 'RAID', _lowest else: print 'ony one' return _jobs