def add_drones_space(_from, s): gl.lock('npc') gl.l.info('Добавляем дронов на аномальку {}: {}'.format(_from, s)) _id = s['site_id'] drones = s['drones'] # [(drone_id, (damage, min_sig)), ...] change_flag = False if _id not in gl.drones: gl.drones[_id] = {} for k, v in drones: if k not in gl.drones[_id]: change_flag = True gl.drones[_id][k] = { 'dmg': v[0], 'min_sig': v[1], 'npc': None, 'from': _from, 'pos': None } if change_flag: gl.npc_queue_ch[_id] = datetime.datetime.now() gl.lock_free('npc')
def del_drones_space(_from, s): gl.lock('npc') gl.l.info('Удаляем дронов с аномальки {}: {}'.format(_from, s)) _id = s['site_id'] drones = s['drones'] # [drone_id, ...] change_flag = False if _id in gl.drones: for drone_id in drones: if drone_id in gl.drones[_id]: change_flag = True npc_id = gl.drones[_id][drone_id]['npc'] if npc_id: if drone_id in gl.npcs[_id][npc_id]['list']: gl.npcs[_id][npc_id]['dmg'] -= gl.drones[_id][ drone_id]['dmg'] gl.npcs[_id][npc_id]['list'].remove(drone_id) del gl.drones[_id][drone_id] if change_flag: gl.npc_queue_ch[_id] = datetime.datetime.now() gl.lock_free('npc')
def jet_status(_from, s): gl.lock('jets') gl.l.info('Запрос от {} статуса джета: {}'.format(_from, s)) jet_id = s['jet_id'] lock = s['lock'] if jet_id not in gl.jets \ or datetime.datetime.now() - gl.jets[jet_id]['time'] > datetime.timedelta(seconds=15) \ or _from == gl.jets[jet_id]['owner']: if lock: if jet_id not in gl.jets: gl.jets[jet_id] = {} gl.jets[jet_id]['owner'] = _from gl.jets[jet_id]['time'] = datetime.datetime.now() status = 'free' else: status = 'busy' gl.lock_free('jets') send_answer(_from, status, s['rnd'])
def set_anomaly_status(_from, s): gl.lock('anomalies') gl.l.info('Установка статуса аномальки от {}: {}'.format(_from, s)) site_id = s['site_id'] status = s['status'] old_status = gl.anomalies[site_id]['status'] if status == 'busy': if old_status in ['pre', 'free']: gl.anomalies[site_id]['send'] = True gl.anomalies[site_id]['who'] = None else: status = old_status gl.anomalies[site_id]['status'] = status gl.lock_free('anomalies') if old_status != status: gl.l.info('Новый статус аномальки {} - {}'.format( site_id, gl.anomalies[site_id]['status'])) show_screen()
def set_bot_params(_from, s): gl.lock('bots') gl.l.info('Установка параметров бота {}: {}'.format(_from, s)) p_type = s['p_type'] # online, role, place, ... value = s['value'] # TODO: Лажа, перенести в другое место # Сбрасываем привязку дронов к неписи, если любой корабль в группе покидает грид if gl.bots[_from]['role'] == 'crub': if p_type == 'place' and gl.bots[_from]['place'] and not value: place_id = gl.bots[_from]['place'] if place_id: threading.Thread(target=reset_site_drone, args=(place_id, )).start() gl.bots[_from][p_type] = value # Сбрасываем параметры if p_type == 'online': gl.bots[_from]['role'] = None gl.bots[_from]['group'] = None gl.bots[_from]['place'] = None # Рассылка статуса другим ботам for k, v in gl.bots.items(): if k != _from and v['online']: send_notification(k, 'update_data', gl.bots[_from]) gl.l.info('Отправили уведомление для {} от {}: {}'.format( k, _from, gl.bots[_from])) gl.lock_free('bots')
def add_npc(_from, s): gl.lock('npc') gl.l.info('Добавляем непись {}: {}'.format(_from, s)) _id = s['site_id'] npc_list = s['npc_list'] if _id not in gl.npcs: gl.npcs[_id] = {} if _id in gl.drones: for k in gl.drones[_id].keys(): gl.drones[_id][k]['npc'] = None for k in gl.npcs[_id].keys(): gl.npcs[_id][k]['dmg'] = 0 gl.npcs[_id][k]['list'] = [] for npc_id, npc_info in npc_list: if npc_id not in gl.npcs[_id]: gl.npcs[_id][npc_id] = npc_info gl.npcs[_id][npc_id]['dmg'] = 0 # Суммарный демаг от дронов gl.npcs[_id][npc_id]['list'] = [] # Список дронов gl.npcs[_id][npc_id]['pos'] = None # Координаты нпц gl.npc_queue_ch[_id] = datetime.datetime.now() gl.lock_free('npc')
def do_action(_from, s): gl.lock('actions') gl.l.info('Выполнение действия от {}: {}'.format(_from, s)) act = s['action'] grid = s['grid'] gr = s['gr'] if gr: who = gr else: who = _from if grid not in gl.actions: gl.actions[grid] = {} if act not in gl.actions[grid]: gl.actions[grid][act] = {} now = datetime.datetime.now() gl.actions[grid][act]['who'] = who gl.actions[grid][act]['time'] = now gl.lastActionTime = now gl.lock_free('actions')
def _show_screen(): gl.lock('screen') os.system('cls') _show_anomaly_list() gl.lock_free('screen')
def act_status(_from, s): gl.lock('actions') gl.l.info('Запрос на выполнение действия от {}: {}'.format(_from, s)) act = s['action'] grid = s['grid'] add_time = s['add_time'] gr = s['gr'] lock = s['lock'] if gr: who = gr else: who = _from if grid not in gl.actions: gl.actions[grid] = {} now = datetime.datetime.now() status = 'ready' if gl.lastActionTime and now - gl.lastActionTime < datetime.timedelta( milliseconds=1000): tm = datetime.timedelta(milliseconds=1000) - (now - gl.lastActionTime) status = now + tm elif act not in gl.actions[grid]: gl.actions[grid][act] = {'who': None, 'time': None} elif gl.actions[grid][act]['time']: delay_time = 1000 + gl.get_random(1000, 2000) + add_time delta_flag = now - gl.actions[grid][act]['time'] < datetime.timedelta( milliseconds=delay_time) if gl.actions[grid][act]['who'] != who and delta_flag: tm = datetime.timedelta(milliseconds=delay_time) - ( now - gl.actions[grid][act]['time']) status = now + tm if status == 'ready' and lock: if grid not in gl.actions: gl.actions[grid] = {} if act not in gl.actions[grid]: gl.actions[grid][act] = {} gl.actions[grid][act]['who'] = who gl.actions[grid][act]['time'] = now gl.lastActionTime = now gl.lock_free('actions') send_answer(_from, status, s['rnd'])
def get_anomaly_list(_from, s): gl.lock('anomalies') gl.l.info('Запрос на получение списка аномалек от {}: {}'.format(_from, s)) ans = [x for x in gl.anomalies.keys()] gl.lock_free('anomalies') send_answer(_from, ans, s['rnd'])
def set_send_status(_from, s): gl.lock('anomalies') gl.l.info('Установка статуса отправки аномальки от {}: {}'.format( _from, s)) _id = s['site_id'] gl.anomalies[_id]['send'] = True gl.lock_free('anomalies')
def get_send_status(_from, s): gl.lock('anomalies') gl.l.info('Получение статуса отправки аномальки от {}: {}'.format( _from, s)) site_id = s['site_id'] gl.lock_free('anomalies') send_answer(_from, gl.anomalies[site_id]['send'], s['rnd'])
def get_anomaly_status(_from, s): gl.lock('anomalies') gl.l.info('Запрос на получение статуса аномальки от {}: {}'.format( _from, s)) status = _get_anomaly_status(s['site_id'], s['who']) gl.lock_free('anomalies') send_answer(_from, status, s['rnd'])
def jet_free(_from, s): gl.lock('jets') gl.l.info('Освобождение джета от {}: {}'.format(_from, s)) jet_id = s['jet_id'] if jet_id in gl.jets and _from == gl.jets[jet_id]['owner']: del gl.jets[jet_id] gl.lock_free('jets')
def get_bots_params(_from, s): gl.lock('bots') gl.l.info('Запрос от {} на получение параметров активных ботов: {}'.format( _from, s)) data = [] for k, v in gl.bots.items(): if k != _from and v['online']: data.append(v) gl.lock_free('bots') send_answer(_from, data, s['rnd'])
def get_npc_queue(_from, s): gl.lock('npc') gl.l.info('Запрос неписевой очереди {}: {}'.format(_from, s)) _id = s['site_id'] queue = [] if _id in gl.npc_queue: queue = gl.npc_queue[_id] gl.lock_free('npc') send_answer(_from, queue, s['rnd'])
def sel_anomaly(_from, s): gl.lock('anomalies') gl.l.info('Помечаем аномальку как рабочую от {}: {}'.format(_from, s)) who = s['who'] pos = s['pos'] site_id = None data = None # Если есть помеченная или начатая аномаль, возвращаем ее for k, v in gl.anomalies.items(): # Если запрашиваемая аномаль уже есть if v['who'] == who and v['status'] in ['pre', 'marked', 'begined']: site_id = k break # Получаем свободную аномаль if not site_id: site_list = [] for k, v in gl.anomalies.items(): if v['status'] == 'free': if pos: site_list.append((_get_dist(pos, v['pos']), v)) else: site_list.append((v['full_name'], v)) site_list.sort() if site_list: v = site_list[0][1] site_id = v['id'] gl.anomalies[site_id]['status'] = 'pre' gl.anomalies[site_id]['who'] = who if site_id: data = _get_anomaly_data(site_id) gl.lock_free('anomalies') send_answer(_from, {'data': data}, s['rnd'])
def del_anomaly_list(_from, s): gl.lock('anomalies') gl.l.info('Удаляем аномальки из списка от {}: {}'.format(_from, s)) data = s['data'] for site_id in data: if site_id in gl.anomalies and gl.anomalies[site_id]['status'] in [ 'free', 'busy', 'ended' ]: gl.l.info('Удаляю аномальку: {}'.format(site_id)) del gl.anomalies[site_id] gl.lock_free('anomalies') show_screen()
def reset_site_drone(site_id): gl.lock('npc') if site_id in gl.drones: for drone_id in gl.drones[site_id].keys(): if drone_id in gl.drones[site_id]: gl.drones[site_id][drone_id]['npc'] = None if site_id not in gl.npcs: gl.npcs[site_id] = {} for npc_id in gl.npcs[site_id].keys(): gl.npcs[site_id][npc_id]['dmg'] = 0 gl.npcs[site_id][npc_id]['list'] = [] gl.npc_queue_ch[site_id] = datetime.datetime.now() gl.lock_free('npc')
def del_npc(_from, s): gl.lock('npc') gl.l.info('Удаляем непись {}: {}'.format(_from, s)) _id = s['site_id'] npc_list = s['npc_list'] if _id in gl.npcs: for npc_id in npc_list: if npc_id in gl.npcs[_id]: for drone_id in gl.npcs[_id][npc_id]['list']: gl.drones[_id][drone_id]['npc'] = None del gl.npcs[_id][npc_id] gl.npc_queue_ch[_id] = datetime.datetime.now() gl.lock_free('npc')
def unlock_action(_from, s): gl.lock('actions') gl.l.info('Отмена выполнение действия от {}: {}'.format(_from, s)) act = s['action'] grid = s['grid'] gr = s['gr'] if gr: who = gr else: who = _from if grid in gl.actions and act in gl.actions[grid]: if gl.actions[grid][act]['who'] == who: gl.actions[grid][act] = {'who': None, 'time': None} gl.lock_free('actions')
def set_ball_pos(_from, s): gl.lock('npc') gl.l.info('Добавляем координаты неписи и дронов {}: {}'.format(_from, s)) _id = s['site_id'] npc_list = s['npc'] drone_list = s['drone'] if _id in gl.npcs: for k, v in npc_list.items(): if k in gl.npcs[_id]: gl.npcs[_id][k]['pos'] = v if _id in gl.drones: for k, v in drone_list.items(): if k in gl.drones[_id]: gl.drones[_id][k]['pos'] = v gl.lock_free('npc')
def get_anomaly(_from, s): gl.lock('anomalies') gl.l.info('Запрос на получение свободной аномальки от {}: {}'.format( _from, s)) who = s['who'] data = None # Если есть помеченная или начатая аномаль, возвращаем ее for k, v in gl.anomalies.items(): if v['who'] == who and v['status'] in ['marked', 'begined']: data = _get_anomaly_data(k) break gl.lock_free('anomalies') send_answer(_from, {'data': data}, s['rnd'])
def set_anomaly_list(_from, s): gl.lock('anomalies') gl.l.info('Добавляем недостающие аномальки в список от {}: {}'.format( _from, s)) data = s['data'] for v in data.values(): site_id = v['site_id'] full_name = v['name'] status = v['status'] pos = v['pos'] dni = v['dni'] if full_name: name = full_name[-3:] else: name = None if site_id not in gl.anomalies: gl.anomalies[site_id] = { 'site_id': site_id, 'status': status, 'who': None, 'full_name': full_name, 'name': name, 'send': False, 'pos': pos, 'dni': dni } gl.lock_free('anomalies') show_screen()
def calc_npc_queue(site_id): gl.lock('npc') if site_id in gl.drones and site_id in gl.npcs: queue = [] q = {} for x in range(1, 8): q[x] = [] # Сортируем непись по очереди в порядке приоритета for k, v in gl.npcs[site_id].items(): # Центрики с носферату if v['sentry'] and bool(v['nosferatu']): q[1].append(k) # Фригаты со скрамблерами elif v['sig'] < 50 and bool(v['scramble']): q[2].append(k) # Фригаты elif v['sig'] < 50: q[3].append(k) # Остальные центрики elif v['sentry']: q[4].append(k) # Элитные и сентинели elif v['name'].split(' ')[0] in ['Elite', 'Sentient']: q[5].append(k) # Остальные корабли, кроме БШ elif v['sig'] < 350: q[6].append((v['sig'], k)) # БШ и все остальное else: q[7].append(k) # Собираем очередь for x in range(1, 8): if x in [1, 2, 3, 4, 5, 7]: q[x].sort(reverse=bool(gl.opt['general']['first_new'])) queue += q[x] elif x == 6: tmp = {} for i in q[x]: if i[0] not in tmp: tmp[i[0]] = [] tmp[i[0]].append(i[1]) for key in sorted(tmp): tmp[key].sort(reverse=bool(gl.opt['general']['first_new'])) queue += tmp[key] change_list = [] bots_list = {} dmg_list = {} # Распределяем дронов в группы по наносимому урону for k, v in gl.drones[site_id].items(): if v['dmg'] not in dmg_list: dmg_list[v['dmg']] = [] dmg_list[v['dmg']].append(k) min_dmg = [] # Определяем минимальный урон for k in dmg_list.keys(): min_dmg.append(k) min_dmg.sort() ed = 30 # Расчетное время уничтожения неписи в секундах # Назначаем дронов для неписи for i in range(1, 4): ed /= i for npc_id in queue: ehp = gl.npcs[site_id][npc_id]['ehp'] # Выбираем дронов с минимальным демагом for m in min_dmg: for k in dmg_list[m]: if gl.drones[site_id][k]['npc']: continue dmg = gl.npcs[site_id][npc_id]['dmg'] if not dmg or ehp / dmg > ed: v = gl.drones[site_id][k] if v['min_sig'] > gl.npcs[site_id][npc_id]['sig']: continue gl.drones[site_id][k]['npc'] = npc_id gl.npcs[site_id][npc_id]['list'].append(k) gl.npcs[site_id][npc_id]['dmg'] += v['dmg'] if v['from'] not in change_list: change_list.append(v['from']) if not _get_any_drone(site_id): break for k, v in gl.drones[site_id].items(): if v['npc']: npc_id = v['npc'] if npc_id not in bots_list: bots_list[npc_id] = [] if v['from'] not in bots_list[npc_id]: bots_list[npc_id].append(v['from']) # Помечаем непись которую будут лочить боты for k, v in gl.bots.items(): if v['place'] != site_id: continue for npc_id in queue: if npc_id not in bots_list: bots_list[npc_id] = [] if v['login'] in bots_list[npc_id]: continue dmg = gl.npcs[site_id][npc_id]['dmg'] ehp = gl.npcs[site_id][npc_id]['ehp'] if not dmg or ehp / dmg > ed: bots_list[npc_id].append(v['login']) gl.npc_queue[site_id] = [] for npc_id in queue: if npc_id not in bots_list: bots_list[npc_id] = [] gl.npc_queue[site_id].append( (npc_id, gl.npcs[site_id][npc_id]['list'], bots_list[npc_id])) for f in change_list: send_notification(f, 'update_npc_queue') gl.lock_free('npc')