forked from Cryz/battle_royale_sim
190 lines
5.7 KiB
Python
190 lines
5.7 KiB
Python
import random as _random
|
|
import uuid as _uuid
|
|
|
|
class BrSimPlayer():
|
|
|
|
def __init__(self, name, inventory= None):
|
|
self.id= str(_uuid.uuid4())
|
|
self.name= name
|
|
self.stats= ''
|
|
self.health= _random.randint(1,3)
|
|
self.inventory= inventory or []
|
|
self.damage= _random.randint(1,2) # this is the punch damage amount
|
|
self.max_weight= 5 # this is the max inventory weight
|
|
self.agility= _random.randint(1,3) # chance to avoid an hit
|
|
self.kills= 0 # track the number of kills
|
|
self.accused_damage= 0
|
|
self.survived_days= 0 # track the number of the survived days
|
|
self.dodges= 0
|
|
self.equipped_weapon= None
|
|
self.gender= _random.sample(['m', 'f', '-'], 1)[0] # for now get a random gender
|
|
self.reputation= 50 #Like RDR2 the player can be evil(0) or good(100). This should influence the sponsors and internal alliance
|
|
self.coord_x= 0
|
|
self.coord_y= 0
|
|
|
|
### control methods
|
|
|
|
def get_player_coordinates(self):
|
|
return self.coord_x, self.coord_y
|
|
|
|
def set_player_coordinates(self, x, y):
|
|
self.coord_x= x
|
|
self.coord_y= y
|
|
|
|
def get_name_and_stats(self):
|
|
health= '♥️' * self.health or '☠️'
|
|
strength= '⚔️' * self.damage
|
|
agility= '🚀' * self.agility
|
|
if self.player_gender_is_male(): gender= '♂'
|
|
elif self.player_gender_is_female(): gender= '♀'
|
|
else: gender= '⚩'
|
|
name= f'{self.name} {gender} {health} {strength} {agility}'
|
|
return name
|
|
|
|
def get_id(self):
|
|
return self.id
|
|
|
|
def get_name(self):
|
|
return self.name
|
|
|
|
def get_gender(self):
|
|
return self.gender
|
|
|
|
def player_gender_is_male(self):
|
|
return self.gender == 'm'
|
|
|
|
def player_gender_is_female(self):
|
|
return self.gender == 'f'
|
|
|
|
def player_gender_is_not_binary(self):
|
|
return self.gender == '-'
|
|
|
|
def get_inventory(self):
|
|
return self.inventory
|
|
|
|
def get_inventory_weight(self):
|
|
weight= 0
|
|
for item in self.get_inventory():
|
|
weight+= item.get_weight()
|
|
return weight
|
|
|
|
def get_dodges(self):
|
|
return self.dodges
|
|
|
|
def get_max_weight(self):
|
|
return self.max_weight
|
|
|
|
def get_health(self):
|
|
return self.health
|
|
|
|
def get_equipped_weapon(self):
|
|
return self.equipped_weapon
|
|
|
|
def get_damage(self):
|
|
weapon= self.get_equipped_weapon()
|
|
if not weapon: return self.damage
|
|
return weapon.get_damage()
|
|
|
|
def get_agility(self):
|
|
return self.agility
|
|
|
|
def get_reputation(self):
|
|
return self.reputation
|
|
|
|
def get_data(self):
|
|
return {
|
|
'id': self.get_id(),
|
|
'name': self.get_name(),
|
|
'name_stats': self.get_name_and_stats(),
|
|
'gender': self.get_gender(),
|
|
'inventory': self.get_inventory(),
|
|
'inventory_weight': self.get_inventory_weight(),
|
|
'health': self.get_health(),
|
|
'damage': self.get_damage(),
|
|
'agility': self.get_agility(),
|
|
'reputation': self.get_reputation(),
|
|
}
|
|
|
|
def is_alive(self):
|
|
return self.health > 0
|
|
|
|
def get_kills(self):
|
|
return self.kills
|
|
|
|
### player actions
|
|
|
|
def _equip_weapon(self):
|
|
if not self.inventory: return
|
|
|
|
available_weapons= []
|
|
for item in self.get_inventory():
|
|
# XXX
|
|
# i don't know yet if this is ok,
|
|
# we'll see it when weapon and items are defined
|
|
# maybe we need item.is_weapon() method
|
|
if not item.damage: continue
|
|
available_weapons.append(item)
|
|
self.equipped_weapon= random.sample(available_weapons, 1)[0]
|
|
|
|
def dodge(self):
|
|
# maybe depend on the attack, if it is a gun shot it's quite impossible to dodge
|
|
rnd= _random.randint(0, 10)
|
|
if rnd < self.agility:
|
|
self.dodges+= 1
|
|
return True
|
|
return False
|
|
|
|
def accuses_damage(self, damage):
|
|
self.health-= damage
|
|
self.accused_damage+= damage
|
|
if self.health > 0: return self.get_health()
|
|
|
|
self.health= 0
|
|
if self.player_gender_is_male():
|
|
print(f'[{self.get_name_and_stats()}]: Guarino, perdonami se sono morto x.x')
|
|
elif self.player_gender_is_female():
|
|
print(f'[{self.get_name_and_stats()}]: Guarino, perdonami se sono morta x.x')
|
|
else:
|
|
print(f'[{self.get_name_and_stats()}]: Guarino, perdonami se sono mort* x.x')
|
|
return damage
|
|
|
|
def attack(self, target):
|
|
self._equip_weapon()
|
|
if target.dodge():
|
|
if target.player_gender_is_male():
|
|
msg= f'Ehhhh voleviiii!!! sei lentoo! {target.get_name_and_stats()} schiva il colpo di {self.get_name_and_stats()}'
|
|
elif target.player_gender_is_female():
|
|
msg= f'Ehhhh voleviiii!!! sei lentaa! {target.get_name_and_stats()} schiva il colpo di {self.get_name_and_stats()}'
|
|
else:
|
|
msg= f'Ehhhh voleviiii!!! sei lent##! {target.get_name_and_stats()} schiva il colpo di {self.get_name_and_stats()}'
|
|
return 0, msg
|
|
target.accuses_damage(self.damage)
|
|
|
|
msg= f'{self.get_name_and_stats()} Colpisce {target.get_name_and_stats()}'
|
|
weapon= self.get_equipped_weapon()
|
|
if weapon: msg+= f' con un {weapon.get_name}'
|
|
else: msg+= f' con un pugno'
|
|
self.kills+= 1
|
|
return self.damage, msg
|
|
|
|
def get_item(self, item):
|
|
if self.get_inventory_weight() + item.get_weight() >= self.get_max_weight():
|
|
if self.player_gender_is_male():
|
|
print(f'Sono sovraccarico, {self.get_name_and_stats} non puo\' prendere questo oggetto')
|
|
elif self.player_gender_is_female():
|
|
print(f'Sono sovraccarica, {self.get_name_and_stats} non puo\' prendere questo oggetto')
|
|
else:
|
|
print(f'Sono sovraccaric#, {self.get_name_and_stats} non puo\' prendere questo oggetto')
|
|
return False
|
|
self.inventory.append(item)
|
|
|
|
def escape(self):
|
|
# TODO It can run away from the fighting
|
|
return
|
|
|
|
def heal(self):
|
|
# TODO heal system
|
|
# if you have a wound and you have a medikit item,
|
|
# you can heal your wound or sickness
|
|
return
|