139 lines
3.5 KiB
GDScript3
139 lines
3.5 KiB
GDScript3
extends AIScriptModule
|
|
|
|
|
|
# Declare member variables here. Examples:
|
|
# var a = 2
|
|
# var b = "text"
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
var root
|
|
var skel
|
|
var hair_skel
|
|
var name
|
|
|
|
var garments_female_lingerie = ["female-panties1", "female-bra1"]
|
|
var garments_head_female = []
|
|
var garments_male_lingerie = ["male-panties1"]
|
|
var garments_head_male = []
|
|
var garments_female_main = ["female-shirt_skirt1"]
|
|
var garments_male_main = ["male-pants1", "male-shoes1"]
|
|
var basedir = "res://scenes/clothes/"
|
|
var material_female = preload("res://scenes/clothes/nun-clothes.material")
|
|
var material_male = preload("res://scenes/clothes/clothes-male.material")
|
|
|
|
var state = 0
|
|
var health = 100.0
|
|
var stamina = 100.0
|
|
|
|
func init():
|
|
name = "bandit_ai"
|
|
root = get_character()
|
|
assert(root.has_meta("skeleton"))
|
|
root.add_to_group("students")
|
|
root.add_to_group("student")
|
|
|
|
var character_data = root.get_meta("character_data")
|
|
if character_data.sex == "female":
|
|
var g = garments_female_lingerie
|
|
var h = []
|
|
g += garments_female_main
|
|
h += garments_head_female
|
|
characters.call_deferred("setup_garments", root, g, h, material_female)
|
|
else:
|
|
var g = garments_male_lingerie
|
|
var h = []
|
|
g += garments_male_main
|
|
h += garments_head_male
|
|
characters.call_deferred("setup_garments", root, g, h, material_male)
|
|
state = 0
|
|
var cooldown = 0.0
|
|
func update_physics(delta):
|
|
var cam = root.get_viewport().get_camera()
|
|
if !cam:
|
|
return
|
|
if !cam.has_meta("player"):
|
|
return
|
|
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
|
|
var o = root.global_transform.origin
|
|
var p = cam.get_meta("player").global_transform
|
|
var pdst = o.distance_squared_to(p.origin)
|
|
var adest = o + (p.origin - o).normalized() * 3.0
|
|
var fdest = o + (o - p.origin).normalized() * 3.0
|
|
var cmdq = []
|
|
if root.has_meta("cmdqueue"):
|
|
cmdq = root.get_meta("cmdqueue")
|
|
match state:
|
|
0:
|
|
if stamina < 100.0:
|
|
stamina += delta
|
|
if stamina > 50.0 && pdst < 100.0 && pdst > 8.0:
|
|
var skel = root.get_meta("skeleton")
|
|
var wslot = skel.get_node("wrist_r/weapon_right")
|
|
wslot.set_meta("owner", root)
|
|
inventory.equip(wslot, "s_dagger")
|
|
# walk to enemy
|
|
state = 10
|
|
elif stamina > 50.0 && pdst <= 8.0:
|
|
# melee attack enemy
|
|
state = 20
|
|
elif stamina <= 50.0 && stamina > 10.0 && pdst < 50.0:
|
|
# flee away
|
|
state = 30
|
|
elif stamina <= 10.0 && pdst <= 16.0:
|
|
# still flee away
|
|
state = 30
|
|
elif stamina <= 10.0 && pdst > 16.0:
|
|
# rest
|
|
state = 40
|
|
10:
|
|
# walk to enemy (player)
|
|
stamina -= 4 * delta
|
|
var dest = adest
|
|
cmdq.push_back(["walkto", dest, 1.5, 2])
|
|
state = 11
|
|
11:
|
|
# wait for start walking
|
|
if root.has_meta("cmdq_walk"):
|
|
characters.set_walk_speed(root, 0.5, 0)
|
|
state = 12
|
|
12:
|
|
# finished walking
|
|
stamina -= 4 * delta
|
|
if !root.has_meta("cmdq_walk"):
|
|
state = 0
|
|
20:
|
|
# attack
|
|
stamina -= 3500 * delta
|
|
characters.animation_node_travel(root, "attack-melee1")
|
|
cooldown = 0.8
|
|
state = 21
|
|
21:
|
|
cooldown -= delta
|
|
stamina -= 5 * delta
|
|
if cooldown <= 0.0:
|
|
state = 0
|
|
30:
|
|
# walk away from enemy (player)
|
|
stamina -= 15 * delta
|
|
var dest = fdest
|
|
cmdq.push_back(["walkto", dest, 1.5, 2])
|
|
state = 31
|
|
31:
|
|
# wait for start fleeing
|
|
if root.has_meta("cmdq_walk"):
|
|
characters.set_walk_speed(root, 0.65, 0)
|
|
state = 32
|
|
32:
|
|
# finished fleeing
|
|
stamina -= 15 * delta
|
|
if !root.has_meta("cmdq_walk"):
|
|
state = 0
|
|
40:
|
|
stamina += 15500.0 * delta
|
|
if stamina > 90.0:
|
|
state = 0
|
|
stamina = clamp(stamina, 0, 100.0)
|
|
root.set_meta("cmdqueue", cmdq)
|
|
|