def make_menu(self): menu = Menu(self.map.title) if len(self.registered_players) < self.map.nb_players_max: for p in self.available_players: menu.append(mp.INVITE + [p], (self.server.write_line, "invite %s" % p)) menu.append(mp.INVITE + mp.QUIET_COMPUTER, (self.server.write_line, "invite_easy")) menu.append(mp.INVITE + mp.AGGRESSIVE_COMPUTER, (self.server.write_line, "invite_aggressive")) menu.append(mp.INVITE + mp.AGGRESSIVE_COMPUTER + nb2msg(2), (self.server.write_line, "invite_ai2")) if len(self.registered_players) >= self.map.nb_players_min: menu.append(mp.START, (self.server.write_line, "start")) for pn, (login, pa, pr) in enumerate(self.registered_players): pa = int(pa) for a in range(1, len(self.registered_players) + 1): if a != pa: menu.append( mp.MOVE + name(login) + mp.TO_ALLIANCE + nb2msg(a), (self.server.write_line, "move_to_alliance %s %s" % (pn, a))) if login == self.server.login or login.startswith("ai_"): self._add_faction_menu(menu, pn, login, pr) menu.append(mp.CANCEL + mp.CANCEL_THIS_GAME, (self.server.write_line, "cancel_game")) return menu
def choose_server_ip_in_a_list(self): servers_list = None try: f = urllib.urlopen(SERVERS_LIST_URL) if f.read(len(SERVERS_LIST_HEADER)) == SERVERS_LIST_HEADER: servers_list = f.readlines() except: pass if servers_list is None: voice.alert([1029]) # hostile sound warning("couldn't get the servers list from the metaserver" " => using the default servers list") servers_list = DEFAULT_SERVERS nb = 0 menu = Menu() for s in servers_list: try: ip, version, login, port = s.split()[1:] # ignore the first parameter (time) except: warning("line not recognized from the metaserver: %s", s) continue nb += 1 if version == VERSION: menu.append([login, 4073, login], (connect_and_play, ip, port)) menu.title = nb2msg(len(menu.choices)) + [4078] + nb2msg(nb) + [4079] menu.append([4075, 4076], None) menu.run()
def status(self): assert not self.started msg = nb2msg(len(self.players)) + [4242] + nb2msg(self.scenario.nb_players_max) if len(self.players) >= self.scenario.nb_players_min: msg += [4063] else: msg += [4244] + nb2msg(self.scenario.nb_players_min) msg += [9999] + insert_silences([p.login for p in self.players]) return msg
def _game_status(self, players): msg = nb2msg(len(players)) + mp.PLAYERS_ON + nb2msg( self.map.nb_players_max) if len(players) >= self.map.nb_players_min: msg += mp.THE_GAME_WILL_START_WHEN_ORGANIZER_IS_READY else: msg += mp.NOT_ENOUGH_PLAYERS + nb2msg(self.map.nb_players_min) msg += mp.PERIOD + self._players_names(players) return msg
def status(self): assert not self.started msg = nb2msg(len(self.players)) + [4242] + nb2msg( self.scenario.nb_players_max) if len(self.players) >= self.scenario.nb_players_min: msg += [4063] else: msg += [4244] + nb2msg(self.scenario.nb_players_min) msg += [9999] + insert_silences([p.login for p in self.players]) return msg
def _create_game(self, args): n, title = args Menu([4055] + title, [([4103], (self.server.write_line, "create %s 0.5" % n)), ([4104], (self.server.write_line, "create %s 1.0" % n)), ([4105] + nb2msg(2), (self.server.write_line, "create %s 2.0" % n)), ([4105] + nb2msg(4), (self.server.write_line, "create %s 4.0" % n)), ([4048], None), ], default_choice_index=1).run() # XXX not a ServerMenu
def _create_game(self, args): n, title, is_public = args Menu(title, [([4103], (self.server.write_line, "create %s 0.5 %s" % (n, is_public))), ([4104], (self.server.write_line, "create %s 1.0 %s" % (n, is_public))), ([4105] + nb2msg(2), (self.server.write_line, "create %s 2.0 %s" % (n, is_public))), ([4105] + nb2msg(4), (self.server.write_line, "create %s 4.0 %s" % (n, is_public))), ([4048], None), ], default_choice_index=1).run() # XXX not a ServerMenu
def title(self): if isinstance(self.model, BuildingSite): title = compute_title(self.type.type_name) + compute_title(BuildingSite.type_name) else: title = self.short_title[:] if self.player: if self.player == self.interface.player: title += nb2msg(self.number) elif self.player in self.interface.player.allied: title += [4286] + nb2msg(self.player.number) + [self.player.client.login] # "allied 2" elif hasattr(self.player, "number") and self.player.number: title += [88] + nb2msg(self.player.number) + [self.player.client.login] # "ennemy 2" else: # "npc_ai" title += [88] # enemy return title
def _get_speed_submenu(self, args): n, title, is_public = args def create_with_speed(speed): s = "create %s %s %s" % (n, speed, is_public) return (self.server.write_line, s) Menu(title, [ (mp.SET_SPEED_TO_SLOW, create_with_speed("0.5")), (mp.SET_SPEED_TO_NORMAL, create_with_speed("1.0")), (mp.SET_SPEED_TO_FAST + nb2msg(2), create_with_speed("2.0")), (mp.SET_SPEED_TO_FAST + nb2msg(4), create_with_speed("4.0")), (mp.CANCEL, None), ], default_choice_index=1).run()
def game_short_status(map_title, clients, minutes): clients = clients.split(",") players = insert_silences(sum([name(c) for c in clients], [])) msg = mp.MULTIPLAYER + [map_title] + mp.PERIOD \ + players + mp.PERIOD \ + nb2msg(minutes) + mp.MINUTES return msg
def choose_server_ip_in_a_list(): servers = servers_list(voice) total = 0 compatible = 0 menu = Menu() for s in servers: try: _, ip, version, login, port = s.split() except ValueError: warning("line not recognized from the metaserver: %s", s) else: total += 1 if version == VERSION: compatible += 1 menu.append([login], (connect_and_play, ip, port), mp.SERVER_HOSTED_BY + [login]) menu.title = nb2msg(compatible) + mp.SERVERS_ON + nb2msg(total) + mp.ARE_COMPATIBLE menu.append(mp.CANCEL2, None, mp.GO_BACK_TO_PREVIOUS_MENU) menu.run()
def requirements_msg(self): and_index = 0 msg = [] for t in self.missing_requirements: and_index = len(msg) msg += style.get(t, "title") if not self.missing_requirements: for i, c in enumerate(self.cost): if c: and_index = len(msg) msg += nb2msg(c / PRECISION) + style.get("parameters", "resource_%s_title" % i) if self.food_cost: and_index = len(msg) msg += nb2msg(self.food_cost, gender="f") + style.get("parameters", "food_title") # add "and" if there are at least 2 requirements if and_index > 0: msg[and_index:and_index] = style.get("parameters", "and") if msg: msg[0:0] = style.get("parameters", "requires") return msg
def choose_server_ip_in_a_list(): servers = servers_list(voice) total = 0 compatible = 0 menu = Menu() for s in servers: try: _, ip, version, login, port = s.split() except ValueError: warning("line not recognized from the metaserver: %s", s) else: total += 1 if version == VERSION: compatible += 1 menu.append([login], (connect_and_play, ip, port), mp.SERVER_HOSTED_BY + [login]) menu.title = nb2msg(compatible) + mp.SERVERS_ON + nb2msg( total) + mp.ARE_COMPATIBLE menu.append(mp.CANCEL2, None, mp.GO_BACK_TO_PREVIOUS_MENU) menu.run()
def string_to_msg(s, spell=True): if not spell: return [s] l = [] for c in s: if c == ".": l.extend([5026]) elif c in "0123456789": l.extend(nb2msg(c)) else: l.extend(c) return l
def _build_players_menu(self): menu = Menu() if len(self._players) < self._map.nb_players_max: menu.append(mp.INVITE + mp.QUIET_COMPUTER, (self._add_ai, "easy")) menu.append(mp.INVITE + mp.AGGRESSIVE_COMPUTER, (self._add_ai, "aggressive")) menu.append(mp.INVITE + mp.AGGRESSIVE_COMPUTER + nb2msg(2), (self._add_ai, "ai2")) if len(self._players) >= self._map.nb_players_min: menu.append(mp.START, self._run_game) if len(self._map.factions) > 1: self._add_faction_menus(menu) menu.append(mp.CANCEL, CLOSE_MENU, mp.CANCEL_THIS_GAME) return menu
def title(self): if isinstance(self.model, BuildingSite): title = compute_title(self.type.type_name) + compute_title(BuildingSite.type_name) else: title = self.short_title[:] if self.player: if self.player == self.interface.player: title += nb2msg(self.number) else: if self.player in self.interface.player.allied: title += mp.ALLY else: title += mp.ENEMY title += mp.COMMA + self.player.name + mp.COMMA return title
def run(self): if self.mods is not None: res.set_mods(self.mods) try: self.load_resources() menu = Menu(self.title, []) if len(self._available_chapters()) > 1: ch = self._available_chapters()[-1] menu.append(mp.CONTINUE + ch.title, ch) for ch in self._available_chapters(): prefix = nb2msg(ch.id) if ch.id > 0 else [] menu.append(prefix + ch.title, ch) menu.append(mp.BACK, None) menu.run() finally: self.unload_resources()
def title_msg(self, nb=1): if self.is_deferred: result = style.get("messages", "production_deferred") else: result = [] result += self.title if self.type is not None: t = style.get(self.type.type_name, "title") if nb != 1: t = nb2msg(nb) + t result = substitute_args(result, [t]) if self.target is not None: if self.keyword == "build_phase_two": result += style.get(self.target.type.type_name, "title") else: result += EntityView(self.interface, self.target).title return result
def run(self): if self.mods is not None: res.set_mods(self.mods) try: self.load_resources() menu = Menu(self.title, []) if len(self._available_chapters()) > 1: ch = self._available_chapters()[-1] menu.append([4011] + ch.title, ch) # "continue" for ch in self._available_chapters(): prefix = nb2msg(ch.id) if ch.id > 0 else [] menu.append(prefix + ch.title, ch) # menu.append([4113], "restore") menu.append([4118], None) # "cancel" menu.run() finally: self.unload_resources()
def _load(self): s = open(self.path, "U").read() # "universal newlines" # header m = re.search("(?m)^title[ \t]+([0-9 ]+)$", s) if m: l = m.group(1).split(" ") l = [int(x) for x in l] else: l = nb2msg(self.id) self.title = l # content m = re.search("(?m)^sequence[ \t]+([0-9 ]+)$", s) if m: l = m.group(1).split(" ") else: l = [] self.sequence = l
def __init__(self, world, col, row, width): self.col = col self.row = row self.name = "%s%s" % (string.ascii_lowercase[col], row + 1) self.id = world.get_next_id() self.world = world world.squares.append(self) world.objects[self.id] = self self.place = world self.title = [5000 + col] + nb2msg(row + 1) self.objects = [] self.exits = [] self.xmin = col * width self.ymin = row * width self.xmax = self.xmin + width self.ymax = self.ymin + width self.x = (self.xmax + self.xmin) / 2 self.y = (self.ymax + self.ymin) / 2
def description(self): d = [] try: if hasattr(self, "qty") and self.qty: d += [134] + nb2msg(self.qty) + style.get("parameters", "resource_%s_title" % self.resource_type) if hasattr(self, "hp"): d += self.hp_status if hasattr(self, "mana"): d += self.mana_status if hasattr(self, "upgrades"): d += self.upgrades_status if hasattr(self, "is_invisible_or_cloaked") and \ self.is_invisible_or_cloaked(): d += [9998, 4289] if getattr(self, "is_a_detector", 0): d += [9998, 4290] if getattr(self, "is_a_cloaker", 0): d += [9998, 4291] except: pass # a warning is given by style.get() return d
def description(self): d = [] try: if hasattr(self, "qty") and self.qty: d += mp.CONTAINS + nb2msg(self.qty) \ + style.get("parameters", "resource_%s_title" % self.resource_type) if hasattr(self, "hp"): d += self.hp_status if hasattr(self, "mana"): d += self.mana_status if hasattr(self, "upgrades"): d += self.upgrades_status if getattr(self, "is_invisible", 0) or getattr(self, "is_cloaked", 0): d += mp.COMMA + mp.INVISIBLE if getattr(self, "is_a_detector", 0): d += mp.COMMA + mp.DETECTOR if getattr(self, "is_a_cloaker", 0): d += mp.COMMA + mp.CLOAKER except: pass # a warning is given by style.get() return d
def make_menu(self): menu = Menu(self.map.title) if len(self.registered_players) < self.map.nb_players_max: for p in self.available_players: menu.append([4058, p], (self.server.write_line, "invite %s" % p)) menu.append([4058, 4258], (self.server.write_line, "invite_easy")) menu.append([4058, 4257], (self.server.write_line, "invite_aggressive")) if len(self.registered_players) >= self.map.nb_players_min: menu.append([4059], (self.server.write_line, "start")) for pn, (p, pa, pr) in enumerate(self.registered_players): pa = int(pa) for a in range(1, len(self.registered_players) + 1): if a != pa: menu.append([4284, p, 4285] + nb2msg(a), (self.server.write_line, "move_to_alliance %s %s" % (pn, a))) if p in (self.server.login, "ai"): self._add_faction_menu(menu, pn, p, pr) menu.append([4048, 4060], (self.server.write_line, "cancel_game")) return menu
def requirements_msg(self): and_index = 0 msg = [] for t in self.missing_requirements: and_index = len(msg) msg += style.get(t, "title") if not self.missing_requirements: for i, c in enumerate(self.cost): if c: and_index = len(msg) msg += nb2msg(c / PRECISION) + style.get( "parameters", "resource_%s_title" % i) if self.food_cost: and_index = len(msg) msg += nb2msg_f(self.food_cost) + style.get( "parameters", "food_title") # add "and" if there are at least 2 requirements if and_index > 0: msg[and_index:and_index] = style.get("parameters", "and") if msg: msg[0:0] = style.get("parameters", "requires") return msg
def nb2msg_f(n): # the TTS cannot guess how to say "1 ration" ("une ration") # (note: many other cases are not correctly done) if n == 1: return mp.ONE_F return nb2msg(n)
def modify_volume(incr): """increase or decrease the main volume, and say it""" set_volume(min(1, max(0, get_volume() + .1 * incr))) sound_stop() voice.item(nb2msg(round(get_volume() * 100)) + mp.PERCENT_VOLUME)
def srv_alliance(self, args): player_login, alliance = args voice.info(mp.MOVE + name(player_login) + mp.TO_ALLIANCE + nb2msg(alliance))
def _get_score_msgs(self): if self.has_victory: victory_or_defeat = mp.VICTORY else: victory_or_defeat = mp.DEFEAT t = self.world.time / 1000 m = int(t / 60) s = int(t - m * 60) msgs = [] msgs.append(victory_or_defeat + mp.AT + nb2msg(m) + mp.MINUTES + nb2msg(s) + mp.SECONDS) msgs.append(nb2msg(self.nb_units_produced) + mp.UNITS + mp.PRODUCED_F + mp.COMMA + nb2msg(self.nb_units_lost) + mp.LOST + mp.COMMA + nb2msg(self.nb_units_killed) + mp.NEUTRALIZED) msgs.append(nb2msg(self.nb_buildings_produced) + mp.BUILDINGS + mp.PRODUCED_M + mp.COMMA + nb2msg(self.nb_buildings_lost) + mp.LOST + mp.COMMA + nb2msg(self.nb_buildings_killed) + mp.NEUTRALIZED) res_msg = [] for i, _ in enumerate(self.resources): res_msg += nb2msg(self.gathered_resources[i] / PRECISION) \ + style.get("parameters", "resource_%s_title" % i) \ + mp.GATHERED + mp.COMMA \ + nb2msg(self.consumed_resources()[i] / PRECISION) \ + mp.CONSUMED + mp.PERIOD msgs.append(res_msg[:-1]) msgs.append(mp.SCORE + nb2msg(self._get_score()) + mp.HISTORY_EXPLANATION) return msgs
def _countdown(self): voice.important(mp.THE_GAME_WILL_START) for n in [5, 4, 3, 2, 1, 0]: voice.item(nb2msg(n)) time.sleep(1) pygame.event.clear(KEYDOWN)
def mana_status(self): if self.mana_max > 0: return nb2msg(self.mana) + mp.MANA_POINTS_ON + nb2msg(self.mana_max) else: return []
def get_status_msg(self): return [4018] + self.scenario.title + [9999]\ + insert_silences([p.login for p in self.human_players]) + [9999]\ + nb2msg(self.get_nb_minutes()) + [65]
def move_to_alliance(self, player_index, alliance): player = self.players[int(player_index)] player.alliance = int(alliance) self.broadcast([4284, player.login, 4285] + nb2msg(player.alliance))
def _get_score_msgs(self): if self.has_victory: victory_or_defeat = [149] else: victory_or_defeat = [150] t = self.world.time / 1000 m = int(t / 60) s = int(t - m * 60) msgs = [] msgs.append(victory_or_defeat + [107] + nb2msg(m) + [65] + nb2msg(s) + [66]) # in ... minutes and ... seconds msgs.append(nb2msg(self.nb_units_produced) + [130, 4023, 9998] + nb2msg(self.nb_units_lost) + [146, 9998] + nb2msg(self.nb_units_killed) + [145]) msgs.append(nb2msg(self.nb_buildings_produced) + [4025, 4022, 9998] + nb2msg(self.nb_buildings_lost) + [146, 9998] + nb2msg(self.nb_buildings_killed) + [145]) res_msg = [] for i, _ in enumerate(self.resources): res_msg += nb2msg(self.gathered_resources[i] / PRECISION) \ + style.get("parameters", "resource_%s_title" % i) \ + [4256, 9998] \ + nb2msg(self.consumed_resources()[i] / PRECISION) \ + [4024, 9999] msgs.append(res_msg[:-1]) msgs.append([4026] + nb2msg(self._get_score()) + [2008]) return msgs
def mana_status(self): if self.mana_max > 0: return nb2msg(self.mana) + [4247] + nb2msg(self.mana_max) else: return []
def _get_score_msgs(self): if self.has_victory: victory_or_defeat = mp.VICTORY else: victory_or_defeat = mp.DEFEAT t = self.world.time / 1000 m = int(t / 60) s = int(t - m * 60) msgs = [] msgs.append(victory_or_defeat + mp.AT + nb2msg(m) + mp.MINUTES + nb2msg(s) + mp.SECONDS) msgs.append( nb2msg(self.nb_units_produced) + mp.UNITS + mp.PRODUCED_F + mp.COMMA + nb2msg(self.nb_units_lost) + mp.LOST + mp.COMMA + nb2msg(self.nb_units_killed) + mp.NEUTRALIZED) msgs.append( nb2msg(self.nb_buildings_produced) + mp.BUILDINGS + mp.PRODUCED_M + mp.COMMA + nb2msg(self.nb_buildings_lost) + mp.LOST + mp.COMMA + nb2msg(self.nb_buildings_killed) + mp.NEUTRALIZED) res_msg = [] for i, _ in enumerate(self.resources): res_msg += nb2msg(self.gathered_resources[i] / PRECISION) \ + style.get("parameters", "resource_%s_title" % i) \ + mp.GATHERED + mp.COMMA \ + nb2msg(self.consumed_resources()[i] / PRECISION) \ + mp.CONSUMED + mp.PERIOD msgs.append(res_msg[:-1]) msgs.append(mp.SCORE + nb2msg(self._get_score()) + mp.HISTORY_EXPLANATION) return msgs
def _countdown(self): voice.important([4062]) # "the game starts in 5 seconds" for n in [5, 4, 3, 2, 1, 0]: voice.item(nb2msg(n)) time.sleep(1) pygame.event.clear(KEYDOWN)
def hp_status(self): return nb2msg(self.hp) + mp.HITPOINTS_ON + nb2msg(self.hp_max)
def hp_status(self): return nb2msg(self.hp) + [39] + nb2msg(self.hp_max)