92 lines
2.7 KiB
GDScript
92 lines
2.7 KiB
GDScript
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
|
|
}
|