This commit is contained in:
Segey Lapin
2021-10-26 21:51:45 +03:00
commit d6c8a24f5a
58 changed files with 271059 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.import
*.scn

604
autoload/characters.gd Normal file
View File

@@ -0,0 +1,604 @@
extends Characters_
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
onready var female = preload("res://characters/vroid1-female.tscn")
onready var male = preload("res://characters/vroid1-man.tscn")
onready var face_ctrl = preload("res://scenes/face/head_comtrol.tscn")
onready var modules = {
# "physics": load("res://scripts/modules/character_physics.gd"),
"cmdq": load("res://scripts/modules/cmdq.gd"),
"marker": load("res://scripts/modules/npc_marker.gd"),
"sacrifice": load("res://scripts/modules/npc_sacrifice.gd"),
"nun": load("res://scripts/modules/npc_nun.gd"),
"player": load("res://scripts/modules/player_controls.gd"),
"player_clothes": load("res://scripts/modules/player_clothes.gd"),
"hurtboxes": load("res://scripts/modules/character_hurtboxes.gd"),
"student": load("res://scripts/modules/npc_student.gd")
}
var face_data_path = "res://scenes/face/"
var hair_data_path = "res://scenes/hair/"
var female_faces = []
var male_faces = []
var female_hairs = []
var male_hairs = []
var hair_materials = []
var name_data = {}
var rnd
var roommates = {}
#var _crowd: DetourCrowdManager
func _ready():
set_root_motion_mod(Transform())
var fd = File.new()
fd.open("res://data/names.json", File.READ)
var names = fd.get_as_text()
var result = JSON.parse(names)
name_data = result.result
rnd = RandomNumberGenerator.new()
var data_fd: = File.new()
for g in ["male", "female"]:
var fp = face_data_path + g + "-face.tscn"
if data_fd.file_exists(fp):
match g:
"female":
female_faces.push_back(fp)
"male":
male_faces.push_back(fp)
for id in range(10000):
var fp_m = face_data_path + "male-face" + str(id) + ".tscn"
var fp_f = face_data_path + "female-face" + str(id) + ".tscn"
var hp_m = hair_data_path + "male-hair" + str(id) + ".tscn"
var hp_f = hair_data_path + "female-hair" + str(id) + ".tscn"
var mat = hair_data_path + "hair" + str(id) + ".tres"
if data_fd.file_exists(fp_m):
male_faces.push_back(fp_m)
if data_fd.file_exists(fp_f):
female_faces.push_back(fp_f)
if data_fd.file_exists(hp_m):
male_hairs.push_back(hp_m)
if data_fd.file_exists(hp_f):
female_hairs.push_back(hp_f)
if data_fd.file_exists(mat):
hair_materials.push_back(mat)
assert(male_faces.size() > 0)
assert(female_faces.size() > 0)
assert(male_hairs.size() > 0)
assert(female_hairs.size() > 0)
assert(hair_materials.size() > 0)
func get_relationship(obj1, obj2, s) -> int:
var stats1 = {}
var stats2 = {}
if obj1.has_meta("stats"):
stats1 = obj1.get_meta("stats")
if obj2.has_meta("stats"):
stats2 = obj2.get_meta("stats")
if !stats2.has("relationships"):
return 0
var rel = stats2.relationships
var cid = stats1.firstname + stats1.lastname
if !rel.has(cid):
return 0
var rel_data = rel[cid]
if rel_data.has(s):
return rel_data[s]
return 0
func set_relationships(obj1, obj2, s, v: int) -> void:
assert(obj1)
assert(obj2)
var stats1 = {}
var stats2 = {}
if obj1.has_meta("stats"):
stats1 = obj1.get_meta("stats")
if obj2.has_meta("stats"):
stats2 = obj2.get_meta("stats")
if !stats2.has("relationships"):
stats2.relationships = {}
var rel = stats2.relationships
var cid = stats1.firstname + stats1.lastname
if !rel.has(cid):
rel[cid] = {}
rel[cid][s] = v
print(stats2)
obj2.set_meta("stats", stats2)
func get_face_node(sc: Node) -> Node:
var face_node_paths = ["skeleton/Skeleton/head/face", "Skeleton/head/face"]
for e in face_node_paths:
if sc.has_node(e):
print("face node: ", e)
return sc.get_node(e)
assert(0)
return null
func get_hair_node(sc: Node) -> Node:
var hair_node_paths = ["skeleton/Skeleton/head/hair", "Skeleton/head/hair"]
for e in hair_node_paths:
if sc.has_node(e):
print("hair node: ", e)
return sc.get_node(e)
assert(0)
return null
func compose_kinematic_character(g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
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 = load(female_faces[face])
hair_scene = load(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 = load(male_faces[face])
hair_scene = load(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 = load(hair_materials[hair_mat])
assert(hmat)
set_hair_material(hair_i, hmat)
for e in face_node.get_children():
e.queue_free()
for e in hair_node.get_children():
e.queue_free()
face_node.add_child(face_i)
hair_node.add_child(hair_i)
var face_ctrl_i = face_ctrl.instance()
face_ctrl_i.active = true
face_i.add_child(face_ctrl_i)
face_i.set_meta("body", body)
body.set_meta("face_control", face_ctrl_i)
body.set_meta("face_playback", "parameters/state/playback")
face_ctrl_i.add_to_group("face")
face_i.transform = Transform()
character_data.face = face
character_data.hair = hair
character_data.hair_mat = hair_mat
cshape.shape = capsule
body.set_meta("character_data", character_data)
for e in enable_modules:
assert(modules.has(e))
if modules.has(e):
assert(modules[e])
var obj = modules[e].new()
body.add_child(obj)
setup_character_physics(body)
body.add_to_group("character")
return body
func replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
assert(obj)
var xform = obj.global_transform
var p = obj.get_parent()
obj.queue_free()
var body = compose_kinematic_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):
var queue = [obj]
while queue.size() > 0:
var item = queue.pop_front()
if item is Skeleton:
item.add_to_group(g)
break
for g in item.get_children():
queue.push_back(g)
func set_hair_material(hair, mat: Material):
assert(mat)
var queue = [hair]
while queue.size() > 0:
var item = queue.pop_front()
if item is MeshInstance:
item.set_surface_material(0, mat)
break
for g in item.get_children():
queue.push_back(g)
func setup_garments(obj, garments, garments_head, material):
var skel = obj.get_meta("skeleton")
var hair_skel = obj.get_meta("hair_skeleton")
if obj.has_meta("garments"):
print("Can remove garments")
var d = obj.get_meta("garments")
var db = d.body_data
var dh = d.head_data
for e in db + dh:
print("remove: ", e)
# obj.remove_child(e)
if e.get_parent() == obj:
obj.remove_child(e)
e.queue_free()
var gdata_body = []
for g in garments:
var m: MeshInstance = MeshInstance.new()
m.name = g
print("loading: ", basedir + g + ".mesh")
var geo: ArrayMesh = load(basedir + g + ".mesh")
assert(geo)
print("mesh: ", geo, "mat: ", material)
geo.surface_set_material(0, material)
m.mesh = geo
# m.skeleton = m.get_path_to(root.get_meta("skeleton"))
# = root.get_meta("skeleton")
skel.add_child(m)
m.transform = Transform()
gdata_body.push_back(m)
var gdata_head = []
for g in garments_head:
var m: MeshInstance = MeshInstance.new()
m.name = g
var geo: ArrayMesh = load(basedir + g + ".mesh")
print("mesh: ", geo, "mat: ", material)
geo.surface_set_material(0, material)
m.mesh = geo
# m.skeleton = m.get_path_to(root.get_meta("skeleton"))
# = root.get_meta("skeleton")
hair_skel.add_child(m)
m.transform = Transform()
gdata_head.push_back(m)
var gdata = {
"body": garments,
"head": garments_head,
"material": material,
"body_data": gdata_body,
"head_data": gdata_head
}
obj.set_meta("garments", gdata)
func lastname():
var lastnames = name_data.lastname
var d = lastnames.size()
return lastnames[rnd.randi() % d].to_lower().capitalize()
func firstname(g):
var firstnames = name_data[g].firstname
var d = firstnames.size()
return firstnames[rnd.randi() % d].to_lower().capitalize()
func generate_stats(npc: Node):
var stats = npc.get_meta("stats")
var strength = 10 + rnd.randi() % 100
var max_health = 10 + rnd.randi() % 100
var max_stamina = 10 + rnd.randi() % 100
stats.tiredness = 0.0
stats.hunger = 0.0
stats.thirst = 0.0
stats.libido = 0.0
stats.toilet = 0.0
stats.stress = 0.0
stats.health = max_health
stats.stamina = max_stamina
stats.max_health = max_health
stats.max_stamina = max_stamina
stats.violence = rnd.randi() % (int(strength * 0.5))
stats.xp = 0
npc.set_meta("stats", stats)
var stat_changes = {
"sleep":{
"tiredness": -0.3,
"stress": -0.03
},
"eating": {
"hunger": -0.9,
"stress": -0.01
},
"drinking": {
"thirst": -2.8,
"stress": -0.01
},
"use_tap": {
"thirst": -2.8,
"stress": -0.01
},
"locomotion": {
"tiredness": 0.0015,
"hunger": 0.025,
"thirst": 0.045,
"stress": 0.0001,
"libido": 0.00015,
"toilet": 0.0002
}
}
func update_stats(npc: Node):
var stats = npc.get_meta("stats")
if stats.tiredness < 10.0:
if stats.stamina < stats.max_stamina:
stats.stamina += 0.1
stats.stamina = clamp(stats.stamina, 0, stats.max_stamina)
var animtree = npc.get_meta("animation_tree")
var state = animtree["parameters/state/playback"].get_current_node()
if state in stat_changes.keys():
for s in stat_changes[state].keys():
stats[s] += stat_changes[state][s]
if stats[s] < 0:
stats[s] = 0.0
npc.set_meta("stats", stats)
# Action part should be integrated into SmartObjectManager
func check_leave_smart(npc: Node):
return
if !npc.has_meta("smart_object"):
return
var sm = npc.get_meta("smart_object")
var new_goal = calculate_goal(npc)
if !sm.is_in_group(new_goal):
# var animtree = npc.get_meta("animation_tree")
# animtree["parameters/state/playback"].travel("locomotion")
npc.remove_meta("smart_object")
func calculate_goal(npc: Node):
var utility = {
"sleep": ["tiredness", 900],
"hungry": ["hunger", 1000],
"thirsty": ["thirst", 1300],
"relieve_stress": ["stress", 800],
"have_sex": ["libido", 500],
"idle": ["", 600]
}
var stats = npc.get_meta("stats")
var rutility = -10000
var goal = "idle"
var last_goal = ""
var last_utility = -1
if npc.has_meta("last_goal"):
last_goal = npc.get_meta("last_goal")
goal = npc.get_meta("last_goal")
if npc.has_meta("last_utility"):
last_utility = int(npc.get_meta("last_utility"))
rutility = int(npc.get_meta("last_utility") * 2.0)
for k in utility.keys():
var st = 1.0
if utility[k][0] != "":
st = stats[utility[k][0]]
var mul = utility[k][1]
var cutil = int(st * mul)
if rutility < cutil:
rutility = cutil
goal = k
npc.set_meta("last_goal", goal)
if goal == last_goal:
npc.set_meta("last_utility", last_utility)
else:
npc.set_meta("last_utility", rutility)
return goal
var cooldown = 0.0
var close_groups = {}
func walkto_(npc, target):
assert(npc.has_meta("agent_id"))
if npc.has_mete("agent_id"):
walkto_agent(npc, target)
# if npc.has_meta("_target"):
# var otarget = npc.get_meta("_target")
# if target == otarget:
# return
# assert(npc.has_meta("agent_id"))
# npc.set_meta("_target", target)
## print("walk to ", target)
## print("walk to ", target)
## print("walk to ", target)
# var agent_id = npc.get_meta("agent_id")
# if target is Spatial:
# get_crowd().set_agent_target_position(agent_id, target.global_transform.origin)
# elif target is Vector3:
# get_crowd().set_agent_target_position(agent_id, target)
#func update_to_agent(root):
# if !_crowd:
# return
# if !root.has_meta("agent_id"):
# _crowd.add_agent(root, 0, false, PoolRealArray([0.2, 1.5, 0.3, 3.0]))
# if !root.has_meta("agent_id"):
# return
# if !root.has_meta("_target"):
# return
# var velocity = root.get_meta("agent_velocity")
# if velocity.length() == 0:
# characters.set_walk_speed(root, 0, 0)
# else:
## print("agent_velocity=", velocity)
# var vel1 = velocity
# vel1.y = 0
# var xform: = Transform().looking_at(vel1, Vector3.UP)
# xform = xform.orthonormalized()
# var orientation = root.get_meta("orientation")
# orientation.basis = orientation.basis.slerp(xform.basis, get_physics_process_delta_time())
# root.set_meta("orientation", orientation)
# characters.set_walk_speed(root, clamp(vel1.length() / 6.5, 0.0, 1.0), 0)
#
#func character_physics(root):
# var delta = get_physics_process_delta_time()
# var animtree = root.get_meta("animation_tree")
# var orientation = root.get_meta("orientation")
# var root_motion = animtree.get_root_motion_transform()
# orientation *= root_motion
# var h_velocity = orientation.origin / delta
# var velocity: = Vector3()
# velocity.x = h_velocity.x
# velocity.z = h_velocity.z
# velocity.y = h_velocity.y
## if root.has_meta("climb"):
## print("has climb meta")
## if root.has_meta("cmdqueue"):
## print("+has cmdqueue")
# if !root.has_meta("vehicle") && !root.has_meta("cmdqueue"):
# if root is KinematicBody:
# if !root.is_on_floor():
# velocity += Vector3(0, -9.8, 0)
# velocity = root.move_and_slide(velocity, Vector3.UP, true, 4, 0.785, false)
# elif root.has_meta("cmdqueue") && root.has_meta("cmdq_walk"):
# if root is KinematicBody:
# if !root.is_on_floor() && !root.has_meta("climb"):
# velocity += Vector3(0, -9.8, 0)
# velocity = root.move_and_slide(velocity, Vector3.UP, true, 4, 0.785, false)
# elif root.has_meta("cmdqueue") && root.has_meta("climb"):
# if root is KinematicBody:
# velocity.y = h_velocity.y
# velocity = root.move_and_slide(velocity, Vector3.UP, true, 4, 0.785, false)
# orientation.origin = Vector3()
# orientation = orientation.orthonormalized()
# root.global_transform.basis = orientation.basis
# root.set_meta("orientation", orientation)
# if root.has_meta("vehicle"):
# var vehicle: VehicleBody = get_meta("vehicle")
# if has_meta("vehicle_offset"):
# var xform = get_meta("vehicle_offset")
# root.global_transform = vehicle.global_transform * xform
# if root.has_node("blackboard"):
# var bb = root.get_node("blackboard")
# bb.set("velocity", velocity)
# update_to_agent(root)
func check_main_animtree(item):
if !item is AnimationTree:
return false
for g in ["hair", "face"]:
if item.is_in_group(g):
return false
return true
func check_main_skeleton(item):
if !item is Skeleton:
return false
for g in ["hair", "face"]:
if item.is_in_group(g):
return false
return true
func setup_character_physics(root):
var queue = [root]
while queue.size() > 0:
var item = queue.pop_front()
if check_main_animtree(item):
root.set_meta("animation_tree", item)
if check_main_skeleton(item):
root.set_meta("skeleton", item)
if item is Skeleton && item.is_in_group("hair"):
root.set_meta("hair_skeleton", item)
if item is Skeleton && item.is_in_group("face"):
root.set_meta("face_skeleton", item)
for e in item.get_children():
queue.push_back(e)
# var velocity = Vector3()
var orientation = Transform()
if root.is_inside_tree():
orientation = root.global_transform
orientation.origin = Vector3()
root.set_meta("orientation", orientation)
func _process(delta):
if cooldown > 0.0:
cooldown -= delta
return
for e in get_tree().get_nodes_in_group("character"):
var gr = []
for o in get_tree().get_nodes_in_group("character"):
if e == o:
continue
var e_org = e.global_transform.origin
var o_org = o.global_transform.origin
if e_org.distance_to(o_org) < 1.2:
gr.push_back(o)
close_groups[e] = gr
if e.has_meta("animation_tree"):
var animtree = e.get_meta("animation_tree")
var state = animtree["parameters/state/playback"].get_current_node()
var face_playback = e.get_meta("face_playback")
var face_ctrl = e.get_meta("face_control")
var p = face_ctrl[face_playback]
if state == "sleeping":
if p.get_current_node() != "sleeping":
p.travel("sleeping")
else:
if p.get_current_node() != "locomotion":
p.travel("locomotion")
cooldown = 0.2
func get_player():
var c = get_viewport().get_camera()
if !c:
return null
if !c.has_meta("player"):
return null
var player = c.get_meta("player")
if !player:
return null
return player
func _physics_process(delta):
var player = get_player()
if !player:
return
if player.has_meta("animation_tree") && !player.has_meta("vehicle"):
character_physics(player)
# for e in get_tree().get_nodes_in_group("character") + [player]:
# if e && e.has_meta("animation_tree"):
# character_physics(e)

192
autoload/controls.gd Normal file
View File

@@ -0,0 +1,192 @@
extends Node
var is_gui = false
var rot_cam = Vector3()
var mouse_sens = 0.3
var camera_anglev = 0
var fps_mode = false
var tmp_fps_mode = false
var focus_cam: Camera
var cam_focused: bool = false
var menu: Node
func display_menu():
menu.popup()
func _ready():
focus_cam = Camera.new()
add_child(focus_cam)
focus_cam.set_as_toplevel(true)
# var escape_menu = preload("res://ui/save_game.tscn")
# menu = escape_menu.instance()
# add_child(menu)
func is_fps_mode():
return fps_mode || tmp_fps_mode
func _input(event):
if !is_gui:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if event is InputEventMouseMotion && !is_gui:
rot_cam.y = deg2rad(-event.relative.x * mouse_sens)
var changev = -event.relative.y * mouse_sens
var player
if get_viewport().get_camera().has_meta("player"):
player = get_viewport().get_camera().get_meta("player")
if !player:
return
var cam = player.get_meta("cam")
var fps_cam = player.get_meta("fps_cam")
if cam.current:
if camera_anglev + changev > -30 and camera_anglev + changev < 40:
camera_anglev += changev
rot_cam.x = deg2rad(changev)
elif fps_cam.current:
if camera_anglev + changev > -60 and camera_anglev + changev < 60:
camera_anglev += changev
rot_cam.x = deg2rad(changev)
func focus_camera(obj):
if !obj:
print("NOTHING TO FOCUS")
return
if cam_focused:
return
print("FOCUS")
var cur_cam = get_viewport().get_camera()
var player = cur_cam.get_meta("player")
var cam = player.get_meta("cam")
focus_cam.global_transform = cam.global_transform
var do = obj.global_transform.origin
focus_cam.look_at(do, Vector3.UP)
cam_focused = true
focus_cam.set_meta("camera", cur_cam)
focus_cam.set_current(true)
focus_cam.set_meta("player", player)
func unfocus_camera():
cam_focused = false
var ncam = focus_cam.get_meta("camera")
ncam.set_current(true)
func fix_cam(state, _delta):
var player = get_viewport().get_camera().get_meta("player")
if !is_fps_mode():
var cam = player.get_meta("cam")
var cam_rot_y = cam.get_meta("cam_rot_y")
var cam_rot_x = cam.get_meta("cam_rot_x")
cam_rot_y.rotate_y(rot_cam.y)
cam_rot_x.rotate_x(rot_cam.x)
else:
if !player.has_meta("vehicle") && !player.has_meta("cmdqueue"):
var fps_cam = player.get_meta("fps_cam")
var fps_cam_rot_x = fps_cam.get_meta("fps_cam_rot_x")
var o: Transform = player.get_meta("orientation")
o.basis = o.basis.rotated(Vector3(0, 1, 0), rot_cam.y)
fps_cam_rot_x.rotate_x(rot_cam.x)
player.set_meta("orientation", o)
rot_cam.y = 0
rot_cam.x = 0
func get_player():
var c = get_viewport().get_camera()
assert(c)
if !c:
return null
assert(c.has_meta("player"))
if !c.has_meta("player"):
return null
var player = c.get_meta("player")
assert(player)
if !player:
return null
assert(player)
return player
func switch_fps_mode(value):
var player = get_player()
print(player)
if !player:
return
assert(player != null)
var cam = player.get_meta("cam")
var fps_cam = player.get_meta("fps_cam")
var cam_rot_y = cam.get_meta("cam_rot_y")
if !value:
cam.current = true
player.show_face()
#need to convert to globals
cam_rot_y.rotation.y = player.rotation.y
else:
fps_cam.current = true
player.hide_face()
var tmp_fps_cooldown = 0.0
func _process(delta):
var c = get_viewport().get_camera()
if !c:
return
if !c.has_meta("player"):
return
var player = get_player()
if !player:
return
if !is_gui && Input.is_action_just_pressed("ui_cancel"):
is_gui = true
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
display_menu()
if !is_gui && Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
elif is_gui && Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
var cam = player.get_meta("cam")
var fps_cam = player.get_meta("fps_cam")
var cam_pos = cam.get_meta("cam_pos")
var cam_arm = cam.get_meta("cam_arm")
cam_pos.global_transform.origin = player.global_transform.origin
cam.look_at(player.global_transform.origin + Vector3(0, 1.9, 0), Vector3.UP)
if Input.is_action_just_pressed("fps_mode") && !tmp_fps_mode:
fps_mode = !fps_mode
switch_fps_mode(fps_mode)
if !fps_mode && !tmp_fps_mode && !player.has_meta("vehicle"):
var s = cam_arm.global_transform.origin
var t = cam.global_transform.origin
if tmp_fps_cooldown <= 0.0:
if s.distance_to(t) < 0.3:
tmp_fps_mode = true
switch_fps_mode(tmp_fps_mode)
tmp_fps_cooldown = 1.0
if !fps_mode && tmp_fps_mode:
var s = cam_arm.global_transform.origin
var t = cam.global_transform.origin
if tmp_fps_cooldown <= 0.0:
if s.distance_to(t) > 0.4:
tmp_fps_mode = false
switch_fps_mode(tmp_fps_mode)
tmp_fps_cooldown = 3.0
if tmp_fps_cooldown > 0.0:
tmp_fps_cooldown -= delta
var spawn_delay = 0.5
func _physics_process(delta):
if spawn_delay > 0.5:
spawn_delay -= delta
return
var c = get_viewport().get_camera()
if !c:
return
if !c.has_meta("player"):
return
var player = c.get_meta("player")
if !player:
return
var space = player.get_world().space
var state = PhysicsServer.space_get_direct_state(space)
fix_cam(state, delta)

72
autoload/doors.gd Normal file
View File

@@ -0,0 +1,72 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
var door_list = {}
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
func register_door(obj: Node, name, door_obj, axis, cangle, oangle, spd):
assert(obj)
assert(door_obj)
var root_name = str(obj.get_path())
if !door_list.has(root_name):
door_list[root_name] = {}
var base = door_obj.transform
door_list[root_name][name] = {}
door_list[root_name][name].obj = door_obj
door_list[root_name][name].base = base
door_list[root_name][name].axis = axis
door_list[root_name][name].cangle = cangle
door_list[root_name][name].oangle = oangle
door_list[root_name][name].cur_angle = cangle
door_list[root_name][name].speed = spd
door_list[root_name][name].active = false
door_list[root_name][name].state = 0
func open_door(obj, name):
var root_name = str(obj.get_path())
if !door_list.has(root_name):
return
door_list[root_name][name].active = true
door_list[root_name][name].state = 1
func close_door(obj, name):
var root_name = str(obj.get_path())
if !door_list.has(root_name):
return
door_list[root_name][name].active = true
door_list[root_name][name].state = 0
func is_active(obj, name):
var root_name = str(obj.get_path())
if !door_list.has(root_name):
return false
return door_list[root_name][name].active
func get_state(obj, name):
var root_name = str(obj.get_path())
if !door_list.has(root_name):
return -1
return door_list[root_name][name].state
func _process(delta):
for e in door_list.keys():
for j in door_list[e].keys():
var m = door_list[e][j]
if m.active:
var change = min(1.0, m.speed * delta)
match m.state:
0:
if abs(m.cur_angle - m.cangle) < 0.001:
m.cur_angle = m.cangle
m.active = false
else:
m.cur_angle = lerp_angle(m.cur_angle, m.cangle, change)
1:
if abs(m.cur_angle - m.oangle) < 0.001:
m.cur_angle = m.oangle
m.active = false
else:
m.cur_angle = lerp_angle(m.cur_angle, m.oangle, change)
m.obj.transform.basis = m.base.basis.rotated(m.axis, m.cur_angle)

131
autoload/freezer.gd Normal file
View File

@@ -0,0 +1,131 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var freeze_dist = 20.0
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func freeze_character(c):
var pos = c.transform
var sp = Spatial.new()
var pp = c.get_parent()
var character_data = {}
var stats = {}
if c.has_meta("character_data"):
character_data = c.get_meta("character_data")
if c.has_meta("stats"):
stats = c.get_meta("stats")
pp.add_child(sp)
sp.transform = pos
sp.add_to_group("frozen")
sp.set_meta("character_data", character_data)
var animtree: AnimationTree = c.get_meta("animation_tree")
assert(animtree)
var animation_node = animtree["parameters/state/playback"].get_current_node()
sp.set_meta("animation_node", animation_node)
# sp.set_meta("animation_tree", str(c.get_path_to(animtree)))
sp.set_meta("stats", stats)
if characters.get_crowd():
characters.get_crowd().remove_agent(c)
c.queue_free()
func prepare_save_data() -> bool:
if !freeze_all():
return false
scenario.save_data.characters = []
for c in get_tree().get_nodes_in_group("frozen"):
var n = {}
n.character_data = c.get_meta("character_data")
n.stats = c.get_meta("stats")
n.animation_node = c.get_meta("animation_node")
n.xform = var2str(c.global_transform)
scenario.save_data.characters.push_back(n)
return true
func get_player():
var c = get_viewport().get_camera()
if !c:
return null
if !c.has_meta("player"):
return null
var player = c.get_meta("player")
if !player:
return null
return player
func unfreeze_character(c):
var data = c.get_meta("character_data")
var stats = c.get_meta("stats")
print("HAIR: ", data.hair, " ", data.hair_mat)
var nc = characters.replace_character(c, data.sex, data.modules, data.face, data.hair, data.hair_mat)
nc.set_meta("stats", stats)
var animtree: AnimationTree = nc.get_meta("animation_tree")
assert(animtree)
var animation_node = c.get_meta("animation_node")
animtree["parameters/state/playback"].start(animation_node)
animtree["parameters/state/playback"].travel(animation_node)
nc.set_meta("saved_anim_state", animation_node)
var state = 0
var delay = 0.0
func freeze_all() -> bool:
var player = get_player()
var ok = true
for c in get_tree().get_nodes_in_group("character"):
if c == player:
continue
elif c.name.begins_with("npc_spawn"):
c.queue_free()
continue
elif c.name == "npc" && !c.has_meta("animation_tree"):
print("bad ", c.name, " ", c.get_meta_list())
for e in c.get_meta_list():
print("bad", c.get_meta(e))
c.queue_free()
continue
assert(c.has_meta("animation_tree"))
if c.has_meta("animation_tree"):
freeze_character(c)
else:
ok = false
assert(ok)
return ok
func _process(delta):
var cam = get_viewport().get_camera()
var player = get_player()
if !player:
return
var cpos = cam.global_transform.origin
match state:
0:
characters.set_process(false)
for c in get_tree().get_nodes_in_group("character"):
if c == player:
continue
var p = c.global_transform.origin
if p.distance_squared_to(cpos) > freeze_dist * freeze_dist:
if c.has_meta("animation_tree"):
freeze_character(c)
characters.set_process(true)
state = 1
delay = 1.0
# print("spawned: ", get_tree().get_nodes_in_group("character").size())
# print("frozen: ", get_tree().get_nodes_in_group("frozen").size())
1:
characters.set_process(false)
for c in get_tree().get_nodes_in_group("frozen"):
var p = c.global_transform.origin
if p.distance_squared_to(cpos) < 0.25 * freeze_dist * freeze_dist:
print("unfreeze")
unfreeze_character(c)
characters.set_process(true)
if delay > 0.0:
delay -= delta
else:
state = 0

89
autoload/inventory.gd Normal file
View File

@@ -0,0 +1,89 @@
extends Node
signal pick_up(item_name, obj)
func _ready():
pass
var items = {
"s_dagger": false
}
var item_dialogue = {
"s_dagger": {
"item_fullname": "sacrificial dagger",
"item_artname": "the sacrificial dagger",
"item_msg": "You see ancient dagger a small piece of metal with nothing special about it except the feeling of uneasiness and understanding that this is not ordinary weapon, but something with different purpose than just defeating the enemy. Something to thank bloodthirsty gods? Or avoid their wrath.",
"item_take_msg": "You fill freezing touch of the rough dagger at your hand. You feel the touch of ancient history, of many many veins opened, and lots of hearts pierced.",
"item_leave_msg": "You left the dagger be."
}
}
onready var item_scenes = {
"s_dagger": load("res://scenes/weapons/sacrificial_dagger.tscn")
}
onready var item_collision_scenes = {
"s_dagger": load("res://scenes/weapons/dagger_collision.tscn")
}
func equip(obj, item_name):
if obj.has_meta("equipped"):
return
print("EQUIP ", item_name)
assert(obj)
assert(item_scenes.has(item_name))
var r = item_scenes[item_name].instance()
var c = item_collision_scenes[item_name].instance()
obj.add_child(r)
r.add_child(c)
r.transform = Transform()
c.transform = Transform()
print("EQUIP ", item_name, " OK", obj, r)
obj.set_meta("equipped", item_name)
func register_pick_up(m, obj, item_name):
var mdata = {
"method": "pick_up",
"item": item_name,
"item_obj": obj
}
markers.init_marker(self, m, mdata)
func pick_up_dialogue(item, item_obj):
return
# if controls.is_gui:
# return
# Dialogic.set_autosave(false)
# var scene = "pick_up_item"
# print("SCENE: ", scene)
# controls.is_gui = true
# var dialogue = Dialogic.start(scene, false)
# Dialogic.set_variable("item_name", item)
# Dialogic.set_variable("item_fullname", item_dialogue[item].item_fullname)
# Dialogic.set_variable("item_artname", item_dialogue[item].item_artname)
# Dialogic.set_variable("item_msg", item_dialogue[item].item_msg)
# Dialogic.set_variable("item_take_msg", item_dialogue[item].item_take_msg)
# Dialogic.set_variable("item_leave_msg", item_dialogue[item].item_leave_msg)
# add_child(dialogue)
# dialogue.connect("timeline_end", self, "finish_dialogue", [dialogue])
# dialogue.connect("dialogic_signal", self, "signal_process", [dialogue])
# dialogue.set_meta("item", item)
# dialogue.set_meta("item_obj", item_obj)
func finish_dialogue(dname, d):
controls.is_gui = false
d.queue_free()
func signal_process(s, d):
var item = d.get_meta("item")
var item_obj = d.get_meta("item_obj")
match s:
"item_accepted":
items[item] = true
emit_signal("pick_up", item, item_obj)
"item_rejected":
pass
func pick_up(obj):
if items.has(obj.item) && items[obj.item]:
return
if item_dialogue.has(obj.item):
pick_up_dialogue(obj.item, obj.item_obj)
else:
items[obj.item] = true
emit_signal("pick_up", obj.item, obj.item_obj)

52
autoload/map.gd Normal file
View File

@@ -0,0 +1,52 @@
tool
extends Node
export var noise: OpenSimplexNoise
export var curve: Curve
#
#var points = []
##var rg: RoadGrid
#var setup = false
#
#func _ready():
# if curve:
# curve.bake()
# else:
# curve = Curve.new()
# curve.min_value = -300
# curve.max_value = 300
# curve.add_point(Vector2(0, -300))
# curve.add_point(Vector2(1, 300))
# curve.bake()
# rg.build(curve, noise)
# setup = true
#
#func _init():
# rg = Roads.get_road_grid()
# var center = Vector2(0, 0)
# points.push_back(center)
# randomize()
# var npatches = 8
# var sa = randf() * 2.0 * PI
# var center_count = 15 + randi() % 5
# var center_step = 500
# var centers = []
# while centers.size() < center_count:
# var center_x = clamp(center_step * ((randi() % 100) - 50), -10000, 10000)
# var center_y = clamp(center_step * ((randi() % 100) - 50), -10000, 10000)
# var c = Vector2(center_x, center_y)
# if !c in centers:
# centers.push_back(c)
# for cx in centers:
# for e in range(npatches * 8):
# var a = sa + sqrt(e) * 8.0
# var r = 0 if e == 0 else 100 + e * 100.0 + 50 * randf()
# var x = cos(a) * r + cx.x
# var y = sin(a) * r + cx.y
# var d = Vector2(x, y)
# points.push_back(d)
# print("voronoi start")
# var diagram = Voronoi.generate_diagram(points, 11)
# print("voronoi end, processing")
# rg.process_diagram(diagram)
# print("processing done")

16
autoload/map.tscn Normal file
View File

@@ -0,0 +1,16 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://autoload/map.gd" type="Script" id=1]
[sub_resource type="OpenSimplexNoise" id=2]
[sub_resource type="Curve" id=1]
min_value = -300.0
max_value = 300.0
bake_resolution = 200
_data = [ Vector2( 0, -259.615 ), 0.0, 0.0, 0, 0, Vector2( 0.975, 300 ), 0.0, 0.0, 0, 0 ]
[node name="Map" type="Node"]
script = ExtResource( 1 )
noise = SubResource( 2 )
curve = SubResource( 1 )

213
autoload/marker.gd Normal file
View File

@@ -0,0 +1,213 @@
extends Node
var marker_list = []
var label_count = 10
var labels = []
var max_dist = 4
var current_marker
var cam
func node_added(node):
if node.name.begins_with("marker_"):
if !node in marker_list:
marker_list.push_back(node)
func node_removed(node):
marker_list.erase(node)
var state = 0
func _ready():
get_tree().connect("node_added", self, "node_added")
get_tree().connect("node_removed", self, "node_removed")
var root = get_tree().get_root()
var queue = [root]
while queue.size() > 0:
var item = queue.pop_front()
if item.name.begins_with("marker_"):
marker_list.push_back(item)
for e in item.get_children():
queue.push_back(e)
func see_through_marker(m):
if !m.has_meta("marker_data"):
return false
var md = m.get_meta("marker_data")
if md.has("see_through") && md.see_through == true:
return true
return false
func _process(delta):
if state == 0:
var root = get_tree().get_root()
for _e in range(label_count):
var tl = Label.new()
root.add_child(tl)
tl.hide()
labels.push_back(tl)
state = 1
if state == 1:
var cam = get_viewport().get_camera()
if !cam.has_meta("player"):
return
var player = cam.get_meta("player")
assert(player)
var size = get_viewport().size
var center = size/2
var visible_markers = []
var wstate = cam.get_world().direct_space_state
for e in marker_list:
var cam_pos = cam.global_transform.origin
var player_pos = player.global_transform.origin
var marker_pos = e.global_transform.origin
if player_pos.distance_squared_to(marker_pos) < max_dist * max_dist:
var lpos = cam.global_transform.xform_inv(marker_pos)
if lpos.z < 0:
if see_through_marker(e) && e.visible:
visible_markers.push_back(e)
elif e.visible:
var xlist = [player]
if e.has_meta("marker_data"):
var md = e.get_meta("marker_data")
if !md.has("obj"):
e.hide()
else:
if md.obj is PhysicsBody:
xlist.push_back(md.obj)
else:
e.hide()
var result = wstate.intersect_ray(cam_pos, marker_pos, xlist)
if !result.has("collider") || !result.collider:
visible_markers.push_back(e)
var free_labels = []
var process_markers = visible_markers.duplicate()
for e in labels:
var l: Label = e
if l.has_meta("marker"):
# var n = l.get_meta("marker")
# if n in visible_markers:
# process_markers.erase(n)
# else:
l.remove_meta("marker")
free_labels.push_back(l)
l.hide()
else:
free_labels.push_back(l)
l.hide()
if free_labels.size() == 0:
state = 2
return
for e in process_markers:
if free_labels.size() == 0:
break
var pos = cam.unproject_position(e.global_transform.origin)
var l = free_labels.pop_front()
var t = InputMap.get_action_list("activate")[0].as_text() + ": "
if e.name.ends_with("_door"):
t += "Open"
elif e.name.ends_with("_container"):
t += "Access"
elif e.name.ends_with("_pickup"):
t += "Pick up"
elif e.name.ends_with("_vehicleseat") || e.name.ends_with("_seat"):
t += "Sit"
elif e.name.ends_with("_exit"):
t += "Exit"
elif e.name.ends_with("_talk"):
t += "Talk"
elif e.name.ends_with("_action"):
t += "Action"
elif e.name.ends_with("_grab"):
t += "Grab"
elif e.name.ends_with("_take"):
t += "Take"
elif e.name.ends_with("_sacrifice"):
t += "Sacrifice"
l.set_meta("marker", e)
l.text = t
l.add_color_override("font_color", Color(0.6,0.6,1,1))
l.rect_position = pos - l.rect_size / 2.0
l.show()
var current = null
var cur_d = INF
for l in labels:
if l.visible:
var d = l.rect_position.distance_squared_to(center)
if !current:
cur_d = d
current = l
else:
if cur_d > d:
current = l
cur_d = d
if current:
current.add_color_override("font_color", Color(0.9,0.9,1,1))
current_marker = current.get_meta("marker")
else:
current_marker = null
state = 2
if state == 2:
state = 1
# var player = get_viewport().get_camera().get_meta("player")
# if !controls.is_gui && !player.has_meta("group_behavior") && !player.has_meta("")
# if Input.is_action_just_pressed("activate"):
# var marker = current_marker
# if marker && marker.has_meta("marker_data"):
# var md = marker.get_meta("marker_data")
# print("marker_data: ", md)
# if md.has("obj"):
# print("obj: ", md.obj.name)
# if md.has("obj") && md.has("method"):
# print("activate ", md.obj.name, " ", md.method)
# md.obj.call_deferred(md.method, md)
func activate_marker():
print("Activate marker")
var marker = current_marker
if marker && marker.has_meta("marker_data"):
var md = marker.get_meta("marker_data")
print("marker_data: ", md)
if md.has("obj"):
print("obj: ", md.obj.name)
if md.has("obj") && md.has("method"):
print("activate ", md.obj.name, " ", md.method)
md.obj.call_deferred(md.method, md)
func init_markers(obj, marker_info):
var queue = [obj]
while queue.size() > 0:
var item = queue.pop_front()
if item.name.begins_with("marker_"):
if marker_info.has(item.name):
marker_info[item.name].marker_obj = item
for e in item.get_children():
queue.push_back(e)
queue = [obj]
while queue.size() > 0:
var item = queue.pop_front()
if item.name.begins_with("marker_"):
var marker_data = {}
marker_data.obj = obj
if marker_info.has(item.name):
var o = marker_info[item.name]
for k in o.keys():
marker_data[k] = o[k]
if o.has("see_through") && o.see_through:
item.hide()
item.set_meta("marker_data", marker_data)
for e in item.get_children():
queue.push_back(e)
func init_marker(m, obj, data):
assert(m)
assert(obj)
assert(data)
var marker_data = {}
marker_data.obj = m
for e in data.keys():
marker_data[e] = data[e]
if data.has("see_through") && data.see_through:
obj.hide()
obj.set_meta("marker_data", marker_data)
if !obj in marker_list:
marker_list.push_back(obj)

17
autoload/scenario.gd Normal file
View File

@@ -0,0 +1,17 @@
extends Node
# 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():
pass # Replace with function body.
var save_data = {}
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass

296
autoload/streaming.gd Normal file
View File

@@ -0,0 +1,296 @@
extends Node
export var trailer_house: PackedScene
export var palace: PackedScene
export var car: PackedScene
onready var obj_names = {
"palace": palace,
"trailer_house": trailer_house
}
var done = false
class radial_grid:
var radial_points = []
var max_r = 0.0
var grid = []
var width: int = 0
var height: int = 0
var nodes = []
func build(poly, center):
var height = center.y
max_r = 0.0
for p in range(poly.size()):
var ep1 = poly[p]
ep1.y = height
var ep2 = poly[(p + 1) % poly.size()]
ep2.y = height
var d = (ep2 - ep1).normalized()
radial_points.push_back(ep1)
var dst = ep1.distance_to(ep2)
while dst > 32:
ep1 += d * 32
radial_points.push_back(ep1)
dst -= 32
for p in range(radial_points.size()):
var ep = radial_points[p]
var dst = ep.distance_to(center)
if max_r < dst:
max_r = dst
width = radial_points.size()
height = int(max_r / 32)
grid.resize(width * height)
for p in range(width):
var start = radial_points[p]
var end = center
var step = (end - start).normalized() * (end - start).length() / float(height + 1)
var val = start
for q in range(height):
grid[p * height + q] = {"position": val, "node": null}
func get_grid_node(x, y):
return grid[x * height + y].node
func set_grid_node(x, y, node):
if !node in nodes:
nodes.push_back(node)
grid[x * height + y].node = node
func place_grid(aabb: AABB, node) -> void:
for u in range(width):
for v in range(height):
if aabb.has_point(grid[u * height + v].position):
set_grid_node(u, v, node)
func get_pos(x, y):
return grid[x * height + y].position
onready var grid = radial_grid.new()
func debug_poly(poly):
for k in range(poly.size()):
var p1 = poly[k]
var p2 = poly[(k + 1) % poly.size()]
var l = p1.distance_to(p2)
var d = (p2 - p1).normalized()
var pt = p1
while l > 0.0:
for e in range(0, 30, 2):
var mi = MeshInstance.new()
mi.mesh = CubeMesh.new()
get_tree().root.add_child(mi)
mi.global_transform.origin = pt + Vector3(0, e, 0)
pt += d * 5.0
l -= 5.0
func calc_border(poly, offt):
var height = RoadsData.get_site_avg_height(0)
var border = []
border.resize(poly.size())
for k in range(poly.size()):
var i = k - 1
if i < 0:
i += poly.size()
var p1 = poly[i]
var p2 = poly[k]
var p3 = poly[(k + 1) % poly.size()]
var p1x = Vector2(p1.x, p1.z)
var p2x = Vector2(p2.x, p2.z)
var p3x = Vector2(p2.x, p2.z)
var p4x = Vector2(p3.x, p3.z)
var n1 = (p2x - p1x).tangent().normalized()
var n2 = (p4x - p3x).tangent().normalized()
p1x -= n1 * offt
p2x -= n1 * offt
p3x -= n2 * offt
p4x -= n2 * offt
var xp = Geometry.segment_intersects_segment_2d(p1x, p2x, p3x, p4x)
if !xp:
xp = p2x.linear_interpolate(p3x, 0.5) - (n1 + n2).normalized() * offt
var tp = Vector3(xp.x, height, xp.y)
border[k] = tp
return border
var towns = 0
func setup_town(site):
if !RoadsData.site_is_town(site):
print("site ", site, " type: ", RoadsData.get_site_type(site))
return
var poly = RoadsData.get_site_polygon_3d(site)
var height = RoadsData.get_site_avg_height(site)
var border2 = calc_border(poly, 60)
var aabbs = []
var poly2 = []
poly2.resize(border2.size())
for p in range(border2.size()):
poly2[p] = Vector2(border2[p].x, border2[p].z)
var center = Vector3()
for p in poly:
center += p
center /= poly.size()
center.y = height
grid.build(border2, center)
var radial_points = grid.radial_points
var max_r = 0.0
for p in range(radial_points.size()):
var ep = radial_points[p]
var dst = ep.distance_to(center)
if max_r < dst:
max_r = dst
for p in range(radial_points.size()):
var ep = radial_points[p]
var d = (center - ep).normalized()
var dst = ep.distance_to(center)
print(dst)
if dst < 64.0 + 12 + 8 + 4:
continue
var step = 16.0
var pstart = ep
while dst > 0.0:
var ok = true
if !Geometry.is_point_in_polygon(Vector2(pstart.x, pstart.z), poly2):
ok = false
if ok:
for b in aabbs:
if b.has_point(pstart):
ok = false
if ok:
var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP)
stream_obj("trailer_house", xform)
var aabb = AABB(pstart, Vector3())
aabb = aabb.grow(20)
aabbs.push_back(aabb)
print("placed to: ", pstart)
pstart = pstart + d * step
dst -= step
towns += 1
func setup_first_town():
assert(!done)
var poly = RoadsData.get_site_polygon_3d(0)
var height = RoadsData.get_site_avg_height(0)
var border = calc_border(poly, 32)
var border1a = calc_border(poly, 42)
var border2 = calc_border(poly, 60)
var poly2 = []
poly2.resize(border2.size())
for p in range(border2.size()):
poly2[p] = Vector2(border2[p].x, border2[p].z)
var center = Vector3()
for p in poly:
center += p
center /= poly.size()
center.y = height
grid.build(border2, center)
var radial_points = grid.radial_points
var max_r = 0.0
for p in range(radial_points.size()):
var ep = radial_points[p]
var dst = ep.distance_to(center)
if max_r < dst:
max_r = dst
var u = radial_points.size()
var v = int(max_r / 32)
var grid = []
grid.resize(u * v)
for p in range(u):
var start = radial_points[p]
var end = center
var step = (end - start).normalized() * (end - start).length() / float(v + 1)
var val = start
for q in range(v):
grid[p * v + q] = {"position": val}
var aabbs = []
var palace_aabb = AABB(center, Vector3())
palace_aabb = palace_aabb.grow(48)
print(palace_aabb)
aabbs.push_back(palace_aabb)
stream_obj("palace", Transform(Basis(), center))
for p in range(radial_points.size()):
var ep = radial_points[p]
var d = (center - ep).normalized()
var dst = ep.distance_to(center)
print(dst)
if dst < 64.0 + 12 + 8 + 4:
continue
var step = 16.0
var pstart = ep
while dst > 0.0:
var ok = true
if !Geometry.is_point_in_polygon(Vector2(pstart.x, pstart.z), poly2):
ok = false
if ok:
for b in aabbs:
if b.has_point(pstart):
ok = false
if ok:
var xform = Transform(Basis(), pstart).looking_at(pstart + d, Vector3.UP)
stream_obj("trailer_house", xform)
var aabb = AABB(pstart, Vector3())
aabb = aabb.grow(20)
aabbs.push_back(aabb)
print("placed to: ", pstart)
pstart = pstart + d * step
dst -= step
towns += 1
done = true
func _ready():
for k in obj_names.keys():
Spawner.add_scene(k, obj_names[k])
# Called every frame. 'delta' is the elapsed time since the previous frame.
var delay = 3.0
var state = 0
func _process(delta):
match state:
0:
delay -= delta
if delay < 0:
state = 1
1:
Spawner.update_view(self, 300)
var sc = get_tree().root
var viewport: = get_viewport()
if !viewport:
return
var cam: = viewport.get_camera()
if !cam:
return
var cam_xform: = cam.global_transform
func stream_obj(obj: String, xform: Transform):
Spawner.place_scene(obj, xform)
func _physics_process(delta):
var cam = get_viewport().get_camera()
if !cam:
return
match state:
1:
var space_state = get_viewport().get_world().direct_space_state
# probaly should not be here
for n in get_tree().get_nodes_in_group("spawn"):
var ok = false
if !n.is_in_group("keep"):
var where = n.get_global_transform().origin
var from = where
var to = where
from.y -= 8.0
to.y += 8.0
var result = space_state.intersect_ray(from, to)
if result.empty() || !result.has("collider"):
continue
if result.collider:
n.global_transform.origin = result.position
ok = true
if ok || n.is_in_group("keep"):
if n.is_in_group("male"):
characters.replace_character(n, "male", ["cmdq", "marker", "hurtboxes", "student"])
elif n.is_in_group("female"):
characters.replace_character(n, "female", ["cmdq", "marker", "hurtboxes", "student"])
elif n.is_in_group("car"):
var c = car.instance()
var p = get_tree().root
p.add_child(c)
c.global_transform = n.global_transform
n.queue_free()

12
autoload/streaming.tscn Normal file
View File

@@ -0,0 +1,12 @@
[gd_scene load_steps=5 format=2]
[ext_resource path="res://autoload/streaming.gd" type="Script" id=1]
[ext_resource path="res://objects/trailer-house.tscn" type="PackedScene" id=2]
[ext_resource path="res://objects/palace.tscn" type="PackedScene" id=3]
[ext_resource path="res://scenes/vehicles/car.tscn" type="PackedScene" id=4]
[node name="streaming" type="Node"]
script = ExtResource( 1 )
trailer_house = ExtResource( 2 )
palace = ExtResource( 3 )
car = ExtResource( 4 )

26
camera/camera_pos.tscn Normal file
View File

@@ -0,0 +1,26 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://camera/environment.tres" type="Environment" id=1]
[sub_resource type="SphereShape" id=1]
radius = 0.1
[node name="camera_pos" type="Spatial"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 6.75037, 0 )
[node name="rot_y" type="Spatial" parent="."]
[node name="rot_x" type="Spatial" parent="rot_y"]
[node name="SpringArm" type="SpringArm" parent="rot_y/rot_x"]
transform = Transform( 1, 0, 0, 0, 0.903013, 0.429613, 0, -0.429613, 0.903013, 0, 1.75, 0.2 )
shape = SubResource( 1 )
spring_length = 2.0
margin = 0.04
[node name="camera_offset" type="Spatial" parent="rot_y/rot_x/SpringArm"]
[node name="Camera" type="Camera" parent="rot_y/rot_x/SpringArm/camera_offset"]
transform = Transform( 1, 0, 0, 0, 0.900455, -0.434948, 0, 0.434948, 0.900455, 0, 0, 0 )
environment = ExtResource( 1 )
far = 350.0

15
camera/environment.tres Normal file
View File

@@ -0,0 +1,15 @@
[gd_resource type="Environment" load_steps=2 format=2]
[sub_resource type="ProceduralSky" id=1]
[resource]
background_mode = 2
background_sky = SubResource( 1 )
ambient_light_energy = 0.7
fog_enabled = true
fog_color = Color( 0.447059, 0.501961, 0.552941, 1 )
fog_sun_color = Color( 1, 0.901961, 0.701961, 1 )
fog_sun_amount = 0.25
fog_depth_end = 250.0
fog_depth_curve = 0.196146
dof_blur_far_quality = 0

13
camera/fps_cam_pos.tscn Normal file
View File

@@ -0,0 +1,13 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://camera/environment.tres" type="Environment" id=1]
[node name="fps_cam_pos" type="Spatial"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.75, -0.2 )
[node name="fos_cam_rot_y" type="Spatial" parent="."]
[node name="fps_cam_rot_x" type="Spatial" parent="fos_cam_rot_y"]
[node name="fps_camera" type="Camera" parent="fos_cam_rot_y/fps_cam_rot_x"]
environment = ExtResource( 1 )

12
characters/character.gd Normal file
View File

@@ -0,0 +1,12 @@
extends KinematicBody
func _ready():
add_to_group("characters")
func hide_face():
$"vroid1-man/Skeleton/head/face".hide()
$"vroid1-man/Skeleton/head/hair".hide()
func show_face():
$"vroid1-man/Skeleton/head/face".show()
$"vroid1-man/Skeleton/head/hair".show()

View File

@@ -0,0 +1,734 @@
[gd_scene load_steps=138 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]
[ext_resource path="res://scenes/face/female-face1.tscn" type="PackedScene" id=3]
[sub_resource type="SphereShape" id=1]
radius = 0.13
[sub_resource type="SphereShape" id=2]
radius = 0.14
[sub_resource type="BoxShape" id=3]
extents = Vector3( 0.13, 0.16, 0.06 )
[sub_resource type="AnimationNodeAnimation" id=4]
animation = "blend-right-arm-blade"
[sub_resource type="AnimationNodeAnimation" id=5]
animation = "blend-left-arm-blade"
[sub_resource type="AnimationNodeTimeScale" id=6]
[sub_resource type="AnimationNodeBlend2" id=7]
filter_enabled = true
filters = [ "skeleton/Skeleton:hand_l", "skeleton/Skeleton:index_1_l", "skeleton/Skeleton:index_2_l", "skeleton/Skeleton:index_3_end_l", "skeleton/Skeleton:index_3_l", "skeleton/Skeleton:little_1_l", "skeleton/Skeleton:little_2_l", "skeleton/Skeleton:little_3_end_l", "skeleton/Skeleton:little_3_l", "skeleton/Skeleton:middle_1_l", "skeleton/Skeleton:middle_2_l", "skeleton/Skeleton:middle_3_end_l", "skeleton/Skeleton:middle_3_l", "skeleton/Skeleton:ring_1_l", "skeleton/Skeleton:ring_2_l", "skeleton/Skeleton:ring_3_end_l", "skeleton/Skeleton:ring_3_l", "skeleton/Skeleton:thumb_1_l", "skeleton/Skeleton:thumb_2_l", "skeleton/Skeleton:thumb_3_end_l", "skeleton/Skeleton:thumb_3_l" ]
[sub_resource type="AnimationNodeBlend2" id=8]
filter_enabled = true
filters = [ "skeleton/Skeleton:hand_r", "skeleton/Skeleton:index_1_r", "skeleton/Skeleton:index_2_r", "skeleton/Skeleton:index_3_end_r", "skeleton/Skeleton:index_3_r", "skeleton/Skeleton:little_1_r", "skeleton/Skeleton:little_2_r", "skeleton/Skeleton:little_3_end_r", "skeleton/Skeleton:little_3_r", "skeleton/Skeleton:middle_1_r", "skeleton/Skeleton:middle_2_r", "skeleton/Skeleton:middle_3_end_r", "skeleton/Skeleton:middle_3_r", "skeleton/Skeleton:ring_1_r", "skeleton/Skeleton:ring_2_r", "skeleton/Skeleton:ring_3_end_r", "skeleton/Skeleton:ring_3_r", "skeleton/Skeleton:thumb_1_r", "skeleton/Skeleton:thumb_2_r", "skeleton/Skeleton:thumb_3_end_r", "skeleton/Skeleton:thumb_3_r" ]
[sub_resource type="AnimationNodeAnimation" id=9]
animation = "climb1"
[sub_resource type="AnimationNodeTimeScale" id=10]
[sub_resource type="AnimationNodeBlendTree" id=11]
nodes/Animation/node = SubResource( 9 )
nodes/Animation/position = Vector2( 235, 191 )
nodes/TimeScale/node = SubResource( 10 )
nodes/TimeScale/position = Vector2( 480, 160 )
nodes/output/position = Vector2( 760, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=12]
animation = "climb1a"
[sub_resource type="AnimationNodeTimeScale" id=13]
[sub_resource type="AnimationNodeBlendTree" id=14]
nodes/Animation/node = SubResource( 12 )
nodes/Animation/position = Vector2( 354, 279 )
nodes/TimeScale/node = SubResource( 13 )
nodes/TimeScale/position = Vector2( 763, 297 )
nodes/output/position = Vector2( 1220, 300 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendTree" id=15]
[sub_resource type="AnimationNodeAnimation" id=16]
animation = "start-grabbed"
[sub_resource type="AnimationNodeTimeScale" id=17]
[sub_resource type="AnimationNodeBlendTree" id=18]
nodes/Animation/node = SubResource( 16 )
nodes/Animation/position = Vector2( 380, 100 )
nodes/TimeScale/node = SubResource( 17 )
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=19]
animation = "female-idle-to-kneel1"
[sub_resource type="AnimationNodeTimeScale" id=20]
[sub_resource type="AnimationNodeBlendTree" id=21]
nodes/Animation/node = SubResource( 19 )
nodes/Animation/position = Vector2( 390, 274 )
nodes/TimeScale/node = SubResource( 20 )
nodes/TimeScale/position = Vector2( 826, 273 )
nodes/output/position = Vector2( 1180, 280 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=22]
animation = "11_01-idle"
[sub_resource type="AnimationNodeAnimation" id=23]
animation = "10_01-idle"
[sub_resource type="AnimationNodeTimeScale" id=24]
[sub_resource type="AnimationNodeTimeScale" id=25]
[sub_resource type="AnimationNodeTransition" id=26]
input_count = 2
xfade_time = 0.4
input_0/name = "idle1"
input_0/auto_advance = true
input_1/name = "idle2"
input_1/auto_advance = true
[sub_resource type="AnimationNodeBlendTree" id=27]
nodes/Animation/node = SubResource( 23 )
nodes/Animation/position = Vector2( 55, 117 )
"nodes/Animation 2/node" = SubResource( 22 )
"nodes/Animation 2/position" = Vector2( 80, 260 )
nodes/TimeScale/node = SubResource( 25 )
nodes/TimeScale/position = Vector2( 580, 100 )
"nodes/TimeScale 2/node" = SubResource( 24 )
"nodes/TimeScale 2/position" = Vector2( 380, 240 )
nodes/output/position = Vector2( 1120, 120 )
nodes/t1/node = SubResource( 26 )
nodes/t1/position = Vector2( 880, 100 )
node_connections = [ "output", 0, "t1", "TimeScale", 0, "Animation", "TimeScale 2", 0, "Animation 2", "t1", 0, "TimeScale", "t1", 1, "TimeScale 2" ]
[sub_resource type="AnimationNodeAnimation" id=28]
animation = "walk1p2"
[sub_resource type="AnimationNodeAnimation" id=29]
animation = "walk1p1"
[sub_resource type="AnimationNodeTimeScale" id=30]
[sub_resource type="AnimationNodeTimeScale" id=31]
[sub_resource type="AnimationNodeTransition" id=32]
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=33]
nodes/Animation/node = SubResource( 29 )
nodes/Animation/position = Vector2( 140, 100 )
"nodes/Animation 2/node" = SubResource( 28 )
"nodes/Animation 2/position" = Vector2( 180, 260 )
nodes/TimeScale/node = SubResource( 31 )
nodes/TimeScale/position = Vector2( 620, 40 )
"nodes/TimeScale 2/node" = SubResource( 30 )
"nodes/TimeScale 2/position" = Vector2( 610, 231 )
nodes/Transition/node = SubResource( 32 )
nodes/Transition/position = Vector2( 905, 264 )
nodes/output/position = Vector2( 1280, 120 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
[sub_resource type="AnimationNodeAnimation" id=34]
animation = "07_01-walk"
[sub_resource type="AnimationNodeTimeScale" id=35]
[sub_resource type="AnimationNodeBlendTree" id=36]
nodes/Animation/node = SubResource( 34 )
nodes/Animation/position = Vector2( 128, 154 )
nodes/TimeScale/node = SubResource( 35 )
nodes/TimeScale/position = Vector2( 420, 160 )
nodes/output/position = Vector2( 640, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=37]
animation = "07_03-walk"
[sub_resource type="AnimationNodeTimeScale" id=38]
[sub_resource type="AnimationNodeBlendTree" id=39]
nodes/Animation/node = SubResource( 37 )
nodes/Animation/position = Vector2( 220, 120 )
nodes/TimeScale/node = SubResource( 38 )
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.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_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 )
nodes/loc/node = SubResource( 52 )
nodes/loc/position = Vector2( 580, 80 )
nodes/output/position = Vector2( 960, 160 )
node_connections = [ "output", 0, "loc" ]
[sub_resource type="AnimationNodeBlendTree" id=54]
[sub_resource type="AnimationNodeAnimation" id=55]
animation = "female-pray-startled-walk1-loop"
[sub_resource type="AnimationNodeAnimation" id=56]
animation = "female-pray-startled-walk1-loop"
[sub_resource type="AnimationNodeTimeScale" id=57]
[sub_resource type="AnimationNodeTimeScale" id=58]
[sub_resource type="AnimationNodeTransition" id=59]
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=60]
nodes/Animation/node = SubResource( 56 )
nodes/Animation/position = Vector2( 200, 280 )
"nodes/Animation 2/node" = SubResource( 55 )
"nodes/Animation 2/position" = Vector2( 200, 420 )
nodes/TimeScale/node = SubResource( 58 )
nodes/TimeScale/position = Vector2( 640, 200 )
"nodes/TimeScale 2/node" = SubResource( 57 )
"nodes/TimeScale 2/position" = Vector2( 640, 360 )
nodes/Transition/node = SubResource( 59 )
nodes/Transition/position = Vector2( 860, 220 )
nodes/output/position = Vector2( 1080, 200 )
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"
[sub_resource type="AnimationNodeTimeScale" id=62]
[sub_resource type="AnimationNodeBlendTree" id=63]
nodes/Animation/node = SubResource( 61 )
nodes/Animation/position = Vector2( 181, 220 )
nodes/TimeScale/node = SubResource( 62 )
nodes/TimeScale/position = Vector2( 590, 212 )
nodes/output/position = Vector2( 880, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=64]
animation = "female-pray-complete"
[sub_resource type="AnimationNodeTimeScale" id=65]
[sub_resource type="AnimationNodeBlendTree" id=66]
nodes/Animation/node = SubResource( 64 )
nodes/Animation/position = Vector2( 585, 170 )
nodes/TimeScale/node = SubResource( 65 )
nodes/TimeScale/position = Vector2( 865, 191 )
nodes/output/position = Vector2( 1280, 180 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=67]
animation = "idle-lying-tied-attack1"
[sub_resource type="AnimationNodeAnimation" id=68]
animation = "idle-lying-tied-attack2"
[sub_resource type="AnimationNodeAnimation" id=69]
animation = "idle-lying-tied-loop"
[sub_resource type="AnimationNodeTimeScale" id=70]
[sub_resource type="AnimationNodeTimeScale" id=71]
[sub_resource type="AnimationNodeOneShot" id=72]
[sub_resource type="AnimationNodeOneShot" id=73]
[sub_resource type="AnimationNodeTimeScale" id=74]
[sub_resource type="AnimationNodeBlendTree" id=75]
graph_offset = Vector2( -12, 62 )
nodes/Animation/node = SubResource( 69 )
nodes/Animation/position = Vector2( 222, 131 )
"nodes/Animation 2/node" = SubResource( 67 )
"nodes/Animation 2/position" = Vector2( 220, 280 )
"nodes/Animation 3/node" = SubResource( 68 )
"nodes/Animation 3/position" = Vector2( 238, 428 )
nodes/TimeScale/node = SubResource( 71 )
nodes/TimeScale/position = Vector2( 500, 240 )
"nodes/TimeScale 2/node" = SubResource( 70 )
"nodes/TimeScale 2/position" = Vector2( 500, 380 )
nodes/attack1/node = SubResource( 72 )
nodes/attack1/position = Vector2( 800, 120 )
nodes/attack2/node = SubResource( 73 )
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", 0, "Animation 2", "attack1", 0, "speed", "attack1", 1, "TimeScale", "attack2", 0, "attack1", "attack2", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 3" ]
[sub_resource type="AnimationNodeAnimation" id=76]
animation = "dagger-sacrifice-counter-p"
[sub_resource type="AnimationNodeTimeScale" id=77]
[sub_resource type="AnimationNodeBlendTree" id=78]
graph_offset = Vector2( 0, -259 )
nodes/Animation/node = SubResource( 76 )
nodes/Animation/position = Vector2( 440, 160 )
nodes/TimeScale/node = SubResource( 77 )
nodes/TimeScale/position = Vector2( 760, 140 )
nodes/output/position = Vector2( 1000, 180 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=79]
animation = "sleeping1-loop"
[sub_resource type="AnimationNodeTimeScale" id=80]
[sub_resource type="AnimationNodeBlendTree" id=81]
nodes/Animation/node = SubResource( 79 )
nodes/Animation/position = Vector2( 321, 172 )
nodes/TimeScale/node = SubResource( 80 )
nodes/TimeScale/position = Vector2( 600, 160 )
nodes/output/position = Vector2( 800, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=82]
animation = "female-pray-startled-walk1-stand"
[sub_resource type="AnimationNodeTimeScale" id=83]
[sub_resource type="AnimationNodeBlendTree" id=84]
graph_offset = Vector2( 0, -259 )
nodes/Animation/node = SubResource( 82 )
nodes/Animation/position = Vector2( 120, 160 )
nodes/TimeScale/node = SubResource( 83 )
nodes/TimeScale/position = Vector2( 640, 100 )
nodes/output/position = Vector2( 1040, 80 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=121]
animation = "start-walking"
[sub_resource type="AnimationNodeTimeScale" id=122]
[sub_resource type="AnimationNodeBlendTree" id=115]
nodes/Animation/node = SubResource( 121 )
nodes/Animation/position = Vector2( 189, 171 )
nodes/TimeScale/node = SubResource( 122 )
nodes/TimeScale/position = Vector2( 420, 160 )
nodes/output/position = Vector2( 640, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=123]
animation = "stop-walking"
[sub_resource type="AnimationNodeTimeScale" id=124]
[sub_resource type="AnimationNodeBlendTree" id=116]
nodes/Animation/node = SubResource( 123 )
nodes/Animation/position = Vector2( 275, 334 )
nodes/TimeScale/node = SubResource( 124 )
nodes/TimeScale/position = Vector2( 587, 359 )
nodes/output/position = Vector2( 860, 340 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=131]
animation = "turn-left"
[sub_resource type="AnimationNodeTimeScale" id=132]
[sub_resource type="AnimationNodeBlendTree" id=125]
nodes/Animation/node = SubResource( 131 )
nodes/Animation/position = Vector2( 200, 240 )
nodes/TimeScale/node = SubResource( 132 )
nodes/TimeScale/position = Vector2( 445, 231 )
nodes/output/position = Vector2( 680, 240 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=133]
animation = "turn-right"
[sub_resource type="AnimationNodeTimeScale" id=134]
[sub_resource type="AnimationNodeBlendTree" id=126]
nodes/Animation/node = SubResource( 133 )
nodes/Animation/position = Vector2( 213, 136 )
nodes/TimeScale/node = SubResource( 134 )
nodes/TimeScale/position = Vector2( 480, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=113]
animation = "default"
[sub_resource type="AnimationNodeTimeScale" id=114]
[sub_resource type="AnimationNodeBlendTree" id=85]
nodes/Animation/node = SubResource( 113 )
nodes/Animation/position = Vector2( 139, 122 )
nodes/TimeScale/node = SubResource( 114 )
nodes/TimeScale/position = Vector2( 461, 131 )
nodes/output/position = Vector2( 860, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeStateMachineTransition" id=86]
[sub_resource type="AnimationNodeStateMachineTransition" id=87]
[sub_resource type="AnimationNodeStateMachineTransition" id=88]
[sub_resource type="AnimationNodeStateMachineTransition" id=89]
[sub_resource type="AnimationNodeStateMachineTransition" id=90]
[sub_resource type="AnimationNodeStateMachineTransition" id=91]
[sub_resource type="AnimationNodeStateMachineTransition" id=92]
[sub_resource type="AnimationNodeStateMachineTransition" id=93]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=94]
[sub_resource type="AnimationNodeStateMachineTransition" id=95]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=96]
[sub_resource type="AnimationNodeStateMachineTransition" id=97]
[sub_resource type="AnimationNodeStateMachineTransition" id=98]
switch_mode = 2
auto_advance = true
xfade_time = 0.1
[sub_resource type="AnimationNodeStateMachineTransition" id=99]
[sub_resource type="AnimationNodeStateMachineTransition" id=100]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=101]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=102]
[sub_resource type="AnimationNodeStateMachineTransition" id=103]
[sub_resource type="AnimationNodeStateMachineTransition" id=104]
[sub_resource type="AnimationNodeStateMachineTransition" id=105]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=106]
[sub_resource type="AnimationNodeStateMachineTransition" id=107]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=108]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=109]
[sub_resource type="AnimationNodeStateMachineTransition" id=117]
[sub_resource type="AnimationNodeStateMachineTransition" id=118]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=119]
[sub_resource type="AnimationNodeStateMachineTransition" id=120]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=127]
[sub_resource type="AnimationNodeStateMachineTransition" id=128]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=129]
[sub_resource type="AnimationNodeStateMachineTransition" id=130]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachine" id=110]
states/climb1/node = SubResource( 11 )
states/climb1/position = Vector2( 804, 503.193 )
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/grabbed/node = SubResource( 18 )
states/grabbed/position = Vector2( 1277, 182.193 )
states/kneel/node = SubResource( 21 )
states/kneel/position = Vector2( 522, 84 )
states/locomotion/node = SubResource( 53 )
states/locomotion/position = Vector2( 822, 111 )
states/passenger/node = SubResource( 54 )
states/passenger/position = Vector2( 574, 327 )
states/pray/node = SubResource( 66 )
states/pray/position = Vector2( 381, 222 )
states/pray-startled/node = SubResource( 63 )
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( 1023, 135 )
states/sacrificed/node = SubResource( 78 )
states/sacrificed/position = Vector2( 1125, 283 )
states/sleeping/node = SubResource( 81 )
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 )
states/start_walking/position = Vector2( 522, 597.193 )
states/stop_walking/node = SubResource( 116 )
states/stop_walking/position = Vector2( 663, 697.193 )
states/tun_left/node = SubResource( 125 )
states/tun_left/position = Vector2( 868, 633.193 )
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 ) ]
start_node = "locomotion"
graph_offset = Vector2( -232, 15.1925 )
[sub_resource type="AnimationNodeBlendTree" id=111]
graph_offset = Vector2( 0, -221 )
nodes/Animation/node = SubResource( 5 )
nodes/Animation/position = Vector2( 540, 280 )
"nodes/Animation 2/node" = SubResource( 4 )
"nodes/Animation 2/position" = Vector2( 920, 280 )
nodes/all_scale/node = SubResource( 6 )
nodes/all_scale/position = Vector2( 840, -20 )
nodes/blade_left/node = SubResource( 7 )
nodes/blade_left/position = Vector2( 1040, 0 )
nodes/blade_right/node = SubResource( 8 )
nodes/blade_right/position = Vector2( 1400, 100 )
nodes/output/position = Vector2( 1820, -20 )
nodes/state/node = SubResource( 110 )
nodes/state/position = Vector2( 480, 120 )
node_connections = [ "output", 0, "blade_right", "blade_right", 0, "blade_left", "blade_right", 1, "Animation 2", "blade_left", 0, "all_scale", "blade_left", 1, "Animation", "all_scale", 0, "state" ]
[sub_resource type="AnimationNodeStateMachinePlayback" id=112]
[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/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.695045, 0.34614, -0.630227, -0.0867818, 0.910422, 0.404298, 0.713771, -0.226324, 0.66284, -0.0445963, 1.35245, -0.0152731 )
bone_name = "Head"
[node name="marker_talk" type="Spatial" parent="skeleton/Skeleton/head" index="0"]
transform = Transform( 0.938982, -0.1833, 0.290986, 0.0970959, 0.953036, 0.286975, -0.3299, -0.241222, 0.912684, -0.00304712, 0.094561, -0.232747 )
[node name="marker_hips_action" type="Spatial" parent="skeleton/Skeleton/head" index="1"]
transform = Transform( 0.845972, -0.248965, 0.471515, 0.270435, 0.962465, 0.0230151, -0.459582, 0.108024, 0.88155, 0.0862694, -0.150184, 0.25561 )
[node name="head_hurt" type="Area" parent="skeleton/Skeleton/head" index="2"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.1, 0.02 )
[node name="CollisionShape" type="CollisionShape" parent="skeleton/Skeleton/head/head_hurt" index="0"]
shape = SubResource( 1 )
[node name="hair" type="Spatial" parent="skeleton/Skeleton/head" index="3"]
transform = Transform( 1, 0, 0, 0, 0.984808, -0.173648, 0, 0.173648, 0.984808, 0, 0, 0 )
[node name="female-hair1" parent="skeleton/Skeleton/head/hair" index="0" instance=ExtResource( 2 )]
transform = Transform( 1, -3.21306e-08, 5.58794e-08, 1.86265e-08, 1, 1.49012e-08, 3.35276e-08, -7.45058e-09, 1, 0, 0, 0 )
[node name="face" type="Spatial" parent="skeleton/Skeleton/head" index="4"]
transform = Transform( 1, -1.24197e-11, 0, 1.06852e-11, 1, -5.82077e-11, 0, 0, 1, -0.005, -0.002, 0.006 )
[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.932837, 0.0669982, 0.354143, 0.0474986, -0.99678, 0.0635026, 0.357293, -0.0424105, -0.933064, 0.000203875, 0.898321, -0.00645695 )
bone_name = "Hips"
[node name="marker_dagger_sacrifice" type="Spatial" parent="skeleton/Skeleton/hips" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0.2 )
[node name="hips_hurt" type="Area" parent="skeleton/Skeleton/hips" index="1"]
[node name="CollisionShape" type="CollisionShape" parent="skeleton/Skeleton/hips/hips_hurt" index="0"]
shape = SubResource( 2 )
[node name="wrist_r" type="BoneAttachment" parent="skeleton/Skeleton" index="4"]
transform = Transform( -0.287977, 0.919611, -0.267176, 0.942778, 0.321208, 0.0894101, 0.168042, -0.22614, -0.95949, 0.217922, 0.840792, 0.0647382 )
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.0744099, -0.85538, 0.512627, -0.989629, 0.126679, 0.0677309, -0.122875, -0.50227, -0.855936, -0.175723, 0.838131, -0.0414757 )
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.941419, -0.0483243, -0.333891, 0.0575738, 0.998111, 0.0178291, 0.332436, -0.0360186, 0.942465, -0.00328054, 1.05887, -0.018731 )
bone_name = "Chest"
[node name="chest_hurt" type="Area" parent="skeleton/Skeleton/chest" index="0"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0 )
[node name="CollisionShape" type="CollisionShape" parent="skeleton/Skeleton/chest/chest_hurt" index="0"]
shape = SubResource( 3 )
[node name="MeshInstance" type="MeshInstance" parent="skeleton/Skeleton" index="7"]
[node name="AnimationTree" type="AnimationTree" parent="." index="2"]
tree_root = SubResource( 111 )
anim_player = NodePath("../AnimationPlayer")
active = true
root_motion_track = NodePath("skeleton/Skeleton:root")
parameters/all_scale/scale = 1.0
parameters/blade_left/blend_amount = 0.0
parameters/blade_right/blend_amount = 0.0
parameters/state/playback = SubResource( 112 )
parameters/state/climb1/TimeScale/scale = 2.0
parameters/state/climb1a/TimeScale/scale = 2.0
parameters/state/grabbed/TimeScale/scale = 1.0
parameters/state/kneel/TimeScale/scale = 1.0
parameters/state/locomotion/loc/blend_position = Vector2( -0.00127554, 0.00220752 )
parameters/state/locomotion/loc/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/1/TimeScale/scale = 1.0
"parameters/state/locomotion/loc/1/TimeScale 2/scale" = 1.0
parameters/state/locomotion/loc/1/Transition/current = 0
parameters/state/locomotion/loc/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
"parameters/state/pray-startled-walk/TimeScale 2/scale" = 1.6
parameters/state/pray-startled-walk/Transition/current = 1
parameters/state/sacrifice/TimeScale/scale = 1.0
"parameters/state/sacrifice/TimeScale 2/scale" = 1.0
parameters/state/sacrifice/attack1/active = false
parameters/state/sacrifice/attack2/active = false
parameters/state/sacrifice/speed/scale = 1.0
parameters/state/sacrificed/TimeScale/scale = 1.0
parameters/state/sleeping/TimeScale/scale = 1.0
parameters/state/stand-startled/TimeScale/scale = 0.7
parameters/state/start_walking/TimeScale/scale = 1.0
parameters/state/stop_walking/TimeScale/scale = 1.0
parameters/state/tun_left/TimeScale/scale = 1.0
parameters/state/turn_right/TimeScale/scale = 1.0
parameters/state/use_tap/TimeScale/scale = 1.0

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,3 @@
[gd_resource type="AnimationNodeStateMachinePlayback" format=2]
[resource]

