forked from Cryz/battle_royale_sim
128 lines
4.0 KiB
Python
128 lines
4.0 KiB
Python
from entities import player as _player
|
|
from entities import weapons as _weapons
|
|
from entities import weapon_syms as _wsyms
|
|
from entities import event_picker as _events
|
|
|
|
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)
|
|
|
|
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)
|
|
|
|
def add_weapon(self, weapon_type):
|
|
weapon= _weapons.BrSimWeapon(weapon_type)
|
|
self.weapons.append(weapon)
|
|
|
|
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
|