From c9cbd2db803d45737633da1561782baf64dff56f Mon Sep 17 00:00:00 2001 From: Julian Murgia Date: Sun, 21 Nov 2021 22:21:30 +0100 Subject: [PATCH] Fixes ESCMoving angles calculation to make it work with 2-dir animations (#454) --- .../core-scripts/behaviors/esc_movable.gd | 54 ++-- game/characters/mark/mark.tscn | 186 +++++++------- game/characters/mark2dir/mark.esc | 3 + game/characters/mark2dir/mark2dir.tscn | 232 ++++++++++++++++++ game/characters/mark2dir/mark_animations.tres | 52 ++++ game/characters/mark2dir/mark_talk.tscn | 34 +++ game/characters/mark2dir/png/mark.png | Bin 0 -> 5792 bytes .../mark2dir/png/mark_talk_down.png | Bin 0 -> 1117 bytes .../mark2dir/png/mark_talk_down_right.png | Bin 0 -> 1177 bytes .../mark2dir/png/mark_talk_right.png | Bin 0 -> 1058 bytes game/characters/mark2dir/png/mark_talk_up.png | Bin 0 -> 666 bytes .../mark2dir/sfx/footstep_concrete_000.ogg | Bin 0 -> 5808 bytes game/rooms/room15/room15.tscn | 2 +- 13 files changed, 435 insertions(+), 128 deletions(-) create mode 100644 game/characters/mark2dir/mark.esc create mode 100644 game/characters/mark2dir/mark2dir.tscn create mode 100644 game/characters/mark2dir/mark_animations.tres create mode 100644 game/characters/mark2dir/mark_talk.tscn create mode 100644 game/characters/mark2dir/png/mark.png create mode 100644 game/characters/mark2dir/png/mark_talk_down.png create mode 100644 game/characters/mark2dir/png/mark_talk_down_right.png create mode 100644 game/characters/mark2dir/png/mark_talk_right.png create mode 100644 game/characters/mark2dir/png/mark_talk_up.png create mode 100644 game/characters/mark2dir/sfx/footstep_concrete_000.ogg diff --git a/addons/escoria-core/game/core-scripts/behaviors/esc_movable.gd b/addons/escoria-core/game/core-scripts/behaviors/esc_movable.gd index ca9e3ee4..f58fcda0 100644 --- a/addons/escoria-core/game/core-scripts/behaviors/esc_movable.gd +++ b/addons/escoria-core/game/core-scripts/behaviors/esc_movable.gd @@ -395,48 +395,34 @@ func _is_angle_in_interval( angle = 360 var start_angle = wrapi(direction_angle.angle_start, 0, 360) var angle_area = direction_angle.angle_size - var end_angle = wrapi(direction_angle.angle_start + angle_area, 0, 360) + var end_angle = direction_angle.angle_start + angle_area + if start_angle >= 0 and end_angle == 0: + end_angle = 360 - # First we want to test if angle is in upper part of the clock. - # If it is, we add 180 to all angles so that we test in lower part of the - # clock, so we avoid messing with calculations wrapping around 360° and 0°. - if _angle_is_between_270_to_90(angle): - return _angle_is_between( - angle + 180, - start_angle + 180, - start_angle + angle_area + 180 - ) - else: - return _angle_is_between(angle, start_angle, end_angle) + return _angle_is_between(angle, start_angle, end_angle) -# Returns true if angle is in upper part of trigonometric circle -# ie. between 0 and PI -# ie. between 270° and 90° -# ie. between 9 o'clock and 3 o'clock +# Returns true if angle is between start angle and end angle. # # #### Parameters # -# - angle: the angle in degrees -func _angle_is_between_270_to_90(angle: float) -> bool: - return (angle >= 270 and angle <= 360) or (angle >= 0 and angle <= 90) - - -# Returns true if angle is between start angle and end angle. All angle values -# will clamped between 0 and 360 degrees. -# -# #### Parameters -# -# - angle: the angle in degrees -# - start_angle: the start value of the angle interval -# - end_angle: the end value of the angle interval +# - p_angle: the angle in degrees +# - p_start_angle: the start value of the angle interval +# - p_end_angle: the end value of the angle interval func _angle_is_between( - angle: float, - start_angle: float, - end_angle: float + p_angle: float, + p_start_angle: float, + p_end_angle: float ) -> bool: - return wrapi(angle, 0, 360) >= wrapi(start_angle, 0, 360) \ - and wrapi(angle, 0, 360) <= wrapi(end_angle, 0, 360) + var angle = wrapi(p_angle, 0, 360) + var start_angle = wrapi(p_start_angle, 0, 360) + var end_angle = wrapi(p_end_angle, 0, 360) + if start_angle >= 0 and end_angle == 0: + end_angle = 360 + if end_angle < start_angle: + end_angle = p_end_angle + + return angle >= start_angle and angle <= end_angle # Sets character's angle and plays according animation. diff --git a/game/characters/mark/mark.tscn b/game/characters/mark/mark.tscn index c71c9f41..4cc8dadb 100644 --- a/game/characters/mark/mark.tscn +++ b/game/characters/mark/mark.tscn @@ -9,191 +9,191 @@ [ext_resource path="res://game/characters/mark/png/mark_talk_right.png" type="Texture" id=7] [sub_resource type="AtlasTexture" id=1] -atlas = ExtResource( 5 ) -region = Rect2( 0, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 120, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=2] -atlas = ExtResource( 5 ) -region = Rect2( 24, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 216, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=3] -atlas = ExtResource( 5 ) -region = Rect2( 48, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 240, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=4] atlas = ExtResource( 4 ) -region = Rect2( 72, 0, 24, 70 ) +region = Rect2( 264, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=5] -atlas = ExtResource( 7 ) -region = Rect2( 0, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 288, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=6] -atlas = ExtResource( 7 ) -region = Rect2( 24, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 312, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=7] -atlas = ExtResource( 7 ) -region = Rect2( 48, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 336, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=8] -atlas = ExtResource( 7 ) -region = Rect2( 72, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 360, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=9] -atlas = ExtResource( 7 ) -region = Rect2( 96, 0, 24, 70 ) +atlas = ExtResource( 4 ) +region = Rect2( 384, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=10] -atlas = ExtResource( 6 ) +atlas = ExtResource( 4 ) region = Rect2( 0, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=11] -atlas = ExtResource( 6 ) +atlas = ExtResource( 4 ) region = Rect2( 24, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=12] atlas = ExtResource( 4 ) -region = Rect2( 120, 0, 24, 70 ) +region = Rect2( 144, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=13] atlas = ExtResource( 4 ) -region = Rect2( 336, 0, 24, 70 ) +region = Rect2( 168, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=14] atlas = ExtResource( 4 ) -region = Rect2( 360, 0, 24, 70 ) +region = Rect2( 192, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=15] atlas = ExtResource( 4 ) -region = Rect2( 384, 0, 24, 70 ) +region = Rect2( 96, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=16] atlas = ExtResource( 4 ) -region = Rect2( 144, 0, 24, 70 ) +region = Rect2( 48, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=17] -atlas = ExtResource( 4 ) -region = Rect2( 168, 0, 24, 70 ) +atlas = ExtResource( 2 ) +region = Rect2( 0, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=18] -atlas = ExtResource( 4 ) -region = Rect2( 192, 0, 24, 70 ) +atlas = ExtResource( 2 ) +region = Rect2( 24, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=19] -atlas = ExtResource( 4 ) -region = Rect2( 216, 0, 24, 70 ) +atlas = ExtResource( 2 ) +region = Rect2( 48, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=20] -atlas = ExtResource( 4 ) -region = Rect2( 240, 0, 24, 70 ) +atlas = ExtResource( 5 ) +region = Rect2( 0, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=21] -atlas = ExtResource( 4 ) -region = Rect2( 264, 0, 24, 70 ) +atlas = ExtResource( 5 ) +region = Rect2( 24, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=22] -atlas = ExtResource( 4 ) -region = Rect2( 288, 0, 24, 70 ) +atlas = ExtResource( 5 ) +region = Rect2( 48, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=23] -atlas = ExtResource( 4 ) -region = Rect2( 312, 0, 24, 70 ) +atlas = ExtResource( 6 ) +region = Rect2( 0, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=24] -atlas = ExtResource( 4 ) -region = Rect2( 48, 0, 24, 70 ) +atlas = ExtResource( 6 ) +region = Rect2( 24, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=25] atlas = ExtResource( 4 ) -region = Rect2( 24, 0, 24, 70 ) +region = Rect2( 72, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=26] -atlas = ExtResource( 2 ) +atlas = ExtResource( 7 ) region = Rect2( 0, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=27] -atlas = ExtResource( 2 ) +atlas = ExtResource( 7 ) region = Rect2( 24, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=28] -atlas = ExtResource( 2 ) +atlas = ExtResource( 7 ) region = Rect2( 48, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=29] -atlas = ExtResource( 4 ) -region = Rect2( 0, 0, 24, 70 ) +atlas = ExtResource( 7 ) +region = Rect2( 72, 0, 24, 70 ) [sub_resource type="AtlasTexture" id=30] -atlas = ExtResource( 4 ) +atlas = ExtResource( 7 ) region = Rect2( 96, 0, 24, 70 ) [sub_resource type="SpriteFrames" id=31] animations = [ { -"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ) ], -"loop": true, -"name": "speak_down_right", -"speed": 6.0 -}, { -"frames": [ SubResource( 4 ) ], -"loop": true, -"name": "idle_up", -"speed": 5.0 -}, { -"frames": [ SubResource( 5 ), SubResource( 6 ), SubResource( 7 ), SubResource( 8 ), SubResource( 9 ) ], -"loop": true, -"name": "speak_right", -"speed": 5.0 -}, { -"frames": [ SubResource( 10 ), SubResource( 11 ), SubResource( 10 ), SubResource( 11 ), SubResource( 11 ) ], -"loop": true, -"name": "speak_up", -"speed": 3.0 -}, { -"frames": [ SubResource( 12 ) ], +"frames": [ SubResource( 1 ) ], "loop": true, "name": "idle_down_left", "speed": 5.0 }, { -"frames": [ SubResource( 13 ), SubResource( 14 ), SubResource( 15 ), SubResource( 14 ) ], -"loop": true, -"name": "walk_up", -"speed": 6.0 -}, { -"frames": [ SubResource( 16 ), SubResource( 17 ), SubResource( 18 ), SubResource( 17 ) ], -"loop": true, -"name": "walk_down", -"speed": 6.0 -}, { -"frames": [ SubResource( 19 ), SubResource( 20 ), SubResource( 21 ), SubResource( 22 ), SubResource( 23 ) ], +"frames": [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 6 ) ], "loop": true, "name": "walk_right", "speed": 6.0 }, { -"frames": [ SubResource( 24 ) ], +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 8 ) ], "loop": true, -"name": "idle_right", -"speed": 5.0 -}, { -"frames": [ SubResource( 25 ) ], -"loop": true, -"name": "idle_down_right", -"speed": 5.0 -}, { -"frames": [ SubResource( 26 ), SubResource( 27 ), SubResource( 28 ), SubResource( 27 ), SubResource( 28 ) ], -"loop": true, -"name": "speak_down", +"name": "walk_up", "speed": 6.0 }, { -"frames": [ SubResource( 29 ) ], +"frames": [ SubResource( 10 ) ], "loop": true, "name": "idle_down", "speed": 5.0 }, { -"frames": [ SubResource( 30 ) ], +"frames": [ SubResource( 11 ) ], +"loop": true, +"name": "idle_down_right", +"speed": 5.0 +}, { +"frames": [ SubResource( 12 ), SubResource( 13 ), SubResource( 14 ), SubResource( 13 ) ], +"loop": true, +"name": "walk_down", +"speed": 6.0 +}, { +"frames": [ SubResource( 15 ) ], "loop": true, "name": "idle_left", "speed": 5.0 +}, { +"frames": [ SubResource( 16 ) ], +"loop": true, +"name": "idle_right", +"speed": 5.0 +}, { +"frames": [ SubResource( 17 ), SubResource( 18 ), SubResource( 19 ), SubResource( 18 ), SubResource( 19 ) ], +"loop": true, +"name": "speak_down", +"speed": 6.0 +}, { +"frames": [ SubResource( 20 ), SubResource( 21 ), SubResource( 22 ) ], +"loop": true, +"name": "speak_down_right", +"speed": 6.0 +}, { +"frames": [ SubResource( 23 ), SubResource( 24 ), SubResource( 23 ), SubResource( 24 ), SubResource( 24 ) ], +"loop": true, +"name": "speak_up", +"speed": 3.0 +}, { +"frames": [ SubResource( 25 ) ], +"loop": true, +"name": "idle_up", +"speed": 5.0 +}, { +"frames": [ SubResource( 26 ), SubResource( 27 ), SubResource( 28 ), SubResource( 29 ), SubResource( 30 ) ], +"loop": true, +"name": "speak_right", +"speed": 5.0 } ] [sub_resource type="CapsuleShape2D" id=32] diff --git a/game/characters/mark2dir/mark.esc b/game/characters/mark2dir/mark.esc new file mode 100644 index 00000000..5638a54a --- /dev/null +++ b/game/characters/mark2dir/mark.esc @@ -0,0 +1,3 @@ +:look + +say player "That's a-me, Mark-io." diff --git a/game/characters/mark2dir/mark2dir.tscn b/game/characters/mark2dir/mark2dir.tscn new file mode 100644 index 00000000..a5e11298 --- /dev/null +++ b/game/characters/mark2dir/mark2dir.tscn @@ -0,0 +1,232 @@ +[gd_scene load_steps=40 format=2] + +[ext_resource path="res://addons/escoria-core/game/core-scripts/esc_player.gd" type="Script" id=1] +[ext_resource path="res://game/characters/mark/png/mark_talk_down.png" type="Texture" id=2] +[ext_resource path="res://game/characters/mark2dir/mark_animations.tres" type="Resource" id=3] +[ext_resource path="res://game/characters/mark/png/mark.png" type="Texture" id=4] +[ext_resource path="res://game/characters/mark/png/mark_talk_down_right.png" type="Texture" id=5] +[ext_resource path="res://game/characters/mark/png/mark_talk_up.png" type="Texture" id=6] +[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 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 4 ) +region = Rect2( 216, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 4 ) +region = Rect2( 240, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 4 ) +region = Rect2( 264, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=5] +atlas = ExtResource( 4 ) +region = Rect2( 288, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=6] +atlas = ExtResource( 4 ) +region = Rect2( 312, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 4 ) +region = Rect2( 336, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 4 ) +region = Rect2( 360, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 4 ) +region = Rect2( 384, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=10] +atlas = ExtResource( 4 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=11] +atlas = ExtResource( 4 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=12] +atlas = ExtResource( 4 ) +region = Rect2( 144, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=13] +atlas = ExtResource( 4 ) +region = Rect2( 168, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=14] +atlas = ExtResource( 4 ) +region = Rect2( 192, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=15] +atlas = ExtResource( 4 ) +region = Rect2( 96, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=16] +atlas = ExtResource( 4 ) +region = Rect2( 48, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=17] +atlas = ExtResource( 2 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=18] +atlas = ExtResource( 2 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=19] +atlas = ExtResource( 2 ) +region = Rect2( 48, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=20] +atlas = ExtResource( 5 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=21] +atlas = ExtResource( 5 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=22] +atlas = ExtResource( 5 ) +region = Rect2( 48, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=23] +atlas = ExtResource( 6 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=24] +atlas = ExtResource( 6 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=25] +atlas = ExtResource( 4 ) +region = Rect2( 72, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=26] +atlas = ExtResource( 7 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=27] +atlas = ExtResource( 7 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=28] +atlas = ExtResource( 7 ) +region = Rect2( 48, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=29] +atlas = ExtResource( 7 ) +region = Rect2( 72, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=30] +atlas = ExtResource( 7 ) +region = Rect2( 96, 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( 5 ), SubResource( 6 ) ], +"loop": true, +"name": "walk_right", +"speed": 6.0 +}, { +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 8 ) ], +"loop": true, +"name": "walk_up", +"speed": 6.0 +}, { +"frames": [ SubResource( 10 ) ], +"loop": true, +"name": "idle_down", +"speed": 5.0 +}, { +"frames": [ SubResource( 11 ) ], +"loop": true, +"name": "idle_down_right", +"speed": 5.0 +}, { +"frames": [ SubResource( 12 ), SubResource( 13 ), SubResource( 14 ), SubResource( 13 ) ], +"loop": true, +"name": "walk_down", +"speed": 6.0 +}, { +"frames": [ SubResource( 15 ) ], +"loop": true, +"name": "idle_left", +"speed": 5.0 +}, { +"frames": [ SubResource( 16 ) ], +"loop": true, +"name": "idle_right", +"speed": 5.0 +}, { +"frames": [ SubResource( 17 ), SubResource( 18 ), SubResource( 19 ), SubResource( 18 ), SubResource( 19 ) ], +"loop": true, +"name": "speak_down", +"speed": 6.0 +}, { +"frames": [ SubResource( 20 ), SubResource( 21 ), SubResource( 22 ) ], +"loop": true, +"name": "speak_down_right", +"speed": 6.0 +}, { +"frames": [ SubResource( 23 ), SubResource( 24 ), SubResource( 23 ), SubResource( 24 ), SubResource( 24 ) ], +"loop": true, +"name": "speak_up", +"speed": 3.0 +}, { +"frames": [ SubResource( 25 ) ], +"loop": true, +"name": "idle_up", +"speed": 5.0 +}, { +"frames": [ SubResource( 26 ), SubResource( 27 ), SubResource( 28 ), SubResource( 29 ), SubResource( 30 ) ], +"loop": true, +"name": "speak_right", +"speed": 5.0 +} ] + +[sub_resource type="CapsuleShape2D" id=32] +radius = 38.2347 +height = 217.78 + +[node name="mark" type="Area2D"] +pause_mode = 1 +script = ExtResource( 1 ) +global_id = "player" +esc_script = "res://game/characters/mark2dir/mark.esc" +is_movable = true +tooltip_name = "Me" +dialog_color = Color( 1, 1, 1, 1 ) +selectable = true +animations = ExtResource( 3 ) + +[node name="sprite" type="AnimatedSprite" parent="."] +position = Vector2( 0, -140.938 ) +scale = Vector2( 4, 4 ) +frames = SubResource( 31 ) +animation = "idle_down" + +[node name="collision" type="CollisionShape2D" parent="."] +position = Vector2( 0.455139, -138.362 ) +shape = SubResource( 32 ) + +[node name="debug" type="Label" parent="."] +margin_right = 40.0 +margin_bottom = 14.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="dialog_position" type="Position2D" parent="."] +position = Vector2( 0, -320 ) diff --git a/game/characters/mark2dir/mark_animations.tres b/game/characters/mark2dir/mark_animations.tres new file mode 100644 index 00000000..ee22043a --- /dev/null +++ b/game/characters/mark2dir/mark_animations.tres @@ -0,0 +1,52 @@ +[gd_resource type="Resource" load_steps=12 format=2] + +[ext_resource path="res://addons/escoria-core/game/core-scripts/resources/esc_animationresource.gd" type="Script" id=1] +[ext_resource path="res://addons/escoria-core/game/core-scripts/resources/esc_directionangle.gd" type="Script" id=2] +[ext_resource path="res://addons/escoria-core/game/core-scripts/resources/esc_animationname.gd" type="Script" id=3] + +[sub_resource type="Resource" id=1] +script = ExtResource( 2 ) +angle_start = 0 +angle_size = 180 + +[sub_resource type="Resource" id=2] +script = ExtResource( 2 ) +angle_start = 180 +angle_size = 180 + +[sub_resource type="Resource" id=3] +script = ExtResource( 3 ) +animation = "walk_right" +mirrored = false + +[sub_resource type="Resource" id=4] +script = ExtResource( 3 ) +animation = "walk_right" +mirrored = true + +[sub_resource type="Resource" id=5] +script = ExtResource( 3 ) +animation = "idle_right" +mirrored = false + +[sub_resource type="Resource" id=6] +script = ExtResource( 3 ) +animation = "idle_left" +mirrored = false + +[sub_resource type="Resource" id=7] +script = ExtResource( 3 ) +animation = "speak_right" +mirrored = false + +[sub_resource type="Resource" id=8] +script = ExtResource( 3 ) +animation = "speak_right" +mirrored = true + +[resource] +script = ExtResource( 1 ) +dir_angles = [ SubResource( 1 ), SubResource( 2 ) ] +directions = [ SubResource( 3 ), SubResource( 4 ) ] +idles = [ SubResource( 5 ), SubResource( 6 ) ] +speaks = [ SubResource( 7 ), SubResource( 8 ) ] diff --git a/game/characters/mark2dir/mark_talk.tscn b/game/characters/mark2dir/mark_talk.tscn new file mode 100644 index 00000000..6f37c920 --- /dev/null +++ b/game/characters/mark2dir/mark_talk.tscn @@ -0,0 +1,34 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://game/characters/mark/png/mark_talk_right.png" type="Texture" id=1] + +[sub_resource type="AtlasTexture" id=1] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 24, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 1 ) +region = Rect2( 48, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 1 ) +region = Rect2( 72, 0, 24, 70 ) + +[sub_resource type="AtlasTexture" id=5] +atlas = ExtResource( 1 ) +region = Rect2( 96, 0, 24, 70 ) + +[sub_resource type="SpriteFrames" id=6] +animations = [ { +"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ) ], +"loop": true, +"name": "default", +"speed": 5.0 +} ] + +[node name="AnimatedSprite" type="AnimatedSprite"] +frames = SubResource( 6 ) diff --git a/game/characters/mark2dir/png/mark.png b/game/characters/mark2dir/png/mark.png new file mode 100644 index 0000000000000000000000000000000000000000..91cacd24e10184da846dc75cd87803351ee33d8c GIT binary patch literal 5792 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 literal 0 HcmV?d00001 diff --git a/game/characters/mark2dir/png/mark_talk_right.png b/game/characters/mark2dir/png/mark_talk_right.png new file mode 100644 index 0000000000000000000000000000000000000000..15937f2151167d487a25e1e085b9b43d3e9db41f GIT binary patch literal 1058 zcmV+-1l{|IP)Px&+(|@1RCt{2o6SobK^Vs0sD#=>+EWD)NvJWT?WxVdi{Poyf)qU{y=nUgNH0Y! zg8MwMMSI!MJbIe#`Mtcl8w7NA3L)fhUbC6COi4f zWS^aPX5O6;K}IVPbaIfW&H}757~sdt_dUr27pVyRc=(fO$Owp$%z3~ zDDV~XuNlm9_l%A|bOA*g4}P@#4(^&8Kt0{P)R}CjxnhQ9iVKuYXa1L{h~U7FfX^MG zCnpBztZF%MTXV(dp&AXoUcOKdzSWs@!Pho6UFX6IeD!>xNmfsHuj_pwpQG9G7R{Eo z8p4FUz*o-??7?qm#+>8BqXW+}pO;o>^x0FPvA$(=gLJ-P7H8`ioxQ7RIU|#eSBrPXs9*iX|UH*iKEU;eBViyT?tR}dwYM6UN8M%6_eugj9X#&A~%icLCO=m*gJUo0N(#E$H#20$lP{`*zL#B$09|eDXcZcrZ?Q<@Y9W_km za~r(AyF-P1&M`q%qod|G-#{uaek=01DxdC3xd!^Kp+2PsfUl3wEHvGfs^4gH7rVIn zSKqsz=b?WD_gZm_&fD zpN~nF;gT{~tAihMD59&0?lI!e7$_;GKu#ukFo+^FCU2x!^LIrU~wVw za_fP%Mu4x6j~;BeV6fqW!G;S48!i}ZxL~m1g29Fh1{*FIY`9>s;ex@23kDl57;Ly; zu;GHihD&%~bj|vsqaEOD;tLt9Y9kr=(eXw0`*`iTR=FPud=31tW3b+>{NRV?W0GaK cV6fr(3nR?I!5fp`i2wiq07*qoM6N<$g4WCxQ2+n{ literal 0 HcmV?d00001 diff --git a/game/characters/mark2dir/png/mark_talk_up.png b/game/characters/mark2dir/png/mark_talk_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1d85e5608fda6ff9c9a85ff5d479729b0a04ea1d GIT binary patch literal 666 zcmV;L0%iS)P)Px%R7pfZRA_b3Sr7NC^zQaI_s#yBTL3by9Cq^xAbBQ0ItmWP zm)*N1GNlhuUw$fG6I6Z$a5KUiRU|W*s3vrigR%3P9B+~(RcN5%_FX_X`yg=LT%fcYUMrf(yAMq6t!KsfjItQZM$Tk+I%poYi!$^%1bH1 z$zQ)!2*9j7HZ7@b<)sHW6C^dD6U0~c0X)tDt^}b5C_!wp&(U)vz+LT7xa?g%zOoD* zY*|&A+@J*5-YUR;X)kr{BoVz_B1M`RiHCWl2l>z;xCFs8kd}e*XgKRq7c$|eh7k4>(Reh3{{3|h z0HAz!lPr#1%FjzK`2TAN{Y3=>z7-7kRxsdO!GLcC1HKgu_*O9BTgr1G*%uPmmzgbJ z^%b>v>XcJl*OfIN8$voqW+umLEd0#Rfy^8D1(-_>-MHD2@c;k-07*qoM6N<$g1wC- AssI20 literal 0 HcmV?d00001 diff --git a/game/characters/mark2dir/sfx/footstep_concrete_000.ogg b/game/characters/mark2dir/sfx/footstep_concrete_000.ogg new file mode 100644 index 0000000000000000000000000000000000000000..163cc56468f1734fe694351e7ff984699afa8b86 GIT binary patch literal 5808 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 wZQ~wf@a?|qKg9a~RsQ1I6Vd6i`F{%8I`d1X<