View File

@@ -0,0 +1,210 @@
[gd_resource type="AnimationNodeBlendTree" load_steps=44 format=2]
[sub_resource type="AnimationNodeAnimation" id=1]
animation = "blend-blade-right"
[sub_resource type="AnimationNodeAnimation" id=2]
animation = "blend-blade-left"
[sub_resource type="AnimationNodeBlend2" id=3]
filter_enabled = true
filters = [ "Skeleton:j_bip_l_hand", "Skeleton:j_bip_l_index_1", "Skeleton:j_bip_l_index_2", "Skeleton:j_bip_l_index_3", "Skeleton:j_bip_l_little_1", "Skeleton:j_bip_l_little_2", "Skeleton:j_bip_l_little_3", "Skeleton:j_bip_l_middle_1", "Skeleton:j_bip_l_middle_2", "Skeleton:j_bip_l_middle_3", "Skeleton:j_bip_l_ring_1", "Skeleton:j_bip_l_ring_2", "Skeleton:j_bip_l_ring_3", "Skeleton:j_bip_l_thumb_1", "Skeleton:j_bip_l_thumb_2", "Skeleton:j_bip_l_thumb_3" ]
[sub_resource type="AnimationNodeBlend2" id=4]
filter_enabled = true
filters = [ "Skeleton:j_bip_r_hand", "Skeleton:j_bip_r_index_1", "Skeleton:j_bip_r_index_2", "Skeleton:j_bip_r_index_3", "Skeleton:j_bip_r_little_1", "Skeleton:j_bip_r_little_2", "Skeleton:j_bip_r_little_3", "Skeleton:j_bip_r_middle_1", "Skeleton:j_bip_r_middle_2", "Skeleton:j_bip_r_middle_3", "Skeleton:j_bip_r_ring_1", "Skeleton:j_bip_r_ring_2", "Skeleton:j_bip_r_ring_3", "Skeleton:j_bip_r_thumb_1", "Skeleton:j_bip_r_thumb_2", "Skeleton:j_bip_r_thumb_3" ]
[sub_resource type="AnimationNodeAnimation" id=5]
animation = "drive-loop"
[sub_resource type="AnimationNodeTimeScale" id=6]
[sub_resource type="AnimationNodeBlendTree" id=7]
nodes/Animation/node = SubResource( 5 )
nodes/Animation/position = Vector2( 276, 122 )
nodes/TimeScale/node = SubResource( 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=8]
animation = "stand1-loop"
[sub_resource type="AnimationNodeTimeScale" id=9]
[sub_resource type="AnimationNodeBlendTree" id=10]
nodes/Animation/node = SubResource( 8 )
nodes/Animation/position = Vector2( 320, 140 )
nodes/TimeScale/node = SubResource( 9 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeTimeScale" id=11]
[sub_resource type="AnimationNodeAnimation" id=12]
animation = "08_01-walk-p1"
[sub_resource type="AnimationNodeAnimation" id=13]
animation = "08_01-walk-p2"
[sub_resource type="AnimationNodeAnimation" id=14]
animation = "08_01-walk-p3"
[sub_resource type="AnimationNodeAnimation" id=15]
animation = "08_01-walk-p4"
[sub_resource type="AnimationNodeStateMachineTransition" id=16]
switch_mode = 2
auto_advance = true
xfade_time = 0.01
[sub_resource type="AnimationNodeStateMachineTransition" id=17]
switch_mode = 2
auto_advance = true
xfade_time = 0.01
[sub_resource type="AnimationNodeStateMachineTransition" id=18]
switch_mode = 2
auto_advance = true
xfade_time = 0.01
[sub_resource type="AnimationNodeStateMachineTransition" id=19]
switch_mode = 2
auto_advance = true
xfade_time = 0.01
[sub_resource type="AnimationNodeStateMachine" id=20]
states/08_01-walk-p1/node = SubResource( 12 )
states/08_01-walk-p1/position = Vector2( 249, 186 )
states/08_01-walk-p2/node = SubResource( 13 )
states/08_01-walk-p2/position = Vector2( 536, 75 )
states/08_01-walk-p3/node = SubResource( 14 )
states/08_01-walk-p3/position = Vector2( 824, 75 )
states/08_01-walk-p4/node = SubResource( 15 )
states/08_01-walk-p4/position = Vector2( 1084, 186 )
transitions = [ "08_01-walk-p1", "08_01-walk-p2", SubResource( 16 ), "08_01-walk-p2", "08_01-walk-p3", SubResource( 17 ), "08_01-walk-p3", "08_01-walk-p4", SubResource( 18 ), "08_01-walk-p4", "08_01-walk-p1", SubResource( 19 ) ]
start_node = "08_01-walk-p1"
end_node = "08_01-walk-p4"
[sub_resource type="AnimationNodeBlendTree" id=21]
nodes/TimeScale/node = SubResource( 11 )
nodes/TimeScale/position = Vector2( 520, 140 )
nodes/output/position = Vector2( 780, 160 )
nodes/walk/node = SubResource( 20 )
nodes/walk/position = Vector2( 220, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "walk" ]
[sub_resource type="AnimationNodeAnimation" id=22]
animation = "strafe-right-loop"
[sub_resource type="AnimationNodeTimeScale" id=23]
[sub_resource type="AnimationNodeBlendTree" id=24]
nodes/Animation/node = SubResource( 22 )
nodes/Animation/position = Vector2( 340, 140 )
nodes/TimeScale/node = SubResource( 23 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=25]
animation = "strafe-left-loop"
[sub_resource type="AnimationNodeTimeScale" id=26]
[sub_resource type="AnimationNodeBlendTree" id=27]
nodes/Animation/node = SubResource( 25 )
nodes/Animation/position = Vector2( 200, 140 )
nodes/TimeScale/node = SubResource( 26 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 920, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendSpace2D" id=28]
blend_point_0/node = SubResource( 10 )
blend_point_0/pos = Vector2( 0, 0 )
blend_point_1/node = SubResource( 21 )
blend_point_1/pos = Vector2( 0.1, 0 )
blend_point_2/node = SubResource( 24 )
blend_point_2/pos = Vector2( 0, 1 )
blend_point_3/node = SubResource( 27 )
blend_point_3/pos = Vector2( 0, -1 )
[sub_resource type="AnimationNodeBlendTree" id=29]
graph_offset = Vector2( -453, -150 )
nodes/loc/node = SubResource( 28 )
nodes/loc/position = Vector2( 180, -20 )
nodes/output/position = Vector2( 580, 120 )
node_connections = [ "output", 0, "loc" ]
[sub_resource type="AnimationNodeAnimation" id=30]
animation = "car-passenger-loop"
[sub_resource type="AnimationNodeTimeScale" id=31]
[sub_resource type="AnimationNodeBlendTree" id=32]
nodes/Animation/node = SubResource( 30 )
nodes/Animation/position = Vector2( 300, 80 )
nodes/TimeScale/node = SubResource( 31 )
nodes/TimeScale/position = Vector2( 560, 80 )
nodes/output/position = Vector2( 800, 80 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=33]
animation = "dagger-sacrifice-counter-a"
[sub_resource type="AnimationNodeTimeScale" id=34]
[sub_resource type="AnimationNodeTimeSeek" id=35]
[sub_resource type="AnimationNodeBlendTree" id=36]
graph_offset = Vector2( 0, -262 )
nodes/Animation/node = SubResource( 33 )
nodes/Animation/position = Vector2( 520, 180 )
nodes/TimeScale/node = SubResource( 34 )
nodes/TimeScale/position = Vector2( 980, 200 )
nodes/output/position = Vector2( 1480, 180 )
nodes/seek/node = SubResource( 35 )
nodes/seek/position = Vector2( 920, -20 )
node_connections = [ "seek", 0, "Animation", "output", 0, "TimeScale", "TimeScale", 0, "seek" ]
[sub_resource type="AnimationNodeStateMachineTransition" id=37]
[sub_resource type="AnimationNodeStateMachineTransition" id=38]
[sub_resource type="AnimationNodeStateMachineTransition" id=39]
[sub_resource type="AnimationNodeStateMachineTransition" id=40]
[sub_resource type="AnimationNodeStateMachineTransition" id=41]
[sub_resource type="AnimationNodeStateMachineTransition" id=42]
[sub_resource type="AnimationNodeStateMachine" id=43]
states/drive/node = SubResource( 7 )
states/drive/position = Vector2( 231, 282 )
states/locomotion/node = SubResource( 29 )
states/locomotion/position = Vector2( 231, 174 )
states/passenger/node = SubResource( 32 )
states/passenger/position = Vector2( 452.444, 220 )
states/sacrificed-a/node = SubResource( 36 )
states/sacrificed-a/position = Vector2( 628.444, 464 )
transitions = [ "locomotion", "drive", SubResource( 37 ), "drive", "locomotion", SubResource( 38 ), "locomotion", "passenger", SubResource( 39 ), "passenger", "locomotion", SubResource( 40 ), "drive", "passenger", SubResource( 41 ), "passenger", "drive", SubResource( 42 ) ]
start_node = "locomotion"
graph_offset = Vector2( -471.556, 74 )
[resource]
graph_offset = Vector2( -631.583, -146.25 )
nodes/Animation/node = SubResource( 2 )
nodes/Animation/position = Vector2( -200, 260 )
"nodes/Animation 2/node" = SubResource( 1 )
"nodes/Animation 2/position" = Vector2( -280, 400 )
nodes/blade_left/node = SubResource( 3 )
nodes/blade_left/position = Vector2( 220, 180 )
nodes/blade_right/node = SubResource( 4 )
nodes/blade_right/position = Vector2( 680, 320 )
nodes/output/position = Vector2( 1040, 120 )
nodes/state/node = SubResource( 43 )
nodes/state/position = Vector2( -179, 86 )
node_connections = [ "output", 0, "blade_right", "blade_left", 0, "state", "blade_left", 1, "Animation", "blade_right", 0, "blade_left", "blade_right", 1, "Animation 2" ]

531
characters/vroid1-man.tscn Normal file
View File

@@ -0,0 +1,531 @@
[gd_scene load_steps=95 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]
[ext_resource path="res://scenes/face/male-face.tscn" type="PackedScene" id=3]
[sub_resource type="AnimationNodeAnimation" id=1]
animation = "blend-blade-right"
[sub_resource type="AnimationNodeAnimation" id=2]
animation = "blend-blade-left"
[sub_resource type="AnimationNodeBlend2" id=3]
filter_enabled = true
filters = [ "Skeleton:j_bip_l_hand", "Skeleton:j_bip_l_index_1", "Skeleton:j_bip_l_index_2", "Skeleton:j_bip_l_index_3", "Skeleton:j_bip_l_little_1", "Skeleton:j_bip_l_little_2", "Skeleton:j_bip_l_little_3", "Skeleton:j_bip_l_middle_1", "Skeleton:j_bip_l_middle_2", "Skeleton:j_bip_l_middle_3", "Skeleton:j_bip_l_ring_1", "Skeleton:j_bip_l_ring_2", "Skeleton:j_bip_l_ring_3", "Skeleton:j_bip_l_thumb_1", "Skeleton:j_bip_l_thumb_2", "Skeleton:j_bip_l_thumb_3" ]
[sub_resource type="AnimationNodeBlend2" id=4]
filter_enabled = true
filters = [ "Skeleton:j_bip_r_hand", "Skeleton:j_bip_r_index_1", "Skeleton:j_bip_r_index_2", "Skeleton:j_bip_r_index_3", "Skeleton:j_bip_r_little_1", "Skeleton:j_bip_r_little_2", "Skeleton:j_bip_r_little_3", "Skeleton:j_bip_r_middle_1", "Skeleton:j_bip_r_middle_2", "Skeleton:j_bip_r_middle_3", "Skeleton:j_bip_r_ring_1", "Skeleton:j_bip_r_ring_2", "Skeleton:j_bip_r_ring_3", "Skeleton:j_bip_r_thumb_1", "Skeleton:j_bip_r_thumb_2", "Skeleton:j_bip_r_thumb_3" ]
[sub_resource type="AnimationNodeAnimation" id=5]
animation = "cliimb1"
[sub_resource type="AnimationNodeTimeScale" id=6]
[sub_resource type="AnimationNodeBlendTree" id=7]
nodes/Animation/node = SubResource( 5 )
nodes/Animation/position = Vector2( 480, 260 )
nodes/TimeScale/node = SubResource( 6 )
nodes/TimeScale/position = Vector2( 800, 260 )
nodes/output/position = Vector2( 1140, 180 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=8]
animation = "cliimb1a"
[sub_resource type="AnimationNodeTimeScale" id=9]
[sub_resource type="AnimationNodeBlendTree" id=10]
nodes/Animation/node = SubResource( 8 )
nodes/Animation/position = Vector2( 470, 267 )
nodes/TimeScale/node = SubResource( 9 )
nodes/TimeScale/position = Vector2( 812, 292 )
nodes/output/position = Vector2( 1120, 220 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=11]
animation = "drive-loop"
[sub_resource type="AnimationNodeTimeScale" id=12]
[sub_resource type="AnimationNodeBlendTree" id=13]
nodes/Animation/node = SubResource( 11 )
nodes/Animation/position = Vector2( 276, 122 )
nodes/TimeScale/node = SubResource( 12 )
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=14]
animation = "start-grab"
[sub_resource type="AnimationNodeTimeScale" id=15]
[sub_resource type="AnimationNodeBlendTree" id=16]
nodes/Animation/node = SubResource( 14 )
nodes/Animation/position = Vector2( 573, 137 )
nodes/TimeScale/node = SubResource( 15 )
nodes/TimeScale/position = Vector2( 820, 100 )
nodes/output/position = Vector2( 1160, 140 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=17]
animation = "stand1-loop"
[sub_resource type="AnimationNodeTimeScale" id=18]
[sub_resource type="AnimationNodeBlendTree" id=19]
nodes/Animation/node = SubResource( 17 )
nodes/Animation/position = Vector2( 320, 140 )
nodes/TimeScale/node = SubResource( 18 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=141]
animation = "male-mx-run-loop"
[sub_resource type="AnimationNodeTimeScale" id=20]
[sub_resource type="AnimationNodeBlendTree" id=30]
graph_offset = Vector2( 0, 116 )
nodes/Animation/node = SubResource( 141 )
nodes/Animation/position = Vector2( 287, 281 )
nodes/TimeScale/node = SubResource( 20 )
nodes/TimeScale/position = Vector2( 520, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=31]
animation = "strafe-right-loop"
[sub_resource type="AnimationNodeTimeScale" id=32]
[sub_resource type="AnimationNodeBlendTree" id=33]
nodes/Animation/node = SubResource( 31 )
nodes/Animation/position = Vector2( 340, 140 )
nodes/TimeScale/node = SubResource( 32 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 780, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=34]
animation = "strafe-left-loop"
[sub_resource type="AnimationNodeTimeScale" id=35]
[sub_resource type="AnimationNodeBlendTree" id=36]
nodes/Animation/node = SubResource( 34 )
nodes/Animation/position = Vector2( 200, 140 )
nodes/TimeScale/node = SubResource( 35 )
nodes/TimeScale/position = Vector2( 580, 140 )
nodes/output/position = Vector2( 920, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=140]
animation = "male-mx-walk-loop"
[sub_resource type="AnimationNodeTimeScale" id=37]
[sub_resource type="AnimationNodeBlendTree" id=39]
nodes/Animation/node = SubResource( 140 )
nodes/Animation/position = Vector2( 513, 239 )
nodes/TimeScale/node = SubResource( 37 )
nodes/TimeScale/position = Vector2( 940, 220 )
nodes/output/position = Vector2( 1220, 120 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeBlendSpace2D" id=40]
blend_point_0/node = SubResource( 19 )
blend_point_0/pos = Vector2( 0, 0 )
blend_point_1/node = SubResource( 30 )
blend_point_1/pos = Vector2( 0.9, 0 )
blend_point_2/node = SubResource( 33 )
blend_point_2/pos = Vector2( 0, 1 )
blend_point_3/node = SubResource( 36 )
blend_point_3/pos = Vector2( 0, -1 )
blend_point_4/node = SubResource( 39 )
blend_point_4/pos = Vector2( 0.1, 0 )
blend_mode = 1
[sub_resource type="AnimationNodeBlendTree" id=41]
graph_offset = Vector2( -453, -230.5 )
nodes/loc/node = SubResource( 40 )
nodes/loc/position = Vector2( 180, -20 )
nodes/output/position = Vector2( 580, 120 )
node_connections = [ "output", 0, "loc" ]
[sub_resource type="AnimationNodeAnimation" id=42]
animation = "car-passenger-loop"
[sub_resource type="AnimationNodeTimeScale" id=43]
[sub_resource type="AnimationNodeBlendTree" id=44]
nodes/Animation/node = SubResource( 42 )
nodes/Animation/position = Vector2( 300, 80 )
nodes/TimeScale/node = SubResource( 43 )
nodes/TimeScale/position = Vector2( 560, 80 )
nodes/output/position = Vector2( 800, 80 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=45]
animation = "dagger-sacrifice-counter-a"
[sub_resource type="AnimationNodeTimeScale" id=46]
[sub_resource type="AnimationNodeTimeSeek" id=47]
[sub_resource type="AnimationNodeBlendTree" id=48]
graph_offset = Vector2( 0, -262 )
nodes/Animation/node = SubResource( 45 )
nodes/Animation/position = Vector2( 520, 180 )
nodes/TimeScale/node = SubResource( 46 )
nodes/TimeScale/position = Vector2( 980, 200 )
nodes/output/position = Vector2( 1480, 180 )
nodes/seek/node = SubResource( 47 )
nodes/seek/position = Vector2( 920, -20 )
node_connections = [ "seek", 0, "Animation", "output", 0, "TimeScale", "TimeScale", 0, "seek" ]
[sub_resource type="AnimationNodeAnimation" id=49]
animation = "sleeping1-loop"
[sub_resource type="AnimationNodeTimeScale" id=50]
[sub_resource type="AnimationNodeBlendTree" id=51]
nodes/Animation/node = SubResource( 49 )
nodes/Animation/position = Vector2( 220, 320 )
nodes/TimeScale/node = SubResource( 50 )
nodes/TimeScale/position = Vector2( 623, 370 )
nodes/output/position = Vector2( 920, 180 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=107]
animation = "start-walking"
[sub_resource type="AnimationNodeTimeScale" id=108]
[sub_resource type="AnimationNodeBlendTree" id=102]
nodes/Animation/node = SubResource( 107 )
nodes/Animation/position = Vector2( 320, 260 )
nodes/TimeScale/node = SubResource( 108 )
nodes/TimeScale/position = Vector2( 580, 260 )
nodes/output/position = Vector2( 920, 280 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=105]
animation = "stop-walking"
[sub_resource type="AnimationNodeTimeScale" id=106]
[sub_resource type="AnimationNodeBlendTree" id=99]
nodes/Animation/node = SubResource( 105 )
nodes/Animation/position = Vector2( 240, 140 )
nodes/TimeScale/node = SubResource( 106 )
nodes/TimeScale/position = Vector2( 500, 140 )
nodes/output/position = Vector2( 800, 160 )
node_connections = [ "output", 0, "TimeScale", "TimeScale", 0, "Animation" ]
[sub_resource type="AnimationNodeAnimation" id=117]
animation = "turn-left"
[sub_resource type="AnimationNodeAnimation" id=115]
animation = "turn-left"
[sub_resource type="AnimationNodeTimeScale" id=121]
[sub_resource type="AnimationNodeTransition" id=118]
input_count = 2
xfade_time = 0.3
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=109]
nodes/Animation/node = SubResource( 115 )
nodes/Animation/position = Vector2( 160, 260 )
"nodes/Animation 2/node" = SubResource( 117 )
"nodes/Animation 2/position" = Vector2( 160, 400 )
nodes/TimeScale/node = SubResource( 121 )
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", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ]
[sub_resource type="AnimationNodeAnimation" id=119]
animation = "turn-right"
[sub_resource type="AnimationNodeAnimation" id=116]
animation = "turn-right"
[sub_resource type="AnimationNodeTimeScale" id=122]
[sub_resource type="AnimationNodeTransition" id=120]
input_count = 2
xfade_time = 0.3
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=110]
nodes/Animation/node = SubResource( 116 )
nodes/Animation/position = Vector2( 238, 295 )
"nodes/Animation 2/node" = SubResource( 119 )
"nodes/Animation 2/position" = Vector2( 220, 440 )
nodes/TimeScale/node = SubResource( 122 )
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", "TimeScale", 0, "Transition", "Transition", 0, "Animation", "Transition", 1, "Animation 2" ]
[sub_resource type="AnimationNodeAnimation" id=123]
animation = "dagger-sacrifice-counter-a"
[sub_resource type="AnimationNodeAnimation" id=52]
animation = "dagger-sacrifice-counter-a"
[sub_resource type="AnimationNodeTimeScale" id=124]
[sub_resource type="AnimationNodeTimeScale" id=53]
[sub_resource type="AnimationNodeTransition" id=125]
input_count = 2
xfade_time = 0.1
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=54]
nodes/Animation/node = SubResource( 52 )
nodes/Animation/position = Vector2( 196, 150 )
"nodes/Animation 2/node" = SubResource( 123 )
"nodes/Animation 2/position" = Vector2( 240, 320 )
nodes/TimeScale/node = SubResource( 53 )
nodes/TimeScale/position = Vector2( 700, 140 )
"nodes/TimeScale 2/node" = SubResource( 124 )
"nodes/TimeScale 2/position" = Vector2( 680, 300 )
nodes/Transition/node = SubResource( 125 )
nodes/Transition/position = Vector2( 940, 140 )
nodes/output/position = Vector2( 1240, 140 )
node_connections = [ "output", 0, "Transition", "TimeScale", 0, "Animation", "Transition", 0, "TimeScale", "Transition", 1, "TimeScale 2", "TimeScale 2", 0, "Animation 2" ]
[sub_resource type="AnimationNodeStateMachineTransition" id=55]
[sub_resource type="AnimationNodeStateMachineTransition" id=56]
[sub_resource type="AnimationNodeStateMachineTransition" id=57]
[sub_resource type="AnimationNodeStateMachineTransition" id=58]
[sub_resource type="AnimationNodeStateMachineTransition" id=59]
[sub_resource type="AnimationNodeStateMachineTransition" id=60]
[sub_resource type="AnimationNodeStateMachineTransition" id=61]
[sub_resource type="AnimationNodeStateMachineTransition" id=62]
[sub_resource type="AnimationNodeStateMachineTransition" id=63]
[sub_resource type="AnimationNodeStateMachineTransition" id=64]
[sub_resource type="AnimationNodeStateMachineTransition" id=65]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=66]
[sub_resource type="AnimationNodeStateMachineTransition" id=67]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=68]
[sub_resource type="AnimationNodeStateMachineTransition" id=69]
switch_mode = 2
[sub_resource type="AnimationNodeStateMachineTransition" id=100]
xfade_time = 0.1
[sub_resource type="AnimationNodeStateMachineTransition" id=101]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=103]
xfade_time = 0.2
[sub_resource type="AnimationNodeStateMachineTransition" id=104]
switch_mode = 2
auto_advance = true
[sub_resource type="AnimationNodeStateMachineTransition" id=111]
[sub_resource type="AnimationNodeStateMachineTransition" id=112]
switch_mode = 2
xfade_time = 0.5
[sub_resource type="AnimationNodeStateMachineTransition" id=113]
[sub_resource type="AnimationNodeStateMachineTransition" id=114]
switch_mode = 2
xfade_time = 0.5
[sub_resource type="AnimationNodeStateMachine" id=70]
states/climb1/node = SubResource( 7 )
states/climb1/position = Vector2( 359.444, 656 )
states/climb1a/node = SubResource( 10 )
states/climb1a/position = Vector2( 659.444, 154 )
states/drive/node = SubResource( 13 )
states/drive/position = Vector2( 289, 430 )
states/grab/node = SubResource( 16 )
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( 555.444, 339 )
states/sacrificed-a/node = SubResource( 48 )
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 )
states/start_walking/position = Vector2( -75.556, 574 )
states/stop_walking/node = SubResource( 99 )
states/stop_walking/position = Vector2( -131.556, 455 )
states/turn_left/node = SubResource( 109 )
states/turn_left/position = Vector2( -37.556, 676 )
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 ) ]
start_node = "locomotion"
graph_offset = Vector2( -470.556, -68 )
[sub_resource type="AnimationNodeBlendTree" id=71]
graph_offset = Vector2( -499.98, 0 )
nodes/Animation/node = SubResource( 2 )
nodes/Animation/position = Vector2( -200, 260 )
"nodes/Animation 2/node" = SubResource( 1 )
"nodes/Animation 2/position" = Vector2( -280, 400 )
nodes/blade_left/node = SubResource( 3 )
nodes/blade_left/position = Vector2( 220, 180 )
nodes/blade_right/node = SubResource( 4 )
nodes/blade_right/position = Vector2( 680, 320 )
nodes/output/position = Vector2( 1040, 120 )
nodes/state/node = SubResource( 70 )
nodes/state/position = Vector2( -179, 86 )
node_connections = [ "output", 0, "blade_right", "blade_left", 0, "state", "blade_left", 1, "Animation", "blade_right", 0, "blade_left", "blade_right", 1, "Animation 2" ]
[sub_resource type="AnimationNodeStateMachinePlayback" id=72]
[node name="vroid1-man" instance=ExtResource( 1 )]
[node name="Skeleton" parent="." index="0"]
bones/1/bound_children = [ NodePath("hips") ]
bones/75/bound_children = [ NodePath("neck") ]
bones/76/bound_children = [ NodePath("head") ]
bones/80/bound_children = [ NodePath("penis_2") ]
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.998729, 0.041974, 0.083992, -0.0441852, 0.995486, 0.996075, -0.0242614, -0.0851186, 0.24008, 1.0159, -0.0583036 )
bone_name = "wrist_ik_r"
[node name="marker_wrist_r_grab" type="Position3D" parent="Skeleton/wrist_r" index="0"]
transform = Transform( 1, 2.23517e-08, 3.72529e-08, -2.6077e-08, 1, 1.13389e-07, -2.23517e-08, -1.32015e-07, 1, -0.0240285, 0.0591205, -0.0170733 )
visible = false
[node name="weapon_right" type="Spatial" parent="Skeleton/wrist_r" index="1"]
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.0271, -0.0530299 )
bone_name = "wrist_ik_l"
[node name="marker_wrist_l_grab" type="Position3D" parent="Skeleton/wrist_l" index="0"]
transform = Transform( 1, -5.96046e-08, 1.19209e-07, -2.98023e-08, 1, 7.45058e-09, -9.68575e-08, 1.00583e-07, 1, -0.0303702, 0.0625808, -0.0433671 )
visible = false
[node name="weapon_left" type="Spatial" parent="Skeleton/wrist_l" index="1"]
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.998061, -0.0095934, -0.0614997, 0.0314598, 0.930306, 0.365432, 0.0537078, -0.366659, 0.928804, -0.0330975, 1.69764, -0.00609486 )
bone_name = "J_Bip_C_Head"
[node name="marker_talk" type="Position3D" parent="Skeleton/head" index="0"]
transform = Transform( 0.991494, 0.0477842, -0.121069, -0.0472599, 0.998856, 0.0071997, 0.121275, -0.00141716, 0.992618, 0.00322284, 0.224896, -0.137154 )
visible = false
[node name="hair" type="Spatial" parent="Skeleton/head" index="1"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.011 )
[node name="male-hair1" parent="Skeleton/head/hair" index="0" instance=ExtResource( 2 )]
[node name="face" type="Spatial" parent="Skeleton/head" index="2"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.011 )
[node name="male-face" parent="Skeleton/head/face" index="0" instance=ExtResource( 3 )]
[node name="hips" type="BoneAttachment" parent="Skeleton" index="5"]
transform = Transform( 0.988538, -0.146769, 0.0353867, 0.150102, 0.98061, -0.125986, -0.0162097, 0.129854, 0.991401, 0.000514592, 1.10104, -0.0117666 )
bone_name = "J_Bip_C_Hips"
[node name="marker_hips_action" type="Position3D" parent="Skeleton/hips" index="0"]
transform = Transform( 0.999999, 0.000161137, 0.00126248, -0.000160797, 1, -0.000193566, -0.00126263, 0.000193223, 0.999999, 0.0136906, -0.0795597, 0.214268 )
visible = false
[node name="neck" type="BoneAttachment" parent="Skeleton" index="6"]
transform = Transform( 0.999522, -0.0284599, 0.0120657, 0.0262095, 0.987195, 0.157347, -0.0163893, -0.156956, 0.987469, -0.0303023, 1.60068, 0.00932036 )
bone_name = "J_Bip_C_Neck"
[node name="marker_neck_grab" type="Position3D" parent="Skeleton/neck" index="0"]
transform = Transform( 0.998758, -0.00781338, 0.0492147, 0.00787775, 0.999969, -0.001113, -0.0492044, 0.0014993, 0.998788, -0.00122673, 0.0275304, -0.0923626 )
visible = false
[node name="penis_2" type="BoneAttachment" parent="Skeleton" index="7"]
transform = Transform( 0.988538, 0.119852, -0.0918097, 0.150102, -0.845508, 0.51243, -0.0162103, -0.520337, -0.853807, 0.0156493, 0.991264, -0.105296 )
bone_name = "penis2"
[node name="marker_penis_action" type="Position3D" parent="Skeleton/penis_2" index="0"]
transform = Transform( 0.998824, -0.0252848, -0.0413812, 0.0249792, 0.999657, -0.00788352, 0.0415664, 0.00684074, 0.999113, -0.0100176, 0.0641036, 0.0307807 )
visible = false
[node name="AnimationTree" type="AnimationTree" parent="." index="2"]
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
parameters/state/playback = SubResource( 72 )
parameters/state/climb1/TimeScale/scale = 2.0
parameters/state/climb1a/TimeScale/scale = 2.0
parameters/state/drive/TimeScale/scale = 1.0
parameters/state/grab/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
parameters/state/locomotion/loc/2/TimeScale/scale = 2.0
parameters/state/locomotion/loc/3/TimeScale/scale = 1.0
parameters/state/locomotion/loc/4/TimeScale/scale = 1.0
parameters/state/passenger/TimeScale/scale = 1.0
parameters/state/sacrificed-a/TimeScale/scale = 1.0
parameters/state/sacrificed-a/seek/seek_position = 1.0
parameters/state/sleeping/TimeScale/scale = 1.0
parameters/state/start_walking/TimeScale/scale = 2.0
parameters/state/stop_walking/TimeScale/scale = 2.0
parameters/state/turn_left/TimeScale/scale = 2.0
parameters/state/turn_left/Transition/current = 0
parameters/state/turn_right/TimeScale/scale = 1.0
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

