From 882b530366db41a00f36c7d1e0870080e98e160a Mon Sep 17 00:00:00 2001 From: markojozsef Date: Mon, 14 Sep 2026 18:17:50 +0200 Subject: [PATCH] =?UTF-8?q?Csatarendszer=20outline=20bigy=C3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bullshit.py | 178 +++++++++++++++++++++++++++++++++++++++++++ res/sprite/evil.png | Bin 0 -> 344 bytes res/sprite/kefka.png | Bin 0 -> 9277 bytes 3 files changed, 178 insertions(+) create mode 100644 bullshit.py create mode 100644 res/sprite/evil.png create mode 100644 res/sprite/kefka.png diff --git a/bullshit.py b/bullshit.py new file mode 100644 index 0000000..c4edf77 --- /dev/null +++ b/bullshit.py @@ -0,0 +1,178 @@ +import math + +K_NORMAL = 100 +K_DEFUP = 50 +MIN_DMG = 1 + +class Combatant: + def __init__(self, name, maxhp, attack, speed, def_phys, def_fire, def_ice, abs_fire, abs_ice): + self.name = name + self.max_atb = 1000/speed + self.atb = self.max_atb + self.maxhp = maxhp + self.hp = maxhp + self.attack = attack + self.ko = False + self.stone = False + self.def_up = False + self.def_phys = def_phys + self.def_fire = def_fire + self.def_ice = def_ice + self.abs_fire = abs_fire + self.abs_ice = abs_ice + +# POTENTIAL damage before defense effects +class Damage: + def __init__(self, phys, fire, ice, healing): + self.phys= phys + self.fire= fire + self.ice= ice + self.healing = healing + +# 0 = keep, 1 = inflict, 2 = remove +class StatusChange: + def __init__(self, ko, stone, def_up): + self.ko = ko + self.stone = stone + self.def_up = def_up + +# where = reference to the target, who = reference to the inflictor +class Action: + def __init__(self, name, who, where, damage, status): + self.name = name + self.who = who + self.where = where + self.damage = damage + self.status = status + + def __str__(self): + return ( + f"[{self.name}] {self.who.name} -> {self.where.name} " + f"(HP influence: ({self.damage.phys},{self.damage.fire},{self.damage.ice},{self.damage.healing}), Status: {self.status.ko}-{self.status.stone}-{self.status.def_up})" + ) + + def __repr__(self): + return self.__str__() + + def execute(self): + target = self.where + if self.who.ko or self.who.stone: + print(f" -> {self.who.name} cannot move!") + return + + self.who.atb = self.who.max_atb + + if target.ko: + print(f" -> {target.name} is KO'd, move cancelled!") + return + + K = K_DEFUP if target.def_up else K_NORMAL + + delta_hp = self.damage.healing + + if self.damage.phys: + delta_hp += -max(MIN_DMG, self.damage.phys * (K / (K + target.def_phys))) + + if self.damage.fire: + delta_hp += self.damage.fire if target.abs_fire else -max(MIN_DMG, self.damage.fire * (K / (K + target.def_fire))) + + if self.damage.ice: + delta_hp += self.damage.ice if target.abs_ice else -max(MIN_DMG, self.damage.ice * (K / (K + target.def_ice ))) + + if self.status.ko == 1: + delta_hp = -target.hp + elif self.status.ko == 2 and target.ko: + target.ko = False + print(f" -> {target.name}'s consciousness returned!") + + delta_hp = round(delta_hp) + + if delta_hp > 0: + print(f" -> {target.name} got healed for {delta_hp} HP!") + elif delta_hp < 0: + print(f" -> {target.name} suffered {-delta_hp} damage!") + + target.hp = max(0, min(target.maxhp, target.hp + delta_hp)) + + if self.status.stone == 1 and not target.stone: + target.stone = True + print(f" -> {target.name}'s body petrified!") + elif self.status.stone == 2 and target.stone: + target.stone = False + print(f" -> {target.name}'s body softened back up!") + + if self.status.def_up == 1 and not target.def_up: + target.def_up = True + print(f" -> {target.name}'s defense was boosted!") + elif self.status.def_up == 2 and target.def_up: + target.def_up = False + print(f" -> {target.name}'s defense returned to normal!") + + if target.hp == 0: + target.ko = True + target.stone = False + target.def_up = False + print(f" -> {target.name} got hurt and collapsed!") + +enemies = [ + Combatant("Six-Seven kid", 100, 100, 100, 100, 100, 100, False, False) +] + +party_members = [ + Combatant("Terra", 100, 100, 100, 100, 100, 100, False, False), + Combatant("Locke", 100, 100, 100, 100, 100, 100, False, False), + Combatant("Celes", 100, 100, 100, 100, 100, 100, False, False), + Combatant("Cyan", 100, 100, 100, 100, 100, 100, False, False) +] + +tick_counter = 0 +action_queue = [] + +while True: + print(f"Tick #{tick_counter}!") + + for e in enemies: + if e.ko or e.stone: + continue + + e.atb -= 1 + if e.atb == 0: + action_queue.append(Action("Physical Attack", e, party_members[0], Damage(25,0,0,0), StatusChange(0, 0, 0))) + + for p in party_members: + if p.ko or p.stone: + continue + + p.atb -= 1 + if p.atb == 0: + print(f"{p.name} is ready to attack with {p.hp} health!") + should_loop = True + while should_loop: + print(f"Action(attack / heal / defend): ", end="") + act = input() + if act == "attack": + action_queue.append(Action("Physical Attack", p, enemies[0], Damage(25,0,0,0), StatusChange(0, 0, 0))) + should_loop = False + elif act == "heal": + action_queue.append(Action("Cure", p, p, Damage(0,0,0,42), StatusChange(0, 0, 0))) + should_loop = False + elif act == "defend": + action_queue.append(Action("Defend", p, p, Damage(0,0,0,0), StatusChange(0, 0, 1))) + should_loop = False + else: + print("Idk what you mean I told you attack and heal and defend are the only valid options bruh") + + if len(action_queue) != 0: + action = action_queue.pop(0) + print(f"Executing: {action}") + action.execute() + + if all(e.ko for e in enemies): + print("\nVICTORY! all enemies were defeated.") + break + + if all(p.ko for p in party_members): + print("\nGAME OVER! the party was defeated.") + break + + tick_counter += 1 diff --git a/res/sprite/evil.png b/res/sprite/evil.png new file mode 100644 index 0000000000000000000000000000000000000000..ac162534b76a8cb746d75557d6301fdea8918daa GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^4nQoy!3-p8v$)HElu&?Ah%1n`w6p}0|Ns97lHZPJ z?J_Nu2eQ~og8YI(qW}L_RX+F!6nXFI;uvDlyLL(>-(dp|mzkYA{!fkG!xR^_viH-( zc1b3Q=qK^~4cfDxo?$q_JzFtCs9EK%zPKLSyqRwg&Q+{7I~;s3yJ642mX7NTS3lG| z@aBxa`a!t++P2r7x3`^`=$acZ>Mj=Q-+EPX!IE84iF}&rXC;rYoZYYOCY&4|?CRow zDDBd}^Ja5eEpO_0FbY&hP3vZAwyfZo#PnfBJc~k7L*z#h0d9VA`2)tQIzoF|mmkRQ zO1EG%yK_E&hyEpnrJwgceKB8OW*K*TjKw*@X|q@!Zeg8v;n21wi;RM{GiNt-8bn>0 lb-n0RjQwBJyR!H0>o+E{y4=zgJPq_ZgQu&X%Q~loCIHF5i^~82 literal 0 HcmV?d00001 diff --git a/res/sprite/kefka.png b/res/sprite/kefka.png new file mode 100644 index 0000000000000000000000000000000000000000..e17c3832940f5c9b1b287ee1e0298c4ec40a8ea3 GIT binary patch literal 9277 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