def remove_player_callback(self, event): if event['player'] is not None and self._game.game_started: player = get_player_colour(event['player']) context.trust_map_player_remove(player) players_in_frame = context.last_seen if player in players_in_frame: context.last_seen_remove(player)
def player_movement_callback(self, event): me = self._game.me if me is None or self._game.meeting_reason is not False: return me_id = me.playerId pl_id = event["player"].playerId if me_id == pl_id: me_x, me_y = self._game.get_player_loc(me_id) # print(me_x, me_y) player = self._game.get_player_from_id(pl_id) if player is None: return player_colour = get_player_colour(player) in_frame = self._in_frame(me_id, pl_id) players_in_frame = context.last_seen if not player.alive: if player_colour in players_in_frame: context.last_seen_remove(player_colour) return if me_id == pl_id: players = self._game.get_players() if players is None: return new_pl = \ [get_player_colour(p) for p in players if p.playerId != me_id and p.color is not False and p.alive and self._in_frame(me_id, p.playerId)] for p in players_in_frame.copy(): if p not in new_pl: context.last_seen_remove(p) for p in new_pl.copy(): if p in players_in_frame: new_pl.remove(p) for p in new_pl: context.last_seen_append(p) elif in_frame and player_colour not in players_in_frame: context.last_seen_append(player_colour) elif not in_frame and player_colour in players_in_frame: context.last_seen_remove(player_colour) else: return
def interpret(self) -> Optional[str]: if not self.game_state.game_started: return None me = self.game_state.me if not me: print( 'Player info not loaded - please leave and rejoin the lobby.') return None if self.game_state.meeting_reason is False or self.player.playerId == me.playerId: return None player_name = self.player.name.decode("utf-8") player_colour: str = UNKNOWN if self.player.color is not False: player_colour = get_player_colour(self.player) if me.alive and not self.player.alive: print(player_name, f'({player_colour}): [DEAD CHAT HIDDEN]') return None players = { get_player_colour(p): p for p in self.game_state.get_players(include_me=True) } aliases = { # Players "dark green": "green", "light green": "lime", "dark blue": "blue", "light blue": "cyan", "purp": "purple", "orang": "orange", "yallow": "yellow", # Locations "cafeteria": "caf", "coms": "comms", "navigation": "nav", "reac": "reactor", "medbay": "med bay", "elec": "electrical", "elect": "electrical", # Misspellings "imposter": "impostor", } for k, v in aliases.items(): self._message_lower = re.sub(rf'\b{k}\b', v, self._message_lower) # Check for locations curr_map = self.game_state.map started_by = self.game_state.get_player_colour_from_id(self.game_state.meeting_started_by.playerId) \ if self.game_state.meeting_started_by else None if curr_map is not None and rF.BODY_NOT_LOCATED in self.game_state.get_response_flags() \ and started_by == player_colour: for loc in params.location[ enums.AUMap.COMMON] + params.location[curr_map]: if self._find(rf'\b{loc}\b'): context.player_loc['body'] = loc context.response_flags_remove(rF.BODY_NOT_LOCATED) print("Location identified:", loc) # Check for names target_colours = [] for colour in [p for p in players if p != player_colour]: p = players[colour] if p.name is False or p.color is False: continue name = p.name.decode("utf-8").strip() if name.lower() in ["i", "he", "she", "ok", "impostor", "imposter"] \ or len(name) == 0: # pronoun and unhelpful names name = None if self._find(rf'\b{colour}\b') \ or (name is not None and self._find(rf'\b{name.lower()}\b')): target_colours.append(colour) if len(target_colours) == 0: # Determine target implicitly if self._find(r"\b(self( report)?)\b"): target_colours.append(started_by) target_is_me = self.game_state.me_colour in target_colours verb = offset = None flags = [] if len(target_colours) > 0: verb, offset = "mentioned", -0.5 for target_colour in target_colours: if self._find(r"\b(sus|vent(ed)?|faked?|kill(ed)?|body|self report(ed)?|imp(ostor)?)\b") \ or self._find(rf"\b(vote|it'?s?) {target_colour}\b") \ or self._message_lower == target_colour: verb, offset = "sussed", -1 break elif self._find(r"\b(safe|good|clear(ed)?)\b") \ or self._find(rf"\b(not|with|me and) {target_colour}\b") \ or self._find(rf"{target_colour} (and i|((had|did|has|do) )?(trash|chute|scan(ned)?|med))\b"): verb, offset = "vouched for", 1 break if verb == "sussed" and target_is_me: if self._find(r"\b(vent(ed)?)\b"): flags.append(rF.ACCUSED_VENT) if verb: if self.player.alive and player_colour != UNKNOWN and len( context.trust_map) != 0: for target_colour in target_colours: context.trust_map_score_offset(player_colour, target_colour, offset) print('>>', player_colour, verb, ', '.join(target_colours), '<<') if consts.debug_chat and len(flags) > 0: print('Adding flags:', flags) for f in flags: context.response_flags_append(f) print(player_name, f'({player_colour}):', self.message) return self.message
def impostor_list(self) -> Optional[List[str]]: if self.is_impostor and self._game.players: # Only show if I'm impostor (no cheating!) return [ get_player_colour(p) for p in self._game.players.values() if p.infected and p.playerId != self.me.playerId ]
def me_colour(self) -> Optional[str]: me = self.me return get_player_colour(me) if me else None
def get_player_colour_from_id(self, player_id: int) -> Optional[str]: if player_id not in self._game.playerIdMap: return None return get_player_colour(self._game.playerIdMap[player_id])
def get_players_colour(self, include_me=False) -> Optional[List[str]]: return [get_player_colour(p) for p in self.get_players(include_me)] \ if self.get_players(include_me) is not None else None