Re-implemented turn_to command (#390)

* Re-implemented turn_to command

Fixes #385
Fixed a bug in esc_movable blocking player_orients_on_arrival for ESCLocation nodes

* docs: Automatic update of API docs

* Fixes

Co-authored-by: StraToN <StraToN@users.noreply.github.com>
This commit is contained in:
Julian Murgia
2021-09-09 22:57:03 +02:00
committed by GitHub
parent ad390a6f65
commit 0e6e8aa161
14 changed files with 148 additions and 102 deletions

View File

@@ -267,10 +267,9 @@ func walk_stop(pos: Vector2) -> void:
# If we're heading to an object and reached its interaction position, # If we're heading to an object and reached its interaction position,
# orient towards the defined interaction direction set on the object # orient towards the defined interaction direction set on the object
# (if any) # (if any), can be ESCItem or ESCLocation
if walk_context.target_object and \ if walk_context.target_object and \
walk_context.target_object.node.player_orients_on_arrival and \ walk_context.target_object.node.player_orients_on_arrival:
walk_context.target_object.interactive:
var orientation = walk_context.target_object.node.interaction_direction var orientation = walk_context.target_object.node.interaction_direction
last_dir = orientation last_dir = orientation
parent.get_animation_player().play( parent.get_animation_player().play(
@@ -488,6 +487,25 @@ func set_angle(deg: int, immediate = true) -> void:
update_terrain() update_terrain()
# Turns the character to face another item or character.
#
# #### Parameters
#
# - item_id id of the object to face.
# - immediate
# If true, direction is switched immediately. Else, successive
# animations are used so that the character turns to target angle.
func turn_to(item: Node, immediate = true) -> void:
set_angle(
wrapi(
rad2deg(parent.get_position().angle_to_point(item.get_position())),
0,
360
),
immediate
)
# Returns the angle that corresponds to the current direction of the object. # Returns the angle that corresponds to the current direction of the object.
func _get_angle() -> int: func _get_angle() -> int:
return parent.animations.dir_angles[last_dir].angle_start return parent.animations.dir_angles[last_dir].angle_start

View File

@@ -1,11 +1,6 @@
# `turn_to object degrees [immediate]` # `turn_to object object_to_face [immediate]`
# #
# Turns object to a degrees angle with a directions animation. # Turns object to face another object.
#
# 0 sets object facing forward, 90 sets it 90 degrees clockwise ("east") etc.
# When turning to the destination angle, animations are played if they're
# defined in animations. object must be player or interactive. degrees must
# be between [0, 360] or an error is reported.
# #
# Set immediate to true to show directly switch to the direction and not # Set immediate to true to show directly switch to the direction and not
# show intermediate angles # show intermediate angles
@@ -19,7 +14,7 @@ class_name TurnToCommand
func configure() -> ESCCommandArgumentDescriptor: func configure() -> ESCCommandArgumentDescriptor:
return ESCCommandArgumentDescriptor.new( return ESCCommandArgumentDescriptor.new(
2, 2,
[TYPE_STRING, TYPE_INT, TYPE_BOOL], [TYPE_STRING, TYPE_STRING, TYPE_BOOL],
[null, null, false] [null, null, false]
) )
@@ -34,11 +29,11 @@ func validate(arguments: Array):
] ]
) )
return false return false
if arguments[1] < 0 or arguments[1] > 360: if not escoria.object_manager.objects.has(arguments[1]):
escoria.logger.report_errors( escoria.logger.report_errors(
"turn_to: invalid degrees", "turn_to: invalid target object",
[ [
"Degree %d not between 0 and 360" % arguments[1] "Object with global id %s not found" % arguments[1]
] ]
) )
return false return false
@@ -48,8 +43,8 @@ func validate(arguments: Array):
# Run the command # Run the command
func run(command_params: Array) -> int: func run(command_params: Array) -> int:
(escoria.object_manager.get_object(command_params[0]).node as ESCItem)\ (escoria.object_manager.get_object(command_params[0]).node as ESCItem)\
.set_angle( .turn_to(
command_params[1], escoria.object_manager.get_object(command_params[1]).node,
command_params[2] command_params[2]
) )
return ESCExecution.RC_OK return ESCExecution.RC_OK

