Compare commits
2 Commits
master
...
d9e55d7dcf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9e55d7dcf | ||
|
|
f22cc56075 |
@@ -39,20 +39,20 @@ var roommates = {}
|
||||
|
||||
func _ready():
|
||||
var capsule_male = CapsuleShape.new()
|
||||
capsule_male.radius = 0.4
|
||||
capsule_male.height = 1.12
|
||||
capsule_male.margin = 0.08
|
||||
capsule_male.radius = 0.3
|
||||
capsule_male.height = 1.2
|
||||
capsule_male.margin = 0.05
|
||||
var capsule_female = CapsuleShape.new()
|
||||
capsule_female.radius = 0.35
|
||||
capsule_female.height = 0.9
|
||||
capsule_female.margin = 0.08
|
||||
capsule_female.radius = 0.2
|
||||
capsule_female.height = 1.1
|
||||
capsule_female.margin = 0.05
|
||||
CharacterSystemWorld.add_character_scene(female, {}, "female")
|
||||
CharacterSystemWorld.add_character_scene(male, {}, "male")
|
||||
for k in modules.keys():
|
||||
CharacterSystemWorld.add_module(k, modules[k])
|
||||
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.805, 0)), "female")
|
||||
CharacterSystemWorld.add_character_shape(capsule_male, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.965, 0)), "male")
|
||||
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_male, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.899, 0)), "male")
|
||||
set_root_motion_mod(Transform())
|
||||
var fd = File.new()
|
||||
fd.open("res://data/names.json", File.READ)
|
||||
@@ -101,7 +101,6 @@ func _ready():
|
||||
data_hair_materials[mat] = load(mat)
|
||||
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "male")
|
||||
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "female")
|
||||
CharacterSystemWorld.create_character_pool(1024)
|
||||
assert(male_faces.size() > 0)
|
||||
assert(female_faces.size() > 0)
|
||||
assert(male_hairs.size() > 0)
|
||||
@@ -160,25 +159,114 @@ func get_hair_node(sc: Node) -> Node:
|
||||
return sc.get_node(e)
|
||||
assert(0)
|
||||
return null
|
||||
#func compose_kinematic_character(g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
|
||||
# var id = create_character_in_pool(
|
||||
# return CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
|
||||
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 body = KinematicBody.new()
|
||||
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_player_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
|
||||
func replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
|
||||
assert(obj)
|
||||
var xform = obj.global_transform
|
||||
var p = obj.get_parent()
|
||||
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 = CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
|
||||
# p.add_child(body)
|
||||
# body.global_transform = xform
|
||||
# var orientation = Transform()
|
||||
# orientation.basis = xform.basis
|
||||
# body.set_meta("orientation", orientation)
|
||||
var body = CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
|
||||
p.add_child(body)
|
||||
body.global_transform = xform
|
||||
var orientation = Transform()
|
||||
orientation.basis = xform.basis
|
||||
body.set_meta("orientation", orientation)
|
||||
return body
|
||||
const basedir = "res://scenes/clothes/"
|
||||
#func prepare_extra_skeleton(obj, g):
|
||||
@@ -540,6 +628,6 @@ func _physics_process(delta):
|
||||
var player = get_player()
|
||||
if !player:
|
||||
return
|
||||
# if player.has_meta("animation_tree") && !player.has_meta("vehicle"):
|
||||
# if streaming.can_spawn:
|
||||
# character_physics(player)
|
||||
if player.has_meta("animation_tree") && !player.has_meta("vehicle"):
|
||||
if streaming.can_spawn:
|
||||
character_physics(player)
|
||||
|
||||
@@ -40,7 +40,6 @@ func equip(obj, item_name):
|
||||
print("EQUIP ", item_name, " OK", obj, r)
|
||||
obj.set_meta("equipped", item_name)
|
||||
c.set_meta("owner", obj.get_meta("owner"))
|
||||
c.set_meta("item_name", item_name)
|
||||
func register_pick_up(m, obj, item_name):
|
||||
var mdata = {
|
||||
"method": "pick_up",
|
||||
|
||||
@@ -60,7 +60,6 @@ class Grabbing:
|
||||
var cam_to = m.origin + Vector3.UP * 1.4
|
||||
emit_signal("enable_cinematic_camera", cam_where, cam_to)
|
||||
func reset_character(b):
|
||||
assert(b)
|
||||
b.remove_meta("cmdqueue")
|
||||
b.remove_meta("cmdq_walk")
|
||||
b.remove_meta("climb")
|
||||
|
||||
@@ -175,7 +175,7 @@ func setup_first_town(site):
|
||||
palace_aabb = palace_aabb.grow(48)
|
||||
print(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()):
|
||||
var ep = radial_points[p]
|
||||
@@ -278,7 +278,7 @@ func _ready():
|
||||
# Traffic.set_deny_physics()
|
||||
# Traffic.set_physics_distance(Vector3(30, -10, 40))
|
||||
# Traffic.set_debug(true)
|
||||
Traffic.set_spawn_cooldown(10, 15)
|
||||
Traffic.set_spawn_cooldown(2, 5)
|
||||
Traffic.set_default_speed(8.5)
|
||||
Traffic.add_traffic_vehicle(car)
|
||||
var water_mat = load("res://water/Water.material")
|
||||
@@ -350,8 +350,7 @@ func _physics_process(delta):
|
||||
base.push_back("bandit")
|
||||
if g.length() > 0:
|
||||
print(g, " ", base)
|
||||
CharacterSystemWorld.create_character_in_pool(g, base, n.global_transform)
|
||||
n.queue_free()
|
||||
characters.replace_character(n, g, base)
|
||||
elif n.is_in_group("car"):
|
||||
var p1 = cam.global_transform.origin
|
||||
var p2 = n.global_transform.origin
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=153 format=2]
|
||||
[gd_scene load_steps=143 format=2]
|
||||
|
||||
[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]
|
||||
@@ -70,32 +70,6 @@ node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
|
||||
|
||||
[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]
|
||||
animation = "start-grabbed2"
|
||||
|
||||
@@ -109,33 +83,6 @@ nodes/TimeScale/position = Vector2( 592, 184 )
|
||||
nodes/output/position = Vector2( 860, 120 )
|
||||
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]
|
||||
animation = "female-idle-to-kneel1"
|
||||
|
||||
@@ -179,7 +126,7 @@ nodes/TimeScale/position = Vector2( 580, 100 )
|
||||
nodes/output/position = Vector2( 1120, 120 )
|
||||
nodes/t1/node = SubResource( 26 )
|
||||
nodes/t1/position = Vector2( 880, 100 )
|
||||
node_connections = [ "output", 0, "t1", "t1", 0, "TimeScale", "t1", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
|
||||
node_connections = [ "output", 0, "t1", "TimeScale", 0, "Animation", "t1", 0, "TimeScale", "t1", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=28]
|
||||
animation = "walk1p2"
|
||||
@@ -199,7 +146,6 @@ input_1/name = "state 1"
|
||||
input_1/auto_advance = true
|
||||
|
||||
[sub_resource type="AnimationNodeBlendTree" id=33]
|
||||
graph_offset = Vector2( -264.489, -30 )
|
||||
nodes/Animation/node = SubResource( 29 )
|
||||
nodes/Animation/position = Vector2( 140, 100 )
|
||||
"nodes/Animation 2/node" = SubResource( 28 )
|
||||
@@ -211,7 +157,7 @@ nodes/TimeScale/position = Vector2( 620, 40 )
|
||||
nodes/Transition/node = SubResource( 32 )
|
||||
nodes/Transition/position = Vector2( 905, 264 )
|
||||
nodes/output/position = Vector2( 1280, 120 )
|
||||
node_connections = [ "output", 0, "Transition", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
|
||||
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=34]
|
||||
animation = "07_01-walk"
|
||||
@@ -239,16 +185,84 @@ nodes/TimeScale/position = Vector2( 580, 120 )
|
||||
nodes/output/position = Vector2( 840, 140 )
|
||||
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]
|
||||
blend_point_0/node = SubResource( 27 )
|
||||
blend_point_0/pos = Vector2( 0, 0 )
|
||||
blend_point_1/node = SubResource( 33 )
|
||||
blend_point_1/pos = Vector2( 0.1, 0 )
|
||||
blend_point_1/pos = Vector2( 0.2, 0 )
|
||||
blend_point_2/node = SubResource( 36 )
|
||||
blend_point_2/pos = Vector2( 0.2, -1 )
|
||||
blend_point_3/node = SubResource( 39 )
|
||||
blend_point_3/pos = Vector2( 0.2, 1 )
|
||||
blend_mode = 1
|
||||
blend_point_4/node = SubResource( 45 )
|
||||
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]
|
||||
graph_offset = Vector2( 0, -95 )
|
||||
@@ -288,7 +302,7 @@ nodes/TimeScale/position = Vector2( 640, 200 )
|
||||
nodes/Transition/node = SubResource( 59 )
|
||||
nodes/Transition/position = Vector2( 860, 220 )
|
||||
nodes/output/position = Vector2( 1080, 200 )
|
||||
node_connections = [ "output", 0, "Transition", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
|
||||
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=61]
|
||||
animation = "female-pray-startled1"
|
||||
@@ -354,7 +368,7 @@ nodes/attack2/position = Vector2( 1140, 300 )
|
||||
nodes/output/position = Vector2( 1580, 180 )
|
||||
nodes/speed/node = SubResource( 74 )
|
||||
nodes/speed/position = Vector2( 540, 60 )
|
||||
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" ]
|
||||
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" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=76]
|
||||
animation = "dagger-sacrifice-counter-p"
|
||||
@@ -552,34 +566,6 @@ switch_mode = 2
|
||||
switch_mode = 2
|
||||
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]
|
||||
states/attack-melee1/node = SubResource( 135 )
|
||||
states/attack-melee1/position = Vector2( 1277, 411.193 )
|
||||
@@ -589,16 +575,8 @@ states/climb1a/node = SubResource( 14 )
|
||||
states/climb1a/position = Vector2( 947, 503.193 )
|
||||
states/drive/node = SubResource( 15 )
|
||||
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/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/grabbed/position = Vector2( 1277, 182.193 )
|
||||
states/kneel/node = SubResource( 21 )
|
||||
states/kneel/position = Vector2( 522, 84 )
|
||||
states/locomotion/node = SubResource( 53 )
|
||||
@@ -612,11 +590,11 @@ states/pray-startled/position = Vector2( 294, 316.193 )
|
||||
states/pray-startled-walk/node = SubResource( 60 )
|
||||
states/pray-startled-walk/position = Vector2( 294, 514.193 )
|
||||
states/sacrifice/node = SubResource( 75 )
|
||||
states/sacrifice/position = Vector2( 1547, 101 )
|
||||
states/sacrifice/position = Vector2( 1023, 135 )
|
||||
states/sacrificed/node = SubResource( 78 )
|
||||
states/sacrificed/position = Vector2( 1547, 180 )
|
||||
states/sacrificed/position = Vector2( 1125, 283 )
|
||||
states/sleeping/node = SubResource( 81 )
|
||||
states/sleeping/position = Vector2( 1045, 348.193 )
|
||||
states/sleeping/position = Vector2( 1078, 411.193 )
|
||||
states/stand-startled/node = SubResource( 84 )
|
||||
states/stand-startled/position = Vector2( 717, 411.193 )
|
||||
states/start_walking/node = SubResource( 115 )
|
||||
@@ -629,9 +607,9 @@ states/turn_right/node = SubResource( 126 )
|
||||
states/turn_right/position = Vector2( 1059, 620.193 )
|
||||
states/use_tap/node = SubResource( 85 )
|
||||
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 ), "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 ) ]
|
||||
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 ) ]
|
||||
start_node = "locomotion"
|
||||
graph_offset = Vector2( 496.672, 7.1925 )
|
||||
graph_offset = Vector2( 176.598, 15.1925 )
|
||||
|
||||
[sub_resource type="AnimationNodeBlendTree" id=111]
|
||||
graph_offset = Vector2( 445.846, -157.796 )
|
||||
@@ -654,19 +632,11 @@ node_connections = [ "output", 0, "blade_right", "all_scale", 0, "state", "blade
|
||||
|
||||
[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"]
|
||||
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"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "Head"
|
||||
|
||||
[node name="marker_talk" type="Spatial" parent="skeleton/Skeleton/head" index="0"]
|
||||
@@ -696,7 +666,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="hips" type="BoneAttachment" parent="skeleton/Skeleton" index="3"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "Hips"
|
||||
|
||||
[node name="marker_dagger_sacrifice" type="Spatial" parent="skeleton/Skeleton/hips" index="0"]
|
||||
@@ -711,21 +681,21 @@ monitorable = false
|
||||
shape = SubResource( 2 )
|
||||
|
||||
[node name="wrist_r" type="BoneAttachment" parent="skeleton/Skeleton" index="4"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "wrist_ik_R"
|
||||
|
||||
[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 )
|
||||
|
||||
[node name="wrist_l" type="BoneAttachment" parent="skeleton/Skeleton" index="5"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "wrist_ik_L"
|
||||
|
||||
[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 )
|
||||
|
||||
[node name="chest" type="BoneAttachment" parent="skeleton/Skeleton" index="6"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "Chest"
|
||||
|
||||
[node name="chest_hurt" type="Area" parent="skeleton/Skeleton/chest" index="0"]
|
||||
@@ -740,7 +710,7 @@ shape = SubResource( 3 )
|
||||
[node name="MeshInstance" type="MeshInstance" parent="skeleton/Skeleton" index="7"]
|
||||
|
||||
[node name="neck" type="BoneAttachment" parent="skeleton/Skeleton" index="8"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "Neck"
|
||||
|
||||
[node name="marker_neck_grab" type="Position3D" parent="skeleton/Skeleton/neck" index="0"]
|
||||
@@ -751,7 +721,6 @@ visible = false
|
||||
tree_root = SubResource( 111 )
|
||||
anim_player = NodePath("../AnimationPlayer")
|
||||
active = true
|
||||
process_mode = 0
|
||||
root_motion_track = NodePath("skeleton/Skeleton:root")
|
||||
parameters/all_scale/scale = 1.0
|
||||
parameters/blade_left/blend_amount = 0.0
|
||||
@@ -760,21 +729,23 @@ parameters/state/playback = SubResource( 112 )
|
||||
parameters/state/attack-melee1/attack1_speed/scale = 1.0
|
||||
parameters/state/climb1/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/guard-front-melee1/TimeScale/scale = 1.0
|
||||
parameters/state/guard-melee1/TimeScale/scale = 1.0
|
||||
parameters/state/kneel/TimeScale/scale = 1.0
|
||||
parameters/state/locomotion/loc/blend_position = Vector2( 0.00252736, 0.00604224 )
|
||||
parameters/state/locomotion/loc/blend_position = Vector2( -0.00127554, 0.00220752 )
|
||||
parameters/state/locomotion/loc/0/TimeScale/scale = 2.0
|
||||
"parameters/state/locomotion/loc/0/TimeScale 2/scale" = 1.5
|
||||
parameters/state/locomotion/loc/0/t1/current = 1
|
||||
parameters/state/locomotion/loc/0/t1/current = 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/Transition/current = 1
|
||||
parameters/state/locomotion/loc/1/Transition/current = 0
|
||||
parameters/state/locomotion/loc/2/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-startled/TimeScale/scale = 1.8
|
||||
parameters/state/pray-startled-walk/TimeScale/scale = 1.3
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=123 format=2]
|
||||
[gd_scene load_steps=103 format=2]
|
||||
|
||||
[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]
|
||||
@@ -79,32 +79,6 @@ nodes/TimeScale/position = Vector2( 520, 120 )
|
||||
nodes/output/position = Vector2( 740, 140 )
|
||||
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]
|
||||
animation = "start-grab2"
|
||||
|
||||
@@ -119,21 +93,6 @@ nodes/TimeScale/position = Vector2( 820, 100 )
|
||||
nodes/output/position = Vector2( 1160, 140 )
|
||||
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]
|
||||
animation = "stand1-loop"
|
||||
|
||||
@@ -316,7 +275,7 @@ nodes/TimeScale/position = Vector2( 780, 260 )
|
||||
nodes/Transition/node = SubResource( 118 )
|
||||
nodes/Transition/position = Vector2( 500, 280 )
|
||||
nodes/output/position = Vector2( 1000, 260 )
|
||||
node_connections = [ "output", 0, "TimeScale", "Transition", 0, "Animation", "Transition", 1, "Animation 2", "TimeScale", 0, "Transition" ]
|
||||
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=119]
|
||||
animation = "turn-right"
|
||||
@@ -344,7 +303,7 @@ nodes/TimeScale/position = Vector2( 840, 260 )
|
||||
nodes/Transition/node = SubResource( 120 )
|
||||
nodes/Transition/position = Vector2( 560, 260 )
|
||||
nodes/output/position = Vector2( 1060, 260 )
|
||||
node_connections = [ "output", 0, "TimeScale", "Transition", 0, "Animation", "Transition", 1, "Animation 2", "TimeScale", 0, "Transition" ]
|
||||
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeAnimation" id=123]
|
||||
animation = "dagger-sacrifice-counter-a"
|
||||
@@ -376,7 +335,7 @@ nodes/TimeScale/position = Vector2( 700, 140 )
|
||||
nodes/Transition/node = SubResource( 125 )
|
||||
nodes/Transition/position = Vector2( 940, 140 )
|
||||
nodes/output/position = Vector2( 1240, 140 )
|
||||
node_connections = [ "output", 0, "Transition", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2", "TimeScale", 0, "Animation" ]
|
||||
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
|
||||
|
||||
[sub_resource type="AnimationNodeStateMachineTransition" id=55]
|
||||
|
||||
@@ -445,59 +404,23 @@ xfade_time = 0.5
|
||||
switch_mode = 2
|
||||
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]
|
||||
states/attack-melee1/node = SubResource( 142 )
|
||||
states/attack-melee1/position = Vector2( 804.317, 380 )
|
||||
states/climb1/node = SubResource( 7 )
|
||||
states/climb1/position = Vector2( 359.444, 656 )
|
||||
states/climb1a/node = SubResource( 10 )
|
||||
states/climb1a/position = Vector2( 713.444, 92 )
|
||||
states/climb1a/position = Vector2( 659.444, 154 )
|
||||
states/drive/node = SubResource( 13 )
|
||||
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/drive/position = Vector2( 289, 430 )
|
||||
states/grab/node = SubResource( 16 )
|
||||
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/grab/position = Vector2( 739.444, 243 )
|
||||
states/locomotion/node = SubResource( 41 )
|
||||
states/locomotion/position = Vector2( 231, 174 )
|
||||
states/passenger/node = SubResource( 44 )
|
||||
states/passenger/position = Vector2( 458.444, 421 )
|
||||
states/passenger/position = Vector2( 555.444, 339 )
|
||||
states/sacrificed-a/node = SubResource( 48 )
|
||||
states/sacrificed-a/position = Vector2( 625.444, 779 )
|
||||
states/sacrificed-a/position = Vector2( 628.444, 464 )
|
||||
states/sleeping/node = SubResource( 51 )
|
||||
states/sleeping/position = Vector2( -112.556, 339 )
|
||||
states/start_walking/node = SubResource( 102 )
|
||||
@@ -510,12 +433,12 @@ states/turn_right/node = SubResource( 110 )
|
||||
states/turn_right/position = Vector2( 177.444, 671 )
|
||||
states/use_tap/node = SubResource( 54 )
|
||||
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 ), "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 ) ]
|
||||
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 ) ]
|
||||
start_node = "locomotion"
|
||||
graph_offset = Vector2( -230.683, 15 )
|
||||
graph_offset = Vector2( -103.683, 58 )
|
||||
|
||||
[sub_resource type="AnimationNodeBlendTree" id=71]
|
||||
graph_offset = Vector2( -534, -71 )
|
||||
graph_offset = Vector2( -610.686, 0 )
|
||||
nodes/Animation/node = SubResource( 2 )
|
||||
nodes/Animation/position = Vector2( -200, 260 )
|
||||
"nodes/Animation 2/node" = SubResource( 1 )
|
||||
@@ -543,7 +466,7 @@ bones/94/bound_children = [ NodePath("wrist_r") ]
|
||||
bones/96/bound_children = [ NodePath("wrist_l") ]
|
||||
|
||||
[node name="wrist_r" type="BoneAttachment" parent="Skeleton" index="2"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "wrist_ik_r"
|
||||
|
||||
[node name="marker_wrist_r_grab" type="Position3D" parent="Skeleton/wrist_r" index="0"]
|
||||
@@ -554,7 +477,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 )
|
||||
|
||||
[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.02836, -0.0471478 )
|
||||
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 )
|
||||
bone_name = "wrist_ik_l"
|
||||
|
||||
[node name="marker_wrist_l_grab" type="Position3D" parent="Skeleton/wrist_l" index="0"]
|
||||
@@ -565,7 +488,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 )
|
||||
|
||||
[node name="head" type="BoneAttachment" parent="Skeleton" index="4"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "J_Bip_C_Head"
|
||||
|
||||
[node name="marker_talk" type="Position3D" parent="Skeleton/head" index="0"]
|
||||
@@ -592,7 +515,7 @@ transform = Transform( 0.967007, -0.0921614, 0.237496, 0.0940632, 0.995561, 0.00
|
||||
shape = SubResource( 149 )
|
||||
|
||||
[node name="hips" type="BoneAttachment" parent="Skeleton" index="5"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "J_Bip_C_Hips"
|
||||
|
||||
[node name="marker_hips_action" type="Position3D" parent="Skeleton/hips" index="0"]
|
||||
@@ -608,7 +531,7 @@ monitorable = false
|
||||
shape = SubResource( 148 )
|
||||
|
||||
[node name="neck" type="BoneAttachment" parent="Skeleton" index="6"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "J_Bip_C_Neck"
|
||||
|
||||
[node name="marker_neck_grab" type="Position3D" parent="Skeleton/neck" index="0"]
|
||||
@@ -616,7 +539,7 @@ transform = Transform( 0.998758, -0.00781338, 0.0492147, 0.00787775, 0.999969, -
|
||||
visible = false
|
||||
|
||||
[node name="penis_2" type="BoneAttachment" parent="Skeleton" index="7"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "penis2"
|
||||
|
||||
[node name="marker_penis_action" type="Position3D" parent="Skeleton/penis_2" index="0"]
|
||||
@@ -624,7 +547,7 @@ transform = Transform( 0.998824, -0.0252848, -0.0413812, 0.0249792, 0.999657, -0
|
||||
visible = false
|
||||
|
||||
[node name="chest" type="BoneAttachment" parent="Skeleton" index="8"]
|
||||
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 )
|
||||
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 )
|
||||
bone_name = "J_Bip_C_Chest"
|
||||
|
||||
[node name="chest_hurt" type="Area" parent="Skeleton/chest" index="0"]
|
||||
@@ -648,10 +571,7 @@ parameters/state/attack-melee1/TimeScale/scale = 1.0
|
||||
parameters/state/climb1/TimeScale/scale = 2.0
|
||||
parameters/state/climb1a/TimeScale/scale = 2.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/guard-melee1/TimeScale/scale = 1.0
|
||||
parameters/state/locomotion/loc/blend_position = Vector2( -0.00293946, -0.0151844 )
|
||||
parameters/state/locomotion/loc/0/TimeScale/scale = 1.0
|
||||
parameters/state/locomotion/loc/1/TimeScale/scale = 2.0
|
||||
|
||||
@@ -1,2 +1,12 @@
|
||||
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"])
|
||||
|
||||
@@ -9,15 +9,14 @@ script = ExtResource( 3 )
|
||||
|
||||
[node name="campfire" parent="." instance=ExtResource( 1 )]
|
||||
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 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 3 )
|
||||
|
||||
[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, 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 )
|
||||
transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 2.86465, 0.178202, 0 )
|
||||
|
||||
[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, 0.0150008 )
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38509, 0.249482, 2.91225 )
|
||||
|
||||
@@ -37,7 +37,6 @@ streaming="*res://autoload/streaming.tscn"
|
||||
freezer="*res://autoload/freezer.gd"
|
||||
scenario="*res://autoload/scenario.gd"
|
||||
orchestration="*res://autoload/orchestration.tscn"
|
||||
combat="*res://autoload/combat.gd"
|
||||
|
||||
[debug]
|
||||
|
||||
@@ -95,21 +94,9 @@ 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)
|
||||
]
|
||||
}
|
||||
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]
|
||||
|
||||
common/physics_fps=150
|
||||
3d/physics_engine="Bullet"
|
||||
|
||||
[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
@@ -4,21 +4,8 @@ var raycast_queue = []
|
||||
var blood = preload("res://scenes/decals/blood.tscn")
|
||||
var blood_decal = preload("res://scenes/decals/blood1-decal.gltf")
|
||||
var rnd
|
||||
var initialized = false
|
||||
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
|
||||
func init():
|
||||
var root = get_character()
|
||||
var queue = [root]
|
||||
var hurtboxes = []
|
||||
assert(root.has_meta("skeleton"))
|
||||
@@ -33,12 +20,15 @@ func init(tick):
|
||||
e.connect("area_entered", self, "area_hit", [e])
|
||||
rnd = RandomNumberGenerator.new()
|
||||
rnd.randomize()
|
||||
print("initialized ok")
|
||||
initialized = true
|
||||
func area_hit(area, e):
|
||||
var root = get_character()
|
||||
if area.is_in_group("weapon_hit"):
|
||||
var mo = area.get_meta("owner")
|
||||
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
|
||||
print("HIT")
|
||||
var bi = blood.instance()
|
||||
@@ -59,55 +49,36 @@ func area_hit(area, e):
|
||||
offt.y = 0
|
||||
org += xoff + offt
|
||||
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")
|
||||
# TODO: add delay
|
||||
bi.queue_free()
|
||||
|
||||
func update_physics(tick, delta):
|
||||
assert(initialized)
|
||||
root = get_character(tick)
|
||||
if !root:
|
||||
printerr("no character?")
|
||||
assert(!initialized)
|
||||
return FAILED
|
||||
func update_physics(delta):
|
||||
var root = get_character()
|
||||
var space_state: PhysicsDirectSpaceState = root.get_world().direct_space_state
|
||||
var offsets = [Vector3(0, -2, 0)]
|
||||
var cam = root.get_viewport().get_camera()
|
||||
if !cam.has_meta("player"):
|
||||
printerr("no player?")
|
||||
assert(!initialized)
|
||||
return FAILED
|
||||
return
|
||||
var player = cam.get_meta("player")
|
||||
raycast_queue.clear()
|
||||
# while raycast_queue.size() > 0:
|
||||
# var item = raycast_queue.pop_front()
|
||||
# var a = item
|
||||
# for boff in offsets:
|
||||
# var b = a + boff
|
||||
# var result = {}
|
||||
# if root is PhysicsBody:
|
||||
# result = space_state.intersect_ray(a, b, [root, player])
|
||||
# else:
|
||||
# result = space_state.intersect_ray(a, b)
|
||||
# if result.has("collider"):
|
||||
# var body = result.collider
|
||||
# var normal = result.normal
|
||||
# var position = result.position
|
||||
# var decal = blood_decal.instance()
|
||||
# decal.add_to_group("blood")
|
||||
# body.add_child(decal)
|
||||
# decal.global_transform.origin = position
|
||||
# var scale = 0.5 + rnd.randf() * 2.0
|
||||
# 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
|
||||
|
||||
while raycast_queue.size() > 0:
|
||||
var item = raycast_queue.pop_front()
|
||||
var a = item
|
||||
for boff in offsets:
|
||||
var b = a + boff
|
||||
var result = {}
|
||||
if root is PhysicsBody:
|
||||
result = space_state.intersect_ray(a, b, [root, player])
|
||||
else:
|
||||
result = space_state.intersect_ray(a, b)
|
||||
if result.has("collider"):
|
||||
var body = result.collider
|
||||
var normal = result.normal
|
||||
var position = result.position
|
||||
var decal = blood_decal.instance()
|
||||
decal.add_to_group("blood")
|
||||
body.add_child(decal)
|
||||
decal.global_transform.origin = position
|
||||
var scale = 0.5 + rnd.randf() * 2.0
|
||||
var rot = PI * 2.0 * rnd.randf()
|
||||
decal.global_transform.basis = Basis(normal).scaled(Vector3(scale, 1.0, scale)).rotated(normal, rot)
|
||||
|
||||
@@ -10,12 +10,12 @@ extends AIScriptModule
|
||||
|
||||
var animtree: AnimationTree
|
||||
var root_motion_track
|
||||
func init(tick):
|
||||
func init():
|
||||
# process_priority = 0
|
||||
pass
|
||||
|
||||
func can_walk_there(tick: AITick, dest: Vector3) -> bool:
|
||||
var root = get_character(tick)
|
||||
func can_walk_there(dest: Vector3) -> bool:
|
||||
var root = get_character()
|
||||
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
|
||||
var result = space.intersect_ray(root.global_transform.origin, dest, [root])
|
||||
if result.has("collider"):
|
||||
@@ -23,8 +23,8 @@ func can_walk_there(tick: AITick, dest: Vector3) -> bool:
|
||||
else:
|
||||
return true
|
||||
|
||||
func update_physics(tick, delta):
|
||||
var root = get_character(tick)
|
||||
func update_physics(delta):
|
||||
var root = get_character()
|
||||
var orientation: Transform
|
||||
assert(root.has_meta("skeleton"))
|
||||
|
||||
@@ -35,12 +35,12 @@ func update_physics(tick, delta):
|
||||
if animtree:
|
||||
root_motion_track = animtree.root_motion_track
|
||||
else:
|
||||
return FAILED
|
||||
return
|
||||
if characters.handle_cmdq(root):
|
||||
return
|
||||
var skel = root.get_meta("skeleton")
|
||||
if !skel:
|
||||
return FAILED
|
||||
if characters.handle_cmdq(root):
|
||||
return ERR_BUSY
|
||||
return
|
||||
if root.has_meta("cmdqueue"):
|
||||
var cmds = root.get_meta("cmdqueue")
|
||||
var cmd = cmds.pop_front()
|
||||
@@ -256,7 +256,3 @@ func update_physics(tick, delta):
|
||||
root.set_meta("cmdqueue", cmds)
|
||||
else:
|
||||
root.remove_meta("cmdqueue")
|
||||
return ERR_BUSY
|
||||
|
||||
func update(tick, delta):
|
||||
return ERR_BUSY
|
||||
|
||||
@@ -1,446 +1,38 @@
|
||||
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")
|
||||
|
||||
const attack_distance = 2.0
|
||||
const guard_distance = 2.0
|
||||
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
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
|
||||
class unconcious extends AIScriptModule:
|
||||
func init(tick):
|
||||
get_memory(tick).root = get_character(tick)
|
||||
get_memory(tick).state = 0
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var root
|
||||
var skel
|
||||
var hair_skel
|
||||
var name
|
||||
|
||||
func update_physics(tick, delta):
|
||||
var root = get_memory(tick).root
|
||||
var anim1 = get_memory(tick).anim1
|
||||
var anim2 = get_memory(tick).anim2
|
||||
assert(root)
|
||||
assert(anim1)
|
||||
assert(anim2)
|
||||
match get_memory(tick).state:
|
||||
0:
|
||||
characters.animation_node_travel(root, anim1)
|
||||
get_memory(tick).state = 1
|
||||
return ERR_BUSY
|
||||
return ERR_BUSY
|
||||
func stop(tick):
|
||||
pass
|
||||
var garments_female_lingerie = ["female-panties1", "female-bra1"]
|
||||
var garments_head_female = []
|
||||
var garments_male_lingerie = ["male-panties1"]
|
||||
var garments_head_male = []
|
||||
var garments_female_main = ["female-shirt_skirt1"]
|
||||
var garments_male_main = ["male-pants1", "male-shoes1"]
|
||||
var basedir = "res://scenes/clothes/"
|
||||
var material_female = preload("res://scenes/clothes/nun-clothes.material")
|
||||
var material_male = preload("res://scenes/clothes/clothes-male.material")
|
||||
|
||||
class get_damage extends AIScriptModule:
|
||||
func init(tick):
|
||||
get_memory(tick).root = get_character(tick)
|
||||
get_memory(tick).state = 0
|
||||
var state = 0
|
||||
var health = 100.0
|
||||
var stamina = 100.0
|
||||
|
||||
func update_physics(tick, delta):
|
||||
var root = get_memory(tick).root
|
||||
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)
|
||||
func init():
|
||||
name = "bandit_ai"
|
||||
root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
get_memory(tick).rnd = RandomNumberGenerator.new()
|
||||
get_memory(tick).rnd.randomize()
|
||||
root.add_to_group("bandits")
|
||||
root.add_to_group("bandit")
|
||||
root.add_to_group("students")
|
||||
root.add_to_group("student")
|
||||
|
||||
var character_data = root.get_meta("character_data")
|
||||
if character_data.sex == "female":
|
||||
var g = garments_female_lingerie
|
||||
@@ -454,206 +46,93 @@ func init(tick):
|
||||
g += garments_male_main
|
||||
h += garments_head_male
|
||||
characters.call_deferred("setup_garments", root, g, h, material_male)
|
||||
|
||||
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
|
||||
state = 0
|
||||
var cooldown = 0.0
|
||||
|
||||
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)
|
||||
func update_physics(delta):
|
||||
var cam = root.get_viewport().get_camera()
|
||||
if !cam:
|
||||
return FAILED
|
||||
return
|
||||
if !cam.has_meta("player"):
|
||||
return FAILED
|
||||
blackboard_set(tick, "self", get_character(tick))
|
||||
return
|
||||
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
|
||||
var o = root.global_transform.origin
|
||||
var p = cam.get_meta("player").global_transform
|
||||
var pdst = o.distance_squared_to(p.origin)
|
||||
blackboard_set(tick, "enemy_distance", pdst)
|
||||
blackboard_set(tick, "randf", get_memory(tick).rnd.randf())
|
||||
blackboard_set(tick, "enemy_pos", p.origin)
|
||||
blackboard_set(tick, "space", space)
|
||||
var adest = p.origin
|
||||
var away = (o - p.origin).normalized()
|
||||
var attack_xform = Transform(root.global_transform.basis, o + away * 1.5)
|
||||
|
||||
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 adest = o + (p.origin - o).normalized() * 3.0
|
||||
var fdest = o + (o - p.origin).normalized() * 3.0
|
||||
var cmdq = []
|
||||
if root.has_meta("cmdqueue"):
|
||||
cmdq = root.get_meta("cmdqueue")
|
||||
match state:
|
||||
0:
|
||||
if stamina < 100.0:
|
||||
stamina += delta
|
||||
if stamina > 50.0 && pdst < 100.0 && pdst > 8.0:
|
||||
var skel = root.get_meta("skeleton")
|
||||
var wslot = skel.get_node("wrist_r/weapon_right")
|
||||
wslot.set_meta("owner", root)
|
||||
inventory.equip(wslot, "s_dagger")
|
||||
# walk to enemy
|
||||
state = 10
|
||||
elif stamina > 50.0 && pdst <= 8.0:
|
||||
# melee attack enemy
|
||||
state = 20
|
||||
elif stamina <= 50.0 && stamina > 10.0 && pdst < 50.0:
|
||||
# flee away
|
||||
state = 30
|
||||
elif stamina <= 10.0 && pdst <= 16.0:
|
||||
# still flee away
|
||||
state = 30
|
||||
elif stamina <= 10.0 && pdst > 16.0:
|
||||
# rest
|
||||
state = 40
|
||||
10:
|
||||
# walk to enemy (player)
|
||||
stamina -= 4 * delta
|
||||
var dest = adest
|
||||
cmdq.push_back(["walkto", dest, 1.5, 2])
|
||||
state = 11
|
||||
11:
|
||||
# wait for start walking
|
||||
if root.has_meta("cmdq_walk"):
|
||||
characters.set_walk_speed(root, 0.5, 0)
|
||||
state = 12
|
||||
12:
|
||||
# finished walking
|
||||
stamina -= 4 * delta
|
||||
if !root.has_meta("cmdq_walk"):
|
||||
state = 0
|
||||
20:
|
||||
# attack
|
||||
stamina -= 3500 * delta
|
||||
characters.animation_node_travel(root, "attack-melee1")
|
||||
cooldown = 0.8
|
||||
state = 21
|
||||
21:
|
||||
cooldown -= delta
|
||||
stamina -= 5 * delta
|
||||
if cooldown <= 0.0:
|
||||
state = 0
|
||||
30:
|
||||
# walk away from enemy (player)
|
||||
stamina -= 15 * delta
|
||||
var dest = fdest
|
||||
cmdq.push_back(["walkto", dest, 1.5, 2])
|
||||
state = 31
|
||||
31:
|
||||
# wait for start fleeing
|
||||
if root.has_meta("cmdq_walk"):
|
||||
characters.set_walk_speed(root, 0.65, 0)
|
||||
state = 32
|
||||
32:
|
||||
# finished fleeing
|
||||
stamina -= 15 * delta
|
||||
if !root.has_meta("cmdq_walk"):
|
||||
state = 0
|
||||
40:
|
||||
stamina += 15500.0 * delta
|
||||
if stamina > 90.0:
|
||||
state = 0
|
||||
stamina = clamp(stamina, 0, 100.0)
|
||||
root.set_meta("cmdqueue", cmdq)
|
||||
|
||||
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)
|
||||
|
||||
@@ -6,8 +6,8 @@ extends AIScriptModule
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func init(tick):
|
||||
var root = get_character(tick)
|
||||
func init():
|
||||
var root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
var cmdq = []
|
||||
if root.has_meta("cmdqueue"):
|
||||
@@ -37,8 +37,3 @@ func action(data):
|
||||
# if data.action == "hips_action":
|
||||
# print(data)
|
||||
# marker_hips_action(data)
|
||||
|
||||
func update(tick, delta):
|
||||
return ERR_BUSY
|
||||
func update_physics(tick, delta):
|
||||
return ERR_BUSY
|
||||
|
||||
@@ -24,8 +24,8 @@ var material = preload("res://scenes/clothes/mystress_clothes.material")
|
||||
# ACTION
|
||||
#}
|
||||
#var state = PRAYING
|
||||
func init(tick):
|
||||
root = get_character(tick)
|
||||
func init():
|
||||
root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
root.add_to_group("mystress")
|
||||
# tween = Tween.new()
|
||||
@@ -74,7 +74,7 @@ func get_dest(pt: Vector3, exclusions: Array) -> Vector3:
|
||||
if !r.empty():
|
||||
ret = r.position - offt
|
||||
return ret
|
||||
func update_physics(tick, delta):
|
||||
func update_physics(delta):
|
||||
var cmdq = []
|
||||
if !skel:
|
||||
skel = root.get_meta("skeleton")
|
||||
@@ -151,7 +151,6 @@ func update_physics(tick, delta):
|
||||
state = 0
|
||||
root.set_meta("cmdqueue", cmdq)
|
||||
oldx = p.origin
|
||||
return ERR_BUSY
|
||||
# print("state =", state)
|
||||
# var px = p.origin
|
||||
# px.y = root.global_transform.origin.y
|
||||
@@ -226,5 +225,3 @@ func update_physics(tick, delta):
|
||||
## cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"])
|
||||
## other.set_meta("cmdqueue", cmdq)
|
||||
## group_manager.submit_player_npc_event_arot(root, "sacrificed-a", root, "sacrificed", root)
|
||||
func update(tick, delta):
|
||||
return ERR_BUSY
|
||||
|
||||
@@ -22,9 +22,9 @@ var basedir = "res://scenes/clothes/"
|
||||
var material_female = preload("res://scenes/clothes/nun-clothes.material")
|
||||
var material_male = preload("res://scenes/clothes/clothes-male.material")
|
||||
|
||||
func init(tick):
|
||||
func init():
|
||||
name = "student_ai"
|
||||
root = get_character(tick)
|
||||
root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
root.add_to_group("students")
|
||||
root.add_to_group("student")
|
||||
@@ -42,8 +42,3 @@ func init(tick):
|
||||
g += garments_male_main
|
||||
h += garments_head_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
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ var garments = ["male-panties1", "male-shirt1"]
|
||||
var garments_head = []
|
||||
var basedir = "res://scenes/clothes/"
|
||||
var material = preload("res://scenes/clothes/clothes-male.material")
|
||||
func init(tick):
|
||||
root = get_character(tick)
|
||||
func init():
|
||||
root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
|
||||
call_deferred("setup_markers")
|
||||
@@ -81,8 +81,3 @@ func setup_garments():
|
||||
# cmdq.push_back(["equip", "wrist_r/weapon_right", "s_dagger"])
|
||||
# other.set_meta("cmdqueue", cmdq)
|
||||
# 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
|
||||
|
||||
|
||||
@@ -10,30 +10,20 @@ extends AIScriptModule
|
||||
var cam
|
||||
var fps_cam
|
||||
var motion = Vector2()
|
||||
func init(tick):
|
||||
var root = get_character(tick)
|
||||
func init():
|
||||
var root = get_character()
|
||||
assert(root.has_meta("skeleton"))
|
||||
|
||||
var attack = false
|
||||
var jump = false
|
||||
var equipped = false
|
||||
var vjump = Vector3()
|
||||
|
||||
func update(tick, delta):
|
||||
return ERR_BUSY
|
||||
func update(delta):
|
||||
if Input.is_action_pressed("attack"):
|
||||
attack = true
|
||||
|
||||
|
||||
func update_physics(tick, delta):
|
||||
if !controls.is_gui:
|
||||
if !attack:
|
||||
if Input.is_action_just_pressed("attack"):
|
||||
attack = true
|
||||
if !jump:
|
||||
if Input.is_action_just_pressed("jump"):
|
||||
jump = true
|
||||
vjump = Vector3.UP * 10.0
|
||||
func update_physics(delta):
|
||||
var orientation: Transform
|
||||
var root = get_character(tick)
|
||||
var root = get_character()
|
||||
if !root.has_meta("cam"):
|
||||
return
|
||||
cam = root.get_meta("cam")
|
||||
@@ -86,11 +76,6 @@ func update_physics(tick, delta):
|
||||
cmdq = root.get_meta("cmdqueue")
|
||||
cmdq.push_back(["climb", "1"])
|
||||
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 !equipped:
|
||||
@@ -99,7 +84,6 @@ func update_physics(tick, delta):
|
||||
wslot.set_meta("owner", root)
|
||||
inventory.equip(wslot, "s_dagger")
|
||||
equipped = true
|
||||
combat.emit_signal("event", "about_to_attack", [root])
|
||||
animtree["parameters/state/playback"].travel("attack-melee1")
|
||||
attack = false
|
||||
else:
|
||||
@@ -137,5 +121,4 @@ func update_physics(tick, delta):
|
||||
vehicle.engine_force = 500 * xmotion.y
|
||||
var accel = vehicle.angular_velocity * 350.0 * delta
|
||||
vehicle.steering = -xmotion.x * 0.7
|
||||
return ERR_BUSY
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
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)
|
||||
@@ -1,60 +0,0 @@
|
||||
[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"
|
||||
@@ -1,97 +0,0 @@
|
||||
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()
|
||||
@@ -1,66 +0,0 @@
|
||||
[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"
|
||||
@@ -1,6 +0,0 @@
|
||||
[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 )
|
||||
@@ -1,25 +0,0 @@
|
||||
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)
|
||||
@@ -1,45 +0,0 @@
|
||||
[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"
|
||||
2
world.gd
2
world.gd
@@ -124,7 +124,7 @@ func _process(delta):
|
||||
var fps_cam_rot_y
|
||||
var fps_cam_rot_x
|
||||
var default_offset
|
||||
player = characters.replace_player_character($player, "male", ["player", "cmdq", "player_clothes", "hurtboxes"])
|
||||
player = characters.replace_character($player, "male", ["player", "cmdq", "player_clothes", "hurtboxes"])
|
||||
$player.remove_child(viewer)
|
||||
player.add_child(viewer)
|
||||
# player.add_child(VoxelViewer.new())
|
||||
|
||||
Reference in New Issue
Block a user