Compare commits

..

4 Commits

Author SHA1 Message Date
Segey Lapin
30ac134af9 Now support modular AI 2022-01-14 22:22:25 +03:00
Segey Lapin
dfbd2f34a5 GUI/AI improvements... 2022-01-09 02:40:04 +03:00
Segey Lapin
fedb6a38e1 AI can 'die' now; blackboard work 2022-01-04 06:45:16 +03:00
Segey Lapin
2573492f59 Implemented combat; disabled palace for now 2021-12-29 01:43:12 +03:00
29 changed files with 209736 additions and 146091 deletions

View File

@@ -39,20 +39,20 @@ var roommates = {}
func _ready(): func _ready():
var capsule_male = CapsuleShape.new() var capsule_male = CapsuleShape.new()
capsule_male.radius = 0.3 capsule_male.radius = 0.4
capsule_male.height = 1.2 capsule_male.height = 1.12
capsule_male.margin = 0.05 capsule_male.margin = 0.08
var capsule_female = CapsuleShape.new() var capsule_female = CapsuleShape.new()
capsule_female.radius = 0.2 capsule_female.radius = 0.35
capsule_female.height = 1.1 capsule_female.height = 0.9
capsule_female.margin = 0.05 capsule_female.margin = 0.08
CharacterSystemWorld.add_character_scene(female, {}, "female") CharacterSystemWorld.add_character_scene(female, {}, "female")
CharacterSystemWorld.add_character_scene(male, {}, "male") CharacterSystemWorld.add_character_scene(male, {}, "male")
for k in modules.keys(): for k in modules.keys():
CharacterSystemWorld.add_module(k, modules[k]) CharacterSystemWorld.add_module(k, modules[k])
CharacterSystemWorld.set_face_ctrl_scene(face_ctrl) CharacterSystemWorld.set_face_ctrl_scene(face_ctrl)
CharacterSystemWorld.add_character_shape(capsule_female, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.751, 0)), "female") CharacterSystemWorld.add_character_shape(capsule_female, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.805, 0)), "female")
CharacterSystemWorld.add_character_shape(capsule_male, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.899, 0)), "male") CharacterSystemWorld.add_character_shape(capsule_male, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.965, 0)), "male")
set_root_motion_mod(Transform()) set_root_motion_mod(Transform())
var fd = File.new() var fd = File.new()
fd.open("res://data/names.json", File.READ) fd.open("res://data/names.json", File.READ)
@@ -101,6 +101,7 @@ func _ready():
data_hair_materials[mat] = load(mat) data_hair_materials[mat] = load(mat)
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "male") CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "male")
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "female") CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "female")
CharacterSystemWorld.create_character_pool(1024)
assert(male_faces.size() > 0) assert(male_faces.size() > 0)
assert(female_faces.size() > 0) assert(female_faces.size() > 0)
assert(male_hairs.size() > 0) assert(male_hairs.size() > 0)
@@ -159,114 +160,25 @@ func get_hair_node(sc: Node) -> Node:
return sc.get_node(e) return sc.get_node(e)
assert(0) assert(0)
return null return null
func compose_kinematic_character(g, enable_modules = [], face = -1, hair = -1, hair_mat = -1): #func compose_kinematic_character(g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
return CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat) # var id = create_character_in_pool(
var body = KinematicBody.new() # return CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
var cshape = CollisionShape.new()
body.add_child(cshape)
var capsule = CapsuleShape.new()
var character_data = {
"sex": g,
"modules": enable_modules
}
var face_scene: PackedScene
var hair_scene: PackedScene
var face_i: Node
var hair_i: Node
var face_node: Node
var hair_node: Node
match g:
"female":
if face == -1:
face = rnd.randi() % female_faces.size()
if hair == -1:
hair = rnd.randi() % female_hairs.size()
face_scene = mesh_female_faces[female_faces[face]]
hair_scene = mesh_female_hairs[female_hairs[hair]]
capsule.radius = 0.2
capsule.height = 1.1
capsule.margin = 0.05
cshape.translation.x = 0
cshape.translation.y = 0.751
cshape.translation.z = 0
cshape.rotation = Vector3(-PI/2.0, 0, 0)
var i = female.instance()
body.add_child(i)
i.transform = Transform()
face_node = get_face_node(i)
hair_node = get_hair_node(i)
"male":
if face == -1:
face = rnd.randi() % male_faces.size()
if hair == -1:
hair = rnd.randi() % male_hairs.size()
face_scene = mesh_male_faces[male_faces[face]]
hair_scene = mesh_male_hairs[male_hairs[hair]]
capsule.radius = 0.3
capsule.height = 1.2
capsule.margin = 0.05
cshape.translation.x = 0
cshape.translation.y = 0.899
cshape.translation.z = 0
cshape.rotation = Vector3(-PI/2.0, 0, 0)
var i = male.instance()
body.add_child(i)
i.transform = Transform()
face_node = get_face_node(i)
hair_node = get_hair_node(i)
assert(face_node)
face_i = face_scene.instance()
face_i.add_to_group("face")
prepare_extra_skeleton(face_i, "face")
hair_i = hair_scene.instance()
hair_i.add_to_group("hair")
prepare_extra_skeleton(hair_i, "hair")
if hair_mat == -1:
hair_mat = rnd.randi() % hair_materials.size()
var hmat = data_hair_materials[hair_materials[hair_mat]]
assert(hmat)
set_hair_material(hair_i, hmat)
for e in face_node.get_children():
e.queue_free()
for e in hair_node.get_children():
e.queue_free()
face_node.add_child(face_i)
hair_node.add_child(hair_i)
var face_ctrl_i = face_ctrl.instance()
face_ctrl_i.active = true
face_i.add_child(face_ctrl_i)
face_i.set_meta("body", body)
body.set_meta("face_control", face_ctrl_i)
body.set_meta("face_playback", "parameters/state/playback")
face_ctrl_i.add_to_group("face")
face_i.transform = Transform()
character_data.face = face
character_data.hair = hair
character_data.hair_mat = hair_mat
cshape.shape = capsule
body.set_meta("character_data", character_data)
for e in enable_modules:
assert(modules.has(e))
if modules.has(e):
assert(modules[e])
var obj = modules[e].new()
body.add_child(obj)
setup_character_physics(body)
body.add_to_group("character")
return body
func replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1): func replace_player_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
assert(obj) assert(obj)
var xform = obj.global_transform var xform = obj.global_transform
var p = obj.get_parent() var p = obj.get_parent()
obj.queue_free() obj.queue_free()
CharacterSystemWorld.create_player_character_in_pool(enable_modules, xform)
var body = CharacterSystemWorld.create_character_visual(0)
# var body = compose_kinematic_character(g, enable_modules, face, hair, hair_mat) # var body = compose_kinematic_character(g, enable_modules, face, hair, hair_mat)
var body = CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat) # var body = CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
p.add_child(body) # p.add_child(body)
body.global_transform = xform # body.global_transform = xform
var orientation = Transform() # var orientation = Transform()
orientation.basis = xform.basis # orientation.basis = xform.basis
body.set_meta("orientation", orientation) # body.set_meta("orientation", orientation)
return body return body
const basedir = "res://scenes/clothes/" const basedir = "res://scenes/clothes/"
#func prepare_extra_skeleton(obj, g): #func prepare_extra_skeleton(obj, g):
@@ -628,6 +540,6 @@ func _physics_process(delta):
var player = get_player() var player = get_player()
if !player: if !player:
return return
if player.has_meta("animation_tree") && !player.has_meta("vehicle"): # if player.has_meta("animation_tree") && !player.has_meta("vehicle"):
if streaming.can_spawn: # if streaming.can_spawn:
character_physics(player) # character_physics(player)

View File

