GUI/AI improvements...
This commit is contained in:
@@ -7,7 +7,6 @@ extends AIScriptModule
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var root
|
||||
var skel
|
||||
var hair_skel
|
||||
var name
|
||||
@@ -41,14 +40,16 @@ var init_blackboard = {
|
||||
"dot": 0.0
|
||||
}
|
||||
|
||||
func look_at(ch):
|
||||
func look_at(tick, ch):
|
||||
var root = get_character(tick)
|
||||
var current = root.global_transform
|
||||
var at = ch.global_transform.origin
|
||||
at.y = current.origin.y
|
||||
root.global_transform = current.looking_at(at, Vector3.UP)
|
||||
|
||||
func combat_event(ev, data):
|
||||
var cam = get_character().get_viewport().get_camera()
|
||||
func combat_event(ev, data, blackboard):
|
||||
var root = blackboard.self
|
||||
var cam = root.get_viewport().get_camera()
|
||||
var player
|
||||
if cam:
|
||||
player = cam.get_meta("player")
|
||||
@@ -62,7 +63,8 @@ func combat_event(ev, data):
|
||||
var dst = where.distance_squared_to(curpos)
|
||||
if dst < guard_distance * guard_distance:
|
||||
if who == player:
|
||||
blackboard_set("guard", true)
|
||||
blackboard["guard"] = true
|
||||
# blackboard_set(tick, "melee_damage", true)
|
||||
"damage":
|
||||
var who = data[0]
|
||||
var weapon = data[1]
|
||||
@@ -72,21 +74,23 @@ func combat_event(ev, data):
|
||||
var dst = where.distance_squared_to(curpos)
|
||||
if dst < attack_distance * attack_distance:
|
||||
if who == player:
|
||||
blackboard_set("melee_damage", true)
|
||||
blackboard["melee_damage"] = true
|
||||
# blackboard_set(tick, "melee_damage", true)
|
||||
|
||||
var initialized = false
|
||||
func init(tick):
|
||||
assert(!initialized)
|
||||
assert(tick)
|
||||
assert(!get_memory(tick).has("initialized"))
|
||||
name = "bandit_ai"
|
||||
root = get_character()
|
||||
var root = get_character(tick)
|
||||
for e in init_blackboard.keys():
|
||||
blackboard_set(e, init_blackboard[e])
|
||||
blackboard_set(tick, e, init_blackboard[e])
|
||||
blackboard_set(tick, "self", root)
|
||||
assert(root.has_meta("skeleton"))
|
||||
rnd = RandomNumberGenerator.new()
|
||||
rnd.randomize()
|
||||
root.add_to_group("bandits")
|
||||
root.add_to_group("bandit")
|
||||
combat.connect("event", self, "combat_event")
|
||||
combat.connect("event", self, "combat_event", [blackboard_get_dict(tick)])
|
||||
|
||||
var character_data = root.get_meta("character_data")
|
||||
if character_data.sex == "female":
|
||||
@@ -105,7 +109,7 @@ func init(tick):
|
||||
for e in conf_behaviors.keys():
|
||||
if !run_behaviors.has(e):
|
||||
run_behaviors[e] = conf_behaviors[e].new()
|
||||
initialized = true
|
||||
get_memory(tick).initialized = true
|
||||
var cooldown = 0.0
|
||||
|
||||
class base_bhv:
|
||||
@@ -432,85 +436,269 @@ var conf_behaviors: = {
|
||||
}
|
||||
|
||||
var pdst = INF
|
||||
func calc_utility(utility: String):
|
||||
class health_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "health") <= 0.0:
|
||||
return 0.0
|
||||
var ret = blackboard_get(tick, "health") / 100.0
|
||||
return clamp(ret, 0.0, 1.0)
|
||||
class no_melee_weapon_equipped_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if !blackboard_get(tick, "melee_weapon_equipped"):
|
||||
return 1.0
|
||||
return 0.0
|
||||
class threat_consideration extends AIUtilityScriptedConsideration:
|
||||
const engage_distance = 20.0
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "enemy_distance") < engage_distance * engage_distance:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class enemy_far_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "enemy_distance") < 1.6 * 1.6:
|
||||
return 0.0
|
||||
return 1.0
|
||||
class half_or_more_stamina_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "stamina") > 50.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class has_melee_weapon_equipped_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "melee_weapon_equipped"):
|
||||
return 1.0
|
||||
return 0.0
|
||||
class melee_attack_ready_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "attack_cooldown") <= 0.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class twenty_or_more_stamina_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "stamina") > 20.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class melee_attack_distance_consideration extends AIUtilityScriptedConsideration:
|
||||
const attack_distance = 2.0
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "enemy_distance") < attack_distance * attack_distance:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class need_healing_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "health") >= 100.0:
|
||||
return 0.0
|
||||
var ret = 1.0 - blackboard_get(tick, "health") / 100.0
|
||||
return clamp(ret, 0.0, 1.0)
|
||||
class need_rest_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "stamina") >= 100.0:
|
||||
return 0.0
|
||||
return clamp(1.0 - blackboard_get(tick, "stamina") / 100.0, 0.0, 1.0)
|
||||
class critical_health_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "health") < 10.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class critical_stamina_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "stamina") < 10.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class flee_or_more_distance_consideration extends AIUtilityScriptedConsideration:
|
||||
const flee_distance = 5.0
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "enemy_distance") >= flee_distance * flee_distance:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class dangerous_distance_consideration extends AIUtilityScriptedConsideration:
|
||||
const flee_distance = 5.0
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "enemy_distance") < flee_distance * flee_distance:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class ready_to_flee_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "flee_cooldown") < 0.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class has_energy_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "stamina") >= 10.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class ready_to_guard_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "guard_cooldown") < 0.0:
|
||||
return 1.0
|
||||
return 0.0
|
||||
class guarding_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "guard"):
|
||||
return 1.0
|
||||
return 0.0
|
||||
class melee_damage_consideration extends AIUtilityScriptedConsideration:
|
||||
func evalute(tick, delta):
|
||||
if blackboard_get(tick, "melee_damage"):
|
||||
return 1.0
|
||||
return 0.0
|
||||
var considerations_data = {
|
||||
"take_melee_weapon": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": no_melee_weapon_equipped_consideration.new(), "score": 1.0},
|
||||
{"c": threat_consideration.new(), "score": 1.0}
|
||||
],
|
||||
},
|
||||
"approach": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": enemy_far_consideration.new(), "score": 1.0},
|
||||
{"c": half_or_more_stamina_consideration.new(), "score": 1.0},
|
||||
{"c": threat_consideration.new(), "score": 1.0}
|
||||
],
|
||||
},
|
||||
"melee_attack": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": has_melee_weapon_equipped_consideration.new(), "score": 1.0},
|
||||
{"c": melee_attack_ready_consideration.new(), "score": 1.0},
|
||||
{"c": twenty_or_more_stamina_consideration.new(), "score": 1.0},
|
||||
{"c": melee_attack_distance_consideration.new(), "score": 1.0}
|
||||
],
|
||||
},
|
||||
"flee": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": ready_to_flee_consideration.new(), "score": 1.0},
|
||||
{"c": has_energy_consideration.new(), "score": 1.0},
|
||||
{"c": dangerous_distance_consideration.new(), "score": 1.0},
|
||||
],
|
||||
},
|
||||
"guard": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": ready_to_guard_consideration.new(), "score": 1.0},
|
||||
{"c": guarding_consideration.new(), "score": 1.0},
|
||||
],
|
||||
},
|
||||
"unconcious": {
|
||||
"considerations": [
|
||||
{"c": critical_health_consideration.new(), "score": 1.0}
|
||||
],
|
||||
},
|
||||
"rest": {
|
||||
"considerations": [
|
||||
{"c": critical_stamina_consideration.new(), "score": 1.0},
|
||||
{"c": flee_or_more_distance_consideration.new(), "score": 1.0}
|
||||
],
|
||||
},
|
||||
"get_melee_damage": {
|
||||
"considerations": [
|
||||
{"c": health_consideration.new(), "score": 1.0},
|
||||
{"c": melee_damage_consideration.new(), "score": 1.0},
|
||||
]
|
||||
}
|
||||
}
|
||||
func calc_utility(tick: AITick, utility: String, delta: float):
|
||||
var v = 0.0
|
||||
if considerations_data.has(utility):
|
||||
v = 1.0
|
||||
for b in considerations_data[utility].considerations:
|
||||
assert(b.c)
|
||||
v *= b.c._evalute(tick, delta) * b.score
|
||||
if v <= 0.0:
|
||||
break
|
||||
match utility:
|
||||
"take_melee_weapon":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("melee_weapon_equipped"):
|
||||
return 0.0
|
||||
else:
|
||||
if blackboard_get("enemy_distance") < engage_distance * engage_distance:
|
||||
return 110.0
|
||||
v *= 110.0
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "melee_weapon_equipped"):
|
||||
# return 0.0
|
||||
# else:
|
||||
# if blackboard_get(tick, "enemy_distance") < engage_distance * engage_distance:
|
||||
# return 110.0
|
||||
"approach":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("enemy_distance") < 1.6 * 1.6:
|
||||
return 0.0
|
||||
if blackboard_get("stamina") > 50.0 && blackboard_get("enemy_distance") < engage_distance * engage_distance:
|
||||
return 10.0 + (blackboard_get("enemy_distance") - 10.0) / 6.0
|
||||
v *= 100.0
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "enemy_distance") < 1.6 * 1.6:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "stamina") > 50.0 && blackboard_get(tick, "enemy_distance") < engage_distance * engage_distance:
|
||||
# return 10.0 + (blackboard_get(tick, "enemy_distance") - 10.0) / 6.0
|
||||
"melee_attack":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("melee_weapon_equipped"):
|
||||
if blackboard_get("attack_cooldown") <= 0.0:
|
||||
var d = attack_distance * attack_distance
|
||||
if blackboard_get("stamina") > 20.0 && blackboard_get("enemy_distance") <= d:
|
||||
return 50.0
|
||||
v *= 50.0
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "melee_weapon_equipped"):
|
||||
# if blackboard_get(tick, "attack_cooldown") <= 0.0:
|
||||
# var d = attack_distance * attack_distance
|
||||
# if blackboard_get(tick, "stamina") > 20.0 && blackboard_get(tick, "enemy_distance") <= d:
|
||||
# return 50.0
|
||||
"flee":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("flee_cooldown") > 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("stamina") <= 50.0 && blackboard_get("stamina") > 10.0 && blackboard_get("enemy_distance") < flee_distance * flee_distance:
|
||||
return 100.0 + clamp((100.0 - blackboard_get("stamina")), 0, 90.0) * 2.0
|
||||
if blackboard_get("stamina") <= 10.0 && blackboard_get("enemy_distance") <= flee_distance * flee_distance * 0.5:
|
||||
return 250.0
|
||||
if blackboard_get("stamina") <= 50.0 && blackboard_get("enemy_distance") < engage_distance * engage_distance:
|
||||
if blackboard_get("randf") < 0.3:
|
||||
return 100.0
|
||||
if blackboard_get("enemy_distance") < 1.4 * 1.4:
|
||||
return 150.0
|
||||
if blackboard_get("health") < 50 && blackboard_get("health") > 15:
|
||||
return 160
|
||||
v *= 300.0
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "flee_cooldown") > 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "stamina") <= 50.0 && blackboard_get(tick, "stamina") > 10.0 && blackboard_get(tick, "enemy_distance") < flee_distance * flee_distance:
|
||||
# return 100.0 + clamp((100.0 - blackboard_get(tick, "stamina")), 0, 90.0) * 2.0
|
||||
# if blackboard_get(tick, "stamina") <= 10.0 && blackboard_get(tick, "enemy_distance") <= flee_distance * flee_distance * 0.5:
|
||||
# return 250.0
|
||||
# if blackboard_get(tick, "stamina") <= 50.0 && blackboard_get(tick, "enemy_distance") < engage_distance * engage_distance:
|
||||
# if blackboard_get(tick, "randf") < 0.3:
|
||||
# return 100.0
|
||||
# if blackboard_get(tick, "enemy_distance") < 1.4 * 1.4:
|
||||
# return 150.0
|
||||
# if blackboard_get(tick, "health") < 50 && blackboard_get(tick, "health") > 15:
|
||||
# return 160
|
||||
"guard":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("guard_cooldown") > 0.0:
|
||||
return 0.0
|
||||
elif blackboard_get("guard"):
|
||||
blackboard_set("guard", false)
|
||||
return 300.0
|
||||
# elif blackboard_get("enemy_distance") < guard_distance * guard_distance * 0.3 && blackboard_get("stamina") > 10.0:
|
||||
if blackboard_get(tick, "guard"):
|
||||
blackboard_set(tick, "guard", false)
|
||||
v *= 900.0
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "guard_cooldown") > 0.0:
|
||||
# return 0.0
|
||||
# elif blackboard_get(tick, "guard"):
|
||||
# blackboard_set(tick, "guard", false)
|
||||
# return 400.0
|
||||
# elif blackboard_get(tick, "enemy_distance") < guard_distance * guard_distance * 0.3 && blackboard_get(tick, "stamina") > 10.0:
|
||||
# return 80
|
||||
# elif blackboard_get("enemy_distance") < attack_distance * attack_distance * 0.3:
|
||||
# elif blackboard_get(tick, "enemy_distance") < attack_distance * attack_distance * 0.3:
|
||||
# return 10.0
|
||||
"unconcious":
|
||||
if blackboard_get("health") < 10:
|
||||
return 2000
|
||||
v *= 2000.0
|
||||
# if blackboard_get(tick, "health") < 10:
|
||||
# return 2000
|
||||
"rest":
|
||||
if blackboard_get("stamina") >= 100.0:
|
||||
return 0.0
|
||||
if blackboard_get("stamina") <= 10.0 && blackboard_get("enemy_distance") >= flee_distance * flee_distance:
|
||||
return 100.0 + blackboard_get("enemy_distance") / 10.0
|
||||
v *= 150.0
|
||||
# if blackboard_get(tick, "stamina") >= 100.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "stamina") <= 10.0 && blackboard_get(tick, "enemy_distance") >= flee_distance * flee_distance:
|
||||
# return 100.0 + blackboard_get(tick, "enemy_distance") / 10.0
|
||||
"get_melee_damage":
|
||||
if blackboard_get("health") <= 0.0:
|
||||
return 0.0
|
||||
if blackboard_get("melee_damage"):
|
||||
blackboard_set("melee_damage", false)
|
||||
print("DAMAGE2 ", blackboard_get("health"))
|
||||
return 1000
|
||||
v *= 3000.0
|
||||
if blackboard_get(tick, "melee_damage"):
|
||||
blackboard_set(tick, "melee_damage", false)
|
||||
# if blackboard_get(tick, "health") <= 0.0:
|
||||
# return 0.0
|
||||
# if blackboard_get(tick, "melee_damage"):
|
||||
# blackboard_set(tick, "melee_damage", false)
|
||||
# print("DAMAGE2 ", blackboard_get(tick, "health"))
|
||||
# return 1000
|
||||
_:
|
||||
assert(false)
|
||||
return 0.0
|
||||
return v
|
||||
var last_behavior
|
||||
func select_behavior():
|
||||
func select_behavior(tick, delta):
|
||||
var best_behavior
|
||||
var best_utility
|
||||
best_behavior = "rest"
|
||||
best_utility = 0.0
|
||||
for e in conf_behaviors.keys():
|
||||
var utility = calc_utility(e)
|
||||
var utility = calc_utility(tick, e, delta)
|
||||
if e == last_behavior:
|
||||
utility *= 2.0
|
||||
if best_utility < utility:
|
||||
@@ -524,21 +712,23 @@ var last_running = []
|
||||
var current_running = []
|
||||
var run_behaviors = {}
|
||||
func update_physics(tick, delta):
|
||||
assert(initialized)
|
||||
assert(get_memory(tick).initialized)
|
||||
var root = get_character(tick)
|
||||
assert(root)
|
||||
var cam = root.get_viewport().get_camera()
|
||||
if !cam:
|
||||
return
|
||||
if !cam.has_meta("player"):
|
||||
return
|
||||
blackboard_set(tick, "self", get_character(tick))
|
||||
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
|
||||
var o = root.global_transform.origin
|
||||
var p = cam.get_meta("player").global_transform
|
||||
pdst = o.distance_squared_to(p.origin)
|
||||
blackboard_set("enemy_distance", pdst)
|
||||
blackboard_set("randf", rnd.randf())
|
||||
blackboard_set("enemy_pos", p.origin)
|
||||
blackboard_set("space", space)
|
||||
blackboard_set(tick, "enemy_distance", pdst)
|
||||
blackboard_set(tick, "randf", rnd.randf())
|
||||
blackboard_set(tick, "enemy_pos", p.origin)
|
||||
blackboard_set(tick, "space", space)
|
||||
# var adest = o + (p.origin - o).normalized() * min(2.0, sqrt(pdst))
|
||||
var adest = p.origin
|
||||
var away = (o - p.origin).normalized()
|
||||
@@ -548,14 +738,14 @@ func update_physics(tick, delta):
|
||||
var enemy_dir: Vector3 = Transform(p.basis, Vector3()).xform(Vector3(0, 0, -1))
|
||||
var root_dir: Vector3 = Transform(root.global_transform.basis, Vector3()).xform(Vector3(0, 0, -1))
|
||||
var dot = root_dir.dot(enemy_dir)
|
||||
blackboard_set("dot", dot)
|
||||
blackboard_set(tick, "dot", dot)
|
||||
|
||||
var prev_state = state
|
||||
match state:
|
||||
0:
|
||||
last_running = current_running.duplicate()
|
||||
current_running = []
|
||||
var bhv = select_behavior()
|
||||
var bhv = select_behavior(tick, delta)
|
||||
if last_bhv != bhv:
|
||||
# print("behavior: ", bhv)
|
||||
last_bhv = bhv
|
||||
@@ -591,10 +781,10 @@ func update_physics(tick, delta):
|
||||
if !e in last_running:
|
||||
if !e.active:
|
||||
e.activate()
|
||||
e.run(delta, blackboard_get_dict())
|
||||
e.run(delta, blackboard_get_dict(tick))
|
||||
#FIXME: mess :(
|
||||
if e == run_behaviors["flee"]:
|
||||
blackboard_set("flee_cooldown", 2.0 + rnd.randf() * 3.0)
|
||||
blackboard_set(tick, "flee_cooldown", 2.0 + rnd.randf() * 3.0)
|
||||
if e.finished && e.active:
|
||||
# print("in current run but finished")
|
||||
e.stop()
|
||||
@@ -609,16 +799,16 @@ func update_physics(tick, delta):
|
||||
state = 3
|
||||
3:
|
||||
state = 0
|
||||
if blackboard_get("stamina") < 100.0:
|
||||
blackboard_set("stamina", blackboard_get("stamina") + delta)
|
||||
if blackboard_get("attack_cooldown") > 0.0:
|
||||
blackboard_set("attack_cooldown", blackboard_get("attack_cooldown") - delta)
|
||||
if blackboard_get("guard_cooldown") > 0.0:
|
||||
blackboard_set("guard_cooldown", blackboard_get("guard_cooldown") - delta)
|
||||
if blackboard_get("flee_cooldown") > 0.0:
|
||||
blackboard_set("flee_cooldown", blackboard_get("flee_cooldown") - delta)
|
||||
blackboard_set("stamina", clamp(blackboard_get("stamina"), 0, 100.0))
|
||||
blackboard_set("health", clamp(blackboard_get("health"), 0, 100.0))
|
||||
if blackboard_get(tick, "stamina") < 100.0:
|
||||
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") + delta)
|
||||
if blackboard_get(tick, "attack_cooldown") > 0.0:
|
||||
blackboard_set(tick, "attack_cooldown", blackboard_get(tick, "attack_cooldown") - delta)
|
||||
if blackboard_get(tick, "guard_cooldown") > 0.0:
|
||||
blackboard_set(tick, "guard_cooldown", blackboard_get(tick, "guard_cooldown") - delta)
|
||||
if blackboard_get(tick, "flee_cooldown") > 0.0:
|
||||
blackboard_set(tick, "flee_cooldown", blackboard_get(tick, "flee_cooldown") - delta)
|
||||
blackboard_set(tick, "stamina", clamp(blackboard_get(tick, "stamina"), 0, 100.0))
|
||||
blackboard_set(tick, "health", clamp(blackboard_get(tick, "health"), 0, 100.0))
|
||||
return ERR_BUSY
|
||||
func update(tick, delta):
|
||||
return ERR_BUSY
|
||||
|
||||
Reference in New Issue
Block a user