Files
kicking-high/proto3/godot/scenes/bed_control.gd
2020-04-13 12:45:25 +03:00

238 lines
8.0 KiB
GDScript

extends Spatial
var playback = {
"init": {
"slave": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "bed_facing_up"],
["set", "parameters/free_grabbed/current", 0]
]
},
"engage": {
"master": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "bed_start_m"],
["set", "parameters/free_grabbed/current", 0]
],
"slave": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "bed_start"],
["set", "parameters/free_grabbed/current", 0]
]
},
"torture": {
"master": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "beating_m"],
["set", "parameters/free_grabbed/current", 0]
],
"slave": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "beating"],
["set", "parameters/free_grabbed/current", 0]
]
},
"force": {
"master": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "forcing_m"],
["set", "parameters/free_grabbed/current", 0]
],
"slave": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "forcing"],
["set", "parameters/free_grabbed/current", 0]
]
},
"force_s1": {
"master": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "forcing_s1_m"],
["set", "parameters/free_grabbed/current", 0]
],
"slave": [
["travel", "parameters/main/playback", "SmartObject"],
["travel", "parameters/main/SmartObject/playback", "bed"],
["travel", "parameters/main/SmartObject/bed/playback", "forcing_s1"],
["set", "parameters/free_grabbed/current", 0]
]
}
}
var state = "init"
var active_state = ""
var bodies = []
func entered(body):
if body.is_in_group("characters"):
if body.get_meta("grabbing"):
bodies.push_back(body)
global.smart_object.push_back(body)
print("entered:", body.name)
elif !body.get_meta("grabbed"):
bodies.push_back(body)
func exited(body):
if body in bodies:
print("exited:", body.name)
bodies.erase(body)
global.smart_object.erase(body)
var move_queue = []
var captured = []
func capture_slave(ch, orig_owner):
ch.add_collision_exception_with(orig_owner)
ch.set_meta("smart_object", true)
ch.set_meta("orig_owner", get_path_to(orig_owner))
for place in get_children():
if place.name.begins_with("place"):
if !place.has_meta("busy"):
move_queue.push_back([ch, place])
place.set_meta("busy", ch)
print("place: ", place.name)
break
captured.push_back(get_path_to(ch))
func free_slave(ch):
var orig_owner = ch.get_meta("orig_owner")
ch.remove_collision_exception_with(get_node(orig_owner))
ch.set_meta("smart_object", false)
ch.remove_meta("orig_owner")
var activate_delay = 0.0
func activate():
if activate_delay > 0.0:
return
if state in ["init", "engage", "torture"]:
activate_state()
activate_delay += 0.5
func activate_state():
# if active_state == state:
# return
print("ACTIVATE ", state)
match(state):
"init":
for k in bodies:
var ch = grabbing.get_grabbed(k)
if !ch:
continue
var s = playback[state]["slave"]
print("ungrab")
print("SMART: ", s)
grabbing.ungrab_character(k, s)
capture_slave(ch, k)
state = "engage"
"engage":
for k in bodies:
if k.get_meta("smart_object"):
continue
for place in get_children():
if place.name.begins_with("place"):
if place.has_meta("busy"):
print("has npc")
if !place.has_meta("master"):
print("has no master")
place.set_meta("master", k)
k.set_meta("smart_object", true)
print(k.name)
place.get_meta("busy").smart_obj(playback[state]["slave"])
place.get_meta("master").smart_obj(playback[state]["master"])
state = "torture"
"torture":
for place in get_children():
if place.name.begins_with("place"):
if place.has_meta("busy"):
if place.has_meta("master"):
place.get_meta("busy").smart_obj(playback[state]["slave"])
place.get_meta("master").smart_obj(playback[state]["master"])
"force":
for place in get_children():
if place.name.begins_with("place"):
if place.has_meta("busy"):
if place.has_meta("master"):
place.get_meta("busy").smart_obj(playback[state]["slave"])
place.get_meta("master").smart_obj(playback[state]["master"])
"force_s1":
for place in get_children():
if place.name.begins_with("place"):
if place.has_meta("busy"):
if place.has_meta("master"):
place.get_meta("busy").smart_obj(playback[state]["slave"])
place.get_meta("master").smart_obj(playback[state]["master"])
"leave":
for place in get_children():
if place.has_meta("busy") && place.has_meta("master"):
var m = place.get_meta("master")
m.set_meta("smart_object", false)
place.remove_meta("master")
m.do_stop()
var s = place.get_meta("busy")
free_slave(s)
place.remove_meta("busy")
s.do_stop()
var sub = rpg.get_submission(s)
sub += 100.0
s.set_meta("submission", sub)
rpg.update_xp(m, 300.0)
active_state = state
func _ready():
var e = $Area.connect("body_entered", self, "entered")
assert(e == OK)
e = $Area.connect("body_exited", self, "exited")
assert(e == OK)
var act = false
func _process(_delta):
if Input.is_action_just_pressed("grab"):
act = true
func _physics_process(delta):
if act:
activate()
act = false
while move_queue.size() > 0:
var item = move_queue.pop_front()
item[0].global_transform = item[1].global_transform
for place in get_children():
if place.has_meta("busy"):
place.get_meta("busy").global_transform = place.global_transform
place.get_meta("busy").orientation.basis = place.global_transform.basis
if place.has_meta("master"):
place.get_meta("master").global_transform = place.global_transform
place.get_meta("master").orientation.basis = place.global_transform.basis
activate_delay -= delta
if active_state == "torture":
for place in get_children():
if place.has_meta("busy") && place.has_meta("master"):
var strength = rpg.get_strength(place.get_meta("master"))
rpg.damage_stamina(place.get_meta("busy"), strength * 0.1 * delta)
print(rpg.get_stamina(place.get_meta("busy")))
if rpg.get_stamina(place.get_meta("busy")) <= 10.0:
state = "force"
activate_state()
rpg.damage_stamina(place.get_meta("master"), 5.0 * delta)
if active_state == "force":
for place in get_children():
if place.has_meta("busy") && place.has_meta("master"):
var strength = rpg.get_strength(place.get_meta("master"))
rpg.damage_stamina(place.get_meta("busy"), strength * 0.01 * delta)
print(rpg.get_stamina(place.get_meta("busy")))
if rpg.get_stamina(place.get_meta("busy")) <= 10.0:
state = "force_s1"
activate_state()
rpg.damage_stamina(place.get_meta("master"), 1.0 * delta)
if active_state == "force_s1":
for place in get_children():
if place.has_meta("busy") && place.has_meta("master"):
var strength = rpg.get_strength(place.get_meta("master"))
rpg.damage_stamina(place.get_meta("busy"), strength * 0.01 * delta)
print(rpg.get_stamina(place.get_meta("busy")))
rpg.damage_stamina(place.get_meta("master"), 1.0 * delta)
if rpg.get_stamina(place.get_meta("busy")) <= 0.0:
state = "leave"
activate_state()
if active_state == "leave":
state = "init"
active_state = ""