@@ -40,6 +40,7 @@ func equip(obj, item_name):
print("EQUIP ", item_name, " OK", obj, r) print("EQUIP ", item_name, " OK", obj, r)
obj.set_meta("equipped", item_name) obj.set_meta("equipped", item_name)
c.set_meta("owner", obj.get_meta("owner")) c.set_meta("owner", obj.get_meta("owner"))
c.set_meta("item_name", item_name)
func register_pick_up(m, obj, item_name): func register_pick_up(m, obj, item_name):
var mdata = { var mdata = {
"method": "pick_up", "method": "pick_up",

View File

@@ -60,6 +60,7 @@ class Grabbing:
var cam_to = m.origin + Vector3.UP * 1.4 var cam_to = m.origin + Vector3.UP * 1.4
emit_signal("enable_cinematic_camera", cam_where, cam_to) emit_signal("enable_cinematic_camera", cam_where, cam_to)
func reset_character(b): func reset_character(b):
assert(b)
b.remove_meta("cmdqueue") b.remove_meta("cmdqueue")
b.remove_meta("cmdq_walk") b.remove_meta("cmdq_walk")
b.remove_meta("climb") b.remove_meta("climb")

View File

@@ -175,7 +175,7 @@ func setup_first_town(site):
palace_aabb = palace_aabb.grow(48) palace_aabb = palace_aabb.grow(48)
print(palace_aabb) print(palace_aabb)
aabbs.push_back(palace_aabb) aabbs.push_back(palace_aabb)
stream_obj("palace", Transform(Basis(), center)) # stream_obj("palace", Transform(Basis(), center))
for p in range(radial_points.size()): for p in range(radial_points.size()):
var ep = radial_points[p] var ep = radial_points[p]
@@ -278,7 +278,7 @@ func _ready():
# Traffic.set_deny_physics() # Traffic.set_deny_physics()
# Traffic.set_physics_distance(Vector3(30, -10, 40)) # Traffic.set_physics_distance(Vector3(30, -10, 40))
# Traffic.set_debug(true) # Traffic.set_debug(true)
Traffic.set_spawn_cooldown(2, 5) Traffic.set_spawn_cooldown(10, 15)
Traffic.set_default_speed(8.5) Traffic.set_default_speed(8.5)
Traffic.add_traffic_vehicle(car) Traffic.add_traffic_vehicle(car)
var water_mat = load("res://water/Water.material") var water_mat = load("res://water/Water.material")
@@ -350,7 +350,8 @@ func _physics_process(delta):
base.push_back("bandit") base.push_back("bandit")
if g.length() > 0: if g.length() > 0:
print(g, " ", base) print(g, " ", base)
characters.replace_character(n, g, base) CharacterSystemWorld.create_character_in_pool(g, base, n.global_transform)
n.queue_free()
elif n.is_in_group("car"): elif n.is_in_group("car"):
var p1 = cam.global_transform.origin var p1 = cam.global_transform.origin
var p2 = n.global_transform.origin var p2 = n.global_transform.origin

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=143 format=2] [gd_scene load_steps=153 format=2]
[ext_resource path="res://scenes/characters/vroid1-female.gltf" type="PackedScene" id=1] [ext_resource path="res://scenes/characters/vroid1-female.gltf" type="PackedScene" id=1]
[ext_resource path="res://scenes/hair/female-hair1.tscn" type="PackedScene" id=2] [ext_resource path="res://scenes/hair/female-hair1.tscn" type="PackedScene" id=2]
@@ -70,6 +70,32 @@ node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendTree" id=15] [sub_resource type="AnimationNodeBlendTree" id=15]
[sub_resource type="AnimationNodeAnimation" id=156]
animation = "fall-back"
[sub_resource type="AnimationNodeTimeScale" id=157]
[sub_resource type="AnimationNodeBlendTree" id=154]
nodes/Animation/node = SubResource( 156 )
nodes/Animation/position = Vector2( 201, 341 )
nodes/TimeScale/node = SubResource( 157 )
nodes/TimeScale/position = Vector2( 440, 320 )
nodes/output/position = Vector2( 680, 320 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=158]
animation = "fall-front"
[sub_resource type="AnimationNodeTimeScale" id=159]
[sub_resource type="AnimationNodeBlendTree" id=155]
nodes/Animation/node = SubResource( 158 )
nodes/Animation/position = Vector2( 161, 293 )
nodes/TimeScale/node = SubResource( 159 )
nodes/TimeScale/position = Vector2( 400, 280 )
nodes/output/position = Vector2( 720, 220 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=16] [sub_resource type="AnimationNodeAnimation" id=16]
animation = "start-grabbed2" animation = "start-grabbed2"
@@ -83,6 +109,33 @@ nodes/TimeScale/position = Vector2( 592, 184 )
nodes/output/position = Vector2( 860, 120 ) nodes/output/position = Vector2( 860, 120 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ] node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=152]
animation = "guard-melee-forward1"
[sub_resource type="AnimationNodeTimeScale" id=153]
[sub_resource type="AnimationNodeBlendTree" id=147]
nodes/Animation/node = SubResource( 152 )
nodes/Animation/position = Vector2( 194, 149 )
nodes/TimeScale/node = SubResource( 153 )
nodes/TimeScale/position = Vector2( 525, 150 )
nodes/output/position = Vector2( 780, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=145]
animation = "guard-melee-backwards1"
[sub_resource type="AnimationNodeTimeScale" id=146]
[sub_resource type="AnimationNodeBlendTree" id=140]
graph_offset = Vector2( 0, -262 )
nodes/Animation/node = SubResource( 145 )
nodes/Animation/position = Vector2( 119, 108 )
nodes/TimeScale/node = SubResource( 146 )
nodes/TimeScale/position = Vector2( 520, 120 )
nodes/output/position = Vector2( 820, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=19] [sub_resource type="AnimationNodeAnimation" id=19]
animation = "female-idle-to-kneel1" animation = "female-idle-to-kneel1"
@@ -126,7 +179,7 @@ nodes/TimeScale/position = Vector2( 580, 100 )
nodes/output/position = Vector2( 1120, 120 ) nodes/output/position = Vector2( 1120, 120 )
nodes/t1/node = SubResource( 26 ) nodes/t1/node = SubResource( 26 )
nodes/t1/position = Vector2( 880, 100 ) nodes/t1/position = Vector2( 880, 100 )
node_connections = [ "output", 0, "t1", "TimeScale", 0, "Animation", "t1", 0, "TimeScale", "t1", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ] node_connections = [ "output", 0, "t1", "t1", 0, "TimeScale", "t1", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=28] [sub_resource type="AnimationNodeAnimation" id=28]
animation = "walk1p2" animation = "walk1p2"
@@ -146,6 +199,7 @@ input_1/name = "state 1"
input_1/auto_advance = true input_1/auto_advance = true
[sub_resource type="AnimationNodeBlendTree" id=33] [sub_resource type="AnimationNodeBlendTree" id=33]
graph_offset = Vector2( -264.489, -30 )
nodes/Animation/node = SubResource( 29 ) nodes/Animation/node = SubResource( 29 )
nodes/Animation/position = Vector2( 140, 100 ) nodes/Animation/position = Vector2( 140, 100 )
"nodes/Animation 2/node" = SubResource( 28 ) "nodes/Animation 2/node" = SubResource( 28 )
@@ -157,7 +211,7 @@ nodes/TimeScale/position = Vector2( 620, 40 )
nodes/Transition/node = SubResource( 32 ) nodes/Transition/node = SubResource( 32 )
nodes/Transition/position = Vector2( 905, 264 ) nodes/Transition/position = Vector2( 905, 264 )
nodes/output/position = Vector2( 1280, 120 ) nodes/output/position = Vector2( 1280, 120 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ] node_connections = [ "output", 0, "Transition", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=34] [sub_resource type="AnimationNodeAnimation" id=34]
animation = "07_01-walk" animation = "07_01-walk"
@@ -185,84 +239,16 @@ nodes/TimeScale/position = Vector2( 580, 120 )
nodes/output/position = Vector2( 840, 140 ) nodes/output/position = Vector2( 840, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ] node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=40]
animation = "walk1p2"
[sub_resource type="AnimationNodeAnimation" id=41]
animation = "walk1p1"
[sub_resource type="AnimationNodeTimeScale" id=42]
[sub_resource type="AnimationNodeTimeScale" id=43]
[sub_resource type="AnimationNodeTransition" id=44]
input_count = 2
input_0/name = "state 0"
input_0/auto_advance = true
input_1/name = "state 1"
input_1/auto_advance = true
[sub_resource type="AnimationNodeBlendTree" id=45]
graph_offset = Vector2( 0, -259 )
nodes/Animation/node = SubResource( 41 )
nodes/Animation/position = Vector2( 200, 80 )
"nodes/Animation 2/node" = SubResource( 40 )
"nodes/Animation 2/position" = Vector2( 200, 280 )
nodes/TimeScale/node = SubResource( 43 )
nodes/TimeScale/position = Vector2( 660, 60 )
"nodes/TimeScale 2/node" = SubResource( 42 )
"nodes/TimeScale 2/position" = Vector2( 580, 260 )
nodes/Transition/node = SubResource( 44 )
nodes/Transition/position = Vector2( 920, 120 )
nodes/output/position = Vector2( 1260, 160 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
[sub_resource type="AnimationNodeAnimation" id=46]
animation = "walk1p2"
[sub_resource type="AnimationNodeAnimation" id=47]
animation = "walk1p1"
[sub_resource type="AnimationNodeTimeScale" id=48]
[sub_resource type="AnimationNodeTimeScale" id=49]
[sub_resource type="AnimationNodeTransition" id=50]
input_count = 2
xfade_time = 0.2
input_0/name = "state 0"
input_0/auto_advance = true
input_1/name = "state 1"
input_1/auto_advance = true
[sub_resource type="AnimationNodeBlendTree" id=51]
graph_offset = Vector2( 0, -294.25 )
nodes/Animation/node = SubResource( 47 )
nodes/Animation/position = Vector2( 208, 136 )
"nodes/Animation 2/node" = SubResource( 46 )
"nodes/Animation 2/position" = Vector2( 230, 287 )
nodes/TimeScale/node = SubResource( 49 )
nodes/TimeScale/position = Vector2( 660, 80 )
"nodes/TimeScale 2/node" = SubResource( 48 )
"nodes/TimeScale 2/position" = Vector2( 680, 260 )
nodes/Transition/node = SubResource( 50 )
nodes/Transition/position = Vector2( 1000, 140 )
nodes/output/position = Vector2( 1260, 140 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
[sub_resource type="AnimationNodeBlendSpace2D" id=52] [sub_resource type="AnimationNodeBlendSpace2D" id=52]
blend_point_0/node = SubResource( 27 ) blend_point_0/node = SubResource( 27 )
blend_point_0/pos = Vector2( 0, 0 ) blend_point_0/pos = Vector2( 0, 0 )
blend_point_1/node = SubResource( 33 ) blend_point_1/node = SubResource( 33 )
blend_point_1/pos = Vector2( 0.2, 0 ) blend_point_1/pos = Vector2( 0.1, 0 )
blend_point_2/node = SubResource( 36 ) blend_point_2/node = SubResource( 36 )
blend_point_2/pos = Vector2( 0.2, -1 ) blend_point_2/pos = Vector2( 0.2, -1 )
blend_point_3/node = SubResource( 39 ) blend_point_3/node = SubResource( 39 )
blend_point_3/pos = Vector2( 0.2, 1 ) blend_point_3/pos = Vector2( 0.2, 1 )
blend_point_4/node = SubResource( 45 ) blend_mode = 1
blend_point_4/pos = Vector2( 0.6, 0 )
blend_point_5/node = SubResource( 51 )
blend_point_5/pos = Vector2( 0.4, 0 )
[sub_resource type="AnimationNodeBlendTree" id=53] [sub_resource type="AnimationNodeBlendTree" id=53]
graph_offset = Vector2( 0, -95 ) graph_offset = Vector2( 0, -95 )
@@ -302,7 +288,7 @@ nodes/TimeScale/position = Vector2( 640, 200 )
nodes/Transition/node = SubResource( 59 ) nodes/Transition/node = SubResource( 59 )
nodes/Transition/position = Vector2( 860, 220 ) nodes/Transition/position = Vector2( 860, 220 )
nodes/output/position = Vector2( 1080, 200 ) nodes/output/position = Vector2( 1080, 200 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ] node_connections = [ "output", 0, "Transition", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=61] [sub_resource type="AnimationNodeAnimation" id=61]
animation = "female-pray-startled1" animation = "female-pray-startled1"
@@ -368,7 +354,7 @@ nodes/attack2/position = Vector2( 1140, 300 )
nodes/output/position = Vector2( 1580, 180 ) nodes/output/position = Vector2( 1580, 180 )
nodes/speed/node = SubResource( 74 ) nodes/speed/node = SubResource( 74 )
nodes/speed/position = Vector2( 540, 60 ) nodes/speed/position = Vector2( 540, 60 )
node_connections = [ "speed", 0, "Animation", "output", 0, "attack2", "attack2", 0, "attack1", "attack2", 1, "TimeScale 2", "attack1", 0, "speed", "attack1", 1, "TimeScale", "TimeScale", 0, "Animation 2", "TimeScale 2", 0, "Animation 3" ] node_connections = [ "speed", 0, "Animation", "output", 0, "attack2", "TimeScale 2", 0, "Animation 3", "attack2", 0, "attack1", "attack2", 1, "TimeScale 2", "attack1", 0, "speed", "attack1", 1, "TimeScale", "TimeScale", 0, "Animation 2" ]
[sub_resource type="AnimationNodeAnimation" id=76] [sub_resource type="AnimationNodeAnimation" id=76]
animation = "dagger-sacrifice-counter-p" animation = "dagger-sacrifice-counter-p"
@@ -566,6 +552,34 @@ switch_mode = 2
switch_mode = 2 switch_mode = 2
auto_advance = true auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=141]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=142]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=143]
[sub_resource type="AnimationNodeStateMachineTransition" id=144]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=148]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=149]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=150]
[sub_resource type="AnimationNodeStateMachineTransition" id=151]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=160]
[sub_resource type="AnimationNodeStateMachineTransition" id=161]
[sub_resource type="AnimationNodeStateMachine" id=110] [sub_resource type="AnimationNodeStateMachine" id=110]
states/attack-melee1/node = SubResource( 135 ) states/attack-melee1/node = SubResource( 135 )
states/attack-melee1/position = Vector2( 1277, 411.193 ) states/attack-melee1/position = Vector2( 1277, 411.193 )
@@ -575,8 +589,16 @@ states/climb1a/node = SubResource( 14 )
states/climb1a/position = Vector2( 947, 503.193 ) states/climb1a/position = Vector2( 947, 503.193 )
states/drive/node = SubResource( 15 ) states/drive/node = SubResource( 15 )
states/drive/position = Vector2( 868, 316.193 ) states/drive/position = Vector2( 868, 316.193 )
states/fall-back/node = SubResource( 154 )
states/fall-back/position = Vector2( 1301.67, 633.193 )
states/fall-front/node = SubResource( 155 )
states/fall-front/position = Vector2( 1357.67, 576.193 )
states/grabbed/node = SubResource( 18 ) states/grabbed/node = SubResource( 18 )
states/grabbed/position = Vector2( 1277, 182.193 ) states/grabbed/position = Vector2( 1290, 90.193 )
states/guard-front-melee1/node = SubResource( 147 )
states/guard-front-melee1/position = Vector2( 1477.6, 336.193 )
states/guard-melee1/node = SubResource( 140 )
states/guard-melee1/position = Vector2( 1200.6, 496.193 )
states/kneel/node = SubResource( 21 ) states/kneel/node = SubResource( 21 )
states/kneel/position = Vector2( 522, 84 ) states/kneel/position = Vector2( 522, 84 )
states/locomotion/node = SubResource( 53 ) states/locomotion/node = SubResource( 53 )
@@ -590,11 +612,11 @@ states/pray-startled/position = Vector2( 294, 316.193 )
states/pray-startled-walk/node = SubResource( 60 ) states/pray-startled-walk/node = SubResource( 60 )
states/pray-startled-walk/position = Vector2( 294, 514.193 ) states/pray-startled-walk/position = Vector2( 294, 514.193 )
states/sacrifice/node = SubResource( 75 ) states/sacrifice/node = SubResource( 75 )
states/sacrifice/position = Vector2( 1023, 135 ) states/sacrifice/position = Vector2( 1547, 101 )
states/sacrificed/node = SubResource( 78 ) states/sacrificed/node = SubResource( 78 )
states/sacrificed/position = Vector2( 1125, 283 ) states/sacrificed/position = Vector2( 1547, 180 )
states/sleeping/node = SubResource( 81 ) states/sleeping/node = SubResource( 81 )
states/sleeping/position = Vector2( 1078, 411.193 ) states/sleeping/position = Vector2( 1045, 348.193 )
states/stand-startled/node = SubResource( 84 ) states/stand-startled/node = SubResource( 84 )
states/stand-startled/position = Vector2( 717, 411.193 ) states/stand-startled/position = Vector2( 717, 411.193 )
states/start_walking/node = SubResource( 115 ) states/start_walking/node = SubResource( 115 )
@@ -607,9 +629,9 @@ states/turn_right/node = SubResource( 126 )
states/turn_right/position = Vector2( 1059, 620.193 ) states/turn_right/position = Vector2( 1059, 620.193 )
states/use_tap/node = SubResource( 85 ) states/use_tap/node = SubResource( 85 )
states/use_tap/position = Vector2( 283, 143.193 ) states/use_tap/position = Vector2( 283, 143.193 )
transitions = [ "locomotion", "passenger", SubResource( 86 ), "passenger", "locomotion", SubResource( 87 ), "passenger", "drive", SubResource( 88 ), "drive", "passenger", SubResource( 89 ), "drive", "locomotion", SubResource( 90 ), "locomotion", "drive", SubResource( 91 ), "sacrifice", "sacrificed", SubResource( 92 ), "sacrificed", "sacrifice", SubResource( 93 ), "locomotion", "kneel", SubResource( 94 ), "kneel", "pray", SubResource( 95 ), "pray", "locomotion", SubResource( 96 ), "pray", "pray-startled", SubResource( 97 ), "pray-startled", "pray-startled-walk", SubResource( 98 ), "sleeping", "locomotion", SubResource( 99 ), "pray-startled-walk", "stand-startled", SubResource( 100 ), "stand-startled", "locomotion", SubResource( 101 ), "locomotion", "grabbed", SubResource( 102 ), "grabbed", "locomotion", SubResource( 103 ), "locomotion", "climb1", SubResource( 104 ), "climb1", "locomotion", SubResource( 105 ), "locomotion", "climb1a", SubResource( 106 ), "climb1a", "locomotion", SubResource( 107 ), "use_tap", "locomotion", SubResource( 108 ), "locomotion", "use_tap", SubResource( 109 ), "locomotion", "start_walking", SubResource( 117 ), "start_walking", "locomotion", SubResource( 118 ), "locomotion", "stop_walking", SubResource( 119 ), "stop_walking", "locomotion", SubResource( 120 ), "locomotion", "tun_left", SubResource( 127 ), "tun_left", "locomotion", SubResource( 128 ), "locomotion", "turn_right", SubResource( 129 ), "turn_right", "locomotion", SubResource( 130 ), "locomotion", "attack-melee1", SubResource( 136 ), "attack-melee1", "locomotion", SubResource( 137 ) ] transitions = [ "locomotion", "passenger", SubResource( 86 ), "passenger", "locomotion", SubResource( 87 ), "passenger", "drive", SubResource( 88 ), "drive", "passenger", SubResource( 89 ), "drive", "locomotion", SubResource( 90 ), "locomotion", "drive", SubResource( 91 ), "sacrifice", "sacrificed", SubResource( 92 ), "sacrificed", "sacrifice", SubResource( 93 ), "locomotion", "kneel", SubResource( 94 ), "kneel", "pray", SubResource( 95 ), "pray", "locomotion", SubResource( 96 ), "pray", "pray-startled", SubResource( 97 ), "pray-startled", "pray-startled-walk", SubResource( 98 ), "sleeping", "locomotion", SubResource( 99 ), "pray-startled-walk", "stand-startled", SubResource( 100 ), "stand-startled", "locomotion", SubResource( 101 ), "locomotion", "grabbed", SubResource( 102 ), "grabbed", "locomotion", SubResource( 103 ), "locomotion", "climb1", SubResource( 104 ), "climb1", "locomotion", SubResource( 105 ), "locomotion", "climb1a", SubResource( 106 ), "climb1a", "locomotion", SubResource( 107 ), "use_tap", "locomotion", SubResource( 108 ), "locomotion", "use_tap", SubResource( 109 ), "locomotion", "start_walking", SubResource( 117 ), "start_walking", "locomotion", SubResource( 118 ), "locomotion", "stop_walking", SubResource( 119 ), "stop_walking", "locomotion", SubResource( 120 ), "locomotion", "tun_left", SubResource( 127 ), "tun_left", "locomotion", SubResource( 128 ), "locomotion", "turn_right", SubResource( 129 ), "turn_right", "locomotion", SubResource( 130 ), "locomotion", "attack-melee1", SubResource( 136 ), "attack-melee1", "locomotion", SubResource( 137 ), "attack-melee1", "guard-melee1", SubResource( 141 ), "guard-melee1", "attack-melee1", SubResource( 142 ), "locomotion", "guard-melee1", SubResource( 143 ), "guard-melee1", "locomotion", SubResource( 144 ), "attack-melee1", "guard-front-melee1", SubResource( 148 ), "guard-front-melee1", "attack-melee1", SubResource( 149 ), "locomotion", "guard-front-melee1", SubResource( 150 ), "guard-front-melee1", "locomotion", SubResource( 151 ), "locomotion", "fall-front", SubResource( 160 ), "locomotion", "fall-back", SubResource( 161 ) ]
start_node = "locomotion" start_node = "locomotion"
graph_offset = Vector2( 176.598, 15.1925 ) graph_offset = Vector2( 496.672, 7.1925 )
[sub_resource type="AnimationNodeBlendTree" id=111] [sub_resource type="AnimationNodeBlendTree" id=111]
graph_offset = Vector2( 445.846, -157.796 ) graph_offset = Vector2( 445.846, -157.796 )
@@ -632,11 +654,19 @@ node_connections = [ "output", 0, "blade_right", "all_scale", 0, "state", "blade
[node name="vroid1-female" instance=ExtResource( 1 )] [node name="vroid1-female" instance=ExtResource( 1 )]
[node name="Skeleton" parent="skeleton" index="0"]
bones/1/bound_children = [ NodePath("hips") ]
bones/25/bound_children = [ NodePath("chest") ]
bones/79/bound_children = [ NodePath("neck") ]
bones/80/bound_children = [ NodePath("head") ]
bones/99/bound_children = [ NodePath("wrist_l") ]
bones/101/bound_children = [ NodePath("wrist_r") ]
[node name="body" parent="skeleton/Skeleton" index="0"] [node name="body" parent="skeleton/Skeleton" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00418961, 0.00654769, 0.00506566 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00418961, 0.00654769, 0.00506566 )
[node name="head" type="BoneAttachment" parent="skeleton/Skeleton" index="2"] [node name="head" type="BoneAttachment" parent="skeleton/Skeleton" index="2"]
transform = Transform( 0.988223, 0.148734, 0.0362569, -0.141467, 0.79667, 0.587692, 0.0585027, -0.585856, 0.808242, -0.0111943, 1.32085, -0.0280195 ) transform = Transform( 0.713409, 0.342413, -0.611461, -0.0945617, 0.911515, 0.400091, 0.694399, -0.227615, 0.682673, -0.0411225, 1.35382, -0.0195896 )
bone_name = "Head" bone_name = "Head"
[node name="marker_talk" type="Spatial" parent="skeleton/Skeleton/head" index="0"] [node name="marker_talk" type="Spatial" parent="skeleton/Skeleton/head" index="0"]
@@ -666,7 +696,7 @@ transform = Transform( 1, -1.24197e-11, 0, 1.06852e-11, 1, -5.82077e-11, 0, 0, 1
[node name="female-face1" parent="skeleton/Skeleton/head/face" index="0" instance=ExtResource( 3 )] [node name="female-face1" parent="skeleton/Skeleton/head/face" index="0" instance=ExtResource( 3 )]
[node name="hips" type="BoneAttachment" parent="skeleton/Skeleton" index="3"] [node name="hips" type="BoneAttachment" parent="skeleton/Skeleton" index="3"]
transform = Transform( 0.989795, 0.0136796, -0.14192, 0.00710856, -0.998924, -0.046698, -0.142409, 0.0452161, -0.988735, 0.000203863, 0.86329, -0.00645694 ) transform = Transform( 0.94223, 0.0611767, 0.329466, 0.0446752, -0.997287, 0.0574523, 0.332118, -0.0394095, -0.942444, 0.000203859, 0.89952, -0.00645694 )
bone_name = "Hips" bone_name = "Hips"
[node name="marker_dagger_sacrifice" type="Spatial" parent="skeleton/Skeleton/hips" index="0"] [node name="marker_dagger_sacrifice" type="Spatial" parent="skeleton/Skeleton/hips" index="0"]
@@ -681,21 +711,21 @@ monitorable = false
shape = SubResource( 2 ) shape = SubResource( 2 )
[node name="wrist_r" type="BoneAttachment" parent="skeleton/Skeleton" index="4"] [node name="wrist_r" type="BoneAttachment" parent="skeleton/Skeleton" index="4"]
transform = Transform( -0.184609, 0.953624, -0.23774, 0.867928, 0.271679, 0.415801, 0.461107, -0.12958, -0.877832, 0.257193, 0.805181, -0.0805364 ) transform = Transform( -0.245569, 0.908447, -0.338258, 0.959945, 0.276457, 0.0455697, 0.134912, -0.313518, -0.939949, 0.210898, 0.839866, 0.0647882 )
bone_name = "wrist_ik_R" bone_name = "wrist_ik_R"
[node name="weapon_right" type="Spatial" parent="skeleton/Skeleton/wrist_r" index="0"] [node name="weapon_right" type="Spatial" parent="skeleton/Skeleton/wrist_r" index="0"]
transform = Transform( 1, 0, 0, 0, -1.62921e-07, 1, 0, -1, -1.62921e-07, -0.08, 0, -0.01 ) transform = Transform( 1, 0, 0, 0, -1.62921e-07, 1, 0, -1, -1.62921e-07, -0.08, 0, -0.01 )
[node name="wrist_l" type="BoneAttachment" parent="skeleton/Skeleton" index="5"] [node name="wrist_l" type="BoneAttachment" parent="skeleton/Skeleton" index="5"]
transform = Transform( -0.252208, -0.871285, 0.421014, -0.924053, 0.346005, 0.162504, -0.287261, -0.348054, -0.892379, -0.275192, 0.827823, -0.00582178 ) transform = Transform( -0.0838252, -0.864731, 0.495188, -0.980276, 0.160814, 0.114885, -0.178979, -0.47579, -0.861156, -0.181656, 0.840334, -0.0498495 )
bone_name = "wrist_ik_L" bone_name = "wrist_ik_L"
[node name="weapon_left" type="Spatial" parent="skeleton/Skeleton/wrist_l" index="0"] [node name="weapon_left" type="Spatial" parent="skeleton/Skeleton/wrist_l" index="0"]
transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0.08, 0, -0.01 ) transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0.08, 0, -0.01 )
[node name="chest" type="BoneAttachment" parent="skeleton/Skeleton" index="6"] [node name="chest" type="BoneAttachment" parent="skeleton/Skeleton" index="6"]
transform = Transform( 0.982621, -0.0259787, 0.183851, 0.0189799, 0.999071, 0.0397199, -0.184712, -0.0355462, 0.982102, -0.00488846, 1.02193, -0.0338627 ) transform = Transform( 0.958586, -0.0332876, -0.283002, 0.0462008, 0.998108, 0.0390467, 0.281199, -0.0505137, 0.958342, -0.00285422, 1.06003, -0.0194018 )
bone_name = "Chest" bone_name = "Chest"
[node name="chest_hurt" type="Area" parent="skeleton/Skeleton/chest" index="0"] [node name="chest_hurt" type="Area" parent="skeleton/Skeleton/chest" index="0"]
@@ -710,7 +740,7 @@ shape = SubResource( 3 )
[node name="MeshInstance" type="MeshInstance" parent="skeleton/Skeleton" index="7"] [node name="MeshInstance" type="MeshInstance" parent="skeleton/Skeleton" index="7"]
[node name="neck" type="BoneAttachment" parent="skeleton/Skeleton" index="8"] [node name="neck" type="BoneAttachment" parent="skeleton/Skeleton" index="8"]
transform = Transform( 0.973501, -0.192912, 0.12289, 0.178008, 0.976401, 0.122607, -0.143648, -0.0974797, 0.984768, 0.0031075, 1.24847, -0.0207927 ) transform = Transform( 0.839515, -0.327886, -0.433348, 0.389612, 0.918993, 0.0594129, 0.378795, -0.218737, 0.899283, -0.0168142, 1.28569, -0.00337323 )
bone_name = "Neck" bone_name = "Neck"
[node name="marker_neck_grab" type="Position3D" parent="skeleton/Skeleton/neck" index="0"] [node name="marker_neck_grab" type="Position3D" parent="skeleton/Skeleton/neck" index="0"]
@@ -721,6 +751,7 @@ visible = false
tree_root = SubResource( 111 ) tree_root = SubResource( 111 )
anim_player = NodePath("../AnimationPlayer") anim_player = NodePath("../AnimationPlayer")
active = true active = true
process_mode = 0
root_motion_track = NodePath("skeleton/Skeleton:root") root_motion_track = NodePath("skeleton/Skeleton:root")
parameters/all_scale/scale = 1.0 parameters/all_scale/scale = 1.0
parameters/blade_left/blend_amount = 0.0 parameters/blade_left/blend_amount = 0.0
@@ -729,23 +760,21 @@ parameters/state/playback = SubResource( 112 )
parameters/state/attack-melee1/attack1_speed/scale = 1.0 parameters/state/attack-melee1/attack1_speed/scale = 1.0
parameters/state/climb1/TimeScale/scale = 2.0 parameters/state/climb1/TimeScale/scale = 2.0
parameters/state/climb1a/TimeScale/scale = 2.0 parameters/state/climb1a/TimeScale/scale = 2.0
parameters/state/fall-back/TimeScale/scale = 1.0
parameters/state/fall-front/TimeScale/scale = 1.0
parameters/state/grabbed/TimeScale/scale = 1.0 parameters/state/grabbed/TimeScale/scale = 1.0
parameters/state/guard-front-melee1/TimeScale/scale = 1.0
parameters/state/guard-melee1/TimeScale/scale = 1.0
parameters/state/kneel/TimeScale/scale = 1.0 parameters/state/kneel/TimeScale/scale = 1.0
parameters/state/locomotion/loc/blend_position = Vector2( -0.00127554, 0.00220752 ) parameters/state/locomotion/loc/blend_position = Vector2( 0.00252736, 0.00604224 )
parameters/state/locomotion/loc/0/TimeScale/scale = 2.0 parameters/state/locomotion/loc/0/TimeScale/scale = 2.0
"parameters/state/locomotion/loc/0/TimeScale 2/scale" = 1.5 "parameters/state/locomotion/loc/0/TimeScale 2/scale" = 1.5
parameters/state/locomotion/loc/0/t1/current = 0 parameters/state/locomotion/loc/0/t1/current = 1
parameters/state/locomotion/loc/1/TimeScale/scale = 1.0 parameters/state/locomotion/loc/1/TimeScale/scale = 1.0
"parameters/state/locomotion/loc/1/TimeScale 2/scale" = 1.0 "parameters/state/locomotion/loc/1/TimeScale 2/scale" = 1.0
parameters/state/locomotion/loc/1/Transition/current = 0 parameters/state/locomotion/loc/1/Transition/current = 1
parameters/state/locomotion/loc/2/TimeScale/scale = 1.0 parameters/state/locomotion/loc/2/TimeScale/scale = 1.0
parameters/state/locomotion/loc/3/TimeScale/scale = 1.0 parameters/state/locomotion/loc/3/TimeScale/scale = 1.0
parameters/state/locomotion/loc/4/TimeScale/scale = 3.5
"parameters/state/locomotion/loc/4/TimeScale 2/scale" = 3.5
parameters/state/locomotion/loc/4/Transition/current = 0
parameters/state/locomotion/loc/5/TimeScale/scale = 1.5
"parameters/state/locomotion/loc/5/TimeScale 2/scale" = 1.5
parameters/state/locomotion/loc/5/Transition/current = 0
parameters/state/pray/TimeScale/scale = 1.0 parameters/state/pray/TimeScale/scale = 1.0
parameters/state/pray-startled/TimeScale/scale = 1.8 parameters/state/pray-startled/TimeScale/scale = 1.8
parameters/state/pray-startled-walk/TimeScale/scale = 1.3 parameters/state/pray-startled-walk/TimeScale/scale = 1.3

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=103 format=2] [gd_scene load_steps=123 format=2]
[ext_resource path="res://scenes/characters/vroid1-man.gltf" type="PackedScene" id=1] [ext_resource path="res://scenes/characters/vroid1-man.gltf" type="PackedScene" id=1]
[ext_resource path="res://scenes/hair/male-hair1.tscn" type="PackedScene" id=2] [ext_resource path="res://scenes/hair/male-hair1.tscn" type="PackedScene" id=2]
@@ -79,6 +79,32 @@ nodes/TimeScale/position = Vector2( 520, 120 )
nodes/output/position = Vector2( 740, 140 ) nodes/output/position = Vector2( 740, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ] node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=166]
animation = "fall-back"
[sub_resource type="AnimationNodeTimeScale" id=167]
[sub_resource type="AnimationNodeBlendTree" id=162]
graph_offset = Vector2( -555.162, -192.155 )
nodes/Animation/node = SubResource( 166 )
nodes/Animation/position = Vector2( -180, 160 )
nodes/TimeScale/node = SubResource( 167 )
nodes/TimeScale/position = Vector2( 40, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=163]
animation = "fall-front"
[sub_resource type="AnimationNodeTimeScale" id=164]
[sub_resource type="AnimationNodeBlendTree" id=165]
nodes/Animation/node = SubResource( 163 )
nodes/Animation/position = Vector2( 239, 374 )
nodes/TimeScale/node = SubResource( 164 )
nodes/TimeScale/position = Vector2( 451, 367 )
nodes/output/position = Vector2( 800, 360 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=14] [sub_resource type="AnimationNodeAnimation" id=14]
animation = "start-grab2" animation = "start-grab2"
@@ -93,6 +119,21 @@ nodes/TimeScale/position = Vector2( 820, 100 )
nodes/output/position = Vector2( 1160, 140 ) nodes/output/position = Vector2( 1160, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ] node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendTree" id=157]
[sub_resource type="AnimationNodeAnimation" id=150]
animation = "giard-melee-backwards1"
[sub_resource type="AnimationNodeTimeScale" id=151]
[sub_resource type="AnimationNodeBlendTree" id=152]
nodes/Animation/node = SubResource( 150 )
nodes/Animation/position = Vector2( 242, 180 )
nodes/TimeScale/node = SubResource( 151 )
nodes/TimeScale/position = Vector2( 520, 180 )
nodes/output/position = Vector2( 800, 180 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=17] [sub_resource type="AnimationNodeAnimation" id=17]
animation = "stand1-loop" animation = "stand1-loop"
@@ -275,7 +316,7 @@ nodes/TimeScale/position = Vector2( 780, 260 )
nodes/Transition/node = SubResource( 118 ) nodes/Transition/node = SubResource( 118 )
nodes/Transition/position = Vector2( 500, 280 ) nodes/Transition/position = Vector2( 500, 280 )
nodes/output/position = Vector2( 1000, 260 ) nodes/output/position = Vector2( 1000, 260 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ] node_connections = [ "output", 0, "TimeScale", "Transition", 0, "Animation", "Transition", 1, "Animation 2", "TimeScale", 0, "Transition" ]
[sub_resource type="AnimationNodeAnimation" id=119] [sub_resource type="AnimationNodeAnimation" id=119]
animation = "turn-right" animation = "turn-right"
@@ -303,7 +344,7 @@ nodes/TimeScale/position = Vector2( 840, 260 )
nodes/Transition/node = SubResource( 120 ) nodes/Transition/node = SubResource( 120 )
nodes/Transition/position = Vector2( 560, 260 ) nodes/Transition/position = Vector2( 560, 260 )
nodes/output/position = Vector2( 1060, 260 ) nodes/output/position = Vector2( 1060, 260 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ] node_connections = [ "output", 0, "TimeScale", "Transition", 0, "Animation", "Transition", 1, "Animation 2", "TimeScale", 0, "Transition" ]
[sub_resource type="AnimationNodeAnimation" id=123] [sub_resource type="AnimationNodeAnimation" id=123]
animation = "dagger-sacrifice-counter-a" animation = "dagger-sacrifice-counter-a"
@@ -335,7 +376,7 @@ nodes/TimeScale/position = Vector2( 700, 140 )
nodes/Transition/node = SubResource( 125 ) nodes/Transition/node = SubResource( 125 )
nodes/Transition/position = Vector2( 940, 140 ) nodes/Transition/position = Vector2( 940, 140 )
nodes/output/position = Vector2( 1240, 140 ) nodes/output/position = Vector2( 1240, 140 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ] node_connections = [ "output", 0, "Transition", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeStateMachineTransition" id=55] [sub_resource type="AnimationNodeStateMachineTransition" id=55]
@@ -404,23 +445,59 @@ xfade_time = 0.5
switch_mode = 2 switch_mode = 2
auto_advance = true auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=153]
switch_mode = 1
[sub_resource type="AnimationNodeStateMachineTransition" id=154]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=155]
[sub_resource type="AnimationNodeStateMachineTransition" id=156]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=158]
[sub_resource type="AnimationNodeStateMachineTransition" id=159]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=160]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=161]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=168]
[sub_resource type="AnimationNodeStateMachineTransition" id=169]
[sub_resource type="AnimationNodeStateMachine" id=70] [sub_resource type="AnimationNodeStateMachine" id=70]
states/attack-melee1/node = SubResource( 142 ) states/attack-melee1/node = SubResource( 142 )
states/attack-melee1/position = Vector2( 804.317, 380 ) states/attack-melee1/position = Vector2( 804.317, 380 )
states/climb1/node = SubResource( 7 ) states/climb1/node = SubResource( 7 )
states/climb1/position = Vector2( 359.444, 656 ) states/climb1/position = Vector2( 359.444, 656 )
states/climb1a/node = SubResource( 10 ) states/climb1a/node = SubResource( 10 )
states/climb1a/position = Vector2( 659.444, 154 ) states/climb1a/position = Vector2( 713.444, 92 )
states/drive/node = SubResource( 13 ) states/drive/node = SubResource( 13 )
states/drive/position = Vector2( 289, 430 ) states/drive/position = Vector2( 424, 557 )
states/fall-back/node = SubResource( 162 )
states/fall-back/position = Vector2( 568.317, 615 )
states/fall-front/node = SubResource( 165 )
states/fall-front/position = Vector2( 604.317, 536 )
states/grab/node = SubResource( 16 ) states/grab/node = SubResource( 16 )
states/grab/position = Vector2( 739.444, 243 ) states/grab/position = Vector2( 713.444, 145 )
states/guard-front-melee1/node = SubResource( 157 )
states/guard-front-melee1/position = Vector2( 835.317, 274 )
states/guard-melee1/node = SubResource( 152 )
states/guard-melee1/position = Vector2( 671.317, 463 )
states/locomotion/node = SubResource( 41 ) states/locomotion/node = SubResource( 41 )
states/locomotion/position = Vector2( 231, 174 ) states/locomotion/position = Vector2( 231, 174 )
states/passenger/node = SubResource( 44 ) states/passenger/node = SubResource( 44 )
states/passenger/position = Vector2( 555.444, 339 ) states/passenger/position = Vector2( 458.444, 421 )
states/sacrificed-a/node = SubResource( 48 ) states/sacrificed-a/node = SubResource( 48 )
states/sacrificed-a/position = Vector2( 628.444, 464 ) states/sacrificed-a/position = Vector2( 625.444, 779 )
states/sleeping/node = SubResource( 51 ) states/sleeping/node = SubResource( 51 )
states/sleeping/position = Vector2( -112.556, 339 ) states/sleeping/position = Vector2( -112.556, 339 )
states/start_walking/node = SubResource( 102 ) states/start_walking/node = SubResource( 102 )
@@ -433,12 +510,12 @@ states/turn_right/node = SubResource( 110 )
states/turn_right/position = Vector2( 177.444, 671 ) states/turn_right/position = Vector2( 177.444, 671 )
states/use_tap/node = SubResource( 54 ) states/use_tap/node = SubResource( 54 )
states/use_tap/position = Vector2( -138.556, 174 ) states/use_tap/position = Vector2( -138.556, 174 )
transitions = [ "locomotion", "drive", SubResource( 55 ), "drive", "locomotion", SubResource( 56 ), "locomotion", "passenger", SubResource( 57 ), "passenger", "locomotion", SubResource( 58 ), "drive", "passenger", SubResource( 59 ), "passenger", "drive", SubResource( 60 ), "sleeping", "locomotion", SubResource( 61 ), "locomotion", "grab", SubResource( 62 ), "grab", "locomotion", SubResource( 63 ), "locomotion", "climb1", SubResource( 64 ), "climb1", "locomotion", SubResource( 65 ), "locomotion", "climb1a", SubResource( 66 ), "climb1a", "locomotion", SubResource( 67 ), "locomotion", "use_tap", SubResource( 68 ), "use_tap", "locomotion", SubResource( 69 ), "locomotion", "stop_walking", SubResource( 100 ), "stop_walking", "locomotion", SubResource( 101 ), "locomotion", "start_walking", SubResource( 103 ), "start_walking", "locomotion", SubResource( 104 ), "locomotion", "turn_left", SubResource( 111 ), "turn_left", "locomotion", SubResource( 112 ), "locomotion", "turn_right", SubResource( 113 ), "turn_right", "locomotion", SubResource( 114 ), "locomotion", "attack-melee1", SubResource( 143 ), "attack-melee1", "locomotion", SubResource( 144 ) ] transitions = [ "locomotion", "drive", SubResource( 55 ), "drive", "locomotion", SubResource( 56 ), "locomotion", "passenger", SubResource( 57 ), "passenger", "locomotion", SubResource( 58 ), "drive", "passenger", SubResource( 59 ), "passenger", "drive", SubResource( 60 ), "sleeping", "locomotion", SubResource( 61 ), "locomotion", "grab", SubResource( 62 ), "grab", "locomotion", SubResource( 63 ), "locomotion", "climb1", SubResource( 64 ), "climb1", "locomotion", SubResource( 65 ), "locomotion", "climb1a", SubResource( 66 ), "climb1a", "locomotion", SubResource( 67 ), "locomotion", "use_tap", SubResource( 68 ), "use_tap", "locomotion", SubResource( 69 ), "locomotion", "stop_walking", SubResource( 100 ), "stop_walking", "locomotion", SubResource( 101 ), "locomotion", "start_walking", SubResource( 103 ), "start_walking", "locomotion", SubResource( 104 ), "locomotion", "turn_left", SubResource( 111 ), "turn_left", "locomotion", SubResource( 112 ), "locomotion", "turn_right", SubResource( 113 ), "turn_right", "locomotion", SubResource( 114 ), "locomotion", "attack-melee1", SubResource( 143 ), "attack-melee1", "locomotion", SubResource( 144 ), "attack-melee1", "guard-melee1", SubResource( 153 ), "guard-melee1", "attack-melee1", SubResource( 154 ), "locomotion", "guard-melee1", SubResource( 155 ), "guard-melee1", "locomotion", SubResource( 156 ), "locomotion", "guard-front-melee1", SubResource( 158 ), "guard-front-melee1", "locomotion", SubResource( 159 ), "guard-front-melee1", "attack-melee1", SubResource( 160 ), "attack-melee1", "guard-front-melee1", SubResource( 161 ), "locomotion", "fall-front", SubResource( 168 ), "locomotion", "fall-back", SubResource( 169 ) ]
start_node = "locomotion" start_node = "locomotion"
graph_offset = Vector2( -103.683, 58 ) graph_offset = Vector2( -230.683, 15 )
[sub_resource type="AnimationNodeBlendTree" id=71] [sub_resource type="AnimationNodeBlendTree" id=71]
graph_offset = Vector2( -610.686, 0 ) graph_offset = Vector2( -534, -71 )
nodes/Animation/node = SubResource( 2 ) nodes/Animation/node = SubResource( 2 )
nodes/Animation/position = Vector2( -200, 260 ) nodes/Animation/position = Vector2( -200, 260 )
"nodes/Animation 2/node" = SubResource( 1 ) "nodes/Animation 2/node" = SubResource( 1 )
@@ -466,7 +543,7 @@ bones/94/bound_children = [ NodePath("wrist_r") ]
bones/96/bound_children = [ NodePath("wrist_l") ] bones/96/bound_children = [ NodePath("wrist_l") ]
[node name="wrist_r" type="BoneAttachment" parent="Skeleton" index="2"] [node name="wrist_r" type="BoneAttachment" parent="Skeleton" index="2"]
transform = Transform( 0.0279129, 0.998728, 0.0419739, 0.0839921, -0.0441851, 0.995486, 0.996075, -0.0242615, -0.0851187, 0.24008, 1.0159, -0.0177416 ) transform = Transform( 0.0279129, 0.998728, 0.041974, 0.083992, -0.0441852, 0.995486, 0.996075, -0.0242614, -0.0851186, 0.24008, 1.0159, -0.0689935 )
bone_name = "wrist_ik_r" bone_name = "wrist_ik_r"
[node name="marker_wrist_r_grab" type="Position3D" parent="Skeleton/wrist_r" index="0"] [node name="marker_wrist_r_grab" type="Position3D" parent="Skeleton/wrist_r" index="0"]
@@ -477,7 +554,7 @@ visible = false
transform = Transform( -1.62921e-07, -1, 0, -1.62921e-07, 2.65431e-14, 1, -1, 1.62921e-07, -1.62921e-07, -0.0452205, -0.00161505, -0.0947611 ) transform = Transform( -1.62921e-07, -1, 0, -1.62921e-07, 2.65431e-14, 1, -1, 1.62921e-07, -1.62921e-07, -0.0452205, -0.00161505, -0.0947611 )
[node name="wrist_l" type="BoneAttachment" parent="Skeleton" index="3"] [node name="wrist_l" type="BoneAttachment" parent="Skeleton" index="3"]
transform = Transform( 0.531637, -0.84656, 0.0264325, -0.0845947, -0.0220212, 0.996172, -0.842737, -0.531838, -0.0833217, -0.202819, 1.01771, -0.0990905 ) transform = Transform( 0.531637, -0.84656, 0.0264325, -0.0845947, -0.0220212, 0.996172, -0.842737, -0.531838, -0.0833217, -0.202819, 1.02836, -0.0471478 )
bone_name = "wrist_ik_l" bone_name = "wrist_ik_l"
[node name="marker_wrist_l_grab" type="Position3D" parent="Skeleton/wrist_l" index="0"] [node name="marker_wrist_l_grab" type="Position3D" parent="Skeleton/wrist_l" index="0"]
@@ -488,7 +565,7 @@ visible = false
transform = Transform( -1.62921e-07, 1, 0, 1.62921e-07, 2.65431e-14, -1, -1, -1.62921e-07, -1.62921e-07, 0.04, -0.01, -0.089 ) transform = Transform( -1.62921e-07, 1, 0, 1.62921e-07, 2.65431e-14, -1, -1, -1.62921e-07, -1.62921e-07, 0.04, -0.01, -0.089 )
[node name="head" type="BoneAttachment" parent="Skeleton" index="4"] [node name="head" type="BoneAttachment" parent="Skeleton" index="4"]
transform = Transform( 0.992423, -0.0725141, 0.0991927, 0.0314417, 0.93028, 0.3655, -0.118781, -0.359611, 0.92551, -0.0334505, 1.69764, -0.0088316 ) transform = Transform( 0.998981, -0.0174369, -0.0416214, 0.0314635, 0.930306, 0.365432, 0.0323486, -0.366369, 0.929906, -0.0329707, 1.69764, -0.0053772 )
bone_name = "J_Bip_C_Head" bone_name = "J_Bip_C_Head"
[node name="marker_talk" type="Position3D" parent="Skeleton/head" index="0"] [node name="marker_talk" type="Position3D" parent="Skeleton/head" index="0"]
@@ -515,7 +592,7 @@ transform = Transform( 0.967007, -0.0921614, 0.237496, 0.0940632, 0.995561, 0.00
shape = SubResource( 149 ) shape = SubResource( 149 )
[node name="hips" type="BoneAttachment" parent="Skeleton" index="5"] [node name="hips" type="BoneAttachment" parent="Skeleton" index="5"]
transform = Transform( 0.98661, -0.156797, -0.0449004, 0.150109, 0.980609, -0.125986, 0.063784, 0.117559, 0.991015, 0.000514592, 1.10104, -0.0117666 ) transform = Transform( 0.987964, -0.143962, 0.0565838, 0.150106, 0.98061, -0.125986, -0.0373495, 0.132963, 0.990417, 0.000514592, 1.10104, -0.0117666 )
bone_name = "J_Bip_C_Hips" bone_name = "J_Bip_C_Hips"
[node name="marker_hips_action" type="Position3D" parent="Skeleton/hips" index="0"] [node name="marker_hips_action" type="Position3D" parent="Skeleton/hips" index="0"]
@@ -531,7 +608,7 @@ monitorable = false
shape = SubResource( 148 ) shape = SubResource( 148 )
[node name="neck" type="BoneAttachment" parent="Skeleton" index="6"] [node name="neck" type="BoneAttachment" parent="Skeleton" index="6"]
transform = Transform( 0.997574, -0.0156814, -0.0678291, 0.0262169, 0.987195, 0.157347, 0.0644932, -0.158743, 0.985211, -0.0319104, 1.60068, 0.0067592 ) transform = Transform( 0.998943, -0.0318141, 0.033183, 0.0262132, 0.987195, 0.157347, -0.037764, -0.156311, 0.986985, -0.0298461, 1.60068, 0.00997471 )
bone_name = "J_Bip_C_Neck" bone_name = "J_Bip_C_Neck"
[node name="marker_neck_grab" type="Position3D" parent="Skeleton/neck" index="0"] [node name="marker_neck_grab" type="Position3D" parent="Skeleton/neck" index="0"]
@@ -539,7 +616,7 @@ transform = Transform( 0.998758, -0.00781338, 0.0492147, 0.00787775, 0.999969, -
visible = false visible = false
[node name="penis_2" type="BoneAttachment" parent="Skeleton" index="7"] [node name="penis_2" type="BoneAttachment" parent="Skeleton" index="7"]
transform = Transform( 0.986609, 0.161544, -0.0224677, 0.15011, -0.845507, 0.51243, 0.0637833, -0.508941, -0.858435, 0.023164, 0.991264, -0.103765 ) transform = Transform( 0.987964, 0.108698, -0.110052, 0.150106, -0.845508, 0.51243, -0.0373501, -0.522782, -0.851648, 0.0136458, 0.991264, -0.105598 )
bone_name = "penis2" bone_name = "penis2"
[node name="marker_penis_action" type="Position3D" parent="Skeleton/penis_2" index="0"] [node name="marker_penis_action" type="Position3D" parent="Skeleton/penis_2" index="0"]
@@ -547,7 +624,7 @@ transform = Transform( 0.998824, -0.0252848, -0.0413812, 0.0249792, 0.999657, -0
visible = false visible = false
[node name="chest" type="BoneAttachment" parent="Skeleton" index="8"] [node name="chest" type="BoneAttachment" parent="Skeleton" index="8"]
transform = Transform( 0.997574, -0.0296453, -0.0629938, 0.0262256, 0.998173, -0.0544359, 0.0644925, 0.0526517, 0.996528, -0.0239998, 1.33823, -0.00887859 ) transform = Transform( 0.998943, -0.0241071, 0.0391486, 0.0262218, 0.998173, -0.0544354, -0.0377648, 0.0554043, 0.997749, -0.0235756, 1.33823, -0.00638926 )
bone_name = "J_Bip_C_Chest" bone_name = "J_Bip_C_Chest"
[node name="chest_hurt" type="Area" parent="Skeleton/chest" index="0"] [node name="chest_hurt" type="Area" parent="Skeleton/chest" index="0"]
@@ -571,7 +648,10 @@ parameters/state/attack-melee1/TimeScale/scale = 1.0
parameters/state/climb1/TimeScale/scale = 2.0 parameters/state/climb1/TimeScale/scale = 2.0
parameters/state/climb1a/TimeScale/scale = 2.0 parameters/state/climb1a/TimeScale/scale = 2.0
parameters/state/drive/TimeScale/scale = 1.0 parameters/state/drive/TimeScale/scale = 1.0
parameters/state/fall-back/TimeScale/scale = 1.0
parameters/state/fall-front/TimeScale/scale = 1.0
parameters/state/grab/TimeScale/scale = 1.0 parameters/state/grab/TimeScale/scale = 1.0
parameters/state/guard-melee1/TimeScale/scale = 1.0
parameters/state/locomotion/loc/blend_position = Vector2( -0.00293946, -0.0151844 ) parameters/state/locomotion/loc/blend_position = Vector2( -0.00293946, -0.0151844 )
parameters/state/locomotion/loc/0/TimeScale/scale = 1.0 parameters/state/locomotion/loc/0/TimeScale/scale = 1.0
parameters/state/locomotion/loc/1/TimeScale/scale = 2.0 parameters/state/locomotion/loc/1/TimeScale/scale = 2.0

View File

@@ -1,12 +1,2 @@
extends Spatial extends Spatial
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
#func _ready():
# characters.replace_character($npc1, "male", ["cmdq", "marker", "hurtboxes", "bandit"])
# characters.replace_character($npc2, "female", ["cmdq", "marker", "hurtboxes", "bandit"])

View File

@@ -9,14 +9,15 @@ script = ExtResource( 3 )
[node name="campfire" parent="." instance=ExtResource( 1 )] [node name="campfire" parent="." instance=ExtResource( 1 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )
material/0 = null
material/1 = null
[node name="tent" parent="." instance=ExtResource( 2 )] [node name="tent" parent="." instance=ExtResource( 2 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 3 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 3 )
[node name="npc1" type="Spatial" parent="." groups=["bandit", "male", "spawn"]] [node name="npc1" type="Spatial" parent="." groups=["bandit", "male", "spawn"]]
transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 2.86465, 0.178202, 0 ) transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 4.71933, 0.178202, 0 )
[node name="npc3" type="Spatial" parent="." groups=["bandit", "male", "spawn"]]
transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 2.49152, 0.178202, 0 )
[node name="npc2" type="Spatial" parent="." groups=["bandit", "female", "spawn"]] [node name="npc2" type="Spatial" parent="." groups=["bandit", "female", "spawn"]]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38509, 0.249482, 2.91225 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38509, 0.249482, 0.0150008 )

View File

@@ -37,6 +37,7 @@ streaming="*res://autoload/streaming.tscn"
freezer="*res://autoload/freezer.gd" freezer="*res://autoload/freezer.gd"
scenario="*res://autoload/scenario.gd" scenario="*res://autoload/scenario.gd"
orchestration="*res://autoload/orchestration.tscn" orchestration="*res://autoload/orchestration.tscn"
combat="*res://autoload/combat.gd"
[debug] [debug]
@@ -94,9 +95,21 @@ attack={
"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) "events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null)
] ]
} }
jump={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"physical_scancode":0,"unicode":0,"echo":false,"script":null)
]
}
[memory]
limits/multithreaded_server/rid_pool_prealloc=256
limits/message_queue/max_size_kb=6144
limits/command_queue/multithreading_queue_size_kb=512
[physics] [physics]
common/physics_fps=150
3d/physics_engine="Bullet" 3d/physics_engine="Bullet"
[rendering] [rendering]

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,21 @@ var raycast_queue = []
var blood = preload("res://scenes/decals/blood.tscn") var blood = preload("res://scenes/decals/blood.tscn")
var blood_decal = preload("res://scenes/decals/blood1-decal.gltf") var blood_decal = preload("res://scenes/decals/blood1-decal.gltf")
var rnd var rnd
func init(): var initialized = false
var root = get_character() var root
func init(tick):
assert(!initialized)
if initialized:
printerr("already initialized")
return
root = get_character(tick)
if !root:
printerr("no character?")
return
var cam = root.get_viewport().get_camera()
if !cam.has_meta("player"):
printerr("no player?")
return
var queue = [root] var queue = [root]
var hurtboxes = [] var hurtboxes = []
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
@@ -20,15 +33,12 @@ func init():
e.connect("area_entered", self, "area_hit", [e]) e.connect("area_entered", self, "area_hit", [e])
rnd = RandomNumberGenerator.new() rnd = RandomNumberGenerator.new()
rnd.randomize() rnd.randomize()
print("initialized ok")
initialized = true
func area_hit(area, e): func area_hit(area, e):
var root = get_character()
if area.is_in_group("weapon_hit"): if area.is_in_group("weapon_hit"):
var mo = area.get_meta("owner") var mo = area.get_meta("owner")
if mo == root: if mo == root:
# var cam = get_character().get_viewport().get_camera()
# var pl = cam.get_meta("player")
# print(mo.name, " ", root.name, " ", e.name)
# print(mo, " ", root, " ", " ", pl)
return return
print("HIT") print("HIT")
var bi = blood.instance() var bi = blood.instance()
@@ -49,36 +59,55 @@ func area_hit(area, e):
offt.y = 0 offt.y = 0
org += xoff + offt org += xoff + offt
raycast_queue.push_back(org) raycast_queue.push_back(org)
assert(area.has_meta("item_name"))
combat.emit_signal("event", "damage", [mo, area.get_meta("item_name")])
yield(root.get_tree().create_timer(8), "timeout") yield(root.get_tree().create_timer(8), "timeout")
# TODO: add delay # TODO: add delay
bi.queue_free() bi.queue_free()
func update_physics(delta): func update_physics(tick, delta):
var root = get_character() assert(initialized)
root = get_character(tick)
if !root:
printerr("no character?")
assert(!initialized)
return FAILED
var space_state: PhysicsDirectSpaceState = root.get_world().direct_space_state var space_state: PhysicsDirectSpaceState = root.get_world().direct_space_state
var offsets = [Vector3(0, -2, 0)] var offsets = [Vector3(0, -2, 0)]
var cam = root.get_viewport().get_camera() var cam = root.get_viewport().get_camera()
if !cam.has_meta("player"): if !cam.has_meta("player"):
return printerr("no player?")
assert(!initialized)
return FAILED
var player = cam.get_meta("player") var player = cam.get_meta("player")
while raycast_queue.size() > 0: raycast_queue.clear()
var item = raycast_queue.pop_front() # while raycast_queue.size() > 0:
var a = item # var item = raycast_queue.pop_front()
for boff in offsets: # var a = item
var b = a + boff # for boff in offsets:
var result = {} # var b = a + boff
if root is PhysicsBody: # var result = {}
result = space_state.intersect_ray(a, b, [root, player]) # if root is PhysicsBody:
else: # result = space_state.intersect_ray(a, b, [root, player])
result = space_state.intersect_ray(a, b) # else:
if result.has("collider"): # result = space_state.intersect_ray(a, b)
var body = result.collider # if result.has("collider"):
var normal = result.normal # var body = result.collider
var position = result.position # var normal = result.normal
var decal = blood_decal.instance() # var position = result.position
decal.add_to_group("blood") # var decal = blood_decal.instance()
body.add_child(decal) # decal.add_to_group("blood")
decal.global_transform.origin = position # body.add_child(decal)
var scale = 0.5 + rnd.randf() * 2.0 # decal.global_transform.origin = position
var rot = PI * 2.0 * rnd.randf() # var scale = 0.5 + rnd.randf() * 2.0
decal.global_transform.basis = Basis(normal).scaled(Vector3(scale, 1.0, scale)).rotated(normal, rot) # var rot = PI * 2.0 * rnd.randf()
# decal.global_transform.basis = Basis(normal).scaled(Vector3(scale, 1.0, scale)).rotated(normal, rot)
return ERR_BUSY
func stop(tick):
pass
# printerr("Why stopped?")
# assert(false)
func update(tick, delta):
return ERR_BUSY

