Adds "name" parameter to ESC spawn command (#410)

Co-authored-by: StraToN <StraToN@users.noreply.github.com>
This commit is contained in:
Julian Murgia
2021-10-07 08:22:11 +02:00
committed by GitHub
parent 378f29283d
commit 41902b5791
11 changed files with 128 additions and 90 deletions

View File

@@ -71,8 +71,6 @@ func run(command_params: Array) -> int:
escoria.inputs_manager.clear_stack() escoria.inputs_manager.clear_stack()
escoria.main_menu_instance.hide()
var res_room = escoria.resource_cache.get_resource(command_params[0]) var res_room = escoria.resource_cache.get_resource(command_params[0])
# Load game scene # Load game scene

View File

@@ -1,4 +1,4 @@
# `spawn path [object2]` # `spawn identifier path [is_active=true] [object2] `
# #
# Instances a scene determined by "path", and places in the position of # Instances a scene determined by "path", and places in the position of
# object2 (object2 is optional) # object2 (object2 is optional)
@@ -11,27 +11,36 @@ class_name SpawnCommand
# Return the descriptor of the arguments of this command # Return the descriptor of the arguments of this command
func configure() -> ESCCommandArgumentDescriptor: func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new( return ESCCommandArgumentDescriptor.new(
1, 2,
[TYPE_STRING, TYPE_STRING], [TYPE_STRING, TYPE_STRING, TYPE_BOOL, TYPE_STRING],
[null, null] [null, null, true, null]
) )
# Validate wether the given arguments match the command descriptor # Validate wether the given arguments match the command descriptor
func validate(arguments: Array): func validate(arguments: Array):
if not ResourceLoader.exists(arguments[0]): if arguments[0].empty() \
or arguments[0] in escoria.object_manager.RESERVED_OBJECTS:
escoria.logger.report_errors( escoria.logger.report_errors(
"spawn: invalid scene path", "spawn: invalid global_id",
[ [
"Scene with path %s not found" % arguments[0] "global_id %s is invalid" % arguments[0]
] ]
) )
return false return false
if arguments[1] and not escoria.object_manager.objects.has(arguments[1]): if not ResourceLoader.exists(arguments[1]):
escoria.logger.report_errors(
"spawn: invalid scene path",
[
"Scene with path %s not found" % arguments[1]
]
)
return false
if arguments[3] and not escoria.object_manager.objects.has(arguments[2]):
escoria.logger.report_errors( escoria.logger.report_errors(
"spawn: invalid object", "spawn: invalid object",
[ [
"Object with global id %s not found" % arguments[1] "Object with global id %s not found" % arguments[2]
] ]
) )
return false return false
@@ -40,21 +49,33 @@ func validate(arguments: Array):
# Run the command # Run the command
func run(command_params: Array) -> int: func run(command_params: Array) -> int:
var res_scene = escoria.resource_cache.get_resource(command_params[0]) var res_scene = escoria.resource_cache.get_resource(command_params[1])
# Load room scene # Load room scene
var scene = res_scene.instance() var scene = res_scene.instance()
if scene: if scene:
escoria.main.get_node("/root").add_child(scene) escoria.main.get_node("/root").add_child(scene)
if command_params[1]: if command_params[3]:
var obj = escoria.object_manager.get_object(command_params[1]) var obj = escoria.object_manager.get_object(command_params[3])
scene.set_position(obj.get_global_position()) scene.set_position(obj.get_global_position())
escoria.inputs_manager.hotspot_focused = "" escoria.inputs_manager.hotspot_focused = ""
escoria.object_manager.register_object(
ESCObject.new(
command_params[0],
scene
),
true
)
escoria.object_manager.get_object(command_params[0]).active = \
command_params[2]
else: else:
escoria.logger.report_errors( escoria.logger.report_errors(
"spawn: Invalid scene", "spawn: Invalid scene",
[ [
"Failed loading scene %s" % command_params[0] "Failed loading scene %s" % command_params[1]
] ]
) )

View File

@@ -49,9 +49,6 @@ var command_registry: ESCCommandRegistry
# Resource cache handler # Resource cache handler
var resource_cache: ESCResourceCache var resource_cache: ESCResourceCache
# Instance of the main menu
var main_menu_instance
# Terrain of the current room # Terrain of the current room
var room_terrain var room_terrain
@@ -64,7 +61,6 @@ var inventory
# These are settings that the player can affect and save/load later # These are settings that the player can affect and save/load later
var settings: ESCSaveSettings var settings: ESCSaveSettings
# The current state of the game # The current state of the game
onready var current_state = GAME_STATE.DEFAULT onready var current_state = GAME_STATE.DEFAULT
@@ -87,6 +83,11 @@ var controller: ESCController
# The game scene loaded # The game scene loaded
var game_scene: ESCGame var game_scene: ESCGame
# The compiled start script loaded from ProjectSettings
# escoria/main/game_start_script
var start_script : ESCScript
# Initialize various objects # Initialize various objects
func _init(): func _init():
@@ -119,38 +120,25 @@ func _init():
ProjectSettings.get_setting("escoria/ui/game_scene") ProjectSettings.get_setting("escoria/ui/game_scene")
).instance() ).instance()
if ProjectSettings.get_setting("escoria/ui/main_menu_scene") == "":
logger.report_errors("escoria.gd",
["Parameter escoria/ui/main_menu_scene is not set!"]
)
else:
self.main_menu_instance = resource_cache.get_resource(
ProjectSettings.get_setting("escoria/ui/main_menu_scene")
).instance()
# Load settings # Load settings
func _ready(): func _ready():
inputs_manager.register_core() inputs_manager.register_core()
start_script = self.esc_compiler.load_esc_file(
ProjectSettings.get_setting("escoria/main/game_start_script")
)
# Called by Escoria's main_scene as very very first event EVER.
# Usually you'll want to show some logos animations before spawning the main
# menu in the escoria/main/game_start_script 's :init event
func init():
run_event_from_script(start_script, "init")
# Called by Main menu "start new game" # Called by Main menu "start new game"
func new_game(): func new_game():
var script = self.esc_compiler.load_esc_file( run_event_from_script(start_script, "newgame")
ProjectSettings.get_setting("escoria/main/game_start_script")
)
event_manager.queue_event(script.events["start"])
var rc = yield(event_manager, "event_finished")
while rc[1] != "start":
rc = yield(event_manager, "event_finished")
if rc[0] != ESCExecution.RC_OK:
self.logger.report_errors(
"Start event of the start script returned unsuccessful: %d" % rc[0],
[]
)
return
# Run a generic action # Run a generic action
@@ -319,3 +307,29 @@ func _input(event):
# - p_paused: if true, pauses the game. If false, unpauses the game. # - p_paused: if true, pauses the game. If false, unpauses the game.
func set_game_paused(p_paused: bool): func set_game_paused(p_paused: bool):
get_tree().paused = p_paused get_tree().paused = p_paused
# Runs the event "event_name" from the "script" ESC script.
#
# #### Parameters
# - script: ESC script containing the event to run. The script must have been
# loaded.
# - event_name: Name of the event to run
func run_event_from_script(script: ESCScript, event_name: String):
if script == null:
logger.report_errors(
"escoria.gd:run_event_from_script()",
["Requested action %s on unloaded script %s" % [event_name, script],
"Please load the ESC script using esc_compiler.load_esc_file()."]
)
event_manager.queue_event(script.events[event_name])
var rc = yield(event_manager, "event_finished")
while rc[1] != event_name:
rc = yield(event_manager, "event_finished")
if rc[0] != ESCExecution.RC_OK:
self.logger.report_errors(
"Start event of the start script returned unsuccessful: %d" % rc[0],
[]
)
return

