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)