View File

@@ -10,12 +10,12 @@ extends AIScriptModule
var animtree: AnimationTree var animtree: AnimationTree
var root_motion_track var root_motion_track
func init(): func init(tick):
# process_priority = 0 # process_priority = 0
pass pass
func can_walk_there(dest: Vector3) -> bool: func can_walk_there(tick: AITick, dest: Vector3) -> bool:
var root = get_character() var root = get_character(tick)
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state() var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
var result = space.intersect_ray(root.global_transform.origin, dest, [root]) var result = space.intersect_ray(root.global_transform.origin, dest, [root])
if result.has("collider"): if result.has("collider"):
@@ -23,8 +23,8 @@ func can_walk_there(dest: Vector3) -> bool:
else: else:
return true return true
func update_physics(delta): func update_physics(tick, delta):
var root = get_character() var root = get_character(tick)
var orientation: Transform var orientation: Transform
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
@@ -35,12 +35,12 @@ func update_physics(delta):
if animtree: if animtree:
root_motion_track = animtree.root_motion_track root_motion_track = animtree.root_motion_track
else: else:
return return FAILED
if characters.handle_cmdq(root):
return
var skel = root.get_meta("skeleton") var skel = root.get_meta("skeleton")
if !skel: if !skel:
return return FAILED
if characters.handle_cmdq(root):
return ERR_BUSY
if root.has_meta("cmdqueue"): if root.has_meta("cmdqueue"):
var cmds = root.get_meta("cmdqueue") var cmds = root.get_meta("cmdqueue")
var cmd = cmds.pop_front() var cmd = cmds.pop_front()
@@ -256,3 +256,7 @@ func update_physics(delta):
root.set_meta("cmdqueue", cmds) root.set_meta("cmdqueue", cmds)
else: else:
root.remove_meta("cmdqueue") root.remove_meta("cmdqueue")
return ERR_BUSY
func update(tick, delta):
return ERR_BUSY

