238 lines
8.0 KiB
GDScript
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 = ""
|
|
|