
- The player and enemy were using a cast progress variable that was part of the spell object, so they were altering it at the same time
73 lines
2.7 KiB
GDScript
73 lines
2.7 KiB
GDScript
extends Node
|
|
|
|
@onready var data: Data = get_node("/root/Root/Data")
|
|
@onready var castIndicator: CastIndicator = get_node("/root/Root/Arena/CastIndicator")
|
|
|
|
@export var avatar: Combatant
|
|
|
|
var casting = false
|
|
var spell: Spell
|
|
var spellIndex: int
|
|
var timer: float = 0
|
|
var anim: AnimationBase
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
avatar.connect("stunned", stunned)
|
|
#connect(data.player.stunned, stunned)
|
|
data.spellbook.initCooldowns()
|
|
for spel: Spell in data.spellbook.spells:
|
|
if (spel == null): continue
|
|
if !data.animations.has(spel.animation):
|
|
data.animations[spel.animation] = load(spel.animation)
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
if !casting:
|
|
for i in range(data.spellbook.spells.size()):
|
|
if Input.is_action_just_pressed("Spell" + str(i)) && data.spellbook.cooldowns[i] == 0:
|
|
casting = true
|
|
spell = data.spellbook.spells[i]
|
|
spellIndex = i
|
|
castIndicator.show()
|
|
castIndicator.setDirs(spell.castCombo[0], spell.castCombo[1])
|
|
anim = data.animations[spell.animation].instantiate()
|
|
anim.setProgress(0, spell.castCombo.size())
|
|
get_node("/root").add_child(anim)
|
|
timer = 0
|
|
else:
|
|
timer += delta
|
|
if (Input.is_action_just_pressed(spell.castCombo[avatar.castProgress])):
|
|
avatar.castProgress += 1
|
|
anim.setProgress(avatar.castProgress)
|
|
|
|
if avatar.castProgress == spell.castCombo.size() - 1:
|
|
castIndicator.setDirs(spell.castCombo[avatar.castProgress])
|
|
elif avatar.castProgress < spell.castCombo.size() - 1:
|
|
castIndicator.setDirs(spell.castCombo[avatar.castProgress], spell.castCombo[avatar.castProgress + 1])
|
|
|
|
if avatar.castProgress == spell.castCombo.size():
|
|
casting = false
|
|
avatar.castProgress = 0
|
|
avatar.renderer.play("attack1")
|
|
data.spellbook.cooldowns[spellIndex] = spell.cooldown
|
|
castIndicator.hide()
|
|
data.opponent.alterHealth(-spell.damage, false)
|
|
elif (timer >= spell.timeout || Input.is_action_just_pressed("up") || Input.is_action_just_pressed("down") || Input.is_action_just_pressed("left") || Input.is_action_just_pressed("right")):
|
|
avatar.alterHealth(-spell.backfireStrength, true)
|
|
casting = false
|
|
anim.castFailed()
|
|
avatar.castProgress = 0
|
|
data.spellbook.cooldowns[spellIndex] = spell.cooldown * (float(avatar.castProgress) / float(spell.castCombo.size()))
|
|
castIndicator.hide()
|
|
|
|
for i in range(data.spellbook.cooldowns.size()):
|
|
data.spellbook.cooldowns[i] -= delta
|
|
if data.spellbook.cooldowns[i] < 0: data.spellbook.cooldowns[i] = 0
|
|
|
|
func stunned():
|
|
casting = false
|
|
avatar.castProgress = 0
|
|
data.spellbook.cooldowns[spellIndex] = spell.cooldown * (float(avatar.castProgress) / float(spell.castCombo.size()))
|
|
castIndicator.hide()
|