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:
@@ -267,10 +267,9 @@ func walk_stop(pos: Vector2) -> void:
|
||||
|
||||
# If we're heading to an object and reached its interaction position,
|
||||
# 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 \
|
||||
walk_context.target_object.node.player_orients_on_arrival and \
|
||||
walk_context.target_object.interactive:
|
||||
walk_context.target_object.node.player_orients_on_arrival:
|
||||
var orientation = walk_context.target_object.node.interaction_direction
|
||||
last_dir = orientation
|
||||
parent.get_animation_player().play(
|
||||
@@ -488,6 +487,25 @@ func set_angle(deg: int, immediate = true) -> void:
|
||||
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.
|
||||
func _get_angle() -> int:
|
||||
return parent.animations.dir_angles[last_dir].angle_start
|
||||
|
||||
@@ -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.
|
||||
#
|
||||
# 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.
|
||||
# Turns object to face another object.
|
||||
#
|
||||
# Set immediate to true to show directly switch to the direction and not
|
||||
# show intermediate angles
|
||||
@@ -19,7 +14,7 @@ class_name TurnToCommand
|
||||
func configure() -> ESCCommandArgumentDescriptor:
|
||||
return ESCCommandArgumentDescriptor.new(
|
||||
2,
|
||||
[TYPE_STRING, TYPE_INT, TYPE_BOOL],
|
||||
[TYPE_STRING, TYPE_STRING, TYPE_BOOL],
|
||||
[null, null, false]
|
||||
)
|
||||
|
||||
@@ -34,11 +29,11 @@ func validate(arguments: Array):
|
||||
]
|
||||
)
|
||||
return false
|
||||
if arguments[1] < 0 or arguments[1] > 360:
|
||||
if not escoria.object_manager.objects.has(arguments[1]):
|
||||
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
|
||||
@@ -48,8 +43,8 @@ func validate(arguments: Array):
|
||||
# Run the command
|
||||
func run(command_params: Array) -> int:
|
||||
(escoria.object_manager.get_object(command_params[0]).node as ESCItem)\
|
||||
.set_angle(
|
||||
command_params[1],
|
||||
.turn_to(
|
||||
escoria.object_manager.get_object(command_params[1]).node,
|
||||
command_params[2]
|
||||
)
|
||||
return ESCExecution.RC_OK
|
||||
|
||||
@@ -41,8 +41,8 @@ func perform_walk(
|
||||
target_position = destination.node.interact_position
|
||||
|
||||
var walk_context = ESCWalkContext.new(
|
||||
destination.node,
|
||||
Vector2(),
|
||||
destination,
|
||||
target_position,
|
||||
is_fast,
|
||||
true
|
||||
)
|
||||
|
||||
@@ -231,6 +231,7 @@ func get_interact_position() -> Vector2:
|
||||
for c in get_children():
|
||||
if c is Position2D:
|
||||
if c.get_owner() == self:
|
||||
interact_position = global_position
|
||||
continue
|
||||
interact_position = c.global_position
|
||||
|
||||
@@ -360,7 +361,18 @@ func get_sprite() -> Node:
|
||||
# angles
|
||||
func set_angle(deg: int, immediate = true):
|
||||
_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
|
||||
func start_talking():
|
||||
|
||||
@@ -67,6 +67,7 @@ func add_new_item_by_id(item_id: String) -> void:
|
||||
var item_inventory_button = (
|
||||
escoria.object_manager.get_object(item_id).node as ESCItem
|
||||
).inventory_item.duplicate()
|
||||
item_inventory_button.global_id = item_id
|
||||
items_ids_in_inventory[item_id] = item_inventory_button
|
||||
get_node(inventory_ui_container).add_item(item_inventory_button)
|
||||
|
||||
|
||||
@@ -362,6 +362,20 @@ Set the angle
|
||||
|
||||
#### 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
|
||||
- immediate: Set the angle immediately. If false will show intermediate
|
||||
angles
|
||||
|
||||
@@ -182,6 +182,21 @@ Sets character's angle and plays according animation.
|
||||
If true, direction is switched immediately. Else, successive
|
||||
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
|
||||
|
||||
```gdscript
|
||||
|
||||
@@ -6,14 +6,9 @@
|
||||
|
||||
## Description
|
||||
|
||||
`turn_to object degrees [immediate]`
|
||||
`turn_to object object_to_face [immediate]`
|
||||
|
||||
Turns object to a degrees angle with a directions animation.
|
||||
|
||||
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.
|
||||
Turns object to face another object.
|
||||
|
||||
Set immediate to true to show directly switch to the direction and not
|
||||
show intermediate angles
|
||||
|
||||
@@ -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)
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
Turns object to face another object.
|
||||
|
||||
Set immediate to true to show directly switch to the direction and not
|
||||
show intermediate angles
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
extents = Vector2( 28.3873, 74.7806 )
|
||||
|
||||
[node name="bottle" type="Area2D"]
|
||||
pause_mode = 1
|
||||
z_index = 1
|
||||
script = ExtResource( 3 )
|
||||
global_id = "r9_bottle"
|
||||
@@ -19,6 +20,7 @@ combine_if_action_used_among = PoolStringArray( "use" )
|
||||
use_from_inventory_only = true
|
||||
inventory_item_scene_file = ExtResource( 2 )
|
||||
dialog_color = Color( 1, 1, 1, 1 )
|
||||
animations = null
|
||||
|
||||
[node name="sprite" type="Sprite" parent="."]
|
||||
texture = ExtResource( 1 )
|
||||
|
||||
@@ -17,10 +17,14 @@ set_sound_state _music res://game/sfx/contemplation.ogg true
|
||||
set_global room1_visited true
|
||||
set_global dialog_advance 0
|
||||
set_global dialog_popup_advance 0
|
||||
walk player r1_destination_point
|
||||
walk_block player r1_destination_point
|
||||
wait 2
|
||||
walk player r1_destination_point2
|
||||
walk_block player r1_destination_point2
|
||||
wait 2
|
||||
set_angle player 225 false
|
||||
wait 2
|
||||
walk_block player r1_destination_point3
|
||||
wait 1
|
||||
turn_to player r1_r_exit false
|
||||
|
||||
|
||||
|
||||
27
game/rooms/room01/item.tscn
Normal file
27
game/rooms/room01/item.tscn
Normal 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 )
|
||||
@@ -18,8 +18,9 @@ dialog_color = Color( 1, 1, 1, 1 )
|
||||
animations = null
|
||||
|
||||
[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 )
|
||||
|
||||
[node name="Position2D" type="Position2D" parent="."]
|
||||
position = Vector2( 1225.47, 353.99 )
|
||||
position = Vector2( -0.432617, 124.685 )
|
||||
script = ExtResource( 2 )
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
[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/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_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/item.tscn" type="PackedScene" id=9]
|
||||
|
||||
[node name="room1" type="Node2D"]
|
||||
script = ExtResource( 6 )
|
||||
@@ -49,99 +49,66 @@ position = Vector2( 3.5636, 0 )
|
||||
[node name="Hotspots" type="Node2D" parent="."]
|
||||
|
||||
[node name="r_door" parent="Hotspots" instance=ExtResource( 8 )]
|
||||
position = Vector2( 1225.9, 217.966 )
|
||||
|
||||
[node name="ESCLocation" type="Position2D" parent="Hotspots/r_door"]
|
||||
position = Vector2( 1229.68, 355.298 )
|
||||
position = Vector2( 1.35498, 136.453 )
|
||||
script = ExtResource( 7 )
|
||||
|
||||
[node name="item" type="Area2D" parent="Hotspots"]
|
||||
pause_mode = 1
|
||||
position = Vector2( -217.19, 0 )
|
||||
script = ExtResource( 5 )
|
||||
[node name="item" parent="Hotspots" instance=ExtResource( 9 )]
|
||||
position = Vector2( 480.542, 146.832 )
|
||||
global_id = "r1_wall_item1"
|
||||
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"]
|
||||
margin_left = 563.635
|
||||
margin_top = 265.925
|
||||
margin_right = 759.635
|
||||
margin_bottom = 279.925
|
||||
margin_left = -105.12
|
||||
margin_top = 121.762
|
||||
margin_right = 122.88
|
||||
margin_bottom = 142.762
|
||||
custom_fonts/font = ExtResource( 3 )
|
||||
text = "Character talks with text above"
|
||||
__meta__ = {
|
||||
"_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__ = {
|
||||
"_edit_use_anchors_": false,
|
||||
"_editor_description_": ""
|
||||
}
|
||||
|
||||
[node name="Label2" type="Label" parent="Hotspots/item2"]
|
||||
margin_left = 556.218
|
||||
margin_top = 265.925
|
||||
margin_right = 752.218
|
||||
margin_bottom = 279.925
|
||||
[node name="item2" parent="Hotspots" instance=ExtResource( 9 )]
|
||||
position = Vector2( 839.614, 146.832 )
|
||||
global_id = "r1_wall_item2"
|
||||
esc_script = "res://game/rooms/room01/esc/wall_item_popupdialog.esc"
|
||||
|
||||
[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 )
|
||||
text = "Character talks with popup"
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
"_edit_use_anchors_": false,
|
||||
"_editor_description_": ""
|
||||
}
|
||||
|
||||
[node name="player_start" type="Position2D" parent="."]
|
||||
position = Vector2( 653.761, 443.306 )
|
||||
position = Vector2( 172.471, 434.487 )
|
||||
script = ExtResource( 7 )
|
||||
global_id = "r1_start"
|
||||
is_start_location = true
|
||||
|
||||
[node name="destination_point" type="Position2D" parent="."]
|
||||
position = Vector2( 476.984, 487.146 )
|
||||
[node name="orients_down_on_arrival" type="Position2D" parent="."]
|
||||
position = Vector2( 400.129, 432.969 )
|
||||
script = ExtResource( 7 )
|
||||
global_id = "r1_destination_point"
|
||||
interaction_direction = 4
|
||||
|
||||
[node name="destination_point2" type="Position2D" parent="."]
|
||||
position = Vector2( 994.586, 458.862 )
|
||||
[node name="set_angle_by_esc" type="Position2D" parent="."]
|
||||
position = Vector2( 934.11, 502.959 )
|
||||
script = ExtResource( 7 )
|
||||
global_id = "r1_destination_point2"
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user