View File

@@ -1,38 +1,446 @@
extends AIScriptModule extends AIScriptModule
const garments_female_lingerie = ["female-panties1", "female-bra1"]
const garments_head_female = []
const garments_male_lingerie = ["male-panties1"]
const garments_head_male = []
const garments_female_main = ["female-shirt_skirt1"]
const garments_male_main = ["male-pants1", "male-shoes1"]
const basedir = "res://scenes/clothes/"
const material_female = preload("res://scenes/clothes/nun-clothes.material")
const material_male = preload("res://scenes/clothes/clothes-male.material")
# Declare member variables here. Examples: const attack_distance = 2.0
# var a = 2 const guard_distance = 2.0
# var b = "text" const engage_distance = 10.0
const flee_distance = 5.0
const init_blackboard = {
"stamina": 100.0,
"health": 100.0,
"melee_weapon_equipped": false,
"attack_cooldown": 0.0,
"guard_cooldown": 0.0,
"flee_cooldown": 0.0,
"guard": false,
"melee_damage": false,
"dot": 0.0
}
class AITreeBuilder:
var parent
func seq(a: Array):
var e = AITreeBuilder.new()
e.parent = self
return e
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, blackboard):
var root = blackboard.self
var cam = root.get_viewport().get_camera()
var player
if cam:
player = cam.get_meta("player")
assert(player)
match ev:
"about_to_attack":
var who = data[0]
if who != root:
var where = who.global_transform.origin
var curpos = root.global_transform.origin
var dst = where.distance_squared_to(curpos)
if dst < guard_distance * guard_distance:
if who == player:
blackboard["guard"] = true
# blackboard_set(tick, "melee_damage", true)
"damage":
var who = data[0]
var weapon = data[1]
if who != root:
var where = who.global_transform.origin
var curpos = root.global_transform.origin
var dst = where.distance_squared_to(curpos)
if dst < attack_distance * attack_distance:
if who == player:
blackboard["melee_damage"] = true
# blackboard_set(tick, "melee_damage", true)
class take_weapon extends AIScriptModule:
func init(tick):
get_memory(tick).root = get_character(tick)
get_memory(tick).skel = get_memory(tick).root.get_meta("skeleton")
func update_physics(tick, delta):
var root = get_memory(tick).root
assert(root)
if blackboard_get(tick, "melee_weapon_equipped"):
return FAILED
var wslot = get_memory(tick).skel.get_node("wrist_r/weapon_right")
wslot.set_meta("owner", root)
inventory.equip(wslot, get_memory(tick).weapon)
blackboard_set(tick, "melee_weapon_equipped", true)
assert(blackboard_get(tick, "melee_weapon_equipped"))
return OK
func stop(tick):
# can't re-run this one
var root = get_memory(tick).root
assert(root)
class guard extends AIScriptModule:
func init(tick):
get_memory(tick).root = get_character(tick)
get_memory(tick).state = 0
func update_physics(tick, delta):
var root = get_memory(tick).root
assert(root)
if blackboard_get(tick, "guard_cooldown") > 0:
return FAILED
if blackboard_get(tick, "guard"):
blackboard_set(tick, "guard", false)
match get_memory(tick).state:
0:
# guard
var anim
if blackboard_get(tick, "dot") < 0:
anim = get_memory(tick).anim1
else:
anim = get_memory(tick).anim2
characters.animation_node_travel(root, anim)
get_memory(tick).state = 1
return ERR_BUSY
1:
get_memory(tick).state = 2
return ERR_BUSY
2:
blackboard_set(tick, "guard_cooldown", 1.5)
return OK
return OK
func stop(tick):
get_memory(tick).state = 0
class rest extends AIScriptModule:
func init(tick):
get_memory(tick).root = get_character(tick)
func update_physics(tick, delta):
var root = get_memory(tick).root
assert(root)
if blackboard_get(tick, "stamina") < 100.0:
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") + 15500.0 * delta)
return ERR_BUSY
else:
return OK
func stop(tock):
pass
class idle extends AIScriptModule:
func init(tick):
get_memory(tick).root = get_character(tick)
func update_physics(tick, delta):
var root = get_memory(tick).root
assert(root)
if blackboard_get(tick, "stamina") < 100.0:
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") + 0.5 * delta)
return ERR_BUSY
else:
return OK
func stop(tock):
pass
# Called when the node enters the scene tree for the first time. class unconcious extends AIScriptModule:
var root func init(tick):
var skel get_memory(tick).root = get_character(tick)
var hair_skel get_memory(tick).state = 0
var name
var garments_female_lingerie = ["female-panties1", "female-bra1"] func update_physics(tick, delta):
var garments_head_female = [] var root = get_memory(tick).root
var garments_male_lingerie = ["male-panties1"] var anim1 = get_memory(tick).anim1
var garments_head_male = [] var anim2 = get_memory(tick).anim2
var garments_female_main = ["female-shirt_skirt1"] assert(root)
var garments_male_main = ["male-pants1", "male-shoes1"] assert(anim1)
var basedir = "res://scenes/clothes/" assert(anim2)
var material_female = preload("res://scenes/clothes/nun-clothes.material") match get_memory(tick).state:
var material_male = preload("res://scenes/clothes/clothes-male.material") 0:
characters.animation_node_travel(root, anim1)
get_memory(tick).state = 1
return ERR_BUSY
return ERR_BUSY
func stop(tick):
pass
var state = 0 class get_damage extends AIScriptModule:
var health = 100.0 func init(tick):
var stamina = 100.0 get_memory(tick).root = get_character(tick)
get_memory(tick).state = 0
func init(): func update_physics(tick, delta):
name = "bandit_ai" var root = get_memory(tick).root
root = get_character() var anim1 = get_memory(tick).anim1
var anim2 = get_memory(tick).anim2
var cost = get_memory(tick).cost
assert(root)
if blackboard_get(tick, "guard_cooldown") > 0:
return FAILED
if blackboard_get(tick, "melee_damage"):
blackboard_set(tick, "melee_damage", false)
match get_memory(tick).state:
0:
# guard
var anim
if blackboard_get(tick, "dot") < 0:
anim = get_memory(tick).anim1
else:
anim = get_memory(tick).anim2
characters.animation_node_travel(root, anim)
if blackboard_get(tick, "stamina") > 50.0:
blackboard_set(tick, "health", blackboard_get(tick, "health") - cost)
else:
blackboard_set(tick, "health", blackboard_get(tick, "health") - 5.0 * cost)
blackboard_set(tick, "stamina", 5.0)
get_memory(tick).state = 1
return ERR_BUSY
1:
get_memory(tick).state = 2
return ERR_BUSY
2:
blackboard_set(tick, "guard_cooldown", 1.5)
return OK
func stop(tick):
get_memory(tick).state = 0
class walkto extends AIScriptModule:
func init(tick):
get_memory(tick).state = 0
get_memory(tick).pdist = INF
get_memory(tick).root = get_character(tick)
get_memory(tick).timeout = get_memory(tick).config_timeout
func look_at(root, where):
var current = root.global_transform
var at = where
at.y = current.origin.y
root.global_transform = current.looking_at(at, Vector3.UP)
root.set_meta("orientation", Transform(root.global_transform.basis, Vector3()))
func update_physics(tick, delta):
var root = get_memory(tick).root
assert(root)
var flee = get_memory(tick).flee
var where: Vector3
var adest = blackboard_get(tick, "enemy_pos")
var away = (root.global_transform.origin - adest).normalized()
var fdest = root.global_transform.origin + away * 4.0
if !flee:
where = adest
else:
where = fdest
var gpos = root.global_transform.origin
var dst = gpos.distance_squared_to(where)
var finished = false
var pdist = get_memory(tick).pdist
var speed = get_memory(tick).speed
var cost = get_memory(tick).cost
var gap = get_memory(tick).gap
# get_memory(tick).timeout -= delta
match get_memory(tick).state:
0:
look_at(root, where)
characters.animation_node_travel(root, "locomotion")
characters.set_walk_speed(root, speed, 0)
get_memory(tick).state = 1
1:
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") - cost * delta)
get_memory(tick).state = 2
2:
if dst < gap * gap:
get_memory(tick).state = 10
elif get_memory(tick).timeout < 0.0:
root.global_transform.origin = where
get_memory(tick).state = 20
# elif dst > pdist && dst > gap * gap:
# root.global_transform.origin = where
# get_memory(tick).state = 30
# printerr("missed the target: ", sqrt(dst), gap)
# elif dst < 3.0 * gap * gap && get_memory(tick).timeout > 0.0:
# characters.set_walk_speed(root, speed, 0)
# get_memory(tick).state = 3
else:
get_memory(tick).state = 0
10:
finished = true
20:
finished = true
30:
finished = true
# 200:
# get_memory(tick).timeout -= delta
# if get_memory(tick).timeout < 0.0:
# root.global_transform.origin = where
# characters.set_walk_speed(root, 0, 0)
# finished = true
# state = 300
# 300:
# printerr("should not be here: ", sqrt(dst), gap)
# breakpoint
get_memory(tick).pdist = dst
if !finished:
return ERR_BUSY
else:
return OK
func stop(tick):
var root = get_memory(tick).root
characters.set_walk_speed(root, 0, 0)
get_memory(tick).state = 0
get_memory(tick).timeout = get_memory(tick).config_timeout
class attack extends AIScriptModule:
func init(tick):
get_memory(tick).root = get_character(tick)
get_memory(tick).state = 0
func look_at(tick, root):
var current = root.global_transform
var at = blackboard_get(tick, "enemy_pos")
at.y = current.origin.y
root.global_transform = current.looking_at(at, Vector3.UP)
root.set_meta("orientation", Transform(root.global_transform.basis, Vector3()))
func update_physics(tick, delta):
var root = get_memory(tick).root
var event = get_memory(tick).event
var anim = get_memory(tick).anim
var finished = false
assert(root)
if blackboard_get(tick, "attack_cooldown") > 0.0:
blackboard_set(tick, "attack_cooldown", blackboard_get(tick, "attack_cooldown") - delta)
return FAILED
match get_memory(tick).state:
0:
combat.emit_signal("event", get_memory(tick).event, [root])
look_at(tick, root)
get_memory(tick).state = 1
1:
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") - 0.5 * delta)
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") - 3500 * delta)
characters.animation_node_travel(root, anim)
get_memory(tick).state = 2
2:
blackboard_set(tick, "stamina", blackboard_get(tick, "stamina") - 5 * delta)
blackboard_set(tick, "attack_cooldown", 1.8)
finished = true
if finished:
return OK
else:
return ERR_BUSY
func stop(tick):
get_memory(tick).state = 0
func init(tick):
assert(tick)
assert(!get_memory(tick).has("initialized"))
get_memory(tick).name = "bandit_ai"
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}
],
"score": 180.0,
"conf": {"weapon": "s_dagger"},
},
"approach_far": {
"considerations": [
{"c": health_consideration.new(), "score": 1.0},
{"c": enemy_very_far_consideration.new(), "score": 1.0},
{"c": has_melee_weapon_equipped_consideration.new(), "score": 1.0},
{"c": half_or_more_stamina_consideration.new(), "score": 1.0},
{"c": threat_consideration.new(), "score": 1.0}
],
"score": 120.0,
"conf": {"gap": 0.6, "config_timeout": 3.0, "speed": 4.0, "cost": 6.0, "flee": false},
},
"approach_near": {
"considerations": [
{"c": health_consideration.new(), "score": 1.0},
{"c": enemy_far_consideration.new(), "score": 1.0},
{"c": has_melee_weapon_equipped_consideration.new(), "score": 1.0},
{"c": half_or_more_stamina_consideration.new(), "score": 1.0},
{"c": threat_consideration.new(), "score": 1.0}
],
"score": 150.0,
"conf": {"gap": 0.6, "config_timeout": 1.5, "speed": 2.0, "cost": 6.0, "flee": false},
},
"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}
],
"score": 50.0,
"conf": {"anim": "attack-melee1", "event": "about_to_attack"},
},
"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},
],
"score": 300.0,
"conf": {"gap": 0.6, "config_timeout": 1.5, "speed": 20.0, "cost": 6.0, "flee": true},
},
"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},
],
"score": 900.0,
"conf": {"anim1": "guard-melee1", "anim2": "guard-front-melee1"},
},
"unconcious": {
"considerations": [
{"c": critical_health_consideration.new(), "score": 1.0}
],
"score": 2000.0,
"conf": {"anim1": "fall-front", "anim2": "fall-back"},
},
"rest": {
"considerations": [
{"c": critical_stamina_consideration.new(), "score": 1.0},
{"c": flee_or_more_distance_consideration.new(), "score": 1.0}
],
"score": 150.0,
"conf": {},
},
"get_melee_damage": {
"considerations": [
{"c": health_consideration.new(), "score": 1.0},
{"c": melee_damage_consideration.new(), "score": 1.0},
],
"score": 3000.0,
"conf": {"anim1": "guard-melee1", "anim2": "guard-front-melee1", "cost": 10.0},
},
"idle": {
"considerations": [
],
"score": 1.0,
"conf": {},
}
}
var root = get_character(tick)
for e in init_blackboard.keys():
if !blackboard_is_set(tick, e):
blackboard_set(tick, e, init_blackboard[e])
blackboard_set(tick, "self", root)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
root.add_to_group("students") get_memory(tick).rnd = RandomNumberGenerator.new()
root.add_to_group("student") get_memory(tick).rnd.randomize()
root.add_to_group("bandits")
root.add_to_group("bandit")
var character_data = root.get_meta("character_data") var character_data = root.get_meta("character_data")
if character_data.sex == "female": if character_data.sex == "female":
var g = garments_female_lingerie var g = garments_female_lingerie
@@ -46,93 +454,206 @@ func init():
g += garments_male_main g += garments_male_main
h += garments_head_male h += garments_head_male
characters.call_deferred("setup_garments", root, g, h, material_male) characters.call_deferred("setup_garments", root, g, h, material_male)
state = 0
var ai_runner: AIUtilityRunner = AIUtilityRunner.new()
get_memory(tick).runner = ai_runner
_register_module(tick, get_memory(tick).runner)
combat.connect("event", self, "combat_event", [blackboard_get_dict(tick)])
if !get_memory(tick).has("run_behaviors"):
get_memory(tick).run_behaviors = {}
for e in conf_behaviors.keys():
if !get_memory(tick).run_behaviors.has(e):
get_memory(tick).run_behaviors[e] = conf_behaviors[e].new()
_register_module(tick, get_memory(tick).run_behaviors[e])
var conf = considerations_data[e].conf
get_memory(tick).run_behaviors[e].setup(tick, conf)
ai_runner.add_choice(tick, e, considerations_data[e].score, get_memory(tick).run_behaviors[e])
for c in considerations_data[e].considerations:
ai_runner.add_consideration(tick, e, c.c, c.score)
get_memory(tick).initialized = true
var cooldown = 0.0 var cooldown = 0.0
func update_physics(delta):
var conf_behaviors: = {
"take_melee_weapon": take_weapon,
"approach_far": walkto,
"approach_near": walkto,
"flee": walkto,
"melee_attack": attack,
"guard": guard,
"rest": rest,
"idle": idle,
"get_melee_damage": get_damage,
"unconcious": unconcious
}
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
ret = clamp(ret, 0.0, 1.0)
return ret * ret
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 safe_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 enemy_very_far_consideration extends AIUtilityScriptedConsideration:
func evalute(tick, delta):
if blackboard_get(tick, "enemy_distance") > 5.0 * 5.0:
return 1.0
return 0.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") >= 80.0:
return 0.0
var e = blackboard_get(tick, "stamina") / 100.0
e = clamp(e, 0.0, 1.0)
var d = (1.0 / (e + 1.0) - 0.5) * 0.5
return clamp(d, 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
func update_physics(tick, delta):
assert(get_memory(tick).initialized)
var root = get_character(tick)
assert(root)
var cam = root.get_viewport().get_camera() var cam = root.get_viewport().get_camera()
if !cam: if !cam:
return return FAILED
if !cam.has_meta("player"): if !cam.has_meta("player"):
return return FAILED
blackboard_set(tick, "self", get_character(tick))
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state() var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
var o = root.global_transform.origin var o = root.global_transform.origin
var p = cam.get_meta("player").global_transform var p = cam.get_meta("player").global_transform
var pdst = o.distance_squared_to(p.origin) var pdst = o.distance_squared_to(p.origin)
var adest = o + (p.origin - o).normalized() * 3.0 blackboard_set(tick, "enemy_distance", pdst)
var fdest = o + (o - p.origin).normalized() * 3.0 blackboard_set(tick, "randf", get_memory(tick).rnd.randf())
var cmdq = [] blackboard_set(tick, "enemy_pos", p.origin)
if root.has_meta("cmdqueue"): blackboard_set(tick, "space", space)
cmdq = root.get_meta("cmdqueue") var adest = p.origin
match state: var away = (o - p.origin).normalized()
0: var attack_xform = Transform(root.global_transform.basis, o + away * 1.5)
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)
var fdest = o + away * 4.0
blackboard_set(tick, "away_pos", fdest)
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(tick, "dot", dot)
var result = get_memory(tick).runner._update_physics(tick, delta)
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
func stop(tick):
for e in conf_behaviors.keys():
if get_memory(tick).run_behaviors.has(e):
_unregister_module(tick, get_memory(tick).run_behaviors[e])
_unregister_module(tick, get_memory(tick).runner)

