Compare commits

...

3 Commits

Author SHA1 Message Date
Segey Lapin
30ac134af9 Now support modular AI 2022-01-14 22:22:25 +03:00
Segey Lapin
dfbd2f34a5 GUI/AI improvements... 2022-01-09 02:40:04 +03:00
Segey Lapin
fedb6a38e1 AI can 'die' now; blackboard work 2022-01-04 06:45:16 +03:00
27 changed files with 121747 additions and 93568 deletions

View File

@@ -101,6 +101,7 @@ 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)
@@ -159,114 +160,25 @@ 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):
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 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 replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
func replace_player_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
assert(obj)
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):
@@ -628,6 +540,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)

View File

@@ -350,7 +350,8 @@ func _physics_process(delta):
base.push_back("bandit")
if g.length() > 0:
print(g, " ", base)
characters.replace_character(n, g, base)
CharacterSystemWorld.create_character_in_pool(g, base, n.global_transform)
n.queue_free()
elif n.is_in_group("car"):
var p1 = cam.global_transform.origin
var p2 = n.global_transform.origin

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=145 format=2]
[gd_scene load_steps=153 format=2]
[ext_resource path="res://scenes/characters/vroid1-female.gltf" type="PackedScene" id=1]
[ext_resource path="res://scenes/hair/female-hair1.tscn" type="PackedScene" id=2]
@@ -70,6 +70,32 @@ node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendTree" id=15]
[sub_resource type="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"
@@ -550,6 +576,10 @@ switch_mode = 2
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 )
@@ -559,6 +589,10 @@ 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 )
@@ -595,9 +629,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 ) ]
transitions = [ "locomotion", "passenger", SubResource( 86 ), "passenger", "locomotion", SubResource( 87 ), "passenger", "drive", SubResource( 88 ), "drive", "passenger", SubResource( 89 ), "drive", "locomotion", SubResource( 90 ), "locomotion", "drive", SubResource( 91 ), "sacrifice", "sacrificed", SubResource( 92 ), "sacrificed", "sacrifice", SubResource( 93 ), "locomotion", "kneel", SubResource( 94 ), "kneel", "pray", SubResource( 95 ), "pray", "locomotion", SubResource( 96 ), "pray", "pray-startled", SubResource( 97 ), "pray-startled", "pray-startled-walk", SubResource( 98 ), "sleeping", "locomotion", SubResource( 99 ), "pray-startled-walk", "stand-startled", SubResource( 100 ), "stand-startled", "locomotion", SubResource( 101 ), "locomotion", "grabbed", SubResource( 102 ), "grabbed", "locomotion", SubResource( 103 ), "locomotion", "climb1", SubResource( 104 ), "climb1", "locomotion", SubResource( 105 ), "locomotion", "climb1a", SubResource( 106 ), "climb1a", "locomotion", SubResource( 107 ), "use_tap", "locomotion", SubResource( 108 ), "locomotion", "use_tap", SubResource( 109 ), "locomotion", "start_walking", SubResource( 117 ), "start_walking", "locomotion", SubResource( 118 ), "locomotion", "stop_walking", SubResource( 119 ), "stop_walking", "locomotion", SubResource( 120 ), "locomotion", "tun_left", SubResource( 127 ), "tun_left", "locomotion", SubResource( 128 ), "locomotion", "turn_right", SubResource( 129 ), "turn_right", "locomotion", SubResource( 130 ), "locomotion", "attack-melee1", SubResource( 136 ), "attack-melee1", "locomotion", SubResource( 137 ), "attack-melee1", "guard-melee1", SubResource( 141 ), "guard-melee1", "attack-melee1", SubResource( 142 ), "locomotion", "guard-melee1", SubResource( 143 ), "guard-melee1", "locomotion", SubResource( 144 ), "attack-melee1", "guard-front-melee1", SubResource( 148 ), "guard-front-melee1", "attack-melee1", SubResource( 149 ), "locomotion", "guard-front-melee1", SubResource( 150 ), "guard-front-melee1", "locomotion", SubResource( 151 ), "locomotion", "fall-front", SubResource( 160 ), "locomotion", "fall-back", SubResource( 161 ) ]
start_node = "locomotion"
graph_offset = Vector2( 489.672, 57.1925 )
graph_offset = Vector2( 496.672, 7.1925 )
[sub_resource type="AnimationNodeBlendTree" id=111]
graph_offset = Vector2( 445.846, -157.796 )
@@ -632,7 +666,7 @@ bones/101/bound_children = [ NodePath("wrist_r") ]
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.83427, 0.331644, -0.440515, -0.191809, 0.923568, 0.332049, 0.516932, -0.192513, 0.834056, -0.0308392, 1.3151, 0.0139266 )
transform = Transform( 0.713409, 0.342413, -0.611461, -0.0945617, 0.911515, 0.400091, 0.694399, -0.227615, 0.682673, -0.0411225, 1.35382, -0.0195896 )
bone_name = "Head"
[node name="marker_talk" type="Spatial" parent="skeleton/Skeleton/head" index="0"]
@@ -662,7 +696,7 @@ transform = Transform( 1, -1.24197e-11, 0, 1.06852e-11, 1, -5.82077e-11, 0, 0, 1
[node name="female-face1" parent="skeleton/Skeleton/head/face" index="0" instance=ExtResource( 3 )]
[node name="hips" type="BoneAttachment" parent="skeleton/Skeleton" index="3"]
transform = Transform( 0.999052, 0.0440607, -0.00179843, 0.0440316, -0.998945, -0.014082, -0.00241711, 0.0139897, -0.999873, 0.000203862, 0.862223, -0.00645695 )
transform = Transform( 0.94223, 0.0611767, 0.329466, 0.0446752, -0.997287, 0.0574523, 0.332118, -0.0394095, -0.942444, 0.000203859, 0.89952, -0.00645694 )
bone_name = "Hips"
[node name="marker_dagger_sacrifice" type="Spatial" parent="skeleton/Skeleton/hips" index="0"]
@@ -677,21 +711,21 @@ monitorable = false
shape = SubResource( 2 )
[node name="wrist_r" type="BoneAttachment" parent="skeleton/Skeleton" index="4"]
transform = Transform( -0.523493, 0.831405, 0.186331, 0.799005, 0.403087, 0.446219, 0.295882, 0.382472, -0.875311, 0.246516, 0.816854, 0.0530603 )
transform = Transform( -0.245569, 0.908447, -0.338258, 0.959945, 0.276457, 0.0455697, 0.134912, -0.313518, -0.939949, 0.210898, 0.839866, 0.0647882 )
bone_name = "wrist_ik_R"
[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.108058, -0.685164, 0.720328, -0.790371, 0.498715, 0.355805, -0.603024, -0.530878, -0.595424, -0.214561, 0.852356, -0.138021 )
transform = Transform( -0.0838252, -0.864731, 0.495188, -0.980276, 0.160814, 0.114885, -0.178979, -0.47579, -0.861156, -0.181656, 0.840334, -0.0498495 )
bone_name = "wrist_ik_L"
[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.993031, -0.0677989, -0.096651, 0.0571863, 0.992449, -0.10864, 0.103279, 0.102345, 0.989339, -0.00688225, 1.02154, -0.0291024 )
transform = Transform( 0.958586, -0.0332876, -0.283002, 0.0462008, 0.998108, 0.0390467, 0.281199, -0.0505137, 0.958342, -0.00285422, 1.06003, -0.0194018 )
bone_name = "Chest"
[node name="chest_hurt" type="Area" parent="skeleton/Skeleton/chest" index="0"]
@@ -706,7 +740,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.930267, -0.237234, -0.27995, 0.246019, 0.96927, -0.00386425, 0.272244, -0.0652763, 0.959976, -0.0132515, 1.24324, 0.0187659 )
transform = Transform( 0.839515, -0.327886, -0.433348, 0.389612, 0.918993, 0.0594129, 0.378795, -0.218737, 0.899283, -0.0168142, 1.28569, -0.00337323 )
bone_name = "Neck"
[node name="marker_neck_grab" type="Position3D" parent="skeleton/Skeleton/neck" index="0"]
@@ -717,6 +751,7 @@ 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
@@ -725,6 +760,8 @@ 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
@@ -732,7 +769,7 @@ parameters/state/kneel/TimeScale/scale = 1.0
parameters/state/locomotion/loc/blend_position = Vector2( 0.00252736, 0.00604224 )
parameters/state/locomotion/loc/0/TimeScale/scale = 2.0
"parameters/state/locomotion/loc/0/TimeScale 2/scale" = 1.5
parameters/state/locomotion/loc/0/t1/current = 0
parameters/state/locomotion/loc/0/t1/current = 1
parameters/state/locomotion/loc/1/TimeScale/scale = 1.0
"parameters/state/locomotion/loc/1/TimeScale 2/scale" = 1.0
parameters/state/locomotion/loc/1/Transition/current = 1

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=116 format=2]
[gd_scene load_steps=123 format=2]
[ext_resource path="res://scenes/characters/vroid1-man.gltf" type="PackedScene" id=1]
[ext_resource path="res://scenes/hair/male-hair1.tscn" type="PackedScene" id=2]
@@ -79,6 +79,32 @@ 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"
@@ -443,6 +469,10 @@ 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 )
@@ -452,6 +482,10 @@ states/climb1a/node = SubResource( 10 )
states/climb1a/position = Vector2( 713.444, 92 )
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/grab/node = SubResource( 16 )
states/grab/position = Vector2( 713.444, 145 )
states/guard-front-melee1/node = SubResource( 157 )
@@ -476,12 +510,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 ) ]
transitions = [ "locomotion", "drive", SubResource( 55 ), "drive", "locomotion", SubResource( 56 ), "locomotion", "passenger", SubResource( 57 ), "passenger", "locomotion", SubResource( 58 ), "drive", "passenger", SubResource( 59 ), "passenger", "drive", SubResource( 60 ), "sleeping", "locomotion", SubResource( 61 ), "locomotion", "grab", SubResource( 62 ), "grab", "locomotion", SubResource( 63 ), "locomotion", "climb1", SubResource( 64 ), "climb1", "locomotion", SubResource( 65 ), "locomotion", "climb1a", SubResource( 66 ), "climb1a", "locomotion", SubResource( 67 ), "locomotion", "use_tap", SubResource( 68 ), "use_tap", "locomotion", SubResource( 69 ), "locomotion", "stop_walking", SubResource( 100 ), "stop_walking", "locomotion", SubResource( 101 ), "locomotion", "start_walking", SubResource( 103 ), "start_walking", "locomotion", SubResource( 104 ), "locomotion", "turn_left", SubResource( 111 ), "turn_left", "locomotion", SubResource( 112 ), "locomotion", "turn_right", SubResource( 113 ), "turn_right", "locomotion", SubResource( 114 ), "locomotion", "attack-melee1", SubResource( 143 ), "attack-melee1", "locomotion", SubResource( 144 ), "attack-melee1", "guard-melee1", SubResource( 153 ), "guard-melee1", "attack-melee1", SubResource( 154 ), "locomotion", "guard-melee1", SubResource( 155 ), "guard-melee1", "locomotion", SubResource( 156 ), "locomotion", "guard-front-melee1", SubResource( 158 ), "guard-front-melee1", "locomotion", SubResource( 159 ), "guard-front-melee1", "attack-melee1", SubResource( 160 ), "attack-melee1", "guard-front-melee1", SubResource( 161 ), "locomotion", "fall-front", SubResource( 168 ), "locomotion", "fall-back", SubResource( 169 ) ]
start_node = "locomotion"
graph_offset = Vector2( -103.683, 58 )
graph_offset = Vector2( -230.683, 15 )
[sub_resource type="AnimationNodeBlendTree" id=71]
graph_offset = Vector2( -610.686, 0 )
graph_offset = Vector2( -534, -71 )
nodes/Animation/node = SubResource( 2 )
nodes/Animation/position = Vector2( -200, 260 )
"nodes/Animation 2/node" = SubResource( 1 )
@@ -497,11 +531,6 @@ node_connections = [ "output", 0, "blade_right", "blade_left", 0, "state", "blad
[sub_resource type="AnimationNodeStateMachinePlayback" id=72]
[sub_resource type="CapsuleShape" id=162]
margin = 0.08
radius = 0.4
height = 1.12
[node name="vroid1-man" instance=ExtResource( 1 )]
[node name="Skeleton" parent="." index="0"]
@@ -514,7 +543,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.0839921, -0.0441852, 0.995486, 0.996075, -0.0242614, -0.0851186, 0.24008, 1.0159, -0.0908556 )
transform = Transform( 0.0279129, 0.998728, 0.041974, 0.083992, -0.0441852, 0.995486, 0.996075, -0.0242614, -0.0851186, 0.24008, 1.0159, -0.0689935 )
bone_name = "wrist_ik_r"
[node name="marker_wrist_r_grab" type="Position3D" parent="Skeleton/wrist_r" index="0"]
@@ -525,7 +554,7 @@ visible = false
transform = Transform( -1.62921e-07, -1, 0, -1.62921e-07, 2.65431e-14, 1, -1, 1.62921e-07, -1.62921e-07, -0.0452205, -0.00161505, -0.0947611 )
[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.03278, -0.0249881 )
transform = Transform( 0.531637, -0.84656, 0.0264325, -0.0845947, -0.0220212, 0.996172, -0.842737, -0.531838, -0.0833217, -0.202819, 1.02836, -0.0471478 )
bone_name = "wrist_ik_l"
[node name="marker_wrist_l_grab" type="Position3D" parent="Skeleton/wrist_l" index="0"]
@@ -536,7 +565,7 @@ visible = false
transform = Transform( -1.62921e-07, 1, 0, 1.62921e-07, 2.65431e-14, -1, -1, -1.62921e-07, -1.62921e-07, 0.04, -0.01, -0.089 )
[node name="head" type="BoneAttachment" parent="Skeleton" index="4"]
transform = Transform( 0.994828, 0.00617403, -0.101387, 0.0314632, 0.930328, 0.365376, 0.0965788, -0.366676, 0.925322, -0.0326583, 1.69764, -0.00392299 )
transform = Transform( 0.998981, -0.0174369, -0.0416214, 0.0314635, 0.930306, 0.365432, 0.0323486, -0.366369, 0.929906, -0.0329707, 1.69764, -0.0053772 )
bone_name = "J_Bip_C_Head"
[node name="marker_talk" type="Position3D" parent="Skeleton/head" index="0"]
@@ -563,7 +592,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.985395, -0.138022, 0.0997276, 0.150103, 0.98061, -0.125986, -0.0804051, 0.139115, 0.987006, 0.000514592, 1.10104, -0.0117666 )
transform = Transform( 0.987964, -0.143962, 0.0565838, 0.150106, 0.98061, -0.125986, -0.0373495, 0.132963, 0.990417, 0.000514592, 1.10104, -0.0117666 )
bone_name = "J_Bip_C_Hips"
[node name="marker_hips_action" type="Position3D" parent="Skeleton/hips" index="0"]
@@ -579,7 +608,7 @@ monitorable = false
shape = SubResource( 148 )
[node name="neck" type="BoneAttachment" parent="Skeleton" index="6"]
transform = Transform( 0.996345, -0.0385984, 0.0762004, 0.02621, 0.987196, 0.157347, -0.0812981, -0.154775, 0.984599, -0.0288674, 1.60068, 0.0112781 )
transform = Transform( 0.998943, -0.0318141, 0.033183, 0.0262132, 0.987195, 0.157347, -0.037764, -0.156311, 0.986985, -0.0298461, 1.60068, 0.00997471 )
bone_name = "J_Bip_C_Neck"
[node name="marker_neck_grab" type="Position3D" parent="Skeleton/neck" index="0"]
@@ -587,7 +616,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.985395, 0.0857902, -0.147092, 0.150103, -0.845508, 0.51243, -0.0804058, -0.527025, -0.846038, 0.00954038, 0.991264, -0.106081 )
transform = Transform( 0.987964, 0.108698, -0.110052, 0.150106, -0.845508, 0.51243, -0.0373501, -0.522782, -0.851648, 0.0136458, 0.991264, -0.105598 )
bone_name = "penis2"
[node name="marker_penis_action" type="Position3D" parent="Skeleton/penis_2" index="0"]
@@ -595,7 +624,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.996345, -0.0216645, 0.0826291, 0.0262187, 0.998173, -0.0544353, -0.0812988, 0.0564028, 0.995092, -0.0233174, 1.33823, -0.00534375 )
transform = Transform( 0.998943, -0.0241071, 0.0391486, 0.0262218, 0.998173, -0.0544354, -0.0377648, 0.0554043, 0.997749, -0.0235756, 1.33823, -0.00638926 )
bone_name = "J_Bip_C_Chest"
[node name="chest_hurt" type="Area" parent="Skeleton/chest" index="0"]
@@ -610,6 +639,7 @@ shape = SubResource( 147 )
tree_root = SubResource( 71 )
anim_player = NodePath("../AnimationPlayer")
active = true
process_mode = 0
root_motion_track = NodePath("Skeleton:Root")
parameters/blade_left/blend_amount = 0.0
parameters/blade_right/blend_amount = 0.0
@@ -618,6 +648,8 @@ 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 )
@@ -639,7 +671,3 @@ parameters/state/turn_right/Transition/current = 0
parameters/state/use_tap/TimeScale/scale = 1.0
"parameters/state/use_tap/TimeScale 2/scale" = 1.0
parameters/state/use_tap/Transition/current = 1
[node name="CollisionShape" type="CollisionShape" parent="." index="4"]
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.96478, 0 )
shape = SubResource( 162 )