4
cleanup.sh Normal file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
rm -Rf .import
find . -type f -name '*.mesh' -exec rm '{}' ';'

24
export_presets.cfg Normal file
View File

@@ -0,0 +1,24 @@
[preset.0]
name="linux"
platform="Linux/X11"
runnable=true
custom_features=""
export_filter="all_resources"
include_filter="*.json,*.txt"
exclude_filter=""
export_path="export/ac2.x86_64"
script_export_mode=1
script_encryption_key=""
[preset.0.options]
custom_template/debug="/home/slapin/godot-projects/small-game/src/godot/bin/godot.x11.opt.tools.64"
custom_template/release="/home/slapin/godot-projects/small-game/src/godot/bin/godot.x11.opt.64"
binary_format/64_bits=true
binary_format/embed_pck=true
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=true
texture_format/etc2=true
texture_format/no_bptc_fallbacks=true

BIN
objects/Material.material Normal file

Binary file not shown.

21
objects/foundation.tscn Normal file
View File

@@ -0,0 +1,21 @@
[gd_scene load_steps=4 format=2]
[sub_resource type="SpatialMaterial" id=2]
[sub_resource type="CubeMesh" id=1]
material = SubResource( 2 )
[sub_resource type="ConcavePolygonShape" id=3]
data = PoolVector3Array( -1, 1, 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, 1, -1, -1, -1, -1, -1 )
[node name="foundation" type="Spatial"]
[node name="MeshInstance" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 )
mesh = SubResource( 1 )
material/0 = null
[node name="StaticBody" type="StaticBody" parent="MeshInstance"]
[node name="CollisionShape" type="CollisionShape" parent="MeshInstance/StaticBody"]
shape = SubResource( 3 )