View File

@@ -6,8 +6,8 @@ extends AIScriptModule
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
func init(): func init(tick):
var root = get_character() var root = get_character(tick)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
var cmdq = [] var cmdq = []
if root.has_meta("cmdqueue"): if root.has_meta("cmdqueue"):
@@ -37,3 +37,8 @@ func action(data):
# if data.action == "hips_action": # if data.action == "hips_action":
# print(data) # print(data)
# marker_hips_action(data) # marker_hips_action(data)
func update(tick, delta):
return ERR_BUSY
func update_physics(tick, delta):
return ERR_BUSY

View File

@@ -24,8 +24,8 @@ var material = preload("res://scenes/clothes/mystress_clothes.material")
# ACTION # ACTION
#} #}
#var state = PRAYING #var state = PRAYING
func init(): func init(tick):
root = get_character() root = get_character(tick)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
root.add_to_group("mystress") root.add_to_group("mystress")
# tween = Tween.new() # tween = Tween.new()
@@ -74,7 +74,7 @@ func get_dest(pt: Vector3, exclusions: Array) -> Vector3:
if !r.empty(): if !r.empty():
ret = r.position - offt ret = r.position - offt
return ret return ret
func update_physics(delta): func update_physics(tick, delta):
var cmdq = [] var cmdq = []
if !skel: if !skel:
skel = root.get_meta("skeleton") skel = root.get_meta("skeleton")
@@ -151,6 +151,7 @@ func update_physics(delta):
state = 0 state = 0
root.set_meta("cmdqueue", cmdq) root.set_meta("cmdqueue", cmdq)
oldx = p.origin oldx = p.origin
return ERR_BUSY
# print("state =", state) # print("state =", state)
# var px = p.origin # var px = p.origin
# px.y = root.global_transform.origin.y # px.y = root.global_transform.origin.y
@@ -225,3 +226,5 @@ func update_physics(delta):
## cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"]) ## cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"])
## other.set_meta("cmdqueue", cmdq) ## other.set_meta("cmdqueue", cmdq)
## group_manager.submit_player_npc_event_arot(root, "sacrificed-a", root, "sacrificed", root) ## group_manager.submit_player_npc_event_arot(root, "sacrificed-a", root, "sacrificed", root)
func update(tick, delta):
return ERR_BUSY

