From 761cf794b416dd0ebd386d5be2d1fa8849deccd9ff13bb832990ec51bb3552e5 Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 24 Jul 2025 21:36:34 +0200 Subject: [PATCH 1/6] fix requirements for job-queue --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 1c284bad97d118121dec426aa45d83d8da65a122a59a301b3a8ea040bb27c74b Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 24 Jul 2025 22:36:36 +0200 Subject: [PATCH 2/6] basic player entity and debug module to quickly test player attack --- debug.py | 38 +++++++++++++++ entities/player.py | 114 ++++++++++++++++++++++++++++++--------------- main.py | 14 +++--- 3 files changed, 122 insertions(+), 44 deletions(-) create mode 100644 debug.py diff --git a/debug.py b/debug.py new file mode 100644 index 0000000..b5fac40 --- /dev/null +++ b/debug.py @@ -0,0 +1,38 @@ +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', + } + ] + w= _wsyms.KNIFE + #weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] + weapons= [{w: 1}] + + 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 + +if __name__ == '__main__': + init_debug() diff --git a/entities/player.py b/entities/player.py index 1c68810..3a5b60b 100644 --- a/entities/player.py +++ b/entities/player.py @@ -1,72 +1,112 @@ 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 - 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 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_name(self): + return self.name 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(), '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 + print('Guarino, perdonami se sono morto x.x') + return damage + + def attack(self, target): + self._equip_weapon() + if target.dodge(): + print('Ehhhh voleviiii!!! sei lentoo!') + return 0 + target.accuses_damage(self.damage) + return self.damage + + def get_item(self, item): + if self.get_inventory_weight() + item.get_weight() >= self.get_max_weight(): + print('Sono sovraccarico, non posso 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..0226e2f 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'}] + 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): From 526668ed5d51f5a47fb779c051cbe6860cb301c17e950eea1871b37cbc00fe1a Mon Sep 17 00:00:00 2001 From: vermilion Date: Thu, 24 Jul 2025 22:57:28 +0200 Subject: [PATCH 3/6] initial event picker idea --- assets/events.py | 14 ++++++++++++++ entities/arena.py | 2 ++ entities/event_picker.py | 13 +++++++++++++ main.py | 2 +- 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 assets/events.py create mode 100644 entities/event_picker.py 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/entities/arena.py b/entities/arena.py index 97466d9..16cd056 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)) diff --git a/entities/event_picker.py b/entities/event_picker.py new file mode 100644 index 0000000..111a6a9 --- /dev/null +++ b/entities/event_picker.py @@ -0,0 +1,13 @@ +from assets.events import EVENTS +import 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/main.py b/main.py index 71eda53..d3277a6 100644 --- a/main.py +++ b/main.py @@ -3,7 +3,7 @@ from entities import weapon_syms as _wsyms from entities import arena as _arena def init_arena(): - players= [{'name': 'Crystal'}, {'name': 'Andrea'}] + players= [{'name': 'Crystal'}, {'name': 'Andrea'}, {'name': 'giampi'}] w= _wsyms.KNIFE #weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] weapons= [{w: 1}] From 0bb2c840f98db1ef770662d9ddc092f81aeef24bee9589e397aa8dad58870646 Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 24 Jul 2025 22:58:46 +0200 Subject: [PATCH 4/6] lgbtq+ texts --- debug.py | 10 +++++++--- entities/arena.py | 6 ++++-- entities/player.py | 29 +++++++++++++++++++++++++---- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/debug.py b/debug.py index b5fac40..1bf1138 100644 --- a/debug.py +++ b/debug.py @@ -15,9 +15,10 @@ def init_debug(): 'name': 'Zephyr', } ] - w= _wsyms.KNIFE - #weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] - weapons= [{w: 1}] + #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()}') @@ -34,5 +35,8 @@ def init_debug(): _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..57033ab 100644 --- a/entities/arena.py +++ b/entities/arena.py @@ -18,10 +18,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/player.py b/entities/player.py index 3a5b60b..90be57b 100644 --- a/entities/player.py +++ b/entities/player.py @@ -4,7 +4,7 @@ import uuid as _uuid class BrSimPlayer(): def __init__(self, name, inventory= None): - self.id= str(_uuid.uuid4) + self.id= str(_uuid.uuid4()) self.name= name self.health= 1 self.inventory= inventory or [] @@ -14,6 +14,7 @@ class BrSimPlayer(): 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 ### control methods @@ -23,6 +24,9 @@ class BrSimPlayer(): def get_name(self): return self.name + def get_gender(self): + return self.gender + def get_inventory(self): return self.inventory @@ -49,6 +53,7 @@ class BrSimPlayer(): 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(), @@ -84,20 +89,36 @@ class BrSimPlayer(): if self.health > 0: return self.get_health() self.health = 0 - print('Guarino, perdonami se sono morto x.x') + 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(): - print('Ehhhh voleviiii!!! sei lentoo!') + 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(): - print('Sono sovraccarico, non posso prendere questo oggetto') + 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) From b12db42c0bc1963313e7ac22633b502b8c98204d349bd3b0c5eccd412bdaee59 Mon Sep 17 00:00:00 2001 From: Crystal Date: Thu, 24 Jul 2025 23:07:33 +0200 Subject: [PATCH 5/6] more players --- debug.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/debug.py b/debug.py index 1bf1138..c076cd8 100644 --- a/debug.py +++ b/debug.py @@ -13,7 +13,16 @@ def init_debug(): }, { 'name': 'Zephyr', - } + }, + { + 'name': 'Lyra', + }, + { + 'name': 'Orion', + }, + { + 'name': 'Seraphina', + }, ] #w= _wsyms.KNIFE ##weapons= [{_wsyms.WEAPONS[w]['name' ]: 1}] From 82be14e603df049f87d7c5d713861be439aa8db60f0bd54687ac0678bcb57bca Mon Sep 17 00:00:00 2001 From: frostbite Date: Fri, 25 Jul 2025 09:24:31 +0200 Subject: [PATCH 6/6] minor --- entities/event_picker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entities/event_picker.py b/entities/event_picker.py index 111a6a9..5c6e929 100644 --- a/entities/event_picker.py +++ b/entities/event_picker.py @@ -1,5 +1,5 @@ from assets.events import EVENTS -import random +import random as _random class ArenaEventPicker(): def __init__(self, players):