from entities import player as _player from entities import event_picker as _events from entities import gamemap as _map from entities.items import weapons as _weapons class BrSimArena(): # players = [{'name': name, 'inventory': default_inventory, other_stats}] # weapons = [{WEAPON.KNIFE: quantity}, etc...] # this is the whole quantity of the items available on the world def __init__(self, players= None, weapons= None): self.day= 1 self.players= [] self.weapons= [] self.eventClass = _events.ArenaEventPicker(self.players) self.init_players(players) self.init_weapons(weapons) self.Map= _map.BrSimMap(self.players, self.weapons) def init_players(self, players): if not players: return for player in players: self.add_player(player['name'], player.get('inventory')) def init_weapons(self, weapons): if not weapons: return for weapon in weapons: for wtype, quantity in weapon.items(): for i in range(quantity): self.weapons.append(_weapons.BrSimWeapon(wtype)) def next_day(self): self.day+= 1 print(f'Giorno: {self.day}') alive_players_str= ', '.join([p.get_name() for p in self.get_alive_players()]) print(f'Giocatori vivi: {alive_players_str}') death_players= self.get_death_players() if (death_players): death_players_str= ', '.join([p.get_name() for p in death_players]) print(f'Giocatori morti: {death_players_str}') def get_alive_players(self): res= [] for p in self.players: if not p.is_alive(): continue res.append(p) return res def get_death_players(self): res= [] for p in self.players: if p.is_alive(): continue res.append(p) return res def sort_players_by_kills_and_health(self, players): def player_sort_key(player): kills= player.get_kills() health= player.get_health() #Negative values to sort in decr mode return (-kills, -health) return sorted(players, key=player_sort_key) def get_ranking(self): medals = ['🥇', '🥈', '🥉'] leaderboard = [] leaderboard.append('🏆 *Classifica attuale:* \n') alive_players= self.get_alive_players(); alive_sorted= self.sort_players_by_kills_and_health(alive_players) death_players= self.get_death_players() death_sorted= self.sort_players_by_kills_and_health(death_players) # Alive Players alive_players= self.get_alive_players(); alive_sorted= self.sort_players_by_kills_and_health(alive_players) for index, player in enumerate(alive_sorted): name = player.get_name() kills = player.get_kills() health = '♥️' * player.get_health() if index < 3: position = medals[index] else: position = f"{index + 1}." line = f"{position} {name} - {kills} uccision{'i' if kills != 1 else 'e'}, {health}" leaderboard.append(line) # Death players: death_players= self.get_death_players() death_sorted= self.sort_players_by_kills_and_health(death_players) if death_sorted: leaderboard.append("\n-- GIOCATORI ELIMINATI --") for player in death_sorted: name = player.get_name() kills = player.get_kills() health = player.get_health() line = f"💀 {name} - {kills} uccision{'i' if kills != 1 else 'e'}" leaderboard.append(line) return '\n'.join(leaderboard) def do_random_event(self): #XXX random player does random action according to his inventory health, wounds, available weapons on the world, etc... pass def supporter_donation(self): #XXX supporter donate a random item or weapon to a random player #TODO maybe in future a player can have charism stats that can influence the chance to get a donation pass def add_player(self, name, inventory= None): player= _player.BrSimPlayer(name, inventory) self.players.append(player) self.Map.add_player_to_map(player) def add_weapon(self, weapon_type): weapon= _weapons.BrSimWeapon(weapon_type) self.weapons.append(weapon) self.Map.add_item_to_map(item) def get_players(self): return self.players def get_weapons(self): res= [] for w in self.weapons: #XXX implement me res.append(w) return res def get_map(self): return self.Map