View File

@@ -22,9 +22,9 @@ var basedir = "res://scenes/clothes/"
var material_female = preload("res://scenes/clothes/nun-clothes.material") var material_female = preload("res://scenes/clothes/nun-clothes.material")
var material_male = preload("res://scenes/clothes/clothes-male.material") var material_male = preload("res://scenes/clothes/clothes-male.material")
func init(): func init(tick):
name = "student_ai" name = "student_ai"
root = get_character() root = get_character(tick)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
root.add_to_group("students") root.add_to_group("students")
root.add_to_group("student") root.add_to_group("student")
@@ -42,3 +42,8 @@ func init():
g += garments_male_main g += garments_male_main
h += garments_head_male h += garments_head_male
characters.call_deferred("setup_garments", root, g, h, material_male) characters.call_deferred("setup_garments", root, g, h, material_male)
func update(tick, delta):
return ERR_BUSY
func update_physics(tick, delta):
return ERR_BUSY

View File

@@ -15,8 +15,8 @@ var garments = ["male-panties1", "male-shirt1"]
var garments_head = [] var garments_head = []
var basedir = "res://scenes/clothes/" var basedir = "res://scenes/clothes/"
var material = preload("res://scenes/clothes/clothes-male.material") var material = preload("res://scenes/clothes/clothes-male.material")
func init(): func init(tick):
root = get_character() root = get_character(tick)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
call_deferred("setup_markers") call_deferred("setup_markers")
@@ -81,3 +81,8 @@ func setup_garments():
# cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"]) # cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"])
# other.set_meta("cmdqueue", cmdq) # other.set_meta("cmdqueue", cmdq)
# group_manager.submit_player_npc_event_arot(root, "sacrificed-a", root, "sacrificed", root) # group_manager.submit_player_npc_event_arot(root, "sacrificed-a", root, "sacrificed", root)
func update_physics(tick, delta):
return ERR_BUSY
func update(tick, delta):
return ERR_BUSY

