Files
academy2-game/autoload/freezer.gd
Segey Lapin d6c8a24f5a stuff
2021-10-26 21:52:15 +03:00

132 lines
3.8 KiB
GDScript3

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