diff --git a/asset/art/prop/c01/银元.png b/asset/art/prop/c01/银元.png new file mode 100644 index 00000000..a7004bd7 Binary files /dev/null and b/asset/art/prop/c01/银元.png differ diff --git a/asset/art/prop/c01/银元.png.import b/asset/art/prop/c01/银元.png.import new file mode 100644 index 00000000..a6695ed4 --- /dev/null +++ b/asset/art/prop/c01/银元.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yvwjasroj4yr" +path="res://.godot/imported/银元.png-6bbd7da0ef5c58c6a0d8da6a2fc0e979.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://asset/art/prop/c01/银元.png" +dest_files=["res://.godot/imported/银元.png-6bbd7da0ef5c58c6a0d8da6a2fc0e979.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/asset/art/scene/c01/s08_书店/bg_书店.png b/asset/art/scene/c01/s08_书店/bg_书店.png index c384df96..2ed984b2 100755 Binary files a/asset/art/scene/c01/s08_书店/bg_书店.png and b/asset/art/scene/c01/s08_书店/bg_书店.png differ diff --git a/asset/art/scene/c01/s08_书店/e_老板.png b/asset/art/scene/c01/s08_书店/e_老板.png new file mode 100755 index 00000000..0476e1a0 Binary files /dev/null and b/asset/art/scene/c01/s08_书店/e_老板.png differ diff --git a/asset/art/scene/c01/s08_书店/e_老板.png.import b/asset/art/scene/c01/s08_书店/e_老板.png.import new file mode 100644 index 00000000..90bee4f0 --- /dev/null +++ b/asset/art/scene/c01/s08_书店/e_老板.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://buu11ukisqfa" +path="res://.godot/imported/e_老板.png-b71754ae0ab3aa1c0984709612bc682c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://asset/art/scene/c01/s08_书店/e_老板.png" +dest_files=["res://.godot/imported/e_老板.png-b71754ae0ab3aa1c0984709612bc682c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/asset/art/scene/c01/s08_书店/fg_前景.png b/asset/art/scene/c01/s08_书店/fg_前景.png new file mode 100755 index 00000000..cebc7720 Binary files /dev/null and b/asset/art/scene/c01/s08_书店/fg_前景.png differ diff --git a/asset/art/scene/c01/s08_书店/fg_前景.png.import b/asset/art/scene/c01/s08_书店/fg_前景.png.import new file mode 100644 index 00000000..18e05a46 --- /dev/null +++ b/asset/art/scene/c01/s08_书店/fg_前景.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bp4y3vujvsl7r" +path="res://.godot/imported/fg_前景.png-4124b6e03ace8a27f9e212ce366490eb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://asset/art/scene/c01/s08_书店/fg_前景.png" +dest_files=["res://.godot/imported/fg_前景.png-4124b6e03ace8a27f9e212ce366490eb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/asset/art/scene/c01/s08_书店/l_打光.png b/asset/art/scene/c01/s08_书店/l_打光.png new file mode 100755 index 00000000..cf47fe27 Binary files /dev/null and b/asset/art/scene/c01/s08_书店/l_打光.png differ diff --git a/asset/art/scene/c01/s08_书店/l_打光.png.import b/asset/art/scene/c01/s08_书店/l_打光.png.import new file mode 100644 index 00000000..4d4fb604 --- /dev/null +++ b/asset/art/scene/c01/s08_书店/l_打光.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bho8xal4ha50l" +path="res://.godot/imported/l_打光.png-c10d283af7ba03395bd0a1e6892704fb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://asset/art/scene/c01/s08_书店/l_打光.png" +dest_files=["res://.godot/imported/l_打光.png-c10d283af7ba03395bd0a1e6892704fb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/asset/art/scene/c01/s08_书店/书店参考.png b/asset/art/scene/c01/s08_书店/书店参考.png index 7079075a..0c705a2c 100755 Binary files a/asset/art/scene/c01/s08_书店/书店参考.png and b/asset/art/scene/c01/s08_书店/书店参考.png differ diff --git a/asset/dialogue/c01.csv b/asset/dialogue/c01.csv index 9e11a937..a61c3f4a 100644 --- a/asset/dialogue/c01.csv +++ b/asset/dialogue/c01.csv @@ -2,6 +2,8 @@ keys,zh_CN,en,_character,_notes,_tags c01_s05_院长房间1,百岁光阴⼀梦蝶,重回⾸往事堪嗟。今⽇春来,明朝花谢。急罚盏夜阑灯灭。,,,, c01_s05_院长房间2,(疑惑——),,吕萍,, 音效_开门,开门,,音效,, +c01_s07_吉祥话1,(吉祥话文本)恭喜发财!,,小孩甲,, +c01_s07_吉祥话2,(吉祥话文本)恭喜!,,小孩乙,, c01_s01_黑雾_001,“时辰将至,锁魂障眼,自欺欺人”,,雾,note,[#shake] c01_s01_黑雾_002,“孤魂也罢,恶鬼亦然”,,雾,,[#shake] c01_s01_黑雾_003,“三魂皆不可阙,将它们都带回来吧”,,雾,,[#shake] @@ -23,8 +25,8 @@ c01_s06_谈论鬼差6,(台词设计)啊?可是...,,小蝶,, c01_s06_谈论鬼差7,(台词设计)开始咯!5...4...,,小胖孩,,[#wait=2] c01_s06_谈论鬼差8,啊!,,小蝶,,[#wait=0.5] c01_s06_谈论鬼差9,(台词设计)3...2...1...,,小胖孩,,[#wait=3] -c01_s07_吉祥话1,(吉祥话文本)恭喜发财!,,小孩甲,, -c01_s07_吉祥话2,(吉祥话文本)恭喜!,,小孩乙,, +c01_s08_书店进门老板台词,把报纸放在柜台上吧,,书店老板,, +c01_s08_书店老板任务,(台词设计:安排⼯作,整理书架,有封寄给玩家的信,放在柜台上),,书店老板,, c01_吕萍与车夫_01,“又是这个梦”,,吕萍,, c01_吕萍与车夫_02,“这个星期已经第三次了”,,吕萍,, c01_吕萍与车夫_03,“我到底是怎么了”,,吕萍,, diff --git a/asset/dialogue/c01.dialogue b/asset/dialogue/c01.dialogue index 08e85e85..0e04b0bf 100644 --- a/asset/dialogue/c01.dialogue +++ b/asset/dialogue/c01.dialogue @@ -40,6 +40,14 @@ 小胖孩: (台词设计)3...2...1... [#wait=3] [ID:c01_s06_谈论鬼差9] => END +~ c01_s08_书店进门老板台词 +书店老板: 把报纸放在柜台上吧 [ID:c01_s08_书店进门老板台词] +=> END + +~ c01_s08_书店老板任务 +书店老板: (台词设计:安排⼯作,整理书架,有封寄给玩家的信,放在柜台上) [ID:c01_s08_书店老板任务] +=> END + ~ c01_s11_车夫对话1 吕萍: “又是这个梦” [ID:c01_吕萍与车夫_01] diff --git a/asset/dialogue/item_description.csv b/asset/dialogue/item_description.csv index 3483c647..29c6c14d 100644 --- a/asset/dialogue/item_description.csv +++ b/asset/dialogue/item_description.csv @@ -52,8 +52,12 @@ ui_夜行船3,今⽇春来。明朝花谢。,,,, ui_夜行船4,急罚盏夜阑灯灭。,,,, ui_夜行船5,夜行船,,,, prop_空手,空手,,,, -prop_令牌,令牌,,,,[#texture=c01/令牌物品.png][#inspect=c01/令牌.png] prop_信碎片1,信碎片(一),,,,[#texture=c01/信碎片1.png] +prop_信碎片2,信碎片(二),,,,[#texture=c01/信碎片1.png] +prop_院长的信,院长的信,,,,[#texture=c01/信碎片1.png] +prop_报纸,报纸,,,,[#texture=c01/信碎片1.png] +prop_银元,银元,,,,[#texture=c01/银元.png] +prop_令牌,令牌,,,,[#texture=c01/令牌物品.png][#inspect=c01/令牌.png] prop_装有灵魂的令牌,装有灵魂的令牌,,,,[#texture=c01/装有灵魂的令牌物品.png][#inspect=c01/装有灵魂的令牌.png] prop_火柴,火柴,,,,[#texture=c02/火柴.png] prop_小猫玩具的脑袋,小猫玩具的脑袋,Catty's Head,,,[#texture=c02/小猫玩具脑袋物品.png][#inspect=c02/小猫玩具脑袋.png] @@ -62,6 +66,8 @@ prop_1012钥匙,1012钥匙,1012 Key,,,[#texture=c02/1012钥匙物品.png][#inspe prop_老虎钳,老虎钳,,,,[#texture=c02/老虎钳物品.png][#inspect=c02/老虎钳.png] prop_3014旋转锁钥匙,3014旋转锁钥匙,,,,[#texture=c02/3014旋转锁钥匙物品.png][#inspect=c02/3014旋转锁钥匙.png] prop_小猫玩具完整,小猫玩具,,,,[#texture=c02/小猫玩具完整物品.png][#inspect=c02/小猫玩具完整.png] +c01_s08_书店工作,我还有工作,,,, +c01_s08_书店工钱,我还有⼯钱没拿,,,, notes_纸条,纸条,,,, notes_锁住了,锁住了,,,, notes_打不开,打不开,,,, @@ -83,6 +89,8 @@ c01_s06_小朋友房间,这是其他小朋友的房间,,,, c01_s07_钱碗,碗⾥是铜钱,,,, c01_s07_书店展柜,"好多书... 要是能在这里工作就好了",,,, +c01_s08_书架游戏完成,"这些书怎么变成这样了? +好可惜...我可能需要离开了",,,, c02_小蝉寻人启事_脸部破碎,"似乎是一张寻人启事 脸的部分被撕掉了,看不清",,,, c02_卫生宣传画,几张卫生宣传画,,,, diff --git a/asset/dialogue/item_description.dialogue b/asset/dialogue/item_description.dialogue index f619053e..e51371f7 100644 --- a/asset/dialogue/item_description.dialogue +++ b/asset/dialogue/item_description.dialogue @@ -43,8 +43,13 @@ 空手 [ID:prop_空手] # texture 路径从 "res://asset/art/prop/" 之后算起 # c01 -令牌 [#texture=c01/令牌物品.png][#inspect=c01/令牌.png] [ID:prop_令牌] 信碎片(一) [#texture=c01/信碎片1.png] [ID:prop_信碎片1] +# TODO 美术资源更换 +信碎片(二) [#texture=c01/信碎片1.png] [ID:prop_信碎片2] +院长的信 [#texture=c01/信碎片1.png] [ID:prop_院长的信] +报纸 [#texture=c01/信碎片1.png] [ID:prop_报纸] +银元 [#texture=c01/银元.png] [ID:prop_银元] +令牌 [#texture=c01/令牌物品.png][#inspect=c01/令牌.png] [ID:prop_令牌] 装有灵魂的令牌 [#texture=c01/装有灵魂的令牌物品.png][#inspect=c01/装有灵魂的令牌.png] [ID:prop_装有灵魂的令牌] # c02 火柴 [#texture=c02/火柴.png] [ID:prop_火柴] @@ -56,6 +61,11 @@ 小猫玩具 [#texture=c02/小猫玩具完整物品.png][#inspect=c02/小猫玩具完整.png] [ID:prop_小猫玩具完整] => END +~ HoldingReason +我还有工作 [ID:c01_s08_书店工作] +我还有⼯钱没拿 [ID:c01_s08_书店工钱] +=> END + ~ Notes # 通用 纸条 [ID:notes_纸条] @@ -80,6 +90,8 @@ # c01-s07 书店外 碗⾥是铜钱 [ID:c01_s07_钱碗] 好多书...\n要是能在这里工作就好了 [ID:c01_s07_书店展柜] +# c01-s08 书店 +这些书怎么变成这样了?\n好可惜...我可能需要离开了 [ID:c01_s08_书架游戏完成] # c02 # c02-s01 街道 diff --git a/asset/dialogue/npc.csv b/asset/dialogue/npc.csv index 497a0b3d..16f94335 100644 --- a/asset/dialogue/npc.csv +++ b/asset/dialogue/npc.csv @@ -3,3 +3,4 @@ c02_张胖子_招呼吕萍5,“来来来,过来,过来”,张胖子,,[#anony c02_吕萍问方瞎子_2,“祸福在己,当自求;兴衰有数,莫强留”,方瞎子,,[#anonymous], c01_s07_吉祥话1,(吉祥话文本)恭喜发财!,小孩甲,,, c01_s07_吉祥话2,(吉祥话文本)恭喜!,小孩乙,,, +c01_s12_书店外发钱,发钱了!发赏钱啦!,小孩,,, diff --git a/asset/dialogue/npc.dialogue b/asset/dialogue/npc.dialogue index c3bbc5aa..578eb068 100644 --- a/asset/dialogue/npc.dialogue +++ b/asset/dialogue/npc.dialogue @@ -20,4 +20,8 @@ ~ c01_s07_吉祥话2 小孩乙: (吉祥话文本)恭喜! [ID:c01_s07_吉祥话2] -=> END \ No newline at end of file +=> END + +~ c01_s12_诡异的书店外发钱 +小孩: 发钱了!发赏钱啦! [ID:c01_s12_书店外发钱] +=> END diff --git a/scene/entity/ambush.gd b/scene/entity/ambush.gd index 61b67212..525329f0 100644 --- a/scene/entity/ambush.gd +++ b/scene/entity/ambush.gd @@ -82,11 +82,11 @@ func _ready() -> void: print("Ambush has played, name=", name, " one_shot=", one_shot) if one_shot: return - if on_first_enter_tree: - _entered(null) sign_mark.interacted.connect(_interacted) area.body_entered.connect(_entered) area.area_entered.connect(_area_entered) + if on_first_enter_tree: + call_deferred("_do_trigger") func _check_sign_display(): diff --git a/scene/entity/interactable.gd b/scene/entity/interactable.gd index 04b9262c..1b78bd04 100644 --- a/scene/entity/interactable.gd +++ b/scene/entity/interactable.gd @@ -28,12 +28,10 @@ var interacted_times: int: ground_archive.set_pair(name, "interacted_times", val) static var item_config_res = preload("res://asset/dialogue/item_description.dialogue") -var items: PackedStringArray func _ready() -> void: if Engine.is_editor_hint(): - _reload_items() return area2d.body_entered.connect(_reset) area2d.body_exited.connect(_on_cancel) @@ -54,26 +52,17 @@ func _check_sign_display(): sign_mark.enabled = false -func _reload_items() -> void: - items.clear() - var id = item_config_res.titles["PropItems"] - var current_line = item_config_res.lines[id] - while current_line: - if current_line.has("translation_key"): - items.append(current_line.translation_key) - if not current_line.has("next_id") or current_line.next_id == "end": - break - current_line = item_config_res.lines[current_line.next_id] - notify_property_list_changed() - - func _reset(_body = null) -> void: + _reset_sign_testure_to_prop() + var prop_hud = SceneManager.get_prop_hud() as PropHud + if not prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop): + prop_hud.current_item_changed.connect(_set_sign_texture_to_prop) + + +func _reset_sign_testure_to_prop(): var key = SceneManager.get_current_prop(false) if key: _set_sign_texture_to_prop(key) - var prop_hud = SceneManager.get_prop_hud() as PropHud - if not prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop): - prop_hud.current_item_changed.connect(_set_sign_texture_to_prop) # 根据当前 prop,调整 sign 所显示的 texture @@ -124,9 +113,20 @@ func _on_interacted() -> void: # print("%s interacted with %s. total times: %s" % [name, prop_key, interacted_times]) interact_mutex.unlock() _check_sign_display() + _reset_sign_testure_to_prop() func _get_property_list() -> Array[Dictionary]: + var items = [] + if Engine.is_editor_hint(): + var id = item_config_res.titles["PropItems"] + var current_line = item_config_res.lines[id] + while current_line: + if current_line.has("translation_key"): + items.append(current_line.translation_key) + if not current_line.has("next_id") or current_line.next_id == "end": + break + current_line = item_config_res.lines[current_line.next_id] return [ { "name": "prop_key", diff --git a/scene/entity/note.gd b/scene/entity/note.gd index c66aa974..70737a32 100644 --- a/scene/entity/note.gd +++ b/scene/entity/note.gd @@ -84,14 +84,7 @@ func _on_interacted() -> void: func _show_os(res, title): - var lines = [] - var current_line = await res.get_next_dialogue_line(title) - while current_line: - lines.append(current_line) - if current_line.next_id != "end": - current_line = await res.get_next_dialogue_line(current_line.next_id) - else: - break + var lines = await DialogueUtil.get_lines(res, title) SceneManager.pop_os(lines) SceneManager.freeze_player(1.0, action) diff --git a/scene/entity/portal.gd b/scene/entity/portal.gd index cdc1b5c6..de372afd 100644 --- a/scene/entity/portal.gd +++ b/scene/entity/portal.gd @@ -26,6 +26,9 @@ var target_portal := "none": # 只在编辑器模式下检查 if is_node_ready() and Engine.is_editor_hint(): _check_sign_mark_and_texture() +# holding 意味着当前门禁用,不可传送,需要先完成某些条件 +@export var holding := false +@export var holding_reason_key := "" @export var default_texture: Texture2D @export var opened_texture: Texture2D @export var default_sign_texture: Texture2D @@ -109,6 +112,13 @@ var interact_mutex = Mutex.new() func _on_interacted() -> void: + if holding: + if holding_reason_key: + var reason = tr(holding_reason_key) + if reason: + var lines = await DialogueUtil.generate_lines(reason) + SceneManager.pop_os(lines) + return if target_portal == "none" or not enabled: return interact_mutex.lock() diff --git a/scene/ground/scene/c01/s08_animation.gd b/scene/ground/scene/c01/s08_animation.gd index 8f969d92..afe43061 100644 --- a/scene/ground/scene/c01/s08_animation.gd +++ b/scene/ground/scene/c01/s08_animation.gd @@ -7,69 +7,168 @@ func _default_data() -> Dictionary: return {} +var self_game_scene = preload("res://scene/little_game/书架/书架.tscn") +var self_game_node = self_game_scene.instantiate() +var envelope_game_scene = preload("res://scene/little_game/拼凑信件.tscn") +var envelope_game_node = envelope_game_scene.instantiate() + + func _ready() -> void: super._ready() if Engine.is_editor_hint(): return - game_node.exiting.connect(_on_game_exiting) - game_node.success.connect(_on_game_success) + self_game_node.exiting.connect(_on_self_game_exiting) + self_game_node.success.connect(_on_self_game_success) + envelope_game_node.exiting.connect(_on_envelope_game_exiting) + envelope_game_node.success.connect(_on_envelope_game_success) +var counter: Interactable2D +var envolope_table: Interactable2D var ladder: Ambush2D +var coin: Ambush2D var mask: ColorRect +var left_protal: Portal2D +var shelf_game_success = false +var envelope_game_success = false +var manager +var mice +var light: DirectionalLight2D +# 诡异的光效 +const WEIRD_COLOR = Color(0.921, 0.43, 0.377) func _on_ground_ready() -> void: ladder = $"../DeployLayer/Ambush梯子" + envolope_table = $"../DeployLayer/Interactable信件书桌" mask = $"../DeployLayer/Mask" - var shelf_game_success = ArchiveManager.archive.get_global_value("shelf_game_success") - if shelf_game_success: - ladder.enabled = false - _game_success_setup() + left_protal = $"../DeployLayer/portal_left" as Portal2D + counter = $"../DeployLayer/Interactable报纸柜台" + coin = $"../DeployLayer/Ambush银元" + mice = $"../DeployLayer/自动跟随的老鼠" + manager = $"../DeployLayer/老板" + light = $"../DirectionalLight2D" + # 首先放报纸,触发动画,领取任务 + if counter.interacted_times > 0: + ladder.enabled = true + envolope_table.enabled = true + $"../DeployLayer/Ambush银元".enabled = true else: - $"../DeployLayer/自动跟随的老鼠".visible = false + counter.interacted.connect(assign_tasks, CONNECT_ONE_SHOT) + ladder.enabled = false + envolope_table.enabled = false + envelope_game_success = ArchiveManager.archive.get_global_value("envelope_game_success") + if envelope_game_success: + envolope_table.enabled = false + else: + envolope_table.interacted.connect(_check_envelope_game) + if envolope_table.interacted_times == 1: + envolope_table.prop_key = "prop_信碎片2" + # 书架工作 + shelf_game_success = ArchiveManager.archive.get_global_value("shelf_game_success") + if shelf_game_success: + light.color = WEIRD_COLOR + ladder.enabled = false + manager.visible = false + mice.visible = true + else: + mice.visible = false + _check_portal() -var game_secne = preload("res://scene/little_game/书架/书架.tscn") -var game_node = game_secne.instantiate() +func _check_portal(): + if not shelf_game_success or not envelope_game_success: + left_protal.holding = true + left_protal.holding_reason_key = "c01_s08_书店工作" + elif not coin.played: + left_protal.holding = true + left_protal.holding_reason_key = "c01_s08_书店工钱" + else: + left_protal.holding = false + + +func _check_envelope_game() -> void: + if envolope_table.interacted_times == 1: + envolope_table.prop_key = "prop_信碎片2" + elif envolope_table.interacted_times >= 2: + envolope_table.prop_key = "" + play_envelope_game() + + +func first_enter_door() -> void: + DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s08_书店进门老板台词") + DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT) + SceneManager.freeze_player(0) + + +func _on_dialogue_ended(_res) -> void: + SceneManager.release_player() + + +func assign_tasks() -> void: + DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s08_书店老板任务") + DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT) + SceneManager.freeze_player(0) + ladder.enabled = true + envolope_table.enabled = true func _exit_tree() -> void: - if is_instance_valid(game_node): - game_node.queue_free() + if is_instance_valid(self_game_node): + self_game_node.queue_free() -func play_game() -> void: - if game_node.get_parent() != get_parent(): - get_parent().add_child(game_node) +func play_self_game() -> void: + if self_game_node.get_parent() != get_parent(): + get_parent().add_child(self_game_node) SceneManager.freeze_player(0) - # mask.color = Color(0, 0, 0, 0) -func _on_game_exiting() -> void: +func _on_self_game_exiting() -> void: if GlobalConfig.DEBUG: print("书架游戏 exiting") create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) SceneManager.release_player() -func _on_game_success() -> void: +func _on_self_game_success() -> void: ArchiveManager.archive.set_global_entry("shelf_game_success", true) + shelf_game_success = true ladder.enabled = false - _game_success_setup() + mice.visible = true + manager.visible = false + light.color = WEIRD_COLOR # TODO 播放小蝶从书架跌倒的动画 SceneManager.pop_debug_dialog_info("美术", "小蝶从书架跌倒") + var lines = await DialogueUtil.generate_lines(tr("c01_s08_书架游戏完成")) + var callback = SceneManager.pop_os.bind(lines) + get_tree().create_timer(1.0).timeout.connect(callback) + SceneManager.release_player() + _check_portal() + + +func play_envelope_game() -> void: + if envelope_game_node.get_parent() != get_parent(): + get_parent().add_child(envelope_game_node) + SceneManager.freeze_player(0) + + +func _on_envelope_game_exiting() -> void: + if GlobalConfig.DEBUG: + print("信封游戏 exiting") + create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) SceneManager.release_player() -func _game_success_setup() -> void: - _set_portal_target_to_wierd_street() - # 书架游戏成功后,展示老鼠 - $"../DeployLayer/自动跟随的老鼠".visible = true +func _on_envelope_game_success() -> void: + envolope_table.enabled = false + create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0) + ArchiveManager.archive.set_global_entry("envelope_game_success", true) + envelope_game_success = true + SceneManager.enable_prop_item("prop_院长的信") + _check_portal() -func _set_portal_target_to_wierd_street() -> void: - # 设置传送门目标为诡异的街道 - var portal = $"../DeployLayer/portal_left" as Portal2D - portal.target_scene = "c01_s12" - portal.target_portal = "2" +func pay_off_wage() -> void: + SceneManager.enable_prop_item("prop_银元") + _check_portal() diff --git a/scene/ground/scene/c01/s08_书店.tscn b/scene/ground/scene/c01/s08_书店.tscn index 7d1943a2..38a57dde 100644 --- a/scene/ground/scene/c01/s08_书店.tscn +++ b/scene/ground/scene/c01/s08_书店.tscn @@ -1,12 +1,38 @@ -[gd_scene load_steps=8 format=3 uid="uid://cwu4dhayra8pg"] +[gd_scene load_steps=14 format=3 uid="uid://cwu4dhayra8pg"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_b3cca"] [ext_resource type="Script" path="res://scene/ground/scene/c01/s08_animation.gd" id="2_0lque"] [ext_resource type="Texture2D" uid="uid://coo8sw8yigii6" path="res://asset/art/scene/c01/s08_书店/bg_书店.png" id="3_322m4"] [ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="4_c4lg5"] +[ext_resource type="Texture2D" uid="uid://buu11ukisqfa" path="res://asset/art/scene/c01/s08_书店/e_老板.png" id="4_ko03g"] [ext_resource type="Texture2D" uid="uid://cqy0qfmko00rx" path="res://asset/art/scene/c01/s08_书店/e_梯子.png" id="5_tnrke"] [ext_resource type="PackedScene" uid="uid://nwpbl5yuh280" path="res://scene/ground/script/c01/s00_自动跟随的老鼠.tscn" id="6_05do1"] [ext_resource type="Texture2D" uid="uid://c3ii6vsja0645" path="res://asset/art/scene/c01/s08_书店/书店参考.png" id="6_l2q02"] +[ext_resource type="PackedScene" uid="uid://cw3q5pvciumil" path="res://scene/entity/interactable.tscn" id="7_fue0t"] +[ext_resource type="Texture2D" uid="uid://bho8xal4ha50l" path="res://asset/art/scene/c01/s08_书店/l_打光.png" id="9_i4dqp"] +[ext_resource type="Texture2D" uid="uid://bp4y3vujvsl7r" path="res://asset/art/scene/c01/s08_书店/fg_前景.png" id="10_4e3a1"] + +[sub_resource type="Animation" id="Animation_5koky"] +resource_name = "one_shot" +tracks/0/type = "method" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimationPlayer") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"first_enter_door" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_xqgjo"] +_data = { +"one_shot": SubResource("Animation_5koky") +} [node name="S08" type="Node2D"] @@ -15,8 +41,11 @@ scene_name = "c01_s08" player_y = 60 [node name="AnimationPlayer" parent="Ground" index="0"] +libraries = { +"": SubResource("AnimationLibrary_xqgjo") +} script = ExtResource("2_0lque") -oneshot_animation = "" +oneshot_animation = "one_shot" [node name="BGSprite2D" parent="Ground" index="2"] texture = ExtResource("3_322m4") @@ -26,21 +55,34 @@ offset = Vector2(0, -158) position = Vector2(35, 28) debug_note = "c01_s07 的 2 号门通往书店 " -target_scene = "c01_s07" +target_scene = "c01_s12" target_portal = "2" +holding = true +holding_reason_key = "c01_s08_书店工作" [node name="portal_right" parent="Ground/DeployLayer" index="1"] +position = Vector2(593, 20) target_scene = "c02_s08" -[node name="Ambush梯子" parent="Ground/DeployLayer" index="2" instance=ExtResource("4_c4lg5")] +[node name="老板" type="Sprite2D" parent="Ground/DeployLayer" index="2"] +position = Vector2(148, 9) +texture = ExtResource("4_ko03g") + +[node name="Ambush梯子" parent="Ground/DeployLayer" index="3" instance=ExtResource("4_c4lg5")] position = Vector2(431, 18) texture = ExtResource("5_tnrke") trigger_mode = "interact" one_shot = false freeze_time = 1.0 -hook_method = "play_game" +hook_method = "play_self_game" -[node name="Mask" type="ColorRect" parent="Ground/DeployLayer" index="3"] +[node name="Interactable信件书桌" parent="Ground/DeployLayer" index="4" instance=ExtResource("7_fue0t")] +position = Vector2(227, 55) +one_shot = false +diable_prop_after_interacted = true +prop_key = "prop_信碎片1" + +[node name="Mask" type="ColorRect" parent="Ground/DeployLayer" index="5"] z_index = 10 custom_minimum_size = Vector2(700, 350) anchors_preset = 15 @@ -55,17 +97,38 @@ grow_vertical = 2 mouse_filter = 2 color = Color(0, 0, 0, 0) -[node name="自动跟随的老鼠" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_05do1")] +[node name="自动跟随的老鼠" parent="Ground/DeployLayer" index="6" instance=ExtResource("6_05do1")] position = Vector2(-8, 88) action_area = Vector2(600, 32) scatter_on_start = true +[node name="Interactable报纸柜台" parent="Ground/DeployLayer" index="7" instance=ExtResource("7_fue0t")] +position = Vector2(135, 49) +diable_prop_after_interacted = true +prop_key = "prop_报纸" + +[node name="Ambush银元" parent="Ground/DeployLayer" index="8" instance=ExtResource("4_c4lg5")] +position = Vector2(537, 21) +enabled = false +trigger_mode = "interact" +freeze_time = 1.0 +hook_method = "pay_off_wage" + +[node name="PointLight2D" type="PointLight2D" parent="Ground/AmbientLayer" index="0"] +position = Vector2(-148, 39) +color = Color(0.993775, 0.83578, 0.525594, 1) +energy = 0.4 +texture = ExtResource("9_i4dqp") +offset = Vector2(317, 0) + [node name="MainPlayer" parent="Ground" index="5"] position = Vector2(41, 98) character = "小小蝶" [node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"] -texture = null +position = Vector2(-1, 22) +texture = ExtResource("10_4e3a1") +offset = Vector2(0, 40) [node name="PlayerLine2D" parent="Ground/ParallaxForeground" index="2"] points = PackedVector2Array(30, 150, 545, 150) diff --git a/scene/ground/scene/c01/s12_animation.gd b/scene/ground/scene/c01/s12_animation.gd index 96129896..923ae76e 100644 --- a/scene/ground/scene/c01/s12_animation.gd +++ b/scene/ground/scene/c01/s12_animation.gd @@ -25,6 +25,6 @@ func _on_ground_ready() -> void: func _ghost_move() -> void: ghost.visible = true - ghost.play() + # ghost.play() var tween = create_tween() tween.tween_property(ghost, "global_position", Vector2(1500, 0), 20.0).as_relative() diff --git a/scene/ground/scene/c01/s12_书店外_诡异版.tscn b/scene/ground/scene/c01/s12_书店外_诡异版.tscn index a2e46e52..7908df45 100644 --- a/scene/ground/scene/c01/s12_书店外_诡异版.tscn +++ b/scene/ground/scene/c01/s12_书店外_诡异版.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://bol5hl68pbpgq"] +[gd_scene load_steps=15 format=3 uid="uid://bol5hl68pbpgq"] [ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_llw14"] [ext_resource type="Script" path="res://scene/ground/scene/c01/s12_animation.gd" id="2_krdvw"] @@ -12,6 +12,7 @@ [ext_resource type="PackedScene" uid="uid://h0s5ms7r7d8g" path="res://scene/shading/ghost.tscn" id="8_gk0gq"] [ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="9_nqlku"] [ext_resource type="PackedScene" uid="uid://cn1ypquvs07wx" path="res://scene/ground/script/c01/s12_飘动的寻人启事.tscn" id="11_pwu7i"] +[ext_resource type="PackedScene" uid="uid://0sofmhrl358m" path="res://scene/entity/npc.tscn" id="12_jutue"] [ext_resource type="PackedScene" uid="uid://nwpbl5yuh280" path="res://scene/ground/script/c01/s00_自动跟随的老鼠.tscn" id="12_qpv8m"] [node name="S12" type="Node2D"] @@ -56,7 +57,7 @@ focus_node = NodePath("../Ghost") [node name="Ghost" parent="Ground/DeployLayer" index="5" instance=ExtResource("8_gk0gq")] visible = false z_index = 10 -position = Vector2(-158, 23) +position = Vector2(-159, 18) autoplay = "" [node name="Ambush玩家被抓" parent="Ground/DeployLayer/Ghost" instance=ExtResource("9_nqlku")] @@ -71,6 +72,10 @@ scatter_on_start = true visible = false position = Vector2(99, -70) +[node name="Npc发钱小孩" parent="Ground/DeployLayer" index="8" instance=ExtResource("12_jutue")] +character_name = "小孩" +dialogue_title = "c01_s12_诡异的书店外发钱" + [node name="Light" parent="Ground/AmbientLayer" index="0" instance=ExtResource("5_kywnm")] position = Vector2(999, -5) texture = null diff --git a/scene/little_game/拼凑信件.gd b/scene/little_game/拼凑信件.gd index e99e2503..101b774e 100644 --- a/scene/little_game/拼凑信件.gd +++ b/scene/little_game/拼凑信件.gd @@ -1,5 +1,8 @@ extends CanvasLayer +signal exiting +signal success + @onready var container = %PartsContainer @onready var whole = %Whole @onready var content_rect = %Content @@ -11,7 +14,7 @@ var positions = [] # from part 0 to 3, rotated by 0, 90, 180, 270 degrees var rotations = [0, 0, 0, 0] var images = [] -var success = false +var game_finished = false var selected := 0: set(value): @@ -93,7 +96,7 @@ func _shuffle() -> void: func _display_selected() -> void: - if success: + if game_finished: return for i in range(4): if i == selected: @@ -110,7 +113,7 @@ func _check_answer() -> void: if rotations[id] != 0 or id != i: _success = false break - success = _success + game_finished = _success if _success: # 从 container 中移除,添加到 whole 中 var tween = create_tween() @@ -130,11 +133,20 @@ func _check_answer() -> void: func _post_success(): var tween = create_tween() - tween.parallel().tween_property(content_rect, "modulate:a", 1.0, 1.0) + tween.tween_property(content_rect, "modulate:a", 1.0, 1.0) func _unhandled_input(event: InputEvent) -> void: - if success: + # block all input + get_viewport().set_input_as_handled() + if event.is_action_pressed("cancel"): + if game_finished: + success.emit() + else: + exiting.emit() + get_parent().remove_child(self) + return + if game_finished: return var handled = false if event.is_action_pressed("up"): @@ -163,5 +175,4 @@ func _unhandled_input(event: InputEvent) -> void: if handled: $SfxMove.play() _display_selected() - _check_answer() - get_viewport().set_input_as_handled() + _check_answer() \ No newline at end of file diff --git a/scene/little_game/拼凑信件.tscn b/scene/little_game/拼凑信件.tscn index 64399377..e89d03ec 100644 --- a/scene/little_game/拼凑信件.tscn +++ b/scene/little_game/拼凑信件.tscn @@ -82,9 +82,9 @@ texture_normal = SubResource("AtlasTexture_4e0jv") [node name="1" type="TextureButton" parent="Control/Whole"] layout_mode = 2 -offset_left = -12.5 +offset_left = -13.75 offset_top = -26.25 -offset_right = 139.5 +offset_right = 138.25 offset_bottom = 128.75 grow_horizontal = 2 grow_vertical = 2 @@ -92,10 +92,10 @@ texture_normal = SubResource("AtlasTexture_qxu7b") [node name="2" type="TextureButton" parent="Control/Whole"] layout_mode = 2 -offset_left = -66.25 -offset_top = 48.75 -offset_right = 93.75 -offset_bottom = 212.75 +offset_left = -71.25 +offset_top = 37.5 +offset_right = 88.75 +offset_bottom = 201.5 grow_horizontal = 2 grow_vertical = 2 texture_normal = SubResource("AtlasTexture_mbck6") diff --git a/scene/shading/ghost.gdshader b/scene/shading/ghost.gdshader index f74592ad..81345aed 100644 --- a/scene/shading/ghost.gdshader +++ b/scene/shading/ghost.gdshader @@ -42,5 +42,5 @@ void fragment( ) , enable_shift ); //COLOR.rgb = mix(COLOR.rgb, pixel_color.rgb, .5); - COLOR.rgb = smoothstep(.1, .0, pixel_color.rgb); + COLOR.rgb = smoothstep(.0, .5, pixel_color.rgb); } diff --git a/scene/shading/ghost.tscn b/scene/shading/ghost.tscn index af295ce5..39e8c1b4 100644 --- a/scene/shading/ghost.tscn +++ b/scene/shading/ghost.tscn @@ -1,40 +1,22 @@ -[gd_scene load_steps=9 format=3 uid="uid://h0s5ms7r7d8g"] +[gd_scene load_steps=6 format=3 uid="uid://h0s5ms7r7d8g"] [ext_resource type="Shader" path="res://scene/shading/ghost.gdshader" id="1_n4q4i"] -[ext_resource type="Texture2D" uid="uid://wvnpr0w3srtr" path="res://asset/art/临时草稿/c01_序章/ghost-sheet.png" id="2_vp102"] +[ext_resource type="Texture2D" uid="uid://b7gyapghy3tsy" path="res://asset/art/neutral_point_light.png" id="2_4e2gx"] [ext_resource type="Texture2D" uid="uid://bc64s5xfysrc3" path="res://asset/art/scene/c01/s07_书店外/bg_书店外_夜晚.png" id="4_lap87"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_fv2fx"] shader = ExtResource("1_n4q4i") -shader_parameter/shake_power = 0.01 -shader_parameter/shake_rate = 1.0 +shader_parameter/shake_power = 0.002 +shader_parameter/shake_rate = 0.4 shader_parameter/shake_speed = 6.0 -shader_parameter/shake_block_size = 5.0 -shader_parameter/shake_color_rate = 0.005 - -[sub_resource type="AtlasTexture" id="AtlasTexture_vaq88"] -atlas = ExtResource("2_vp102") -region = Rect2(0, 0, 256, 256) - -[sub_resource type="AtlasTexture" id="AtlasTexture_mh23v"] -atlas = ExtResource("2_vp102") -region = Rect2(256, 0, 256, 256) - -[sub_resource type="AtlasTexture" id="AtlasTexture_5x2re"] -atlas = ExtResource("2_vp102") -region = Rect2(512, 0, 256, 256) +shader_parameter/shake_block_size = 2.0 +shader_parameter/shake_color_rate = 0.002 [sub_resource type="SpriteFrames" id="SpriteFrames_fqswq"] animations = [{ "frames": [{ -"duration": 3.0, -"texture": SubResource("AtlasTexture_vaq88") -}, { "duration": 1.0, -"texture": SubResource("AtlasTexture_mh23v") -}, { -"duration": 2.0, -"texture": SubResource("AtlasTexture_5x2re") +"texture": ExtResource("2_4e2gx") }], "loop": true, "name": &"default", diff --git a/util/dialogue_util.gd b/util/dialogue_util.gd new file mode 100644 index 00000000..11cb259e --- /dev/null +++ b/util/dialogue_util.gd @@ -0,0 +1,19 @@ +class_name DialogueUtil extends RefCounted + + +static func get_lines(res: DialogueResource, title: String) -> Array: + var lines = [] + var current_line = await res.get_next_dialogue_line(title) + while current_line: + lines.append(current_line) + if current_line.next_id != "end": + current_line = await res.get_next_dialogue_line(current_line.next_id) + else: + break + return lines + +# pop os lines +static func generate_lines(content: String) -> Array: + var text = "~ title\n" + content + "\n=> END" + var res = DialogueManager.create_resource_from_text(text) + return await get_lines(res, "title")