class_name BattleCutsceneAction static func battleDecisionCallable(_params:Dictionary) -> int: print("Executing battle action...") await UI.TEXTBOX.setTextAndWait("Performing battle decision") return Cutscene.CUTSCENE_CONTINUE static func getBattleDecisionCallable(decision:BattleDecision) -> Dictionary: return { "function": battleDecisionCallable, "decision": decision } static func playerDecisionCallable(_params:Dictionary) -> int: # First, are all enemies, or all players, defeated? var allPlayersDead:bool = false var allEnemiesDead:bool = false for fighter:BattleFighter in BATTLE.fighterMap.values(): if fighter == null: continue if fighter.status != BattleFighter.Status.DEAD: continue if fighter.isPlayerControlled(): allPlayersDead = false else: allEnemiesDead = false # If all players are dead, game over unfortunately. if allPlayersDead: print("All players defeated! Game Over.") assert(false) # If all enemies are dead, victory! if allEnemiesDead: print("All enemies defeated! Victory!") assert(false) # OK we are actually fighting. var decisions:Array[BattleDecision] = [] for fighter:BattleFighter in BATTLE.fighterMap.values(): if !fighter || !fighter.isPlayerControlled(): continue # Handle player decision BATTLE.battleScene.actionBox.visible = true var decision = await BATTLE.battleScene.actionBox.decisionMade BATTLE.battleScene.actionBox.visible = false if decision == null: continue decisions.append(decision) # AI decisions for fighter:BattleFighter in BATTLE.fighterMap.values(): if !fighter || fighter.isPlayerControlled(): continue var decision = fighter.getAIDecision() if decision == null: continue decisions.append(decision) # Here I could do something like cutscene specific logic? # Prioritize moves decisions.shuffle()# Randomizes for moves that have equal chance of happening decisions.sort_custom(func(a:BattleDecision, b:BattleDecision) -> int: var priorityA = a.getPriority() var priorityB = b.getPriority() if priorityA > priorityB: return -1 elif priorityA < priorityB: return 1 else: return 0 ) # Turn into cutscene actions. for decision in decisions: print("Adding decision to cutscene: %s" % decision) _params['cutscene'].addCallable(BattleCutsceneAction.getBattleDecisionCallable(decision)) # Then send to next decision _params['cutscene'].addCallable(BattleCutsceneAction.getPlayerDecisionCallable()) return Cutscene.CUTSCENE_CONTINUE static func getPlayerDecisionCallable() -> Dictionary: return { "function": playerDecisionCallable }