15
objects/house.gd Normal file
View File

@@ -0,0 +1,15 @@
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():
for g in get_children():
if g.name.begins_with("spawn"):
g.add_to_group("spawn")
$spawn_npc1.add_to_group("keep")

BIN
objects/palace.bin Normal file

Binary file not shown.

123
objects/palace.gd Normal file
View File

@@ -0,0 +1,123 @@
extends Spatial
var courtyard_tile: PackedScene = load("res://objects/courtyard-tile.scn")
var foundation_tile: PackedScene = load("res://objects/foundation.scn")
var room_tile: PackedScene = load("res://objects/block-room-corridoor.scn")
var tower_walls_tile: PackedScene = load("res://objects/tower-walls.scn")
var tower_floor_tile: PackedScene = load("res://objects/tower_floor.scn")
var stairs_tile: PackedScene = load("res://objects/stairs.scn")
var gate_bottom_tile: PackedScene = load("res://objects/gate_bottom.scn")
var gate_top_tile: PackedScene = load("res://objects/gate-top.scn")
var entry_tile: PackedScene = load("res://objects/block-room-entry.scn")
var roof_tile: PackedScene = load("res://objects/roof.scn")
var tower_roof_tile: PackedScene = load("res://objects/tower-roof.scn")
const tile_size = 8
const palace_size = 8
const layers = 4
func _ready():
var voffset = 0.0
for layer in range(layers):
match layer:
0:
voffset += 0.0
1:
voffset += 1
2:
voffset += 4
_:
voffset += 4
for i in range(palace_size):
for j in range(palace_size):
var x = i * tile_size - palace_size * tile_size / 2
var z = j * tile_size - palace_size * tile_size / 2
if layer == 0:
var ct = courtyard_tile.instance()
var xform = Transform(Basis(), Vector3(x, voffset, z))
if i > 0 && i < palace_size - 1:
if j > 0 && j < palace_size - 1:
call_deferred("place", ct, xform)
if i in [0, palace_size - 1] || j in [0, palace_size - 1]:
call_deferred("place", ct, xform)
else:
var ct = room_tile.instance()
var tower_angles = {
0:
{
0: -PI / 2.0,
palace_size - 1: 0
},
palace_size - 1:
{
0: PI,
palace_size - 1: PI / 2.0
}
}
var xform = Transform(Basis(), Vector3(x, voffset, z))
if i == 0 && !j in [0, palace_size - 1]:
xform.basis = Basis().rotated(Vector3.UP, -PI / 2.0)
spawn_wall(layer, i, j, xform)
elif i == palace_size - 1 && !j in [0, palace_size - 1]:
xform.basis = Basis().rotated(Vector3.UP, PI / 2.0)
spawn_wall(layer, i, j, xform)
elif !i in [0, palace_size - 1] && j == 0:
xform.basis = Basis().rotated(Vector3.UP, PI)
spawn_wall(layer, i, j, xform)
elif !i in [0, palace_size - 1] && j == palace_size - 1:
xform.basis = Basis()
spawn_wall(layer, i, j, xform)
elif tower_angles.has(i) && tower_angles[i].has(j):
xform.basis = Basis().rotated(Vector3.UP, tower_angles[i][j])
if layer == layers - 1:
var twr = tower_roof_tile.instance()
call_deferred("place", twr, xform)
else:
var tw = tower_walls_tile.instance()
call_deferred("place", tw, xform)
var st = stairs_tile.instance()
call_deferred("place", st, xform)
if layer == 1:
var tfl = tower_floor_tile.instance()
call_deferred("place", tfl, xform)
var car = Spatial.new()
car.add_to_group("spawn")
car.add_to_group("keep")
car.add_to_group("car")
add_child(car)
for e in range(5):
var major_f = Spatial.new()
major_f.add_to_group("spawn")
if e == 0:
major_f.add_to_group("male")
else:
major_f.add_to_group("female")
major_f.add_to_group("keep")
add_child(major_f)
major_f.global_transform = Transform(Basis(), Vector3(cos(PI / 3 * e) * 2.0, 0, sin(PI / 3 * e) * 2.0) + Vector3(10.0, 0, 0))
print("PALACE done")
func place(obj, where):
add_child(obj)
obj.transform = where
print("placed at ", where.origin)
func spawn_wall(layer:int, i: int, j: int, xform: Transform):
if layer == layers - 1:
var rt = roof_tile.instance()
call_deferred("place", rt, xform)
elif (j != palace_size / 2.0 && i != palace_size / 2.0)|| layer > 2:
var ct = room_tile.instance()
call_deferred("place", ct, xform)
elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 1:
var ent = entry_tile.instance()
call_deferred("place", ent, xform)
elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 1:
var gw = gate_bottom_tile.instance()
call_deferred("place", gw, xform)
elif (j != palace_size / 2.0 && i == palace_size / 2.0) && layer == 2:
var gw = gate_top_tile.instance()
call_deferred("place", gw, xform)
elif (j == palace_size / 2.0 && i != palace_size / 2.0) && layer == 2:
var ct = room_tile.instance()
call_deferred("place", ct, xform)

