85 lines
2.2 KiB
GDScript
85 lines
2.2 KiB
GDScript
extends NpcScript
|
|
|
|
#
|
|
const QUEST_ID : int = ProgressCommons.Quest.DESERT_DEEP_XAKELBAEL
|
|
|
|
const exitDelay : float = 8.0
|
|
const exitPosition : Vector2 = Vector2(1760, 2533)
|
|
|
|
#
|
|
var player : PlayerAgent = null
|
|
var playerModifier : StatModifier = null
|
|
|
|
#
|
|
func OnStart():
|
|
Callback.PlugCallback(npc.ready, DisableAIBehaviour)
|
|
|
|
func DisableAIBehaviour():
|
|
npc.aiBehaviour = AICommons.Behaviour.NONE
|
|
AI.Stop(npc)
|
|
|
|
func OnAreaEnter(_player : PlayerAgent):
|
|
if IsVisible() and _player and not _player.ownScript:
|
|
var questState : int = _player.progress.GetQuest(QUEST_ID)
|
|
if questState != ProgressCommons.DESERT_DEEP_XAKELBAEL.DEFEATED:
|
|
player = _player
|
|
Callback.OneShotCallback(player.tree_exiting, OnPlayerLeft)
|
|
npc.Interact(player)
|
|
|
|
func OnPlayerLeft():
|
|
RemovePlayerModifier()
|
|
if player:
|
|
NpcCommons.SetQuest(player, QUEST_ID, ProgressCommons.DESERT_DEEP_XAKELBAEL.INACTIVE)
|
|
player = null
|
|
|
|
# Player modifier
|
|
func AddPlayerModifier():
|
|
if not playerModifier and player:
|
|
playerModifier = AddModifier(CellCommons.Modifier.DodgeRate, 10000, player)
|
|
|
|
func RemovePlayerModifier():
|
|
if playerModifier and player:
|
|
RemoveModifier(playerModifier, player)
|
|
playerModifier = null
|
|
|
|
# Actions
|
|
func StartFight():
|
|
NpcCommons.SetQuest(player, QUEST_ID, ProgressCommons.DESERT_DEEP_XAKELBAEL.FIGHTING)
|
|
|
|
SetVisible(false)
|
|
AddPlayerModifier()
|
|
|
|
var mobs : Array[MonsterAgent] = Spawn(npc.data._id, 1, npc.position, Vector2i.DOWN)
|
|
if not mobs.is_empty():
|
|
var monsterAgent : MonsterAgent = mobs[0]
|
|
monsterAgent.agent_killed.connect(OnMonsterKilled)
|
|
AI.Refresh(monsterAgent)
|
|
|
|
func OnMonsterKilled(mob : BaseAgent):
|
|
RemovePlayerModifier()
|
|
|
|
npc.position = mob.position
|
|
RemoveAgent(mob)
|
|
SetState(ActorCommons.State.DEATH)
|
|
SetVisible(true)
|
|
|
|
NpcCommons.SetQuest(player, QUEST_ID, ProgressCommons.DESERT_DEEP_XAKELBAEL.DEFEATED)
|
|
|
|
if player and ActorCommons.IsAlive(player) and not player.ownScript:
|
|
player.AddScript(npc)
|
|
if player.ownScript:
|
|
player.ownScript.ApplyStep()
|
|
|
|
func RunAway():
|
|
if player:
|
|
Callback.ClearOneShot(player.tree_exiting)
|
|
player = null
|
|
|
|
SetState(ActorCommons.State.IDLE)
|
|
|
|
AddModifier(CellCommons.Modifier.WalkSpeed, 200)
|
|
|
|
AI.Reset(npc)
|
|
npc.WalkToward(exitPosition)
|
|
AddTimer(npc, exitDelay, WorldAgent.RemoveAgent.bind(npc))
|