View File

@@ -5,15 +5,5 @@ extends Node
# Start the main menu # Start the main menu
func _ready(): func _ready():
if escoria.main_menu_instance == null: escoria.init()
if ProjectSettings.get_setting("escoria/ui/main_menu_scene") == "":
escoria.logger.report_errors("escoria.gd",
["Parameter escoria/ui/main_menu_scene is not set!"]
)
else:
escoria.main_menu_instance = escoria.resource_cache.get_resource(
ProjectSettings.get_setting("escoria/ui/main_menu_scene")
).instance()
escoria.call_deferred("add_child", escoria.main_menu_instance)

View File

@@ -50,26 +50,6 @@ func set_escoria_ui_settings():
} }
ProjectSettings.add_property_info(default_dialog_scene_property_info) ProjectSettings.add_property_info(default_dialog_scene_property_info)
if !ProjectSettings.has_setting("escoria/ui/main_menu_scene"):
ProjectSettings.set_setting("escoria/ui/main_menu_scene", "")
var main_menu_scene_property_info = {
"name": "escoria/ui/main_menu_scene",
"type": TYPE_STRING,
"hint": PROPERTY_HINT_FILE,
"hint_string": "*.tscn, *.scn"
}
ProjectSettings.add_property_info(main_menu_scene_property_info)
if !ProjectSettings.has_setting("escoria/ui/pause_menu_scene"):
ProjectSettings.set_setting("escoria/ui/pause_menu_scene", "")
var pause_menu_scene_property_info = {
"name": "escoria/ui/pause_menu_scene",
"type": TYPE_STRING,
"hint": PROPERTY_HINT_FILE,
"hint_string": "*.tscn, *.scn"
}
ProjectSettings.add_property_info(pause_menu_scene_property_info)
if !ProjectSettings.has_setting("escoria/ui/game_scene"): if !ProjectSettings.has_setting("escoria/ui/game_scene"):
ProjectSettings.set_setting("escoria/ui/game_scene", "") ProjectSettings.set_setting("escoria/ui/game_scene", "")
var game_scene_property_info = { var game_scene_property_info = {

View File

@@ -6,7 +6,7 @@
## Description ## Description
`spawn path [object2]` `spawn identifier path [is_active=true] [object2] `
Instances a scene determined by "path", and places in the position of Instances a scene determined by "path", and places in the position of
object2 (object2 is optional) object2 (object2 is optional)

View File

@@ -113,14 +113,6 @@ var resource_cache: ESCResourceCache
Resource cache handler Resource cache handler
### main\_menu\_instance
```gdscript
var main_menu_instance
```
Instance of the main menu
### room\_terrain ### room\_terrain
```gdscript ```gdscript
@@ -210,8 +202,27 @@ var game_scene: ESCGame
 The game scene loaded  The game scene loaded
### start\_script
```gdscript
var start_script: ESCScript
```
The compiled start script loaded from ProjectSettings
escoria/main/game_start_script
## Method Descriptions ## Method Descriptions
### init
```gdscript
func init()
```
Called by Escoria's main_scene as very very first event EVER.
Usually you'll want to show some logos animations before spawning the main
menu in the escoria/main/game_start_script 's :init event
### new\_game ### new\_game
```gdscript ```gdscript
@@ -246,6 +257,19 @@ Pauses or unpause the game
#### Parameters #### Parameters
- p_paused: if true, pauses the game. If false, unpauses the game. - p_paused: if true, pauses the game. If false, unpauses the game.
### run\_event\_from\_script
```gdscript
func run_event_from_script(script: ESCScript, event_name: String)
```
Runs the event "event_name" from the "script" ESC script.
#### Parameters
- script: ESC script containing the event to run. The script must have been
loaded.
- event_name: Name of the event to run
## Signals ## Signals
- signal request_pause_menu(): Signal sent when pause menu has to be displayed - signal request_pause_menu(): Signal sent when pause menu has to be displayed

View File

@@ -338,7 +338,7 @@ Moves object1 towards the position of object2, at the speed determined by
object1's "speed" property, unless overridden. This command is non-blocking. object1's "speed" property, unless overridden. This command is non-blocking.
It does not respect the room's navigation polygons, so you can move items It does not respect the room's navigation polygons, so you can move items
where the player can't walk. where the player can't walk.
#### <a name="SpawnCommand.md"></a>`spawn path [object2]` [API-Doc](api/SpawnCommand.md) #### <a name="SpawnCommand.md"></a>`spawn identifier path [is_active=true] [object2] ` [API-Doc](api/SpawnCommand.md)
Instances a scene determined by "path", and places in the position of Instances a scene determined by "path", and places in the position of
object2 (object2 is optional) object2 (object2 is optional)

View File

@@ -4,7 +4,7 @@ say player "That must be the command to open the door."
:use :use
> [!r8_m_door_open] > [!r8_m_door_open]
#superpose_scene "res://game/rooms/room08/puzzle/10_buttons_puzzle.tscn" #superpose_scene "res://game/rooms/room08/puzzle/10_buttons_puzzle.tscn"
spawn "res://game/rooms/room08/puzzle/10_buttons_puzzle.tscn" spawn puzzle "res://game/rooms/room08/puzzle/10_buttons_puzzle.tscn"
> [r8_m_door_open] > [r8_m_door_open]
say player "The door is already open." say player "The door is already open."

13
game/start_game.esc Executable file → Normal file
View File

@@ -1,4 +1,13 @@
:start :init
spawn _main_menu res://game/ui/commons/main_menu/main_menu.tscn false
set_active _main_menu true
:newgame
# Hide main menu
set_active _main_menu false
# 1/ Simple scene # 1/ Simple scene
change_scene res://game/rooms/room01/room01.tscn change_scene res://game/rooms/room01/room01.tscn
@@ -36,3 +45,5 @@ change_scene res://game/rooms/room01/room01.tscn
# 12/ Event flags tests 2 # 12/ Event flags tests 2
#change_scene res://game/rooms/room12/room12.tscn #change_scene res://game/rooms/room12/room12.tscn

View File

@@ -648,8 +648,6 @@ debug/terminate_on_errors=true
debug/development_lang="en" debug/development_lang="en"
ui/tooltip_follows_mouse=true ui/tooltip_follows_mouse=true
ui/default_dialog_scene="res://game/ui/commons/dialogs/dialog_label.tscn" ui/default_dialog_scene="res://game/ui/commons/dialogs/dialog_label.tscn"
ui/main_menu_scene="res://game/ui/commons/main_menu/main_menu.tscn"
ui/pause_menu_scene="res://game/ui/commons/pause_menu/pause_menu.tscn"
main/text_lang="fr_FR" main/text_lang="fr_FR"
main/voice_lang="fr_FR" main/voice_lang="fr_FR"
sound/music_volume=1 sound/music_volume=1
@@ -672,6 +670,8 @@ sound/speech_folder="res://game/speech"
sound/speech_extension="ogg" sound/speech_extension="ogg"
ui/default_transition="curtain" ui/default_transition="curtain"
ui/transition_paths=[ "res://addons/escoria-core/game/scenes/transitions/shaders/" ] ui/transition_paths=[ "res://addons/escoria-core/game/scenes/transitions/shaders/" ]
ui/main_menu_scene="res://game/ui/commons/main_menu/main_menu.tscn"
ui/pause_menu_scene="res://game/ui/commons/pause_menu/pause_menu.tscn"
internals/save_data="" internals/save_data=""
[input] [input]