AnimationPlayer 增加便捷重置存档功能;空房间增加互动头套特写环节
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 23 KiB |
@ -231,7 +231,9 @@ func load_config() -> void:
|
|||||||
|
|
||||||
func load_archive() -> void:
|
func load_archive() -> void:
|
||||||
_check_dirs_and_archives()
|
_check_dirs_and_archives()
|
||||||
var selected_id = GlobalConfigManager.config.current_selected_archive_id
|
var selected_id = 0
|
||||||
|
if GlobalConfigManager.config:
|
||||||
|
selected_id = GlobalConfigManager.config.current_selected_archive_id
|
||||||
# if archive and selected_id == archive.archive_id:
|
# if archive and selected_id == archive.archive_id:
|
||||||
# return
|
# return
|
||||||
print("load_archive ", selected_id)
|
print("load_archive ", selected_id)
|
||||||
|
@ -155,6 +155,7 @@ func _set_camera_and_player_boundary():
|
|||||||
# set_player_boundary
|
# set_player_boundary
|
||||||
get_player().player_movement_rect = player_rect
|
get_player().player_movement_rect = player_rect
|
||||||
|
|
||||||
|
|
||||||
func _load_footstep_audio():
|
func _load_footstep_audio():
|
||||||
# foot step sound
|
# foot step sound
|
||||||
footstep_audio.audio_collections.clear()
|
footstep_audio.audio_collections.clear()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# @tool
|
@tool
|
||||||
class_name AnimationRoot extends AnimationPlayer
|
class_name AnimationRoot extends AnimationPlayer
|
||||||
|
|
||||||
# 在继承 AnimationRoot 的各场景内的脚本中,可以直接调用 DialogueResource
|
# 在继承 AnimationRoot 的各场景内的脚本中,可以直接调用 DialogueResource
|
||||||
@ -13,6 +13,15 @@ var dialogue_c06 := preload("res://asset/dialogue/c06.dialogue") as DialogueReso
|
|||||||
# 首次进入场景时触发
|
# 首次进入场景时触发
|
||||||
"oneshot_animation_played": false
|
"oneshot_animation_played": false
|
||||||
}
|
}
|
||||||
|
# event 也混合其中
|
||||||
|
@export var debug_global_data: Dictionary[String, Variant] = {
|
||||||
|
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"],
|
||||||
|
}
|
||||||
|
@export var debug_ground_data: Dictionary[String, Variant] = {}
|
||||||
|
|
||||||
|
@export var auto_reset_on_debug_restarting := true
|
||||||
|
@export_tool_button("reset 存档") var reset_archive = _reset_archive
|
||||||
|
|
||||||
var oneshot_animation := ""
|
var oneshot_animation := ""
|
||||||
var ground_archive: GroundArchive
|
var ground_archive: GroundArchive
|
||||||
var ground: Ground2D
|
var ground: Ground2D
|
||||||
@ -30,6 +39,9 @@ func _ready() -> void:
|
|||||||
printerr("ground not found")
|
printerr("ground not found")
|
||||||
return
|
return
|
||||||
if ground.restarting:
|
if ground.restarting:
|
||||||
|
print("auto reset archive=", auto_reset_on_debug_restarting)
|
||||||
|
if auto_reset_on_debug_restarting:
|
||||||
|
_reset_archive()
|
||||||
print("restarting: skip animation root _ready()")
|
print("restarting: skip animation root _ready()")
|
||||||
return
|
return
|
||||||
data.merge(_default_data(), true)
|
data.merge(_default_data(), true)
|
||||||
@ -52,6 +64,92 @@ func _ready() -> void:
|
|||||||
ready.connect(_on_ready)
|
ready.connect(_on_ready)
|
||||||
|
|
||||||
|
|
||||||
|
func _reset_archive() -> void:
|
||||||
|
var archive = (
|
||||||
|
ResourceLoader.load("user://data/archives/save000.tres", "AssembledArchive")
|
||||||
|
as AssembledArchive
|
||||||
|
)
|
||||||
|
# 重置全局变量
|
||||||
|
var prop_arr = archive.prop_inventory.default_enabled_items
|
||||||
|
if get_node("../MainPlayer").character.begins_with("吕萍"):
|
||||||
|
prop_arr = archive.prop_inventory.xdie_enabled_items
|
||||||
|
elif get_node("../MainPlayer").character.begins_with("小小蝶"):
|
||||||
|
prop_arr = archive.prop_inventory.xxdie_enabled_items
|
||||||
|
elif get_node("../MainPlayer").character.begins_with("小小小蝶"):
|
||||||
|
prop_arr = archive.prop_inventory.xxxdie_enabled_items
|
||||||
|
for prop in debug_global_data["enabled_items"]:
|
||||||
|
if not prop_arr.has(prop):
|
||||||
|
prop_arr.append(prop)
|
||||||
|
# 从 code 中找到 set_global_entry/get_global_value 方法中第一个 property
|
||||||
|
var code = get_script().source_code
|
||||||
|
# set_global_entry(property: StringName, value)
|
||||||
|
# get_global_value(property: StringName, default = null)
|
||||||
|
var setter_regx = RegEx.create_from_string(r'set_global_entry\(.?"(.+)"') as RegEx
|
||||||
|
var getter_regx = RegEx.create_from_string(r'get_global_value\(.?"(.+)"') as RegEx
|
||||||
|
var properties = {}
|
||||||
|
for setter_match in setter_regx.search_all(code):
|
||||||
|
properties[(setter_match as RegExMatch).get_string(1)] = true
|
||||||
|
for getter_match in getter_regx.search_all(code):
|
||||||
|
properties[(getter_match as RegExMatch).get_string(1)] = true
|
||||||
|
for p in properties.keys():
|
||||||
|
if debug_global_data.get(p) == null:
|
||||||
|
debug_global_data[p] = 0
|
||||||
|
# archive.set_global_entry(p, new_data[p])
|
||||||
|
archive.global_data_dict[p] = debug_global_data[p]
|
||||||
|
# 重置 ground_archive
|
||||||
|
if not archive.ground_archives.has(ground.scene_name):
|
||||||
|
archive.ground_archives[ground.scene_name] = GroundArchive.new()
|
||||||
|
archive.ground_archives[ground.scene_name].scene_name = ground.scene_name
|
||||||
|
# setup
|
||||||
|
_setup_ground_data(debug_ground_data, ground)
|
||||||
|
archive.ground_archives[ground.scene_name].data = debug_ground_data
|
||||||
|
# 重置 event 状态
|
||||||
|
# EventManager.set_stage(&"c02_burning_end", 2)
|
||||||
|
# EventManager.set_stage_if_greater("handnote_stage", 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 = (
|
||||||
|
RegEx.create_from_string(r'set_stage_if_greater\(.?"(.+)"') as RegEx
|
||||||
|
)
|
||||||
|
var events = {}
|
||||||
|
for event_match in event_setter_regx.search_all(code):
|
||||||
|
events[(event_match as RegExMatch).get_string(1)] = true
|
||||||
|
for event_match in event_set_greater_regx.search_all(code):
|
||||||
|
events[(event_match as RegExMatch).get_string(1)] = true
|
||||||
|
for event_match in event_getter_regx.search_all(code):
|
||||||
|
events[(event_match as RegExMatch).get_string(1)] = true
|
||||||
|
# 遍历 ".." 下所有节点,找到属于 Event2D 的节点
|
||||||
|
_find_event2d(events, ground)
|
||||||
|
for e in events.keys():
|
||||||
|
if debug_global_data.get(e) == null:
|
||||||
|
debug_global_data[e] = 0
|
||||||
|
archive.event_stage[e] = debug_global_data[e]
|
||||||
|
print("reset archive data success")
|
||||||
|
ResourceSaver.save(archive)
|
||||||
|
notify_property_list_changed()
|
||||||
|
|
||||||
|
func _setup_ground_data(g_data: Dictionary[String, Variant], node: Node):
|
||||||
|
if not node:
|
||||||
|
return
|
||||||
|
for child in node.get_children():
|
||||||
|
if child is Ambush2D and not g_data.has(child.name):
|
||||||
|
g_data[child.name] = {"played": false}
|
||||||
|
elif child is Interactable2D and not g_data.has(child.name):
|
||||||
|
g_data[child.name] = {"interacted_times": 0}
|
||||||
|
elif child is Pickable2D and not g_data.has(child.name):
|
||||||
|
g_data[child.name] = {"picked": false}
|
||||||
|
_setup_ground_data(g_data, child)
|
||||||
|
|
||||||
|
|
||||||
|
func _find_event2d(events: Dictionary, node: Node) -> void:
|
||||||
|
if not node:
|
||||||
|
return
|
||||||
|
for child in node.get_children():
|
||||||
|
if child is Event2D:
|
||||||
|
events[child.event] = true
|
||||||
|
_find_event2d(events, child)
|
||||||
|
|
||||||
|
|
||||||
func _on_ground_ready() -> void:
|
func _on_ground_ready() -> void:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -84,11 +182,11 @@ func set_data(property: StringName, value: Variant) -> bool:
|
|||||||
|
|
||||||
|
|
||||||
func set_global_entry(property: StringName, value: Variant) -> void:
|
func set_global_entry(property: StringName, value: Variant) -> void:
|
||||||
ArchiveManager.archive.set_global_entry(property, value)
|
ArchiveManager.set_global_entry(property, value)
|
||||||
|
|
||||||
|
|
||||||
func get_global_value(property: StringName, default_value = null) -> Variant:
|
func get_global_value(property: StringName, default_value = null) -> Variant:
|
||||||
var val = ArchiveManager.archive.get_global_value(property)
|
var val = ArchiveManager.get_global_value(property)
|
||||||
if val == null:
|
if val == null:
|
||||||
return default_value
|
return default_value
|
||||||
return val
|
return val
|
||||||
|
@ -52,7 +52,7 @@ func _on_ground_ready() -> void:
|
|||||||
counter.interacted.connect(assign_tasks, CONNECT_ONE_SHOT)
|
counter.interacted.connect(assign_tasks, CONNECT_ONE_SHOT)
|
||||||
ladder.enabled = false
|
ladder.enabled = false
|
||||||
envolope_table.enabled = false
|
envolope_table.enabled = false
|
||||||
envelope_game_success = ArchiveManager.archive.get_global_value(&"envelope_game_success")
|
envelope_game_success = ArchiveManager.get_global_value(&"envelope_game_success")
|
||||||
if envelope_game_success:
|
if envelope_game_success:
|
||||||
envolope_table.enabled = false
|
envolope_table.enabled = false
|
||||||
else:
|
else:
|
||||||
@ -62,7 +62,7 @@ func _on_ground_ready() -> void:
|
|||||||
envolope_table.prop_key2 = ""
|
envolope_table.prop_key2 = ""
|
||||||
envolope_table.interacted.connect(_on_envolope_table_interacted)
|
envolope_table.interacted.connect(_on_envolope_table_interacted)
|
||||||
# 书架工作
|
# 书架工作
|
||||||
shelf_game_success = ArchiveManager.archive.get_global_value(&"c01_shelf_game_success")
|
shelf_game_success = ArchiveManager.get_global_value(&"c01_shelf_game_success")
|
||||||
if shelf_game_success:
|
if shelf_game_success:
|
||||||
_setup_weird_bookstore()
|
_setup_weird_bookstore()
|
||||||
else:
|
else:
|
||||||
@ -131,7 +131,7 @@ var fall_off
|
|||||||
|
|
||||||
|
|
||||||
func _on_shelf_game_success() -> void:
|
func _on_shelf_game_success() -> void:
|
||||||
ArchiveManager.archive.set_global_entry(&"c01_shelf_game_success", true)
|
ArchiveManager.set_global_entry(&"c01_shelf_game_success", true)
|
||||||
shelf_game_success = true
|
shelf_game_success = true
|
||||||
_setup_weird_bookstore()
|
_setup_weird_bookstore()
|
||||||
var player = SceneManager.get_player() as MainPlayer
|
var player = SceneManager.get_player() as MainPlayer
|
||||||
@ -197,7 +197,7 @@ func _on_envelope_game_success() -> void:
|
|||||||
SceneManager.release_player()
|
SceneManager.release_player()
|
||||||
envolope_table.enabled = false
|
envolope_table.enabled = false
|
||||||
create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0)
|
create_tween().tween_property(mask, "color:a", 0.0, 1.0).from(1.0)
|
||||||
ArchiveManager.archive.set_global_entry(&"envelope_game_success", true)
|
ArchiveManager.set_global_entry(&"envelope_game_success", true)
|
||||||
envelope_game_success = true
|
envelope_game_success = true
|
||||||
_check_portal()
|
_check_portal()
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ func check_if_show_shoes():
|
|||||||
# 不论是否推出,都需要 enable 调整为 false
|
# 不论是否推出,都需要 enable 调整为 false
|
||||||
$"../DeployLayer/Ambush推小鞋子".enabled = false
|
$"../DeployLayer/Ambush推小鞋子".enabled = false
|
||||||
# 检查是否显示鞋子
|
# 检查是否显示鞋子
|
||||||
if not ArchiveManager.get_global_value(&"c02_s02_mouse_push_shoe1", false):
|
if not ArchiveManager.get_global_value(&"c02_s02_mouse_push_shoe", false):
|
||||||
return
|
return
|
||||||
var interactable = $"../DeployLayer/Interactable小鞋子"
|
var interactable = $"../DeployLayer/Interactable小鞋子"
|
||||||
if interactable.interacted_times > 0:
|
if interactable.interacted_times > 0:
|
||||||
|
@ -88,7 +88,7 @@ func _on_mice_hole_interacted():
|
|||||||
if mice_hole.interacted_times >= 2:
|
if mice_hole.interacted_times >= 2:
|
||||||
# 触发疯子撞墙,疯子在一楼内侧过道中消失
|
# 触发疯子撞墙,疯子在一楼内侧过道中消失
|
||||||
ArchiveManager.set_global_entry(&"c02_madman_hitwall", true)
|
ArchiveManager.set_global_entry(&"c02_madman_hitwall", true)
|
||||||
ArchiveManager.set_global_entry(&"c02_s02_mouse_push_shoe1", true)
|
ArchiveManager.set_global_entry(&"c02_s02_mouse_push_shoe", true)
|
||||||
|
|
||||||
# 老鼠散开并不再跟随
|
# 老鼠散开并不再跟随
|
||||||
ArchiveManager.set_global_entry(&"c02_mouse_follow_player", false)
|
ArchiveManager.set_global_entry(&"c02_mouse_follow_player", false)
|
||||||
|
@ -846,10 +846,44 @@ libraries = {
|
|||||||
&"": SubResource("AnimationLibrary_k01ve")
|
&"": SubResource("AnimationLibrary_k01ve")
|
||||||
}
|
}
|
||||||
script = ExtResource("2_4dg6u")
|
script = ExtResource("2_4dg6u")
|
||||||
data = {
|
debug_global_data = Dictionary[String, Variant]({
|
||||||
"c02_final_show": false,
|
"c02_ball_game_stage": 1,
|
||||||
"oneshot_animation_played": false
|
"c02_burning": true,
|
||||||
|
"c02_burning_end": 1,
|
||||||
|
"c02_madman_hitwall": false,
|
||||||
|
"c02_mouse_follow_player": false,
|
||||||
|
"c02_pliers_to_ball": false,
|
||||||
|
"c02_s02_mouse_push_shoe": false,
|
||||||
|
"c02_the_blind_room_unlocked": true,
|
||||||
|
"enabled_items": ["prop_火柴", "prop_院长的信", "prop_银元"],
|
||||||
|
"handnote_stage": 0
|
||||||
|
})
|
||||||
|
debug_ground_data = Dictionary[String, Variant]({
|
||||||
|
"Ambush三男孩": {
|
||||||
|
"played": false
|
||||||
|
},
|
||||||
|
"Ambush小蝉偷看": {
|
||||||
|
"played": true
|
||||||
|
},
|
||||||
|
"Closeup弹珠游戏": {
|
||||||
|
"interacted_times": 0
|
||||||
|
},
|
||||||
|
"Closeup水盆": {
|
||||||
|
"interacted_times": 0
|
||||||
|
},
|
||||||
|
"Closeup谢幕演出": {
|
||||||
|
"interacted_times": 0
|
||||||
|
},
|
||||||
|
"Interactable老鼠洞": {
|
||||||
|
"interacted_times": 0
|
||||||
|
},
|
||||||
|
"煤油灯": {
|
||||||
|
"interacted_times": 0
|
||||||
|
},
|
||||||
|
"煤油灯2": {
|
||||||
|
"interacted_times": 0
|
||||||
}
|
}
|
||||||
|
})
|
||||||
oneshot_animation = ""
|
oneshot_animation = ""
|
||||||
|
|
||||||
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
|
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
|
||||||
|
@ -20,6 +20,7 @@ const default_counter_x := 364.0
|
|||||||
# player x=315.0 counter x=364.0
|
# player x=315.0 counter x=364.0
|
||||||
const player_pull_offset_x := 49.0
|
const player_pull_offset_x := 49.0
|
||||||
|
|
||||||
|
var head_cover_closeup: Closeup2D
|
||||||
var xiao_chan_sprite: AnimatedSprite2D
|
var xiao_chan_sprite: AnimatedSprite2D
|
||||||
var xiao_chan_interactable: Interactable2D
|
var xiao_chan_interactable: Interactable2D
|
||||||
var counter: Interactable2D
|
var counter: Interactable2D
|
||||||
@ -50,11 +51,24 @@ func _on_ground_ready() -> void:
|
|||||||
|
|
||||||
catty_head.triggered.connect(_on_pick_catty_head)
|
catty_head.triggered.connect(_on_pick_catty_head)
|
||||||
|
|
||||||
if not $"../DeployLayer/Ambush首次进入血脚印".played:
|
$"../DeployLayer/血脚印".frame = 8 if $"../DeployLayer/Ambush首次进入血脚印".played else 0
|
||||||
xiao_chan_sprite.modulate.a = 0
|
|
||||||
$"../DeployLayer/血脚印".frame = 0
|
# 先设置 closeup,再设置 xiaochan sprite 与 interactable
|
||||||
|
head_cover_closeup = $"../DeployLayer/Closeup头套"
|
||||||
|
if head_cover_closeup.interacted_times > 0:
|
||||||
|
head_cover_closeup.hide()
|
||||||
|
head_cover_closeup.enabled = false
|
||||||
|
xiao_chan_sprite.visible = true
|
||||||
else:
|
else:
|
||||||
$"../DeployLayer/血脚印".frame = 8
|
xiao_chan_interactable.enabled = false
|
||||||
|
xiao_chan_sprite.visible = false
|
||||||
|
head_cover_closeup.exit.connect(func():
|
||||||
|
head_cover_closeup.hide()
|
||||||
|
head_cover_closeup.enabled = false
|
||||||
|
xiao_chan_interactable.enabled = true
|
||||||
|
xiao_chan_sprite.visible = true
|
||||||
|
)
|
||||||
|
|
||||||
if xiao_chan_interactable.interacted_times > 0:
|
if xiao_chan_interactable.interacted_times > 0:
|
||||||
xiao_chan_sprite.visible = false
|
xiao_chan_sprite.visible = false
|
||||||
counter.enabled = true
|
counter.enabled = true
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=30 format=3 uid="uid://dny21yhtuteap"]
|
[gd_scene load_steps=33 format=3 uid="uid://dny21yhtuteap"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_w7j0m"]
|
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_w7j0m"]
|
||||||
[ext_resource type="Script" uid="uid://dkkey7qillk15" path="res://scene/ground/scene/c02/s10_空房间.gd" id="2_egtqi"]
|
[ext_resource type="Script" uid="uid://dkkey7qillk15" path="res://scene/ground/scene/c02/s10_空房间.gd" id="2_egtqi"]
|
||||||
@ -21,6 +21,9 @@
|
|||||||
[ext_resource type="SpriteFrames" uid="uid://cwes55ajc3rd4" path="res://asset/art/gif/c02_空房间/c02_空房间_frames.tres" id="15_2j5dr"]
|
[ext_resource type="SpriteFrames" uid="uid://cwes55ajc3rd4" path="res://asset/art/gif/c02_空房间/c02_空房间_frames.tres" id="15_2j5dr"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cylsq5cvhlp18" path="res://asset/art/tool/point_light.png" id="15_e24j0"]
|
[ext_resource type="Texture2D" uid="uid://cylsq5cvhlp18" path="res://asset/art/tool/point_light.png" id="15_e24j0"]
|
||||||
[ext_resource type="Texture2D" uid="uid://bp84w8keuelyj" path="res://asset/art/scene/c02/s10_空房间/e_蜡烛-sheet.png" id="15_kqj5r"]
|
[ext_resource type="Texture2D" uid="uid://bp84w8keuelyj" path="res://asset/art/scene/c02/s10_空房间/e_蜡烛-sheet.png" id="15_kqj5r"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://ce3kclg1i81l3" path="res://asset/art/scene/c02/s02_大门过道/e_头套(场景中).png" id="17_6uftv"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bffqprfmpt0bx" path="res://scene/ground/script/c02/空房间小蝉头套.tscn" id="18_5t4pt"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dqkxiqbq83cmq" path="res://scene/entity/closeup.tscn" id="18_8cwaw"]
|
||||||
|
|
||||||
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_apn51"]
|
[sub_resource type="AudioStreamSynchronized" id="AudioStreamSynchronized_apn51"]
|
||||||
stream_count = 2
|
stream_count = 2
|
||||||
@ -99,7 +102,6 @@ autoplay_group = &"c02_房间里1"
|
|||||||
metadata/_custom_type_script = "uid://cpejxlfni6n52"
|
metadata/_custom_type_script = "uid://cpejxlfni6n52"
|
||||||
|
|
||||||
[node name="Sfx小蝉出现" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="1"]
|
[node name="Sfx小蝉出现" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="1"]
|
||||||
process_mode = 1
|
|
||||||
stream = SubResource("AudioStreamSynchronized_apn51")
|
stream = SubResource("AudioStreamSynchronized_apn51")
|
||||||
volume_db = 12.0
|
volume_db = 12.0
|
||||||
bus = &"game_sfx"
|
bus = &"game_sfx"
|
||||||
@ -107,7 +109,6 @@ script = ExtResource("6_6uftv")
|
|||||||
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
||||||
|
|
||||||
[node name="Sfx脚印出现" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="2"]
|
[node name="Sfx脚印出现" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="2"]
|
||||||
process_mode = 1
|
|
||||||
stream = ExtResource("7_5t4pt")
|
stream = ExtResource("7_5t4pt")
|
||||||
volume_db = 10.0
|
volume_db = 10.0
|
||||||
bus = &"game_sfx"
|
bus = &"game_sfx"
|
||||||
@ -168,7 +169,13 @@ rotation = -1.51912
|
|||||||
scale = Vector2(0.34, 0.34)
|
scale = Vector2(0.34, 0.34)
|
||||||
texture = ExtResource("8_3ftnp")
|
texture = ExtResource("8_3ftnp")
|
||||||
|
|
||||||
[node name="Interactable柜子" parent="Ground/DeployLayer" index="7" instance=ExtResource("5_ylhfc")]
|
[node name="Closeup头套" parent="Ground/DeployLayer" index="7" instance=ExtResource("18_8cwaw")]
|
||||||
|
position = Vector2(344, -39)
|
||||||
|
texture = ExtResource("17_6uftv")
|
||||||
|
packed_scene = ExtResource("18_5t4pt")
|
||||||
|
sign_mark_offset = Vector2(4.37, 46.38)
|
||||||
|
|
||||||
|
[node name="Interactable柜子" parent="Ground/DeployLayer" index="8" instance=ExtResource("5_ylhfc")]
|
||||||
position = Vector2(364, 55)
|
position = Vector2(364, 55)
|
||||||
texture = ExtResource("6_mty8e")
|
texture = ExtResource("6_mty8e")
|
||||||
enabled = false
|
enabled = false
|
||||||
@ -176,20 +183,20 @@ enable_snapper = false
|
|||||||
mute_when_interacted = true
|
mute_when_interacted = true
|
||||||
one_shot = false
|
one_shot = false
|
||||||
|
|
||||||
[node name="大头小蝉" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="8"]
|
[node name="大头小蝉" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="9"]
|
||||||
self_modulate = Color(0.80687, 0.80687, 0.80687, 1)
|
self_modulate = Color(0.80687, 0.80687, 0.80687, 1)
|
||||||
position = Vector2(351, 29.5782)
|
position = Vector2(351, 29.5782)
|
||||||
scale = Vector2(0.9, 0.9)
|
scale = Vector2(0.9, 0.9)
|
||||||
sprite_frames = ExtResource("15_2j5dr")
|
sprite_frames = ExtResource("15_2j5dr")
|
||||||
animation = &"坐箱子小婵丢人偶"
|
animation = &"坐箱子小婵丢人偶"
|
||||||
|
|
||||||
[node name="Interactable小蝉" parent="Ground/DeployLayer" index="9" instance=ExtResource("5_ylhfc")]
|
[node name="Interactable小蝉" parent="Ground/DeployLayer" index="10" instance=ExtResource("5_ylhfc")]
|
||||||
position = Vector2(350, 15.7751)
|
position = Vector2(350, 15.7751)
|
||||||
mute_when_interacted = true
|
mute_when_interacted = true
|
||||||
disable_prop_after_interacted = true
|
disable_prop_after_interacted = true
|
||||||
prop_key = "prop_木头人偶"
|
prop_key = "prop_木头人偶"
|
||||||
|
|
||||||
[node name="Pickable木头人偶" parent="Ground/DeployLayer" index="10" instance=ExtResource("6_27dvh")]
|
[node name="Pickable木头人偶" parent="Ground/DeployLayer" index="11" instance=ExtResource("6_27dvh")]
|
||||||
z_index = 7
|
z_index = 7
|
||||||
position = Vector2(423, 97.6081)
|
position = Vector2(423, 97.6081)
|
||||||
sign_mark_offset = Vector2(0, -7.09)
|
sign_mark_offset = Vector2(0, -7.09)
|
||||||
@ -202,13 +209,13 @@ rotation = -1.19178
|
|||||||
scale = Vector2(0.25, 0.25)
|
scale = Vector2(0.25, 0.25)
|
||||||
texture = ExtResource("12_27dvh")
|
texture = ExtResource("12_27dvh")
|
||||||
|
|
||||||
[node name="煤油灯" parent="Ground/DeployLayer" index="11" instance=ExtResource("13_27dvh")]
|
[node name="煤油灯" parent="Ground/DeployLayer" index="12" instance=ExtResource("13_27dvh")]
|
||||||
position = Vector2(373, -13.8031)
|
position = Vector2(373, -13.8031)
|
||||||
gaslight_energy = 2.0
|
gaslight_energy = 2.0
|
||||||
gaslight_ground_energy = 2.0
|
gaslight_ground_energy = 2.0
|
||||||
mute_when_interacted = false
|
mute_when_interacted = false
|
||||||
|
|
||||||
[node name="拼接小猫玩具" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="12"]
|
[node name="拼接小猫玩具" type="AnimatedSprite2D" parent="Ground/DeployLayer" index="13"]
|
||||||
visible = false
|
visible = false
|
||||||
light_mask = 32
|
light_mask = 32
|
||||||
z_index = 10
|
z_index = 10
|
||||||
@ -237,7 +244,7 @@ position = Vector2(3, -0.98594)
|
|||||||
range_item_cull_mask = 32
|
range_item_cull_mask = 32
|
||||||
texture = ExtResource("15_e24j0")
|
texture = ExtResource("15_e24j0")
|
||||||
|
|
||||||
[node name="Ambush首次进入血脚印" parent="Ground/DeployLayer" index="13" instance=ExtResource("14_3ftnp")]
|
[node name="Ambush首次进入血脚印" parent="Ground/DeployLayer" index="14" instance=ExtResource("14_3ftnp")]
|
||||||
position = Vector2(192, 38.4517)
|
position = Vector2(192, 38.4517)
|
||||||
cooldown_time = 0.1
|
cooldown_time = 0.1
|
||||||
hook_method = "first_enter_ambush"
|
hook_method = "first_enter_ambush"
|
||||||
|
@ -38,4 +38,4 @@ func _on_ground_ready() -> void:
|
|||||||
print("[盒子猫] intro end")
|
print("[盒子猫] intro end")
|
||||||
anim.visible = false
|
anim.visible = false
|
||||||
SceneManager.pop_center_notification(tr("ui_boxcat_press_s"))
|
SceneManager.pop_center_notification(tr("ui_boxcat_press_s"))
|
||||||
ArchiveManager.archive.set_global_entry(&"c02_boxcat_skip_intro", true)
|
ArchiveManager.set_global_entry(&"c02_boxcat_skip_intro", true)
|
||||||
|
@ -119,10 +119,6 @@ libraries = {
|
|||||||
&"": SubResource("AnimationLibrary_k01ve")
|
&"": SubResource("AnimationLibrary_k01ve")
|
||||||
}
|
}
|
||||||
script = ExtResource("2_jxanq")
|
script = ExtResource("2_jxanq")
|
||||||
data = {
|
|
||||||
"c02_final_show": false,
|
|
||||||
"oneshot_animation_played": false
|
|
||||||
}
|
|
||||||
oneshot_animation = ""
|
oneshot_animation = ""
|
||||||
|
|
||||||
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
|
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
|
||||||
|
5
scene/ground/script/c02/空房间小蝉头套.gd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
extends CanvasLayer
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
|
1
scene/ground/script/c02/空房间小蝉头套.gd.uid
Normal file
@ -0,0 +1 @@
|
|||||||
|
uid://criy10vfyc262
|
57
scene/ground/script/c02/空房间小蝉头套.tscn
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
[gd_scene load_steps=5 format=3 uid="uid://bffqprfmpt0bx"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://criy10vfyc262" path="res://scene/ground/script/c02/空房间小蝉头套.gd" id="1_yumf6"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://ce3kclg1i81l3" path="res://asset/art/scene/c02/s02_大门过道/e_头套(场景中).png" id="2_4w5ks"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dmysq4sxx8iqh" path="res://scene/entity/ux/content_inspector.tscn" id="3_64wgd"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://f186lvt5y2ql" path="res://asset/art/ui/inspect/inspect背景遮罩.png" id="4_v60v3"]
|
||||||
|
|
||||||
|
[node name="老鼠精画像" type="CanvasLayer"]
|
||||||
|
script = ExtResource("1_yumf6")
|
||||||
|
|
||||||
|
[node name="TextureRect" type="TextureRect" parent="."]
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
offset_left = -1143.0
|
||||||
|
offset_top = -1012.0
|
||||||
|
offset_right = -1143.0
|
||||||
|
offset_bottom = -1012.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
scale = Vector2(5, 5)
|
||||||
|
texture = ExtResource("2_4w5ks")
|
||||||
|
expand_mode = 1
|
||||||
|
stretch_mode = 5
|
||||||
|
|
||||||
|
[node name="ContentInspector" parent="." instance=ExtResource("3_64wgd")]
|
||||||
|
|
||||||
|
[node name="遮罩" type="TextureRect" parent="ContentInspector"]
|
||||||
|
visible = false
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
texture = ExtResource("4_v60v3")
|
||||||
|
expand_mode = 5
|
||||||
|
stretch_mode = 5
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="ContentInspector/遮罩"]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
custom_minimum_size = Vector2(100, 0)
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 8
|
||||||
|
anchor_left = 0.5
|
||||||
|
anchor_top = 0.5
|
||||||
|
anchor_right = 0.5
|
||||||
|
anchor_bottom = 0.5
|
||||||
|
offset_left = -50.0
|
||||||
|
offset_top = -7.0
|
||||||
|
offset_right = 50.0
|
||||||
|
offset_bottom = 7.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
text = "???"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
autowrap_mode = 3
|
@ -66,7 +66,7 @@ func _on_ground_ready():
|
|||||||
queue_free()
|
queue_free()
|
||||||
return
|
return
|
||||||
# c02_s13 开始追逐; call_deferred 延时设置
|
# c02_s13 开始追逐; call_deferred 延时设置
|
||||||
ArchiveManager.archive.set_global_entry.call_deferred(
|
ArchiveManager.set_global_entry.call_deferred(
|
||||||
"c02_boxcat_chasing_started", true
|
"c02_boxcat_chasing_started", true
|
||||||
)
|
)
|
||||||
elif not chasing_started:
|
elif not chasing_started:
|
||||||
|
@ -199,7 +199,6 @@ position = Vector2(2.99999, -33.5)
|
|||||||
polygon = PackedVector2Array(123, -48, -102, -48, -102, -45.8, -104.8, -43, -106.3, -43, -147.3, 42, -149.3, 42, -139, 110.3, -139, 112.5, -135, 119.4, -135, 120, 155.1, 120, 157.4, 114, 158.7, 114, 167.7, 55, 169, 55, 169, 43.5, 123, -45.6)
|
polygon = PackedVector2Array(123, -48, -102, -48, -102, -45.8, -104.8, -43, -106.3, -43, -147.3, 42, -149.3, 42, -139, 110.3, -139, 112.5, -135, 119.4, -135, 120, 155.1, 120, 157.4, 114, 158.7, 114, 167.7, 55, 169, 55, 169, 43.5, 123, -45.6)
|
||||||
|
|
||||||
[node name="OpenedBox" type="Sprite2D" parent="All"]
|
[node name="OpenedBox" type="Sprite2D" parent="All"]
|
||||||
visible = false
|
|
||||||
position = Vector2(-48, 38)
|
position = Vector2(-48, 38)
|
||||||
texture = ExtResource("16_dtoml")
|
texture = ExtResource("16_dtoml")
|
||||||
centered = false
|
centered = false
|
||||||
@ -296,6 +295,7 @@ position = Vector2(6.4373e-06, -9.53674e-07)
|
|||||||
polygon = PackedVector2Array(31.5, -37.5, 29.7, -38, 18.4, -38, -19.7, -28.9, -26, -32, -30.7, -32, -32.5, -28.4, -32.5, -23.2, -24.5, -15.2, -24.5, -9.6, -20.5, -8.3, -20.5, 4.5, -17.7, 10, -14.5, 30.3, -14.5, 32, -10.5, 35, -10.5, 37, 3.3, 37, 4.5, 26.1, 6.2, 25, 9.3, 25, 7.5, 19.6, 10.6, 14, 13.1, 14, 10.5, 4, 10.5, 3.2, 21, -2, 23.6, -2, 31.6, -14, 32.5, -14, 32.5, -22.4, 31.5, -28.3)
|
polygon = PackedVector2Array(31.5, -37.5, 29.7, -38, 18.4, -38, -19.7, -28.9, -26, -32, -30.7, -32, -32.5, -28.4, -32.5, -23.2, -24.5, -15.2, -24.5, -9.6, -20.5, -8.3, -20.5, 4.5, -17.7, 10, -14.5, 30.3, -14.5, 32, -10.5, 35, -10.5, 37, 3.3, 37, 4.5, 26.1, 6.2, 25, 9.3, 25, 7.5, 19.6, 10.6, 14, 13.1, 14, 10.5, 4, 10.5, 3.2, 21, -2, 23.6, -2, 31.6, -14, 32.5, -14, 32.5, -22.4, 31.5, -28.3)
|
||||||
|
|
||||||
[node name="Drawer" type="Node2D" parent="All"]
|
[node name="Drawer" type="Node2D" parent="All"]
|
||||||
|
visible = false
|
||||||
position = Vector2(20.5, 0)
|
position = Vector2(20.5, 0)
|
||||||
|
|
||||||
[node name="BoxDrawer" type="Sprite2D" parent="All/Drawer"]
|
[node name="BoxDrawer" type="Sprite2D" parent="All/Drawer"]
|
||||||
|
@ -14,24 +14,24 @@ signal current_item_changed(prop_key: String)
|
|||||||
else:
|
else:
|
||||||
current_item_changed.emit("")
|
current_item_changed.emit("")
|
||||||
# 重要物品,不可丢弃,在背包可见
|
# 重要物品,不可丢弃,在背包可见
|
||||||
@export var important_items := []
|
@export var important_items := [] as Array[String]
|
||||||
# 未查看的重要物品,红点效果
|
# 未查看的重要物品,红点效果
|
||||||
@export var unviewed_important_items := []
|
@export var unviewed_important_items := [] as Array[String]
|
||||||
|
|
||||||
@export var default_enabled_items := []
|
@export var default_enabled_items := [] as Array[String]
|
||||||
@export var xdie_enabled_items := []
|
@export var xdie_enabled_items := [] as Array[String]
|
||||||
@export var xxdie_enabled_items := []
|
@export var xxdie_enabled_items := [] as Array[String]
|
||||||
@export var xxxdie_enabled_items := []
|
@export var xxxdie_enabled_items := [] as Array[String]
|
||||||
var enabled_items := []
|
var enabled_items := [] as Array[String]
|
||||||
|
|
||||||
|
|
||||||
func checkout(character: String):
|
func checkout(character: String):
|
||||||
# @export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "小小蝶", "盒子猫", "小小小蝶") var character := "吕萍":
|
# @export_enum("吕萍", "吕萍爬行", "吕萍带小猫", "吕萍推柜子", "小小蝶", "盒子猫", "小小小蝶") var character := "吕萍":
|
||||||
if character == "小小蝶":
|
if character.begins_with("小小小蝶"):
|
||||||
enabled_items = xxdie_enabled_items
|
enabled_items = xxdie_enabled_items
|
||||||
elif character == "小小小蝶":
|
elif character.begins_with("小小蝶"):
|
||||||
enabled_items = xxxdie_enabled_items
|
enabled_items = xxxdie_enabled_items
|
||||||
elif character.substr(0, 2) == "吕萍":
|
elif character.begins_with("吕萍"):
|
||||||
enabled_items = xdie_enabled_items
|
enabled_items = xdie_enabled_items
|
||||||
else:
|
else:
|
||||||
enabled_items = default_enabled_items
|
enabled_items = default_enabled_items
|
||||||
|