Update
This commit is contained in:
@@ -1,16 +1,5 @@
|
||||
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")
|
||||
@@ -20,10 +9,12 @@ onready var modules = {
|
||||
"marker": preload("res://scripts/modules/npc_marker.gd"),
|
||||
"sacrifice": preload("res://scripts/modules/npc_sacrifice.gd"),
|
||||
"nun": preload("res://scripts/modules/npc_nun.gd"),
|
||||
"mystress": preload("res://scripts/modules/npc_mystress.gd"),
|
||||
"player": preload("res://scripts/modules/player_controls.gd"),
|
||||
"player_clothes": preload("res://scripts/modules/player_clothes.gd"),
|
||||
"hurtboxes": preload("res://scripts/modules/character_hurtboxes.gd"),
|
||||
"student": preload("res://scripts/modules/npc_student.gd")
|
||||
"student": preload("res://scripts/modules/npc_student.gd"),
|
||||
"bandit": preload("res://scripts/modules/npc_bandit.gd")
|
||||
}
|
||||
|
||||
var face_data_path = "res://scenes/face/"
|
||||
@@ -47,6 +38,21 @@ var roommates = {}
|
||||
#var _crowd: DetourCrowdManager
|
||||
|
||||
func _ready():
|
||||
var capsule_male = CapsuleShape.new()
|
||||
capsule_male.radius = 0.3
|
||||
capsule_male.height = 1.2
|
||||
capsule_male.margin = 0.05
|
||||
var capsule_female = CapsuleShape.new()
|
||||
capsule_female.radius = 0.2
|
||||
capsule_female.height = 1.1
|
||||
capsule_female.margin = 0.05
|
||||
CharacterSystemWorld.add_character_scene(female, {}, "female")
|
||||
CharacterSystemWorld.add_character_scene(male, {}, "male")
|
||||
for k in modules.keys():
|
||||
CharacterSystemWorld.add_module(k, modules[k])
|
||||
CharacterSystemWorld.set_face_ctrl_scene(face_ctrl)
|
||||
CharacterSystemWorld.add_character_shape(capsule_female, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.751, 0)), "female")
|
||||
CharacterSystemWorld.add_character_shape(capsule_male, Transform(Basis().rotated(Vector3(1, 0, 0), -PI/2.0), Vector3(0, 0.899, 0)), "male")
|
||||
set_root_motion_mod(Transform())
|
||||
var fd = File.new()
|
||||
fd.open("res://data/names.json", File.READ)
|
||||
@@ -62,10 +68,12 @@ func _ready():
|
||||
"female":
|
||||
female_faces.push_back(fp)
|
||||
mesh_female_faces[fp] = load(fp)
|
||||
CharacterSystemWorld.add_face_scene(mesh_female_faces[fp], "female")
|
||||
|
||||
"male":
|
||||
male_faces.push_back(fp)
|
||||
mesh_male_faces[fp] = load(fp)
|
||||
CharacterSystemWorld.add_face_scene(mesh_male_faces[fp], "male")
|
||||
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"
|
||||
@@ -75,18 +83,24 @@ func _ready():
|
||||
if data_fd.file_exists(fp_m):
|
||||
male_faces.push_back(fp_m)
|
||||
mesh_male_faces[fp_m] = load(fp_m)
|
||||
CharacterSystemWorld.add_face_scene(mesh_male_faces[fp_m], "male")
|
||||
if data_fd.file_exists(fp_f):
|
||||
female_faces.push_back(fp_f)
|
||||
mesh_female_faces[fp_f] = load(fp_f)
|
||||
CharacterSystemWorld.add_face_scene(mesh_female_faces[fp_f], "female")
|
||||
if data_fd.file_exists(hp_m):
|
||||
male_hairs.push_back(hp_m)
|
||||
mesh_male_hairs[hp_m] = load(hp_m)
|
||||
CharacterSystemWorld.add_hair_scene(mesh_male_hairs[hp_m], "male")
|
||||
if data_fd.file_exists(hp_f):
|
||||
female_hairs.push_back(hp_f)
|
||||
mesh_female_hairs[hp_f] = load(hp_f)
|
||||
CharacterSystemWorld.add_hair_scene(mesh_female_hairs[hp_f], "female")
|
||||
if data_fd.file_exists(mat):
|
||||
hair_materials.push_back(mat)
|
||||
data_hair_materials[mat] = load(mat)
|
||||
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "male")
|
||||
CharacterSystemWorld.add_hair_material(data_hair_materials[mat], "female")
|
||||
assert(male_faces.size() > 0)
|
||||
assert(female_faces.size() > 0)
|
||||
assert(male_hairs.size() > 0)
|
||||
@@ -146,6 +160,7 @@ func get_hair_node(sc: Node) -> Node:
|
||||
assert(0)
|
||||
return null
|
||||
func compose_kinematic_character(g, enable_modules = [], face = -1, hair = -1, hair_mat = -1):
|
||||
return CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
|
||||
var body = KinematicBody.new()
|
||||
var cshape = CollisionShape.new()
|
||||
body.add_child(cshape)
|
||||
@@ -245,7 +260,8 @@ func replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_m
|
||||
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)
|
||||
# var body = compose_kinematic_character(g, enable_modules, face, hair, hair_mat)
|
||||
var body = CharacterSystemWorld.create_character(g, enable_modules, face, hair, hair_mat)
|
||||
p.add_child(body)
|
||||
body.global_transform = xform
|
||||
var orientation = Transform()
|
||||
@@ -253,15 +269,15 @@ func replace_character(obj, g, enable_modules = [], face = -1, hair = -1, hair_m
|
||||
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 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]
|
||||
@@ -274,7 +290,9 @@ func set_hair_material(hair, mat: Material):
|
||||
queue.push_back(g)
|
||||
func setup_garments(obj, garments, garments_head, material):
|
||||
var skel = obj.get_meta("skeleton")
|
||||
assert(skel)
|
||||
var hair_skel = obj.get_meta("hair_skeleton")
|
||||
assert(hair_skel)
|
||||
|
||||
if obj.has_meta("garments"):
|
||||
print("Can remove garments")
|
||||
@@ -611,7 +629,5 @@ func _physics_process(delta):
|
||||
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)
|
||||
if streaming.can_spawn:
|
||||
character_physics(player)
|
||||
|
||||
@@ -20,9 +20,9 @@ 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)
|
||||
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
|
||||
|
||||
@@ -97,6 +97,7 @@ func freeze_all() -> bool:
|
||||
assert(ok)
|
||||
return ok
|
||||
func _process(delta):
|
||||
return
|
||||
var cam = get_viewport().get_camera()
|
||||
var player = get_player()
|
||||
if !player:
|
||||
|
||||
@@ -29,6 +29,7 @@ func equip(obj, item_name):
|
||||
return
|
||||
print("EQUIP ", item_name)
|
||||
assert(obj)
|
||||
assert(obj.has_meta("owner"))
|
||||
assert(item_scenes.has(item_name))
|
||||
var r = item_scenes[item_name].instance()
|
||||
var c = item_collision_scenes[item_name].instance()
|
||||
@@ -38,6 +39,7 @@ func equip(obj, item_name):
|
||||
c.transform = Transform()
|
||||
print("EQUIP ", item_name, " OK", obj, r)
|
||||
obj.set_meta("equipped", item_name)
|
||||
c.set_meta("owner", obj.get_meta("owner"))
|
||||
func register_pick_up(m, obj, item_name):
|
||||
var mdata = {
|
||||
"method": "pick_up",
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
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")
|
||||
@@ -1,16 +0,0 @@
|
||||
[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 )
|
||||
196
autoload/orchestration.gd
Normal file
196
autoload/orchestration.gd
Normal file
@@ -0,0 +1,196 @@
|
||||
extends Node
|
||||
export var grab_ik_curve: Curve
|
||||
export var grab_ik_curve_multiplier: float = 0.14
|
||||
export var cinematic_cam: PackedScene
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var cinematic_camera
|
||||
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
var active_states = []
|
||||
var locked_actors = {}
|
||||
|
||||
class Grabbing:
|
||||
signal enable_cinematic_camera(where, look)
|
||||
signal update_cinematic_camera(where, look)
|
||||
signal disable_cinematic_camera
|
||||
signal end_stage
|
||||
var actor_master: KinematicBody
|
||||
var actor_slave: KinematicBody
|
||||
var slave_space: RID
|
||||
var master_space: RID
|
||||
var finished = false
|
||||
var follow_node
|
||||
var follow_node_full
|
||||
var state = 0
|
||||
var ik: SkeletonIK
|
||||
var ik_curve_pos = 0.0
|
||||
var grab_ik_curve: Curve
|
||||
var curve_delta_mul: float = 0.16
|
||||
func start(act_master: KinematicBody, act_slave: KinematicBody, curve: Curve, delta_mul: float):
|
||||
actor_master = act_master
|
||||
actor_slave = act_slave
|
||||
grab_ik_curve = curve
|
||||
curve_delta_mul = delta_mul
|
||||
var skel_master = actor_master.get_meta("skeleton")
|
||||
assert(skel_master is Skeleton)
|
||||
ik = SkeletonIK.new()
|
||||
ik.root_bone = "J_Bip_R_UpperArm"
|
||||
ik.tip_bone = "J_Bip_R_Hand"
|
||||
skel_master.add_child(ik)
|
||||
|
||||
# actor_master.set_meta("orchestrated", true)
|
||||
# actor_slave.set_meta("orchestrated", true)
|
||||
# characters.animation_node_travel(actor_master, "grab")
|
||||
# characters.animation_node_travel(actor_slave, "grabbed")
|
||||
reset_character(actor_master)
|
||||
reset_character(actor_slave)
|
||||
var mx = actor_master.global_transform
|
||||
var sx = actor_slave.global_transform
|
||||
var m = mx.interpolate_with(sx, 0.5)
|
||||
var cam_where = m.origin + actor_master.global_transform.basis[0] * 1.1
|
||||
cam_where += Vector3.UP * 2.0
|
||||
var cam_to = m.origin + Vector3.UP * 1.4
|
||||
emit_signal("enable_cinematic_camera", cam_where, cam_to)
|
||||
func reset_character(b):
|
||||
b.remove_meta("cmdqueue")
|
||||
b.remove_meta("cmdq_walk")
|
||||
b.remove_meta("climb")
|
||||
characters.animation_node_travel(b, "locomotion")
|
||||
characters.set_walk_speed(b, 0.0, 0)
|
||||
|
||||
func update(delta):
|
||||
var mx = actor_master.global_transform
|
||||
var sx = actor_slave.global_transform
|
||||
var m = mx.interpolate_with(sx, 0.5)
|
||||
var cam_where = m.origin + actor_master.global_transform.basis[0] * 1.1
|
||||
cam_where += Vector3.UP * 2.0
|
||||
var cam_to = m.origin + Vector3.UP * 1.4
|
||||
emit_signal("update_cinematic_camera", cam_where, cam_to)
|
||||
func physics_update(delta):
|
||||
var offt = actor_slave.global_transform.origin - actor_slave.global_transform.basis[2] * 0.45
|
||||
match state:
|
||||
0:
|
||||
reset_character(actor_master)
|
||||
reset_character(actor_slave)
|
||||
actor_master.set_meta("orchestrated", true)
|
||||
actor_slave.set_meta("orchestrated", true)
|
||||
actor_master.add_collision_exception_with(actor_slave)
|
||||
actor_slave.add_collision_exception_with(actor_master)
|
||||
slave_space = PhysicsServer.body_get_space(actor_slave.get_rid())
|
||||
PhysicsServer.body_set_space(actor_slave.get_rid(), RID())
|
||||
master_space = PhysicsServer.body_get_space(actor_master.get_rid())
|
||||
PhysicsServer.body_set_space(actor_master.get_rid(), RID())
|
||||
state = 1
|
||||
1:
|
||||
# actor_slave.get_parent().remove_child(actor_slave)
|
||||
# actor_master.add_child(actor_slave)
|
||||
var skel_master = actor_master.get_meta("skeleton")
|
||||
assert(skel_master is Skeleton)
|
||||
var skel_slave = actor_slave.get_meta("skeleton")
|
||||
assert(skel_slave is Skeleton)
|
||||
follow_node_full = skel_slave.get_node("neck/marker_neck_grab")
|
||||
follow_node = Position3D.new()
|
||||
skel_master.add_child(follow_node)
|
||||
follow_node.global_transform = follow_node_full.global_transform
|
||||
ik.target_node = ik.get_path_to(follow_node)
|
||||
ik.override_tip_basis = true
|
||||
ik.interpolation = 0.0
|
||||
ik_curve_pos = 0.0
|
||||
|
||||
actor_master.global_transform = Transform(actor_slave.global_transform.basis.rotated(Vector3.UP, PI), offt)
|
||||
var master_xform = actor_master.global_transform.looking_at(actor_slave.global_transform.origin, Vector3.UP)
|
||||
var slave_xform = actor_slave.global_transform.looking_at(actor_master.global_transform.origin, Vector3.UP)
|
||||
var orientation = Transform(actor_slave.global_transform.basis, Vector3())
|
||||
actor_slave.set_meta("orientation", orientation)
|
||||
var master_orientation = Transform(actor_master.global_transform.basis, Vector3())
|
||||
actor_master.set_meta("orientation", master_orientation)
|
||||
characters.animation_node_travel(actor_master, "grab")
|
||||
characters.animation_node_travel(actor_slave, "grabbed")
|
||||
ik.start(true)
|
||||
state = 3
|
||||
3:
|
||||
ik.interpolation = grab_ik_curve.interpolate_baked(ik_curve_pos)
|
||||
ik_curve_pos += delta * curve_delta_mul
|
||||
follow_node.global_transform = follow_node_full.global_transform
|
||||
ik.start(true)
|
||||
if ik.interpolation >= 1.0:
|
||||
state = 4
|
||||
4:
|
||||
var m_anim: AnimationTree = actor_master.get_meta("animation_tree")
|
||||
var m_state: AnimationNodeStateMachinePlayback = m_anim["parameters/state/playback"]
|
||||
var m_l = m_state.get_current_length()
|
||||
var m_p = m_state.get_current_play_position()
|
||||
var s_anim: AnimationTree = actor_slave.get_meta("animation_tree")
|
||||
var s_state: AnimationNodeStateMachinePlayback = s_anim["parameters/state/playback"]
|
||||
var s_l = m_state.get_current_length()
|
||||
var s_p = m_state.get_current_play_position()
|
||||
if m_p >= m_l && s_p >= s_l:
|
||||
state = 5
|
||||
|
||||
# 2:
|
||||
# actor_slave.global_transform = Transform(actor_master.global_transform.basis.rotated(Vector3.UP, PI), offt)
|
||||
# var orientation = Transform(actor_slave.global_transform.basis, Vector3())
|
||||
# actor_slave.set_meta("orientation", orientation)
|
||||
# state = 3
|
||||
# 3:
|
||||
# actor_slave.global_transform = Transform(actor_master.global_transform.basis.rotated(Vector3.UP, PI), offt)
|
||||
# var orientation = Transform(actor_slave.global_transform.basis, Vector3())
|
||||
# actor_slave.set_meta("orientation", orientation)
|
||||
# state = 4
|
||||
func finish():
|
||||
pass
|
||||
|
||||
func enable_camera(where, to):
|
||||
var current_cam = get_viewport().get_camera()
|
||||
var player = current_cam.get_meta("player")
|
||||
if !cinematic_camera:
|
||||
cinematic_camera = cinematic_cam.instance()
|
||||
var cam: Camera = cinematic_camera.get_node("rot_y/rot_x/SpringArm/camera_offset/Camera")
|
||||
var cam_offset = cinematic_camera.get_node("rot_y/rot_x/SpringArm/camera_offset")
|
||||
cam.set_meta("player", player)
|
||||
cam.set_meta("current_cam", current_cam)
|
||||
cinematic_camera.set_meta("cam", cam)
|
||||
cinematic_camera.set_meta("offset", cam_offset)
|
||||
get_viewport().add_child(cinematic_camera)
|
||||
cinematic_camera.global_transform.origin = where
|
||||
# cam_offset.global_transform.origin = where
|
||||
cam.current = true
|
||||
cam.look_at(to, Vector3.UP)
|
||||
func update_camera(where, to):
|
||||
var cam = cinematic_camera.get_meta("cam")
|
||||
var cam_offset = cinematic_camera.get_meta("offset")
|
||||
cam_offset.global_transform.origin = where
|
||||
cam.look_at(to, Vector3.UP)
|
||||
|
||||
|
||||
func grab(actor_master, actor_slave):
|
||||
var gr = Grabbing.new()
|
||||
gr.connect("enable_cinematic_camera", self, "enable_camera")
|
||||
gr.connect("update_cinematic_camera", self, "update_camera")
|
||||
gr.start(actor_master, actor_slave, grab_ik_curve, grab_ik_curve_multiplier)
|
||||
active_states.push_back(gr)
|
||||
|
||||
func _physics_process(delta):
|
||||
var completed = []
|
||||
for e in active_states:
|
||||
e.physics_update(delta)
|
||||
if e.finished:
|
||||
completed.push_back(e)
|
||||
for d in completed:
|
||||
active_states.erase(d)
|
||||
func _process(delta):
|
||||
var completed = []
|
||||
for e in active_states:
|
||||
e.update(delta)
|
||||
if e.finished:
|
||||
completed.push_back(e)
|
||||
for d in completed:
|
||||
active_states.erase(d)
|
||||
13
autoload/orchestration.tscn
Normal file
13
autoload/orchestration.tscn
Normal file
@@ -0,0 +1,13 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://autoload/orchestration.gd" type="Script" id=1]
|
||||
[ext_resource path="res://camera/cinematic_cam.tscn" type="PackedScene" id=2]
|
||||
|
||||
[sub_resource type="Curve" id=1]
|
||||
_data = [ Vector2( 0, 0 ), 0.0, 0.0, 0, 0, Vector2( 0.675, 0 ), 0.0, 0.0, 0, 0, Vector2( 0.89079, 0.881818 ), 4.07459, 4.07459, 0, 0, Vector2( 0.988158, 1 ), 6.47137e-07, 0.0, 0, 0 ]
|
||||
|
||||
[node name="orchestration" type="Node"]
|
||||
script = ExtResource( 1 )
|
||||
grab_ik_curve = SubResource( 1 )
|
||||
grab_ik_curve_multiplier = 0.25
|
||||
cinematic_cam = ExtResource( 2 )
|
||||
@@ -1,4 +1,5 @@
|
||||
extends Node
|
||||
signal spawn_player(xform)
|
||||
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
@@ -11,7 +12,61 @@ func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
var save_data = {}
|
||||
var camp: Node
|
||||
var camp_site: int = -1
|
||||
var camp_level: int = 0
|
||||
var bandits_count: int = 0
|
||||
var camp_dwellings = {}
|
||||
func prepare_save_data():
|
||||
var cam = get_tree().root.get_camera()
|
||||
var player = cam.get_meta("player")
|
||||
if player:
|
||||
save_data.player_xform = var2str(player.global_transform)
|
||||
save_data.player_stats = player.get_meta("stats")
|
||||
save_data.world = RoadsData.save_data()
|
||||
# save_data.dialogue = Dialogic.export()
|
||||
# save_data.scenery = scenery
|
||||
# state_list.save()
|
||||
# if save_data.dormitory.has("quests"):
|
||||
# print(save_data.dormitory.quests.running)
|
||||
# save_data.prologue = prologue_state.save()
|
||||
save_data.inventory = inventory.items
|
||||
# save_data.dormitory = dormitory_state.save()
|
||||
# save_data.roommates = characters.roommates
|
||||
# save_data.player_room_id = player.get_meta("room_id")
|
||||
# save_data.quests = questman.save()
|
||||
save_data.traffic_state = streaming.traffic_rnd.state
|
||||
var b = freezer.prepare_save_data()
|
||||
while b == false:
|
||||
yield(get_tree(), "idle_frame")
|
||||
b = freezer.prepare_save_data()
|
||||
save_data.camp_level = camp_level
|
||||
save_data.bandits_count = bandits_count
|
||||
save_data.camp_dwellings = var2str(camp_dwellings)
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta):
|
||||
# pass
|
||||
|
||||
func restart_scene():
|
||||
var cam = get_viewport().get_camera()
|
||||
if cam && cam.has_meta("player"):
|
||||
var player = cam.get_meta("player")
|
||||
if player:
|
||||
player.remove_meta("cam")
|
||||
player.remove_meta("fps_cam")
|
||||
player = null
|
||||
get_viewport().get_camera().remove_meta("player")
|
||||
if save_data.has("inventory"):
|
||||
inventory.items = save_data.inventory
|
||||
var new_scene = load("res://world.tscn")
|
||||
streaming.done = false
|
||||
if save_data.has("camp_level"):
|
||||
camp_level = save_data.camp_level
|
||||
if save_data.has("bandits_count"):
|
||||
bandits_count = save_data.bandits_count
|
||||
if save_data.has("camp_dwellings"):
|
||||
camp_dwellings = str2var(save_data.camp_dwellings)
|
||||
get_tree().change_scene_to(new_scene)
|
||||
var player_spawned = false
|
||||
var castle1_captured = false
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
extends Node
|
||||
|
||||
signal character_ready
|
||||
|
||||
export var trailer_house: PackedScene
|
||||
export var palace: PackedScene
|
||||
export var car: PackedScene
|
||||
|
||||
onready var obj_names = {
|
||||
"palace": palace,
|
||||
"trailer_house": trailer_house
|
||||
"trailer_house": trailer_house,
|
||||
}
|
||||
|
||||
var done = false
|
||||
@@ -34,6 +36,9 @@ var gate_top_tile: PackedScene = preload("res://objects/gate-top.scn")
|
||||
var entry_tile: PackedScene = preload("res://objects/block-room-entry.scn")
|
||||
var roof_tile: PackedScene = preload("res://objects/roof.scn")
|
||||
var tower_roof_tile: PackedScene = preload("res://objects/tower-roof.scn")
|
||||
var courtroom: PackedScene = preload("res://objects/courtroom.tscn")
|
||||
var bandit_camp: PackedScene = preload("res://bandit_camp.tscn")
|
||||
var hostile_dwelling: PackedScene = preload("res://hostile_dwelling.tscn")
|
||||
|
||||
onready var palace_map_data = {
|
||||
"courtyard_tile": courtyard_tile,
|
||||
@@ -46,11 +51,12 @@ onready var palace_map_data = {
|
||||
"gate_top_tile": gate_top_tile,
|
||||
"entry_tile": entry_tile,
|
||||
"roof_tile": roof_tile,
|
||||
"tower_roof_tile": tower_roof_tile
|
||||
"tower_roof_tile": tower_roof_tile,
|
||||
"courtroom": courtroom,
|
||||
}
|
||||
|
||||
onready var buildings = {
|
||||
"trailer_house": preload("res://buildings/trailer-house.gd").new()
|
||||
"trailer_house": preload("res://buildings/trailer-house.gd").new(),
|
||||
}
|
||||
|
||||
func spawn_building(bname: String, xform: Transform) -> void:
|
||||
@@ -126,13 +132,13 @@ func setup_town(site):
|
||||
dst -= step
|
||||
towns += 1
|
||||
|
||||
func setup_first_town():
|
||||
func setup_first_town(site):
|
||||
assert(!done)
|
||||
var poly = RoadsData.get_site_polygon_3d(0)
|
||||
var height = RoadsData.get_site_avg_height(0)
|
||||
var border = RoadsData.get_site_border(0, 32)
|
||||
var border1a = RoadsData.get_site_border(0, 42)
|
||||
var border2 = RoadsData.get_site_border(0, 60)
|
||||
var poly = RoadsData.get_site_polygon_3d(site)
|
||||
var height = RoadsData.get_site_avg_height(site)
|
||||
var border = RoadsData.get_site_border(site, 32)
|
||||
var border1a = RoadsData.get_site_border(site, 42)
|
||||
var border2 = RoadsData.get_site_border(site, 60)
|
||||
|
||||
var poly2 = []
|
||||
poly2.resize(border2.size())
|
||||
@@ -146,7 +152,7 @@ func setup_first_town():
|
||||
var infl = RoadsData.get_influence_cached(center.x, center.z, 256)
|
||||
center.y = infl.y
|
||||
print("first town center: ", center)
|
||||
var radial_points = RoadsData.get_site_radial_points(0, 32.0, 64.0)
|
||||
var radial_points = RoadsData.get_site_radial_points(site, 32.0, 64.0)
|
||||
var max_r = 0.0
|
||||
for p in range(radial_points.size()):
|
||||
var ep = radial_points[p]
|
||||
@@ -219,7 +225,8 @@ func setup_traffic(site):
|
||||
var n = (p2 - p1).cross(Vector3.UP).normalized()
|
||||
var t = (p2 - p1).normalized()
|
||||
var l = p1.distance_to(p2)
|
||||
assert(l > 0 && t.length_squared() > 0)
|
||||
assert(l > 0)
|
||||
assert(t.length_squared() > 0)
|
||||
var xpos = p1 + t * 8.0
|
||||
var xe = 128.0
|
||||
if l < xe + 16.0:
|
||||
@@ -244,7 +251,6 @@ func setup_traffic(site):
|
||||
c.add_to_group("traffic_spawn")
|
||||
xpos += t * xe
|
||||
l -= xe
|
||||
|
||||
func _ready():
|
||||
traffic_rnd = RandomNumberGenerator.new()
|
||||
traffic_rnd.randomize()
|
||||
@@ -277,6 +283,7 @@ func _ready():
|
||||
Traffic.add_traffic_vehicle(car)
|
||||
var water_mat = load("res://water/Water.material")
|
||||
Water.set_material(water_mat)
|
||||
connect("character_ready", self, "char_ready")
|
||||
|
||||
var delay = 3.0
|
||||
var state = 0
|
||||
@@ -301,6 +308,9 @@ func _process(delta):
|
||||
|
||||
func stream_obj(obj: String, xform: Transform):
|
||||
Spawner.place_scene(obj, xform)
|
||||
var can_spawn = false
|
||||
func char_ready():
|
||||
can_spawn = true
|
||||
func _physics_process(delta):
|
||||
var cam = get_viewport().get_camera()
|
||||
if !cam:
|
||||
@@ -309,35 +319,48 @@ func _physics_process(delta):
|
||||
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 p1 = cam.global_transform.origin
|
||||
var p2 = n.global_transform.origin
|
||||
if p1.distance_squared_to(p2) < 5000.0:
|
||||
var c = car.instance()
|
||||
c.add_to_group("saved_vehicle")
|
||||
var p = get_tree().root
|
||||
p.add_child(c)
|
||||
c.global_transform = n.global_transform
|
||||
n.queue_free()
|
||||
if can_spawn:
|
||||
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
|
||||
ok = true
|
||||
if ok || n.is_in_group("keep"):
|
||||
var base = ["cmdq", "marker", "hurtboxes"]
|
||||
var g = ""
|
||||
if n.is_in_group("male"):
|
||||
g = "male"
|
||||
elif n.is_in_group("female"):
|
||||
g = "female"
|
||||
if n.is_in_group("mystress"):
|
||||
base.push_back("mystress")
|
||||
if n.is_in_group("student"):
|
||||
base.push_back("student")
|
||||
elif n.is_in_group("bandit"):
|
||||
base.push_back("bandit")
|
||||
if g.length() > 0:
|
||||
print(g, " ", base)
|
||||
characters.replace_character(n, g, base)
|
||||
elif n.is_in_group("car"):
|
||||
var p1 = cam.global_transform.origin
|
||||
var p2 = n.global_transform.origin
|
||||
if p1.distance_squared_to(p2) < 5000.0:
|
||||
var c = car.instance()
|
||||
c.add_to_group("saved_vehicle")
|
||||
var p = get_tree().root
|
||||
p.add_child(c)
|
||||
c.global_transform = n.global_transform
|
||||
n.queue_free()
|
||||
|
||||
# buildings
|
||||
|
||||
@@ -379,3 +402,29 @@ static func get_place_rnd(xform: Transform):
|
||||
rnd.seed = s
|
||||
return rnd
|
||||
|
||||
func setup_bandit_camp(site):
|
||||
var poly = RoadsData.get_site_polygon_3d(site)
|
||||
var height = RoadsData.get_site_avg_height(site)
|
||||
var center = Vector3()
|
||||
for p in poly:
|
||||
center += p
|
||||
center /= poly.size()
|
||||
center.y = height
|
||||
var xform = Transform(Basis(), center)
|
||||
var camp = bandit_camp.instance()
|
||||
get_tree().root.add_child(camp)
|
||||
camp.global_transform = xform
|
||||
return camp
|
||||
func setup_bandit_camp_outskirts(site):
|
||||
var b = RoadsData.get_site_border(site, 96.0)
|
||||
for e in range(min(4, b.size())):
|
||||
if scenario.camp_dwellings.has(e):
|
||||
if scenario.camp_dwellings[e].health <= 0:
|
||||
continue
|
||||
var h_xform = Transform(Basis(), b[e])
|
||||
var dwg = hostile_dwelling.instance()
|
||||
get_tree().root.add_child(dwg)
|
||||
dwg.global_transform = h_xform
|
||||
if !scenario.camp_dwellings.has(e):
|
||||
scenario.camp_dwellings[e] = {}
|
||||
scenario.camp_dwellings[e].health = 100.0
|
||||
|
||||
Reference in New Issue
Block a user