diff --git a/asset/art/ui/note/aseprite_slice_to_atlas.gd b/asset/art/ui/note/aseprite_slice_to_atlas.gd new file mode 100644 index 00000000..0be81c68 --- /dev/null +++ b/asset/art/ui/note/aseprite_slice_to_atlas.gd @@ -0,0 +1,72 @@ +extends Node2D + +@export var export_dir_root := "res://asset/art/ui/note/" +@export var json: JSON # can be a JSONParseResult or a Dictionary +@export var texture: Texture2D + + +func _ready() -> void: + _run() + + +var export_dir + + +func _run() -> void: + if not json or not texture: + printerr("JSON 或 texture 未设置") + return + + if not export_dir_root: + push_error("导出目录未设置") + return + + export_dir = export_dir_root + ("" if export_dir_root.ends_with("/") else "/") + export_dir = export_dir + json.resource_path.get_file().split(".")[0] + "/" + print("导出目录: ", export_dir) + + # 确保导出目录存在 + DirAccess.make_dir_recursive_absolute(export_dir) + + # 解析 JSON 数据 + var data: Dictionary + if json: + data = json.data + + # 检查 meta.slices + if not data.has("meta") or not data.meta.has("slices"): + push_error("JSON 中缺少 meta.slices") + return + + for slice_dict in data.meta.slices: + var slice_name = slice_dict.get("name", "") + var keys = slice_dict.get("keys", []) + if slice_name == "" or keys.is_empty(): + continue + var key = keys[0] + var bounds = key.get("bounds", null) + if typeof(bounds) != TYPE_DICTIONARY: + continue + var rect := Rect2( + bounds.get("x", 0), bounds.get("y", 0), bounds.get("w", 0), bounds.get("h", 0) + ) + _create_and_save_atlas(slice_name, rect) + print("已导出 Atlas: ", slice_name, " at ", export_dir) + + get_tree().quit.call_deferred() + + +func _create_and_save_atlas(atlas_name: String, region: Rect2) -> void: + var path = export_dir + atlas_name + ".tres" + var atlas_res: AtlasTexture + if FileAccess.file_exists(path): + atlas_res = load(path) + print_rich("[color=cyan]加载已有的 Atlas: ", path) + if not atlas_res: + atlas_res = AtlasTexture.new() + atlas_res.resource_path = path + print_rich("[color=green]创建新的 Atlas: ", path) + atlas_res.atlas = texture + atlas_res.filter_clip = true + atlas_res.region = region # 修正了原来拼写错误的 regoin + ResourceSaver.save(atlas_res, path) diff --git a/asset/art/ui/note/aseprite_slice_to_atlas.gd.uid b/asset/art/ui/note/aseprite_slice_to_atlas.gd.uid new file mode 100644 index 00000000..be0d3ab6 --- /dev/null +++ b/asset/art/ui/note/aseprite_slice_to_atlas.gd.uid @@ -0,0 +1 @@ +uid://16itkrecgwtm diff --git a/asset/art/ui/note/aseprite_slice_to_atlas.tscn b/asset/art/ui/note/aseprite_slice_to_atlas.tscn new file mode 100644 index 00000000..990ed13c --- /dev/null +++ b/asset/art/ui/note/aseprite_slice_to_atlas.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=4 format=3 uid="uid://ccws15temu1l7"] + +[ext_resource type="Script" uid="uid://16itkrecgwtm" path="res://asset/art/ui/note/aseprite_slice_to_atlas.gd" id="1_74cad"] +[ext_resource type="JSON" path="res://asset/art/ui/note/c02_slices.json" id="2_rv6as"] +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="3_5ej8b"] + +[node name="AsepriteSliceToAtlas" type="Node2D"] +script = ExtResource("1_74cad") +json = ExtResource("2_rv6as") +texture = ExtResource("3_5ej8b") diff --git a/asset/art/ui/note/c02_slices.json b/asset/art/ui/note/c02_slices.json new file mode 100644 index 00000000..987d4a2b --- /dev/null +++ b/asset/art/ui/note/c02_slices.json @@ -0,0 +1,292 @@ +{ + "frames": { + "笔记线索_第一章.png": { + "frame": { + "x": 0.0, + "y": 0.0, + "w": 1790.0, + "h": 1136.0 + }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { + "x": 0.0, + "y": 0.0, + "w": 1790.0, + "h": 1136.0 + }, + "sourceSize": { + "w": 1790.0, + "h": 1136.0 + }, + "duration": 100.0 + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.8.1-arm64", + "format": "RGBA8888", + "size": { + "w": 1790.0, + "h": 1136.0 + }, + "scale": "1", + "slices": [ + { + "name": "c02_meat_knockDoor", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 226.0, + "y": 253.0, + "w": 101.0, + "h": 53.0 + } + } + ] + }, + { + "name": "c02_hand_exchange", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 49.0, + "y": 184.0, + "w": 163.0, + "h": 116.0 + } + } + ] + }, + { + "name": "c02_musicbox_needPuppet", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 86.0, + "y": 317.0, + "w": 102.0, + "h": 58.0 + } + } + ] + }, + { + "name": "c02_gate_chain", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 426.0, + "y": 333.0, + "w": 89.0, + "h": 70.0 + } + } + ] + }, + { + "name": "c02_split_illusionSpace", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 482.0, + "y": 170.0, + "w": 199.0, + "h": 89.0 + } + } + ] + }, + { + "name": "c02_meat_stopMouse", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 364.0, + "y": 77.0, + "w": 108.0, + "h": 59.0 + } + } + ] + }, + { + "name": "c02_map_1Left", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 872.0, + "y": 88.0, + "w": 517.0, + "h": 383.0 + } + } + ] + }, + { + "name": "c02_map_1Right", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1440.0, + "y": 278.0, + "w": 283.0, + "h": 195.0 + } + } + ] + }, + { + "name": "c02_map_2", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1324.0, + "y": 714.0, + "w": 437.0, + "h": 371.0 + } + } + ] + }, + { + "name": "c02_shoe_giveToMouce", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1186.0, + "y": 780.0, + "w": 121.0, + "h": 79.0 + } + } + ] + }, + { + "name": "c02_hand_requireCoin", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1185.0, + "y": 867.0, + "w": 112.0, + "h": 75.0 + } + } + ] + }, + { + "name": "c02_xchan_sheKnowsMe", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 882.0, + "y": 571.0, + "w": 462.0, + "h": 93.0 + } + } + ] + }, + { + "name": "c02_road_address", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1381.0, + "y": 563.0, + "w": 391.0, + "h": 97.0 + } + } + ] + }, + { + "name": "c02_xchan_giveHerPuppet", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 1466.0, + "y": 166.0, + "w": 168.0, + "h": 49.0 + } + } + ] + }, + { + "name": "c02_list_namesAndGoal", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 55.0, + "y": 548.0, + "w": 615.0, + "h": 283.0 + } + } + ] + }, + { + "name": "c02_xchan_isSheGohst", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 93.0, + "y": 916.0, + "w": 200.0, + "h": 127.0 + } + } + ] + }, + { + "name": "c02_blotOut", + "color": "#0000ffff", + "keys": [ + { + "frame": 0.0, + "bounds": { + "x": 378.0, + "y": 931.0, + "w": 97.0, + "h": 74.0 + } + } + ] + } + ] + } +} \ No newline at end of file diff --git a/asset/art/ui/note/笔记线索_第一章.png b/asset/art/ui/note/c02_slices.png similarity index 100% rename from asset/art/ui/note/笔记线索_第一章.png rename to asset/art/ui/note/c02_slices.png diff --git a/asset/art/ui/note/笔记线索_第一章.png.import b/asset/art/ui/note/c02_slices.png.import similarity index 68% rename from asset/art/ui/note/笔记线索_第一章.png.import rename to asset/art/ui/note/c02_slices.png.import index 4927eb86..01a23656 100644 --- a/asset/art/ui/note/笔记线索_第一章.png.import +++ b/asset/art/ui/note/c02_slices.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://drijblepnhhsw" -path="res://.godot/imported/笔记线索_第一章.png-5a92d0c0d981e032650977ec75646448.ctex" +path="res://.godot/imported/c02_slices.png-b481c314b20ea9e0c9dc0ca54e51f66b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://asset/art/ui/note/笔记线索_第一章.png" -dest_files=["res://.godot/imported/笔记线索_第一章.png-5a92d0c0d981e032650977ec75646448.ctex"] +source_file="res://asset/art/ui/note/c02_slices.png" +dest_files=["res://.godot/imported/c02_slices.png-b481c314b20ea9e0c9dc0ca54e51f66b.ctex"] [params] diff --git a/asset/art/ui/note/c02_slices/c02_blotOut.tres b/asset/art/ui/note/c02_slices/c02_blotOut.tres new file mode 100644 index 00000000..c11376bc --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_blotOut.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://c30s0pieywjpa"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_yfw6c"] + +[resource] +atlas = ExtResource("1_yfw6c") +region = Rect2(378, 931, 97, 74) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_gate_chain.tres b/asset/art/ui/note/c02_slices/c02_gate_chain.tres new file mode 100644 index 00000000..c306573a --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_gate_chain.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://viyauy3w72bv"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_r8xbd"] + +[resource] +atlas = ExtResource("1_r8xbd") +region = Rect2(426, 333, 89, 70) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_hand_exchange.tres b/asset/art/ui/note/c02_slices/c02_hand_exchange.tres new file mode 100644 index 00000000..7a3d2456 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_hand_exchange.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://fnbysuck5nj2"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_036bj"] + +[resource] +atlas = ExtResource("1_036bj") +region = Rect2(49, 184, 163, 116) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_hand_requireCoin.tres b/asset/art/ui/note/c02_slices/c02_hand_requireCoin.tres new file mode 100644 index 00000000..b2bbcf0e --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_hand_requireCoin.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://cfrr5118wx6f"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_bal72"] + +[resource] +atlas = ExtResource("1_bal72") +region = Rect2(1185, 867, 112, 75) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_list_namesAndGoal.tres b/asset/art/ui/note/c02_slices/c02_list_namesAndGoal.tres new file mode 100644 index 00000000..3bfa60eb --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_list_namesAndGoal.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bg1rnxsr5of7v"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_4di5c"] + +[resource] +atlas = ExtResource("1_4di5c") +region = Rect2(55, 548, 615, 283) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_map_1Left.tres b/asset/art/ui/note/c02_slices/c02_map_1Left.tres new file mode 100644 index 00000000..21a54cdb --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_map_1Left.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dvjqumfy4invx"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_xc11y"] + +[resource] +atlas = ExtResource("1_xc11y") +region = Rect2(872, 88, 517, 383) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_map_1Right.tres b/asset/art/ui/note/c02_slices/c02_map_1Right.tres new file mode 100644 index 00000000..b6d80aa4 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_map_1Right.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://cdygjqy3a0ugw"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_lupqk"] + +[resource] +atlas = ExtResource("1_lupqk") +region = Rect2(1440, 278, 283, 195) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_map_2.tres b/asset/art/ui/note/c02_slices/c02_map_2.tres new file mode 100644 index 00000000..ab43a979 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_map_2.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://ddbjvbjpd6nsr"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_m0mgu"] + +[resource] +atlas = ExtResource("1_m0mgu") +region = Rect2(1324, 714, 437, 371) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_meat_knockDoor.tres b/asset/art/ui/note/c02_slices/c02_meat_knockDoor.tres new file mode 100644 index 00000000..1662c6a7 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_meat_knockDoor.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bds1oni7dlapf"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_5rkoq"] + +[resource] +atlas = ExtResource("1_5rkoq") +region = Rect2(226, 253, 101, 53) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_meat_stopMouse.tres b/asset/art/ui/note/c02_slices/c02_meat_stopMouse.tres new file mode 100644 index 00000000..656f7a33 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_meat_stopMouse.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://kiyw03vc3w12"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_4wotv"] + +[resource] +atlas = ExtResource("1_4wotv") +region = Rect2(364, 77, 108, 59) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_musicbox_needPuppet.tres b/asset/art/ui/note/c02_slices/c02_musicbox_needPuppet.tres new file mode 100644 index 00000000..93f2fa5d --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_musicbox_needPuppet.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://clxnk1kujhg3t"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_01jll"] + +[resource] +atlas = ExtResource("1_01jll") +region = Rect2(86, 317, 102, 58) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_road_address.tres b/asset/art/ui/note/c02_slices/c02_road_address.tres new file mode 100644 index 00000000..d98a8569 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_road_address.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://b87majbgamcqt"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_hneqy"] + +[resource] +atlas = ExtResource("1_hneqy") +region = Rect2(1381, 563, 391, 97) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_shoe_giveToMouce.tres b/asset/art/ui/note/c02_slices/c02_shoe_giveToMouce.tres new file mode 100644 index 00000000..e5f58abb --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_shoe_giveToMouce.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bvdpo5k83tb6s"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_hjq36"] + +[resource] +atlas = ExtResource("1_hjq36") +region = Rect2(1186, 780, 121, 79) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_split_illusionSpace.tres b/asset/art/ui/note/c02_slices/c02_split_illusionSpace.tres new file mode 100644 index 00000000..effb87d9 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_split_illusionSpace.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bjn4oo0fieim6"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_cu3l7"] + +[resource] +atlas = ExtResource("1_cu3l7") +region = Rect2(482, 170, 199, 89) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_xchan_giveHerPuppet.tres b/asset/art/ui/note/c02_slices/c02_xchan_giveHerPuppet.tres new file mode 100644 index 00000000..61afbac7 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_xchan_giveHerPuppet.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://ccm0eg5apjro0"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_7ebxh"] + +[resource] +atlas = ExtResource("1_7ebxh") +region = Rect2(1466, 166, 168, 49) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_xchan_isSheGohst.tres b/asset/art/ui/note/c02_slices/c02_xchan_isSheGohst.tres new file mode 100644 index 00000000..62b3cc1b --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_xchan_isSheGohst.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://bs2aus63tgwv1"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_jin8p"] + +[resource] +atlas = ExtResource("1_jin8p") +region = Rect2(93, 916, 200, 127) +filter_clip = true diff --git a/asset/art/ui/note/c02_slices/c02_xchan_sheKnowsMe.tres b/asset/art/ui/note/c02_slices/c02_xchan_sheKnowsMe.tres new file mode 100644 index 00000000..eb568682 --- /dev/null +++ b/asset/art/ui/note/c02_slices/c02_xchan_sheKnowsMe.tres @@ -0,0 +1,8 @@ +[gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://dqg5ha6sg60ti"] + +[ext_resource type="Texture2D" uid="uid://drijblepnhhsw" path="res://asset/art/ui/note/c02_slices.png" id="1_a3qry"] + +[resource] +atlas = ExtResource("1_a3qry") +region = Rect2(882, 571, 462, 93) +filter_clip = true diff --git a/asset/art/ui/note/笔记线索_第一章.json b/asset/art/ui/note/笔记线索_第一章.json deleted file mode 100644 index b2324706..00000000 --- a/asset/art/ui/note/笔记线索_第一章.json +++ /dev/null @@ -1,37 +0,0 @@ -{ "frames": { - "笔记线索_第一章.png": { - "frame": { "x": 0, "y": 0, "w": 1790, "h": 1136 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 1790, "h": 1136 }, - "sourceSize": { "w": 1790, "h": 1136 }, - "duration": 100 - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.8.1-arm64", - "format": "RGBA8888", - "size": { "w": 1790, "h": 1136 }, - "scale": "1", - "slices": [ - { "name": "c02_meat_knockDoor", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 226, "y": 253, "w": 101, "h": 53 } }] }, - { "name": "c02_hand_exchange", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 49, "y": 184, "w": 163, "h": 116 } }] }, - { "name": "c02_musicbox_needPuppet", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 86, "y": 317, "w": 102, "h": 58 } }] }, - { "name": "c02_gate_chain", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 426, "y": 333, "w": 89, "h": 70 } }] }, - { "name": "c02_split_illusionSpace", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 482, "y": 170, "w": 199, "h": 89 } }] }, - { "name": "c02_meat_stopMouse", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 364, "y": 77, "w": 108, "h": 59 } }] }, - { "name": "c02_map_1Left", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 872, "y": 88, "w": 517, "h": 383 } }] }, - { "name": "c02_map_1Right", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1440, "y": 278, "w": 283, "h": 195 } }] }, - { "name": "c02_map_2", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1324, "y": 714, "w": 437, "h": 371 } }] }, - { "name": "c02_shoe_giveToMouce", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1186, "y": 780, "w": 121, "h": 79 } }] }, - { "name": "c02_hand_requireCoin", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1185, "y": 867, "w": 112, "h": 75 } }] }, - { "name": "c02_xchan_sheKnowsMe", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 882, "y": 571, "w": 462, "h": 93 } }] }, - { "name": "c02_road_address", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1381, "y": 563, "w": 391, "h": 97 } }] }, - { "name": "c02_xchan_giveHerPuppet", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 1466, "y": 166, "w": 168, "h": 49 } }] }, - { "name": "c02_list_namesAndGoal", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 55, "y": 548, "w": 615, "h": 283 } }] }, - { "name": "c02_xchan_isSheGohst", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 93, "y": 916, "w": 200, "h": 127 } }] }, - { "name": "c02_blotOut", "color": "#0000ffff", "keys": [{ "frame": 0, "bounds": {"x": 378, "y": 931, "w": 97, "h": 74 } }] } - ] - } -} diff --git a/manager/archive_manager/assembled_archive.gd b/manager/archive_manager/assembled_archive.gd index 41c60cdc..7b20422c 100644 --- a/manager/archive_manager/assembled_archive.gd +++ b/manager/archive_manager/assembled_archive.gd @@ -77,4 +77,6 @@ func set_chapter_if_greater(c : int) -> void: if current_chapter >= c: return print("[AssembledArchive] set_chapter_if_greater: " + str(c)) - current_chapter = c \ No newline at end of file + current_chapter = c + # 笔记也进入下一章 + EventManager.set_stage_if_greater("handnote_chapter_stage", c) \ No newline at end of file diff --git a/manager/event_manager/event2d.gd b/manager/event_manager/event2d.gd index 09da9f75..0bb5576c 100644 --- a/manager/event_manager/event2d.gd +++ b/manager/event_manager/event2d.gd @@ -8,13 +8,18 @@ class_name Event2D # 前置依赖事件,为空时意味着无前置事件 @export var pre_event: StringName @export var hide_if_pre_on_stage: Array[int] = [] -@export_tool_button("创建脚本") var create_script := _create_script +@export_tool_button("创建脚本") var create_script = _create_script +@export_tool_button("复制 greater setter") var copy_greater_setter = _copy_greater_setter +@export_tool_button("复制 setter") var copy_setter = _copy_setter +@export_tool_button("复制 getter") var copy_getter = _copy_getter var prev_stage := 0 var stage := 0 func _ready() -> void: + if event != &"": + name = "Event_" + event if Engine.is_editor_hint(): return if event == &"": @@ -87,3 +92,20 @@ func _create_script(): ResourceSaver.save(script, path) set_script(load(path)) print("[Event2D] Script created: %s" % path) + + +func _copy_greater_setter(): + var text = 'EventManager.set_stage_if_greater(&"%s", 1)' % event + DisplayServer.clipboard_set(text) + print("Copied event greater setter: %s" % text) + +func _copy_setter(): + var text = 'EventManager.set_stage(&"%s", 1)' % event + DisplayServer.clipboard_set(text) + print("Copied event setter: %s" % text) + + +func _copy_getter(): + var text = 'EventManager.get_stage(&"%s")' % event + DisplayServer.clipboard_set(text) + print("Copied event getter: %s" % text) diff --git a/manager/event_manager/event_manager.gd b/manager/event_manager/event_manager.gd index b2db81c8..05879bfd 100644 --- a/manager/event_manager/event_manager.gd +++ b/manager/event_manager/event_manager.gd @@ -20,10 +20,16 @@ func set_stage(event_name: StringName, stage := 1) -> void: # print before emit print("[EventManager] Stage updated: %s, stage: %s" % [event_name, stage]) stage_updated.emit(event_name, stage) - # 如果是 handnote_stage,玩家进行记笔记动作 - if event_name == "handnote_stage" and SceneManager.get_player().character.begins_with("吕萍"): - SceneManager.lock_player(3.0, 16, true) - if stage == 1: + # 如果是 handnote_ 事件,玩家进行记笔记动作 + if ( + event_name.begins_with("handnote_") + and SceneManager.get_player().character.begins_with("吕萍") + ): + # 0 初始化隐藏,1 开始显示,2 划掉,3 结束隐藏 + if stage == 1 or stage == 2: + SceneManager.lock_player(3.0, 16, true) + # 第一次记笔记,提示查看笔记 + if event_name == &"handnote_c02_road_address": SceneManager.pop_center_notification(tr("ui_check_note")) diff --git a/manager/scene/scene_manager.gd b/manager/scene/scene_manager.gd index 3794354d..c7beef41 100644 --- a/manager/scene/scene_manager.gd +++ b/manager/scene/scene_manager.gd @@ -224,7 +224,7 @@ func pop_os_with_str(translation_key: String) -> void: if player: var msg = tr(translation_key).replace("
", "\n") var lines = await Util.generate_lines(msg) - player.pop_os(lines) + await player.pop_os(lines) else: printerr("Player node not found") diff --git a/scene/entity/inspectable.gd b/scene/entity/inspectable.gd index e8a142f5..f0c55ff0 100644 --- a/scene/entity/inspectable.gd +++ b/scene/entity/inspectable.gd @@ -117,8 +117,7 @@ func _on_interacted() -> void: return if icount == 0 and first_interact_os_key: sign_mark.display_sign = false - SceneManager.pop_os_with_str(first_interact_os_key) - await SceneManager.get_player().os_finished + await SceneManager.pop_os_with_str(first_interact_os_key) sign_mark.display_sign = true _do_action() diff --git a/scene/entity/interactable.gd b/scene/entity/interactable.gd index 2fcb3346..76d24524 100644 --- a/scene/entity/interactable.gd +++ b/scene/entity/interactable.gd @@ -154,8 +154,7 @@ func _pre_interacted() -> void: SceneManager.lock_player(0, action_key) if icount == 0 and first_interact_os_key: sign_mark.display_sign = false - SceneManager.pop_os_with_str(first_interact_os_key) - await SceneManager.get_player().os_finished + await SceneManager.pop_os_with_str(first_interact_os_key) sign_mark.display_sign = true _on_interacted() SceneManager.unlock_player() diff --git a/scene/ground/scene/animation_root.gd b/scene/ground/scene/animation_root.gd index 1597dd15..39ec9efd 100644 --- a/scene/ground/scene/animation_root.gd +++ b/scene/ground/scene/animation_root.gd @@ -180,8 +180,8 @@ func _reset_archive() -> void: _setup_ground_data(debug_ground_data, ground) archive.ground_archives[ground.scene_name].data = debug_ground_data # 重置 event 状态 - # EventManager.set_stage(&"c02_burning_end_stage", 2) - # EventManager.set_stage_if_greater("handnote_stage", 5) + # EventManager.set_stage(&"xxx", 2) + # EventManager.set_stage_if_greater(&"xxx", 5) var event_setter_regx = RegEx.create_from_string(r'EventManager.set_stage\(.?"(.+)"') as RegEx var event_getter_regx = RegEx.create_from_string(r'EventManager.get_stage\(.?"(.+)"') as RegEx var event_set_greater_regx = ( @@ -276,8 +276,8 @@ func _auto_setup_node_reference(): script.source_code = "\n".join(code_lines) ResourceSaver.save(script) print("auto reference done.") - print("skipped existing_vars:", existing_vars.size(), existing_vars) - print("created_vars:", created_vars.size(), created_vars) + print_rich("skipped existing_vars:[color=cyan]", existing_vars.size(), existing_vars) + print_rich("created_vars:[color=green]", created_vars.size(), created_vars) func _read_existing_vars(code_lines: PackedStringArray) -> Dictionary: diff --git a/scene/ground/scene/c01/s07_书店外.gd b/scene/ground/scene/c01/s07_书店外.gd index 2170437f..9d8523b1 100644 --- a/scene/ground/scene/c01/s07_书店外.gd +++ b/scene/ground/scene/c01/s07_书店外.gd @@ -91,8 +91,7 @@ func seller_interacted(): SceneManager.enable_prop_item_silently("prop_信碎片2") await Util.wait(1.5) $"报童音效".play() - SceneManager.pop_os_with_str("c01_s07_获得报纸") - await SceneManager.get_player().os_finished + await SceneManager.pop_os_with_str("c01_s07_获得报纸") # 播放获得动画 SceneManager.enable_prop_item("prop_信碎片2") SceneManager.release_player() diff --git a/scene/ground/scene/c02/s01_公寓门口.gd b/scene/ground/scene/c02/s01_公寓门口.gd index dc35e5e6..7d2c94ac 100644 --- a/scene/ground/scene/c02/s01_公寓门口.gd +++ b/scene/ground/scene/c02/s01_公寓门口.gd @@ -20,10 +20,8 @@ func _ready() -> void: func _on_ground_ready() -> void: - SceneManager.pop_os_with_str("c02_s01_下黄包车") - await SceneManager.get_player().os_finished - EventManager.set_stage_if_greater("handnote_stage", 1) - + await SceneManager.pop_os_with_str("c02_s01_下黄包车") + EventManager.set_stage_if_greater(&"handnote_c02_road_address", 1) # func _give_letter() -> void: # set_data("received_letter", true) # SceneManager.enable_prop_item("prop_令牌") diff --git a/scene/ground/scene/c02/s02_过道.gd b/scene/ground/scene/c02/s02_过道.gd index d744af40..b31e5b32 100644 --- a/scene/ground/scene/c02/s02_过道.gd +++ b/scene/ground/scene/c02/s02_过道.gd @@ -108,6 +108,9 @@ func _on_blink_finished(blink_sprite): func _on_music_box_exited(_arg): + EventManager.set_stage_if_greater(&"handnote_c02_musicbox_needPuppet", 1) + if 2 <= EventManager.get_stage(&"c02_musicbox_stage"): + EventManager.set_stage_if_greater(&"handnote_c02_musicbox_needPuppet", 2) if 4 <= EventManager.get_stage(&"c02_musicbox_stage"): _display_paper_man(false) # _display_paper_man(true) diff --git a/scene/ground/scene/c02/s02_过道.tscn b/scene/ground/scene/c02/s02_过道.tscn index 6974d6d3..f40d7241 100644 --- a/scene/ground/scene/c02/s02_过道.tscn +++ b/scene/ground/scene/c02/s02_过道.tscn @@ -110,7 +110,6 @@ debug_ground_data = Dictionary[String, Variant]({ "interacted_times": 0 } }) -auto_ref_type = PackedStringArray("Ambush2D", "Inspectable2D", "Closeup2D", "Note2D", "Interactable2D", "Pickable2D", "Event2D", "Sprite2D", "ProAnimatedSprite2D", "AnimatedSprite2D", "Sfx", "Sfx2D", "VibeSfx", "PointLight2D", "Area2D", "MainPlayer", "CameraFocusMarker") oneshot_animation = "" [node name="冷飕飕Sfx" parent="Ground/AnimationPlayer" index="0" instance=ExtResource("3_fvldj")] diff --git a/scene/ground/scene/c02/s03_院子.gd b/scene/ground/scene/c02/s03_院子.gd index 43904ebc..a128f486 100644 --- a/scene/ground/scene/c02/s03_院子.gd +++ b/scene/ground/scene/c02/s03_院子.gd @@ -129,6 +129,7 @@ func cg_end() -> void: func _on_gate_failed() -> void: + EventManager.set_stage_if_greater(&"handnote_c02_gate_chain", 1) if not ArchiveManager.get_global_value(&"c02_open_gate_first_failed"): ArchiveManager.set_global_entry(&"c02_open_gate_first_failed", true) SceneManager.pop_os_with_str("c02_s03_铁门") @@ -136,7 +137,8 @@ func _on_gate_failed() -> void: func _on_gate_interacted() -> void: gate.get_node("Wall/CollisionShape2D").disabled = true - EventManager.set_stage_if_greater("handnote_stage", 3) + EventManager.set_stage_if_greater(&"handnote_c02_gate_chain", 2) + EventManager.set_stage_if_greater(&"handnote_c02_map_1Right", 1) func _on_knock_exit(arg): @@ -185,7 +187,8 @@ func eavesdrop() -> void: SceneManager.player_action(14, true) ArchiveManager.set_global_entry(&"c02_eavesdrop_finished", true) await Util.wait(1.5) - SceneManager.pop_os_with_str("c02_偷听李癞对话后") + await SceneManager.pop_os_with_str("c02_偷听李癞对话后") + EventManager.set_stage_if_greater(&"handnote_c02_meat_knockDoor", 1) SceneManager.unlock_player() diff --git a/scene/ground/scene/c02/s03_院子.tscn b/scene/ground/scene/c02/s03_院子.tscn index d8ace5fa..0b86394b 100644 --- a/scene/ground/scene/c02/s03_院子.tscn +++ b/scene/ground/scene/c02/s03_院子.tscn @@ -298,7 +298,6 @@ debug_global_data = Dictionary[String, Variant]({ "c02_the_blind_room_unlocked": false, "c02_watched_the_well": false, "enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"], -"handnote_stage": 0, "player_x": 2030.0 }) debug_ground_data = Dictionary[String, Variant]({ @@ -355,7 +354,6 @@ debug_ground_data = Dictionary[String, Variant]({ "interacted_times": 0 } }) -auto_ref_type = PackedStringArray("Ambush2D", "Inspectable2D", "Closeup2D", "Note2D", "Interactable2D", "Pickable2D", "Event2D", "Sprite2D", "ProAnimatedSprite2D", "AnimatedSprite2D", "Sfx", "Sfx2D", "VibeSfx", "PointLight2D", "Area2D", "MainPlayer", "CameraFocusMarker") oneshot_animation = "" [node name="Sfx闷雷" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="0"] diff --git a/scene/ground/scene/c02/s04_保卫科.gd b/scene/ground/scene/c02/s04_保卫科.gd index 50918584..c1568949 100644 --- a/scene/ground/scene/c02/s04_保卫科.gd +++ b/scene/ground/scene/c02/s04_保卫科.gd @@ -58,10 +58,9 @@ func _on_closeup_tin_coin_exited(arg = null): await Util.wait(0.5) SceneManager.enable_prop_item("prop_锡箔元宝") - func _on_first_read(_arg) -> void: - SceneManager.pop_os_with_str("c02_保卫科花名册首次互动结束") - + await SceneManager.pop_os_with_str("c02_保卫科花名册首次互动结束") + EventManager.set_stage(&"handnote_c02_list_namesAndGoal", 1) func xiaochan_disappear(): #TODO diff --git a/scene/ground/scene/c02/s04_保卫科.tscn b/scene/ground/scene/c02/s04_保卫科.tscn index da9547fd..7edd75ad 100644 --- a/scene/ground/scene/c02/s04_保卫科.tscn +++ b/scene/ground/scene/c02/s04_保卫科.tscn @@ -47,9 +47,14 @@ data = { } debug_global_data = Dictionary[String, Variant]({ "c02_tin_coin_taken": 0, -"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"] +"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"], +"handnote_c02_list_namesAndGoal": 0, +"player_x": 30.0 }) debug_ground_data = Dictionary[String, Variant]({ +"Ambush进门看到小蝉": { +"played": false +}, "AnimationPlayer": { "oneshot_animation_played": false, "tin_coin_collected": false diff --git a/scene/ground/scene/c02/s05_一楼内侧楼道.gd b/scene/ground/scene/c02/s05_一楼内侧楼道.gd index f4ab9487..b0266272 100644 --- a/scene/ground/scene/c02/s05_一楼内侧楼道.gd +++ b/scene/ground/scene/c02/s05_一楼内侧楼道.gd @@ -14,6 +14,7 @@ func _ready() -> void: func _on_ground_ready() -> void: + EventManager.set_stage_if_greater(&"handnote_c02_map_1Left", 1) # 粘鼠游戏 if ArchiveManager.get_global_value(&"c02_meat_dropping"): # 肉掉落,检查粘鼠板是否启用 @@ -54,7 +55,8 @@ func mouse_pick_meat() -> void: var sprite = $"../DeployLayer/老鼠叼肉" sprite.play() await sprite.animation_finished - SceneManager.pop_os_with_str("c02_敲门_老鼠叼肉") + await SceneManager.pop_os_with_str("c02_敲门_老鼠叼肉") + EventManager.set_stage_if_greater(&"handnote_c02_meat_stopMouse", 1) func _on_madman_interacted() -> void: @@ -90,8 +92,11 @@ func wood_puppet() -> void: closeup.display() SceneManager.unlock_player() await closeup.exit + EventManager.set_stage_if_greater(&"handnote_c02_xchan_sheKnowsMe", 1) $"Sfx记忆闪回音效".easing_kill() func bucket_meat() -> void: SceneManager.enable_prop_item("prop_新鲜的肉") + EventManager.set_stage_if_greater(&"handnote_c02_meat_stopMouse", 2) + EventManager.set_stage_if_greater(&"handnote_c02_meat_knockDoor", 2) \ No newline at end of file diff --git a/scene/ground/scene/c02/s05_一楼内侧楼道.tscn b/scene/ground/scene/c02/s05_一楼内侧楼道.tscn index 5c67c92b..ee56c377 100644 --- a/scene/ground/scene/c02/s05_一楼内侧楼道.tscn +++ b/scene/ground/scene/c02/s05_一楼内侧楼道.tscn @@ -151,7 +151,6 @@ debug_ground_data = Dictionary[String, Variant]({ "picked": false } }) -auto_ref_type = PackedStringArray("Ambush2D", "Inspectable2D", "Closeup2D", "Note2D", "Interactable2D", "Pickable2D", "Event2D", "Sprite2D", "ProAnimatedSprite2D", "AnimatedSprite2D", "Sfx", "Sfx2D", "VibeSfx", "PointLight2D", "Area2D", "MainPlayer", "CameraFocusMarker") oneshot_animation = "" [node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"] diff --git a/scene/ground/scene/c02/s06_二楼.gd b/scene/ground/scene/c02/s06_二楼.gd index 1212eb57..2dba96ea 100644 --- a/scene/ground/scene/c02/s06_二楼.gd +++ b/scene/ground/scene/c02/s06_二楼.gd @@ -20,6 +20,7 @@ var c02_final_layer func _on_ground_ready() -> void: + EventManager.set_stage_if_greater(&"handnote_c02_map_2", 1) c02_final_layer = $"../DeployLayer/c02_final" if ( @@ -46,9 +47,9 @@ func _on_ground_ready() -> void: mice_hole.enabled = false gas_light_upon_hole.lighted.connect(func(): mice_hole.enabled = true - Util.timer(1.5, - SceneManager.pop_os_with_str.bind("c02_二楼血脚印") - ) + await Util.wait(1.5) + await SceneManager.pop_os_with_str("c02_二楼血脚印") + EventManager.set_stage_if_greater(&"handnote_c02_shoe_giveToMouce", 1) ) closeup_ball = $"../DeployLayer/Closeup弹珠游戏" as Closeup2D @@ -86,6 +87,7 @@ func _on_mice_hole_interacted(): SceneManager.unlock_player() if mice_hole.interacted_times >= 2: + EventManager.set_stage_if_greater(&"handnote_c02_shoe_giveToMouce", 2) # 触发疯子撞墙,疯子在一楼内侧过道中消失 ArchiveManager.set_global_entry(&"c02_madman_hitwall", true) ArchiveManager.set_global_entry(&"c02_s02_mouse_push_shoe", true) @@ -176,6 +178,5 @@ func _on_exit_final_show(_arg): SceneManager.release_player() # 1: 牵手跑结束; 2: 谢幕演出结束 EventManager.set_stage(&"c02_burning_end_stage", 2) - EventManager.set_stage_if_greater("handnote_stage", 5) # TODO 小蝉上楼后开启第二章 ArchiveManager.archive.set_chapter_if_greater(3) diff --git a/scene/ground/scene/c02/s06_二楼.tscn b/scene/ground/scene/c02/s06_二楼.tscn index 7bc19d9e..6b6762a7 100644 --- a/scene/ground/scene/c02/s06_二楼.tscn +++ b/scene/ground/scene/c02/s06_二楼.tscn @@ -858,7 +858,6 @@ debug_global_data = Dictionary[String, Variant]({ "c02_s02_mouse_push_shoe": false, "c02_the_blind_room_unlocked": true, "enabled_items": ["prop_火柴", "prop_院长的信", "prop_弹珠"], -"handnote_stage": 0, "player_x": 30.0 }) debug_ground_data = Dictionary[String, Variant]({ @@ -893,7 +892,6 @@ debug_ground_data = Dictionary[String, Variant]({ "interacted_times": 0 } }) -auto_ref_type = PackedStringArray("Ambush2D", "Inspectable2D", "Closeup2D", "Note2D", "Interactable2D", "Pickable2D", "Event2D", "Sprite2D", "ProAnimatedSprite2D", "AnimatedSprite2D", "Sfx", "Sfx2D", "VibeSfx", "PointLight2D", "Area2D", "MainPlayer", "CameraFocusMarker") oneshot_animation = "" [node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"] @@ -1186,20 +1184,20 @@ texture = ExtResource("37_osg51") collision_width_and_x = Vector2(150, 0) hook_method = "glimpse_hide_out" -[node name="Event2D叼纸小猫" type="Node2D" parent="Ground/DeployLayer" index="19"] +[node name="Event_c02_ball_game_stage" type="Node2D" parent="Ground/DeployLayer" index="19"] position = Vector2(164, 42) script = ExtResource("35_h3h1a") event = &"c02_ball_game_stage" hide_if_on_stage = Array[int]([0, 1, 2, 4]) metadata/_custom_type_script = "uid://bkkiyk5jkdw4d" -[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Ground/DeployLayer/Event2D叼纸小猫"] +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="Ground/DeployLayer/Event_c02_ball_game_stage"] position = Vector2(0, 15) sprite_frames = ExtResource("10_och2w") animation = &"叼纸小猫坐着呼吸" autoplay = "叼纸小猫坐着呼吸" -[node name="Pickable小猫纸条" parent="Ground/DeployLayer/Event2D叼纸小猫" instance=ExtResource("36_3u30v")] +[node name="Pickable小猫纸条" parent="Ground/DeployLayer/Event_c02_ball_game_stage" instance=ExtResource("36_3u30v")] position = Vector2(-3, 2) prop_key = "prop_小猫纸条" diff --git a/scene/ground/scene/c02/s07_二楼内侧楼道.gd b/scene/ground/scene/c02/s07_二楼内侧楼道.gd index 7270f635..64875b10 100644 --- a/scene/ground/scene/c02/s07_二楼内侧楼道.gd +++ b/scene/ground/scene/c02/s07_二楼内侧楼道.gd @@ -28,7 +28,6 @@ func _on_flyer_exit(arg): if arg: set_data("flyer_shaven", true) take_off_flyer() - EventManager.set_stage_if_greater("handnote_stage", 2) func take_off_flyer(immediatelly = false): @@ -39,6 +38,7 @@ func take_off_flyer(immediatelly = false): var tween = create_tween() tween.tween_property(flyer, "modulate:a", 0.0, 1.0) await tween.finished + EventManager.set_stage_if_greater(&"handnote_c02_hand_requireCoin", 1) else: flyer.visible = false var hand = $"../DeployLayer/小手讨东西" diff --git a/scene/ground/scene/c02/s08_瞎子卧室.gd b/scene/ground/scene/c02/s08_瞎子卧室.gd index acdd7a29..6f00696f 100644 --- a/scene/ground/scene/c02/s08_瞎子卧室.gd +++ b/scene/ground/scene/c02/s08_瞎子卧室.gd @@ -24,6 +24,7 @@ var boxcat_portal: Portal2D func _on_ground_ready() -> void: + EventManager.set_stage_if_greater(&"handnote_c02_split_illusionSpace", 1) color_mask = $"../BGSprite2D/ColorMask" ambush_eavesdrop = $"../DeployLayer/Ambush偷听" ambush_lookback = $"../DeployLayer/Ambush回看洞口" diff --git a/scene/ground/scene/c02/s10_空房间.gd b/scene/ground/scene/c02/s10_空房间.gd index b10d36ed..2986bdb6 100644 --- a/scene/ground/scene/c02/s10_空房间.gd +++ b/scene/ground/scene/c02/s10_空房间.gd @@ -63,6 +63,7 @@ func _on_ground_ready() -> void: xiao_chan_interactable.enabled = false xiao_chan_sprite.visible = false head_cover_closeup.exit.connect(func(_arg): + EventManager.set_stage_if_greater(&"handnote_c02_xchan_giveHerPuppet", 1) head_cover_closeup.hide() head_cover_closeup.enabled = false xiao_chan_interactable.enabled = true @@ -122,6 +123,8 @@ func _on_xiao_chan_interacted() -> void: xiao_chan_sprite.animation_finished.connect(func(): create_tween().tween_property(xiao_chan_sprite, "modulate:a", 0.0, 1.0) counter.enabled = true + EventManager.set_stage_if_greater(&"handnote_c02_xchan_sheKnowsMe", 2) + EventManager.set_stage_if_greater(&"handnote_c02_xchan_giveHerPuppet", 2) ) @@ -144,6 +147,7 @@ var pushing_counter = false: var counter_pushed_out = false var walking = false + func _on_counter_interacted(): var player = SceneManager.get_player() as MainPlayer if pushing_counter: diff --git a/scene/ground/scene/c02/s10_空房间.tscn b/scene/ground/scene/c02/s10_空房间.tscn index f1d8cb2a..24743e27 100644 --- a/scene/ground/scene/c02/s10_空房间.tscn +++ b/scene/ground/scene/c02/s10_空房间.tscn @@ -122,7 +122,6 @@ debug_ground_data = Dictionary[String, Variant]({ "interacted_times": 1 } }) -auto_ref_type = PackedStringArray("Ambush2D", "Inspectable2D", "Closeup2D", "Note2D", "Interactable2D", "Pickable2D", "Event2D", "Sprite2D", "ProAnimatedSprite2D", "AnimatedSprite2D", "Sfx", "Sfx2D", "VibeSfx", "PointLight2D", "Area2D", "MainPlayer", "CameraFocusMarker") oneshot_animation = "" [node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"] diff --git a/scene/ground/script/c02/小手讨东西.gd b/scene/ground/script/c02/小手讨东西.gd index d646fce1..00baadc3 100644 --- a/scene/ground/script/c02/小手讨东西.gd +++ b/scene/ground/script/c02/小手讨东西.gd @@ -66,7 +66,7 @@ var icount: int: # 9 小手交互,吓摔倒 SceneManager.lock_player(0, 9, true) SceneManager.pop_os_with_str("c02_小手出现摔倒") - Util.timer(1.5, $"Sfx摔倒".play) + Util.timer(1.5, $"Sfx摔倒".play) await SceneManager.get_player().animation_finished SceneManager.pop_os_with_str("c02_小手是什么鬼") SceneManager.unlock_player() @@ -144,6 +144,7 @@ var interacting := false: var communicating = false + func _on_interacted() -> void: if interacting: print("小手 interacting 锁定中") @@ -199,7 +200,8 @@ func _on_interacted() -> void: # 稍等片刻再给小鞋子 SceneManager.enable_prop_item("prop_小鞋子1") await SceneManager.get_inspector().quit_and_hidden - SceneManager.pop_os_with_str("c02_锡箔换小鞋子") + await SceneManager.pop_os_with_str("c02_锡箔换小鞋子") + EventManager.set_stage_if_greater(&"handnote_c02_hand_requireCoin", 2) var node = get_node("../自动跟随的老鼠") as Node2D if node: node.visible = true @@ -227,7 +229,8 @@ func _on_interacted() -> void: SceneManager.pop_debug_dialog_info("美术", "小手_老虎钳_hide + 小手_弹珠_show + 小手_弹珠_idle") await Util.wait(1.5) holding_prop = "prop_弹珠" - EventManager.set_stage_if_greater("handnote_stage", 4) + # 换回弹珠后完全结束 + EventManager.set_stage_if_greater(&"handnote_c02_hand_exchange", 2) elif id == 0 and key == "prop_弹珠" and not pliers_to_ball: interacted_success = true sfx_success.play() @@ -244,3 +247,5 @@ func _on_interacted() -> void: sign_mark.invalid_shake(matched_sign_texture, unmatched_sign_texture) SceneManager.unlock_player() interacting = false + if id == 0: + EventManager.set_stage_if_greater(&"handnote_c02_hand_exchange", 1) diff --git a/scene/ux/note/note_event.gd b/scene/ux/note/note_event.gd new file mode 100644 index 00000000..926a7c03 --- /dev/null +++ b/scene/ux/note/note_event.gd @@ -0,0 +1,54 @@ +@tool +class_name HandnoteEvent2D +extends Sprite2D + +# 当前事件 +@export var event: StringName +@export var hide_if_on_stage: Array[int] = [] +@export_tool_button("复制 greater setter") var copy_greater_setter = _copy_greater_setter +@export_tool_button("复制 setter") var copy_setter = _copy_setter +@export_tool_button("复制 getter") var copy_getter = _copy_getter + +var stage := 0 + + +func _ready() -> void: + if event != &"": + name = "Event_" + event + if Engine.is_editor_hint(): + return + stage = EventManager.get_stage(event) + if event == &"": + printerr("[HandnoteEvent2D] event is not set. continue processing...") + refresh_visibility() + var blot_out_node = get_node_or_null("BlotOut") + if blot_out_node: + # 0 初始化隐藏,1 开始显示,2 划掉,3 结束隐藏 + blot_out_node.visible = Engine.is_editor_hint() or stage == 2 + + +func refresh_visibility() -> void: + var should_show = not stage in hide_if_on_stage + if visible != should_show: + visible = should_show + + +###### TOOL BUTTON + + +func _copy_greater_setter(): + var text = 'EventManager.set_stage_if_greater(&"%s", 1)' % event + DisplayServer.clipboard_set(text) + print("Copied event greater setter: %s" % text) + + +func _copy_setter(): + var text = 'EventManager.set_stage(&"%s", 1)' % event + DisplayServer.clipboard_set(text) + print("Copied event setter: %s" % text) + + +func _copy_getter(): + var text = 'EventManager.get_stage(&"%s")' % event + DisplayServer.clipboard_set(text) + print("Copied event getter: %s" % text) diff --git a/scene/ux/note/note_event.gd.uid b/scene/ux/note/note_event.gd.uid new file mode 100644 index 00000000..00d878c9 --- /dev/null +++ b/scene/ux/note/note_event.gd.uid @@ -0,0 +1 @@ +uid://c5woj7mivdxrh diff --git a/scene/ux/note/sync_slices.gd b/scene/ux/note/sync_slices.gd new file mode 100644 index 00000000..e4539cd4 --- /dev/null +++ b/scene/ux/note/sync_slices.gd @@ -0,0 +1,49 @@ +@tool +extends HandnoteEvent2D + +@export_range(0, 5) var chapter := 1 +@export_tool_button("同步") var sync_nodes = _sync_nodes +@export var slices_path = "res://asset/art/ui/note/c02_slices/" +# 0 初始化隐藏,1 开始显示,2 划掉,3 结束隐藏 +@export var ignore_stages: Array[int] = [0, 3] + +func _ready() -> void: + if Engine.is_editor_hint(): + return + super._ready() + visible = stage == chapter + + +func _sync_nodes() -> void: + if not DirAccess.dir_exists_absolute(slices_path): + printerr("目录不存在: ", slices_path) + return + var existed_events = [] + _travase_existed_nodes(get_tree().edited_scene_root, existed_events) + for s in DirAccess.get_files_at(slices_path): + var evt = &"handnote_" + s.split(".")[0] + if existed_events.has(evt): + continue + print("[color=green]创建事件节点: ", evt) + var event_node = HandnoteEvent2D.new() as HandnoteEvent2D + event_node.texture = load(slices_path + s) + event_node = event_node + event_node.event = evt + event_node.hide_if_on_stage = ignore_stages.duplicate() + add_child(event_node) + event_node.owner = get_tree().edited_scene_root + + +func _travase_existed_nodes(node, existed_events: Array): + if not node: + return + if node is HandnoteEvent2D: + existed_events.append(node.event) + print("配置已存在的事件节点: ", node.event) + if len(node.hide_if_on_stage) == 0: + print_rich("[color=green]设置 hide_if_on_stage: ", ignore_stages) + node.hide_if_on_stage = ignore_stages.duplicate() + else: + print_rich("[color=cyan]已存在 hide_if_on_stage,跳过设置: ", node.hide_if_on_stage) + for c in node.get_children(): + _travase_existed_nodes(c, existed_events) diff --git a/scene/ux/note/sync_slices.gd.uid b/scene/ux/note/sync_slices.gd.uid new file mode 100644 index 00000000..94fd4ada --- /dev/null +++ b/scene/ux/note/sync_slices.gd.uid @@ -0,0 +1 @@ +uid://dm8aeml8ndctg diff --git a/scene/ux/note/ux_note.tscn b/scene/ux/note/ux_note.tscn index 4aeeadfa..82b286f2 100644 --- a/scene/ux/note/ux_note.tscn +++ b/scene/ux/note/ux_note.tscn @@ -1,46 +1,32 @@ -[gd_scene load_steps=13 format=3 uid="uid://cy7wrrsm8e04f"] +[gd_scene load_steps=26 format=3 uid="uid://cy7wrrsm8e04f"] [ext_resource type="Script" uid="uid://bkyg34xfhe60p" path="res://scene/ux/note/ux_note.gd" id="1_e61yw"] [ext_resource type="Texture2D" uid="uid://bi7l47cit2xs" path="res://asset/art/ui/ux_panel/完整背景.png" id="2_1ka1m"] [ext_resource type="Texture2D" uid="uid://cbql1i4hblmt1" path="res://asset/art/ui/遮罩/inspect特写通用遮罩.png" id="3_nk0pj"] [ext_resource type="PackedScene" uid="uid://ut4a5gwb4naq" path="res://scene/ux/tabs.tscn" id="4_7vpan"] [ext_resource type="Texture2D" uid="uid://dsj3l0baqg1g7" path="res://asset/art/ui/ux_panel/小蝶笔记.png" id="5_d1cia"] -[ext_resource type="Texture2D" uid="uid://bv57eyqs03k4y" path="res://asset/art/ui/note/线索笔记内容-29.png" id="6_7vpan"] -[ext_resource type="Texture2D" uid="uid://blub5hsn6iqit" path="res://asset/art/ui/note/线索笔记内容-30.png" id="6_n8isc"] -[ext_resource type="Texture2D" uid="uid://beltvxcu7pumi" path="res://asset/art/ui/note/线索笔记内容-31.png" id="7_8rh03"] -[ext_resource type="Texture2D" uid="uid://ldh387gluo1t" path="res://asset/art/ui/note/线索笔记内容-34.png" id="7_d1cia"] -[ext_resource type="Texture2D" uid="uid://db1k1t1lc34ut" path="res://asset/art/ui/note/线索笔记内容-32.png" id="8_kiw8q"] +[ext_resource type="Script" uid="uid://dm8aeml8ndctg" path="res://scene/ux/note/sync_slices.gd" id="5_nk0pj"] +[ext_resource type="Texture2D" uid="uid://b87majbgamcqt" path="res://asset/art/ui/note/c02_slices/c02_road_address.tres" id="6_dohnv"] +[ext_resource type="Script" uid="uid://c5woj7mivdxrh" path="res://scene/ux/note/note_event.gd" id="7_nfxph"] +[ext_resource type="Texture2D" uid="uid://bg1rnxsr5of7v" path="res://asset/art/ui/note/c02_slices/c02_list_namesAndGoal.tres" id="8_nfxph"] +[ext_resource type="Texture2D" uid="uid://dvjqumfy4invx" path="res://asset/art/ui/note/c02_slices/c02_map_1Left.tres" id="9_kv812"] +[ext_resource type="Texture2D" uid="uid://fnbysuck5nj2" path="res://asset/art/ui/note/c02_slices/c02_hand_exchange.tres" id="10_1efbh"] +[ext_resource type="Texture2D" uid="uid://c30s0pieywjpa" path="res://asset/art/ui/note/c02_slices/c02_blotOut.tres" id="11_dohnv"] +[ext_resource type="Texture2D" uid="uid://clxnk1kujhg3t" path="res://asset/art/ui/note/c02_slices/c02_musicbox_needPuppet.tres" id="11_vv1f8"] +[ext_resource type="Texture2D" uid="uid://bds1oni7dlapf" path="res://asset/art/ui/note/c02_slices/c02_meat_knockDoor.tres" id="13_iiemy"] +[ext_resource type="Texture2D" uid="uid://kiyw03vc3w12" path="res://asset/art/ui/note/c02_slices/c02_meat_stopMouse.tres" id="14_cd76s"] +[ext_resource type="Texture2D" uid="uid://bvdpo5k83tb6s" path="res://asset/art/ui/note/c02_slices/c02_shoe_giveToMouce.tres" id="15_60qdw"] +[ext_resource type="Texture2D" uid="uid://viyauy3w72bv" path="res://asset/art/ui/note/c02_slices/c02_gate_chain.tres" id="16_c71vy"] +[ext_resource type="Texture2D" uid="uid://cdygjqy3a0ugw" path="res://asset/art/ui/note/c02_slices/c02_map_1Right.tres" id="17_gmufd"] +[ext_resource type="Texture2D" uid="uid://bjn4oo0fieim6" path="res://asset/art/ui/note/c02_slices/c02_split_illusionSpace.tres" id="18_en7n8"] +[ext_resource type="Texture2D" uid="uid://ccm0eg5apjro0" path="res://asset/art/ui/note/c02_slices/c02_xchan_giveHerPuppet.tres" id="19_16oeu"] +[ext_resource type="Texture2D" uid="uid://ddbjvbjpd6nsr" path="res://asset/art/ui/note/c02_slices/c02_map_2.tres" id="20_0me01"] +[ext_resource type="Texture2D" uid="uid://cfrr5118wx6f" path="res://asset/art/ui/note/c02_slices/c02_hand_requireCoin.tres" id="21_x45ak"] +[ext_resource type="Texture2D" uid="uid://dqg5ha6sg60ti" path="res://asset/art/ui/note/c02_slices/c02_xchan_sheKnowsMe.tres" id="22_rkppt"] +[ext_resource type="Texture2D" uid="uid://bs2aus63tgwv1" path="res://asset/art/ui/note/c02_slices/c02_xchan_isSheGohst.tres" id="23_njh4q"] [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_j3kdg"] -[sub_resource type="GDScript" id="GDScript_7vpan"] -script/source = "extends Event2D - -# var prev_stage := 0 -# var stage := 0 - - -func _ready() -> void: - super._ready() - if stage > 0: - get_node(\"../TextureRect\" + str(stage)).visible = true - -func _on_global_stage_updated(e: StringName, s: int): - super._on_global_stage_updated(e, s) - - -func _on_ground_ready(ground: Ground2D): - pass - - -func _on_pre_stage_updated(): - pass - - -func _on_stage_updated(): - pass -" - [node name="Note" type="CanvasLayer"] process_mode = 3 script = ExtResource("1_e61yw") @@ -89,69 +75,254 @@ texture = ExtResource("5_d1cia") expand_mode = 5 stretch_mode = 5 -[node name="TextureRect1" type="TextureRect" parent="Bag/Book"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("6_7vpan") -expand_mode = 1 +[node name="Event_handnote_chapter_stage" type="Sprite2D" parent="Bag/Book"] +position = Vector2(340, 137) +scale = Vector2(0.3, 0.3) +script = ExtResource("5_nk0pj") +event = &"handnote_chapter_stage" +metadata/_custom_type_script = "uid://c5woj7mivdxrh" -[node name="TextureRect2" type="TextureRect" parent="Bag/Book"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("6_n8isc") -expand_mode = 1 +[node name="Event_handnote_c02_road_address" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(-493.333, -276.667) +texture = ExtResource("6_dohnv") +script = ExtResource("7_nfxph") +event = &"handnote_c02_road_address" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" -[node name="TextureRect3" type="TextureRect" parent="Bag/Book"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("7_8rh03") -expand_mode = 1 +[node name="Event_handnote_c02_list_namesAndGoal" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(-566.667, -163.333) +texture = ExtResource("8_nfxph") +script = ExtResource("7_nfxph") +event = &"handnote_c02_list_namesAndGoal" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" -[node name="TextureRect4" type="TextureRect" parent="Bag/Book"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("8_kiw8q") -expand_mode = 1 +[node name="Event_handnote_c02_map_1Left" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(-660, 250) +texture = ExtResource("9_kv812") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_1Left" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" -[node name="TextureRect5" type="TextureRect" parent="Bag/Book"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("7_d1cia") -expand_mode = 1 +[node name="Event_handnote_c02_hand_exchange" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left"] +position = Vector2(-186.667, 16.6667) +texture = ExtResource("10_1efbh") +script = ExtResource("7_nfxph") +event = &"handnote_c02_hand_exchange" +hide_if_on_stage = Array[int]([0, 3]) -[node name="Event2D" type="Node2D" parent="Bag/Book"] -script = SubResource("GDScript_7vpan") -metadata/_custom_type_script = "uid://bkkiyk5jkdw4d" +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left/Event_handnote_c02_hand_exchange"] +position = Vector2(-16.6663, -20.0001) +scale = Vector2(1.64321, 1.62157) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_musicbox_needPuppet" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left"] +position = Vector2(-153.333, 140) +texture = ExtResource("11_vv1f8") +script = ExtResource("7_nfxph") +event = &"handnote_c02_musicbox_needPuppet" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left/Event_handnote_c02_musicbox_needPuppet"] +position = Vector2(3.33337, 3.05176e-05) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_meat_knockDoor" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left"] +position = Vector2(-40, 53.3333) +texture = ExtResource("13_iiemy") +script = ExtResource("7_nfxph") +event = &"handnote_c02_meat_knockDoor" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left/Event_handnote_c02_meat_knockDoor"] +position = Vector2(3.33786e-05, 3.05176e-05) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_meat_stopMouse" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left"] +position = Vector2(160, -80) +texture = ExtResource("14_cd76s") +script = ExtResource("7_nfxph") +event = &"handnote_c02_meat_stopMouse" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left/Event_handnote_c02_meat_stopMouse"] +position = Vector2(3.33337, 3.05176e-05) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_gate_chain" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left"] +position = Vector2(143.333, 136.667) +texture = ExtResource("16_c71vy") +script = ExtResource("7_nfxph") +event = &"handnote_c02_gate_chain" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Left/Event_handnote_c02_gate_chain"] +position = Vector2(0.000396729, 3.33299) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_map_1Right" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(-363.333, 340) +texture = ExtResource("17_gmufd") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_1Right" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_split_illusionSpace" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Right"] +position = Vector2(-33.3334, -80) +texture = ExtResource("18_en7n8") +script = ExtResource("7_nfxph") +event = &"handnote_c02_split_illusionSpace" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="Event_handnote_c02_xchan_giveHerPuppet" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Right"] +position = Vector2(50, -56.6666) +texture = ExtResource("19_16oeu") +script = ExtResource("7_nfxph") +event = &"handnote_c02_xchan_giveHerPuppet" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_1Right/Event_handnote_c02_xchan_giveHerPuppet"] +position = Vector2(-0.000321865, -3.3334) +rotation = -0.261797 +scale = Vector2(2, 1.2) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_map_2" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(313.333, -143.333) +texture = ExtResource("20_0me01") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_2" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_hand_requireCoin" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_2"] +position = Vector2(146.667, -3.33331) +texture = ExtResource("21_x45ak") +script = ExtResource("7_nfxph") +event = &"handnote_c02_hand_requireCoin" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_2/Event_handnote_c02_hand_requireCoin"] +position = Vector2(3.33337, 3.33298) +scale = Vector2(1.35575, 1.86951) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_shoe_giveToMouce" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_2"] +position = Vector2(-46.6666, -10) +texture = ExtResource("15_60qdw") +script = ExtResource("7_nfxph") +event = &"handnote_c02_shoe_giveToMouce" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_map_2/Event_handnote_c02_shoe_giveToMouce"] +position = Vector2(0.000236511, 3.33301) +scale = Vector2(1.35575, 1.86951) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_xchan_sheKnowsMe" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage"] +position = Vector2(-443.333, -10) +texture = ExtResource("22_rkppt") +script = ExtResource("7_nfxph") +event = &"handnote_c02_xchan_sheKnowsMe" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage/Event_handnote_c02_xchan_sheKnowsMe"] +position = Vector2(96.6663, 26.6666) +texture = ExtResource("23_njh4q") + +[node name="Event_handnote_chapter_stage2" type="Sprite2D" parent="Bag/Book"] +visible = false +position = Vector2(340, 137) +scale = Vector2(0.3, 0.3) +script = ExtResource("5_nk0pj") +chapter = 2 +slices_path = "res://asset/art/ui/note/c03_slices/" +event = &"handnote_chapter_stage" +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_road_address" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(-493.333, -276.667) +texture = ExtResource("6_dohnv") +script = ExtResource("7_nfxph") +event = &"handnote_c02_road_address" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_list_namesAndGoal" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(-566.667, -163.333) +texture = ExtResource("8_nfxph") +script = ExtResource("7_nfxph") +event = &"handnote_c02_list_namesAndGoal" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_map_1Left" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(-660, 250) +texture = ExtResource("9_kv812") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_1Left" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_meat_knockDoor" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2/Event_handnote_c02_map_1Left"] +position = Vector2(-40, 53.3333) +texture = ExtResource("13_iiemy") +script = ExtResource("7_nfxph") +event = &"handnote_c02_meat_knockDoor" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2/Event_handnote_c02_map_1Left/Event_handnote_c02_meat_knockDoor"] +position = Vector2(3.33786e-05, 3.05176e-05) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_meat_stopMouse" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2/Event_handnote_c02_map_1Left"] +position = Vector2(160, -80) +texture = ExtResource("14_cd76s") +script = ExtResource("7_nfxph") +event = &"handnote_c02_meat_stopMouse" +hide_if_on_stage = Array[int]([0, 3]) + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2/Event_handnote_c02_map_1Left/Event_handnote_c02_meat_stopMouse"] +position = Vector2(3.33337, 3.05176e-05) +scale = Vector2(1.5, 1.5) +texture = ExtResource("11_dohnv") + +[node name="Event_handnote_c02_map_1Right" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(-363.333, 340) +texture = ExtResource("17_gmufd") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_1Right" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_map_2" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(313.333, -143.333) +texture = ExtResource("20_0me01") +script = ExtResource("7_nfxph") +event = &"handnote_c02_map_2" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="Event_handnote_c02_xchan_sheKnowsMe" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2"] +position = Vector2(-443.333, -10) +texture = ExtResource("22_rkppt") +script = ExtResource("7_nfxph") +event = &"handnote_c02_xchan_sheKnowsMe" +hide_if_on_stage = Array[int]([0, 3]) +metadata/_custom_type_script = "uid://c5woj7mivdxrh" + +[node name="BlotOut" type="Sprite2D" parent="Bag/Book/Event_handnote_chapter_stage2/Event_handnote_c02_xchan_sheKnowsMe"] +position = Vector2(96.6663, 26.6666) +texture = ExtResource("23_njh4q") [node name="Tabs" parent="Bag" node_paths=PackedStringArray("root") instance=ExtResource("4_7vpan")] unique_name_in_owner = true