This repository has been archived on 2022-12-03. You can view files and clone it, but cannot push or open issues or pull requests.
texty/lib/fight.py

140 lines
4.9 KiB
Python
Raw Permalink Normal View History

import math
from lib.item import Item
2022-04-19 12:36:05 +02:00
2022-05-04 10:16:30 +02:00
from lib.menu import MenuManager
from .ascii import *
2022-04-19 12:36:05 +02:00
from colorama import Fore
import keyboard
2022-04-19 12:38:45 +02:00
from random import randrange
class FightHandler:
2022-05-04 10:16:30 +02:00
def __init__(self,message:str,name:str,hp:int,defense:int,attacks:dict,lang:dict,eq:dict,inv:list,img:str="") -> None:
2022-04-19 12:36:05 +02:00
self.selected = 0
2022-05-04 10:16:30 +02:00
self.rebind()
self.name = name
2022-05-04 14:26:32 +02:00
self.max = hp # životy nepřítele
self.hp = self.max # AKTUÁLNÍ životy nepřítele
self.enemyDef = defense # Obrana nepřítele
self.my = 30 # životy hráče TODO: maybe make this a variable
self.attacks = attacks
self.img = img
2022-04-19 12:36:05 +02:00
self.lang = lang
self.message = message
self.equipped = eq
2022-05-04 10:16:30 +02:00
self.inventory = inv
2022-05-02 11:32:40 +02:00
self.show()
2022-04-19 12:36:05 +02:00
def up(self):
if self.selected == 0:
self.selected = 2
else:
self.selected -= 1
system("cls||clear")
self.show()
def down(self):
if self.selected == 2:
self.selected = 0
else:
self.selected += 1
system("cls||clear")
self.show()
def show(self):
2022-05-04 10:16:30 +02:00
system("cls||clear")
p = math.trunc(self.hp/self.max*10)
h = "🟥"*p
2022-05-16 17:51:17 +02:00
j = math.trunc(self.my/30*10)
a = "🟩"*j
if str(p).endswith(".5"):
h += ""
2022-05-16 17:51:17 +02:00
if str(a).endswith(".5"):
a += ""
2022-04-19 12:36:05 +02:00
print(self.message)
2022-05-16 17:51:17 +02:00
print(f"{self.lang['you']} {a} {self.my}/30")
print(f"{self.name} {h} {self.hp}/{self.max}")
if self.img != "":
anim = AsciiAnimation()
anim.load_ascii(self.img)
anim.play()
2022-04-19 12:36:05 +02:00
s = [self.lang["attack"],self.lang["defend"],self.lang["inventory"]]
for selection in s:
2022-05-02 11:32:40 +02:00
if(self.selected == s.index(selection)):
2022-04-19 12:36:05 +02:00
print(f"{Fore.RED}{Fore.RESET} {selection}")
else:
print(f" {selection}")
2022-05-04 10:16:30 +02:00
def make_selection(self) -> None:
if self.selected == 0:
self.attack()
elif self.selected == 1:
self.defend()
elif self.selected == 2:
self.show_inventory()
def rebind(self):
keyboard.remove_all_hotkeys()
keyboard.add_hotkey("up",self.up)
keyboard.add_hotkey("down",self.down)
keyboard.add_hotkey("enter",self.make_selection)
2022-05-04 14:26:32 +02:00
def show_inventory(self): # Zobrazuje inventář TODO: Možná taky equipovat?
2022-05-04 10:16:30 +02:00
system("cls||clear")
if len(self.inventory) == 0:
FightMenu([self.lang["return"]],f" {self.lang['inside_inv']} \n")
else:
op = []
items = []
2022-05-04 10:16:30 +02:00
s = ""
for i,item in enumerate(self.inventory):
if type(item) is Item: # Pokud je předmět třídy Item, zobrazit zda-li je vybaven nebo ne
if self.equipped["weapon"] == item or self.equipped["armor"] == item:
op.append(f"- {item.name} | {self.lang['equipped']}")
2022-05-04 10:16:30 +02:00
else:
op.append(f"- {item.name}")
items.append(item)
2022-05-04 10:16:30 +02:00
else:
if(i == len(self.inventory)): # poslední, nepřidávat newline
2022-05-04 10:16:30 +02:00
s += f"- {item}"
else:
s += f"- {item}\n"
items.append(None)
op.append(self.lang["return"])
m = FightMenu(op,f" {self.lang['inside_inv']} \n{s}")
if(m.selected != len(op)-1):
# Vybavit
i = items[m.selected]
self.equipped[i.type] = i
2022-05-04 10:16:30 +02:00
2022-05-04 14:26:32 +02:00
def attack(self): # Provede útok vypočítáním ze statů útoku a obrany
2022-05-02 11:32:40 +02:00
p = randrange(len(self.attacks))
name = list(self.attacks[p].keys())[0]
enemyAtk = self.attacks[p][name]["atk"]
enemyDef = self.enemyDef
playerAtk = self.equipped["weapon"].attack
playerDef = self.equipped["armor"].defense
2022-05-16 21:00:45 +02:00
c = enemyAtk - playerDef
e = playerAtk - enemyDef
if c < 0:
c = 0
if e < 0:
e = 0
self.hp -= e # zásah nepříteli
self.my -= c # zásah hráči
2022-05-04 14:26:32 +02:00
self.message = f"{self.lang['enemydmg'].replace('$atk',str(playerAtk - enemyDef)).replace('$name',self.name)}\n{self.lang['playerdmg'].replace('$atk',str(enemyAtk - playerDef)).replace('$name',self.attacks[p][name]['name'])}" # Změnit zprávu
2022-05-02 11:32:40 +02:00
def defend(self):
self.message = self.lang["defended"]
2022-05-04 10:16:30 +02:00
2022-05-04 14:26:32 +02:00
class FightMenu(MenuManager): # Upravené menu, které nemá input na konci, protože to jinak buguje
2022-05-04 10:16:30 +02:00
def __init__(self,selections:list,additional:str):
2022-05-04 14:26:32 +02:00
self.selected = 0
self.selections = selections
self.additional = additional
2022-05-04 10:16:30 +02:00
keyboard.add_hotkey("up",self.up)
keyboard.add_hotkey("down",self.down)
keyboard.add_hotkey("enter",self.make_selection)
self.show_menu()