View File

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

View File

@@ -9,14 +9,15 @@ script = ExtResource( 3 )
[node name="campfire" parent="." instance=ExtResource( 1 )]
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, 2.86465, 0.178202, 0 )
transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 4.71933, 0.178202, 0 )
[node name="npc3" type="Spatial" parent="." groups=["bandit", "male", "spawn"]]
transform = Transform( 0.930494, 0, 0.366306, 0, 1, 0, -0.366306, 0, 0.930494, 2.49152, 0.178202, 0 )
[node name="npc2" type="Spatial" parent="." groups=["bandit", "female", "spawn"]]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38509, 0.249482, 2.91225 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -2.38509, 0.249482, 0.0150008 )

View File

@@ -109,7 +109,7 @@ limits/command_queue/multithreading_queue_size_kb=512
[physics]
common/physics_jitter_fix=1.2
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

View File

@@ -5,15 +5,19 @@ var blood = preload("res://scenes/decals/blood.tscn")
var blood_decal = preload("res://scenes/decals/blood1-decal.gltf")
var rnd
var initialized = false
func init():
var root
func init(tick):
assert(!initialized)
if initialized:
printerr("already initialized")
return
var root = get_character()
root = get_character(tick)
if !root:
printerr("no character?")
return
var cam = root.get_viewport().get_camera()
if !cam.has_meta("player"):
printerr("no player?")
return
var queue = [root]
var hurtboxes = []
@@ -29,9 +33,9 @@ func init():
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:
@@ -61,16 +65,18 @@ func area_hit(area, e):
# TODO: add delay
bi.queue_free()
func update_physics(delta):
func update_physics(tick, delta):
assert(initialized)
var root = get_character()
root = get_character(tick)
if !root:
printerr("no character?")
assert(!initialized)
return FAILED
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
var player = cam.get_meta("player")
@@ -97,7 +103,11 @@ func update_physics(delta):
# 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(delta):
func update(tick, delta):
return ERR_BUSY

