diff --git a/doc/AIHasznalat.md b/doc/AIHasznalat.md index d1b9f04..d207b25 100644 --- a/doc/AIHasznalat.md +++ b/doc/AIHasznalat.md @@ -15,5 +15,8 @@ Teljesen AI-generált szakaszokat egy `# !!! CHATGPT !!!` komment jelzi ### battle_data.py * csata függvények +### gamestates/battle.py +* menük + ## Dokumentáció Ezen a fájlon kívül minden dokumentáció AI generálta. \ No newline at end of file diff --git a/src/gamestate.py b/src/gamestate.py index 6055255..ca1aef7 100644 --- a/src/gamestate.py +++ b/src/gamestate.py @@ -2,12 +2,14 @@ import gamestates.none import gamestates.title import gamestates.overworld import gamestates.battle +import gamestates.gameover gamestates = { "none": gamestates.none, "title": gamestates.title, "overworld": gamestates.overworld, - "battle": gamestates.battle + "battle": gamestates.battle, + "gameover": gamestates.gameover, } gamestate = "none" diff --git a/src/gamestates/battle.py b/src/gamestates/battle.py index 6ec3efc..fe8b4df 100644 --- a/src/gamestates/battle.py +++ b/src/gamestates/battle.py @@ -1,6 +1,8 @@ import math +import copy import random -import arcade +import arcade +import gamestate from battle import Combatant, Action, Damage, StatusChange from menu import MenuItem @@ -35,30 +37,157 @@ battle_id = 0 def switch(game): global enemies, party_members, battle_music, enemy_turn, enemy_ai_data, party_menus, spells, inventory - enemies = battle_data.battles[battle_id]["enemies"] - party_members = battle_data.battles[battle_id]["party_members"] - enemy_turn = battle_data.battles[battle_id]["enemy_turn_func"] - enemy_ai_data = battle_data.battles[battle_id]["init_ai_data"] - party_menus = battle_data.battles[battle_id]["menus"] - spells = battle_data.battles[battle_id]["spells"] - inventory = battle_data.battles[battle_id]["inventory"] + print("asdfasdfasdf") + 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"]) + enemy_ai_data = copy.deepcopy(battle_data.battles[battle_id]["init_ai_data"]) + 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"]) battle_music = assets.sounds[battle_data.battles[battle_id]["mus_id"]].play(loops=True) +def open_menu(whose): + party_idx = party_members.index(whose) + for i, m in enumerate(party_menus[party_idx]): + menu.append(MenuItem(m[0], 19, 64-(i*13), None, None, None, None, menu_action, (whose, party_members, enemies, m[1]))) + + for i, m in enumerate(menu): + m.up = menu[(i - 1) % len(menu)] + m.down = menu[(i + 1) % len(menu)] + + menu[1].select() + def close_menu(): global menu, menu_open menu = [] menu_open = 0 menu_text.reset("") +# !!! CHATGPT !!! + +def open_spell_menu(user, aparty, eparty): + global menu + + party_idx = party_members.index(user) + spell_list = spells[party_idx] + + menu = [] + + for i, spell in enumerate(spell_list): + menu.append( + MenuItem( + spell[0], + 19, + 64 - (i * 13), + None, + None, + None, + None, + spell_action, + (user, spell, aparty, eparty) + ) + ) + + if len(menu) == 0: + return + + for i, m in enumerate(menu): + m.up = menu[(i - 1) % len(menu)] + m.down = menu[(i + 1) % len(menu)] + + menu[0].select() + + +def spell_action(data): + user, spell, aparty, eparty = data + + name, mp_cost, action = spell + + action_name, func, target_type = action + + action_queue.append(func(user, [p for p in eparty if not p.ko][0])) + + close_menu() + + +def open_item_menu(user, aparty, eparty): + global menu + + menu = [] + + for i, item in enumerate(inventory): + if item[1] <= 0: + continue + + menu.append( + MenuItem( + f"{item[0]} x{item[1]}", + 19, + 64 - (i * 13), + None, + None, + None, + None, + item_action, + (user, item, aparty, eparty) + ) + ) + + if len(menu) == 0: + return + + for i, m in enumerate(menu): + m.up = menu[(i - 1) % len(menu)] + m.down = menu[(i + 1) % len(menu)] + + menu[0].select() + + +def item_action(data): + user, item, aparty, eparty = data + + name, amount, action = item + + action_name, func, target_type = action + + action_queue.append( + func(user, user) + ) + + item[1] -= 1 + + close_menu() + +# !!! CHATGPT VÉGE !!! def menu_action(data): user, aparty, eparty, action = data + match action: + case "unselectable": return + case "phys_att": - action_queue.append(Action("Physical Attack", user, eparty[0], Damage(166, 0, 0, 0), StatusChange(0, 0, 0), battle_data.anim_default)) + action_queue.append( + Action( + "Physical Attack", + user, + [p for p in eparty if not p.ko][0], + Damage(166, 0, 0, 0), + StatusChange(0, 0, 0), + battle_data.anim_default + ) + ) close_menu() + + case "magic": + open_spell_menu(user) + + case "items": + open_item_menu(user) + case _: print(f"Unknown action: {action}") close_menu() @@ -113,20 +242,23 @@ def update(game, dt): menu_open = whose menu_text.reset(f"{whose.name}'s Menu") menu_text.type_all() - - party_idx = party_members.index(whose) - for i, m in enumerate(party_menus[party_idx]): - menu.append(MenuItem(m[0], 19, 64-(i*13), None, None, None, None, menu_action, (whose, party_members, enemies, m[1]))) - - for i, m in enumerate(menu): - m.up = menu[(i - 1) % len(menu)] - m.down = menu[(i + 1) % len(menu)] - - menu[1].select() + open_menu(whose) for m in menu: m.update() + if len(enemies) != 0 and all(e.ko for e in enemies): + print("\nVICTORY! all enemies were defeated.") + battle_music.stop() + gamestate.switch_gamestate(game,"overworld") + return + + if len(party_members) != 0 and all(a.ko for a in party_members): + print("\nGAME OVER! the party was defeated.") + battle_music.stop() + gamestate.switch_gamestate(game,"gameover") + return + party_text.reset(partytext) ene_text.reset(enetext) party_text.type_all() diff --git a/src/gamestates/gameover.py b/src/gamestates/gameover.py new file mode 100644 index 0000000..ff0a83b --- /dev/null +++ b/src/gamestates/gameover.py @@ -0,0 +1,38 @@ +import menu +import text +import renderers +import gamestate + +text = text.TextRenderer(90, 180, 210) +panel = renderers.NineSlicesPanel(84,100,64,100) + +m = [] + +def retry(g): + gamestate.switch_gamestate(g, "title") + + +def switch(game): + global m + m = [ + menu.MenuItem("Ujrapróba", 98, 150, None, None, None, None, retry, game), + menu.MenuItem("Kilépés", 98, 130, None, None, None, None, quit) + ] + + m[0].down = m[1] + m[1].up = m[0] + m[0].select() + + text.reset("Játék vége!") + text.type_all() + +def update(game, dt): + for i in m: + i.update() + +def draw(game): + panel.render() + text.render() + for i in m: + i.render() + diff --git a/src/gamestates/none.py b/src/gamestates/none.py index 8bb4861..df410b0 100644 --- a/src/gamestates/none.py +++ b/src/gamestates/none.py @@ -2,4 +2,4 @@ import gamestate # Azért létezik ez a "none" gamestate hogy meghívja az elsö gamestate init() funkcióját def update(game, dt): - gamestate.switch_gamestate(game, "overworld") + gamestate.switch_gamestate(game, "gameover") diff --git a/src/gamestates/overworld.py b/src/gamestates/overworld.py index 42109a0..56e059c 100644 --- a/src/gamestates/overworld.py +++ b/src/gamestates/overworld.py @@ -34,6 +34,7 @@ def update(game, dt): if btrans_timer >= BTRANS_DURATION: game.mos_enabled = False + btrans_active = False btrans_sound.stop() gamestate.switch_gamestate(game,"battle")