Documentation and Optimization Part 1 (#2)

Authored-by: Dennis Ploeger <develop@dieploegers.de>
This commit is contained in:
Dennis Ploeger
2021-06-16 10:12:51 +02:00
committed by GitHub
parent a22805d0e6
commit 4e09f522ff
109 changed files with 3556 additions and 2043 deletions

View File

@@ -1,14 +1,24 @@
# The escorie main script
extends Node
# Scripts
onready var main = $main
onready var inputs_manager = $inputs_manager
onready var utils = load("res://addons/escoria-core/game/core-scripts/utils/utils.gd").new()
onready var save_data = load("res://addons/escoria-core/game/core-scripts/save_data/save_data.gd").new()
# Current game state
# * DEFAULT: Common game function
# * DIALOG: Game is playing a dialog
# * WAIT: Game is waiting
enum GAME_STATE {
DEFAULT,
DIALOG,
WAIT
}
# Logger used
var logger: ESCLogger
# Several utilities
var utils: ESCUtils
# The inventory manager instance
var inventory_manager: ESCInventoryManager
@@ -30,30 +40,24 @@ var object_manager: ESCObjectManager
# ESC command registry instance
var command_registry: ESCCommandRegistry
var resource_cache: ResourceCache
# Resource cache handler
var resource_cache: ESCResourceCache
# INSTANCES
# Instance of the main menu
var main_menu_instance
## Dialog player instantiator. This instance is called directly for dialogs.
var dialog_player
## Inventory scene
var inventory
# Game variables
# Terrain of the current room
var room_terrain
enum GAME_STATE {
DEFAULT,
DIALOG,
WAIT
}
onready var current_state = GAME_STATE.DEFAULT
# Dialog player instantiator. This instance is called directly for dialogs.
var dialog_player
onready var game_size = get_viewport().size
# Inventory scene
var inventory
# These are settings that the player can affect and save/load later
var settings : Dictionary
# These are default settings
var settings_default : Dictionary = {
# Text language
@@ -64,7 +68,7 @@ var settings_default : Dictionary = {
"speech_enabled": ProjectSettings.get_setting("escoria/sound/speech_enabled"),
# Master volume (max is 1.0)
"master_volume": ProjectSettings.get_setting("escoria/sound/master_volume"),
# Music volume (max is 1.0)
# Music volume (max is 1.0)
"music_volume": ProjectSettings.get_setting("escoria/sound/music_volume"),
# Sound effects volume (max is 1.0)
"sfx_volume": ProjectSettings.get_setting("escoria/sound/sfx_volume"),
@@ -79,8 +83,26 @@ var settings_default : Dictionary = {
}
# The current state of the game
onready var current_state = GAME_STATE.DEFAULT
# The game resolution
onready var game_size = get_viewport().size
# The main scene
onready var main = $main
# The escoria inputs manager
onready var inputs_manager = $inputs_manager
# Savegame management
onready var save_data = load("res://addons/escoria-core/game/core-scripts/save_data/save_data.gd").new()
# Initialize various objects
func _init():
self.logger = ESCLogger.new()
self.utils = ESCUtils.new()
self.inventory_manager = ESCInventoryManager.new()
self.action_manager = ESCActionManager.new()
self.event_manager = ESCEventManager.new()
@@ -89,10 +111,11 @@ func _init():
self.object_manager = ESCObjectManager.new()
self.command_registry = ESCCommandRegistry.new()
self.esc_compiler = ESCCompiler.new()
self.resource_cache = ResourceCache.new()
self.resource_cache = ESCResourceCache.new()
self.resource_cache.start()
# Load settings
func _ready():
save_data.start()
save_data.check_settings()
@@ -101,8 +124,6 @@ func _ready():
escoria._on_settings_loaded(escoria.settings)
##################################################################################
# Called by Main menu "start new game"
func new_game():
var script = self.esc_compiler.load_esc_file(
@@ -112,19 +133,21 @@ func new_game():
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
"""
Generic action function that runs an action on an element of the room (eg player walk)
action: type of the action ()
"""
# Run a generic action
#
# #### Parameters
#
# - action: type of the action to run
# - params: Parameters for the action
func do(action : String, params : Array = []) -> void:
if current_state == GAME_STATE.DEFAULT:
match action:
@@ -134,10 +157,10 @@ func do(action : String, params : Array = []) -> void:
# Check moving object.
if not self.object_manager.has(params[0]):
self.logger.report_errors(
"escoria.gd:do()",
"escoria.gd:do()",
[
"Walk action requested on inexisting object: %s "\
% params[0]
"Walk action requested on inexisting " + \
"object: %s " % params[0]
]
)
return
@@ -151,14 +174,18 @@ func do(action : String, params : Array = []) -> void:
var is_fast : bool = false
if params.size() > 2 and params[2] == true:
is_fast = true
var walk_context = {"fast": is_fast, "target": target_position}
var walk_context = ESCWalkContext.new(
null,
target_position,
is_fast
)
moving_obj.walk_to(target_position, walk_context)
# Walk to object from its id
elif params[1] is String:
if not self.object_manager.has(params[1]):
self.logger.report_errors(
"escoria.gd:do()",
"escoria.gd:do()",
[
"Walk action requested TOWARDS " +\
"inexisting object: %s" % params[1]
@@ -168,31 +195,45 @@ func do(action : String, params : Array = []) -> void:
var object = self.object_manager.get_object(params[1])
if object:
var target_position : Vector2 = object.node.interact_position
var target_position : Vector2 = \
object.node.interact_position
var is_fast : bool = false
if params.size() > 2 and params[2] == true:
is_fast = true
var walk_context = {"fast": is_fast, "target_object" : object}
var walk_context = ESCWalkContext.new(
object,
Vector2(),
is_fast
)
moving_obj.walk_to(target_position, walk_context)
"item_left_click":
if params[0] is String:
self.logger.info("escoria.do() : item_left_click on item ", [params[0]])
self.logger.info(
"escoria.do() : item_left_click on item ",
[params[0]]
)
var item = self.object_manager.get_object(params[0])
ev_left_click_on_item(item, params[1])
_ev_left_click_on_item(item, params[1])
"item_right_click":
if params[0] is String:
self.logger.info("escoria.do() : item_right_click on item ", [params[0]])
self.logger.info(
"escoria.do() : item_right_click on item ",
[params[0]]
)
var item = self.object_manager.get_object(params[0])
ev_left_click_on_item(item, params[1], true)
_ev_left_click_on_item(item, params[1], true)
"trigger_in":
var trigger_id = params[0]
var object_id = params[1]
var trigger_in_verb = params[2]
self.logger.info("escoria.do() : trigger_in " + trigger_id + " by " + object_id)
self.logger.info("escoria.do() : trigger_in %s by %s" % [
trigger_id,
object_id
])
self.event_manager.queue_event(
object_manager.get_object(trigger_id).events[
trigger_in_verb
@@ -203,7 +244,10 @@ func do(action : String, params : Array = []) -> void:
var trigger_id = params[0]
var object_id = params[1]
var trigger_out_verb = params[2]
self.logger.info("escoria.do() : trigger_out " + trigger_id + " by " + object_id)
self.logger.info("escoria.do() : trigger_out %s by %s" % [
trigger_id,
object_id
])
self.event_manager.queue_event(
object_manager.get_object(trigger_id).events[
trigger_out_verb
@@ -211,26 +255,27 @@ func do(action : String, params : Array = []) -> void:
)
_:
self.logger.report_warnings("escoria.gd:do()",
self.logger.report_warnings("escoria.gd:do()",
["Action received:", action, "with params ", params])
elif current_state == GAME_STATE.WAIT:
pass
# PRIVATE
func ev_left_click_on_item(obj, event, default_action = false):
"""
Event occurring when an object/item is left clicked
obj : object that was left clicked
event :
"""
# Event handler when an object/item was clicked
# FIXME this method is way to complex
#
# #### Parameters
#
# - ob: Object that was left clicked
# - event: Input event that was received
# - default_action: Run the inventory default action
func _ev_left_click_on_item(obj, event, default_action = false):
if obj is String:
obj = object_manager.get_object(obj)
self.logger.info(obj.global_id + " left-clicked with event ", [event])
var need_combine = false
# Check if current_action and current_tool are already set
# Check if current_action and current_tool are already set
if self.action_manager.current_action:
if self.action_manager.current_tool:
if self.action_manager.current_action in self.action_manager\
@@ -251,23 +296,24 @@ func ev_left_click_on_item(obj, event, default_action = false):
self.action_manager.current_tool = obj
# Don't interact after player movement towards object (because object is inactive for example)
# Don't interact after player movement towards object
# (because object is inactive for example)
var dont_interact = false
var destination_position : Vector2 = main.current_scene.player.global_position
var destination_position : Vector2 = main.current_scene.player.\
global_position
# Create walk context
var walk_context = {"fast": event.doubleclick, "target_object" : obj.node}
var walk_context = ESCWalkContext.new(
obj,
Vector2(),
event.doubleclick
)
# If object not in inventory, player walks towards it
if not inventory_manager.inventory_has(obj.global_id):
var clicked_object_has_interact_position = false
if object_manager.get_object(obj.global_id).interactive:
# if obj.interact_positions.default != null:
# destination_position = obj.interact_positions.default#.global_position
# clicked_object_has_interact_position = true
# else:
# destination_position = obj.position
if obj.node.get_interact_position() != null:
destination_position = obj.node.get_interact_position()
clicked_object_has_interact_position = true
@@ -277,20 +323,25 @@ func ev_left_click_on_item(obj, event, default_action = false):
destination_position = event.position
dont_interact = true
# Use ESC for this?
var is_already_walking = main.current_scene.player.walk_to(destination_position, walk_context)
main.current_scene.player.walk_to(
destination_position,
walk_context
)
# Wait for the player to arrive before continuing with action.
var context = yield(main.current_scene.player, "arrived")
var context: ESCWalkContext = yield(
main.current_scene.player,
"arrived"
)
self.logger.info("Context arrived: ", [context])
if context.has("target_object") and walk_context.has("target_object"):
if (context.target_object.global_id != walk_context.target_object.global_id) \
or (context.target_object.global_id == walk_context.target_object.global_id and is_already_walking):
dont_interact = true
elif context.has("target") and walk_context.has("target"):
if (context.target.global_id != walk_context.target.global_id) \
or (context.target.global_id == walk_context.target.global_id and is_already_walking):
dont_interact = true
if context.target_object and \
context.target_object.global_id != walk_context.\
target_object.global_id:
dont_interact = true
elif context.target_position != walk_context.target_position:
dont_interact = true
# If no interaction should happen after player has arrived, leave immediately.
if dont_interact:
@@ -318,22 +369,24 @@ func ev_left_click_on_item(obj, event, default_action = false):
# If apply_interact, perform combine between items
if need_combine:
self.action_manager.activate(
self.action_manager.current_action,
self.action_manager.current_tool,
self.action_manager.current_action,
self.action_manager.current_tool,
obj
)
else:
self.action_manager.activate(
self.action_manager.current_action,
self.action_manager.current_action,
obj
)
# else:
## escoria.fallback("")
# pass
func _on_settings_loaded(p_settings : Dictionary):
# Apply the loaded settings
#
# #### Parameters
#
# * p_settings: Loaded settings
func _on_settings_loaded(p_settings : Dictionary) -> void:
escoria.logger.info("******* settings loaded", p_settings)
if p_settings != null:
settings = p_settings
@@ -346,9 +399,18 @@ func _on_settings_loaded(p_settings : Dictionary):
# TODO Apply globally
# AudioServer.set_fx_global_volume_scale(settings.sfx_volume)
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear2db(settings.master_volume))
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear2db(settings.sfx_volume))
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear2db(settings.music_volume))
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index("Master"),
linear2db(settings.master_volume)
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index("SFX"),
linear2db(settings.sfx_volume)
)
AudioServer.set_bus_volume_db(
AudioServer.get_bus_index("Music"),
linear2db(settings.music_volume)
)
TranslationServer.set_locale(settings.text_lang)
# music_volume_changed()