Пример #1
0
 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)
Пример #2
0
 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
Пример #3
0
    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
Пример #4
0
 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
         ]
Пример #5
0
 def me_colour(self) -> Optional[str]:
     me = self.me
     return get_player_colour(me) if me else None
Пример #6
0
 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])
Пример #7
0
 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