From db772207dbb6b46bc886b152ee5d9829d5eaba40 Mon Sep 17 00:00:00 2001 From: markojozsef Date: Fri, 16 Oct 2026 15:30:09 +0200 Subject: [PATCH] =?UTF-8?q?Grafikus=C3=ADt=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets.py | 1 + src/battle_data.py | 10 ++++++ src/gamestates/battle.py | 71 +++++++++++++++++++++++++++++----------- 3 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/assets.py b/src/assets.py index df659e8..fee17e7 100644 --- a/src/assets.py +++ b/src/assets.py @@ -4,6 +4,7 @@ import pygame pygame.mixer.init() sprites = { + "kefka" : arcade.load_texture("res/sprite/kefka.png"), "cursor" : arcade.load_texture("res/sprite/handcursor.png"), "font" : arcade.load_spritesheet("res/sprite/font.png"), "panel" : arcade.load_spritesheet("res/sprite/panel.png"), diff --git a/src/battle_data.py b/src/battle_data.py index 2caf581..ba6c705 100644 --- a/src/battle_data.py +++ b/src/battle_data.py @@ -245,10 +245,20 @@ battles = [ Combatant("Mira, a Tanonc Varázsló", 90, 15, 50, 5, 10, 10, False, False), Combatant("Bence, a Gyakornok Pap", 100, 12, 60, 10, 20, 20, False, False), ], + "enemy_sprites": [ + # normál, kritikus , halott + ["cursor", "cursor", "cursor"], + ["cursor", "cursor", "cursor"], + ["cursor", "cursor", "cursor"] + ], "party_members": [ Combatant("Mordrak, a Sötét Úr", 400, 50, 80, 30, 20, 20, False, False), Combatant("Csontvázőr", 150, 35, 67, 40, -40, 0, False, False), ], + "party_sprites": [ + ["kefka", "kefka", "kefka"], + ["cursor", "cursor", "cursor"] + ], "enemy_turn_func": hero_turn_rookies, "mus_id": "mus_fnafsux", "init_ai_data": _hero_moves(can_petrify=False), diff --git a/src/gamestates/battle.py b/src/gamestates/battle.py index fc52b28..80ed0ea 100644 --- a/src/gamestates/battle.py +++ b/src/gamestates/battle.py @@ -4,6 +4,7 @@ import random import renderers import arcade import gamestate +from PIL import Image from battle import Combatant, Action, Damage, StatusChange from menu import MenuItem @@ -21,12 +22,14 @@ party_menus = [] spells = [] inventory = [] +enemy_sprites = [] +party_sprites = [] +gray_cache = {} + action_queue = [] cur_action = None action_timer = 0 -party_text = TextRenderer(3, 206, 210) -ene_text = TextRenderer(123, 206, 210) menu_text = TextRenderer(6, 76, 210) action_text = TextRenderer(110, 215, 210) @@ -37,8 +40,14 @@ panel = renderers.NineSlicesPanel(0,0,230,100) battle_id = 0 +def enemy_pos(i): + return (185, 195 - i * 40) + +def party_pos(i): + return (40 + (i % 2) * 30, 165 - i * 35) + def switch(game): - global enemies, party_members, battle_music, enemy_turn, enemy_ai_data, party_menus, spells, inventory + global enemies, party_members, battle_music, enemy_turn, enemy_ai_data, party_menus, spells, inventory, enemy_sprites, party_sprites 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"]) @@ -46,6 +55,8 @@ def switch(game): party_menus = copy.deepcopy(battle_data.battles[battle_id]["menus"]) spells = copy.deepcopy(battle_data.battles[battle_id]["spells"]) inventory = copy.deepcopy(battle_data.battles[battle_id]["inventory"]) + 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) close_menu() @@ -264,17 +275,7 @@ def update(game, dt): cur_action = None else: action_timer += dt - - # Szövegek Frissítése - partytext = "" - enetext = "" - - for m in party_members: - partytext += f"=={m.name}==\nHP: {m.hp}\n" - - for e in enemies: - enetext += f"=={e.name}==\nHP: {e.hp}\n" - + if len(menu_queue) != 0 and menu_open == 0: whose = menu_queue.pop(0) menu_open = whose @@ -297,18 +298,48 @@ def update(game, dt): gamestate.switch_gamestate(game,"gameover") return - party_text.reset(partytext) - ene_text.reset(enetext) - party_text.type_all() - ene_text.type_all() +# !!! CHATGPT !!! +def make_gray(tex, key): + img = tex.image.convert("RGBA") + a = img.getchannel("A") + l = img.convert("L") + out = Image.merge("RGBA", (l, l, l, a)) + return arcade.Texture(out) + +def get_texture(sprite_id, gray=False): + asset = assets.sprites[sprite_id] + tex = getattr(asset, "texture", asset) # works for Sprite or Texture + if not gray: + return tex + if sprite_id not in gray_cache: + gray_cache[sprite_id] = make_gray(tex, sprite_id) + return gray_cache[sprite_id] + +def pick_sprite_id(c, ids): + if c.ko: + return ids[2] + if c.hp <= c.maxhp * 0.1: + return ids[1] + return ids[0] + +def draw_tex(tex, cx, cy): + arcade.draw_texture_rect(tex, arcade.LRBT( + cx - tex.width / 2, cx + tex.width / 2, + cy - tex.height / 2, cy + tex.height / 2)) + +def draw_battlers(combatants, sprite_table, pos_func): + for i, c in enumerate(combatants): + sid = pick_sprite_id(c, sprite_table[i]) + tex = get_texture(sid, gray=bool(c.stone and not c.ko)) + draw_tex(tex, *pos_func(i)) def draw(game): + draw_battlers(enemies, enemy_sprites, enemy_pos) + draw_battlers(party_members, party_sprites, party_pos) panel.render() for m in menu: m.render() - party_text.render() - ene_text.render() menu_text.render() action_text.render()