Files
Dawn-Godot/battle/Battle.gd
2026-01-11 20:08:44 -06:00

66 lines
1.7 KiB
GDScript

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)