View File

@@ -10,20 +10,30 @@ extends AIScriptModule
var cam var cam
var fps_cam var fps_cam
var motion = Vector2() var motion = Vector2()
func init(): func init(tick):
var root = get_character() var root = get_character(tick)
assert(root.has_meta("skeleton")) assert(root.has_meta("skeleton"))
var attack = false var attack = false
var jump = false
var equipped = false var equipped = false
var vjump = Vector3()
func update(delta): func update(tick, delta):
if Input.is_action_pressed("attack"): return ERR_BUSY
func update_physics(tick, delta):
if !controls.is_gui:
if !attack:
if Input.is_action_just_pressed("attack"):
attack = true attack = true
if !jump:
func update_physics(delta): if Input.is_action_just_pressed("jump"):
jump = true
vjump = Vector3.UP * 10.0
var orientation: Transform var orientation: Transform
var root = get_character() var root = get_character(tick)
if !root.has_meta("cam"): if !root.has_meta("cam"):
return return
cam = root.get_meta("cam") cam = root.get_meta("cam")
@@ -76,6 +86,11 @@ func update_physics(delta):
cmdq = root.get_meta("cmdqueue") cmdq = root.get_meta("cmdqueue")
cmdq.push_back(["climb", "1"]) cmdq.push_back(["climb", "1"])
root.set_meta("cmdqueue", cmdq) root.set_meta("cmdqueue", cmdq)
if jump:
root.move_and_slide(vjump, Vector3(0.0, 1.0, 0.0), true, 4, 0.785, false)
vjump *= (1.0 - delta)
if vjump.length_squared() <= 0.0:
jump = false
if attack: if attack:
if !equipped: if !equipped:
@@ -84,6 +99,7 @@ func update_physics(delta):
wslot.set_meta("owner", root) wslot.set_meta("owner", root)
inventory.equip(wslot, "s_dagger") inventory.equip(wslot, "s_dagger")
equipped = true equipped = true
combat.emit_signal("event", "about_to_attack", [root])
animtree["parameters/state/playback"].travel("attack-melee1") animtree["parameters/state/playback"].travel("attack-melee1")
attack = false attack = false
else: else:
@@ -121,4 +137,5 @@ func update_physics(delta):
vehicle.engine_force = 500 * xmotion.y vehicle.engine_force = 500 * xmotion.y
var accel = vehicle.angular_velocity * 350.0 * delta var accel = vehicle.angular_velocity * 350.0 * delta
vehicle.steering = -xmotion.x * 0.7 vehicle.steering = -xmotion.x * 0.7
return ERR_BUSY

