95 lines
2.8 KiB
GDScript
95 lines
2.8 KiB
GDScript
class_name BattleCutsceneAction
|
|
|
|
static func battleDecisionCallable(_params:Dictionary) -> int:
|
|
print("Executing battle action...")
|
|
await UI.TEXTBOX.setTextAndWait("Performing battle decision")
|
|
var decision:BattleDecision = _params["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)
|
|
|
|
# Determine fighters and whether they're AI or player controlled
|
|
var playerFighters:Array[BattleFighter] = []
|
|
var aiFighters:Array[BattleFighter] = []
|
|
|
|
for fighter:BattleFighter in BATTLE.fighterMap.values():
|
|
if !fighter || !fighter.canPlayerMakeDecision():
|
|
continue
|
|
playerFighters.append(fighter)
|
|
|
|
for fighter:BattleFighter in BATTLE.fighterMap.values():
|
|
if !fighter || !fighter.canMakeDecision():
|
|
continue
|
|
if fighter in playerFighters:
|
|
continue
|
|
aiFighters.append(fighter)
|
|
|
|
# Get decisions
|
|
var decisions:Array[BattleDecision] = []
|
|
var playerDecisions = await BATTLE.battleScene.getBattleDecisions(playerFighters)
|
|
decisions.append_array(playerDecisions)
|
|
|
|
for fighter in aiFighters:
|
|
var decision = fighter.getAIDecision()
|
|
if decision != null:
|
|
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
|
|
}
|