From 824e03fabfaa1f8b1d232befc30bdcb758f6f7bc Mon Sep 17 00:00:00 2001 From: wjsjwr Date: Fri, 6 Dec 2024 23:53:02 +0800 Subject: [PATCH] Watch mobile phone --- ai/tasks/OkToPlayMobilePhone.cs | 34 + ai/watch_mobile_phone.tres | 55 ++ scenes/cube.tscn | 12 +- scenes/lab.tscn | 5 +- scenes/logo_scene.tscn | 30 +- scenes/student.tscn | 870 ++++++++++++++++++++++++- script_templates/BTTask/custom_task.gd | 37 ++ scripts/Cube.cs | 77 ++- scripts/GameManager.cs | 2 + scripts/Helpers.cs | 16 + scripts/ITileDraggable.cs | 27 + scripts/Lab.cs | 142 ++-- scripts/Res.cs | 3 - scripts/Student.cs | 177 ++++- scripts/TileDraggable.cs | 10 - 15 files changed, 1354 insertions(+), 143 deletions(-) create mode 100644 ai/tasks/OkToPlayMobilePhone.cs create mode 100644 ai/watch_mobile_phone.tres create mode 100644 script_templates/BTTask/custom_task.gd create mode 100644 scripts/Helpers.cs create mode 100644 scripts/ITileDraggable.cs delete mode 100644 scripts/TileDraggable.cs diff --git a/ai/tasks/OkToPlayMobilePhone.cs b/ai/tasks/OkToPlayMobilePhone.cs new file mode 100644 index 0000000..c1dc6ff --- /dev/null +++ b/ai/tasks/OkToPlayMobilePhone.cs @@ -0,0 +1,34 @@ +using Godot; +using System; + +[Tool] +public partial class OkToPlayMobilePhone : BTCondition +{ + [Export] + public StringName target; + + public override Status _Tick(double delta) + { + Student student = Agent as Student; // Cast the agent to a Student object + if (student == null) return Status.Failure; + + if (student.State == Student.CharacterState.Idle) { + return Status.Success; + } + + if (student.State == Student.CharacterState.Sitting && student.TargetDirection == Student.Direction.Down) { + return Status.Success; + } + + return Status.Failure; + } + public override string[] _GetConfigurationWarnings() + { + return Array.Empty(); + } + + public override string _GenerateName() + { + return "OkToPlayMobilePhone"; + } +} diff --git a/ai/watch_mobile_phone.tres b/ai/watch_mobile_phone.tres new file mode 100644 index 0000000..f1347d8 --- /dev/null +++ b/ai/watch_mobile_phone.tres @@ -0,0 +1,55 @@ +[gd_resource type="BehaviorTree" load_steps=14 format=3 uid="uid://cdsixeqsdfmc1"] + +[ext_resource type="Script" path="res://ai/tasks/OkToPlayMobilePhone.cs" id="1_lfwnu"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_gwwr7"] + +[sub_resource type="BTCondition" id="BTCondition_prnjq"] +script = ExtResource("1_lfwnu") +target = null + +[sub_resource type="BBNode" id="BBNode_7pcle"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_hx8gl"] +await_completion = 1.2 +animation_player = SubResource("BBNode_7pcle") +animation_name = &"phone_up" + +[sub_resource type="BBNode" id="BBNode_6275u"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wbk5l"] +await_completion = 1.0 +animation_player = SubResource("BBNode_6275u") +animation_name = &"phone_loop" + +[sub_resource type="BTRepeat" id="BTRepeat_1nqee"] +children = [SubResource("BTPlayAnimation_wbk5l")] +times = 3 + +[sub_resource type="BTProbability" id="BTProbability_x3mt2"] +children = [SubResource("BTRepeat_1nqee")] +run_chance = 0.75 + +[sub_resource type="BTRepeatUntilFailure" id="BTRepeatUntilFailure_uatr3"] +children = [SubResource("BTProbability_x3mt2")] + +[sub_resource type="BBNode" id="BBNode_2433i"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_g4biw"] +await_completion = 0.5 +animation_player = SubResource("BBNode_2433i") +animation_name = &"phone_down" + +[sub_resource type="BTSequence" id="BTSequence_0drub"] +children = [SubResource("BTCondition_prnjq"), SubResource("BTPlayAnimation_hx8gl"), SubResource("BTRepeatUntilFailure_uatr3"), SubResource("BTPlayAnimation_g4biw")] + +[resource] +description = "WatchMobilePhone" +blackboard_plan = SubResource("BlackboardPlan_gwwr7") +root_task = SubResource("BTSequence_0drub") diff --git a/scenes/cube.tscn b/scenes/cube.tscn index d1caf10..08d5f6a 100644 --- a/scenes/cube.tscn +++ b/scenes/cube.tscn @@ -4,11 +4,14 @@ [ext_resource type="TileSet" uid="uid://doadcdgjrsxxu" path="res://resources/TileSet/Office.tres" id="2_ya2a5"] [node name="Cube" type="StaticBody2D"] +y_sort_enabled = true collision_mask = 3 input_pickable = true script = ExtResource("1_3u72b") [node name="RedBG" type="Polygon2D" parent="."] +visible = false +z_index = -1 color = Color(1, 0.0470588, 0.0666667, 0.466667) polygon = PackedVector2Array(-48, -96, -48, 144, 144, 144, 144, -96) @@ -17,11 +20,12 @@ tile_map_data = PackedByteArray("AAAAAAAAAAANABwAAAAAAAEAAAANAB0AAAABAAAAAAAOABw tile_set = ExtResource("2_ya2a5") [node name="Desk2" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAAAAAEAAAAEAB8AAAABAAEAAAAFAB8AAAACAAEAAAAGAB8AAAAAAP//AAAHABwAAAABAP//AAAIABwAAAACAP//AAAJABwAAAA=") +z_index = 3 +tile_map_data = PackedByteArray("AAAAAP//AAAHABwAAAABAP//AAAIABwAAAACAP//AAAJABwAAAA=") tile_set = ExtResource("2_ya2a5") [node name="Guardrail" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAD/////AAAAABoAAAD//wAAAAAAABsAAAD//wEAAAAAABwAAAAAAP//AAABABoAAAAAAAAAAAABABsAAAAAAAEAAAABABwAAAABAP//AAACABoAAAABAAAAAAACABsAAAABAAEAAAACABwAAAACAP//AAADABoAAAACAAAAAAADABsAAAACAAEAAAADABwAAAA=") +tile_map_data = PackedByteArray("AAD/////AAAAABoAAAD//wAAAAAAABsAAAD//wEAAAAAABwAAAAAAP//AAABABoAAAAAAAAAAAABABsAAAAAAAEAAAABABwAAAABAAAAAAACABsAAAABAAEAAAACABwAAAACAP//AAADABoAAAACAAAAAAADABsAAAACAAEAAAADABwAAAA=") tile_set = ExtResource("2_ya2a5") [node name="Desk" type="TileMapLayer" parent="."] @@ -29,16 +33,20 @@ tile_map_data = PackedByteArray("AAAAAAAAAAAEAB4AAAAAAAEAAAAEAB8AAAABAAAAAAAFAB4 tile_set = ExtResource("2_ya2a5") [node name="Equip" type="TileMapLayer" parent="."] +z_index = 1 tile_map_data = PackedByteArray("AAABAAAAAAAIACAAAAABAAEAAAAIACEAAAAAAAAAAAALABMAAAAAAAEAAAALABQAAAACAAAAAAAJACAAAAACAAEAAAAJACEAAAA=") tile_set = ExtResource("2_ya2a5") [node name="Equip2" type="TileMapLayer" parent="."] +z_index = 4 tile_map_data = PackedByteArray("AAABAP//AAAOACAAAAACAP//AAAPAB4AAAAAAP//AAANACAAAAA=") tile_set = ExtResource("2_ya2a5") [node name="Chair" type="TileMapLayer" parent="."] +z_index = 5 tile_map_data = PackedByteArray("AAABAAEAAAABAAgAAAABAAIAAAABAAkAAAA=") tile_set = ExtResource("2_ya2a5") [node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."] +visible = false polygon = PackedVector2Array(48, 138, 97, 138, 97, 97, 144, 97, 144, -33, 97, -33, 97, -76, 48, -76, 48, -33, -10, -33, -10, 97, 48, 97) diff --git a/scenes/lab.tscn b/scenes/lab.tscn index 3ed2b59..2577f54 100644 --- a/scenes/lab.tscn +++ b/scenes/lab.tscn @@ -555,6 +555,7 @@ sources/0 = SubResource("TileSetAtlasSource_fufp2") sources/1 = SubResource("TileSetAtlasSource_nuiiq") [node name="Lab" type="Node2D"] +y_sort_enabled = true script = ExtResource("1_xcxd5") [node name="OutGround" type="TileMapLayer" parent="."] @@ -583,11 +584,11 @@ collision_visibility_mode = 1 script = ExtResource("3_mca7j") [node name="Student" parent="." instance=ExtResource("8_wqdny")] -position = Vector2(24, 192) +position = Vector2(24, 168) [node name="BottomBar" parent="." instance=ExtResource("10_1ep8g")] offset_top = 1028.0 offset_bottom = 1028.0 [node name="Cube" parent="." instance=ExtResource("8_04hci")] -position = Vector2(942.001, 460.001) +position = Vector2(566, 271) diff --git a/scenes/logo_scene.tscn b/scenes/logo_scene.tscn index df9eda2..5fe187d 100644 --- a/scenes/logo_scene.tscn +++ b/scenes/logo_scene.tscn @@ -3,6 +3,21 @@ [ext_resource type="Texture2D" uid="uid://dxqtqlu4rkew7" path="res://resources/logo/bbj.png" id="1_al3ug"] [ext_resource type="Script" path="res://scripts/LogoScene.cs" id="1_dx6qu"] +[sub_resource type="Animation" id="Animation_2c4eo"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("BbjLogo/Sprite2D:modulate") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 0)] +} + [sub_resource type="Animation" id="Animation_6umjc"] resource_name = "logo_show" length = 3.0 @@ -20,21 +35,6 @@ tracks/0/keys = { "values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -[sub_resource type="Animation" id="Animation_2c4eo"] -length = 0.001 -tracks/0/type = "value" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("BbjLogo/Sprite2D:modulate") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 0, -"values": [Color(1, 1, 1, 0)] -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_sun07"] _data = { "RESET": SubResource("Animation_2c4eo"), diff --git a/scenes/student.tscn b/scenes/student.tscn index 1fd62ad..27be6d7 100644 --- a/scenes/student.tscn +++ b/scenes/student.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=13 format=3 uid="uid://c413oatj0eqhu"] +[gd_scene load_steps=42 format=3 uid="uid://c413oatj0eqhu"] [ext_resource type="Script" path="res://scripts/Student.cs" id="1_oesea"] [ext_resource type="Texture2D" uid="uid://bw2007qd8eedh" path="res://resources/characters/bodies/Body_48x48_01.png" id="3_jhea4"] [ext_resource type="Script" path="res://scripts/StudentName.cs" id="8_kvqca"] +[ext_resource type="BehaviorTree" uid="uid://cdsixeqsdfmc1" path="res://ai/watch_mobile_phone.tres" id="9_m1j2m"] [ext_resource type="Texture2D" uid="uid://c5or8ivaegryg" path="res://resources/characters/accessories/Accessory_06_Policeman_Hat_48x48_01.png" id="30_npp82"] [ext_resource type="Texture2D" uid="uid://ylt6r0ottjkn" path="res://resources/characters/eyes/Eyes_48x48_01.png" id="96_q8xrp"] [ext_resource type="Texture2D" uid="uid://dnqrj6tcfn7rb" path="res://resources/characters/hairstyles/Hairstyle_01_48x48_01.png" id="103_yndn4"] @@ -14,6 +15,144 @@ size = Vector2(48, 96) [sub_resource type="Animation" id="Animation_f0f87"] length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(18, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(18, 2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(18, 2)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(18, 1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(19, 2)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("parts/smartphone:frame_coords") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [Vector2i(0, 6)] +} + +[sub_resource type="Animation" id="Animation_poc5q"] +resource_name = "idle_back" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} [sub_resource type="Animation" id="Animation_bptvv"] resource_name = "idle_front" @@ -93,63 +232,770 @@ tracks/5/keys = { "values": [Vector2i(18, 1), Vector2i(19, 1), Vector2i(20, 1), Vector2i(21, 1), Vector2i(22, 1), Vector2i(23, 1)] } +[sub_resource type="Animation" id="Animation_p6nlo"] +resource_name = "idle_left" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 1), Vector2i(13, 1), Vector2i(14, 1), Vector2i(15, 1), Vector2i(16, 1), Vector2i(17, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 1), Vector2i(13, 1), Vector2i(14, 1), Vector2i(15, 1), Vector2i(16, 1), Vector2i(17, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 1), Vector2i(13, 1), Vector2i(14, 1), Vector2i(15, 1), Vector2i(16, 1), Vector2i(17, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 1), Vector2i(13, 1), Vector2i(14, 1), Vector2i(15, 1), Vector2i(16, 1), Vector2i(17, 1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 1), Vector2i(7, 1), Vector2i(8, 1), Vector2i(9, 1), Vector2i(10, 1), Vector2i(11, 1)] +} + +[sub_resource type="Animation" id="Animation_a1x0t"] +resource_name = "idle_right" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 1), Vector2i(1, 1), Vector2i(2, 1), Vector2i(3, 1), Vector2i(4, 1), Vector2i(5, 1)] +} + +[sub_resource type="Animation" id="Animation_uladi"] +resource_name = "phone_down" +length = 0.3 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("parts/smartphone:frame_coords") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [Vector2i(9, 6), Vector2i(10, 6), Vector2i(11, 6)] +} + +[sub_resource type="Animation" id="Animation_m8rfw"] +resource_name = "phone_loop" +length = 0.6 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("parts/smartphone:frame_coords") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} + +[sub_resource type="Animation" id="Animation_qv1ib"] +resource_name = "phone_up" +length = 0.9 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("parts/smartphone:frame_coords") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 6), Vector2i(1, 6), Vector2i(2, 6), Vector2i(3, 6), Vector2i(4, 6), Vector2i(5, 6), Vector2i(6, 6), Vector2i(7, 6), Vector2i(8, 6)] +} + +[sub_resource type="Animation" id="Animation_kvk6q"] +resource_name = "walk_down" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(18, 2), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2), Vector2i(22, 2), Vector2i(23, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(18, 2), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2), Vector2i(22, 2), Vector2i(23, 2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(18, 2), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2), Vector2i(22, 2), Vector2i(23, 2)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(18, 2), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2), Vector2i(22, 2), Vector2i(23, 2)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(18, 2), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2), Vector2i(22, 2), Vector2i(23, 2)] +} + +[sub_resource type="Animation" id="Animation_cu2c1"] +resource_name = "walk_left" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 2), Vector2i(13, 2), Vector2i(14, 2), Vector2i(15, 2), Vector2i(16, 2), Vector2i(17, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 2), Vector2i(13, 2), Vector2i(14, 2), Vector2i(15, 2), Vector2i(16, 2), Vector2i(17, 2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 2), Vector2i(13, 2), Vector2i(14, 2), Vector2i(15, 2), Vector2i(16, 2), Vector2i(17, 2)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 2), Vector2i(13, 2), Vector2i(14, 2), Vector2i(15, 2), Vector2i(16, 2), Vector2i(17, 2)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(12, 2), Vector2i(13, 2), Vector2i(14, 2), Vector2i(15, 2), Vector2i(16, 2), Vector2i(17, 2)] +} + +[sub_resource type="Animation" id="Animation_v0rmi"] +resource_name = "walk_right" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(0, 2), Vector2i(1, 2), Vector2i(2, 2), Vector2i(3, 2), Vector2i(4, 2), Vector2i(5, 2)] +} + +[sub_resource type="Animation" id="Animation_q6d3e"] +resource_name = "walk_up" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("parts/body:frame_coords") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 2), Vector2i(7, 2), Vector2i(8, 2), Vector2i(9, 2), Vector2i(10, 2), Vector2i(11, 2)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("parts/hairstyle:frame_coords") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 2), Vector2i(7, 2), Vector2i(8, 2), Vector2i(9, 2), Vector2i(10, 2), Vector2i(11, 2)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("parts/outfit:frame_coords") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 2), Vector2i(7, 2), Vector2i(8, 2), Vector2i(9, 2), Vector2i(10, 2), Vector2i(11, 2)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("parts/eye:frame_coords") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 2), Vector2i(7, 2), Vector2i(8, 2), Vector2i(9, 2), Vector2i(10, 2), Vector2i(11, 2)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("parts/accessory:frame_coords") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2i(6, 2), Vector2i(7, 2), Vector2i(8, 2), Vector2i(9, 2), Vector2i(10, 2), Vector2i(11, 2)] +} + [sub_resource type="AnimationLibrary" id="AnimationLibrary_fw47y"] _data = { "RESET": SubResource("Animation_f0f87"), -"idle_front": SubResource("Animation_bptvv") +"idle_back": SubResource("Animation_poc5q"), +"idle_front": SubResource("Animation_bptvv"), +"idle_left": SubResource("Animation_p6nlo"), +"idle_right": SubResource("Animation_a1x0t"), +"phone_down": SubResource("Animation_uladi"), +"phone_loop": SubResource("Animation_m8rfw"), +"phone_up": SubResource("Animation_qv1ib"), +"walk_down": SubResource("Animation_kvk6q"), +"walk_left": SubResource("Animation_cu2c1"), +"walk_right": SubResource("Animation_v0rmi"), +"walk_up": SubResource("Animation_q6d3e") } +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46g5k"] +var/OkToPlayMobilePhone/name = &"OkToPlayMobilePhone" +var/OkToPlayMobilePhone/type = 1 +var/OkToPlayMobilePhone/value = false +var/OkToPlayMobilePhone/hint = 0 +var/OkToPlayMobilePhone/hint_string = "" + +[sub_resource type="BBNode" id="BBNode_1jlqh"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_4w245"] +node = SubResource("BBNode_1jlqh") +method = &"GoTo" + +[sub_resource type="BTRandomWait" id="BTRandomWait_0f45u"] +min_duration = 5.0 +max_duration = 8.0 + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_id04c"] + +[sub_resource type="BTSubtree" id="BTSubtree_fuxrk"] +blackboard_plan = SubResource("BlackboardPlan_id04c") +subtree = ExtResource("9_m1j2m") + +[sub_resource type="BTSequence" id="BTSequence_5y0as"] +children = [SubResource("BTCallMethod_4w245"), SubResource("BTRandomWait_0f45u"), SubResource("BTSubtree_fuxrk")] +metadata/_weight_ = 1.0 + +[sub_resource type="BBNode" id="BBNode_c6axb"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_gu2qw"] +node = SubResource("BBNode_c6axb") +method = &"GoToSeat" + +[sub_resource type="BTRandomWait" id="BTRandomWait_el8uw"] +min_duration = 5.0 +max_duration = 8.0 + +[sub_resource type="BTSubtree" id="BTSubtree_y8so2"] +blackboard_plan = SubResource("BlackboardPlan_id04c") +subtree = ExtResource("9_m1j2m") + +[sub_resource type="BBNode" id="BBNode_uxlnw"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_vxdpx"] +node = SubResource("BBNode_uxlnw") +method = &"GoTo" + +[sub_resource type="BTRandomWait" id="BTRandomWait_nwe3t"] +min_duration = 5.0 +max_duration = 8.0 + +[sub_resource type="BTSequence" id="BTSequence_1ad6t"] +children = [SubResource("BTCallMethod_gu2qw"), SubResource("BTRandomWait_el8uw"), SubResource("BTSubtree_y8so2"), SubResource("BTCallMethod_vxdpx"), SubResource("BTRandomWait_nwe3t")] +metadata/_weight_ = 4.0 + +[sub_resource type="BTProbabilitySelector" id="BTProbabilitySelector_w3hpi"] +children = [SubResource("BTSequence_5y0as"), SubResource("BTSequence_1ad6t")] + +[sub_resource type="BehaviorTree" id="BehaviorTree_bf6dw"] +blackboard_plan = SubResource("BlackboardPlan_46g5k") +root_task = SubResource("BTProbabilitySelector_w3hpi") + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_qtgr4"] + [node name="Student" type="CharacterBody2D"] +z_index = 2 script = ExtResource("1_oesea") [node name="CollisionShape2D" type="CollisionShape2D" parent="."] -position = Vector2(0, -48) +position = Vector2(0, -24) shape = SubResource("RectangleShape2D_opr6h") [node name="parts" type="Node2D" parent="."] -position = Vector2(0, -24) [node name="body" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("3_jhea4") hframes = 26 vframes = 8 -frame = 45 +frame = 70 [node name="hairstyle" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("103_yndn4") hframes = 26 vframes = 8 -frame = 45 +frame = 70 [node name="outfit" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("303_jwwbg") hframes = 26 vframes = 8 -frame = 45 +frame = 70 [node name="eye" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("96_q8xrp") hframes = 26 vframes = 8 -frame = 45 +frame = 44 [node name="accessory" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("30_npp82") hframes = 26 vframes = 8 -frame = 45 +frame = 71 [node name="smartphone" type="Sprite2D" parent="parts"] position = Vector2(0, -24) texture = ExtResource("435_7vwql") hframes = 26 vframes = 8 -frame = 45 +frame = 156 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] libraries = { @@ -158,3 +1004,7 @@ libraries = { [node name="StudentName" type="Node" parent="."] script = ExtResource("8_kvqca") + +[node name="BTPlayer" type="BTPlayer" parent="."] +behavior_tree = SubResource("BehaviorTree_bf6dw") +blackboard_plan = SubResource("BlackboardPlan_qtgr4") diff --git a/script_templates/BTTask/custom_task.gd b/script_templates/BTTask/custom_task.gd new file mode 100644 index 0000000..522cc2a --- /dev/null +++ b/script_templates/BTTask/custom_task.gd @@ -0,0 +1,37 @@ +# meta-name: Custom Task +# meta-description: Custom task to be used in a BehaviorTree +# meta-default: true +@tool +extends _BASE_ +## _CLASS_ + + +# Display a customized name (requires @tool). +func _generate_name() -> String: +_TS_return "_CLASS_" + + +# Called once during initialization. +func _setup() -> void: +_TS_pass + + +# Called each time this task is entered. +func _enter() -> void: +_TS_pass + + +# Called each time this task is exited. +func _exit() -> void: +_TS_pass + + +# Called each time this task is ticked (aka executed). +func _tick(delta: float) -> Status: +_TS_return SUCCESS + + +# Strings returned from this method are displayed as warnings in the behavior tree editor (requires @tool). +func _get_configuration_warnings() -> PackedStringArray: +_TS_var warnings := PackedStringArray() +_TS_return warnings diff --git a/scripts/Cube.cs b/scripts/Cube.cs index c6b8295..c469509 100644 --- a/scripts/Cube.cs +++ b/scripts/Cube.cs @@ -1,6 +1,8 @@ using Godot; using System; using System.Collections.Generic; +using System.Linq; +using System.Xml; public partial class Cube : StaticBody2D, ITileDraggable { @@ -83,6 +85,9 @@ public partial class Cube : StaticBody2D, ITileDraggable } } + private readonly Guid _id = Guid.NewGuid(); + public Guid ID => _id; + public Vector2I TilePosition { get; set; } = new Vector2I(5,5); private bool _isCollided = true; public bool IsCollided { @@ -103,9 +108,15 @@ public partial class Cube : StaticBody2D, ITileDraggable private Vector2I _mouseOffset; public Vector2I MouseOffset => _mouseOffset; + private static readonly ITileDraggable.SpecialTile[] _specialTiles = { + new(new Vector2I(1,-1), Lab.MapNodeType.SeatDown | Lab.MapNodeType.Walkable), + new(new Vector2I(1,2), Lab.MapNodeType.SeatUp | Lab.MapNodeType.Walkable), + }; + + + public ITileDraggable.SpecialTile[] SpecialTiles => _specialTiles; + // Called when the node enters the scene tree for the first time. - - public override void _Ready() { RandomChangeTheme(); @@ -117,16 +128,15 @@ public partial class Cube : StaticBody2D, ITileDraggable if (@event.IsActionPressed("mouse_left_press")) { if (Draggable) { var parent = GetParent(); - parent.IsDragging = true; - parent.DraggingTarget = this; + parent.Pickup(this); var desk = GetNode("Desk"); _mouseOffset = desk.LocalToMap(GetLocalMousePosition()); GD.Print($"_mouseOffset = {_mouseOffset}"); } } else if (@event.IsActionReleased("mouse_left_press")) { + if (_isCollided) return; var parent = GetParent(); - parent.IsDragging = false; - parent.DraggingTarget = null; + parent.PutDown(this); } base._InputEvent(viewport, @event, shapeIdx); } @@ -137,14 +147,53 @@ public partial class Cube : StaticBody2D, ITileDraggable GlobalPosition = TilePosition * 48; } + private int tableThemeIdx; + private int table2ThemeIdx; + private int chairThemeIdx; + private int chair2ThemeIdx; + private int equipThemeIdx; + private int equip2ThemeIdx; public void RandomChangeTheme() { - tableThemes[GD.RandRange(0, tableThemes.Length-1)].Apply(GetNode("Desk")); - table2Themes[GD.RandRange(0, table2Themes.Length-1)].Apply(GetNode("Desk2")); - chairThemes[GD.RandRange(0, chairThemes.Length-1)].Apply(GetNode("Chair")); - chair2Themes[GD.RandRange(0, chair2Themes.Length-1)].Apply(GetNode("Chair2")); - equipThemes[GD.RandRange(0, equipThemes.Length-1)].Apply(GetNode("Equip")); - var x =GD.RandRange(0, equip2Themes.Length-1); - GD.Print(GD.RandRange(0, equip2Themes.Length-1)); - equip2Themes[x].Apply(GetNode("Equip2")); + tableThemeIdx = GD.RandRange(0, tableThemes.Length-1); + chairThemeIdx = GD.RandRange(0, chairThemes.Length-1); + equipThemeIdx = GD.RandRange(0, equipThemes.Length-1); + + table2ThemeIdx = GD.RandRange(0, table2Themes.Length-1); + chair2ThemeIdx = GD.RandRange(0, chair2Themes.Length-1); + equip2ThemeIdx = GD.RandRange(0, equip2Themes.Length-1); + + tableThemes[tableThemeIdx].Apply(GetNode("Desk")); + chairThemes[chairThemeIdx].Apply(GetNode("Chair")); + equipThemes[equipThemeIdx].Apply(GetNode("Equip")); + table2Themes[table2ThemeIdx].Apply(GetNode("Desk2")); + chair2Themes[chair2ThemeIdx].Apply(GetNode("Chair2")); + equip2Themes[equip2ThemeIdx].Apply(GetNode("Equip2")); } + private static readonly HashSet blockerTiles = new(new Vector2I[]{ + new(0,0), + new(1,0), + new(2,0), + new(0,1), + new(1,1), + new(2,1), + }); + public Lab.MapNodeType GetTileType(Vector2I pos) + { + GD.Print($"query position of {pos}"); + if (blockerTiles.Contains(pos)) { + return Lab.MapNodeType.Blocker; + } + if (_specialTiles.Any(t => t.Position == pos)) { + return _specialTiles.First(t => t.Position == pos).NodeType; + } + return Lab.MapNodeType.Walkable; + } + + public void ChairFaceTo(Vector2I target, int idx) { + if (idx == 0) { + var theme = chairThemes[chairThemeIdx]; + + } + } + } \ No newline at end of file diff --git a/scripts/GameManager.cs b/scripts/GameManager.cs index afe4094..8a330cb 100644 --- a/scripts/GameManager.cs +++ b/scripts/GameManager.cs @@ -20,4 +20,6 @@ public partial class GameManager : Node { } + + } diff --git a/scripts/Helpers.cs b/scripts/Helpers.cs new file mode 100644 index 0000000..b6980cc --- /dev/null +++ b/scripts/Helpers.cs @@ -0,0 +1,16 @@ +using Godot; + +public class H { + public static bool RectHasPointInclusive(Rect2I r, Vector2I p) { + if (r.HasPoint(p)) { + return true; + } + if (r.End.Y == p.Y && p.X >= r.Position.X && p.X <= r.End.X) { + return true; + } + if (r.End.X == p.X && p.Y >= r.Position.Y && p.Y <= r.End.Y) { + return true; + } + return false; + } +} \ No newline at end of file diff --git a/scripts/ITileDraggable.cs b/scripts/ITileDraggable.cs new file mode 100644 index 0000000..0875fc5 --- /dev/null +++ b/scripts/ITileDraggable.cs @@ -0,0 +1,27 @@ +using System; +using System.Diagnostics.SymbolStore; +using System.Dynamic; +using Godot; + +public interface ITileDraggable { + Vector2I TilePosition { get; set; } + bool Draggable { get; set; } + bool IsCollided { get; set; } + Rect2I TileRect { get; } + + Vector2I MouseOffset { get; } + + SpecialTile[] SpecialTiles { get; } + + class SpecialTile { + public readonly Vector2I Position; + public readonly Lab.MapNodeType NodeType; + public SpecialTile(Vector2I pos, Lab.MapNodeType node) { + Position = pos; + NodeType = node; + } + } + Lab.MapNodeType GetTileType(Vector2I pos); + + Guid ID { get; } +} \ No newline at end of file diff --git a/scripts/Lab.cs b/scripts/Lab.cs index 79a0d1f..24a5ca1 100644 --- a/scripts/Lab.cs +++ b/scripts/Lab.cs @@ -5,6 +5,16 @@ using System.Linq; public partial class Lab : Node2D { + [Flags] + public enum MapNodeType + { + Invalid = 0, + Walkable = 1, + Wall = 2, + Blocker = 4, + SeatUp = 8, + SeatDown = 16, + } private static readonly Rect2I[] wallRectangles = { new(0,0,40,2), new(0,5,1, 15), @@ -12,6 +22,9 @@ public partial class Lab : Node2D new(39,2,1,18), }; + private readonly Dictionary furnitureIDs = new(); + public Dictionary Furniture => furnitureIDs; + // Called when the node enters the scene tree for the first time. public override void _Ready() { @@ -20,17 +33,26 @@ public partial class Lab : Node2D Player.Timeline.Subscribe(DateOnly.Parse("2024/11/20"), Guid.NewGuid()); Player.Timeline.OnEventTriggered += (d, e) => GD.Print($"Timeline event triggered: {d}, {e}"); - var label = GetNode