diff --git a/assets/events.py b/assets/events.py new file mode 100644 index 0000000..1997596 --- /dev/null +++ b/assets/events.py @@ -0,0 +1,14 @@ +EVENTS = [ + { + 'id' : 'ATTACK', + 'text' : '{Player1} ha attacato {player2}', + 'resolve_text' : '{Player1} ha causato {effetto_collaterale}', + 'fail_text' : '{Player1} ha fallito, {player2} รจ indenne', + 'success_percentage' : 80, + 'fail_percentage' : 19, + 'extreme_fail_percentage' : 1, + 'required_items' : [], + 'weight' : 1, + 'number_of_players' : 2, + }, +] diff --git a/debug.py b/debug.py new file mode 100644 index 0000000..c076cd8 --- /dev/null +++ b/debug.py @@ -0,0 +1,51 @@ +import time as _time +import random as _rand +import main as _main +from entities import weapon_syms as _wsyms + +def init_debug(): + players= [ + { + 'name': 'Elara', + }, + { + 'name': 'Kaelen', + }, + { + 'name': 'Zephyr', + }, + { + 'name': 'Lyra', + }, + { + 'name': 'Orion', + }, + { + 'name': 'Seraphina', + }, + ] + #w= _wsyms.KNIFE + ##weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] + #weapons= [{w: 1}] + weapons= [] + + Arena= _main.init_arena(players, weapons) + print(f'Players: {Arena.get_players()}') + print(f'Weapons: {Arena.get_weapons()}') + while (len(Arena.get_alive_players()) > 1): + alive_players= Arena.get_alive_players() + + p_one, p_two= _rand.sample(alive_players, 2) + p_one.attack(p_two) + + #Start a day + #At 23:59: + Arena.next_day() + _time.sleep(0.3) + #End of day + + last_player= Arena.get_alive_players()[0] + print(f'{last_player.get_name()} sopravvive e vince dopo {Arena.day} lunghi Giorni, conquistando l\'amore eterno di Guarino') + +if __name__ == '__main__': + init_debug() diff --git a/entities/arena.py b/entities/arena.py index 97466d9..e180835 100644 --- a/entities/arena.py +++ b/entities/arena.py @@ -1,6 +1,7 @@ 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(): @@ -11,6 +12,7 @@ class BrSimArena(): self.day= 1 self.players= [_player.BrSimPlayer(p['name'], p.get('inventory')) for p in players] self.weapons= [] + self.eventClass = _events.ArenaEventPicker(self.players) for weapon in weapons: for wtype, quantity in weapon.items(): for i in range(quantity): self.weapons.append(_weapons.BrSimWeapon(wtype)) @@ -18,10 +20,12 @@ class BrSimArena(): def next_day(self): self.day+= 1 print(f'Giorno: {self.day}') - print(f'Giocatori vivi: {self.get_alive_players()}') + 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): - print(f'Giocatori morti: {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= [] diff --git a/entities/event_picker.py b/entities/event_picker.py new file mode 100644 index 0000000..5c6e929 --- /dev/null +++ b/entities/event_picker.py @@ -0,0 +1,13 @@ +from assets.events import EVENTS +import random as _random + +class ArenaEventPicker(): + def __init__(self, players): + self.players = players + self.event_list = EVENTS + self.already_picked_players = [] + + def pick_event(): + pass + + diff --git a/entities/player.py b/entities/player.py index 1c68810..90be57b 100644 --- a/entities/player.py +++ b/entities/player.py @@ -1,72 +1,133 @@ 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.health= 1 self.inventory= inventory or [] self.damage= 1 # this is the punch damage amount self.max_weight= 5 # this is the max inventory weight self.agility= 10 # chance to avoid an hit + self.kills= 0 # track the number of kills + self.survived_days= 0 # track the number of the survived days + self.equipped_weapon= None + self.gender= _random.sample(['m', 'f', '-'], 1)[0] # for now get a random gender - def is_alive(self): - return self.health > 0 + ### control methods - def attack(self, target): - if not self.is_alive(): return - if not target.is_alive(): return - if target.try_to_avoid_hit(): return # print something like 'enemy doges the attacl' - - target.accuses_damage(self.damage) + def get_id(self): + return self.id - def accuses_damage(self, damage): - self.health -= damage - if self.health <= 0: - self.health = 0 - # show something like 'player is dead' - else: - # show something like 'get hit' - pass + def get_name(self): + return self.name - def try_to_avoid_hit(self): - # maybe depend on the attack, if it is a gun shot it's quite impossible to dodge - rnd= _random.randint(0, 100) - if rnd < self.agility: return True - return False - - def steal(self): - #XXX can steal from death players or from sleeping players - pass - - def escape(self): - #XXX It can run away from the fighting - pass - - def heal(self): - #XXX if you have a wound and you have a medikit item, you can heal your wound or sickness - pass + def get_gender(self): + return self.gender def get_inventory(self): return self.inventory - def get_name(self): - return self.name + def get_inventory_weight(self): + weight= 0 + for inv in self.get_inventory(): + weight+= inv.get_weight() + return weight + + def get_max_weight(self): + return self.max_weight def get_health(self): return self.health def get_damage(self): - return self.damage + if not self.equipped_weapon: return self.damage + return self.equipped_weapon.damage def get_agility(self): return self.agility def get_data(self): return { + 'id': self.get_id(), 'name': self.get_name(), + '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(), } + + def is_alive(self): + return self.health > 0 + + ### player actions + + def _equip_weapon(self): + if not self.inventory: return + + available_weapons= [] + for inv in self.get_inventory(): + # XXX + # i don't know yet if this is ok, + # we'll see it when weapon and items are defined + if not inv.damage: continue + available_weapons.append(inv) + 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, 100) + if rnd < self.agility: return True + return False + + def accuses_damage(self, damage): + self.health -= damage + if self.health > 0: return self.get_health() + + self.health = 0 + if self.get_gender() == 'm': + print(f'[{self.get_name()}]: Guarino, perdonami se sono morto x.x') + elif self.get_gender() == 'f': + print(f'[{self.get_name()}]: Guarino, perdonami se sono morta x.x') + else: + print(f'[{self.get_name()}]: Guarino, perdonami se sono mort* x.x') + return damage + + def attack(self, target): + self._equip_weapon() + if target.dodge(): + if target.get_gender() == 'm': + print(f'Ehhhh voleviiii!!! sei lentoo! {target.get_name()} schiva il colpo di {self.get_name()}') + elif target.get_gender() == 'f': + print(f'Ehhhh voleviiii!!! sei lentaa! {target.get_name()} schiva il colpo di {self.get_name()}') + else: + print(f'Ehhhh voleviiii!!! sei lent##! {target.get_name()} schiva il colpo di {self.get_name()}') + return 0 + target.accuses_damage(self.damage) + print(f'{self.get_name()} Colpisce {target.get_name()} in nome di Guarino') + return self.damage + + def get_item(self, item): + if self.get_inventory_weight() + item.get_weight() >= self.get_max_weight(): + if self.get_gender() == 'm': + print(f'Sono sovraccarico, {self.get_name} non puo\' prendere questo oggetto') + elif self.get_gender() == 'f': + print(f'Sono sovraccarica, {self.get_name} non puo\' prendere questo oggetto') + else: + print(f'Sono sovraccaric#, {self.get_name} 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 diff --git a/main.py b/main.py index 71eda53..39763b8 100644 --- a/main.py +++ b/main.py @@ -2,20 +2,20 @@ import random as _random from entities import weapon_syms as _wsyms from entities import arena as _arena -def init_arena(): - players= [{'name': 'Crystal'}, {'name': 'Andrea'}] - w= _wsyms.KNIFE - #weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] - weapons= [{w: 1}] +def init_arena(players, weapons): return _arena.BrSimArena(players, weapons) - def run_events(Arena): #A event for each player: pass def local_debug(): - Arena= init_arena() + players= [{'name': 'Crystal'}, {'name': 'Andrea'}, {'name' : 'giampi'}] + w= _wsyms.KNIFE + #weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] + weapons= [{w: 1}] + + Arena= init_arena(players, weapons) print(f'Players: {Arena.get_players()}') print(f'Weapons: {Arena.get_weapons()}') while (len(Arena.get_alive_players()) > 1): diff --git a/requirements/requirements.txt b/requirements/requirements.txt index a6c8e5a..ccc6d4e 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,2 +1,2 @@ -python-telegram-bot==22.3 +python-telegram-bot[job-queue]==22.3 pytz==2025.2