ESC compiler rewrite

Splits the former ESC_Runner and ESC_Level_Runner into multiple dedicated managers. 
Authored-by: Dennis Ploeger <develop@dieploegers.de>
This commit is contained in:
Dennis Ploeger
2021-06-04 16:12:42 +02:00
committed by GitHub
parent f069ab2ffd
commit 746a724f5a
115 changed files with 4740 additions and 2584 deletions

View File

@@ -15,98 +15,36 @@ var screen_ofs = Vector2(0, 0)
onready var bg_music = $bg_music
onready var scene_transition = $layers/curtain/scene_transition
func _ready():
$layers/wait_timer.connect("timeout", self, "_on_wait_finished")
func set_scene(p_scene, run_events=true):
"""
Sets p_scene as current scene
If run_events=true, plays the events defined in :setup event
"""
# Set the new current scene
#
# #### Parameters
#
# - p_scene: Current scene to set
func set_scene(p_scene: Node):
if !p_scene:
escoria.logger.report_errors("main", ["Trying to set empty scene"])
if current_scene != null:
clear_scene()
# get_node("/root").add_child(p_scene)
add_child(p_scene)
# Ensure we don't have a regular event running when changing scenes
if escoria.esc_runner.running_event:
assert(escoria.esc_runner.running_event.ev_name == "load")
var events : Dictionary = {}
if "esc_script" in p_scene and p_scene.esc_script and run_events:
events = escoria.esc_compiler.load_esc_file(p_scene.esc_script)
# # :setup is pretty much required in the code, but fortunately
# # we can help out with cases where one isn't necessary otherwise
# if not "setup" in events:
# var fake_setup = escoria.esc_compiler.compile_str(":setup\n")
# events["setup"] = fake_setup["setup"]
#
# escoria.esc_runner.run_event(events["setup"])
# # We need to ensure that :setup event is finished before adding the next event.
# var setup_done = false
# while !setup_done:
# var event_name = yield(escoria.esc_runner, "event_done")
# if event_name == "setup":
# setup_done = true
#
# # If scene was never visited, run "ready" event
# if !escoria.esc_runner.scenes_cache.has(p_scene.global_id) \
# and "ready" in events:
# escoria.esc_runner.run_event(events["ready"])
#
move_child(p_scene, 0)
set_current_scene(p_scene, run_events)
set_camera_limits()
return events
func set_current_scene(p_scene, run_events=true):
current_scene = p_scene
$"/root".move_child(current_scene, 0)
# Loading a save game must set the scene but not run events
if "events_path" in current_scene and current_scene.events_path and run_events:
if escoria.esc_runner.game:
# Having a game with `:setup` means we must wait for it to finish
if "setup" in escoria.esc_runner.game:
if not escoria.esc_runner.running_event:
escoria.logger.report_errors("main.gd:set_current_scene()", ["escoria.esc_runner.game has setup but no running_event"])
if escoria.esc_runner.running_event.ev_name != "setup":
escoria.logger.report_errors("main.gd:set_current_scene()", ["escoria.esc_runner.game has setup but it is not running: " + escoria.esc_runner.running_event.ev_name])
yield(escoria.esc_runner, "event_done")
else:
escoria.esc_compiler.load_file(current_scene.events_path)
# For a new game, we must run `:setup` if available
# and wait for it to finish
if "setup" in escoria.esc_runner.game:
escoria.esc_runner.run_event(escoria.esc_runner.game["setup"])
yield(escoria.esc_runner, "event_done")
if not escoria.esc_runner.running_event:
escoria.esc_runner.run_game()
escoria.esc_runner.register_object("_scene", p_scene, true) # Force overwrite of global
check_game_scene_methods()
set_camera_limits()
func clear_scene():
if current_scene == null:
return
escoria.esc_runner.clear_current_action()
escoria.esc_runner.clear_current_tool()
# escoria.esc_runner.hover_clear_stack()
# escoria.clear_inventory()
escoria.action_manager.clear_current_action()
escoria.action_manager.clear_current_tool()
last_scene_global_id = current_scene.global_id
escoria.esc_runner.set_global("ESC_LAST_SCENE", last_scene_global_id, true)
get_node("/root").remove_child(current_scene)
remove_child(current_scene)
current_scene.free()
current_scene = null
@@ -116,9 +54,6 @@ func wait(params : Array, level):
$layers/wait_timer.set_one_shot(true)
$layers/wait_timer.start()
func _on_wait_finished():
escoria.esc_level_runner.finished(wait_level)
func set_camera_limits(camera_limit_id : int = 0):
var limits = {}