class_name BattleSingleton extends Node const BattleCutsceneAction = preload("res://battle/cutscene/BattleCutsceneAction.gd") enum BattlePosition { LEFT_TOP_BACK, LEFT_TOP_FRONT, LEFT_MIDDLE_BACK, LEFT_MIDDLE_FRONT, LEFT_BOTTOM_BACK, LEFT_BOTTOM_FRONT, RIGHT_TOP_BACK, RIGHT_TOP_FRONT, RIGHT_MIDDLE_BACK, RIGHT_MIDDLE_FRONT, RIGHT_BOTTOM_BACK, RIGHT_BOTTOM_FRONT } # Battle State var active:bool = false var fighterMap:Dictionary[BattlePosition, BattleFighter] = {} var battleCutscene:Cutscene = null # Non-guarantees var battleScene:BattleScene = null # Signals signal battleStarted signal battleFightersChanged func startBattle(params) -> void: assert(params.has('fighters')) assert(!active) # Get the cutscene (or create a default one). battleCutscene = params.get('cutscene', Cutscene.new()) # Update fighters for each fighter scene. for pos in BattlePosition.values(): var fighterOrNull = params['fighters'].get(pos, null) fighterMap[pos] = fighterOrNull # Initial cutscene elements. In future I may need to make this editable # somehow? for fighter:BattleFighter in params['fighters'].values(): battleCutscene.addCallable(BattleCutsceneAction.getPlayerDecisionCallable(fighter)) # Emit signals active = true battleStarted.emit() battleFightersChanged.emit() # Start running the battle cutscene. if !battleCutscene.running: battleCutscene.start() # Wait 3 seconds then simulate damage for testing var fighter = fighterMap[BattlePosition.RIGHT_TOP_FRONT] while true: await get_tree().create_timer(0.3).timeout fighter.damage(10, false) func getFighterAtPosition(battlePos:BattlePosition) -> BattleFighter: return fighterMap.get(battlePos, null)