initial
This commit is contained in:
314
GameScript.gd
Normal file
314
GameScript.gd
Normal file
@@ -0,0 +1,314 @@
|
||||
|
||||
extends Node
|
||||
|
||||
class ScriptNode:
|
||||
var scene
|
||||
|
||||
|
||||
func step_type():
|
||||
return ""
|
||||
func get_scene():
|
||||
return scene
|
||||
func init(scene):
|
||||
print("starting step " + step_type())
|
||||
self.scene = scene
|
||||
pass
|
||||
func do(delta):
|
||||
pass
|
||||
func is_done():
|
||||
return true
|
||||
|
||||
func interrupt():
|
||||
return false
|
||||
|
||||
class Say:
|
||||
extends ScriptNode
|
||||
var text
|
||||
var subject : Node2D = null
|
||||
var done = false
|
||||
var started = false
|
||||
var t
|
||||
func step_type():
|
||||
return "Say " + text
|
||||
func init(scene):
|
||||
super(scene)
|
||||
subject.play_animation("talk", 0)
|
||||
|
||||
func do(delta):
|
||||
if !started:
|
||||
started = true
|
||||
t = Timer.new()
|
||||
t.autostart = true
|
||||
t.wait_time = 2.0
|
||||
subject.add_child(t)
|
||||
|
||||
var label: Label = subject.find_child("talk-label")
|
||||
label.set_text(text)
|
||||
subject.find_child("label-root").show()
|
||||
print ("SHOWING")
|
||||
await t.timeout
|
||||
print ("HIDING")
|
||||
subject.remove_child(t)
|
||||
subject.find_child("label-root").hide()
|
||||
subject.stop_animation()
|
||||
subject.play_animation_raw("idle_" + subject.facing)
|
||||
done = true
|
||||
started = true
|
||||
|
||||
|
||||
func is_done():
|
||||
|
||||
return done
|
||||
|
||||
func interrupt():
|
||||
done = true
|
||||
subject.stop_animation()
|
||||
subject.play_animation_raw("idle_" + subject.facing)
|
||||
subject.find_child("label-root").hide()
|
||||
|
||||
|
||||
class WalkTo:
|
||||
extends ScriptNode
|
||||
var path = []
|
||||
var subject : Node2D = null
|
||||
var script_fn = null
|
||||
func step_type():
|
||||
return "WalkTo " + subject.get_name()
|
||||
|
||||
func do(delta):
|
||||
# Calculate the movement distance for this frame
|
||||
var distance_to_walk = 1500 * delta * (subject.get_transform().get_scale().y)
|
||||
var p = subject.position
|
||||
|
||||
if path.size()> 0:
|
||||
# Move the player along the path until he has run out of movement or the path ends.
|
||||
while distance_to_walk > 0 and path.size() > 0:
|
||||
var dir = snapped(subject.position.angle_to_point(path[0]), PI/4) / (PI/4)
|
||||
dir = wrapi(dir, 0, 8)
|
||||
var anim
|
||||
var facing = ""
|
||||
if dir == 4:
|
||||
facing="W"
|
||||
|
||||
if dir == 5:
|
||||
facing ="NW"
|
||||
elif dir == 6:
|
||||
facing="N"
|
||||
|
||||
elif dir ==7:
|
||||
facing="NE"
|
||||
|
||||
elif dir == 0:
|
||||
facing="E"
|
||||
elif dir == 1:
|
||||
facing="SE"
|
||||
elif dir == 2:
|
||||
facing = "S"
|
||||
elif dir == 3:
|
||||
facing = "SW"
|
||||
|
||||
if facing:
|
||||
var seek = 0
|
||||
subject.facing = facing
|
||||
var sprite = subject.play_animation_maintain("walk")
|
||||
|
||||
# seek = animation_player.current_animation_position
|
||||
#animation_player.play(anim)
|
||||
#animation_player.seek(seek, true)
|
||||
#subject.find_node("AnimationPlayer").playback_speed=1.8
|
||||
var distance_to_next_point = p.distance_to(path[0])
|
||||
if distance_to_walk <= distance_to_next_point:
|
||||
# The player does not have enough movement left to get to the next point.
|
||||
p += p.direction_to(path[0]) * distance_to_walk
|
||||
else:
|
||||
# The player get to the next point
|
||||
p = path[0]
|
||||
path = path.slice(1)
|
||||
# Update the distance to walk
|
||||
distance_to_walk -= distance_to_next_point
|
||||
|
||||
subject.position = p;
|
||||
|
||||
func is_done():
|
||||
if path.size() == 0:
|
||||
subject.play_animation("idle", 0)
|
||||
#subject.find_child("AnimatedSprite2D").pause()
|
||||
return path.size() == 0
|
||||
class WalkToDeferred:
|
||||
extends WalkTo
|
||||
var named_to
|
||||
var named_from
|
||||
var subject_name
|
||||
func step_type():
|
||||
return "Walk to " + named_to
|
||||
func init(scene):
|
||||
super(scene)
|
||||
print("SCENE IS", scene)
|
||||
subject = scene.get_node(subject_name)
|
||||
var s = scene.get_node("Node2D/background")
|
||||
var bgs = scene.get_node("Node2D").get_children()
|
||||
var g = s.get_children()
|
||||
|
||||
path = NavigationServer2D.map_get_path(s.map, s.pathfind.to_local(s.get_node(named_from).global_position), s.pathfind.to_local(s.get_node(named_to).global_position), true)
|
||||
print(" PATH IS", path)
|
||||
#[Vector2(0,0), Vector2(300,300)]
|
||||
|
||||
class Transition:
|
||||
extends ScriptNode
|
||||
var path = []
|
||||
var subject : Node2D = null
|
||||
var next : Resource = null
|
||||
var script_fn = null
|
||||
var position = null
|
||||
var transitioned : String
|
||||
var running = false
|
||||
var done = false
|
||||
|
||||
func step_type():
|
||||
return "transition"
|
||||
func do(delta):
|
||||
if not running:
|
||||
running = true
|
||||
var parent = subject.get_parent()
|
||||
|
||||
var fade_player = subject.get_parent().get_parent().find_child("FadePlayer", true)
|
||||
fade_player.play("fade-out",0.0, 1.5)
|
||||
await fade_player.animation_finished
|
||||
var new_scene = next.instantiate()
|
||||
new_scene.name="background"
|
||||
parent.remove_child(subject)
|
||||
var pos = new_scene.find_child(position)
|
||||
if new_scene is Scene:
|
||||
new_scene.starting_point = pos.position
|
||||
parent.add_child(new_scene)
|
||||
|
||||
|
||||
|
||||
subject.emit_signal("transitioned", new_scene)
|
||||
subject.queue_free()
|
||||
fade_player.play("fade-in",0.0, 1.5)
|
||||
await fade_player.animation_finished
|
||||
done = true
|
||||
parent
|
||||
|
||||
func is_done():
|
||||
return done
|
||||
|
||||
class TriggerSignal:
|
||||
extends ScriptNode
|
||||
var path = []
|
||||
var subject : Node2D = null
|
||||
var next : Resource = null
|
||||
var script_fn = null
|
||||
var running = false
|
||||
var s :String = ""
|
||||
|
||||
func do(delta):
|
||||
pass
|
||||
# get_tree().find_child("Node2D/background").emit_signal(s)
|
||||
|
||||
func is_done():
|
||||
true
|
||||
class ScriptEdge:
|
||||
var from : ScriptNode
|
||||
var to : ScriptNode
|
||||
|
||||
class ScriptGraph:
|
||||
var initial: ScriptNode
|
||||
var current = []
|
||||
var nodes = []
|
||||
var edges = []
|
||||
var can_interrupt = false
|
||||
var current_scene
|
||||
var last_node
|
||||
|
||||
signal script_complete
|
||||
func step(delta, scene):
|
||||
for c in range(current.size()):
|
||||
current[c].do(delta)
|
||||
var to_add = []
|
||||
for current_index in range(current.size()):
|
||||
var current_step = current[-current_index]
|
||||
if current_step.is_done():
|
||||
print("Stopping step", current_step.step_type())
|
||||
current.remove_at(-current_index)
|
||||
for edge in edges:
|
||||
if edge.from == current_step:
|
||||
to_add.push_back(edge.to)
|
||||
edge.to.init(scene)
|
||||
|
||||
current.append_array(to_add)
|
||||
if current.size() == 0:
|
||||
emit_signal("script_complete")
|
||||
|
||||
|
||||
func interrupt():
|
||||
for c in current:
|
||||
c.interrupt()
|
||||
return can_interrupt
|
||||
|
||||
|
||||
var script_graph: ScriptGraph
|
||||
#var last_node: ScriptNode
|
||||
|
||||
func init(step: ScriptNode):
|
||||
script_graph = ScriptGraph.new()
|
||||
script_graph.initial = step
|
||||
step.init(get_node("/root/Node2D"))
|
||||
script_graph.current = [step]
|
||||
script_graph.last_node = step
|
||||
#last_node = step
|
||||
return self
|
||||
|
||||
func and_then(step: ScriptNode):
|
||||
script_graph.nodes.push_back(step)
|
||||
var edge = ScriptEdge.new()
|
||||
edge.from = script_graph.last_node
|
||||
edge.to = step
|
||||
script_graph.edges.push_back(edge)
|
||||
script_graph.last_node=step
|
||||
return self
|
||||
|
||||
func can_interrupt():
|
||||
script_graph.can_interrupt = true
|
||||
return self
|
||||
|
||||
func build(subject, on_complete):
|
||||
script_graph.connect("script_complete", Callable(subject, on_complete))
|
||||
script_graph.connect("script_complete", self.on_complete)
|
||||
return script_graph
|
||||
|
||||
func on_complete():
|
||||
current_script=null
|
||||
|
||||
func walk_path(subject, path):
|
||||
var walk_to = WalkTo.new()
|
||||
walk_to.subject = subject
|
||||
walk_to.path = path
|
||||
return walk_to
|
||||
|
||||
func say(subject, text):
|
||||
var say = Say.new()
|
||||
say.subject = subject
|
||||
say.text = text
|
||||
return say
|
||||
|
||||
func walk_to_deferred(named_from, named_to):
|
||||
var say = WalkToDeferred.new()
|
||||
say.subject_name = "Node2D/background/Graham"
|
||||
say.named_from = named_from
|
||||
say.named_to = named_to
|
||||
return say
|
||||
|
||||
func trigger_signal(s):
|
||||
var thing = TriggerSignal.new()
|
||||
thing.s = s
|
||||
return thing
|
||||
func transition(subject, scene, position_identifier):
|
||||
var t = Transition.new()
|
||||
t.subject = subject
|
||||
t.next = scene
|
||||
t.position = position_identifier
|
||||
return t
|
||||
|
||||
var current_script : ScriptGraph = null
|
||||
Reference in New Issue
Block a user