Moved and split escoria._ev_left_click_on_item() function into ESCController (#371)

* Moved and split escoria._ev_left_click_on_item() function into ESCController.
Added a boolean in ESCWalkContext to hold whether interact should happen after destination is reached.

Co-authored-by: StraToN <StraToN@users.noreply.github.com>
This commit is contained in:
Julian Murgia
2021-08-24 08:19:55 +02:00
committed by GitHub
parent fc3ea147a7
commit b230966fc6
11 changed files with 396 additions and 225 deletions

View File

@@ -0,0 +1,247 @@
# This script contains functions called by gamedev's game.gd.
# These functions convert input actions into game actions. For example:
# "click on background" -> player walks to position
# "click on item" -> player walks to item then performs the action defined
# by current verb
class_name ESCController
# Makes an object walk to a destination. This can be either a 2D position or
# another object.
#
# #### Parameters
#
# - moving_obj_id: global id of the object that needs to move
# - destination: Position2D or ESCObject holding the moving object to head to
# - is_fast: if true, the walk is performed at fast speed (defined in the moving
# object.
func perform_walk(
moving_obj: ESCObject,
destination,
is_fast: bool = false
):
# Walk to Position2D.
if destination is Vector2:
var walk_context = ESCWalkContext.new(
null,
destination,
is_fast,
true
)
moving_obj.node.walk_to(destination, walk_context)
# Walk to object
elif destination is ESCObject:
if destination.node:
var target_position: Vector2
if destination.node is ESCLocation:
target_position = destination.node.global_position
else:
target_position = destination.node.interact_position
var walk_context = ESCWalkContext.new(
destination.node,
Vector2(),
is_fast,
true
)
moving_obj.node.walk_to(target_position, walk_context)
else:
escoria.logger.report_errors(
"esc_controller.gd:perform_walk()",
[
"Function expected either a Vector2 or ESCObject type " + \
"for destination parameter. Actual was: %s " % destination
]
)
return
# Event handler when an object/item was clicked
#
# #### Parameters
#
# - obj: Object that was left clicked
# - event: Input event that was received
# - default_action: if true, run the inventory default action
func perform_inputevent_on_object(
obj: ESCObject,
event: InputEvent,
default_action: bool = false
):
"""
This algorithm:
- makes the player move to the clicked object location, if needed
(if it is located in the room for example) and wait for reaching.
- when reached, performs an action depending on current defined action
* no current action defined: do nothing else
* current action defined:
* item requires no combination: perform the current action
on the item
* item requires combination: check the status of the combination
A combination requires 3 elements to fulfill:
1/ a verb action
2/ a first "tool" (item to use)
3/ a second "tool" (item to use ON)
Whatever the user inputs to fulfill the combination (this is
determined by gamedev in his game.gd script)
- combination not fulfilled: no not perform until fulfilled
- combination fulfilled: perform the combination.
* else do nothing, except if default_action is requested.
In this case, perform the default_action on the item.
"""
escoria.logger.info("%s left-clicked with event " % obj.global_id, [event])
# Don't interact after player movement towards object
# (because object is inactive for example)
var dont_interact = false
var destination_position: Vector2 = escoria.main.current_scene.player.\
global_position
# If clicked object not in inventory, player walks towards it
if not escoria.inventory_manager.inventory_has(obj.global_id):
var context = _walk_towards_object(
obj,
event.position,
event.doubleclick
)
if context is GDScriptFunctionState:
context = yield(_walk_towards_object(
obj,
event.position,
event.doubleclick
), "completed")
destination_position = context.target_position
dont_interact = context.dont_interact_on_arrival
# If no interaction should happen after player has arrived, leave
# immediately.
if dont_interact:
return
var player_global_pos = escoria.main.current_scene.player.global_position
var clicked_position = event.position
# If player has arrived at the position he was supposed to reach
# so he can interact
if player_global_pos == destination_position:
# Manage exits
if obj.node.is_exit and escoria.action_manager.current_action \
in ["", "walk"]:
escoria.action_manager.activate("exit_scene", obj)
else:
# Manage movements towards object before activating it
if escoria.action_manager.current_action in ["", "walk"] and \
not escoria.inventory_manager.inventory_has(obj.global_id):
escoria.action_manager.activate("arrived", obj)
# Manage action on object
elif not escoria.action_manager.current_action in ["", "walk"]:
# Check if clicked item awaits a combination
var need_combine = _check_item_needs_combine(
obj,
default_action
)
# If apply_interact, perform combine between items
if need_combine:
escoria.action_manager.activate(
escoria.action_manager.current_action,
escoria.action_manager.current_tool,
obj
)
else:
escoria.action_manager.activate(
escoria.action_manager.current_action,
obj
)
# Checks if object requires a combination with another, according to
# currently selected action verb (or check with default action of the item).
#
# #### Parameters
#
# - obj: the ESCObject to test
# - default_action: if true, the check is done on the object's default action
func _check_item_needs_combine(obj: ESCObject, default_action: bool) -> bool:
var need_combine = false
# Check if current_action and current_tool are already set
if escoria.action_manager.current_action and \
escoria.action_manager.current_tool:
if escoria.action_manager.current_action in escoria.action_manager\
.current_tool.node.combine_if_action_used_among:
need_combine = true
else:
escoria.action_manager.current_tool = obj
elif default_action:
if escoria.inventory_manager.inventory_has(obj.global_id):
escoria.action_manager.current_action = \
obj.node.default_action_inventory
else:
escoria.action_manager.current_action = \
obj.node.default_action
elif escoria.action_manager.current_action in \
obj.node.combine_if_action_used_among:
escoria.action_manager.current_tool = obj
return need_combine
# Makes the player character walk towards the clicked item.
# Returns the resulting walk context.
#
# #### Parameters
#
# - obj: the object that was clicked
# - clicked_position: the Position2D of the input click
# - walk_fast: if true, the player will walk fast to the object
func _walk_towards_object(
obj: ESCObject,
clicked_position: Vector2,
walk_fast: bool
) -> ESCWalkContext:
var destination_position: Vector2
var dont_interact: bool = false
# If clicked object is interactive, get destination position from it.
if escoria.object_manager.get_object(obj.global_id).interactive:
if obj.node.get_interact_position() != null:
destination_position = obj.node.get_interact_position()
else:
destination_position = obj.node.position
else:
destination_position = clicked_position
dont_interact = true
# Create walk context
var walk_context = ESCWalkContext.new(
obj,
destination_position,
walk_fast,
dont_interact
)
# Walk towards the clicked object
escoria.main.current_scene.player.walk_to(destination_position,
walk_context)
# Wait for the player to arrive before continuing with action.
var context: ESCWalkContext = yield(
escoria.main.current_scene.player,
"arrived"
)
escoria.logger.info("Context arrived: %s" % context)
# Confirm that reached item was the one user clicked in the first place.
# Don't interact if that is not the case.
if (context.target_object and context.target_object.\
global_id != walk_context.\
target_object.global_id) or \
(context.target_position != walk_context.target_position):
walk_context.dont_interact_on_arrival = true
return context

View File

@@ -10,15 +10,20 @@ var target_object: ESCObject = null
# The target position
var target_position: Vector2 = Vector2()
# Wether to move fast
# Whether to move fast
var fast: bool
# Whether an interaction should NOT happen after walk reaches destination
var dont_interact_on_arrival: bool
func _init(
p_target_object: ESCObject,
p_target_position: Vector2,
p_fast: bool
p_fast: bool,
p_dont_interact_on_arrival: bool
):
target_object = p_target_object
target_position = p_target_position
fast = p_fast
dont_interact_on_arrival = p_dont_interact_on_arrival

View File

@@ -80,6 +80,10 @@ var inputs_manager: ESCInputsManager
# Savegames and settings manager
var save_manager: ESCSaveManager
# The controller in charge of converting an action verb on a game object
# into an actual action
var controller: ESCController
# Initialize various objects
func _init():
@@ -97,6 +101,7 @@ func _init():
self.resource_cache.start()
self.save_manager = ESCSaveManager.new()
self.inputs_manager = ESCInputsManager.new()
self.controller = ESCController.new()
# Load settings
@@ -137,9 +142,13 @@ func do(action: String, params: Array = []) -> void:
"walk":
self.action_manager.clear_current_action()
var walk_fast = false
if params.size() > 2:
walk_fast = true if params[2] else false
# Check moving object.
if not self.object_manager.has(params[0]):
self.logger.report_errors(
if not escoria.object_manager.has(params[0]):
escoria.logger.report_errors(
"escoria.gd:do()",
[
"Walk action requested on inexisting " + \
@@ -148,53 +157,26 @@ func do(action: String, params: Array = []) -> void:
)
return
var moving_obj = self.object_manager.get_object(params[0])\
.node
var moving_obj = escoria.object_manager.get_object(params[0])
var target
# Walk to Position2D.
if params[1] is Vector2:
var target_position = params[1]
var is_fast: bool = false
if params.size() > 2 and params[2] == true:
is_fast = true
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(
if params[1] is String:
if not escoria.object_manager.has(params[1]):
escoria.logger.report_errors(
"escoria.gd:do()",
[
"Walk action requested TOWARDS " +\
"inexisting object: %s" % params[1]
"Walk action requested to inexisting " + \
"object: %s " % params[1]
]
)
return
var object = self.object_manager.get_object(params[1])
if object:
var target_position: Vector2
if object.node is ESCLocation:
target_position = object.node.global_position
else:
target_position = object.node.interact_position
var is_fast: bool = false
if params.size() > 2 and params[2] == true:
is_fast = true
var walk_context = ESCWalkContext.new(
object,
Vector2(),
is_fast
)
moving_obj.walk_to(target_position, walk_context)
target = escoria.object_manager.get_object(params[1])
elif params[1] is Vector2:
target = params[1]
self.controller.perform_walk(moving_obj, target, walk_fast)
"item_left_click":
if params[0] is String:
self.logger.info(
@@ -202,7 +184,7 @@ func do(action: String, params: Array = []) -> void:
[params[0]]
)
var item = self.object_manager.get_object(params[0])
_ev_left_click_on_item(item, params[1])
self.controller.perform_inputevent_on_object(item, params[1])
"item_right_click":
if params[0] is String:
@@ -211,7 +193,7 @@ func do(action: String, params: Array = []) -> void:
[params[0]]
)
var item = self.object_manager.get_object(params[0])
_ev_left_click_on_item(item, params[1], true)
self.controller.perform_inputevent_on_object(item, params[1], true)
"trigger_in":
var trigger_id = params[0]
@@ -248,124 +230,6 @@ func do(action: String, params: Array = []) -> void:
pass
# Event handler when an object/item was clicked
#
# #### 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
if self.action_manager.current_action:
if self.action_manager.current_tool:
if self.action_manager.current_action in self.action_manager\
.current_tool.node.combine_if_action_used_among:
need_combine = true
else:
self.action_manager.current_tool = obj
else:
if default_action:
if self.inventory_manager.inventory_has(obj.global_id):
self.action_manager.current_action = \
obj.node.default_action_inventory
else:
self.action_manager.current_action = \
obj.node.default_action
elif self.action_manager.current_action in \
obj.node.combine_if_action_used_among:
self.action_manager.current_tool = obj
# 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
# Create walk context
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.node.get_interact_position() != null:
destination_position = obj.node.get_interact_position()
clicked_object_has_interact_position = true
else:
destination_position = obj.node.position
else:
destination_position = event.position
dont_interact = true
main.current_scene.player.walk_to(
destination_position,
walk_context
)
# Wait for the player to arrive before continuing with action.
var context: ESCWalkContext = yield(
main.current_scene.player,
"arrived"
)
self.logger.info("Context arrived: %s" % context)
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:
return
var player_global_pos = main.current_scene.player.global_position
var clicked_position = event.position
# If player has arrived at the position he was supposed to reach so he can interact
if player_global_pos == destination_position:
# Manage exits
if obj.node.is_exit and self.action_manager.current_action == "" \
or self.action_manager.current_action == "walk":
self.action_manager.activate("exit_scene", obj)
else:
# Manage movements towards object before activating it
if self.action_manager.current_action == "" \
or self.action_manager.current_action == "walk":
if destination_position != clicked_position \
and not inventory_manager.inventory_has(obj.global_id):
self.action_manager.activate("arrived", obj)
# Manage action on object
elif self.action_manager.current_action != "" and \
self.action_manager.current_action != "walk":
# If apply_interact, perform combine between items
if need_combine:
self.action_manager.activate(
self.action_manager.current_action,
self.action_manager.current_tool,
obj
)
else:
self.action_manager.activate(
self.action_manager.current_action,
obj
)
# Apply the loaded settings
#

18
docs/api/ESCController.md Normal file
View File

@@ -0,0 +1,18 @@
<!-- Auto-generated from JSON by GDScript docs maker. Do not edit this document directly. -->
# ESCController
## Method Descriptions
### perform\_walk
```gdscript
func perform_walk(moving_obj: ESCObject, destination, is_fast: bool = false)
```
### perform\_inputevent\_on\_object
```gdscript
func perform_inputevent_on_object(obj: ESCObject, event: InputEvent, default_action: bool = false)
```

View File

@@ -57,6 +57,14 @@ The global id fo the topmost item from the hover_stack
## Method Descriptions
### register\_core
```gdscript
func register_core()
```
Register core signals (from escoria.gd)
### register\_inventory\_item
```gdscript

View File

@@ -33,13 +33,21 @@ The target position
var fast: bool
```
Wether to move fast
Whether to move fast
### dont\_interact\_on\_arrival
```gdscript
var dont_interact_on_arrival: bool
```
Whether an interaction should NOT happen after walk reaches destination
## Method Descriptions
### \_init
```gdscript
func _init(p_target_object: ESCObject, p_target_position: Vector2, p_fast: bool)
func _init(p_target_object: ESCObject, p_target_position: Vector2, p_fast: bool, p_dont_interact_on_arrival: bool)
```

View File

@@ -193,6 +193,15 @@ var save_manager: ESCSaveManager
Savegames and settings manager
### controller
```gdscript
var controller: ESCController
```
The controller in charge of converting an action verb on a game object
into an actual action
## Method Descriptions
### new\_game
@@ -219,12 +228,14 @@ Run a generic action
### set\_game\_paused
```gdscript
func set_game_paused()
func set_game_paused(p_paused: bool)
```
### set\_game\_unpaused
Pauses or unpause the game
```gdscript
func set_game_unpaused()
```
#### Parameters
- p_paused: if true, pauses the game. If false, unpauses the game.
## Signals
- signal request_pause_menu(): Signal sent when pause menu has to be displayed

View File

@@ -9,202 +9,202 @@
[ext_resource path="res://game/characters/mark/png/mark_talk_right.png" type="Texture" id=7]
[sub_resource type="AtlasTexture" id=1]
atlas = ExtResource( 4 )
region = Rect2( 120, 0, 24, 70 )
atlas = ExtResource( 2 )
region = Rect2( 0, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=2]
atlas = ExtResource( 2 )
region = Rect2( 0, 0, 24, 70 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=3]
atlas = ExtResource( 2 )
region = Rect2( 24, 0, 24, 70 )
region = Rect2( 48, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=4]
atlas = ExtResource( 2 )
atlas = ExtResource( 4 )
region = Rect2( 48, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=5]
atlas = ExtResource( 4 )
region = Rect2( 48, 0, 24, 70 )
atlas = ExtResource( 7 )
region = Rect2( 0, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=6]
atlas = ExtResource( 7 )
region = Rect2( 0, 0, 24, 70 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=7]
atlas = ExtResource( 7 )
region = Rect2( 24, 0, 24, 70 )
region = Rect2( 48, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=8]
atlas = ExtResource( 7 )
region = Rect2( 48, 0, 24, 70 )
region = Rect2( 72, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=9]
atlas = ExtResource( 7 )
region = Rect2( 72, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=10]
atlas = ExtResource( 7 )
region = Rect2( 96, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=11]
[sub_resource type="AtlasTexture" id=10]
atlas = ExtResource( 4 )
region = Rect2( 144, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=12]
[sub_resource type="AtlasTexture" id=11]
atlas = ExtResource( 4 )
region = Rect2( 168, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=13]
[sub_resource type="AtlasTexture" id=12]
atlas = ExtResource( 4 )
region = Rect2( 192, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=14]
[sub_resource type="AtlasTexture" id=13]
atlas = ExtResource( 4 )
region = Rect2( 216, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=15]
[sub_resource type="AtlasTexture" id=14]
atlas = ExtResource( 4 )
region = Rect2( 240, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=16]
[sub_resource type="AtlasTexture" id=15]
atlas = ExtResource( 4 )
region = Rect2( 264, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=17]
[sub_resource type="AtlasTexture" id=16]
atlas = ExtResource( 4 )
region = Rect2( 288, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=18]
[sub_resource type="AtlasTexture" id=17]
atlas = ExtResource( 4 )
region = Rect2( 312, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=19]
[sub_resource type="AtlasTexture" id=18]
atlas = ExtResource( 4 )
region = Rect2( 0, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=20]
[sub_resource type="AtlasTexture" id=19]
atlas = ExtResource( 4 )
region = Rect2( 336, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=21]
[sub_resource type="AtlasTexture" id=20]
atlas = ExtResource( 4 )
region = Rect2( 360, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=22]
[sub_resource type="AtlasTexture" id=21]
atlas = ExtResource( 4 )
region = Rect2( 384, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=23]
[sub_resource type="AtlasTexture" id=22]
atlas = ExtResource( 4 )
region = Rect2( 72, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=24]
[sub_resource type="AtlasTexture" id=23]
atlas = ExtResource( 4 )
region = Rect2( 96, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=25]
[sub_resource type="AtlasTexture" id=24]
atlas = ExtResource( 4 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=26]
[sub_resource type="AtlasTexture" id=25]
atlas = ExtResource( 5 )
region = Rect2( 0, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=26]
atlas = ExtResource( 5 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=27]
atlas = ExtResource( 5 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=28]
atlas = ExtResource( 5 )
region = Rect2( 48, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=29]
[sub_resource type="AtlasTexture" id=28]
atlas = ExtResource( 6 )
region = Rect2( 0, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=30]
[sub_resource type="AtlasTexture" id=29]
atlas = ExtResource( 6 )
region = Rect2( 24, 0, 24, 70 )
[sub_resource type="AtlasTexture" id=30]
atlas = ExtResource( 4 )
region = Rect2( 120, 0, 24, 70 )
[sub_resource type="SpriteFrames" id=31]
animations = [ {
"frames": [ SubResource( 1 ) ],
"loop": true,
"name": "idle_down_left",
"speed": 5.0
}, {
"frames": [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 3 ), SubResource( 4 ) ],
"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 2 ), SubResource( 3 ) ],
"loop": true,
"name": "speak_down",
"speed": 6.0
}, {
"frames": [ SubResource( 5 ) ],
"frames": [ SubResource( 4 ) ],
"loop": true,
"name": "idle_right",
"speed": 5.0
}, {
"frames": [ SubResource( 6 ), SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ) ],
"frames": [ SubResource( 5 ), SubResource( 6 ), SubResource( 7 ), SubResource( 8 ), SubResource( 9 ) ],
"loop": true,
"name": "speak_right",
"speed": 5.0
}, {
"frames": [ SubResource( 11 ), SubResource( 12 ), SubResource( 13 ), SubResource( 12 ) ],
"frames": [ SubResource( 10 ), SubResource( 11 ), SubResource( 12 ), SubResource( 11 ) ],
"loop": true,
"name": "walk_down",
"speed": 6.0
}, {
"frames": [ SubResource( 14 ), SubResource( 15 ), SubResource( 16 ), SubResource( 17 ), SubResource( 18 ) ],
"frames": [ SubResource( 13 ), SubResource( 14 ), SubResource( 15 ), SubResource( 16 ), SubResource( 17 ) ],
"loop": true,
"name": "walk_right",
"speed": 6.0
}, {
"frames": [ SubResource( 19 ) ],
"frames": [ SubResource( 18 ) ],
"loop": true,
"name": "idle_down",
"speed": 5.0
}, {
"frames": [ SubResource( 20 ), SubResource( 21 ), SubResource( 22 ), SubResource( 21 ) ],
"frames": [ SubResource( 19 ), SubResource( 20 ), SubResource( 21 ), SubResource( 20 ) ],
"loop": true,
"name": "walk_up",
"speed": 6.0
}, {
"frames": [ SubResource( 23 ) ],
"frames": [ SubResource( 22 ) ],
"loop": true,
"name": "idle_up",
"speed": 5.0
}, {
"frames": [ SubResource( 24 ) ],
"frames": [ SubResource( 23 ) ],
"loop": true,
"name": "idle_left",
"speed": 5.0
}, {
"frames": [ SubResource( 25 ) ],
"frames": [ SubResource( 24 ) ],
"loop": true,
"name": "idle_down_right",
"speed": 5.0
}, {
"frames": [ SubResource( 26 ), SubResource( 27 ), SubResource( 28 ) ],
"frames": [ SubResource( 25 ), SubResource( 26 ), SubResource( 27 ) ],
"loop": true,
"name": "speak_down_right",
"speed": 6.0
}, {
"frames": [ SubResource( 29 ), SubResource( 30 ), SubResource( 29 ), SubResource( 30 ), SubResource( 30 ) ],
"frames": [ SubResource( 28 ), SubResource( 29 ), SubResource( 28 ), SubResource( 29 ), SubResource( 29 ) ],
"loop": true,
"name": "speak_up",
"speed": 3.0
}, {
"frames": [ SubResource( 30 ) ],
"loop": true,
"name": "idle_down_left",
"speed": 5.0
} ]
[sub_resource type="CapsuleShape2D" id=32]
height = 0.0
[node name="mark" type="Area2D"]
pause_mode = 1
script = ExtResource( 1 )
global_id = "player"
is_movable = true
dialog_color = Color( 1, 1, 1, 1 )
animation_player_node = NodePath("sprite")
animations = ExtResource( 3 )
[node name="sprite" type="AnimatedSprite" parent="."]

View File

@@ -154,6 +154,11 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://addons/escoria-core/game/core-scripts/esc/types/esc_condition.gd"
}, {
"base": "Reference",
"class": "ESCController",
"language": "GDScript",
"path": "res://addons/escoria-core/game/core-scripts/esc_controller.gd"
}, {
"base": "ESCStatement",
"class": "ESCDialog",
"language": "GDScript",
@@ -504,6 +509,7 @@ _global_script_class_icons={
"ESCCommandRegistry": "",
"ESCCompiler": "",
"ESCCondition": "",
"ESCController": "",
"ESCDialog": "",
"ESCDialogOption": "",
"ESCDialogsPlayer": "",
@@ -648,6 +654,10 @@ switch_action_verb={
translations=PoolStringArray( "res://game/translations/game.en.translation", "res://game/translations/game.fr.translation", "res://game/translations/main_menu.en.translation", "res://game/translations/main_menu.fr.translation" )
[network]
limits/debugger_stdout/max_chars_per_second=99999999
[rendering]
environment/default_environment="res://default_env.tres"