diff --git a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd index 2f72edeb..c09d0eda 100644 --- a/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd +++ b/addons/escoria-core/game/core-scripts/esc/esc_event_manager.gd @@ -93,6 +93,17 @@ func _process(delta: float) -> void: channel_name, _running_events[channel_name].name ) + + var event_flags = _running_events[channel_name].flags + if event_flags & ESCEvent.FLAG_NO_TT: + escoria.main.current_scene.game.tooltip_node.hide() + + if event_flags & ESCEvent.FLAG_NO_UI: + escoria.main.current_scene.game.hide_ui() + + if event_flags & ESCEvent.FLAG_NO_SAVE: + escoria.save_manager.save_enabled = false + _running_events[channel_name].run() for event in self.scheduled_events: (event as ESCScheduledEvent).timeout -= delta @@ -136,6 +147,7 @@ func interrupt_running_event(): for channel_name in _running_events.keys(): if _running_events[channel_name] != null: _running_events[channel_name].interrupt() + _channels_state[channel_name] = true # Clears the event queues. @@ -173,6 +185,16 @@ func _on_event_finished(return_code: int, channel_name: String) -> void: "Event %s ended with return code %d" % [event.name, return_code] ) + var event_flags = event.flags + if event_flags & ESCEvent.FLAG_NO_TT: + escoria.main.current_scene.game.tooltip_node.show() + + if event_flags & ESCEvent.FLAG_NO_UI: + escoria.main.current_scene.game.show_ui() + + if event_flags & ESCEvent.FLAG_NO_SAVE: + escoria.save_manager.save_enabled = true + if return_code == ESCExecution.RC_CANCEL: return_code = ESCExecution.RC_OK diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_event.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_event.gd index 62f21685..fb59be37 100644 --- a/addons/escoria-core/game/core-scripts/esc/types/esc_event.gd +++ b/addons/escoria-core/game/core-scripts/esc/types/esc_event.gd @@ -77,5 +77,6 @@ func _init(event_string: String): # Execute this statement and return its return code func run() -> int: + reset_interrupt() escoria.logger.debug("Event %s started" % name) return .run() diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd index dcc6c197..9d6eee0b 100644 --- a/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd +++ b/addons/escoria-core/game/core-scripts/esc/types/esc_object.gd @@ -64,7 +64,7 @@ func _set_active(value: bool): # # **Returns** Whether the node is interactive or not func _get_interactive() -> bool: - if "is_interactive" in self.node: + if is_instance_valid(self.node) and "is_interactive" in self.node: return self.node.is_interactive else: return true diff --git a/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd b/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd index fc2c89cf..98bded39 100644 --- a/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd +++ b/addons/escoria-core/game/core-scripts/esc/types/esc_statement.gd @@ -64,10 +64,18 @@ func interrupt(): _is_interrupted = true for statement in statements: if statement.is_finished: + var name = statement.name if "name" in statement else "group" escoria.logger.debug( "event manager", ["Event %s (%s) is already finished. Won't interrupt." - % [statement.name, str(statement)]] + % [name, str(statement)]] ) else: statement.interrupt() + + +# Resets an interrupted event +func reset_interrupt(): + _is_interrupted = false + for statement in statements: + statement.reset_interrupt() diff --git a/addons/escoria-core/game/core-scripts/esc_controller.gd b/addons/escoria-core/game/core-scripts/esc_controller.gd index 29abceb8..68ef1ad3 100644 --- a/addons/escoria-core/game/core-scripts/esc_controller.gd +++ b/addons/escoria-core/game/core-scripts/esc_controller.gd @@ -135,48 +135,6 @@ func perform_inputevent_on_object( if dont_interact: return - # If NO_TT flag is active, hide tooltip and connect for - # event finished to show it back - if event_flags & ESCEvent.FLAG_NO_TT \ - and not escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_tooltip_event_finished" - ): - escoria.main.current_scene.game.tooltip_node.hide() - escoria.event_manager.connect( - "event_finished", - self, - "_on_no_tooltip_event_finished" - ) - - if event_flags & ESCEvent.FLAG_NO_UI and \ - not escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_ui_event_finished" - ): - escoria.main.current_scene.game.hide_ui() - escoria.event_manager.connect( - "event_finished", - self, - "_on_no_ui_event_finished" - ) - - if event_flags & ESCEvent.FLAG_NO_SAVE and \ - not escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_save_event_finished" - ): - escoria.save_manager.save_enabled = false - escoria.event_manager.connect( - "event_finished", - self, - "_on_no_save_event_finished" - ) - pass - # Manage exits if obj.node.is_exit and escoria.action_manager.current_action \ in ["", "walk"]: @@ -292,63 +250,3 @@ func _walk_towards_object( walk_context.dont_interact_on_arrival = true return context - - -# Called when an event having "NO_TT" flag is finished. -# -# ## Parameters -# -# - _return_code: The ESCExecution return code sent by the events manager. -# - _event_name: the name of the event -func _on_no_tooltip_event_finished(_return_code: int, _event_name: String): - escoria.main.current_scene.game.tooltip_node.show() - if escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_tooltip_event_finished" - ): - escoria.event_manager.disconnect( - "event_finished", - self, - "_on_no_tooltip_event_finished" - ) - - -# Called when an event having "NO_UI" flag is finished. -# -# ## Parameters -# -# - _return_code: The ESCExecution return code sent by the events manager. -# - _event_name: the name of the event -func _on_no_ui_event_finished(_return_code: int, _event_name: String): - escoria.main.current_scene.game.show_ui() - if escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_ui_event_finished" - ): - escoria.event_manager.disconnect( - "event_finished", - self, - "_on_no_ui_event_finished" - ) - - -# Called when an event having "NO_SAVE" flag is finished. -# -# ## Parameters -# -# - _return_code: The ESCExecution return code sent by the events manager. -# - _event_name: the name of the event -func _on_no_save_event_finished(_return_code: int, _event_name: String): - escoria.save_manager.save_enabled = true - if escoria.event_manager.is_connected( - "event_finished", - self, - "_on_no_save_event_finished" - ): - escoria.event_manager.disconnect( - "event_finished", - self, - "_on_no_save_event_finished" - ) diff --git a/addons/escoria-core/game/main.gd b/addons/escoria-core/game/main.gd index 0ce05444..ca5ea95f 100644 --- a/addons/escoria-core/game/main.gd +++ b/addons/escoria-core/game/main.gd @@ -92,9 +92,11 @@ func set_camera_limits(camera_limit_id: int = 0) -> void: # to stick centered on the background if area.size.x == 0 or area.size.y == 0 \ or area.size < get_viewport().size: - escoria.logger.report_warning( - "main.gd:set_camera_limits()", - "No limit area! Using viewport." + escoria.logger.report_warnings( + "main.gd:set_camera_limits()", + [ + "No limit area! Using viewport." + ] ) area.size = get_viewport().size diff --git a/addons/escoria-core/plugin.gd b/addons/escoria-core/plugin.gd index a7f3bf56..297e42dd 100644 --- a/addons/escoria-core/plugin.gd +++ b/addons/escoria-core/plugin.gd @@ -258,7 +258,7 @@ func set_escoria_sound_settings(): "escoria/sound/master_volume", 1, { - "type": TYPE_INT, + "type": TYPE_REAL, "hint": PROPERTY_HINT_RANGE, "hint_string": "0,1" } @@ -268,7 +268,7 @@ func set_escoria_sound_settings(): "escoria/sound/music_volume", 1, { - "type": TYPE_INT, + "type": TYPE_REAL, "hint": PROPERTY_HINT_RANGE, "hint_string": "0,1" } @@ -278,7 +278,7 @@ func set_escoria_sound_settings(): "escoria/sound/sfx_volume", 1, { - "type": TYPE_INT, + "type": TYPE_REAL, "hint": PROPERTY_HINT_RANGE, "hint_string": "0,1" } @@ -288,7 +288,7 @@ func set_escoria_sound_settings(): "escoria/sound/speech_volume", 1, { - "type": TYPE_INT, + "type": TYPE_REAL, "hint": PROPERTY_HINT_RANGE, "hint_string": "0,1" }