889
objects/palace.gltf Normal file
View File

@@ -0,0 +1,889 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v1.6.16",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "courtyard-tile-col",
"translation" : [
94,
0,
0
]
},
{
"mesh" : 1,
"name" : "block-room-corridoor-col",
"translation" : [
83,
0,
0
]
},
{
"mesh" : 2,
"name" : "foundation-col",
"translation" : [
104,
0,
0
]
},
{
"mesh" : 3,
"name" : "tower-walls-col",
"translation" : [
56,
0,
0
]
},
{
"mesh" : 4,
"name" : "stairs-col",
"translation" : [
73,
0,
0
]
},
{
"mesh" : 5,
"name" : "gate_bottom-col",
"translation" : [
115,
0,
0
]
},
{
"mesh" : 6,
"name" : "gate-top-col",
"translation" : [
115,
4,
0
]
},
{
"mesh" : 7,
"name" : "tower_floor-col",
"translation" : [
66,
0,
0
]
},
{
"mesh" : 8,
"name" : "block-room-entry-col",
"translation" : [
46,
0,
0
]
},
{
"mesh" : 9,
"name" : "roof-col",
"translation" : [
36,
0,
0
]
},
{
"mesh" : 10,
"name" : "tower-roof-col",
"translation" : [
26,
0,
0
]
}
],
"materials" : [
{
"name" : "palace",
"pbrMetallicRoughness" : {
"baseColorFactor" : [
0.800000011920929,
0.800000011920929,
0.800000011920929,
1
],
"metallicFactor" : 0,
"roughnessFactor" : 0.5
}
}
],
"meshes" : [
{
"name" : "Cube",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"NORMAL" : 1,
"TEXCOORD_0" : 2
},
"indices" : 3,
"material" : 0
}
]
},
{
"name" : "Cube.351",
"primitives" : [
{
"attributes" : {
"POSITION" : 4,
"NORMAL" : 5,
"TEXCOORD_0" : 6
},
"indices" : 7,
"material" : 0
}
]
},
{
"name" : "Cube.001",
"primitives" : [
{
"attributes" : {
"POSITION" : 8,
"NORMAL" : 9,
"TEXCOORD_0" : 10
},
"indices" : 3,
"material" : 0
}
]
},
{
"name" : "Cube.003",
"primitives" : [
{
"attributes" : {
"POSITION" : 11,
"NORMAL" : 12,
"TEXCOORD_0" : 13
},
"indices" : 14,
"material" : 0
}
]
},
{
"name" : "Cube.005",
"primitives" : [
{
"attributes" : {
"POSITION" : 15,
"NORMAL" : 16,
"TEXCOORD_0" : 17
},
"indices" : 18,
"material" : 0
}
]
},
{
"name" : "Cube.007",
"primitives" : [
{
"attributes" : {
"POSITION" : 19,
"NORMAL" : 20,
"TEXCOORD_0" : 21
},
"indices" : 22,
"material" : 0
}
]
},
{
"name" : "Cube.008",
"primitives" : [
{
"attributes" : {
"POSITION" : 23,
"NORMAL" : 24,
"TEXCOORD_0" : 25
},
"indices" : 26,
"material" : 0
}
]
},
{
"name" : "Cube.009",
"primitives" : [
{
"attributes" : {
"POSITION" : 27,
"NORMAL" : 28,
"TEXCOORD_0" : 29
},
"indices" : 30,
"material" : 0
}
]
},
{
"name" : "Cube.010",
"primitives" : [
{
"attributes" : {
"POSITION" : 31,
"NORMAL" : 32,
"TEXCOORD_0" : 33
},
"indices" : 34,
"material" : 0
}
]
},
{
"name" : "Cube.011",
"primitives" : [
{
"attributes" : {
"POSITION" : 35,
"NORMAL" : 36,
"TEXCOORD_0" : 37
},
"indices" : 38,
"material" : 0
}
]
},
{
"name" : "Cube.017",
"primitives" : [
{
"attributes" : {
"POSITION" : 39,
"NORMAL" : 40,
"TEXCOORD_0" : 41
},
"indices" : 42
}
]
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 24,
"max" : [
4,
0,
4
],
"min" : [
-4,
-1,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 24,
"type" : "VEC3"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 24,
"type" : "VEC2"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 36,
"type" : "SCALAR"
},
{
"bufferView" : 4,
"componentType" : 5126,
"count" : 1057,
"max" : [
4,
3.799999952316284,
4
],
"min" : [
-4.000003337860107,
-0.20000004768371582,
-4.099991321563721
],
"type" : "VEC3"
},
{
"bufferView" : 5,
"componentType" : 5126,
"count" : 1057,
"type" : "VEC3"
},
{
"bufferView" : 6,
"componentType" : 5126,
"count" : 1057,
"type" : "VEC2"
},
{
"bufferView" : 7,
"componentType" : 5123,
"count" : 2604,
"type" : "SCALAR"
},
{
"bufferView" : 8,
"componentType" : 5126,
"count" : 24,
"max" : [
4,
0.800000011920929,
4
],
"min" : [
-4,
-1,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 9,
"componentType" : 5126,
"count" : 24,
"type" : "VEC3"
},
{
"bufferView" : 10,
"componentType" : 5126,
"count" : 24,
"type" : "VEC2"
},
{
"bufferView" : 11,
"componentType" : 5126,
"count" : 849,
"max" : [
4,
3.799999952316284,
4
],
"min" : [
-4,
-0.20000000298023224,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 12,
"componentType" : 5126,
"count" : 849,
"type" : "VEC3"
},
{
"bufferView" : 13,
"componentType" : 5126,
"count" : 849,
"type" : "VEC2"
},
{
"bufferView" : 14,
"componentType" : 5123,
"count" : 2178,
"type" : "SCALAR"
},
{
"bufferView" : 15,
"componentType" : 5126,
"count" : 905,
"max" : [
4,
5,
3.9000000953674316
],
"min" : [
-3.8999996185302734,
0,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 16,
"componentType" : 5126,
"count" : 905,
"type" : "VEC3"
},
{
"bufferView" : 17,
"componentType" : 5126,
"count" : 905,
"type" : "VEC2"
},
{
"bufferView" : 18,
"componentType" : 5123,
"count" : 1596,
"type" : "SCALAR"
},
{
"bufferView" : 19,
"componentType" : 5126,
"count" : 80,
"max" : [
4,
3.799999952316284,
4.5
],
"min" : [
-4,
-0.19999992847442627,
-4.5
],
"type" : "VEC3"
},
{
"bufferView" : 20,
"componentType" : 5126,
"count" : 80,
"type" : "VEC3"
},
{
"bufferView" : 21,
"componentType" : 5126,
"count" : 80,
"type" : "VEC2"
},
{
"bufferView" : 22,
"componentType" : 5123,
"count" : 156,
"type" : "SCALAR"
},
{
"bufferView" : 23,
"componentType" : 5126,
"count" : 504,
"max" : [
4,
4,
4.5
],
"min" : [
-4,
-0.19999992847442627,
-4.5
],
"type" : "VEC3"
},
{
"bufferView" : 24,
"componentType" : 5126,
"count" : 504,
"type" : "VEC3"
},
{
"bufferView" : 25,
"componentType" : 5126,
"count" : 504,
"type" : "VEC2"
},
{
"bufferView" : 26,
"componentType" : 5123,
"count" : 1332,
"type" : "SCALAR"
},
{
"bufferView" : 27,
"componentType" : 5126,
"count" : 4,
"max" : [
1.5,
0,
4
],
"min" : [
-3.9000000953674316,
0,
-3.9000000953674316
],
"type" : "VEC3"
},
{
"bufferView" : 28,
"componentType" : 5126,
"count" : 4,
"type" : "VEC3"
},
{
"bufferView" : 29,
"componentType" : 5126,
"count" : 4,
"type" : "VEC2"
},
{
"bufferView" : 30,
"componentType" : 5123,
"count" : 6,
"type" : "SCALAR"
},
{
"bufferView" : 31,
"componentType" : 5126,
"count" : 1143,
"max" : [
4,
3.799999952316284,
4
],
"min" : [
-4,
-0.9818469285964966,
-5.357455253601074
],
"type" : "VEC3"
},
{
"bufferView" : 32,
"componentType" : 5126,
"count" : 1143,
"type" : "VEC3"
},
{
"bufferView" : 33,
"componentType" : 5126,
"count" : 1143,
"type" : "VEC2"
},
{
"bufferView" : 34,
"componentType" : 5123,
"count" : 3180,
"type" : "SCALAR"
},
{
"bufferView" : 35,
"componentType" : 5126,
"count" : 36,
"max" : [
4,
5,
4
],
"min" : [
-4,
-0.20000000298023224,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 36,
"componentType" : 5126,
"count" : 36,
"type" : "VEC3"
},
{
"bufferView" : 37,
"componentType" : 5126,
"count" : 36,
"type" : "VEC2"
},
{
"bufferView" : 38,
"componentType" : 5123,
"count" : 60,
"type" : "SCALAR"
},
{
"bufferView" : 39,
"componentType" : 5126,
"count" : 1832,
"max" : [
4,
14,
4
],
"min" : [
-4,
-0.30000001192092896,
-4
],
"type" : "VEC3"
},
{
"bufferView" : 40,
"componentType" : 5126,
"count" : 1832,
"type" : "VEC3"
},
{
"bufferView" : 41,
"componentType" : 5126,
"count" : 1832,
"type" : "VEC2"
},
{
"bufferView" : 42,
"componentType" : 5123,
"count" : 2964,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 0
},
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 288
},
{
"buffer" : 0,
"byteLength" : 192,
"byteOffset" : 576
},
{
"buffer" : 0,
"byteLength" : 72,
"byteOffset" : 768
},
{
"buffer" : 0,
"byteLength" : 12684,
"byteOffset" : 840
},
{
"buffer" : 0,
"byteLength" : 12684,
"byteOffset" : 13524
},
{
"buffer" : 0,
"byteLength" : 8456,
"byteOffset" : 26208
},
{
"buffer" : 0,
"byteLength" : 5208,
"byteOffset" : 34664
},
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 39872
},
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 40160
},
{
"buffer" : 0,
"byteLength" : 192,
"byteOffset" : 40448
},
{
"buffer" : 0,
"byteLength" : 10188,
"byteOffset" : 40640
},
{
"buffer" : 0,
"byteLength" : 10188,
"byteOffset" : 50828
},
{
"buffer" : 0,
"byteLength" : 6792,
"byteOffset" : 61016
},
{
"buffer" : 0,
"byteLength" : 4356,
"byteOffset" : 67808
},
{
"buffer" : 0,
"byteLength" : 10860,
"byteOffset" : 72164
},
{
"buffer" : 0,
"byteLength" : 10860,
"byteOffset" : 83024
},
{
"buffer" : 0,
"byteLength" : 7240,
"byteOffset" : 93884
},
{
"buffer" : 0,
"byteLength" : 3192,
"byteOffset" : 101124
},
{
"buffer" : 0,
"byteLength" : 960,
"byteOffset" : 104316
},
{
"buffer" : 0,
"byteLength" : 960,
"byteOffset" : 105276
},
{
"buffer" : 0,
"byteLength" : 640,
"byteOffset" : 106236
},
{
"buffer" : 0,
"byteLength" : 312,
"byteOffset" : 106876
},
{
"buffer" : 0,
"byteLength" : 6048,
"byteOffset" : 107188
},
{
"buffer" : 0,
"byteLength" : 6048,
"byteOffset" : 113236
},
{
"buffer" : 0,
"byteLength" : 4032,
"byteOffset" : 119284
},
{
"buffer" : 0,
"byteLength" : 2664,
"byteOffset" : 123316
},
{
"buffer" : 0,
"byteLength" : 48,
"byteOffset" : 125980
},
{
"buffer" : 0,
"byteLength" : 48,
"byteOffset" : 126028
},
{
"buffer" : 0,
"byteLength" : 32,
"byteOffset" : 126076
},
{
"buffer" : 0,
"byteLength" : 12,
"byteOffset" : 126108
},
{
"buffer" : 0,
"byteLength" : 13716,
"byteOffset" : 126120
},
{
"buffer" : 0,
"byteLength" : 13716,
"byteOffset" : 139836
},
{
"buffer" : 0,
"byteLength" : 9144,
"byteOffset" : 153552
},
{
"buffer" : 0,
"byteLength" : 6360,
"byteOffset" : 162696
},
{
"buffer" : 0,
"byteLength" : 432,
"byteOffset" : 169056
},
{
"buffer" : 0,
"byteLength" : 432,
"byteOffset" : 169488
},
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 169920
},
{
"buffer" : 0,
"byteLength" : 120,
"byteOffset" : 170208
},
{
"buffer" : 0,
"byteLength" : 21984,
"byteOffset" : 170328
},
{
"buffer" : 0,
"byteLength" : 21984,
"byteOffset" : 192312
},
{
"buffer" : 0,
"byteLength" : 14656,
"byteOffset" : 214296
},
{
"buffer" : 0,
"byteLength" : 5928,
"byteOffset" : 228952
}
],
"buffers" : [
{
"byteLength" : 234880,
"uri" : "palace.bin"
}
]
}

