This commit is contained in:
Segey Lapin
2021-12-24 23:56:10 +03:00
parent d401cf1090
commit f62e7fa720
113 changed files with 198252 additions and 412103 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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:

View File

@@ -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",

View File

@@ -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")

View File

@@ -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
View 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)

View 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 )

View File

@@ -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

View File

@@ -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