From a4cb6136a810220e0c370a0bc79eaa417ba07a98 Mon Sep 17 00:00:00 2001 From: markojozsef Date: Sat, 17 Oct 2026 15:31:14 +0200 Subject: [PATCH] =?UTF-8?q?Lebeg=C5=91=20sz=C3=A1mok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/battle.py | 6 ++++-- src/battle_data.py | 4 ++-- src/gamestates/battle.py | 43 +++++++++++++++++++++++++++++++++++----- src/text.py | 9 +++++++-- 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/battle.py b/src/battle.py index 361ff5b..165d806 100644 --- a/src/battle.py +++ b/src/battle.py @@ -1,4 +1,4 @@ -import math +import math K_NORMAL = 100 K_DEFUP = 50 @@ -56,7 +56,7 @@ class Action: def __repr__(self): return self.__str__() - def execute(self): + def execute(self, damage_callback): target = self.where if self.who.ko or self.who.stone: print(f" -> {self.who.name} cannot move!") @@ -91,8 +91,10 @@ class Action: if delta_hp > 0: print(f" -> {target.name} got healed for {delta_hp} HP!") + damage_callback(delta_hp, target) elif delta_hp < 0: print(f" -> {target.name} suffered {-delta_hp} damage!") + damage_callback(delta_hp, target) target.hp = max(0, min(target.maxhp, target.hp + delta_hp)) diff --git a/src/battle_data.py b/src/battle_data.py index f5d897f..146b6f0 100644 --- a/src/battle_data.py +++ b/src/battle_data.py @@ -5,14 +5,14 @@ from battle import Combatant, Action, Damage, StatusChange # --------------------------------------------------------------------------- # Animáció (ugyanaz, mint az eredetiben) # --------------------------------------------------------------------------- -def anim_default(action, text, timer, dt): +def anim_default(action, text, timer, dt, damage_callback): if timer == 0: text.reset(action.name) text.type_all() if timer >= 1: text.reset("") - action.execute() + action.execute(damage_callback) return True return False diff --git a/src/gamestates/battle.py b/src/gamestates/battle.py index 4902621..9b41ae9 100644 --- a/src/gamestates/battle.py +++ b/src/gamestates/battle.py @@ -24,6 +24,7 @@ inventory = [] enemy_sprites = [] party_sprites = [] +floating_numbers = [] gray_cache = {} action_queue = [] @@ -31,8 +32,8 @@ cur_action = None action_timer = 0 menu_text = TextRenderer(6, 76, 210) -action_text = TextRenderer(128, 204, None, True) -action_panel = renderers.NineSlicesPanel(73,187,110,40) +action_text = TextRenderer(122, 204, None, True) +action_panel = renderers.NineSlicesPanel(67,187,110,40) show_action_panel = False menu_open = 0 @@ -48,8 +49,18 @@ def enemy_pos(i): def party_pos(i): return (40 + (i % 2) * 30, 165 - i * 25) +def sprite_pos(who): + if who in party_members: + i = party_members.index(who) + return party_pos(i) + elif who in enemies: + i = enemies.index(who) + return enemy_pos(i) + else: + return (0,0) + def switch(game): - global enemies, party_members, battle_music, enemy_turn, enemy_ai_data, party_menus, spells, inventory, enemy_sprites, party_sprites + global enemies, party_members, battle_music, enemy_turn, enemy_ai_data, party_menus, spells, inventory, enemy_sprites, party_sprites, floating_numbers enemies = copy.deepcopy(battle_data.battles[battle_id]["enemies"]) party_members = copy.deepcopy(battle_data.battles[battle_id]["party_members"]) enemy_turn = copy.deepcopy(battle_data.battles[battle_id]["enemy_turn_func"]) @@ -60,6 +71,7 @@ def switch(game): enemy_sprites = battle_data.battles[battle_id]["enemy_sprites"] party_sprites = battle_data.battles[battle_id]["party_sprites"] battle_music = assets.sounds[battle_data.battles[battle_id]["mus_id"]].play(loops=True) + floating_numbers = [] close_menu() def close_menu(): @@ -230,7 +242,7 @@ def menu_action(data): "Támadás", user, targets[0], Damage(user.attack, 0, 0, 0), StatusChange(0, 0, 0), battle_data.anim_default)) - + open_target_menu(user, aparty, eparty, "ene", queue_attack, lambda *a: open_menu((user, 0, aparty, eparty))) case "magic": @@ -244,6 +256,17 @@ def menu_action(data): close_menu() # !!! CHATGPT VÉGE !!! + +def damage_callback(amount, target): + normalized = -amount if amount < 0 else amount + color = (255,255,255) if amount < 0 else (100,255,100) + + tr = TextRenderer(*sprite_pos(target), None, True) + tr.reset(str(normalized)) + tr.type_all() + + floating_numbers.append([tr, color, 0, 0.4, 0.5]) + def update(game, dt): global menu_open, cur_action, action_timer, show_action_panel @@ -274,7 +297,7 @@ def update(game, dt): action_timer = 0 if cur_action != None: - if cur_action.animation(cur_action, action_text, action_timer, dt): + if cur_action.animation(cur_action, action_text, action_timer, dt, damage_callback): cur_action = None show_action_panel = False else: @@ -290,6 +313,12 @@ def update(game, dt): for m in menu: m.update() + for n in floating_numbers: + n[0].move(n[2], n[3]) + n[4] -= dt + if n[4] <= 0: + floating_numbers.remove(n) + if len(enemies) != 0 and all(e.ko or e.stone for e in enemies): print("\nVICTORY! all enemies were defeated.") battle_music.stop() @@ -340,6 +369,10 @@ def draw_battlers(combatants, sprite_table, pos_func): def draw(game): draw_battlers(enemies, enemy_sprites, enemy_pos) draw_battlers(party_members, party_sprites, party_pos) + + for n in floating_numbers: + n[0].render(n[1]) + panel.render() for m in menu: m.render() diff --git a/src/text.py b/src/text.py index b0cd1e1..baced6a 100644 --- a/src/text.py +++ b/src/text.py @@ -78,14 +78,19 @@ class TextRenderer: def type_all(self): while not self.type_tick(): pass + + def move(self, x, y): + for s in self.sprites: + s[1] = s[1].move(x, y) - def render(self): + def render(self, discoloration=(255,255,255)): offset = -(sum(s[2] for s in self.sprites) // 2) if self.center else 0 for s in self.sprites: arcade.draw_texture_rect( s[0], s[1].move(offset, 0), - pixelated=True + pixelated=True, + color=arcade.types.Color(*discoloration) ) # a \n display függvénye