1064
objects/palace.gltf.import Normal file

File diff suppressed because it is too large Load Diff

BIN
objects/palace.material Normal file

Binary file not shown.

6
objects/palace.tscn Normal file
View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://objects/palace.gd" type="Script" id=2]
[node name="palace" type="Spatial"]
script = ExtResource( 2 )

BIN
objects/palace_001.material Normal file

Binary file not shown.

BIN
objects/trailer-house.bin Normal file

Binary file not shown.

151
objects/trailer-house.gd Normal file
View File

@@ -0,0 +1,151 @@
extends Spatial
var side_wall: PackedScene = preload("res://objects/wall-side.scn")
var bottom_side: PackedScene = preload("res://objects/bottom-side.scn")
var bottom: PackedScene = preload("res://objects/bottom.scn")
var bottom_wheels: PackedScene = preload("res://objects/bottom-wheels.scn")
var entry: PackedScene = preload("res://objects/entry.scn")
var roof_floor: PackedScene = preload("res://objects/roof-floor.scn")
var roof_floor_range: PackedScene = preload("res://objects/roof-floor-range.scn")
var wall_internal: PackedScene = preload("res://objects/wall-internal.scn")
var window_narrow: PackedScene = preload("res://objects/window-narrow.scn")
var window_wide: PackedScene = preload("res://objects/window-wide.scn")
var wall_solid: PackedScene = preload("res://objects/wall-solid.scn")
onready var rnd = RandomNumberGenerator.new()
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var thread: Thread
func _ready():
thread = Thread.new()
# var parts = {
# "side_wall": side_wall,
# "bottom_side": bottom_side,
# "bottom": bottom,
# "bottom_wheels": bottom_wheels,
# "entry": entry,
# "roof_floor": roof_floor,
# "roof_floor_range": roof_floor_range,
# "wall_internal": wall_internal,
# "window_narrow": window_narrow,
# "window_wide": window_wide,
# "wall_solid": wall_solid
# }
# for k in parts.keys():
# Spawner.add_scene(k, parts[k])
func _exit_tree():
if thread.is_active():
thread.wait_to_finish()
func spawn_child(n, xform):
add_child(n)
n.transform = xform
func build_house(userdata):
var s = int(global_transform.origin.x + 100 * global_transform.origin.z * 2) % 0x1ffffff
rnd.seed = s
print(global_transform.origin, " seed = ", s)
var l = 6 + 2 * rnd.randi() % 7 - 1
var h = l - 1
var d = 3 + rnd.randi() % (l - 5 + 1)
var range_used = false
for k in range(l + 1):
var pos = Vector3(0, 0, k * 2)
if k > 0:
if k != d && rnd.randf() > 0.5 && !range_used:
var r = roof_floor_range.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
range_used = true
else:
var r = roof_floor.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
var what
var xt = [Transform(Basis(), pos), Transform(Basis().rotated(Vector3.UP, PI), pos - Vector3(0, 0, 2))]
for x in range(xt.size()):
if x == 0 && k == d:
continue
if rnd.randf() > 0.5:
what = wall_solid.instance()
elif rnd.randf() > 0.5:
what = window_narrow.instance()
else:
what = window_wide.instance()
call_deferred("spawn_child", what, xt[x])
if k > 1 && k < l && rnd.randf() > 0.6:
var r = wall_internal.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", r, xform)
match k:
0:
var b = side_wall.instance()
var c = bottom_side.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
1:
var b = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
2:
var b = bottom_wheels.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
d:
var b = entry.instance()
var c = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
h:
var b = bottom_wheels.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
l:
var b = side_wall.instance()
var c = bottom_side.instance()
var a = bottom.instance()
var xform = Transform(Basis().rotated(Vector3(0, 1, 0), PI), pos)
var xform2 = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
call_deferred("spawn_child", c, xform)
call_deferred("spawn_child", a, xform2)
_:
var b = bottom.instance()
var xform = Transform(Basis(), pos)
call_deferred("spawn_child", b, xform)
# Called every frame. 'delta' is the elapsed time since the previous frame.
var state = 0
func _process(delta):
match state:
0:
state = 1
1:
build_house(self)
state = 2
var prev = 3000000
func _physics_process(delta):
var cam = get_viewport().get_camera()
var dst = cam.global_transform.origin.distance_to(global_transform.origin)
match state:
2:
if abs(prev - dst) > 20:
var space_state = get_viewport().get_world().direct_space_state
var where = get_global_transform().origin
var from = where
var to = where
from.y -= 8.0
to.y += 8.0
var result = space_state.intersect_ray(from, to)
if result.empty() || !result.has("collider"):
return
else:
global_transform.origin = result.position
prev = dst

901
objects/trailer-house.gltf Normal file
View File

