Files
battle_royale_sim/entities/arena.py
2025-08-02 10:04:30 +02:00

135 lines
4.3 KiB
Python

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
from utils import logs as _logs
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
_logs.log_debug(f'Giorno: {self.day}')
alive_players_str= ', '.join([p.get_name() for p in self.get_alive_players()])
_logs.log_debug(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])
_logs.log_debug(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