import math import random import arcade from battle import Combatant, Action, Damage, StatusChange from menu import MenuItem from text import TextRenderer import assets import battle_data enemies = [] party_members = [] enemy_turn = None battle_music = None enemy_ai_data = {} party_menus = [] spells = [] inventory = [] action_queue = [] cur_action = None action_timer = 0 party_text = TextRenderer(3, 206, 210) ene_text = TextRenderer(123, 206, 210) menu_text = TextRenderer(3, 76, 210) action_text = TextRenderer(110, 215, 210) menu_open = 0 menu_queue = [] menu = [] 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"] battle_music = assets.sounds[battle_data.battles[battle_id]["mus_id"]].play(loops=True) def close_menu(): global menu, menu_open menu = [] menu_open = 0 menu_text.reset("") 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)) close_menu() case _: print(f"Unknown action: {action}") close_menu() def update(game, dt): global menu_open, cur_action, action_timer for e in enemies: if e.ko or e.stone: continue e.atb -= 1 if e.atb <= 0: act = enemy_turn(e, enemies, party_members, enemy_ai_data) if act: action_queue.append(act) e.atb = math.inf 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 act!") menu_queue.append(p) p.atb = math.inf if len(action_queue) != 0 and cur_action == None: action = action_queue.pop(0) print(f"Executing: {action}") cur_action = action action_timer = 0 if cur_action != None: if cur_action.animation(cur_action, action_text, action_timer, 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 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() for m in menu: m.update() party_text.reset(partytext) ene_text.reset(enetext) party_text.type_all() ene_text.type_all() def draw(game): for m in menu: m.render() party_text.render() ene_text.render() menu_text.render() action_text.render()