@@ -0,0 +1,901 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v1.5.17",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "wall-side-col",
"translation" : [
0,
0,
23
]
},
{
"mesh" : 1,
"name" : "roof-floor-col",
"translation" : [
0,
0,
22.700000762939453
]
},
{
"mesh" : 2,
"name" : "wall-solid-col",
"translation" : [
0,
0,
22.700000762939453
]
},
{
"mesh" : 3,
"name" : "window-wide-col",
"translation" : [
0,
0,
17
]
},
{
"mesh" : 4,
"name" : "window-narrow-col",
"translation" : [
0,
0,
14
]
},
{
"mesh" : 5,
"name" : "entry-col",
"translation" : [
0,
0,
11
]
},
{
"mesh" : 6,
"name" : "bottom-side-col",
"translation" : [
0,
0,
23
]
},
{
"mesh" : 7,
"name" : "bottom-col",
"translation" : [
0,
0,
22.700000762939453
]
},
{
"mesh" : 8,
"name" : "bottom-wheels-col",
"translation" : [
0,
0,
17
]
},
{
"mesh" : 9,
"name" : "wall-internal-col",
"translation" : [
0,
0,
17.299999237060547
]
},
{
"mesh" : 10,
"name" : "roof-floor-range-col",
"translation" : [
0,
0,
19.700000762939453
]
}
],
"materials" : [
{
"name" : "Material",
"pbrMetallicRoughness" : {
"baseColorFactor" : [
0.800000011920929,
0.800000011920929,
0.800000011920929,
1
],
"metallicFactor" : 0,
"roughnessFactor" : 0.4000000059604645
}
}
],
"meshes" : [
{
"name" : "Cube",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"NORMAL" : 1,
"TEXCOORD_0" : 2
},
"indices" : 3,
"material" : 0
}
]
},
{
"name" : "Cube.003",
"primitives" : [
{
"attributes" : {
"POSITION" : 4,
"NORMAL" : 5,
"TEXCOORD_0" : 6
},
"indices" : 7,
"material" : 0
}
]
},
{
"name" : "Cube.004",
"primitives" : [
{
"attributes" : {
"POSITION" : 8,
"NORMAL" : 9,
"TEXCOORD_0" : 10
},
"indices" : 11,
"material" : 0
}
]
},
{
"name" : "Cube.006",
"primitives" : [
{
"attributes" : {
"POSITION" : 12,
"NORMAL" : 13,
"TEXCOORD_0" : 14
},
"indices" : 15,
"material" : 0
}
]
},
{
"name" : "Cube.007",
"primitives" : [
{
"attributes" : {
"POSITION" : 16,
"NORMAL" : 17,
"TEXCOORD_0" : 18
},
"indices" : 19,
"material" : 0
}
]
},
{
"name" : "Cube.008",
"primitives" : [
{
"attributes" : {
"POSITION" : 20,
"NORMAL" : 21,
"TEXCOORD_0" : 22
},
"indices" : 23,
"material" : 0
}
]
},
{
"name" : "Cube.009",
"primitives" : [
{
"attributes" : {
"POSITION" : 24,
"NORMAL" : 25,
"TEXCOORD_0" : 26
},
"indices" : 27,
"material" : 0
}
]
},
{
"name" : "Cube.010",
"primitives" : [
{
"attributes" : {
"POSITION" : 28,
"NORMAL" : 29,
"TEXCOORD_0" : 30
},
"indices" : 31,
"material" : 0
}
]
},
{
"name" : "Cube.011",
"primitives" : [
{
"attributes" : {
"POSITION" : 32,
"NORMAL" : 33,
"TEXCOORD_0" : 34
},
"indices" : 35,
"material" : 0
}
]
},
{
"name" : "Cube.012",
"primitives" : [
{
"attributes" : {
"POSITION" : 36,
"NORMAL" : 37,
"TEXCOORD_0" : 38
},
"indices" : 39,
"material" : 0
}
]
},
{
"name" : "Cube.013",
"primitives" : [
{
"attributes" : {
"POSITION" : 40,
"NORMAL" : 41,
"TEXCOORD_0" : 42
},
"indices" : 43,
"material" : 0
}
]
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 64,
"max" : [
1.7999999523162842,
4.5,
0.09999996423721313
],
"min" : [
-1.8000000715255737,
0.800000011920929,
5.960464477539063e-08
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 64,
"type" : "VEC3"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 64,
"type" : "VEC2"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 108,
"type" : "SCALAR"
},
{
"bufferView" : 4,
"componentType" : 5126,
"count" : 56,
"max" : [
1.8000000715255737,
4.5,
0
],
"min" : [
-1.8000000715255737,
0.800000011920929,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 5,
"componentType" : 5126,
"count" : 56,
"type" : "VEC3"
},
{
"bufferView" : 6,
"componentType" : 5126,
"count" : 56,
"type" : "VEC2"
},
{
"bufferView" : 7,
"componentType" : 5123,
"count" : 84,
"type" : "SCALAR"
},
{
"bufferView" : 8,
"componentType" : 5126,
"count" : 20,
"max" : [
1.8000000715255737,
3.6000001430511475,
0
],
"min" : [
1.7000000476837158,
0.800000011920929,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 9,
"componentType" : 5126,
"count" : 20,
"type" : "VEC3"
},
{
"bufferView" : 10,
"componentType" : 5126,
"count" : 20,
"type" : "VEC2"
},
{
"bufferView" : 11,
"componentType" : 5123,
"count" : 36,
"type" : "SCALAR"
},
{
"bufferView" : 12,
"componentType" : 5126,
"count" : 84,
"max" : [
1.8000000715255737,
3.6000001430511475,
0
],
"min" : [
1.7000000476837158,
0.800000011920929,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 13,
"componentType" : 5126,
"count" : 84,
"type" : "VEC3"
},
{
"bufferView" : 14,
"componentType" : 5126,
"count" : 84,
"type" : "VEC2"
},
{
"bufferView" : 15,
"componentType" : 5123,
"count" : 192,
"type" : "SCALAR"
},
{
"bufferView" : 16,
"componentType" : 5126,
"count" : 76,
"max" : [
1.8000000715255737,
3.6000001430511475,
0
],
"min" : [
1.7000000476837158,
0.800000011920929,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 17,
"componentType" : 5126,
"count" : 76,
"type" : "VEC3"
},
{
"bufferView" : 18,
"componentType" : 5126,
"count" : 76,
"type" : "VEC2"
},
{
"bufferView" : 19,
"componentType" : 5123,
"count" : 192,
"type" : "SCALAR"
},
{
"bufferView" : 20,
"componentType" : 5126,
"count" : 609,
"max" : [
5.500000476837158,
3.6000001430511475,
0
],
"min" : [
1.7000000476837158,
-0.20000000298023224,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 21,
"componentType" : 5126,
"count" : 609,
"type" : "VEC3"
},
{
"bufferView" : 22,
"componentType" : 5126,
"count" : 609,
"type" : "VEC2"
},
{
"bufferView" : 23,
"componentType" : 5123,
"count" : 1650,
"type" : "SCALAR"
},
{
"bufferView" : 24,
"componentType" : 5126,
"count" : 20,
"max" : [
1.7999999523162842,
0.800000011920929,
0.10000001639127731
],
"min" : [
-1.7999999523162842,
0,
-2.2351741790771484e-08
],
"type" : "VEC3"
},
{
"bufferView" : 25,
"componentType" : 5126,
"count" : 20,
"type" : "VEC3"
},
{
"bufferView" : 26,
"componentType" : 5126,
"count" : 20,
"type" : "VEC2"
},
{
"bufferView" : 27,
"componentType" : 5123,
"count" : 30,
"type" : "SCALAR"
},
{
"bufferView" : 28,
"componentType" : 5126,
"count" : 12,
"max" : [
1.7999999523162842,
0.800000011920929,
1.4901161193847656e-08
],
"min" : [
-1.7999999523162842,
0,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 29,
"componentType" : 5126,
"count" : 12,
"type" : "VEC3"
},
{
"bufferView" : 30,
"componentType" : 5126,
"count" : 12,
"type" : "VEC2"
},
{
"bufferView" : 31,
"componentType" : 5123,
"count" : 18,
"type" : "SCALAR"
},
{
"bufferView" : 32,
"componentType" : 5126,
"count" : 20928,
"max" : [
1.8000000715255737,
0.800000011920929,
1.1473894119262695e-06
],
"min" : [
-1.8000000715255737,
-0.058527711778879166,
-2.000000238418579
],
"type" : "VEC3"
},
{
"bufferView" : 33,
"componentType" : 5126,
"count" : 20928,
"type" : "VEC3"
},
{
"bufferView" : 34,
"componentType" : 5126,
"count" : 20928,
"type" : "VEC2"
},
{
"bufferView" : 35,
"componentType" : 5123,
"count" : 31008,
"type" : "SCALAR"
},
{
"bufferView" : 36,
"componentType" : 5126,
"count" : 114,
"max" : [
1.7000000476837158,
4.300000190734863,
0.10000038146972656
],
"min" : [
-1.7000000476837158,
0.9000000357627869,
0
],
"type" : "VEC3"
},
{
"bufferView" : 37,
"componentType" : 5126,
"count" : 114,
"type" : "VEC3"
},
{
"bufferView" : 38,
"componentType" : 5126,
"count" : 114,
"type" : "VEC2"
},
{
"bufferView" : 39,
"componentType" : 5123,
"count" : 276,
"type" : "SCALAR"
},
{
"bufferView" : 40,
"componentType" : 5126,
"count" : 180,
"max" : [
1.8000000715255737,
4.800000190734863,
0
],
"min" : [
-1.8000000715255737,
0.800000011920929,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 41,
"componentType" : 5126,
"count" : 180,
"type" : "VEC3"
},
{
"bufferView" : 42,
"componentType" : 5126,
"count" : 180,
"type" : "VEC2"
},
{
"bufferView" : 43,
"componentType" : 5123,
"count" : 312,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 768,
"byteOffset" : 0
},
{
"buffer" : 0,
"byteLength" : 768,
"byteOffset" : 768
},
{
"buffer" : 0,
"byteLength" : 512,
"byteOffset" : 1536
},
{
"buffer" : 0,
"byteLength" : 216,
"byteOffset" : 2048
},
{
"buffer" : 0,
"byteLength" : 672,
"byteOffset" : 2264
},
{
"buffer" : 0,
"byteLength" : 672,
"byteOffset" : 2936
},
{
"buffer" : 0,
"byteLength" : 448,
"byteOffset" : 3608
},
{
"buffer" : 0,
"byteLength" : 168,
"byteOffset" : 4056
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 4224
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 4464
},
{
"buffer" : 0,
"byteLength" : 160,
"byteOffset" : 4704
},
{
"buffer" : 0,
"byteLength" : 72,
"byteOffset" : 4864
},
{
"buffer" : 0,
"byteLength" : 1008,
"byteOffset" : 4936
},
{
"buffer" : 0,
"byteLength" : 1008,
"byteOffset" : 5944
},
{
"buffer" : 0,
"byteLength" : 672,
"byteOffset" : 6952
},
{
"buffer" : 0,
"byteLength" : 384,
"byteOffset" : 7624
},
{
"buffer" : 0,
"byteLength" : 912,
"byteOffset" : 8008
},
{
"buffer" : 0,
"byteLength" : 912,
"byteOffset" : 8920
},
{
"buffer" : 0,
"byteLength" : 608,
"byteOffset" : 9832
},
{
"buffer" : 0,
"byteLength" : 384,
"byteOffset" : 10440
},
{
"buffer" : 0,
"byteLength" : 7308,
"byteOffset" : 10824
},
{
"buffer" : 0,
"byteLength" : 7308,
"byteOffset" : 18132
},
{
"buffer" : 0,
"byteLength" : 4872,
"byteOffset" : 25440
},
{
"buffer" : 0,
"byteLength" : 3300,
"byteOffset" : 30312
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 33612
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 33852
},
{
"buffer" : 0,
"byteLength" : 160,
"byteOffset" : 34092
},
{
"buffer" : 0,
"byteLength" : 60,
"byteOffset" : 34252
},
{
"buffer" : 0,
"byteLength" : 144,
"byteOffset" : 34312
},
{
"buffer" : 0,
"byteLength" : 144,
"byteOffset" : 34456
},
{
"buffer" : 0,
"byteLength" : 96,
"byteOffset" : 34600
},
{
"buffer" : 0,
"byteLength" : 36,
"byteOffset" : 34696
},
{
"buffer" : 0,
"byteLength" : 251136,
"byteOffset" : 34732
},
{
"buffer" : 0,
"byteLength" : 251136,
"byteOffset" : 285868
},
{
"buffer" : 0,
"byteLength" : 167424,
"byteOffset" : 537004
},
{
"buffer" : 0,
"byteLength" : 62016,
"byteOffset" : 704428
},
{
"buffer" : 0,
"byteLength" : 1368,
"byteOffset" : 766444
},
{
"buffer" : 0,
"byteLength" : 1368,
"byteOffset" : 767812
},
{
"buffer" : 0,
"byteLength" : 912,
"byteOffset" : 769180
},
{
"buffer" : 0,
"byteLength" : 552,
"byteOffset" : 770092
},
{
"buffer" : 0,
"byteLength" : 2160,
"byteOffset" : 770644
},
{
"buffer" : 0,
"byteLength" : 2160,
"byteOffset" : 772804
},
{
"buffer" : 0,
"byteLength" : 1440,
"byteOffset" : 774964
},
{
"buffer" : 0,
"byteLength" : 624,
"byteOffset" : 776404
}
],
"buffers" : [
{
"byteLength" : 777028,
"uri" : "trailer-house.bin"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://objects/trailer-house.gd" type="Script" id=1]
[node name="trailer-house" type="Spatial"]
script = ExtResource( 1 )

BIN
road/road.material Normal file

Binary file not shown.

BIN
road/road.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

37
road/road.png.import Normal file
View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="StreamTexture"
path.s3tc="res://.import/road.png-e38b879061cdfd560f1fe665b2e0de1f.s3tc.stex"
path.etc2="res://.import/road.png-e38b879061cdfd560f1fe665b2e0de1f.etc2.stex"
metadata={
"imported_formats": [ "s3tc", "etc2" ],
"vram_texture": true
}
[deps]
source_file="res://road/road.png"
dest_files=[ "res://.import/road.png-e38b879061cdfd560f1fe665b2e0de1f.s3tc.stex", "res://.import/road.png-e38b879061cdfd560f1fe665b2e0de1f.etc2.stex" ]
[params]
compress/mode=2
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=true
flags/filter=true
flags/mipmaps=true
flags/anisotropic=false
flags/srgb=1
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=false
svg/scale=1.0

BIN
road/road_elements.bin Normal file

Binary file not shown.

600
road/road_elements.gltf Normal file
View File

@@ -0,0 +1,600 @@
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v1.5.17",
"version" : "2.0"
},
"scene" : 0,
"scenes" : [
{
"name" : "Scene",
"nodes" : [
0,
1,
2,
3,
4,
5,
6
]
}
],
"nodes" : [
{
"mesh" : 0,
"name" : "road_main"
},
{
"mesh" : 1,
"name" : "sidewalk_start",
"translation" : [
3,
0,
0
]
},
{
"mesh" : 2,
"name" : "sidewalk",
"translation" : [
4,
0,
0
]
},
{
"mesh" : 3,
"name" : "sidewalk_end2",
"translation" : [
7.100000381469727,
0,
0
]
},
{
"mesh" : 4,
"name" : "sidewalk_end",
"translation" : [
7.600000381469727,
0,
0
]
},
{
"mesh" : 5,
"name" : "road_main.001",
"translation" : [
9.899999618530273,
0,
0
]
},
{
"mesh" : 6,
"name" : "wall",
"translation" : [
13,
0,
0
]
}
],
"materials" : [
{
"doubleSided" : true,
"name" : "road",
"pbrMetallicRoughness" : {
"baseColorTexture" : {
"index" : 0
},
"metallicFactor" : 0.03030303120613098
}
}
],
"meshes" : [
{
"name" : "Cube",
"primitives" : [
{
"attributes" : {
"POSITION" : 0,
"NORMAL" : 1,
"TEXCOORD_0" : 2
},
"indices" : 3,
"material" : 0
}
]
},
{
"name" : "Cube.001",
"primitives" : [
{
"attributes" : {
"POSITION" : 4,
"NORMAL" : 5,
"TEXCOORD_0" : 6
},
"indices" : 7,
"material" : 0
}
]
},
{
"name" : "Cube.002",
"primitives" : [
{
"attributes" : {
"POSITION" : 8,
"NORMAL" : 9,
"TEXCOORD_0" : 10
},
"indices" : 11,
"material" : 0
}
]
},
{
"name" : "Cube.004",
"primitives" : [
{
"attributes" : {
"POSITION" : 12,
"NORMAL" : 13,
"TEXCOORD_0" : 14
},
"indices" : 15,
"material" : 0
}
]
},
{
"name" : "Cube.005",
"primitives" : [
{
"attributes" : {
"POSITION" : 16,
"NORMAL" : 17,
"TEXCOORD_0" : 18
},
"indices" : 19,
"material" : 0
}
]
},
{
"name" : "Cube.003",
"primitives" : [
{
"attributes" : {
"POSITION" : 20,
"NORMAL" : 21,
"TEXCOORD_0" : 22
},
"indices" : 23,
"material" : 0
}
]
},
{
"name" : "Cube.006",
"primitives" : [
{
"attributes" : {
"POSITION" : 24,
"NORMAL" : 25,
"TEXCOORD_0" : 26
},
"indices" : 27,
"material" : 0
}
]
}
],
"textures" : [
{
"sampler" : 0,
"source" : 0
}
],
"images" : [
{
"mimeType" : "image/png",
"name" : "road",
"uri" : "road.png"
}
],
"accessors" : [
{
"bufferView" : 0,
"componentType" : 5126,
"count" : 36,
"max" : [
3,
0.025044016540050507,
0
],
"min" : [
0,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 1,
"componentType" : 5126,
"count" : 36,
"type" : "VEC3"
},
{
"bufferView" : 2,
"componentType" : 5126,
"count" : 36,
"type" : "VEC2"
},
{
"bufferView" : 3,
"componentType" : 5123,
"count" : 60,
"type" : "SCALAR"
},
{
"bufferView" : 4,
"componentType" : 5126,
"count" : 32,
"max" : [
0.40047407150268555,
0.20047391951084137,
0
],
"min" : [
0,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 5,
"componentType" : 5126,
"count" : 32,
"type" : "VEC3"
},
{
"bufferView" : 6,
"componentType" : 5126,
"count" : 32,
"type" : "VEC2"
},
{
"bufferView" : 7,
"componentType" : 5123,
"count" : 48,
"type" : "SCALAR"
},
{
"bufferView" : 8,
"componentType" : 5126,
"count" : 20,
"max" : [
2,
0.21363025903701782,
0
],
"min" : [
0,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 9,
"componentType" : 5126,
"count" : 20,
"type" : "VEC3"
},
{
"bufferView" : 10,
"componentType" : 5126,
"count" : 20,
"type" : "VEC2"
},
{
"bufferView" : 11,
"componentType" : 5123,
"count" : 30,
"type" : "SCALAR"
},
{
"bufferView" : 12,
"componentType" : 5126,
"count" : 42,
"max" : [
0.405000776052475,
0.20000000298023224,
0
],
"min" : [
-2.477318048477173e-07,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 13,
"componentType" : 5126,
"count" : 42,
"type" : "VEC3"
},
{
"bufferView" : 14,
"componentType" : 5126,
"count" : 42,
"type" : "VEC2"
},
{
"bufferView" : 15,
"componentType" : 5123,
"count" : 66,
"type" : "SCALAR"
},
{
"bufferView" : 16,
"componentType" : 5126,
"count" : 46,
"max" : [
2.205000877380371,
0.19999998807907104,
0
],
"min" : [
-2.477318048477173e-07,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 17,
"componentType" : 5126,
"count" : 46,
"type" : "VEC3"
},
{
"bufferView" : 18,
"componentType" : 5126,
"count" : 46,
"type" : "VEC2"
},
{
"bufferView" : 19,
"componentType" : 5123,
"count" : 72,
"type" : "SCALAR"
},
{
"bufferView" : 20,
"componentType" : 5126,
"count" : 26,
"max" : [
3,
0.025044016540050507,
0
],
"min" : [
0,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 21,
"componentType" : 5126,
"count" : 26,
"type" : "VEC3"
},
{
"bufferView" : 22,
"componentType" : 5126,
"count" : 26,
"type" : "VEC2"
},
{
"bufferView" : 23,
"componentType" : 5123,
"count" : 42,
"type" : "SCALAR"
},
{
"bufferView" : 24,
"componentType" : 5126,
"count" : 326,
"max" : [
1.4000005722045898,
3,
0
],
"min" : [
0,
-1,
-2
],
"type" : "VEC3"
},
{
"bufferView" : 25,
"componentType" : 5126,
"count" : 326,
"type" : "VEC3"
},
{
"bufferView" : 26,
"componentType" : 5126,
"count" : 326,
"type" : "VEC2"
},
{
"bufferView" : 27,
"componentType" : 5123,
"count" : 600,
"type" : "SCALAR"
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteLength" : 432,
"byteOffset" : 0
},
{
"buffer" : 0,
"byteLength" : 432,
"byteOffset" : 432
},
{
"buffer" : 0,
"byteLength" : 288,
"byteOffset" : 864
},
{
"buffer" : 0,
"byteLength" : 120,
"byteOffset" : 1152
},
{
"buffer" : 0,
"byteLength" : 384,
"byteOffset" : 1272
},
{
"buffer" : 0,
"byteLength" : 384,
"byteOffset" : 1656
},
{
"buffer" : 0,
"byteLength" : 256,
"byteOffset" : 2040
},
{
"buffer" : 0,
"byteLength" : 96,
"byteOffset" : 2296
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 2392
},
{
"buffer" : 0,
"byteLength" : 240,
"byteOffset" : 2632
},
{
"buffer" : 0,
"byteLength" : 160,
"byteOffset" : 2872
},
{
"buffer" : 0,
"byteLength" : 60,
"byteOffset" : 3032
},
{
"buffer" : 0,
"byteLength" : 504,
"byteOffset" : 3092
},
{
"buffer" : 0,
"byteLength" : 504,
"byteOffset" : 3596
},
{
"buffer" : 0,
"byteLength" : 336,
"byteOffset" : 4100
},
{
"buffer" : 0,
"byteLength" : 132,
"byteOffset" : 4436
},
{
"buffer" : 0,
"byteLength" : 552,
"byteOffset" : 4568
},
{
"buffer" : 0,
"byteLength" : 552,
"byteOffset" : 5120
},
{
"buffer" : 0,
"byteLength" : 368,
"byteOffset" : 5672
},
{
"buffer" : 0,
"byteLength" : 144,
"byteOffset" : 6040
},
{
"buffer" : 0,
"byteLength" : 312,
"byteOffset" : 6184
},
{
"buffer" : 0,
"byteLength" : 312,
"byteOffset" : 6496
},
{
"buffer" : 0,
"byteLength" : 208,
"byteOffset" : 6808
},
{
"buffer" : 0,
"byteLength" : 84,
"byteOffset" : 7016
},
{
"buffer" : 0,
"byteLength" : 3912,
"byteOffset" : 7100
},
{
"buffer" : 0,
"byteLength" : 3912,
"byteOffset" : 11012
},
{
"buffer" : 0,
"byteLength" : 2608,
"byteOffset" : 14924
},
{
"buffer" : 0,
"byteLength" : 1200,
"byteOffset" : 17532
}
],
"samplers" : [
{
"magFilter" : 9729,
"minFilter" : 9987
}
],
"buffers" : [
{
"byteLength" : 18732,
"uri" : "road_elements.bin"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
tool
extends EditorScenePostImport
func post_import(scene):
var queue = [scene]
while queue.size() > 0:
var item = queue.pop_front()
if item is MeshInstance:
if item.name == "car_base":
var shape = item.mesh.create_convex_shape()
var cs = CollisionShape.new()
cs.shape = shape
cs.name = item.name + "_shape"
scene.add_child(cs)
cs.owner = scene
print("generated collision shape")
break
for e in item.get_children():
queue.push_back(e)
return scene

View File

@@ -0,0 +1,14 @@
tool
extends EditorScenePostImport
func post_import(scene):
var queue = [scene]
var d = "res://scenes/clothes/"
while queue.size() > 0:
var g = queue.pop_front()
if g is MeshInstance:
ResourceSaver.save(d + g.name + ".mesh", g.mesh)
print("Saving " + d + g.name + ".mesh")
for e in g.get_children():
queue.push_back(e)
return scene

View File

@@ -0,0 +1,74 @@
extends Node
var raycast_queue = []
var blood = preload("res://scenes/decals/blood.tscn")
var blood_decal = preload("res://scenes/decals/blood1-decal.gltf")
var rnd
func _ready():
var root = get_parent()
var queue = [root]
var hurtboxes = []
while queue.size() > 0:
var item = queue.pop_front()
if item is Area && item.name.ends_with("_hurt"):
hurtboxes.push_back(item)
for e in item.get_children():
queue.push_back(e)
root.set_meta("hurtboxes", hurtboxes)
for e in hurtboxes:
e.connect("area_entered", self, "area_hit", [e])
rnd = RandomNumberGenerator.new()
rnd.randomize()
func area_hit(area, e):
if area.is_in_group("weapon_hit"):
print("HIT")
var bi = blood.instance()
var d = area.global_transform.origin.linear_interpolate(e.global_transform.origin, 0.5)
e.add_child(bi)
bi.global_transform.origin = d
bi.emitting = true
var dcount = 2 + rnd.randi() % 5
var org = d
raycast_queue.push_back(d)
print(dcount)
for rd in range(dcount):
var offt = Vector3()
while offt.length() < 0.05:
offt += Vector3(rnd.randf() * 0.3, 0, rnd.randf() * 0.3)
var xoff = offt.normalized() * 0.04
xoff.y = 0
offt.y = 0
org += xoff + offt
raycast_queue.push_back(org)
yield(get_tree().create_timer(8), "timeout")
bi.queue_free()
func _physics_process(delta):
var root = get_parent()
var space_state: PhysicsDirectSpaceState = root.get_world().direct_space_state
var offsets = [Vector3(0, -2, 0)]
var cam = get_viewport().get_camera()
if !cam.has_meta("player"):
return
var player = cam.get_meta("player")
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)

236
scripts/modules/cmdq.gd Normal file
View File

@@ -0,0 +1,236 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var animtree: AnimationTree
var root_motion_track
func _ready():
process_priority = 0
func _physics_process(delta):
var root = get_parent()
var orientation: Transform
if root.has_meta("orientation"):
orientation = root.get_meta("orientation")
if !animtree:
animtree = root.get_meta("animation_tree")
if animtree:
root_motion_track = animtree.root_motion_track
else:
return
if characters.handle_cmdq(root):
return
var skel = root.get_meta("skeleton")
if !skel:
return
if root.has_meta("cmdqueue"):
var cmds = root.get_meta("cmdqueue")
var cmd = cmds.pop_front()
match cmd[0]:
# "disable_physics":
# var owners = get_shape_owners()
# for e in owners:
# shape_owner_set_disabled(e, true)
# $CollisionShape.disabled = true
"vehicle_mode_on":
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
assert(v is VehicleBody)
if root is PhysicsBody:
root.add_collision_exception_with(v)
if v is PhysicsBody:
v.add_collision_exception_with(root)
"vehicle_mode_off":
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
assert(v is VehicleBody)
if root is PhysicsBody:
root.remove_collision_exception_with(v)
if v is PhysicsBody:
v.remove_collision_exception_with(root)
root.remove_meta("seat")
root.remove_meta("vehicle")
root.remove_meta("orig_parent")
v.remove_meta("driver")
"jumpto":
root.global_transform = cmd[1]
orientation.basis = root.global_transform.basis
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
var et = root.global_transform
var vt = v.global_transform
var offset = vt.affine_inverse() * et
root.set_meta("vehicle_offset", offset)
root.set_meta("orientation", orientation)
# "jump_to_obj":
# var obj = cmd[1]
# root.global_transform = obj.global_transform
# orientation.basis = root.global_transform.basis
# root.set_meta("orientation", orientation)
# "jump_to_obj_rot":
# var obj = cmd[1]
# var xform = Transform()
# xform.origin = obj.global_transform.origin
# xform.basis = obj.global_transform.basis.rotated(Vector3(0, 1, 0), PI)
# root.global_transform = xform
# orientation.basis = root.global_transform.basis
# root.set_meta("orientation", orientation)
# "anim_state":
# characters.animation_node_travel(root, cmd[1])
"parent_to_vehicle":
pass
# if has_meta("vehicle"):
# var v = get_meta("vehicle")
# var et = global_transform.origin
# var vt = v.global_transform.origin
# var offset = et - vt
# set_meta("vehicle_offset", offset)
"col_ex_add", "add_col_exception":
root.add_collision_exception_with(cmd[1])
"col_ex_rm", "remove_col_exception":
root.remove_collision_exception_with(cmd[1])
"until_end":
var check = cmd[1]
var cur = characters.get_animation_node(root)
var p = animtree["parameters/state/playback"].get_current_play_position()
var l = animtree["parameters/state/playback"].get_current_length()
if check == cur && p < l - 0.05:
cmds.push_front(["until_end", cmd[1]])
# "delay":
# var d = cmd[1]
# if d > 0:
# d = d - 1
# cmds.push_front(["delay", d])
"disable_collision":
if root is PhysicsBody:
var mask = root.collision_mask
root.set_meta("orig_mask", mask)
root.collision_mask = 0
root.set_meta("physics", false)
animtree.root_motion_track = ""
"enable_collision":
if root is PhysicsBody:
var mask = root.get_meta("orig_mask")
root.collision_mask = mask
root.remove_meta("orig_mask")
root.set_meta("physics", true)
animtree.root_motion_track = root_motion_track
"show_marker":
if skel.has_node(cmd[1]):
skel.get_node(cmd[1]).show()
"hide_marker":
if skel.has_node(cmd[1]):
skel.get_node(cmd[1]).hide()
"register_marker":
if skel.has_node(cmd[2]):
markers.init_marker(cmd[1], skel.get_node(cmd[2]), cmd[3])
# "anim_param":
# animtree["parameters/" + cmd[1]] = cmd[2]
"equip":
inventory.equip(skel.get_node(cmd[1]), cmd[2])
"walkto":
if !root.has_meta("cmdq_walk"):
root.set_meta("cmdq_walk", true)
var fwd_probe = characters.forward_probe(root, 0.5, 0.05, 1.9, 0.2)
var climb = false
if fwd_probe < 0.1:
if !characters.get_animation_node(root) == "climb1":
characters.animation_node_travel(root, "locomotion");
climb = false
# print("NO climb!!!")
elif fwd_probe < 1.2:
# print("trying climb!!!")
climb = true
characters.set_walk_speed(root, 0.5, 0)
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.5
# animtree["parameters/state/locomotion/loc/blend_position"].y = 0
var gt: Transform = root.global_transform
var target: = Vector3()
if cmd[1] is Spatial:
target = cmd[1].global_transform.origin
else:
target = cmd[1]
target.y = root.global_transform.origin.y
if gt.origin != target:
gt = gt.looking_at(target, Vector3.UP)
gt.origin = Vector3()
# print("target: ", target)
var timeout = cmd[3]
timeout -= delta
orientation.basis = gt.basis
root.set_meta("orientation", orientation)
root.global_transform.basis = gt.basis
var d = root.global_transform.origin.distance_to(target)
if climb:
var cmd_new = ["walkto", cmd[1], cmd[2], timeout + delta]
cmds.push_front(cmd_new)
cmd_new = ["climb", "1"]
cmds.push_front(cmd_new)
elif timeout >= 0.0 && d > cmd[2]:
var cmd_new = ["walkto", cmd[1], cmd[2], timeout]
cmds.push_front(cmd_new)
elif d > cmd[2]:
var dir = target - root.global_transform.origin
dir = dir.normalized() * (d - cmd[2])
root.global_transform.origin += dir
characters.set_walk_speed(root, 0.0, 0.0)
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.0
root.remove_meta("cmdq_walk")
else:
characters.set_walk_speed(root, 0.0, 0.0)
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.0
root.remove_meta("cmdq_walk")
# print(d, " ", timeout, " ", gt)
"set_other":
var cmdq_other = []
if cmd[1].has_meta("cmdqueue"):
cmdq_other = cmd[1].get_meta("cmdqueue")
cmdq_other.push_back(cmd[2])
cmd[1].set_meta("cmdqueue", cmdq_other)
"wait_for_completion":
if !cmd[1].has_meta("complete_" + cmd[2]):
cmds.push_front([cmd[0], cmd[1], cmd[2]])
cmd[1].remove_meta("complete_" + cmd[2])
"complete":
root.set_meta("complete_" + cmd[1], true)
"set_transforms":
var master_xform: Transform = cmd[1].global_transform
var slave_xform = master_xform
slave_xform.basis = master_xform.basis.rotated(Vector3.UP, PI)
slave_xform.origin = master_xform.origin - master_xform.basis[2] * 0.375
var slave_orientation = slave_xform
slave_orientation.origin = Vector3()
cmd[2].set_meta("orientation", slave_orientation)
cmd[2].global_transform = slave_xform
"climb":
if !root.has_meta("last_climb"):
characters.animation_node_travel(root, "climb" + cmd[1])
root.set_meta("last_climb", "climb" + cmd[1])
elif root.get_meta("last_climb") == "climb" + cmd[1]:
characters.animation_node_travel(root, "climb" + cmd[1] + "a")
root.set_meta("last_climb", "climb" + cmd[1] + "a")
else:
characters.animation_node_travel(root, "climb" + cmd[1])
root.set_meta("last_climb", "climb" + cmd[1])
cmds.push_front(["climb_wait", cmd[1]])
root.set_meta("climb", true)
"climb_wait":
var cur = characters.get_animation_node(root)
if cur.begins_with("climb" + cmd[1]):
cmds.push_front(["climb_wait", cmd[1]])
else:
root.remove_meta("climb")
if cmds.size() > 0:
root.set_meta("cmdqueue", cmds)
else:
root.remove_meta("cmdqueue")

View File

@@ -0,0 +1,38 @@
extends Node
# 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():
var root = get_parent()
var cmdq = []
if root.has_meta("cmdqueue"):
cmdq = root.get_meta("cmdqueue")
cmdq.push_back(["register_marker", self, "head/marker_talk", {"method": "talk"}])
cmdq.push_back(["register_marker", self, "head/marker_hips_action", {"method": "action", "action": "hips_action"}])
cmdq.push_back(["show_marker", "head/marker_talk"])
cmdq.push_back(["show_marker", "head/marker_hips_action"])
root.set_meta("cmdqueue", cmdq)
func talk(data):
print("TALK")
# var root = get_parent()
# root.set_meta("req_state", "TALK")
# scenario.emit_signal("talk", root)
func marker_hips_action(data):
print("ACTION")
func action(data):
return
# var root = get_parent()
# root.set_meta("req_state", "ACTION")
# if root.is_in_group("nuns"):
# scenario.nun_action(root)
# else:
# if data.action == "hips_action":
# print(data)
# marker_hips_action(data)

142
scripts/modules/npc_nun.gd Normal file
View File

@@ -0,0 +1,142 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var root
var skel
var hair_skel
var garments = ["female-panties1", "female-bra1", "female-shirt1"]
var garments_head = ["female-cap"]
var basedir = "res://scenes/clothes/"
var material = preload("res://scenes/clothes/nun-clothes.material")
#var tween: Tween
#enum {
# IDLE,
# WALKING
# PRAYING,
# PRAYING_STARTLED,
# ACTION
#}
#var state = PRAYING
func _ready():
root = get_parent()
root.add_to_group("nuns")
# tween = Tween.new()
# tween.playback_process_mode = Tween.TWEEN_PROCESS_PHYSICS
# tween.process_priority = 30
# add_child(tween)
# call_deferred("setup_markers")
characters.call_deferred("setup_garments", root, garments, garments_head, material)
#func setup_markers():
# var cmdq = []
# if root.has_meta("cmdqueue"):
# cmdq = root.get_meta("cmdqueue")
# cmdq.push_back(["hide_marker", "head/marker_talk"])
# cmdq.push_back(["hide_marker", "head/marker_hips_action"])
# cmdq.push_back(["register_marker", self, "hips/marker_dagger_sacrifice",
# {
# "method": "dagger_sacrifice"
# }
# ])
# cmdq.push_back(["hide_marker", "hips/marker_dagger_sacrifice"])
# cmdq.push_back(["anim_state", "pray"])
# root.set_meta("cmdqueue", cmdq)
# state = PRAYING
#var state_changed = 0.0
#func set_orientation(v: Transform):
# root.set_meta("orientation", v)
#func set_basis_dir(dir: Vector3):
# var xdir: Vector3 = dir
# xdir.y = 0
# var d0 = xdir.cross(Vector3.UP)
# var d1 = Vector3.UP
# var d2 = xdir
# var basis = Basis(d0, d1, -d2)
# var orientation = root.get_meta("orientation")
# orientation.basis = basis
# root.set_meta("orientation", orientation)
#func _process(delta):
# if !skel:
# skel = root.get_meta("skeleton")
# var space: PhysicsDirectSpaceState = root.getworld().get_direct_space_state()
# var p = get_viewport().get_camera().get_meta("player").global_transform
# var d = p.origin.distance_to(root.global_transform.origin)
# var px = p.origin
# px.y = root.global_transform.origin.y
# var pdir = px - root.global_transform.origin
# var fdir = -root.global_transform.basis[2]
# fdir.y = 0
# pdir.y = 0
# pdir = pdir.normalized()
# fdir = fdir.normalized()
# var cmdq = []
# if root.has_meta("cmdqueue"):
# cmdq = root.get_meta("cmdqueue")
# state_changed -= delta
# state_changed = clamp(state_changed, 0.0, 10.0)
# match state:
# PRAYING:
# if root.has_meta("req_state") && root.get_meta("req_state") in ["TALK", "ACTION"]:
# state = ACTION
# cmdq.push_back(["anim_state", "locomotion"])
# root.set_meta("cmdqueue", cmdq)
# elif d < 2.0 && state_changed <= 0.0:
# if pdir.angle_to(fdir) > PI / 8.0:
# tween.interpolate_method(self, "set_basis_dir", fdir, pdir, 0.3 + randf() * 0.6, Tween.TRANS_CUBIC)
# tween.start()
# state_changed = 0.5
# else:
# cmdq.push_back(["anim_state", "pray-startled"])
## cmdq.push_back(["anim_state", "locomotion"])
## cmdq.push_back(["anim_param", "state/locomotion/loc/blend_position", Vector2(0.5, 0)])
# root.set_meta("cmdqueue", cmdq)
# state = PRAYING_STARTLED
# state_changed = 3.0
# PRAYING_STARTLED:
# if root.get_meta("req_state") in ["TALK", "ACTION"]:
# state = ACTION
# cmdq.push_back(["anim_state", "locomotion"])
# root.set_meta("cmdqueue", cmdq)
# elif d > 4.0 && state_changed <= 0.0:
# cmdq.push_back(["anim_state", "pray"])
# root.set_meta("cmdqueue", cmdq)
# state = PRAYING
# state_changed = 4.0
# else:
# var f = root.global_transform.origin + Vector3.UP * 0.5
# var t = f + root.global_transform.basis[2] * 0.22
# var result = space.intersect_ray(f, t, [root])
# if result.has("collider"):
# cmdq.push_back(["anim_state", "pray"])
# root.set_meta("cmdqueue", cmdq)
# state = PRAYING
# state_changed = 2.0
# ACTION:
# if !root.has_meta("req_state"):
# state = PRAYING
#
## elif d <= 4.0 || state_changed > 0.0:
## tween.interpolate_method(self, "set_orientation", root.get_meta("orientation"), root.get_meta("orientation").looking_at(px, Vector3(0, 1, 0)), 0.3 + randf() * 0.6, Tween.TRANS_CUBIC)
## tween.start()
## var sacrifice_marker = skel.get_node("hips/marker_dagger_sacrifice")
## if sacrifice_marker.visible && !inventory.items.s_dagger:
## sacrifice_marker.hide()
## elif !sacrifice_marker.visible && inventory.items.s_dagger:
## sacrifice_marker.show()
#
##func dagger_sacrifice(data):
## print("dagger sacrifice")
## var cmdq = []
## var other = group_manager.player
## if other.has_meta("cmdqueue"):
## cmdq = other.get_meta("cmdqueue")
## cmdq.push_back(["anim_param", "blade_right/blend_amount", 1.0])
## 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)

View File

@@ -0,0 +1,53 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var root
var skel
var garments = ["female-panties1", "female-bra1"]
var basedir = "res://scenes/clothes/"
var material = preload("res://scenes/clothes/cloth.material")
func _ready():
root = get_parent()
root.add_to_group("sacrifice")
call_deferred("setup_markers")
characters.call_deferred("setup_garments", root, garments, [], material)
func setup_markers():
var cmdq = []
if root.has_meta("cmdqueue"):
cmdq = root.get_meta("cmdqueue")
cmdq.push_back(["hide_marker", "head/marker_talk"])
cmdq.push_back(["hide_marker", "head/marker_hips_action"])
# cmdq.push_back(["register_marker", self, "hips/marker_dagger_sacrifice",
# {
# "method": "dagger_sacrifice"
# }
# ])
# cmdq.push_back(["hide_marker", "hips/marker_dagger_sacrifice"])
cmdq.push_back(["anim_state", "sacrifice"])
root.set_meta("cmdqueue", cmdq)
func _process(delta):
if !skel:
skel = root.get_meta("skeleton")
# var sacrifice_marker = skel.get_node("hips/marker_dagger_sacrifice")
# if sacrifice_marker.visible && !inventory.items.s_dagger:
# sacrifice_marker.hide()
# elif !sacrifice_marker.visible && inventory.items.s_dagger:
# sacrifice_marker.show()
#func dagger_sacrifice(data):
# print("dagger sacrifice")
# var cmdq = []
# var other = get_viewport().get_camera().get_meta("player")
# if other.has_meta("cmdqueue"):
# cmdq = other.get_meta("cmdqueue")
# cmdq.push_back(["anim_param", "blade_right/blend_amount", 1.0])
# 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)

View File

@@ -0,0 +1,145 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var root
var skel
var hair_skel
var 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", "female-skirt1"]
var garments_male_main = ["male-pants1", "male-shirt1", "male-shoes1"]
var basedir = "res://scenes/clothes/"
var material_female = preload("res://scenes/clothes/nun-clothes.material")
var material_male = preload("res://scenes/clothes/clothes-male.material")
#var tween: Tween
#enum {
# IDLE,
# WALKING,
# SLEEPING
#}
#var state = SLEEPING
func _ready():
name = "student_ai"
root = get_parent()
root.add_to_group("students")
root.add_to_group("student")
# tween = Tween.new()
# tween.playback_process_mode = Tween.TWEEN_PROCESS_PHYSICS
# tween.process_priority = 30
# add_child(tween)
# call_deferred("setup_markers")
var character_data = root.get_meta("character_data")
if character_data.sex == "female":
var g = garments_female_lingerie
var h = []
g += garments_female_main
h += garments_head_female
characters.call_deferred("setup_garments", root, g, h, material_female)
else:
var g = garments_male_lingerie
var h = []
g += garments_male_main
h += garments_head_male
characters.call_deferred("setup_garments", root, g, h, material_male)
#func setup_markers():
# var cmdq = []
# if root.has_meta("cmdqueue"):
# cmdq = root.get_meta("cmdqueue")
# if root.has_meta("saved_anim_state"):
# var st = root.get_meta("saved_anim_state")
# cmdq.push_back(["anim_state", st])
# root.set_meta("cmdqueue", cmdq)
# root.remove_meta("saved_anim_state")
# if st == "sleeping":
# state = SLEEPING
# else:
# state = IDLE
# elif scenario.period > scenario.EARLY_MORNING:
# cmdq.push_back(["anim_state", "locomotion"])
# root.set_meta("cmdqueue", cmdq)
# else:
# cmdq.push_back(["anim_state", "sleeping"])
# root.set_meta("cmdqueue", cmdq)
# state = SLEEPING
#var state_changed = 0.0
#func set_basis_dir(dir: Vector3):
# var xdir: Vector3 = dir
# xdir.y = 0
# var d0 = xdir.cross(Vector3.UP)
# var d1 = Vector3.UP
# var d2 = xdir
# var basis = Basis(d0, d1, -d2)
# var orientation = root.get_meta("orientation")
# orientation.basis = basis
# root.set_meta("orientation", orientation)
#func _process(delta):
# if !skel:
# skel = root.get_meta("skeleton")
# var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
# var p = get_viewport().get_camera().get_meta("player").global_transform
# var d = p.origin.distance_to(root.global_transform.origin)
# var px = p.origin
# px.y = root.global_transform.origin.y
# var pdir = px - root.global_transform.origin
# var fdir = -root.global_transform.basis[2]
# fdir.y = 0
# pdir.y = 0
# pdir = pdir.normalized()
# fdir = fdir.normalized()
# var cmdq = []
# if root.has_meta("cmdqueue"):
# cmdq = root.get_meta("cmdqueue")
# state_changed -= delta
# state_changed = clamp(state_changed, 0.0, 10.0)
# match state:
# SLEEPING:
# if scenario.period > scenario.EARLY_MORNING:
# state = WALKING
# cmdq.push_back(["anim_state", "locomotion"])
# else:
# cmdq.push_back(["anim_state", "sleeping"])
# root.set_meta("cmdqueue", cmdq)
# WALKING:
# pass
# IDLE:
# pass
## cmdq.push_back(["anim_state", "locomotion"])
## root.set_meta("cmdqueue", cmdq)
#func switch_state(root, st):
# print("seitch state: ", state, " ", st)
# var cmdq = []
# if state == st:
# return
# if root.has_meta("cmdqueue"):
# cmdq = root.get_meta("cmdqueue")
# match state:
# IDLE:
# pass
# SLEEPING:
# pass
# WALKING:
# pass
# match st:
# IDLE:
# cmdq.push_back(["anim_state", "locomotion"])
# SLEEPING:
# cmdq.push_back(["anim_state", "sleeping"])
# WALKING:
# cmdq.push_back(["anim_state", "locomotion"])
# root.set_meta("cmdqueue", cmdq)
# state = st
#func command(cmd):
# print(name, " command: ", cmd)
# match cmd[0]:
# "wakeup":
# switch_state(get_parent(), WALKING)

View File

@@ -0,0 +1,81 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var root
var skel
var hair_skel
var garments = ["male-panties1", "male-shirt1"]
var garments_head = []
var basedir = "res://scenes/clothes/"
var material = preload("res://scenes/clothes/clothes-male.material")
func _ready():
root = get_parent()
call_deferred("setup_markers")
call_deferred("setup_garments")
func setup_markers():
var cmdq = []
if root.has_meta("cmdqueue"):
cmdq = root.get_meta("cmdqueue")
# cmdq.push_back(["hide_marker", "head/marker_talk"])
# cmdq.push_back(["hide_marker", "head/marker_hips_action"])
# cmdq.push_back(["register_marker", self, "hips/marker_dagger_sacrifice",
# {
# "method": "dagger_sacrifice"
# }
# ])
# cmdq.push_back(["hide_marker", "hips/marker_dagger_sacrifice"])
cmdq.push_back(["anim_state", "locomotion"])
root.set_meta("cmdqueue", cmdq)
func setup_garments():
skel = root.get_meta("skeleton")
hair_skel = root.get_meta("hair_skeleton")
print("garments for player")
for g in garments:
var m: MeshInstance = MeshInstance.new()
m.name = g
var geo: ArrayMesh = load(basedir + g + ".mesh")
print(g, " mesh: ", geo, "mat: ", material)
geo.surface_set_material(0, material)
m.mesh = geo
# m.skeleton = m.get_path_to(root.get_meta("skeleton"))
# = root.get_meta("skeleton")
skel.add_child(m)
m.transform = Transform()
for g in garments_head:
var m: MeshInstance = MeshInstance.new()
m.name = g
var geo: ArrayMesh = load(basedir + g + ".mesh")
print("mesh: ", geo, "mat: ", material)
geo.surface_set_material(0, material)
m.mesh = geo
# m.skeleton = m.get_path_to(root.get_meta("skeleton"))
# = root.get_meta("skeleton")
hair_skel.add_child(m)
m.transform = Transform()
#func _process(delta):
# if !skel:
# skel = root.get_meta("skeleton")
# var sacrifice_marker = skel.get_node("hips/marker_dagger_sacrifice")
# if sacrifice_marker.visible && !inventory.items.s_dagger:
# sacrifice_marker.hide()
# elif !sacrifice_marker.visible && inventory.items.s_dagger:
# sacrifice_marker.show()
#func dagger_sacrifice(data):
# print("dagger sacrifice")
# var cmdq = []
# var other = group_manager.player
# if other.has_meta("cmdqueue"):
# cmdq = other.get_meta("cmdqueue")
# cmdq.push_back(["anim_param", "blade_right/blend_amount", 1.0])
# 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)

View File

@@ -0,0 +1,108 @@
extends Node
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var cam
var fps_cam
var motion = Vector2()
func _ready():
var root = get_parent()
process_priority = 200
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
func _physics_process(delta):
var orientation: Transform
var root = get_parent()
if !root.has_meta("cam"):
return
cam = root.get_meta("cam")
assert(cam)
fps_cam = root.get_meta("fps_cam")
assert(fps_cam)
var animtree = root.get_meta("animation_tree")
if !animtree:
return
if root.has_meta("orientation"):
orientation = root.get_meta("orientation")
if !orientation:
return
var running = false
assert(cam)
assert(fps_cam)
var motion_target = Vector2(Input.get_action_strength("walk_right") - Input.get_action_strength("walk_left"),
Input.get_action_strength("walk_front") - Input.get_action_strength("walk_back"))
motion = motion.linear_interpolate(motion_target, 10.0 * delta)
var xmotion = motion
xmotion.x = clamp(xmotion.x, -0.4, 0.4)
# if root.has_meta("group_behavior"):
# if motion_target.y < 0:
# behavior.destroy_group_behavior(root.get_meta("group_behavior"))
if !root.has_meta("vehicle") && !root.has_meta("cmdqueue") && !root.has_meta("group_behavior"):
if Input.is_action_just_pressed("activate"):
markers.activate_marker()
if Input.is_action_pressed("run"):
running = true
var cam_z = Vector3()
var cam_x = Vector3()
if cam.current:
cam_z = cam.global_transform.basis.z
cam_x = cam.global_transform.basis.x
cam_z.y = 0
cam_z = cam_z.normalized()
cam_x.y = 0
cam_x = cam_x.normalized()
var target = cam_x * motion.x - cam_z * motion.y
if target.length() > 0.001 && cam.current:
var q_from = Quat(orientation.basis)
var q_to = Quat(Transform().looking_at(target, Vector3.UP).basis)
orientation.basis = Basis(q_from.slerp(q_to, delta * 10.0))
root.set_meta("orientation", orientation)
var fwd_probe = characters.forward_probe(root, 0.5, 0.05, 1.0, 0.1)
if fwd_probe > 0.1 && fwd_probe < 0.7:
var cmdq = []
if root.has_meta("cmdqueue"):
cmdq = root.get_meta("cmdqueue")
cmdq.push_back(["climb", "1"])
root.set_meta("cmdqueue", cmdq)
animtree["parameters/state/playback"].travel("locomotion")
var strafing = 0
var linear = 0
if fps_cam.current:
strafing = motion.x
linear = motion.y
else:
strafing = 0
linear = motion.length()
if running:
animtree["parameters/state/locomotion/loc/blend_position"] = Vector2(linear * 3.0, strafing * 2.0)
else:
animtree["parameters/state/locomotion/loc/blend_position"] = Vector2(linear * 0.5, strafing)
elif root.has_meta("vehicle"):
if Input.is_action_just_pressed("activate"):
markers.activate_marker()
var vehicle: VehicleBody = root.get_meta("vehicle")
var driver = vehicle.get_meta("driver")
if driver == root:
if vehicle.parked:
vehicle.parked = false
vehicle.mode = vehicle.MODE_RIGID
if abs(xmotion.y) < 0.001:
vehicle.brake = 1000
vehicle.steering = -xmotion.x * 0.7
else:
vehicle.brake = 0
vehicle.engine_force = 4000 * xmotion.y
var accel = vehicle.angular_velocity * 350.0 * delta
vehicle.steering = -xmotion.x * 0.7

110
world.gd Normal file
View File

@@ -0,0 +1,110 @@
extends Spatial
export var camera_path: NodePath
export var camera_pos_path: NodePath
export var camera_rot_y_path: NodePath
export var camera_rot_x_path: NodePath
export var camera_offset_path: NodePath
export var camera_arm_path: NodePath
export var fps_camera_scene: PackedScene
export var fps_camera_rot_y_node: String = "fps_cam_rot_y"
export var fps_camera_rot_x_node: String = "fps_cam_rot_x"
export var fps_camera_node: String = "fps_camera"
var door_sc = preload("res://scenes/door_control.tscn")
# 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():
$waiting.show()
characters.set_navmesh(null, Transform())
var start_delay0 = 8.0
var start_delay1 = 2.0
var start_delay2 = 2.0
var start_delay3 = 2.0
var state = 0
var viewer
func _process(delta):
match state:
0:
state = 1
1:
start_delay1 -= delta
if start_delay1 < 0:
var player
var cam: Camera
var fps_cam: Camera
var cam_pos
var cam_rot_y
var cam_rot_x
var cam_offset
var cam_arm
var fps_cam_rot_y
var fps_cam_rot_x
var default_offset
if has_node("Roads") && get_node("Roads") is Roads:
for site in range(RoadsData.get_site_count()):
if site == 0:
streaming.setup_first_town()
var v = RoadsData.get_site_pos(0)
var sdf = RoadsData.get_sdf(v.x, 300, v.y)
var d = 300 - sdf
$player.global_transform.origin.x = v.x
$player.global_transform.origin.y = d + 12
$player.global_transform.origin.z = v.y
else:
streaming.setup_town(site)
if streaming.towns > 30:
break
print("towns done: ", streaming.towns)
player = characters.replace_character($player, "male", ["player", "cmdq", "player_clothes"])
player.add_child(VoxelViewer.new())
player.set_script(load("res://characters/character.gd"))
var fps_cam_pos = fps_camera_scene.instance()
player.add_child(fps_cam_pos)
fps_cam = fps_cam_pos.find_node(fps_camera_node, true, false)
cam = get_node(camera_path)
cam.current = true
cam_pos = get_node(camera_pos_path)
cam_rot_y = get_node(camera_rot_y_path)
cam_rot_x = get_node(camera_rot_x_path)
cam_offset = get_node(camera_offset_path)
cam_arm = get_node(camera_arm_path)
fps_cam_rot_y = fps_cam_pos.find_node(fps_camera_rot_y_node, true, false)
fps_cam_rot_x = fps_cam_pos.find_node(fps_camera_rot_x_node, true, false)
default_offset = cam_offset.translation
cam.set_meta("cam_pos", cam_pos)
cam.set_meta("cam_rot_y", cam_rot_y)
cam.set_meta("cam_rot_x", cam_rot_x)
cam.set_meta("cam_offset", cam_offset)
cam.set_meta("cam_arm", cam_arm)
cam.set_meta("default_offset", default_offset)
fps_cam.set_meta("fps_cam_rot_y", fps_cam_rot_y)
fps_cam.set_meta("fps_cam_rot_x", fps_cam_rot_x)
cam_arm.add_excluded_object(player.get_rid())
cam.set_meta("player", player)
fps_cam.set_meta("player", player)
player.set_meta("cam", cam)
player.set_meta("fps_cam", fps_cam)
print(player)
controls.switch_fps_mode(false)
state = 2
2:
start_delay2 -= delta
if start_delay2 < 0:
state = 3
3:
start_delay2 -= delta
if start_delay2 < 0:
$waiting.hide()
state = 4
4:
RoadsData.save_json("user://world-gen.json")
state = 5

103
world.tscn Normal file
View File

@@ -0,0 +1,103 @@
[gd_scene load_steps=13 format=2]
[ext_resource path="res://world.gd" type="Script" id=1]
[ext_resource path="res://terrain.gdshader" type="Shader" id=2]
[ext_resource path="res://road/road_elements.gltf" type="PackedScene" id=3]
[ext_resource path="res://camera/camera_pos.tscn" type="PackedScene" id=4]
[ext_resource path="res://scenes/waiting.gd" type="Script" id=5]
[ext_resource path="res://camera/fps_cam_pos.tscn" type="PackedScene" id=6]
[sub_resource type="WorldGenerator" id=7]
iso_scale = 0.01
[sub_resource type="VoxelMesherTransvoxel" id=4]
[sub_resource type="ShaderMaterial" id=6]
shader = ExtResource( 2 )
shader_param/u_transition_mask = null
[sub_resource type="Curve" id=1]
min_value = -300.0
max_value = 300.0
bake_resolution = 200
_data = [ Vector2( 0, -259.615 ), 0.0, 0.0, 0, 0, Vector2( 0.291262, -300 ), 0.0, 0.0, 0, 0, Vector2( 0.339806, -63.4615 ), 0.0, 0.0, 0, 0, Vector2( 0.466019, 0 ), 0.0, 0.0, 0, 0, Vector2( 0.466019, 11.5385 ), 0.0, 0.0, 0, 0, Vector2( 0.723301, 75 ), 311.264, 311.264, 0, 0, Vector2( 0.902913, 184.615 ), 976.237, 976.237, 0, 0, Vector2( 0.975728, 300 ), 0.0, 0.0, 0, 0 ]
[sub_resource type="FastNoiseLite" id=8]
seed = 36800
period = 256.0
[sub_resource type="DetourNavigationMesh" id=9]
cell_size = 0.15
cell_height = 0.15
agent_height = 1.5
agent_radius = 0.15
agent_max_climb = 0.6
region_min_size = 0.5
region_merge_size = 10.0
edge_max_length = 0.4
edge_max_error = 0.2
detail_sample_max_error = 0.5
group = "navigation"
partition_type = -1082130432
data = {
}
[node name="world" type="Spatial"]
script = ExtResource( 1 )
camera_path = NodePath("camera_pos/rot_y/rot_x/SpringArm/camera_offset/Camera")
camera_pos_path = NodePath("camera_pos")
camera_rot_y_path = NodePath("camera_pos/rot_y")
camera_rot_x_path = NodePath("camera_pos/rot_y/rot_x")
camera_offset_path = NodePath("camera_pos/rot_y/rot_x/SpringArm/camera_offset")
camera_arm_path = NodePath("camera_pos/rot_y/rot_x/SpringArm")
fps_camera_scene = ExtResource( 6 )
[node name="VoxelLodTerrain" type="VoxelLodTerrain" parent="." groups=["navigation"]]
generator = SubResource( 7 )
mesher = SubResource( 4 )
lod_count = 5
lod_distance = 64.0
lod_fade_duration = 1.0
material = SubResource( 6 )
run_stream_in_editor = false
[node name="DirectionalLight" type="DirectionalLight" parent="."]
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 100, 0 )
[node name="Camera" type="Camera" parent="."]
transform = Transform( 0.819152, 0.40558, -0.40558, 0, 0.707107, 0.707107, 0.573577, -0.579228, 0.579228, 0, 150, 0 )
far = 600.0
[node name="Roads" type="Roads" parent="."]
road_data = ExtResource( 3 )
curve = SubResource( 1 )
noise = SubResource( 8 )
[node name="camera_pos" parent="." instance=ExtResource( 4 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 150, 0 )
[node name="waiting" type="ColorRect" parent="."]
visible = false
anchor_right = 1.0
anchor_bottom = 1.0
color = Color( 0, 0, 0, 1 )
script = ExtResource( 5 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="player" type="Spatial" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 150, 0 )
[node name="DetourNavigation" type="DetourNavigation" parent="."]
[node name="DetourNavigationMeshInstance" type="DetourNavigationMeshInstance" parent="."]
navmesh = SubResource( 9 )
[node name="DetourCrowdManager" type="DetourCrowdManager" parent="."]
[node name="nav_pos" type="Spatial" parent="." groups=["navigation"]]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4e+07, 0, -4e+07 )
[node name="nav_pos2" type="Spatial" parent="." groups=["navigation"]]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 4e+07, 0, 4e+07 )