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

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