2019-11-27 11:22:04 +01:00
|
|
|
extends EntityAI
|
|
|
|
class_name EntityAIGD
|
|
|
|
|
|
|
|
# Copyright Péter Magyar relintai@gmail.com
|
|
|
|
# MIT License, functionality from this class needs to be protable to the entity spell system
|
|
|
|
|
2020-01-31 20:01:34 +01:00
|
|
|
# Copyright (c) 2019-2020 Péter Magyar
|
2019-12-01 23:21:48 +01:00
|
|
|
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
|
|
# in the Software without restriction, including without limitation the rights
|
|
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
|
|
# furnished to do so, subject to the following conditions:
|
|
|
|
#
|
|
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
|
|
# copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
|
# SOFTWARE.
|
|
|
|
|
2019-11-27 11:22:04 +01:00
|
|
|
var _data : Dictionary = {
|
|
|
|
"target_aura_spells": {},
|
|
|
|
"spells": []
|
|
|
|
}
|
|
|
|
|
2020-02-21 14:09:43 +01:00
|
|
|
func _ready():
|
|
|
|
pass
|
|
|
|
|
2019-11-27 11:22:04 +01:00
|
|
|
func _on_set_owner():
|
|
|
|
if not is_instance_valid(owner):
|
|
|
|
return
|
|
|
|
|
|
|
|
if not owner.sentity_data:
|
|
|
|
return
|
|
|
|
|
|
|
|
var ent_data : EntityData = owner.sentity_data
|
|
|
|
|
|
|
|
if not ent_data.entity_class_data:
|
|
|
|
return
|
|
|
|
|
|
|
|
var class_data : EntityClassData = ent_data.entity_class_data
|
|
|
|
|
|
|
|
for i in range(class_data.get_num_spells()):
|
|
|
|
var spell : Spell = class_data.get_spell(i)
|
|
|
|
|
|
|
|
if spell.get_num_target_aura_applys() > 0:
|
|
|
|
var aura : Aura = spell.get_target_aura_apply(0)
|
|
|
|
|
|
|
|
if not _data["target_aura_spells"].has(aura.aura_group):
|
|
|
|
_data["target_aura_spells"][aura.aura_group] = []
|
|
|
|
|
|
|
|
_data["target_aura_spells"][aura.aura_group].append({ "aura_id": aura.id, "spell_id": spell.id, "rank": spell.rank })
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
_data["spells"].append(spell.id)
|
|
|
|
|
|
|
|
for key in _data["target_aura_spells"]:
|
|
|
|
var arr : Array = _data["target_aura_spells"][key]
|
|
|
|
|
|
|
|
arr.sort_custom(self, "sort_spells_by_rank")
|
|
|
|
|
|
|
|
|
|
|
|
func _update(delta):
|
|
|
|
if owner.ai_state == EntityEnums.AI_STATE_ATTACK:
|
|
|
|
attack(delta)
|
|
|
|
|
|
|
|
func attack(delta):
|
|
|
|
var target : Entity = owner.starget
|
|
|
|
|
|
|
|
if target == null:
|
|
|
|
owner.ai_state = EntityEnums.AI_STATE_REGENERATE
|
|
|
|
owner.target_movement_direction = Vector2()
|
|
|
|
return
|
|
|
|
|
|
|
|
var cast : bool = false
|
|
|
|
if not owner.gets_has_global_cooldown():
|
|
|
|
var taspellsdict : Dictionary = _data["target_aura_spells"]
|
|
|
|
|
|
|
|
for taskey in taspellsdict.keys():
|
|
|
|
for tas in taspellsdict[taskey]:
|
|
|
|
var spell_id : int = tas["spell_id"]
|
|
|
|
|
|
|
|
if not owner.hass_spell_id(spell_id):
|
|
|
|
continue
|
|
|
|
|
|
|
|
if taskey == null:
|
2020-02-26 21:22:30 +01:00
|
|
|
if target.gets_aura_by(owner, tas["aura_id"]) == null and not owner.hass_cooldown(spell_id):
|
2019-11-27 11:22:04 +01:00
|
|
|
owner.crequest_spell_cast(spell_id)
|
|
|
|
cast = true
|
|
|
|
break
|
|
|
|
else:
|
2020-02-26 21:22:30 +01:00
|
|
|
if target.gets_aura_with_group_by(owner, taskey) == null and not owner.hass_cooldown(spell_id):
|
2019-11-27 11:22:04 +01:00
|
|
|
owner.crequest_spell_cast(spell_id)
|
|
|
|
cast = true
|
|
|
|
break
|
|
|
|
if cast:
|
|
|
|
break
|
|
|
|
|
|
|
|
if not cast:
|
|
|
|
var sps : Array = _data["spells"]
|
|
|
|
|
|
|
|
for spell_id in sps:
|
|
|
|
if not owner.hass_spell_id(spell_id):
|
|
|
|
continue
|
|
|
|
|
|
|
|
if not owner.hass_cooldown(spell_id):
|
|
|
|
owner.crequest_spell_cast(spell_id)
|
|
|
|
cast = true
|
|
|
|
break
|
|
|
|
|
|
|
|
if owner.sis_casting():
|
|
|
|
owner.target_movement_direction = Vector2()
|
|
|
|
return
|
|
|
|
|
2020-02-21 14:09:43 +01:00
|
|
|
owner.target_movement_direction = Vector2()
|
|
|
|
|
2020-01-02 23:02:45 +01:00
|
|
|
var dir : Vector3 = target.get_body().translation - owner.get_body().translation
|
2020-02-21 14:09:43 +01:00
|
|
|
var l = dir.length()
|
2019-11-27 11:22:04 +01:00
|
|
|
|
2020-02-21 14:09:43 +01:00
|
|
|
if l > 2.5:
|
|
|
|
owner.target_movement_direction = Vector2(dir.x, dir.z)
|
2019-11-27 11:22:04 +01:00
|
|
|
|
|
|
|
func sort_spells_by_rank(a, b):
|
|
|
|
if a == null or b == null:
|
|
|
|
return true
|
|
|
|
|
|
|
|
return a["rank"] > b["rank"]
|