View File

@@ -41,8 +41,8 @@ func perform_walk(
target_position = destination.node.interact_position target_position = destination.node.interact_position
var walk_context = ESCWalkContext.new( var walk_context = ESCWalkContext.new(
destination.node, destination,
Vector2(), target_position,
is_fast, is_fast,
true true
) )

View File

@@ -231,6 +231,7 @@ func get_interact_position() -> Vector2:
for c in get_children(): for c in get_children():
if c is Position2D: if c is Position2D:
if c.get_owner() == self: if c.get_owner() == self:
interact_position = global_position
continue continue
interact_position = c.global_position interact_position = c.global_position
@@ -362,6 +363,17 @@ func set_angle(deg: int, immediate = true):
_movable.set_angle(deg, immediate) _movable.set_angle(deg, immediate)
# Turn to face another object
#
# #### Parameters
#
# - deg: The angle degree to set
# - immediate: Set the angle immediately. If false will show intermediate
# angles
func turn_to(object: Node, immediate = true):
_movable.turn_to(object, immediate)
# Play the talking animation # Play the talking animation
func start_talking(): func start_talking():
if get_animation_player().is_playing(): if get_animation_player().is_playing():

View File

@@ -67,6 +67,7 @@ func add_new_item_by_id(item_id: String) -> void:
var item_inventory_button = ( var item_inventory_button = (
escoria.object_manager.get_object(item_id).node as ESCItem escoria.object_manager.get_object(item_id).node as ESCItem
).inventory_item.duplicate() ).inventory_item.duplicate()
item_inventory_button.global_id = item_id
items_ids_in_inventory[item_id] = item_inventory_button items_ids_in_inventory[item_id] = item_inventory_button
get_node(inventory_ui_container).add_item(item_inventory_button) get_node(inventory_ui_container).add_item(item_inventory_button)

View File

@@ -362,6 +362,20 @@ Set the angle
#### Parameters #### Parameters
- deg: The angle degree to set
- immediate: Set the angle immediately. If false will show intermediate
angles
### turn\_to
```gdscript
func turn_to(object: Node, immediate = true)
```
Turn to face another object
#### Parameters
- deg: The angle degree to set - deg: The angle degree to set
- immediate: Set the angle immediately. If false will show intermediate - immediate: Set the angle immediately. If false will show intermediate
angles angles

View File

@@ -182,6 +182,21 @@ Sets character's angle and plays according animation.
If true, direction is switched immediately. Else, successive If true, direction is switched immediately. Else, successive
animations are used so that the character turns to target angle. animations are used so that the character turns to target angle.
### turn\_to
```gdscript
func turn_to(item: Node, immediate = true) -> void
```
Turns the character to face another item or character.
#### Parameters
- item_id id of the object to face.
- immediate
If true, direction is switched immediately. Else, successive
animations are used so that the character turns to target angle.
### get\_shortest\_way\_to\_dir ### get\_shortest\_way\_to\_dir
```gdscript ```gdscript

View File

@@ -6,14 +6,9 @@
## Description ## Description
`turn_to object degrees [immediate]` `turn_to object object_to_face [immediate]`
Turns object to a degrees angle with a directions animation. Turns object to face another object.
0 sets object facing forward, 90 sets it 90 degrees clockwise ("east") etc.
When turning to the destination angle, animations are played if they're
defined in animations. object must be player or interactive. degrees must
be between [0, 360] or an error is reported.
Set immediate to true to show directly switch to the direction and not Set immediate to true to show directly switch to the direction and not
show intermediate angles show intermediate angles

View File

@@ -351,14 +351,9 @@ Sets the position of object1 to the position (x,y).
#### <a name="TransitionCommand.md"></a>`transition transition_name in|out` [API-Doc](api/TransitionCommand.md) #### <a name="TransitionCommand.md"></a>`transition transition_name in|out` [API-Doc](api/TransitionCommand.md)
Performs a transition in our out manually. Performs a transition in our out manually.
#### <a name="TurnToCommand.md"></a>`turn_to object degrees [immediate]` [API-Doc](api/TurnToCommand.md) #### <a name="TurnToCommand.md"></a>`turn_to object object_to_face [immediate]` [API-Doc](api/TurnToCommand.md)
Turns object to a degrees angle with a directions animation. Turns object to face another object.
0 sets object facing forward, 90 sets it 90 degrees clockwise ("east") etc.
When turning to the destination angle, animations are played if they're
defined in animations. object must be player or interactive. degrees must
be between [0, 360] or an error is reported.
Set immediate to true to show directly switch to the direction and not Set immediate to true to show directly switch to the direction and not
show intermediate angles show intermediate angles

View File

@@ -8,6 +8,7 @@
extents = Vector2( 28.3873, 74.7806 ) extents = Vector2( 28.3873, 74.7806 )
[node name="bottle" type="Area2D"] [node name="bottle" type="Area2D"]
pause_mode = 1
z_index = 1 z_index = 1
script = ExtResource( 3 ) script = ExtResource( 3 )
global_id = "r9_bottle" global_id = "r9_bottle"
@@ -19,6 +20,7 @@ combine_if_action_used_among = PoolStringArray( "use" )
use_from_inventory_only = true use_from_inventory_only = true
inventory_item_scene_file = ExtResource( 2 ) inventory_item_scene_file = ExtResource( 2 )
dialog_color = Color( 1, 1, 1, 1 ) dialog_color = Color( 1, 1, 1, 1 )
animations = null
[node name="sprite" type="Sprite" parent="."] [node name="sprite" type="Sprite" parent="."]
texture = ExtResource( 1 ) texture = ExtResource( 1 )

View File

@@ -17,10 +17,14 @@ set_sound_state _music res://game/sfx/contemplation.ogg true
set_global room1_visited true set_global room1_visited true
set_global dialog_advance 0 set_global dialog_advance 0
set_global dialog_popup_advance 0 set_global dialog_popup_advance 0
walk player r1_destination_point walk_block player r1_destination_point
wait 2 wait 2
walk player r1_destination_point2 walk_block player r1_destination_point2
wait 2 wait 2
set_angle player 225 false set_angle player 225 false
wait 2
walk_block player r1_destination_point3
wait 1
turn_to player r1_r_exit false

View File

@@ -0,0 +1,27 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_item.gd" type="Script" id=1]
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_location.gd" type="Script" id=2]
[node name="item" type="Area2D"]
pause_mode = 1
script = ExtResource( 1 )
tooltip_name = "Item on the wall"
default_action = "look"
dialog_color = Color( 1, 1, 1, 1 )
animations = null
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
position = Vector2( -652.737, -162.85 )
polygon = PoolVector2Array( 635.586, 253.345, 568.928, 60.1716, 709.047, 120.028, 699.524, 247.903 )
[node name="Line2D" type="Line2D" parent="."]
position = Vector2( -655.406, -430.678 )
points = PoolVector2Array( 634.097, 516.751, 578.861, 335.008, 701.805, 386.68, 696.459, 509.624, 634.097, 516.751 )
__meta__ = {
"_editor_description_": ""
}
[node name="ESCLocation" type="Position2D" parent="."]
position = Vector2( 0, 236.267 )
script = ExtResource( 2 )

View File

@@ -18,8 +18,9 @@ dialog_color = Color( 1, 1, 1, 1 )
animations = null animations = null
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
position = Vector2( -1229.68, -223.006 )
polygon = PoolVector2Array( 1177.94, 348.61, 1175.95, 45.3759, 1276.06, 92.0953, 1277.95, 399.407 ) polygon = PoolVector2Array( 1177.94, 348.61, 1175.95, 45.3759, 1276.06, 92.0953, 1277.95, 399.407 )
[node name="Position2D" type="Position2D" parent="."] [node name="Position2D" type="Position2D" parent="."]
position = Vector2( 1225.47, 353.99 ) position = Vector2( -0.432617, 124.685 )
script = ExtResource( 2 ) script = ExtResource( 2 )

View File

@@ -4,10 +4,10 @@
[ext_resource path="res://game/rooms/room01/background.tscn" type="PackedScene" id=2] [ext_resource path="res://game/rooms/room01/background.tscn" type="PackedScene" id=2]
[ext_resource path="res://game/ui/commons/fonts/caslonantique.tres" type="DynamicFont" id=3] [ext_resource path="res://game/ui/commons/fonts/caslonantique.tres" type="DynamicFont" id=3]
[ext_resource path="res://game/characters/mark/mark.tscn" type="PackedScene" id=4] [ext_resource path="res://game/characters/mark/mark.tscn" type="PackedScene" id=4]
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_item.gd" type="Script" id=5]
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_room.gd" type="Script" id=6] [ext_resource path="res://addons/escoria-core/game/core-scripts/esc_room.gd" type="Script" id=6]
[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_location.gd" type="Script" id=7] [ext_resource path="res://addons/escoria-core/game/core-scripts/esc_location.gd" type="Script" id=7]
[ext_resource path="res://game/rooms/room01/r_door.tscn" type="PackedScene" id=8] [ext_resource path="res://game/rooms/room01/r_door.tscn" type="PackedScene" id=8]
[ext_resource path="res://game/rooms/room01/item.tscn" type="PackedScene" id=9]
[node name="room1" type="Node2D"] [node name="room1" type="Node2D"]
script = ExtResource( 6 ) script = ExtResource( 6 )
@@ -49,99 +49,66 @@ position = Vector2( 3.5636, 0 )
[node name="Hotspots" type="Node2D" parent="."] [node name="Hotspots" type="Node2D" parent="."]
[node name="r_door" parent="Hotspots" instance=ExtResource( 8 )] [node name="r_door" parent="Hotspots" instance=ExtResource( 8 )]
position = Vector2( 1225.9, 217.966 )
[node name="ESCLocation" type="Position2D" parent="Hotspots/r_door"] [node name="ESCLocation" type="Position2D" parent="Hotspots/r_door"]
position = Vector2( 1229.68, 355.298 ) position = Vector2( 1.35498, 136.453 )
script = ExtResource( 7 ) script = ExtResource( 7 )
[node name="item" type="Area2D" parent="Hotspots"] [node name="item" parent="Hotspots" instance=ExtResource( 9 )]
pause_mode = 1 position = Vector2( 480.542, 146.832 )
position = Vector2( -217.19, 0 )
script = ExtResource( 5 )
global_id = "r1_wall_item1" global_id = "r1_wall_item1"
esc_script = "res://game/rooms/room01/esc/wall_item.esc" esc_script = "res://game/rooms/room01/esc/wall_item.esc"
tooltip_name = "Item on the wall"
default_action = "look"
dialog_color = Color( 1, 1, 1, 1 )
animations = null
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Hotspots/item"]
polygon = PoolVector2Array( 635.586, 253.345, 568.928, 60.1716, 709.047, 120.028, 699.524, 247.903 )
[node name="Position2D" type="Position2D" parent="Hotspots/item"]
position = Vector2( 671.798, 373.035 )
script = ExtResource( 7 )
global_id = "r1_left_object_interaction"
[node name="Line2D" type="Line2D" parent="Hotspots/item"]
position = Vector2( 0, -267.828 )
points = PoolVector2Array( 634.097, 516.751, 578.861, 335.008, 701.805, 386.68, 696.459, 509.624, 634.097, 516.751 )
__meta__ = {
"_editor_description_": ""
}
[node name="Label" type="Label" parent="Hotspots/item"] [node name="Label" type="Label" parent="Hotspots/item"]
margin_left = 563.635 margin_left = -105.12
margin_top = 265.925 margin_top = 121.762
margin_right = 759.635 margin_right = 122.88
margin_bottom = 279.925 margin_bottom = 142.762
custom_fonts/font = ExtResource( 3 ) custom_fonts/font = ExtResource( 3 )
text = "Character talks with text above" text = "Character talks with text above"
__meta__ = { __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false,
}
[node name="item2" type="Area2D" parent="Hotspots"]
pause_mode = 1
position = Vector2( 189.644, 0 )
script = ExtResource( 5 )
global_id = "r1_wall_item2"
esc_script = "res://game/rooms/room01/esc/wall_item_popupdialog.esc"
tooltip_name = "Item on the wall"
default_action = "look"
dialog_color = Color( 1, 1, 1, 1 )
animations = null
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Hotspots/item2"]
polygon = PoolVector2Array( 635.586, 253.345, 568.928, 60.1716, 709.047, 120.028, 699.524, 247.903 )
[node name="Position2D" type="Position2D" parent="Hotspots/item2"]
position = Vector2( 671.798, 373.035 )
script = ExtResource( 7 )
global_id = "r2_left_object_interaction"
[node name="Line2D" type="Line2D" parent="Hotspots/item2"]
position = Vector2( -4.23779, -267.828 )
points = PoolVector2Array( 634.097, 516.751, 578.861, 335.008, 701.805, 386.68, 696.459, 509.624, 634.097, 516.751 )
__meta__ = {
"_editor_description_": "" "_editor_description_": ""
} }
[node name="Label2" type="Label" parent="Hotspots/item2"] [node name="item2" parent="Hotspots" instance=ExtResource( 9 )]
margin_left = 556.218 position = Vector2( 839.614, 146.832 )
margin_top = 265.925 global_id = "r1_wall_item2"
margin_right = 752.218 esc_script = "res://game/rooms/room01/esc/wall_item_popupdialog.esc"
margin_bottom = 279.925
[node name="Label" type="Label" parent="Hotspots/item2"]
margin_left = -105.12
margin_top = 121.762
margin_right = 122.88
margin_bottom = 142.762
custom_fonts/font = ExtResource( 3 ) custom_fonts/font = ExtResource( 3 )
text = "Character talks with popup" text = "Character talks with popup"
__meta__ = { __meta__ = {
"_edit_use_anchors_": false "_edit_use_anchors_": false,
"_editor_description_": ""
} }
[node name="player_start" type="Position2D" parent="."] [node name="player_start" type="Position2D" parent="."]
position = Vector2( 653.761, 443.306 ) position = Vector2( 172.471, 434.487 )
script = ExtResource( 7 ) script = ExtResource( 7 )
global_id = "r1_start" global_id = "r1_start"
is_start_location = true is_start_location = true
[node name="destination_point" type="Position2D" parent="."] [node name="orients_down_on_arrival" type="Position2D" parent="."]
position = Vector2( 476.984, 487.146 ) position = Vector2( 400.129, 432.969 )
script = ExtResource( 7 ) script = ExtResource( 7 )
global_id = "r1_destination_point" global_id = "r1_destination_point"
interaction_direction = 4 interaction_direction = 4
[node name="destination_point2" type="Position2D" parent="."] [node name="set_angle_by_esc" type="Position2D" parent="."]
position = Vector2( 994.586, 458.862 ) position = Vector2( 934.11, 502.959 )
script = ExtResource( 7 ) script = ExtResource( 7 )
global_id = "r1_destination_point2" global_id = "r1_destination_point2"
player_orients_on_arrival = false player_orients_on_arrival = false
[node name="turn_to_r_door_by_esc" type="Position2D" parent="."]
position = Vector2( 660.468, 381.489 )
script = ExtResource( 7 )
global_id = "r1_destination_point3"
player_orients_on_arrival = false