View File

@@ -10,12 +10,12 @@ extends AIScriptModule
var animtree: AnimationTree
var root_motion_track
func init():
func init(tick):
# process_priority = 0
pass
func can_walk_there(dest: Vector3) -> bool:
var root = get_character()
func can_walk_there(tick: AITick, dest: Vector3) -> bool:
var root = get_character(tick)
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(dest: Vector3) -> bool:
else:
return true
func update_physics(delta):
var root = get_character()
func update_physics(tick, delta):
var root = get_character(tick)
var orientation: Transform
assert(root.has_meta("skeleton"))
@@ -258,5 +258,5 @@ func update_physics(delta):
root.remove_meta("cmdqueue")
return ERR_BUSY
func update(delta):
func update(tick, delta):
return ERR_BUSY

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -24,8 +24,8 @@ var material = preload("res://scenes/clothes/mystress_clothes.material")
# ACTION
#}
#var state = PRAYING
func init():
root = get_character()
func init(tick):
root = get_character(tick)
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(delta):
func update_physics(tick, delta):
var cmdq = []
if !skel:
skel = root.get_meta("skeleton")
@@ -226,5 +226,5 @@ func update_physics(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(delta):
func update(tick, delta):
return ERR_BUSY

View File

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

View File

@@ -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():
root = get_character()
func init(tick):
root = get_character(tick)
assert(root.has_meta("skeleton"))
call_deferred("setup_markers")
@@ -81,8 +81,8 @@ 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(delta):
func update_physics(tick, delta):
return ERR_BUSY
func update(delta):
func update(tick, delta):
return ERR_BUSY

View File

@@ -10,8 +10,8 @@ extends AIScriptModule
var cam
var fps_cam
var motion = Vector2()
func init():
var root = get_character()
func init(tick):
var root = get_character(tick)
assert(root.has_meta("skeleton"))
var attack = false
@@ -19,7 +19,11 @@ var jump = false
var equipped = false
var vjump = Vector3()
func update(delta):
func update(tick, delta):
return ERR_BUSY
func update_physics(tick, delta):
if !controls.is_gui:
if !attack:
if Input.is_action_just_pressed("attack"):
@@ -28,12 +32,8 @@ func update(delta):
if Input.is_action_just_pressed("jump"):
jump = true
vjump = Vector3.UP * 10.0
return ERR_BUSY
func update_physics(delta):
var orientation: Transform
var root = get_character()
var root = get_character(tick)
if !root.has_meta("cam"):
return
cam = root.get_meta("cam")

32
ui/main_menu.gd Normal file
View File

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

60
ui/main_menu.tscn Normal file
View File

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

97
ui/save_game.gd Normal file
View File

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

66
ui/save_game.tscn Normal file
View File

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

6
ui/theme.tres Normal file
View File

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

25
ui/town_menu.gd Normal file
View File

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

45
ui/town_menu.tscn Normal file
View File

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

View File

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