32
ui/main_menu.gd Normal file
View File

@@ -0,0 +1,32 @@
extends Control
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
func _ready():
controls.is_gui = true
$v/quit.connect("pressed", self, "quit_pressed")
$v/load_game.connect("pressed", self, "load_game_pressed")
$v/new_game.connect("pressed", self, "new_game_pressed")
$v/edit_ai.connect("pressed", self, "edit_ai_pressed")
func quit_pressed():
get_tree().quit()
func load_game_pressed():
controls.is_gui = true
hide()
# var main = preload("res://world.tscn")
# get_tree().change_scene_to(main)
controls.menu.nosave = true
controls.menu.popup()
func new_game_pressed():
controls.is_gui = false
var main = preload("res://world.tscn")
get_tree().change_scene_to(main)
func edit_ai_pressed():
var ai_graph = preload("res://ui/ai_graph.tscn")
get_tree().change_scene_to(ai_graph)

60
ui/main_menu.tscn Normal file
View File

@@ -0,0 +1,60 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://ui/theme.tres" type="Theme" id=1]
[ext_resource path="res://ui/main_menu.gd" type="Script" id=2]
[node name="main_menu" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="ColorRect" type="ColorRect" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
color = Color( 0.137255, 0.235294, 0.34902, 1 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="v" type="VBoxContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -72.0
margin_top = -92.0
margin_right = 72.0
margin_bottom = 92.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="load_game" type="Button" parent="v"]
margin_right = 144.0
margin_bottom = 43.0
theme = ExtResource( 1 )
text = "Load game"
[node name="new_game" type="Button" parent="v"]
margin_top = 47.0
margin_right = 144.0
margin_bottom = 90.0
theme = ExtResource( 1 )
text = "New Game"
[node name="edit_ai" type="Button" parent="v"]
margin_top = 94.0
margin_right = 144.0
margin_bottom = 137.0
theme = ExtResource( 1 )
text = "Edit AI"
[node name="quit" type="Button" parent="v"]
margin_top = 141.0
margin_right = 144.0
margin_bottom = 184.0
theme = ExtResource( 1 )
text = "Quit"

97
ui/save_game.gd Normal file
View File

@@ -0,0 +1,97 @@
extends WindowDialog
var save_path = "user://saves"
var next_save_id = 0
var nosave = false
func _ready():
print("save/load ready")
$v/quit.connect("pressed", self, "exit_game")
$v/return.connect("pressed", self, "close")
$v/save/new_save.connect("pressed", self, "save_game")
connect("about_to_show", self, "about_to_show")
connect("popup_hide", self, "popup_hide")
func exit_game():
controls.is_gui = false
get_tree().quit()
func close():
controls.is_gui = false
hide()
func save_game():
scenario.prepare_save_data()
print("next_save_id: ", next_save_id)
var filename = save_path + "/" + str(next_save_id) + ".sav"
var f = File.new()
if f.open(filename, File.WRITE) == OK:
print("saving to ", filename)
f.store_string(JSON.print(scenario.save_data, "\t", false))
f.close()
print("userdata = ", OS.get_user_data_dir())
controls.is_gui = false
hide()
func load_game(file_name):
controls.is_gui = false
nosave = false
var f = File.new()
if f.open(save_path + "/" + file_name, File.READ) == OK:
var s = f.get_as_text()
var result = JSON.parse(s)
scenario.save_data = result.result
scenario.restart_scene()
else:
print("Can't open ", file_name)
hide()
func popup_hide():
yield(get_tree().create_timer(0.5), "timeout")
controls.is_gui = false
hide()
func about_to_show():
print("save/load about to show")
if nosave:
if $v/save/new_save.visible:
$v/save/new_save.hide()
else:
if !$v/save/new_save.visible:
$v/save/new_save.show()
var d: = Directory.new()
var f: = File.new()
var theme = Theme.new()
var font: DynamicFont = preload("res://fonts/DefaultFont.tres")
theme.default_font = font
for e in $v/save/s/v.get_children():
e.queue_free()
if d.dir_exists(save_path):
if d.open(save_path) == OK:
d.list_dir_begin()
var file_name = d.get_next()
while file_name != "":
if file_name in [".", ".."]:
file_name = d.get_next()
continue
var fid = file_name.replace(".sav", "")
if fid.is_valid_integer():
next_save_id = max(next_save_id, int(fid) + 1)
print(file_name)
var t = f.get_modified_time(save_path + "/" + file_name)
var ts = OS.get_datetime_from_unix_time(t)
var b = Button.new()
b.theme = theme
b.text = "Load " + str(ts.year) + "." + str(ts.month) + "." + str(ts.day)
b.text += " " + str(ts.hour) + ":" + str(ts.minute) + ":" + str(ts.second)
print(b.text)
$v/save/s/v.add_child(b)
b.connect("pressed", self, "load_game", [file_name])
$v/save/s/v.update()
$v/save/s.update()
$v/save.update()
$v.update()
update()
$v/quit.update()
file_name = d.get_next()
d.list_dir_end()
else:
d.make_dir_recursive(save_path)
print("next_save_id: ", next_save_id)
update()

66
ui/save_game.tscn Normal file
View File

@@ -0,0 +1,66 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://fonts/DefaultFont.tres" type="DynamicFont" id=1]
[ext_resource path="res://ui/save_game.gd" type="Script" id=2]
[node name="save_game" type="WindowDialog"]
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 10.0
margin_top = 30.0
margin_right = -10.0
margin_bottom = -30.0
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="v" type="VBoxContainer" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
size_flags_horizontal = 3
size_flags_vertical = 3
__meta__ = {
"_edit_use_anchors_": false
}
[node name="return" type="Button" parent="v"]
margin_right = 1004.0
margin_bottom = 43.0
custom_fonts/font = ExtResource( 1 )
text = "Return to game"
[node name="save" type="VBoxContainer" parent="v"]
margin_top = 47.0
margin_right = 1004.0
margin_bottom = 493.0
size_flags_horizontal = 3
size_flags_vertical = 3
__meta__ = {
"_edit_use_anchors_": false
}
[node name="new_save" type="Button" parent="v/save"]
margin_right = 1004.0
margin_bottom = 43.0
custom_fonts/font = ExtResource( 1 )
text = "New save"
__meta__ = {
"_edit_use_anchors_": false
}
[node name="s" type="ScrollContainer" parent="v/save"]
margin_top = 47.0
margin_right = 1004.0
margin_bottom = 446.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="v" type="VBoxContainer" parent="v/save/s"]
[node name="quit" type="Button" parent="v"]
margin_top = 497.0
margin_right = 1004.0
margin_bottom = 540.0
custom_fonts/font = ExtResource( 1 )
text = "Quit game"

6
ui/theme.tres Normal file
View File

@@ -0,0 +1,6 @@
[gd_resource type="Theme" load_steps=2 format=2]
[ext_resource path="res://fonts/DefaultFont.tres" type="DynamicFont" id=1]
[resource]
default_font = ExtResource( 1 )

25
ui/town_menu.gd Normal file
View File

@@ -0,0 +1,25 @@
extends Control
func _ready():
$buttons/return.connect("pressed", self, "finish")
$buttons/upgrade.connect("pressed", self, "upgrade")
$buttons/teleport_to_town.connect("pressed", self, "teleport")
set_physics_process(false)
func finish():
controls.is_gui = false
hide()
func upgrade():
controls.is_gui = false
hide()
scenario.camp_level += 1
scenario.camp.queue_free()
scenario.camp = streaming.setup_bandit_camp(scenario.camp_site)
func teleport():
set_physics_process(true)
func _physics_process(delta):
var cam = get_viewport().get_camera()
if cam:
var player = cam.get_meta("player")
player.global_transform.origin = scenario.camp.global_transform.origin + Vector3(0, 10, 0)
set_physics_process(false)

45
ui/town_menu.tscn Normal file
View File

@@ -0,0 +1,45 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://ui/theme.tres" type="Theme" id=1]
[ext_resource path="res://ui/town_menu.gd" type="Script" id=2]
[node name="town_menu" type="Control"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="buttons" type="VBoxContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -20.0
margin_top = -20.0
margin_right = 20.0
margin_bottom = 20.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="upgrade" type="Button" parent="buttons"]
margin_right = 217.0
margin_bottom = 43.0
theme = ExtResource( 1 )
text = "Upgrade town"
[node name="teleport_to_town" type="Button" parent="buttons"]
margin_top = 47.0
margin_right = 217.0
margin_bottom = 90.0
theme = ExtResource( 1 )
text = "Teleport to town"
[node name="return" type="Button" parent="buttons"]
margin_top = 94.0
margin_right = 217.0
margin_bottom = 137.0
theme = ExtResource( 1 )
text = "Return"

View File

@@ -124,7 +124,7 @@ func _process(delta):
var fps_cam_rot_y var fps_cam_rot_y
var fps_cam_rot_x var fps_cam_rot_x
var default_offset var default_offset
player = characters.replace_character($player, "male", ["player", "cmdq", "player_clothes", "hurtboxes"]) player = characters.replace_player_character($player, "male", ["player", "cmdq", "player_clothes", "hurtboxes"])
$player.remove_child(viewer) $player.remove_child(viewer)
player.add_child(viewer) player.add_child(viewer)
# player.add_child(VoxelViewer.new()) # player.add_child(VoxelViewer.new())