sign 触发&互斥机制完整优化;完整适配 reenter lock 机制,解决锁死问题
This commit is contained in:
parent
efbb86d15d
commit
735592b31f
@ -220,6 +220,26 @@ animations = [{
|
|||||||
"speed": 30.0
|
"speed": 30.0
|
||||||
}, {
|
}, {
|
||||||
"frames": [{
|
"frames": [{
|
||||||
|
"duration": 6.0,
|
||||||
|
"texture": ExtResource("45_11vlt")
|
||||||
|
}, {
|
||||||
|
"duration": 6.0,
|
||||||
|
"texture": ExtResource("59_0fj2q")
|
||||||
|
}, {
|
||||||
|
"duration": 6.0,
|
||||||
|
"texture": ExtResource("58_rggru")
|
||||||
|
}, {
|
||||||
|
"duration": 6.0,
|
||||||
|
"texture": ExtResource("57_rhstw")
|
||||||
|
}, {
|
||||||
|
"duration": 6.0,
|
||||||
|
"texture": ExtResource("56_8wl6b")
|
||||||
|
}],
|
||||||
|
"loop": false,
|
||||||
|
"name": &"小手_纸杯_hide",
|
||||||
|
"speed": 30.0
|
||||||
|
}, {
|
||||||
|
"frames": [{
|
||||||
"duration": 12.0,
|
"duration": 12.0,
|
||||||
"texture": ExtResource("50_nwjv4")
|
"texture": ExtResource("50_nwjv4")
|
||||||
}, {
|
}, {
|
||||||
|
@ -165,9 +165,11 @@ c02_s03_掉鞋子,怎么天上掉了个小鞋子下来?,,,,,
|
|||||||
c02_s03_铁门,锁住了,,,,,
|
c02_s03_铁门,锁住了,,,,,
|
||||||
c02_保卫科花名册os,芦昌公寓居民登记簿,黄国栋记。,,,,,
|
c02_保卫科花名册os,芦昌公寓居民登记簿,黄国栋记。,,,,,
|
||||||
c02_保卫科祭台os,祭台是专门供奉这只大老鼠的?,,,,,
|
c02_保卫科祭台os,祭台是专门供奉这只大老鼠的?,,,,,
|
||||||
c02_小手出现摔倒,?!,,,,,
|
|
||||||
c02_小手其他交易,...还有什么东西能跟它交换呢?,,,,,
|
|
||||||
c02_保卫科老鼠精,鼠歌 <br><br>天地小如喉,<br>红轮自吞吐。<br>多少世间人,<br>都被红轮误。,,,,,
|
c02_保卫科老鼠精,鼠歌 <br><br>天地小如喉,<br>红轮自吞吐。<br>多少世间人,<br>都被红轮误。,,,,,
|
||||||
|
c02_小手其他交易,...还有什么东西能跟它交换呢?,,,,,
|
||||||
|
c02_小手出现摔倒,?!,,,,,
|
||||||
|
这是什么鬼东西,它是在讨要什么 [ID:],这是什么鬼东西,它是在讨要什么 [ID:],,,,,
|
||||||
|
c02_小手再次出现,又来一个!,,,,,
|
||||||
c02_一楼楼道被挡住,被挡住了,,,,,
|
c02_一楼楼道被挡住,被挡住了,,,,,
|
||||||
c02_一楼戏台,盖着布的木头架子...用来做什么的呢,,,,,
|
c02_一楼戏台,盖着布的木头架子...用来做什么的呢,,,,,
|
||||||
c02_描述垃圾通道,桶是空的,飘着一股血气,又酸又腥。,,,,,
|
c02_描述垃圾通道,桶是空的,飘着一股血气,又酸又腥。,,,,,
|
||||||
|
|
@ -197,9 +197,12 @@
|
|||||||
# c02 保卫科
|
# c02 保卫科
|
||||||
芦昌公寓居民登记簿,黄国栋记。 [ID:c02_保卫科花名册os]
|
芦昌公寓居民登记簿,黄国栋记。 [ID:c02_保卫科花名册os]
|
||||||
祭台是专门供奉这只大老鼠的? [ID:c02_保卫科祭台os]
|
祭台是专门供奉这只大老鼠的? [ID:c02_保卫科祭台os]
|
||||||
?! [ID:c02_小手出现摔倒]
|
|
||||||
...还有什么东西能跟它交换呢? [ID:c02_小手其他交易]
|
|
||||||
鼠歌 <br><br>天地小如喉,<br>红轮自吞吐。<br>多少世间人,<br>都被红轮误。 [ID:c02_保卫科老鼠精]
|
鼠歌 <br><br>天地小如喉,<br>红轮自吞吐。<br>多少世间人,<br>都被红轮误。 [ID:c02_保卫科老鼠精]
|
||||||
|
# c02 小手
|
||||||
|
...还有什么东西能跟它交换呢? [ID:c02_小手其他交易]
|
||||||
|
?! [ID:c02_小手出现摔倒]
|
||||||
|
这是什么鬼东西,它是在讨要什么 [ID:]
|
||||||
|
又来一个! [ID:c02_小手再次出现]
|
||||||
# c02 内侧楼道
|
# c02 内侧楼道
|
||||||
被挡住了 [ID:c02_一楼楼道被挡住]
|
被挡住了 [ID:c02_一楼楼道被挡住]
|
||||||
盖着布的木头架子...用来做什么的呢 [ID:c02_一楼戏台]
|
盖着布的木头架子...用来做什么的呢 [ID:c02_一楼戏台]
|
||||||
|
@ -103,7 +103,7 @@ func unhold_player():
|
|||||||
|
|
||||||
|
|
||||||
# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called.
|
# lock_time: the time to lock the player action. 0 means lock forever, thus the player will be locked until release_player is called.
|
||||||
func freeze_player(lock_time: float, action := 3, auto_quit := false) -> void:
|
func freeze_player(lock_time := 0.0, action := 3, auto_quit := false) -> void:
|
||||||
# 先 freeze 再 action,否则会重置 action
|
# 先 freeze 再 action,否则会重置 action
|
||||||
get_lock().freeze(lock_time)
|
get_lock().freeze(lock_time)
|
||||||
player_action(action, auto_quit)
|
player_action(action, auto_quit)
|
||||||
@ -229,12 +229,12 @@ func disable_prop_item(prop_key: String) -> void:
|
|||||||
printerr("disable_prop_item PropHud node not found")
|
printerr("disable_prop_item PropHud node not found")
|
||||||
|
|
||||||
|
|
||||||
func pop_os_with_str(translation_key: String, auto_freeze := true, auto_release := true) -> void:
|
func pop_os_with_str(translation_key: String, auto_lock := true, auto_unlock := true) -> void:
|
||||||
var player = get_player() as MainPlayer
|
var player = get_player() as MainPlayer
|
||||||
if player:
|
if player:
|
||||||
var msg = tr(translation_key).replace("<br>", "\n")
|
var msg = tr(translation_key).replace("<br>", "\n")
|
||||||
var lines = await DialogueUtil.generate_lines(msg)
|
var lines = await DialogueUtil.generate_lines(msg)
|
||||||
player.pop_os(lines, auto_freeze, auto_release)
|
player.pop_os(lines, auto_lock, auto_unlock)
|
||||||
else:
|
else:
|
||||||
printerr("Player node not found")
|
printerr("Player node not found")
|
||||||
|
|
||||||
|
@ -382,7 +382,7 @@ var os_finished_not_emitted := false
|
|||||||
var os_pausing_timer: SceneTreeTimer
|
var os_pausing_timer: SceneTreeTimer
|
||||||
|
|
||||||
|
|
||||||
func pop_os(lines := [], auto_freeze := true, auto_release := true) -> void:
|
func pop_os(lines := [], auto_lock := true, auto_unlock := true) -> void:
|
||||||
if os_tween:
|
if os_tween:
|
||||||
os_tween.kill()
|
os_tween.kill()
|
||||||
os_finish_emit_lock.lock()
|
os_finish_emit_lock.lock()
|
||||||
@ -390,8 +390,13 @@ func pop_os(lines := [], auto_freeze := true, auto_release := true) -> void:
|
|||||||
os_finished.emit()
|
os_finished.emit()
|
||||||
os_finished_not_emitted = true
|
os_finished_not_emitted = true
|
||||||
os_finish_emit_lock.unlock()
|
os_finish_emit_lock.unlock()
|
||||||
if auto_freeze:
|
if auto_lock:
|
||||||
freeze_player(0, 3, false)
|
SceneManager.lock_player()
|
||||||
|
if auto_unlock:
|
||||||
|
# os_finished 必然发送,防止 tween 被 kill,保证一定 unlock
|
||||||
|
if os_finished.is_connected(release_player):
|
||||||
|
SceneManager.unlock_player()
|
||||||
|
os_finished.connect(SceneManager.unlock_player, CONNECT_ONE_SHOT)
|
||||||
os_tween = create_tween()
|
os_tween = create_tween()
|
||||||
os_label.text = ""
|
os_label.text = ""
|
||||||
os_tween.tween_property(os_contaner, "modulate:a", 1.0, 0.2)
|
os_tween.tween_property(os_contaner, "modulate:a", 1.0, 0.2)
|
||||||
@ -401,14 +406,15 @@ func pop_os(lines := [], auto_freeze := true, auto_release := true) -> void:
|
|||||||
os_tween.tween_callback(_os_load_line.bind(line, duration))
|
os_tween.tween_callback(_os_load_line.bind(line, duration))
|
||||||
os_tween.tween_interval(0.1)
|
os_tween.tween_interval(0.1)
|
||||||
os_tween.tween_property(os_contaner, "modulate:a", 0.0, 0.2)
|
os_tween.tween_property(os_contaner, "modulate:a", 0.0, 0.2)
|
||||||
if auto_release:
|
|
||||||
os_tween.tween_callback(release_player)
|
|
||||||
os_tween.tween_callback(func():
|
os_tween.tween_callback(func():
|
||||||
os_finished.emit()
|
|
||||||
os_finish_emit_lock.lock()
|
os_finish_emit_lock.lock()
|
||||||
os_finished_not_emitted = false
|
if os_finished_not_emitted:
|
||||||
|
os_finished_not_emitted = false
|
||||||
|
os_finished.emit()
|
||||||
os_finish_emit_lock.unlock()
|
os_finish_emit_lock.unlock()
|
||||||
)
|
)
|
||||||
|
# os 结束
|
||||||
|
await os_finished
|
||||||
|
|
||||||
|
|
||||||
func _os_load_line(line, duration):
|
func _os_load_line(line, duration):
|
||||||
@ -488,6 +494,8 @@ func walk_to(global_pos: Vector2) -> Tween:
|
|||||||
var time_cost = absf(global_pos.distance_to(global_position) / 50.0)
|
var time_cost = absf(global_pos.distance_to(global_position) / 50.0)
|
||||||
# 忽略过小的位移
|
# 忽略过小的位移
|
||||||
if time_cost >= 0.05:
|
if time_cost >= 0.05:
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
print("walk_to start. lock player. time_cost:", time_cost)
|
||||||
SceneManager.lock_player(0, 3, false)
|
SceneManager.lock_player(0, 3, false)
|
||||||
var direction = facing_direction
|
var direction = facing_direction
|
||||||
if global_pos.x < global_position.x:
|
if global_pos.x < global_position.x:
|
||||||
@ -504,4 +512,6 @@ func walk_to(global_pos: Vector2) -> Tween:
|
|||||||
func _after_walk_to() -> void:
|
func _after_walk_to() -> void:
|
||||||
current_status = PlayerAnimationConfig.MOVEMENT_IDLE
|
current_status = PlayerAnimationConfig.MOVEMENT_IDLE
|
||||||
_play_animation()
|
_play_animation()
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
print("walk_to end. unlock player")
|
||||||
SceneManager.unlock_player()
|
SceneManager.unlock_player()
|
||||||
|
@ -22,10 +22,11 @@ signal hold_changed(count: int, is_add: bool)
|
|||||||
var _freeze_requests: int = 0
|
var _freeze_requests: int = 0
|
||||||
var _hold_requests: int = 0
|
var _hold_requests: int = 0
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
process_mode = Node.PROCESS_MODE_PAUSABLE
|
process_mode = Node.PROCESS_MODE_PAUSABLE
|
||||||
|
|
||||||
|
|
||||||
func _exit_tree() -> void:
|
func _exit_tree() -> void:
|
||||||
if _freeze_requests > 0:
|
if _freeze_requests > 0:
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
@ -57,15 +58,16 @@ func freeze(duration := 0.0) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func release() -> void:
|
func release() -> void:
|
||||||
if _freeze_requests <= 0:
|
_freeze_requests -= 1
|
||||||
push_warning(
|
if _freeze_requests < 0:
|
||||||
|
printerr(
|
||||||
(
|
(
|
||||||
"[Lock] Attempting to release more times than frozen! Current local count: %d"
|
"[Lock] Attempting to release more times than frozen! Current local count: %d"
|
||||||
% _freeze_requests
|
% _freeze_requests
|
||||||
)
|
),
|
||||||
|
" Reset to 0."
|
||||||
)
|
)
|
||||||
return
|
_freeze_requests = 0
|
||||||
_freeze_requests -= 1
|
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
print("[Lock] Release applied: ", _freeze_requests)
|
print("[Lock] Release applied: ", _freeze_requests)
|
||||||
freeze_changed.emit(_freeze_requests, false)
|
freeze_changed.emit(_freeze_requests, false)
|
||||||
@ -82,15 +84,16 @@ func hold(duration := 0.0) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func unhold() -> void:
|
func unhold() -> void:
|
||||||
if _hold_requests <= 0:
|
_hold_requests -= 1
|
||||||
push_warning(
|
if _hold_requests < 0:
|
||||||
|
printerr(
|
||||||
(
|
(
|
||||||
"[Lock] Attempting to unhold more times than held! Current local count: %d"
|
"[Lock] Attempting to unhold more times than held! Current local count: %d"
|
||||||
% _hold_requests
|
% _hold_requests
|
||||||
)
|
),
|
||||||
|
" Reset to 0."
|
||||||
)
|
)
|
||||||
return
|
_hold_requests = 0
|
||||||
_hold_requests -= 1
|
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
print("[Lock] Unhold applied: ", _hold_requests)
|
print("[Lock] Unhold applied: ", _hold_requests)
|
||||||
hold_changed.emit(_hold_requests, false)
|
hold_changed.emit(_hold_requests, false)
|
||||||
@ -126,8 +129,30 @@ func lock_all(duration := 0.0) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func unlock_all() -> void:
|
func unlock_all() -> void:
|
||||||
release()
|
_freeze_requests -= 1
|
||||||
unhold()
|
_hold_requests -= 1
|
||||||
|
if _freeze_requests < 0:
|
||||||
|
printerr(
|
||||||
|
(
|
||||||
|
"[Lock] Attempting to unlock more times than frozen! Current local count: %d"
|
||||||
|
% _freeze_requests
|
||||||
|
),
|
||||||
|
" Reset to 0."
|
||||||
|
)
|
||||||
|
_freeze_requests = 0
|
||||||
|
if _hold_requests < 0:
|
||||||
|
printerr(
|
||||||
|
(
|
||||||
|
"[Lock] Attempting to unhold more times than held! Current local count: %d"
|
||||||
|
% _hold_requests
|
||||||
|
),
|
||||||
|
" Reset to 0."
|
||||||
|
)
|
||||||
|
_hold_requests = 0
|
||||||
|
freeze_changed.emit(_freeze_requests, false)
|
||||||
|
hold_changed.emit(_hold_requests, false)
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
prints("[Lock] UnlockAll applied (hold, freeze): ", _hold_requests, _freeze_requests)
|
||||||
|
|
||||||
|
|
||||||
func _to_string() -> String:
|
func _to_string() -> String:
|
||||||
|
@ -21,10 +21,10 @@ func _ready() -> void:
|
|||||||
# 可以直接调用
|
# 可以直接调用
|
||||||
func display() -> void:
|
func display() -> void:
|
||||||
if current_child:
|
if current_child:
|
||||||
# 先退出
|
return
|
||||||
_exit()
|
|
||||||
if packed_scene:
|
if packed_scene:
|
||||||
printraw("[" + name + "] call ")
|
if GlobalConfig.DEBUG:
|
||||||
|
print("[" + name + "] call lock")
|
||||||
SceneManager.lock_player(0, action_key)
|
SceneManager.lock_player(0, action_key)
|
||||||
# 展示时,禁用 sign_mark 的输入
|
# 展示时,禁用 sign_mark 的输入
|
||||||
sign_mark.pass_unhandled_input = true
|
sign_mark.pass_unhandled_input = true
|
||||||
@ -38,9 +38,14 @@ func display() -> void:
|
|||||||
|
|
||||||
func _exit(arg = null):
|
func _exit(arg = null):
|
||||||
if current_child:
|
if current_child:
|
||||||
printraw("[" + name + "] call ")
|
if GlobalConfig.DEBUG:
|
||||||
|
print("[" + name + "] call lock")
|
||||||
SceneManager.unlock_player()
|
SceneManager.unlock_player()
|
||||||
current_child.queue_free()
|
if current_child:
|
||||||
|
remove_child(current_child)
|
||||||
|
current_child.queue_free()
|
||||||
|
current_child = null
|
||||||
|
print("quit [", name, "] arg=", arg)
|
||||||
exit.emit(arg)
|
exit.emit(arg)
|
||||||
# 退出时,恢复 sign_mark 的输入
|
# 退出时,恢复 sign_mark 的输入
|
||||||
sign_mark.pass_unhandled_input = false
|
sign_mark.pass_unhandled_input = false
|
||||||
|
@ -65,11 +65,11 @@ var blinking_tween: Tween
|
|||||||
|
|
||||||
var ground_archive: GroundArchive
|
var ground_archive: GroundArchive
|
||||||
# 尝试互动的次数
|
# 尝试互动的次数
|
||||||
var tried_times: int:
|
var icount: int:
|
||||||
set(val):
|
set(val):
|
||||||
tried_times = val
|
icount = val
|
||||||
ground_archive.set_pair(name, "tried_times", val)
|
ground_archive.set_pair(name, "icount", val)
|
||||||
if tried_times >= 1 and sign_mark:
|
if icount >= 1 and sign_mark:
|
||||||
sign_mark.sprite2d.texture = note_sign_texture
|
sign_mark.sprite2d.texture = note_sign_texture
|
||||||
|
|
||||||
|
|
||||||
@ -88,8 +88,7 @@ func _ready() -> void:
|
|||||||
sign_mark.enabled = enabled
|
sign_mark.enabled = enabled
|
||||||
# setup default value
|
# setup default value
|
||||||
ground_archive = ArchiveManager.archive.ground_archive()
|
ground_archive = ArchiveManager.archive.ground_archive()
|
||||||
tried_times = ground_archive.get_value(name, "tried_times", 0)
|
icount = ground_archive.get_value(name, "icount", 0)
|
||||||
|
|
||||||
if content_centered:
|
if content_centered:
|
||||||
content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
||||||
# sign_mark.interacted.connect(_on_interacted)
|
# sign_mark.interacted.connect(_on_interacted)
|
||||||
@ -115,7 +114,7 @@ func _get_tr_content():
|
|||||||
func _on_interacted() -> void:
|
func _on_interacted() -> void:
|
||||||
if STATUS_TRANSITIONING == status:
|
if STATUS_TRANSITIONING == status:
|
||||||
return
|
return
|
||||||
if tried_times == 0 and first_interact_os_key:
|
if icount == 0 and first_interact_os_key:
|
||||||
sign_mark.display_sign = false
|
sign_mark.display_sign = false
|
||||||
SceneManager.pop_os_with_str(first_interact_os_key)
|
SceneManager.pop_os_with_str(first_interact_os_key)
|
||||||
await SceneManager.get_player().os_finished
|
await SceneManager.get_player().os_finished
|
||||||
@ -125,10 +124,12 @@ func _on_interacted() -> void:
|
|||||||
|
|
||||||
func _do_action() -> void:
|
func _do_action() -> void:
|
||||||
if status == STATUS_NORAML:
|
if status == STATUS_NORAML:
|
||||||
# 不使用 lock, 因为需要用 sign 进行继续交互
|
# 不使用 lock player, 因为需要用 sign 进行继续交互
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
print("[" + name + "] call lock")
|
||||||
SceneManager.freeze_player(0, action_key)
|
SceneManager.freeze_player(0, action_key)
|
||||||
status = STATUS_TRANSITIONING
|
status = STATUS_TRANSITIONING
|
||||||
tried_times += 1
|
icount += 1
|
||||||
sfx.play()
|
sfx.play()
|
||||||
SceneManager.focus_node(self)
|
SceneManager.focus_node(self)
|
||||||
SceneManager.get_camera_marker().tween_zoom(2.0)
|
SceneManager.get_camera_marker().tween_zoom(2.0)
|
||||||
@ -189,6 +190,8 @@ func _on_cancel(_body = null):
|
|||||||
tween.tween_callback(func(): status = STATUS_NORAML)
|
tween.tween_callback(func(): status = STATUS_NORAML)
|
||||||
tween.tween_callback(func(): content_label.modulate.a = 0.0)
|
tween.tween_callback(func(): content_label.modulate.a = 0.0)
|
||||||
SceneManager.focus_player_and_reset_zoom()
|
SceneManager.focus_player_and_reset_zoom()
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
print("[" + name + "] call lock")
|
||||||
SceneManager.release_player()
|
SceneManager.release_player()
|
||||||
sign_mark.display_sign = true
|
sign_mark.display_sign = true
|
||||||
# 改变信号源
|
# 改变信号源
|
||||||
|
@ -52,10 +52,10 @@ var prop_key3 := ""
|
|||||||
|
|
||||||
var ground_archive: GroundArchive
|
var ground_archive: GroundArchive
|
||||||
# 尝试互动的次数
|
# 尝试互动的次数
|
||||||
var tried_times: int:
|
var icount: int:
|
||||||
set(val):
|
set(val):
|
||||||
tried_times = val
|
icount = val
|
||||||
ground_archive.set_pair(name, "tried_times", val)
|
ground_archive.set_pair(name, "icount", val)
|
||||||
# 成功互动的次数
|
# 成功互动的次数
|
||||||
var interacted_times: int:
|
var interacted_times: int:
|
||||||
set(val):
|
set(val):
|
||||||
@ -80,10 +80,9 @@ func _ready() -> void:
|
|||||||
sign_snapper.enabled = false
|
sign_snapper.enabled = false
|
||||||
sign_mark.interacted.connect(_pre_interacted)
|
sign_mark.interacted.connect(_pre_interacted)
|
||||||
sign_mark.cancel.connect(_on_cancel)
|
sign_mark.cancel.connect(_on_cancel)
|
||||||
sign_mark.enabled = enabled
|
|
||||||
# setup default value
|
# setup default value
|
||||||
ground_archive = ArchiveManager.archive.ground_archive()
|
ground_archive = ArchiveManager.archive.ground_archive()
|
||||||
tried_times = ground_archive.get_value(name, "tried_times", 0)
|
icount = ground_archive.get_value(name, "icount", 0)
|
||||||
interacted_times = ground_archive.get_value(name, "interacted_times", 0)
|
interacted_times = ground_archive.get_value(name, "interacted_times", 0)
|
||||||
if interacted_times and interacted_texture:
|
if interacted_times and interacted_texture:
|
||||||
texture = interacted_texture
|
texture = interacted_texture
|
||||||
@ -108,7 +107,7 @@ func _reset_sign_testure_to_prop():
|
|||||||
|
|
||||||
# 根据当前 prop,调整 sign 所显示的 texture
|
# 根据当前 prop,调整 sign 所显示的 texture
|
||||||
func _set_sign_texture_to_prop(_key):
|
func _set_sign_texture_to_prop(_key):
|
||||||
if tried_times == 0:
|
if icount == 0:
|
||||||
# 首次交互前 unrevealed
|
# 首次交互前 unrevealed
|
||||||
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
||||||
return
|
return
|
||||||
@ -144,7 +143,7 @@ func is_key_matched(key) -> bool:
|
|||||||
|
|
||||||
func _pre_interacted() -> void:
|
func _pre_interacted() -> void:
|
||||||
SceneManager.player_action(action_key)
|
SceneManager.player_action(action_key)
|
||||||
if tried_times == 0 and first_interact_os_key:
|
if icount == 0 and first_interact_os_key:
|
||||||
sign_mark.display_sign = false
|
sign_mark.display_sign = false
|
||||||
SceneManager.pop_os_with_str(first_interact_os_key)
|
SceneManager.pop_os_with_str(first_interact_os_key)
|
||||||
await SceneManager.get_player().os_finished
|
await SceneManager.get_player().os_finished
|
||||||
@ -154,7 +153,7 @@ func _pre_interacted() -> void:
|
|||||||
|
|
||||||
func _on_interacted() -> void:
|
func _on_interacted() -> void:
|
||||||
interact_mutex.lock()
|
interact_mutex.lock()
|
||||||
tried_times += 1
|
icount += 1
|
||||||
if one_shot and interacted_times >= one_shot_max_times:
|
if one_shot and interacted_times >= one_shot_max_times:
|
||||||
interact_mutex.unlock()
|
interact_mutex.unlock()
|
||||||
return
|
return
|
||||||
|
@ -68,11 +68,11 @@ var mutex = Mutex.new()
|
|||||||
|
|
||||||
var ground_archive: GroundArchive
|
var ground_archive: GroundArchive
|
||||||
# 尝试互动的次数
|
# 尝试互动的次数
|
||||||
var tried_times: int:
|
var icount: int:
|
||||||
set(val):
|
set(val):
|
||||||
tried_times = val
|
icount = val
|
||||||
ground_archive.set_pair(name, "tried_times", val)
|
ground_archive.set_pair(name, "icount", val)
|
||||||
if tried_times >= 1 and sign_mark:
|
if icount >= 1 and sign_mark:
|
||||||
sign_mark.sprite2d.texture = note_sign_texture
|
sign_mark.sprite2d.texture = note_sign_texture
|
||||||
|
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ func _ready() -> void:
|
|||||||
|
|
||||||
# setup default value
|
# setup default value
|
||||||
ground_archive = ArchiveManager.archive.ground_archive()
|
ground_archive = ArchiveManager.archive.ground_archive()
|
||||||
tried_times = ground_archive.get_value(name, "tried_times", 0)
|
icount = ground_archive.get_value(name, "icount", 0)
|
||||||
|
|
||||||
|
|
||||||
func _on_interacted() -> void:
|
func _on_interacted() -> void:
|
||||||
@ -100,7 +100,7 @@ func _on_interacted() -> void:
|
|||||||
if not note_key:
|
if not note_key:
|
||||||
printerr("Note key is not set")
|
printerr("Note key is not set")
|
||||||
return
|
return
|
||||||
tried_times += 1
|
icount += 1
|
||||||
%Sfx.play()
|
%Sfx.play()
|
||||||
match mode:
|
match mode:
|
||||||
"os":
|
"os":
|
||||||
@ -132,18 +132,16 @@ func _show_os():
|
|||||||
func _show_balloon(res, title):
|
func _show_balloon(res, title):
|
||||||
# SceneManager.focus_node(self)
|
# SceneManager.focus_node(self)
|
||||||
DialogueManager.show_dialogue_balloon(res, title)
|
DialogueManager.show_dialogue_balloon(res, title)
|
||||||
# TODO note viewing animation
|
# note viewing animation
|
||||||
|
if GlobalConfig.DEBUG:
|
||||||
|
print("[" + name + "] call lock")
|
||||||
SceneManager.freeze_player(0, action)
|
SceneManager.freeze_player(0, action)
|
||||||
interacting = true
|
interacting = true
|
||||||
DialogueManager.dialogue_ended.connect(_on_ballon_ended, CONNECT_ONE_SHOT)
|
await DialogueManager.dialogue_ended
|
||||||
# var player = SceneManager.get_player()
|
if GlobalConfig.DEBUG:
|
||||||
# DialogueManager.show_dialogue_balloon_scene(player, dialogue_res, note_key)
|
print("[" + name + "] call lock")
|
||||||
|
|
||||||
|
|
||||||
func _on_ballon_ended(_res):
|
|
||||||
interacting = false
|
|
||||||
SceneManager.release_player()
|
SceneManager.release_player()
|
||||||
# SceneManager.focus_player_and_reset_zoom()
|
interacting = false
|
||||||
|
|
||||||
|
|
||||||
func _set(property: StringName, value: Variant) -> bool:
|
func _set(property: StringName, value: Variant) -> bool:
|
||||||
|
@ -105,19 +105,20 @@ func _on_interacted() -> void:
|
|||||||
interacted.emit()
|
interacted.emit()
|
||||||
DialogueManager.show_dialogue_balloon(dialogue_res, dialogue_title)
|
DialogueManager.show_dialogue_balloon(dialogue_res, dialogue_title)
|
||||||
speaking = true
|
speaking = true
|
||||||
SceneManager.freeze_player(0, action_key)
|
if GlobalConfig.DEBUG:
|
||||||
DialogueManager.dialogue_ended.connect(_dialog_end, CONNECT_ONE_SHOT)
|
print("[" + name + "] call lock")
|
||||||
|
SceneManager.lock_player(0, action_key)
|
||||||
var tween = create_tween()
|
var tween = create_tween()
|
||||||
tween.tween_property(speaking_sign, "modulate", Color.WHITE, 0.5)
|
tween.tween_property(speaking_sign, "modulate", Color.WHITE, 0.5)
|
||||||
tween.parallel().tween_property(speaking_sign, "scale", base_scale * 1.3, 0.3)
|
tween.parallel().tween_property(speaking_sign, "scale", base_scale * 1.3, 0.3)
|
||||||
|
await DialogueManager.dialogue_ended
|
||||||
|
tween = create_tween()
|
||||||
func _dialog_end(_res):
|
tween.tween_property(speaking_sign, "modulate", base_mod, 0.5)
|
||||||
speaking = false
|
tween.parallel().tween_property(speaking_sign, "scale", base_scale, 0.3)
|
||||||
SceneManager.release_player()
|
if GlobalConfig.DEBUG:
|
||||||
var tween = create_tween()
|
print("[" + name + "] call lock")
|
||||||
tween.tween_property(speaking_sign, "modulate", base_mod, 0.5)
|
SceneManager.unlock_player()
|
||||||
tween.parallel().tween_property(speaking_sign, "scale", base_scale, 0.3)
|
speaking = false
|
||||||
|
|
||||||
|
|
||||||
func _play_speaking() -> void:
|
func _play_speaking() -> void:
|
||||||
|
@ -14,7 +14,7 @@ signal sign_mark_offset_updated
|
|||||||
set(val):
|
set(val):
|
||||||
enabled = val
|
enabled = val
|
||||||
if is_node_ready():
|
if is_node_ready():
|
||||||
sign_mark.enabled = enabled
|
_check_display()
|
||||||
@export var action_key := 4
|
@export var action_key := 4
|
||||||
# 除了 picked 必然隐藏,其他情况下跟随 enabled 状态
|
# 除了 picked 必然隐藏,其他情况下跟随 enabled 状态
|
||||||
@export var visible_follow_enabled := true
|
@export var visible_follow_enabled := true
|
||||||
|
@ -76,10 +76,10 @@ var items: PackedStringArray
|
|||||||
var ground_archive: GroundArchive
|
var ground_archive: GroundArchive
|
||||||
|
|
||||||
# 尝试互动的次数
|
# 尝试互动的次数
|
||||||
var tried_times: int:
|
var icount: int:
|
||||||
set(val):
|
set(val):
|
||||||
tried_times = val
|
icount = val
|
||||||
ground_archive.set_pair(name, "tried_times", val)
|
ground_archive.set_pair(name, "icount", val)
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@ -92,7 +92,7 @@ func _ready() -> void:
|
|||||||
_reload_items()
|
_reload_items()
|
||||||
return
|
return
|
||||||
ground_archive = ArchiveManager.archive.ground_archive()
|
ground_archive = ArchiveManager.archive.ground_archive()
|
||||||
tried_times = ground_archive.get_value(name, "tried_times", 0)
|
icount = ground_archive.get_value(name, "icount", 0)
|
||||||
status = ground_archive.get_value(name, "status", status)
|
status = ground_archive.get_value(name, "status", status)
|
||||||
if GlobalConfig.DEBUG:
|
if GlobalConfig.DEBUG:
|
||||||
print("Portal read status [", name, "] status=", status)
|
print("Portal read status [", name, "] status=", status)
|
||||||
@ -131,7 +131,7 @@ func _check_sign_mark_and_texture():
|
|||||||
else:
|
else:
|
||||||
sign_snapper.action_on_arrived = 4
|
sign_snapper.action_on_arrived = 4
|
||||||
# holding 状态下,同样显示 unrevealed_sign_texture
|
# holding 状态下,同样显示 unrevealed_sign_texture
|
||||||
if tried_times == 0 or holding:
|
if icount == 0 or holding:
|
||||||
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
||||||
else:
|
else:
|
||||||
match status:
|
match status:
|
||||||
@ -150,7 +150,7 @@ var interact_mutex = Mutex.new()
|
|||||||
|
|
||||||
|
|
||||||
func _on_interacted() -> void:
|
func _on_interacted() -> void:
|
||||||
tried_times += 1
|
icount += 1
|
||||||
if holding:
|
if holding:
|
||||||
if holding_reason_key:
|
if holding_reason_key:
|
||||||
SceneManager.pop_os_with_str(holding_reason_key)
|
SceneManager.pop_os_with_str(holding_reason_key)
|
||||||
@ -222,7 +222,7 @@ func _set_sign_texture_to_prop(_key):
|
|||||||
# if not prop_key or prop_key == key:
|
# if not prop_key or prop_key == key:
|
||||||
# sign_mark.sprite2d.texture = matched_sign_texture
|
# sign_mark.sprite2d.texture = matched_sign_texture
|
||||||
# else:
|
# else:
|
||||||
if tried_times:
|
if icount:
|
||||||
sign_mark.sprite2d.texture = locked_sign_texture
|
sign_mark.sprite2d.texture = locked_sign_texture
|
||||||
else:
|
else:
|
||||||
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
||||||
|
@ -13,9 +13,9 @@ signal toggle_active(activated: bool)
|
|||||||
# @export var lock_on_player_freezed := false
|
# @export var lock_on_player_freezed := false
|
||||||
@export var enabled := true:
|
@export var enabled := true:
|
||||||
set(val):
|
set(val):
|
||||||
if enabled == val:
|
if enabled != val:
|
||||||
return
|
enabled = val
|
||||||
_align_activation()
|
align_activation()
|
||||||
@export var display_sign := true:
|
@export var display_sign := true:
|
||||||
set(val):
|
set(val):
|
||||||
if display_sign != val:
|
if display_sign != val:
|
||||||
@ -34,8 +34,9 @@ var pass_unhandled_input = false
|
|||||||
|
|
||||||
# 同时只能有一个物品被激活交互态,其他物品进入等待队列
|
# 同时只能有一个物品被激活交互态,其他物品进入等待队列
|
||||||
static var occupied: NodePath
|
static var occupied: NodePath
|
||||||
static var _pending_activate_sign: Array[NodePath] = []
|
# touching 状态改变时就要擦除
|
||||||
# 使用互斥锁保证线程安全。在操作 occupied 或 _pending_activate_sign 时需要先锁定,操作完成后解锁
|
static var _touching_sign_arr: Array[NodePath] = []
|
||||||
|
# 使用互斥锁保证线程安全。在操作 occupied 或 _touching_sign_arr 时需要先锁定,操作完成后解锁
|
||||||
static var mutex = Mutex.new()
|
static var mutex = Mutex.new()
|
||||||
var tween: Tween
|
var tween: Tween
|
||||||
|
|
||||||
@ -43,7 +44,12 @@ var player_touching := false:
|
|||||||
set(val):
|
set(val):
|
||||||
if player_touching != val:
|
if player_touching != val:
|
||||||
player_touching = val
|
player_touching = val
|
||||||
_align_activation()
|
var path = get_path()
|
||||||
|
if player_touching and not _touching_sign_arr.has(path):
|
||||||
|
_touching_sign_arr.append(path)
|
||||||
|
if not player_touching:
|
||||||
|
_touching_sign_arr.erase(path)
|
||||||
|
align_activation()
|
||||||
var activated = false:
|
var activated = false:
|
||||||
set(val):
|
set(val):
|
||||||
if activated != val:
|
if activated != val:
|
||||||
@ -82,11 +88,11 @@ func is_hold() -> bool:
|
|||||||
|
|
||||||
func _on_lock_hold_changed(count: int, is_add: bool):
|
func _on_lock_hold_changed(count: int, is_add: bool):
|
||||||
if count == 0 or (count == 1 and is_add):
|
if count == 0 or (count == 1 and is_add):
|
||||||
_align_activation()
|
align_activation()
|
||||||
|
|
||||||
|
|
||||||
func _on_visibility_changed() -> void:
|
func _on_visibility_changed() -> void:
|
||||||
_align_activation()
|
align_activation()
|
||||||
|
|
||||||
|
|
||||||
# activition/display mode 变化时 _check_sign_display
|
# activition/display mode 变化时 _check_sign_display
|
||||||
@ -113,7 +119,7 @@ func _on_body_exited(_body: Node2D) -> void:
|
|||||||
|
|
||||||
|
|
||||||
# 四种参数变化时调用 align: 1 enable 2 hold 3 visibility 4 touching
|
# 四种参数变化时调用 align: 1 enable 2 hold 3 visibility 4 touching
|
||||||
func _align_activation() -> bool:
|
func align_activation() -> bool:
|
||||||
if Engine.is_editor_hint():
|
if Engine.is_editor_hint():
|
||||||
return activated
|
return activated
|
||||||
var ideal_status := enabled and player_touching and not is_hold() and is_visible_in_tree()
|
var ideal_status := enabled and player_touching and not is_hold() and is_visible_in_tree()
|
||||||
@ -134,8 +140,8 @@ func _align_activation() -> bool:
|
|||||||
"[/color]",
|
"[/color]",
|
||||||
" occupied:[color=khaki]",
|
" occupied:[color=khaki]",
|
||||||
_get_name_from_path(occupied),
|
_get_name_from_path(occupied),
|
||||||
"[/color] pending:[color=coral]",
|
"[/color] touching:[color=coral]",
|
||||||
_get_name_from_paths(_pending_activate_sign),
|
_get_name_from_paths(_touching_sign_arr),
|
||||||
"[/color]"
|
"[/color]"
|
||||||
)
|
)
|
||||||
return activated
|
return activated
|
||||||
@ -147,14 +153,14 @@ func _try_disactivate() -> void:
|
|||||||
activated = false
|
activated = false
|
||||||
occupied = NodePath(&"")
|
occupied = NodePath(&"")
|
||||||
# 转移 active 状态给下一个节点
|
# 转移 active 状态给下一个节点
|
||||||
while _pending_activate_sign.size() > 0:
|
var self_path = get_path()
|
||||||
var path = _pending_activate_sign.pop_front()
|
for p in _touching_sign_arr:
|
||||||
var _sign = get_node_or_null(path) as Sign
|
# skip self
|
||||||
if _sign and _sign._align_activation():
|
if p == self_path:
|
||||||
|
continue
|
||||||
|
var s = get_node_or_null(p) as Sign
|
||||||
|
if s and s.align_activation():
|
||||||
break
|
break
|
||||||
else:
|
|
||||||
# make sure the sign is not in the pending list
|
|
||||||
_pending_activate_sign.erase(get_path())
|
|
||||||
mutex.unlock()
|
mutex.unlock()
|
||||||
# point_light.energy = 0.0
|
# point_light.energy = 0.0
|
||||||
if tween and tween.is_valid():
|
if tween and tween.is_valid():
|
||||||
@ -169,10 +175,7 @@ func _try_activate() -> bool:
|
|||||||
var path := get_path()
|
var path := get_path()
|
||||||
mutex.lock()
|
mutex.lock()
|
||||||
# 若 lock 为 hold 状态则直接跳过
|
# 若 lock 为 hold 状态则直接跳过
|
||||||
if occupied and occupied != path:
|
if not occupied or occupied == path:
|
||||||
if not _pending_activate_sign.has(path):
|
|
||||||
_pending_activate_sign.append(path)
|
|
||||||
else:
|
|
||||||
occupied = path
|
occupied = path
|
||||||
activated = true
|
activated = true
|
||||||
mutex.unlock()
|
mutex.unlock()
|
||||||
|
@ -78,7 +78,7 @@ func _dean_flip_book() -> void:
|
|||||||
|
|
||||||
# 在游戏开始前,更早的对话
|
# 在游戏开始前,更早的对话
|
||||||
func pre_game_intro():
|
func pre_game_intro():
|
||||||
SceneManager.freeze_player(0)
|
SceneManager.lock_player()
|
||||||
var camera = SceneManager.get_camera_marker() as CameraFocusMarker
|
var camera = SceneManager.get_camera_marker() as CameraFocusMarker
|
||||||
camera.tween_zoom(1.5, 3.0)
|
camera.tween_zoom(1.5, 3.0)
|
||||||
var p = $"../DeployLayer/四小孩画鬼差的对话ambush/FocusPoint"
|
var p = $"../DeployLayer/四小孩画鬼差的对话ambush/FocusPoint"
|
||||||
@ -89,7 +89,8 @@ func pre_game_intro():
|
|||||||
# 重置镜头
|
# 重置镜头
|
||||||
SceneManager.focus_player_and_reset_zoom(2.5)
|
SceneManager.focus_player_and_reset_zoom(2.5)
|
||||||
await get_tree().create_timer(1.5).timeout
|
await get_tree().create_timer(1.5).timeout
|
||||||
SceneManager.pop_os_with_str("c01_s06_熟悉的墙画", false, true)
|
await SceneManager.pop_os_with_str("c01_s06_熟悉的墙画")
|
||||||
|
SceneManager.unlock_player()
|
||||||
|
|
||||||
|
|
||||||
func game_intro() -> void:
|
func game_intro() -> void:
|
||||||
@ -159,9 +160,10 @@ func _on_talked():
|
|||||||
if talk_count == 3:
|
if talk_count == 3:
|
||||||
# 三个小孩都对话完毕
|
# 三个小孩都对话完毕
|
||||||
await DialogueManager.dialogue_ended
|
await DialogueManager.dialogue_ended
|
||||||
SceneManager.freeze_player(0)
|
SceneManager.lock_player()
|
||||||
await get_tree().create_timer(1.0).timeout
|
await get_tree().create_timer(1.0).timeout
|
||||||
SceneManager.pop_os_with_str("c01_s06_四小孩对话结束", false, true)
|
await SceneManager.pop_os_with_str("c01_s06_四小孩对话结束")
|
||||||
|
SceneManager.unlock_player()
|
||||||
|
|
||||||
|
|
||||||
var kid_run_tween
|
var kid_run_tween
|
||||||
|
@ -53,22 +53,20 @@ func _on_ground_ready() -> void:
|
|||||||
|
|
||||||
func _oneshot_wind():
|
func _oneshot_wind():
|
||||||
var player = %MainPlayer as MainPlayer
|
var player = %MainPlayer as MainPlayer
|
||||||
SceneManager.freeze_player(0)
|
SceneManager.lock_player()
|
||||||
player.hide_sprite = true
|
player.hide_sprite = true
|
||||||
player.set_facing_direction(Vector2.RIGHT)
|
player.set_facing_direction(Vector2.RIGHT)
|
||||||
player.global_position.x = 53.0
|
player.global_position.x = 53.0
|
||||||
|
$"冷飕飕Sfx".play()
|
||||||
wind_blows.visible = true
|
wind_blows.visible = true
|
||||||
wind_blows.play()
|
wind_blows.play()
|
||||||
wind_blows.animation_finished.connect(_on_wind_finished, CONNECT_ONE_SHOT)
|
await wind_blows.animation_finished
|
||||||
$"冷飕飕Sfx".play()
|
|
||||||
|
|
||||||
|
|
||||||
func _on_wind_finished():
|
|
||||||
set_data("first_enter", true)
|
set_data("first_enter", true)
|
||||||
%MainPlayer.hide_sprite = false
|
%MainPlayer.hide_sprite = false
|
||||||
wind_blows.visible = false
|
wind_blows.visible = false
|
||||||
# 使用气泡文字
|
# 使用气泡文字
|
||||||
SceneManager.pop_os_with_str("c02_冷飕飕的", false, true)
|
await SceneManager.pop_os_with_str("c02_冷飕飕的")
|
||||||
|
SceneManager.unlock_player()
|
||||||
|
|
||||||
|
|
||||||
func xiaochan_disappear():
|
func xiaochan_disappear():
|
||||||
@ -78,7 +76,7 @@ func xiaochan_disappear():
|
|||||||
|
|
||||||
|
|
||||||
func _on_flyer_exit(arg):
|
func _on_flyer_exit(arg):
|
||||||
if arg:
|
if arg == true:
|
||||||
$"../DeployLayer/青岛啤酒".enabled = true
|
$"../DeployLayer/青岛啤酒".enabled = true
|
||||||
set_data("flyer_shaven", true)
|
set_data("flyer_shaven", true)
|
||||||
flyer.enabled = false
|
flyer.enabled = false
|
||||||
|
@ -98,7 +98,7 @@ func _on_ground_ready() -> void:
|
|||||||
await tween.finished
|
await tween.finished
|
||||||
# 落地音效
|
# 落地音效
|
||||||
$"Sfx小鞋落地".play()
|
$"Sfx小鞋落地".play()
|
||||||
SceneManager.pop_os_with_str("c02_s03_掉鞋子", false, false)
|
SceneManager.pop_os_with_str("c02_s03_掉鞋子")
|
||||||
tween = create_tween()
|
tween = create_tween()
|
||||||
tween.tween_property(fg, "modulate:a", 0.0, 1.5)
|
tween.tween_property(fg, "modulate:a", 0.0, 1.5)
|
||||||
await tween.finished
|
await tween.finished
|
||||||
|
@ -22,24 +22,6 @@ func _on_ground_ready() -> void:
|
|||||||
if not ArchiveManager.get_global_value(&"c02_tin_coin_taken"):
|
if not ArchiveManager.get_global_value(&"c02_tin_coin_taken"):
|
||||||
closeup_tin_coin.exit.connect(_on_closeup_tin_coin_exited)
|
closeup_tin_coin.exit.connect(_on_closeup_tin_coin_exited)
|
||||||
|
|
||||||
little_hand = $"../DeployLayer/小手讨东西"
|
|
||||||
if little_hand.tried_times == 0:
|
|
||||||
little_hand.interacted.connect(
|
|
||||||
_on_little_hand_first_interacted.call_deferred, CONNECT_ONE_SHOT
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_little_hand_first_interacted() -> void:
|
|
||||||
# 9 小手交互,吓摔倒
|
|
||||||
little_hand.enabled = false
|
|
||||||
var duration = 3.0
|
|
||||||
SceneManager.freeze_player(duration, 9)
|
|
||||||
SceneManager.pop_os_with_str(tr("c02_小手出现摔倒"), false, false)
|
|
||||||
get_tree().create_timer(1.5).timeout.connect($"Sfx摔倒".play)
|
|
||||||
await get_tree().create_timer(duration).timeout
|
|
||||||
SceneManager.release_player()
|
|
||||||
little_hand.enabled = true
|
|
||||||
|
|
||||||
|
|
||||||
func _on_closeup_tin_coin_exited(arg = null):
|
func _on_closeup_tin_coin_exited(arg = null):
|
||||||
if arg == true:
|
if arg == true:
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
[gd_scene load_steps=24 format=3 uid="uid://bivc5cdap370p"]
|
[gd_scene load_steps=22 format=3 uid="uid://bivc5cdap370p"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_2jej0"]
|
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_2jej0"]
|
||||||
[ext_resource type="Script" uid="uid://dmhh4g47bdxxy" path="res://scene/ground/scene/c02/s04_保卫科.gd" id="2_jyere"]
|
[ext_resource type="Script" uid="uid://dmhh4g47bdxxy" path="res://scene/ground/scene/c02/s04_保卫科.gd" id="2_jyere"]
|
||||||
[ext_resource type="Texture2D" uid="uid://7jvg2flkapj3" path="res://asset/art/scene/c02/s04_保卫科/bg_保卫科.png" id="3_66gue"]
|
[ext_resource type="Texture2D" uid="uid://7jvg2flkapj3" path="res://asset/art/scene/c02/s04_保卫科/bg_保卫科.png" id="3_66gue"]
|
||||||
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_ffvrp"]
|
|
||||||
[ext_resource type="SpriteFrames" uid="uid://c2sjavnptjn" path="res://asset/art/gif/c02_保卫科/c02_保卫科_frames.tres" id="4_svuj3"]
|
[ext_resource type="SpriteFrames" uid="uid://c2sjavnptjn" path="res://asset/art/gif/c02_保卫科/c02_保卫科_frames.tres" id="4_svuj3"]
|
||||||
[ext_resource type="Texture2D" uid="uid://bnyf8m63ltgh0" path="res://asset/art/scene/c02/s04_保卫科/l_香.png" id="5_cy26p"]
|
[ext_resource type="Texture2D" uid="uid://bnyf8m63ltgh0" path="res://asset/art/scene/c02/s04_保卫科/l_香.png" id="5_cy26p"]
|
||||||
[ext_resource type="Script" uid="uid://cpejxlfni6n52" path="res://manager/audio_manager/vibe_sfx.gd" id="5_g8amr"]
|
[ext_resource type="Script" uid="uid://cpejxlfni6n52" path="res://manager/audio_manager/vibe_sfx.gd" id="5_g8amr"]
|
||||||
[ext_resource type="AudioStream" uid="uid://c26x8f18w6is0" path="res://asset/audio/sfx/旧版/c02/撞到柜子.mp3" id="5_xy3nq"]
|
|
||||||
[ext_resource type="PackedScene" uid="uid://dqkxiqbq83cmq" path="res://scene/entity/closeup.tscn" id="6_66gue"]
|
[ext_resource type="PackedScene" uid="uid://dqkxiqbq83cmq" path="res://scene/entity/closeup.tscn" id="6_66gue"]
|
||||||
[ext_resource type="PackedScene" uid="uid://b8i6tqwdvvddy" path="res://scene/ground/script/c02/花名册.tscn" id="6_fvlg0"]
|
[ext_resource type="PackedScene" uid="uid://b8i6tqwdvvddy" path="res://scene/ground/script/c02/花名册.tscn" id="6_fvlg0"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cs14llkvr3fg8" path="res://asset/art/scene/c02/s04_保卫科/弹珠墙面涂鸦提示.png" id="6_gk1h4"]
|
[ext_resource type="Texture2D" uid="uid://cs14llkvr3fg8" path="res://asset/art/scene/c02/s04_保卫科/弹珠墙面涂鸦提示.png" id="6_gk1h4"]
|
||||||
@ -42,14 +40,7 @@ data = {
|
|||||||
}
|
}
|
||||||
oneshot_animation = ""
|
oneshot_animation = ""
|
||||||
|
|
||||||
[node name="Sfx摔倒" type="AudioStreamPlayer" parent="Ground/AnimationPlayer" index="0"]
|
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="0"]
|
||||||
process_mode = 1
|
|
||||||
stream = ExtResource("5_xy3nq")
|
|
||||||
bus = &"game_sfx"
|
|
||||||
script = ExtResource("4_ffvrp")
|
|
||||||
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
|
||||||
|
|
||||||
[node name="VibeSfx" type="Node" parent="Ground/AnimationPlayer" index="1"]
|
|
||||||
script = ExtResource("5_g8amr")
|
script = ExtResource("5_g8amr")
|
||||||
autoplay_group = &"c02_房间里1"
|
autoplay_group = &"c02_房间里1"
|
||||||
metadata/_custom_type_script = "uid://cpejxlfni6n52"
|
metadata/_custom_type_script = "uid://cpejxlfni6n52"
|
||||||
@ -106,12 +97,6 @@ hide_texture = true
|
|||||||
gaslight_texture = ExtResource("9_a43aq")
|
gaslight_texture = ExtResource("9_a43aq")
|
||||||
ground_light_texture = ExtResource("10_svuj3")
|
ground_light_texture = ExtResource("10_svuj3")
|
||||||
|
|
||||||
[node name="SfxInvalid" parent="Ground/DeployLayer/煤油灯" index="0"]
|
|
||||||
process_mode = 1
|
|
||||||
|
|
||||||
[node name="SfxSuccess" parent="Ground/DeployLayer/煤油灯" index="1"]
|
|
||||||
process_mode = 1
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
|
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
|
||||||
shape = SubResource("RectangleShape2D_gk1h4")
|
shape = SubResource("RectangleShape2D_gk1h4")
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ func _on_madman_interacted() -> void:
|
|||||||
return
|
return
|
||||||
await DialogueManager.dialogue_ended
|
await DialogueManager.dialogue_ended
|
||||||
EventManager.set_stage("c02_madman_interacted", 1)
|
EventManager.set_stage("c02_madman_interacted", 1)
|
||||||
SceneManager.pop_os_with_str(tr("c02_一楼疯子互动后"))
|
SceneManager.pop_os_with_str("c02_一楼疯子互动后")
|
||||||
|
|
||||||
|
|
||||||
func xiaochan_disappear():
|
func xiaochan_disappear():
|
||||||
|
@ -45,7 +45,7 @@ func _on_ground_ready() -> void:
|
|||||||
gas_light_upon_hole.lighted.connect(func():
|
gas_light_upon_hole.lighted.connect(func():
|
||||||
mice_hole.enabled = true
|
mice_hole.enabled = true
|
||||||
get_tree().create_timer(1.5).timeout.connect(
|
get_tree().create_timer(1.5).timeout.connect(
|
||||||
SceneManager.pop_os_with_str.bind(tr("c02_二楼血脚印"))
|
SceneManager.pop_os_with_str.bind("c02_二楼血脚印")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -942,12 +942,6 @@ position = Vector2(616, -14)
|
|||||||
ground_light_texture = ExtResource("8_7x2h6")
|
ground_light_texture = ExtResource("8_7x2h6")
|
||||||
ground_height_offset = 15.0
|
ground_height_offset = 15.0
|
||||||
|
|
||||||
[node name="SfxInvalid" parent="Ground/DeployLayer/煤油灯" index="0"]
|
|
||||||
process_mode = 1
|
|
||||||
|
|
||||||
[node name="SfxSuccess" parent="Ground/DeployLayer/煤油灯" index="1"]
|
|
||||||
process_mode = 1
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
|
[node name="CollisionShape2D" parent="Ground/DeployLayer/煤油灯/Area2D" index="0"]
|
||||||
shape = SubResource("RectangleShape2D_lh55k")
|
shape = SubResource("RectangleShape2D_lh55k")
|
||||||
|
|
||||||
|
@ -43,7 +43,12 @@ func take_off_flyer(immediatelly = false):
|
|||||||
flyer.visible = false
|
flyer.visible = false
|
||||||
var hand = $"../DeployLayer/小手讨东西"
|
var hand = $"../DeployLayer/小手讨东西"
|
||||||
hand.enabled = true
|
hand.enabled = true
|
||||||
if hand.tried_times == 0:
|
# if hand.icount == 0:
|
||||||
await get_tree().create_timer(1.0).timeout
|
# await get_tree().create_timer(1.0).timeout
|
||||||
hand.do_first_interact(immediatelly)
|
# hand.icount += 1
|
||||||
hand.tried_times += 1
|
# SceneManager.lock_player()
|
||||||
|
# await hand.do_first_interact(immediatelly)
|
||||||
|
# SceneManager.unlock_player()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ func _on_pick_catty_head() -> void:
|
|||||||
sprite.visible = false
|
sprite.visible = false
|
||||||
SceneManager.enable_prop_item("prop_小猫玩具完整")
|
SceneManager.enable_prop_item("prop_小猫玩具完整")
|
||||||
await SceneManager.get_inspector().quit_and_hidden
|
await SceneManager.get_inspector().quit_and_hidden
|
||||||
SceneManager.pop_os_with_str(tr("c02_获得小猫玩具"))
|
SceneManager.pop_os_with_str("c02_获得小猫玩具")
|
||||||
# 进过瞎子卧室后,通道关闭
|
# 进过瞎子卧室后,通道关闭
|
||||||
if not ArchiveManager.get_global_value(&"c02_the_blind_room_unlocked"):
|
if not ArchiveManager.get_global_value(&"c02_the_blind_room_unlocked"):
|
||||||
portal_note.enabled = true
|
portal_note.enabled = true
|
||||||
|
@ -75,7 +75,7 @@ func _on_mismatch():
|
|||||||
ArchiveManager.set_global_entry(&"c02_gaslight_first_failed", true)
|
ArchiveManager.set_global_entry(&"c02_gaslight_first_failed", true)
|
||||||
var scene = ArchiveManager.archive.current_scene
|
var scene = ArchiveManager.archive.current_scene
|
||||||
if scene == "c02_s02" or scene == "c02_s03":
|
if scene == "c02_s02" or scene == "c02_s03":
|
||||||
SceneManager.pop_os_with_str(tr("c02_陈旧的煤油灯"))
|
SceneManager.pop_os_with_str("c02_陈旧的煤油灯")
|
||||||
# 如果有道具,则提示玩家可以使用道具
|
# 如果有道具,则提示玩家可以使用道具
|
||||||
elif SceneManager.get_current_prop(false):
|
elif SceneManager.get_current_prop(false):
|
||||||
SceneManager.pop_center_notification(tr("ui_switch_prop"))
|
SceneManager.pop_center_notification(tr("ui_switch_prop"))
|
||||||
@ -145,4 +145,4 @@ func _gaslight_interacted():
|
|||||||
var scene = ArchiveManager.archive.current_scene
|
var scene = ArchiveManager.archive.current_scene
|
||||||
if scene == "c02_s02" or scene == "c02_s03":
|
if scene == "c02_s02" or scene == "c02_s03":
|
||||||
await get_tree().create_timer(1.0).timeout
|
await get_tree().create_timer(1.0).timeout
|
||||||
SceneManager.pop_os_with_str(tr("c02_使用煤油灯"))
|
SceneManager.pop_os_with_str("c02_使用煤油灯")
|
||||||
|
@ -43,11 +43,13 @@ prop_key2 = ""
|
|||||||
prop_key3 = ""
|
prop_key3 = ""
|
||||||
|
|
||||||
[node name="SfxInvalid" type="AudioStreamPlayer" parent="."]
|
[node name="SfxInvalid" type="AudioStreamPlayer" parent="."]
|
||||||
|
process_mode = 1
|
||||||
stream = ExtResource("9_l338h")
|
stream = ExtResource("9_l338h")
|
||||||
bus = &"game_sfx"
|
bus = &"game_sfx"
|
||||||
script = ExtResource("8_abb1f")
|
script = ExtResource("8_abb1f")
|
||||||
|
|
||||||
[node name="SfxSuccess" type="AudioStreamPlayer" parent="."]
|
[node name="SfxSuccess" type="AudioStreamPlayer" parent="."]
|
||||||
|
process_mode = 1
|
||||||
stream = ExtResource("9_abb1f")
|
stream = ExtResource("9_abb1f")
|
||||||
bus = &"game_sfx"
|
bus = &"game_sfx"
|
||||||
script = ExtResource("8_abb1f")
|
script = ExtResource("8_abb1f")
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Sprite2D
|
extends Sprite2D
|
||||||
|
|
||||||
signal interacted
|
signal interact_start
|
||||||
|
|
||||||
# 0保卫科 1二楼内侧
|
# 0保卫科 1二楼内侧
|
||||||
@export_enum("保卫科", "二楼内侧") var id := 0
|
@export_enum("保卫科", "二楼内侧") var id := 0
|
||||||
@ -48,10 +48,31 @@ var tin_coin_drop = false:
|
|||||||
if tin_coin_drop:
|
if tin_coin_drop:
|
||||||
coin.reset()
|
coin.reset()
|
||||||
# 尝试互动的次数
|
# 尝试互动的次数
|
||||||
var tried_times: int:
|
var icount: int:
|
||||||
set(val):
|
set(val):
|
||||||
tried_times = val
|
icount = val
|
||||||
ground_archive.set_pair(name, "tried_times", val)
|
ground_archive.set_pair(name, "icount", val)
|
||||||
|
# update sign texture
|
||||||
|
if icount == 0:
|
||||||
|
# 首次交互前 unrevealed
|
||||||
|
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
||||||
|
else:
|
||||||
|
sign_mark.sprite2d.texture = matched_sign_texture
|
||||||
|
if icount == 1:
|
||||||
|
var stage = EventManager.get_stage(&"c02_little_hand")
|
||||||
|
if stage == 0:
|
||||||
|
# 首次交互小手
|
||||||
|
EventManager.set_stage(&"c02_little_hand", 1)
|
||||||
|
# 9 小手交互,吓摔倒
|
||||||
|
SceneManager.lock_player(0, 9, true)
|
||||||
|
SceneManager.pop_os_with_str("c02_小手出现摔倒")
|
||||||
|
get_tree().create_timer(1.5).timeout.connect($"Sfx摔倒".play)
|
||||||
|
await SceneManager.get_player().animation_finished
|
||||||
|
SceneManager.unlock_player()
|
||||||
|
elif stage == 1:
|
||||||
|
# 第二次交互小手
|
||||||
|
EventManager.set_stage(&"c02_little_hand", 2)
|
||||||
|
SceneManager.pop_os_with_str("c02_小手再次出现")
|
||||||
|
|
||||||
var coin: Pickable2D
|
var coin: Pickable2D
|
||||||
|
|
||||||
@ -59,18 +80,16 @@ var coin: Pickable2D
|
|||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
if Engine.is_editor_hint():
|
if Engine.is_editor_hint():
|
||||||
return
|
return
|
||||||
area2d.body_entered.connect(_reset)
|
|
||||||
area2d.body_exited.connect(_on_exit)
|
|
||||||
# sign_mark.interacted.connect(_on_interacted)
|
# sign_mark.interacted.connect(_on_interacted)
|
||||||
sign_snapper.arrived.connect(_on_interacted)
|
sign_snapper.arrived.connect(_on_interacted)
|
||||||
sign_mark.cancel.connect(_on_cancel)
|
sign_mark.cancel.connect(_on_cancel)
|
||||||
sign_mark.enabled = enabled
|
_check_sign_mark_display()
|
||||||
|
|
||||||
# setup default value
|
# setup default value
|
||||||
ground_archive = ArchiveManager.archive.ground_archive() as GroundArchive
|
ground_archive = ArchiveManager.archive.ground_archive() as GroundArchive
|
||||||
is_holding_cup = ground_archive.get_value(name, "is_holding_cup", false)
|
is_holding_cup = ground_archive.get_value(name, "is_holding_cup", false)
|
||||||
holding_prop = ground_archive.get_value(name, "holding_prop", "")
|
holding_prop = ground_archive.get_value(name, "holding_prop", "")
|
||||||
tried_times = ground_archive.get_value(name, "tried_times", 0)
|
icount = ground_archive.get_value(name, "icount", 0)
|
||||||
|
|
||||||
if holding_prop == "prop_弹珠":
|
if holding_prop == "prop_弹珠":
|
||||||
animated_sprite.play("小手_弹珠_idle")
|
animated_sprite.play("小手_弹珠_idle")
|
||||||
@ -78,7 +97,7 @@ func _ready() -> void:
|
|||||||
animated_sprite.play("小手_老虎钳_idle")
|
animated_sprite.play("小手_老虎钳_idle")
|
||||||
elif is_holding_cup:
|
elif is_holding_cup:
|
||||||
animated_sprite.play("小手_纸杯_idle")
|
animated_sprite.play("小手_纸杯_idle")
|
||||||
elif tried_times > 0:
|
elif icount > 0:
|
||||||
animated_sprite.play("小手_show")
|
animated_sprite.play("小手_show")
|
||||||
|
|
||||||
coin = get_node("Pickable元宝")
|
coin = get_node("Pickable元宝")
|
||||||
@ -90,42 +109,13 @@ func _check_sign_mark_display():
|
|||||||
sign_mark.enabled = enabled and not interacting
|
sign_mark.enabled = enabled and not interacting
|
||||||
|
|
||||||
|
|
||||||
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 do_first_interact(immediatelly := false):
|
func do_first_interact(immediatelly := false):
|
||||||
if immediatelly:
|
if immediatelly:
|
||||||
animated_sprite.play("小手_idle")
|
animated_sprite.play("小手_idle")
|
||||||
else:
|
else:
|
||||||
animated_sprite.play("小手_show")
|
animated_sprite.play("小手_show")
|
||||||
_reset_sign_testure_to_prop()
|
await animated_sprite.animation_changed
|
||||||
|
|
||||||
|
|
||||||
func _reset_sign_testure_to_prop():
|
|
||||||
var key = SceneManager.get_current_prop(false)
|
|
||||||
_set_sign_texture_to_prop(key)
|
|
||||||
|
|
||||||
|
|
||||||
# 根据当前 prop,调整 sign 所显示的 texture
|
|
||||||
func _set_sign_texture_to_prop(_key):
|
|
||||||
_check_sign_mark_display()
|
|
||||||
if tried_times == 0:
|
|
||||||
# 首次交互前 unrevealed
|
|
||||||
sign_mark.sprite2d.texture = unrevealed_sign_texture
|
|
||||||
return
|
|
||||||
sign_mark.sprite2d.texture = matched_sign_texture
|
|
||||||
|
|
||||||
|
|
||||||
func _on_exit(_body = null) -> void:
|
|
||||||
# disconnect signal
|
|
||||||
var prop_hud = SceneManager.get_prop_hud() as PropHud
|
|
||||||
if prop_hud and prop_hud.current_item_changed.is_connected(_set_sign_texture_to_prop):
|
|
||||||
prop_hud.current_item_changed.disconnect(_set_sign_texture_to_prop)
|
|
||||||
|
|
||||||
|
|
||||||
func _on_cancel(_body = null) -> void:
|
func _on_cancel(_body = null) -> void:
|
||||||
@ -153,36 +143,31 @@ var interacting := false:
|
|||||||
|
|
||||||
var communicating = false
|
var communicating = false
|
||||||
|
|
||||||
|
|
||||||
func _on_interacted() -> void:
|
func _on_interacted() -> void:
|
||||||
if interacting:
|
if interacting:
|
||||||
print("小手 interacting 锁定中")
|
print("小手 interacting 锁定中")
|
||||||
SceneManager.release_player()
|
# SceneManager.release_player()
|
||||||
return
|
return
|
||||||
interacting = true
|
interacting = true
|
||||||
interacted.emit()
|
interact_start.emit()
|
||||||
tried_times += 1
|
icount += 1
|
||||||
if tried_times == 1:
|
if icount == 1:
|
||||||
do_first_interact(false)
|
await do_first_interact(false)
|
||||||
interacting = false
|
elif holding_prop != "":
|
||||||
SceneManager.release_player()
|
|
||||||
return
|
|
||||||
if holding_prop != "":
|
|
||||||
# 手持物品时,交互直接给玩家物品
|
# 手持物品时,交互直接给玩家物品
|
||||||
SceneManager.enable_prop_item(holding_prop)
|
SceneManager.enable_prop_item(holding_prop)
|
||||||
holding_prop = ""
|
holding_prop = ""
|
||||||
animated_sprite.play("小手_show")
|
animated_sprite.play("小手_show")
|
||||||
interacting = false
|
await animated_sprite.animation_changed
|
||||||
SceneManager.release_player()
|
elif is_holding_cup:
|
||||||
return
|
|
||||||
|
|
||||||
if is_holding_cup:
|
|
||||||
# 对话
|
# 对话
|
||||||
if not communicating:
|
if not communicating:
|
||||||
communicating = true
|
communicating = true
|
||||||
animated_sprite.visible = false
|
# animated_sprite.visible = false
|
||||||
# 7 拿起纸杯 8 监听纸杯
|
# 7 拿起纸杯 8 监听纸杯
|
||||||
SceneManager.freeze_player(0, 7)
|
SceneManager.freeze_player(0, 7)
|
||||||
|
# 小手收回 play backwards
|
||||||
|
animated_sprite.play("小手_纸杯_hide")
|
||||||
await SceneManager.get_player().animation_finished
|
await SceneManager.get_player().animation_finished
|
||||||
SceneManager.player_action(8)
|
SceneManager.player_action(8)
|
||||||
SceneManager.pop_debug_dialog_info("音效", "纸杯电话童谣")
|
SceneManager.pop_debug_dialog_info("音效", "纸杯电话童谣")
|
||||||
@ -191,71 +176,70 @@ func _on_interacted() -> void:
|
|||||||
sfx_bgm.finished.connect(_quit_communicating, CONNECT_ONE_SHOT)
|
sfx_bgm.finished.connect(_quit_communicating, CONNECT_ONE_SHOT)
|
||||||
else:
|
else:
|
||||||
_quit_communicating()
|
_quit_communicating()
|
||||||
interacting = false
|
|
||||||
return
|
|
||||||
|
|
||||||
var key = SceneManager.get_current_prop(false)
|
|
||||||
var interacted_success = false
|
|
||||||
SceneManager.freeze_player(0, 4)
|
|
||||||
|
|
||||||
# accept_tin_coin
|
|
||||||
if key == "prop_锡箔元宝":
|
|
||||||
interacted_success = true
|
|
||||||
sfx_success.play()
|
|
||||||
SceneManager.disable_prop_item("prop_锡箔元宝")
|
|
||||||
if id == 1:
|
|
||||||
SceneManager.enable_prop_item_silently("prop_小鞋子1")
|
|
||||||
ArchiveManager.set_global_entry(&"c02_mouse_follow_player", true)
|
|
||||||
# 叠成纸杯电话
|
|
||||||
animated_sprite.play("小手_锡箔_hide")
|
|
||||||
is_holding_cup = true
|
|
||||||
SceneManager.pop_debug_dialog_info("美术", "叠成纸杯: 小手_锡箔_hide + 小手_纸杯_show + 小手_纸杯_idle")
|
|
||||||
await get_tree().create_timer(2).timeout
|
|
||||||
# 稍等片刻再给小鞋子
|
|
||||||
SceneManager.enable_prop_item("prop_小鞋子1")
|
|
||||||
await SceneManager.get_inspector().quit_and_hidden
|
|
||||||
SceneManager.pop_os_with_str("c02_锡箔换小鞋子")
|
|
||||||
var node = get_node("../自动跟随的老鼠") as Node2D
|
|
||||||
if node:
|
|
||||||
node.visible = true
|
|
||||||
else:
|
|
||||||
printerr("小手已接受锡箔;自动跟随的老鼠节点不存在")
|
|
||||||
else:
|
|
||||||
# 丢下元宝
|
|
||||||
animated_sprite.play("小手_锡箔_drop")
|
|
||||||
# 先设置允许 pickable,然后再设置可见性,等待动画播完再显示
|
|
||||||
tin_coin_drop = true
|
|
||||||
coin.visible = false
|
|
||||||
await get_tree().create_timer(1.5).timeout
|
|
||||||
coin.visible = true
|
|
||||||
|
|
||||||
# 是否允许老虎钳换弹珠
|
|
||||||
var pliers_to_ball = ArchiveManager.get_global_value(&"c02_pliers_to_ball", false)
|
|
||||||
if id == 0 and key == "prop_老虎钳" and pliers_to_ball:
|
|
||||||
interacted_success = true
|
|
||||||
sfx_success.play()
|
|
||||||
SceneManager.disable_prop_item("prop_老虎钳")
|
|
||||||
animated_sprite.play("小手_老虎钳_hide")
|
|
||||||
SceneManager.pop_debug_dialog_info("美术", "小手_老虎钳_hide + 小手_弹珠_show + 小手_弹珠_idle")
|
|
||||||
await get_tree().create_timer(1.5).timeout
|
|
||||||
holding_prop = "prop_弹珠"
|
|
||||||
EventManager.set_stage_if_greater("handnote_stage", 4)
|
|
||||||
|
|
||||||
elif id == 0 and key == "prop_弹珠" and not pliers_to_ball:
|
|
||||||
interacted_success = true
|
|
||||||
sfx_success.play()
|
|
||||||
SceneManager.disable_prop_item("prop_弹珠")
|
|
||||||
animated_sprite.play("小手_弹珠_hide")
|
|
||||||
SceneManager.pop_debug_dialog_info("美术", "小手_弹珠_hide + 小手_老虎钳_show + 小手_老虎钳_idle")
|
|
||||||
await get_tree().create_timer(1.5).timeout
|
|
||||||
holding_prop = "prop_老虎钳"
|
|
||||||
|
|
||||||
if interacted_success:
|
|
||||||
EventManager.prop_interacted(name, key, 1)
|
|
||||||
_reset_sign_testure_to_prop()
|
|
||||||
else:
|
else:
|
||||||
sfx_invalid.play()
|
var key = SceneManager.get_current_prop(false)
|
||||||
sign_mark.invalid_shake(matched_sign_texture, unmatched_sign_texture)
|
var interacted_success = false
|
||||||
|
SceneManager.lock_player(0, 4)
|
||||||
|
# accept_tin_coin
|
||||||
|
if key == "prop_锡箔元宝":
|
||||||
|
interacted_success = true
|
||||||
|
sfx_success.play()
|
||||||
|
SceneManager.disable_prop_item("prop_锡箔元宝")
|
||||||
|
if id == 1:
|
||||||
|
SceneManager.enable_prop_item_silently("prop_小鞋子1")
|
||||||
|
ArchiveManager.set_global_entry(&"c02_mouse_follow_player", true)
|
||||||
|
# 叠成纸杯电话
|
||||||
|
animated_sprite.play("小手_锡箔_hide")
|
||||||
|
is_holding_cup = true
|
||||||
|
SceneManager.pop_debug_dialog_info(
|
||||||
|
"美术", "叠成纸杯: 小手_锡箔_hide + 小手_纸杯_show + 小手_纸杯_idle"
|
||||||
|
)
|
||||||
|
await get_tree().create_timer(2).timeout
|
||||||
|
# 稍等片刻再给小鞋子
|
||||||
|
SceneManager.enable_prop_item("prop_小鞋子1")
|
||||||
|
await SceneManager.get_inspector().quit_and_hidden
|
||||||
|
SceneManager.pop_os_with_str("c02_锡箔换小鞋子")
|
||||||
|
var node = get_node("../自动跟随的老鼠") as Node2D
|
||||||
|
if node:
|
||||||
|
node.visible = true
|
||||||
|
else:
|
||||||
|
printerr("小手已接受锡箔;自动跟随的老鼠节点不存在")
|
||||||
|
else:
|
||||||
|
# 丢下元宝
|
||||||
|
animated_sprite.play("小手_锡箔_drop")
|
||||||
|
# 先设置允许 pickable,然后再设置可见性,等待动画播完再显示
|
||||||
|
tin_coin_drop = true
|
||||||
|
coin.visible = false
|
||||||
|
await get_tree().create_timer(1.5).timeout
|
||||||
|
coin.visible = true
|
||||||
|
if not ArchiveManager.get_global_value(&"c02_little_hand_dropped_tin"):
|
||||||
|
SceneManager.pop_os_with_str("c02_小手要东西")
|
||||||
|
ArchiveManager.set_global_entry(&"c02_little_hand_dropped_tin", true)
|
||||||
|
|
||||||
SceneManager.release_player()
|
# 是否允许老虎钳换弹珠
|
||||||
|
var pliers_to_ball = ArchiveManager.get_global_value(&"c02_pliers_to_ball", false)
|
||||||
|
if id == 0 and key == "prop_老虎钳" and pliers_to_ball:
|
||||||
|
interacted_success = true
|
||||||
|
sfx_success.play()
|
||||||
|
SceneManager.disable_prop_item("prop_老虎钳")
|
||||||
|
animated_sprite.play("小手_老虎钳_hide")
|
||||||
|
SceneManager.pop_debug_dialog_info("美术", "小手_老虎钳_hide + 小手_弹珠_show + 小手_弹珠_idle")
|
||||||
|
await get_tree().create_timer(1.5).timeout
|
||||||
|
holding_prop = "prop_弹珠"
|
||||||
|
EventManager.set_stage_if_greater("handnote_stage", 4)
|
||||||
|
elif id == 0 and key == "prop_弹珠" and not pliers_to_ball:
|
||||||
|
interacted_success = true
|
||||||
|
sfx_success.play()
|
||||||
|
SceneManager.disable_prop_item("prop_弹珠")
|
||||||
|
animated_sprite.play("小手_弹珠_hide")
|
||||||
|
SceneManager.pop_debug_dialog_info("美术", "小手_弹珠_hide + 小手_老虎钳_show + 小手_老虎钳_idle")
|
||||||
|
await get_tree().create_timer(1.5).timeout
|
||||||
|
holding_prop = "prop_老虎钳"
|
||||||
|
|
||||||
|
if interacted_success:
|
||||||
|
EventManager.prop_interacted(name, key, 1)
|
||||||
|
else:
|
||||||
|
sfx_invalid.play()
|
||||||
|
sign_mark.invalid_shake(matched_sign_texture, unmatched_sign_texture)
|
||||||
|
SceneManager.unlock_player()
|
||||||
interacting = false
|
interacting = false
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=17 format=3 uid="uid://xovlfee503a4"]
|
[gd_scene load_steps=18 format=3 uid="uid://xovlfee503a4"]
|
||||||
|
|
||||||
[ext_resource type="Texture2D" uid="uid://cawpq7rnho5px" path="res://asset/art/gif/c02_小手/洞.png" id="1_47cqy"]
|
[ext_resource type="Texture2D" uid="uid://cawpq7rnho5px" path="res://asset/art/gif/c02_小手/洞.png" id="1_47cqy"]
|
||||||
[ext_resource type="Script" uid="uid://my5xqi3bkka6" path="res://scene/ground/script/c02/小手讨东西.gd" id="1_n7thl"]
|
[ext_resource type="Script" uid="uid://my5xqi3bkka6" path="res://scene/ground/script/c02/小手讨东西.gd" id="1_n7thl"]
|
||||||
@ -12,6 +12,7 @@
|
|||||||
[ext_resource type="AudioStream" uid="uid://44slgncnt6sj" path="res://asset/audio/sfx/交互/第一章/sfx_手交互成功.wav" id="8_7dftu"]
|
[ext_resource type="AudioStream" uid="uid://44slgncnt6sj" path="res://asset/audio/sfx/交互/第一章/sfx_手交互成功.wav" id="8_7dftu"]
|
||||||
[ext_resource type="AudioStream" uid="uid://c5d6i2wp8xkay" path="res://asset/audio/sfx/bgm/第一章/童谣合并_FX.wav" id="9_7dftu"]
|
[ext_resource type="AudioStream" uid="uid://c5d6i2wp8xkay" path="res://asset/audio/sfx/bgm/第一章/童谣合并_FX.wav" id="9_7dftu"]
|
||||||
[ext_resource type="SpriteFrames" uid="uid://b6nvwset1hwbv" path="res://asset/art/gif/c02_小手/c02_小手_frames.tres" id="9_yatcw"]
|
[ext_resource type="SpriteFrames" uid="uid://b6nvwset1hwbv" path="res://asset/art/gif/c02_小手/c02_小手_frames.tres" id="9_yatcw"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://c26x8f18w6is0" path="res://asset/audio/sfx/旧版/c02/撞到柜子.mp3" id="10_0tuif"]
|
||||||
[ext_resource type="Texture2D" uid="uid://2mjipesnigcr" path="res://asset/art/prop/c02/锡箔元宝.png" id="10_47cqy"]
|
[ext_resource type="Texture2D" uid="uid://2mjipesnigcr" path="res://asset/art/prop/c02/锡箔元宝.png" id="10_47cqy"]
|
||||||
[ext_resource type="PackedScene" uid="uid://dsa6frlw6e6gg" path="res://scene/entity/pickable.tscn" id="12_6lwlv"]
|
[ext_resource type="PackedScene" uid="uid://dsa6frlw6e6gg" path="res://scene/entity/pickable.tscn" id="12_6lwlv"]
|
||||||
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="15_lr23o"]
|
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="15_lr23o"]
|
||||||
@ -48,6 +49,13 @@ bus = &"game_sfx"
|
|||||||
script = ExtResource("7_7dftu")
|
script = ExtResource("7_7dftu")
|
||||||
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
||||||
|
|
||||||
|
[node name="Sfx摔倒" type="AudioStreamPlayer" parent="."]
|
||||||
|
process_mode = 1
|
||||||
|
stream = ExtResource("10_0tuif")
|
||||||
|
bus = &"game_sfx"
|
||||||
|
script = ExtResource("7_7dftu")
|
||||||
|
metadata/_custom_type_script = "uid://rq6w1vuhuq1m"
|
||||||
|
|
||||||
[node name="Area2D" type="Area2D" parent="."]
|
[node name="Area2D" type="Area2D" parent="."]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
|
@ -346,4 +346,4 @@ func _on_pick_catty():
|
|||||||
SceneManager.enable_prop_item("prop_小猫玩具完整")
|
SceneManager.enable_prop_item("prop_小猫玩具完整")
|
||||||
# 八音盒中看不到 os
|
# 八音盒中看不到 os
|
||||||
# await inspector.quit_and_hidden
|
# await inspector.quit_and_hidden
|
||||||
# SceneManager.pop_os_with_str(tr("c02_获得小猫玩具"))
|
# SceneManager.pop_os_with_str("c02_获得小猫玩具")
|
@ -1,4 +1,4 @@
|
|||||||
[gd_scene load_steps=54 format=3 uid="uid://beleib3mmu0af"]
|
[gd_scene load_steps=46 format=3 uid="uid://beleib3mmu0af"]
|
||||||
|
|
||||||
[ext_resource type="Texture2D" uid="uid://2xbl572hv2qf" path="res://asset/art/little_game/八音盒/背景.png" id="1_j0wst"]
|
[ext_resource type="Texture2D" uid="uid://2xbl572hv2qf" path="res://asset/art/little_game/八音盒/背景.png" id="1_j0wst"]
|
||||||
[ext_resource type="Script" uid="uid://bian8ga7cet8k" path="res://scene/little_game/八音盒/八音盒.gd" id="2_opptd"]
|
[ext_resource type="Script" uid="uid://bian8ga7cet8k" path="res://scene/little_game/八音盒/八音盒.gd" id="2_opptd"]
|
||||||
@ -115,43 +115,12 @@ animations = [{
|
|||||||
"speed": 5.0
|
"speed": 5.0
|
||||||
}]
|
}]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_b3w8p"]
|
|
||||||
size = Vector2(310, 170)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_28n4a"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(20, 95)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_5r85q"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(20, 90)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ytjup"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(20, 60)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_7s35x"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(20, 60)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_cbhp3"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_cbhp3"]
|
||||||
resource_local_to_scene = true
|
resource_local_to_scene = true
|
||||||
size = Vector2(290, 60)
|
size = Vector2(290, 60)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_04cdl"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(50, 70)
|
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id="CircleShape2D_wq2wm"]
|
[sub_resource type="CircleShape2D" id="CircleShape2D_wq2wm"]
|
||||||
radius = 20.0
|
radius = 18.0
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_sg8mt"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(50, 30)
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_0kog4"]
|
|
||||||
resource_local_to_scene = true
|
|
||||||
size = Vector2(30, 70)
|
|
||||||
|
|
||||||
[node name="八音盒" type="CanvasLayer"]
|
[node name="八音盒" type="CanvasLayer"]
|
||||||
layer = 5
|
layer = 5
|
||||||
@ -216,7 +185,6 @@ sprite_frames = SubResource("SpriteFrames_t7gu7")
|
|||||||
centered = false
|
centered = false
|
||||||
|
|
||||||
[node name="ClosedBox" parent="All" instance=ExtResource("16_h88gi")]
|
[node name="ClosedBox" parent="All" instance=ExtResource("16_h88gi")]
|
||||||
visible = false
|
|
||||||
position = Vector2(277, 194.5)
|
position = Vector2(277, 194.5)
|
||||||
act_as_button = true
|
act_as_button = true
|
||||||
item_name = "照片"
|
item_name = "照片"
|
||||||
@ -224,11 +192,12 @@ sprite_offset = Vector2(3, -35)
|
|||||||
texture = ExtResource("22_rdaqv")
|
texture = ExtResource("22_rdaqv")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/ClosedBox"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/ClosedBox"]
|
||||||
position = Vector2(15, 2.5)
|
position = Vector2(2.99999, -33.5)
|
||||||
shape = SubResource("RectangleShape2D_b3w8p")
|
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
|
||||||
@ -246,9 +215,9 @@ sprite_offset = Vector2(3, -35)
|
|||||||
texture = ExtResource("17_gm7pw")
|
texture = ExtResource("17_gm7pw")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/OpenedBox/Panel/Draggable2D1"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/OpenedBox/Panel/Draggable2D1"]
|
||||||
position = Vector2(-1, -36)
|
position = Vector2(3.20175, -33.5559)
|
||||||
shape = SubResource("RectangleShape2D_28n4a")
|
polygon = PackedVector2Array(2.5, -45.5, -8.5, -45.5, -9.3, -44.5, -11.9, -44.5, -9.5, -31.1, -9.5, -30.4, -15.2, -25.5, -17.1, -25.5, -18.5, -19.2, -18.5, -3.9, -14.5, -0.700001, -13.5, 33.3, -14.5, 34.8, -14.5, 41.7, -7.7, 45.5, 4.3, 45.5, 6.3, 43.5, 8.1, 43.5, 9.5, 37.7, 9.5, 35.7, 5.8, 32, 6.3, 31.5, 8.7, 31.5, 7.5, 16.5, 7.5, -5.5, 13.8, -5.5, 18.5, -15.9, 18.5, -26.8, 16.2, -27.8, 9.5, -22.5, 9.5, -20.5, 8.6, -20.5, 3.1, -28.8, 6.5, -38.1, 6.5, -42.5)
|
||||||
|
|
||||||
[node name="Draggable2D2" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
[node name="Draggable2D2" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
||||||
position = Vector2(286.5, 197)
|
position = Vector2(286.5, 197)
|
||||||
@ -258,9 +227,9 @@ sprite_offset = Vector2(1, -34)
|
|||||||
texture = ExtResource("18_8vbnc")
|
texture = ExtResource("18_8vbnc")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/OpenedBox/Panel/Draggable2D2"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/OpenedBox/Panel/Draggable2D2"]
|
||||||
position = Vector2(0, -34)
|
position = Vector2(1.42264, -34.029)
|
||||||
shape = SubResource("RectangleShape2D_5r85q")
|
polygon = PackedVector2Array(11.5, -41.9, 2, -45.5, -5.5, -45.5, -9.4, -40.5, -12.1, -40.5, -10.5, -34.5, -10.5, -31.5, -6, -27.9, -10.3, -23.5, -12.3, -23.5, -12.5, -21.9, -12.5, -7.8, -10.9, -3.5, -12.5, 9.4, -12.5, 29.3, -9.5, 32.3, -12.5, 34.4, -12.5, 41.7, -5.7, 45.5, 6.3, 45.5, 8.3, 43.5, 10.1, 43.5, 11.5, 37.7, 11.5, 35.7, 8, 32.2, 10.2, 30.5, 12.5, 30.5, 12.5, 28.1, 8.5, -2.5, 8.5, -3.6, 12.2, -6.5, 12.5, -19.6, 5.4, -29.3, 11.5, -37.9)
|
||||||
|
|
||||||
[node name="Draggable2D3" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
[node name="Draggable2D3" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
||||||
position = Vector2(354, 169)
|
position = Vector2(354, 169)
|
||||||
@ -270,9 +239,9 @@ sprite_offset = Vector2(1, -23)
|
|||||||
texture = ExtResource("19_858bj")
|
texture = ExtResource("19_858bj")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/OpenedBox/Panel/Draggable2D3"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/OpenedBox/Panel/Draggable2D3"]
|
||||||
position = Vector2(-1, -23)
|
position = Vector2(1.18075, -22.9097)
|
||||||
shape = SubResource("RectangleShape2D_ytjup")
|
polygon = PackedVector2Array(9.5, -23.1, 4.6, -26.3, 2.5, -25.2, 2.5, -24, -6.6, -24, -8.6, -21, -10.5, -21, -10.5, -18.8, -9.5, -15, -9.5, -8.9, -6.5, -6.9, -10.5, -2.8, -10.5, 16, -7.4, 18.3, -10, 20, -10.5, 29.5, -8.5, 31, -8.5, 32, 6.3, 32, 8.3, 30, 10.5, 30, 10.5, 27.6, 7, 17.3, 8.6, 15, 10.5, 15, 10.5, 13, 7.2, -9, 9.5, -20.8)
|
||||||
|
|
||||||
[node name="Draggable2D4" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
[node name="Draggable2D4" parent="All/OpenedBox/Panel" instance=ExtResource("16_h88gi")]
|
||||||
position = Vector2(310, 173)
|
position = Vector2(310, 173)
|
||||||
@ -281,9 +250,9 @@ item_name = "蝉"
|
|||||||
sprite_offset = Vector2(-4, -23)
|
sprite_offset = Vector2(-4, -23)
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/OpenedBox/Panel/Draggable2D4"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/OpenedBox/Panel/Draggable2D4"]
|
||||||
position = Vector2(1, -22)
|
position = Vector2(-4.7032, -24.7816)
|
||||||
shape = SubResource("RectangleShape2D_7s35x")
|
polygon = PackedVector2Array(12, -29.6, -2.9, -33, -5, -33, -5, -31.3, -7, -30.2, -7, -25.3, -1.3, -17.7, -15, -5.9, -15, -3.2, -11.8, 0, -7.3, 0, -3.9, -2.8, -5, 1.8, -5, 6.7, -1, 12, -1, 17.9, -5.7, 21, -8, 21, -8, 29, -4, 32, -4, 33, 10.8, 33, 12.8, 31, 14.6, 31, 16, 25.2, 16, 22.8, 9, 18.8, 9, 15.8, 9.8, 15, 11.8, 15, 12.8, 7, 14.9, 7, 11, -3.5, 11, -8.4, 16, -17.5, 16, -27.3, 15.5, -29, 12, -29)
|
||||||
|
|
||||||
[node name="Marker2D1" type="Marker2D" parent="All/OpenedBox/Panel"]
|
[node name="Marker2D1" type="Marker2D" parent="All/OpenedBox/Panel"]
|
||||||
position = Vector2(198, 178)
|
position = Vector2(198, 178)
|
||||||
@ -298,7 +267,6 @@ position = Vector2(294, 177)
|
|||||||
position = Vector2(340, 178)
|
position = Vector2(340, 178)
|
||||||
|
|
||||||
[node name="BrokenBox" type="Sprite2D" parent="All"]
|
[node name="BrokenBox" type="Sprite2D" parent="All"]
|
||||||
visible = false
|
|
||||||
position = Vector2(-48, 38)
|
position = Vector2(-48, 38)
|
||||||
texture = ExtResource("24_rriyt")
|
texture = ExtResource("24_rriyt")
|
||||||
centered = false
|
centered = false
|
||||||
@ -320,10 +288,9 @@ item_name = "prop_撕下的照片上"
|
|||||||
texture = ExtResource("19_cbhp3")
|
texture = ExtResource("19_cbhp3")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/Draggable照片"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/Draggable照片"]
|
||||||
position = Vector2(7, -2)
|
position = Vector2(6.4373e-06, -9.53674e-07)
|
||||||
rotation = -0.234631
|
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)
|
||||||
shape = SubResource("RectangleShape2D_04cdl")
|
|
||||||
|
|
||||||
[node name="Drawer" type="Node2D" parent="All"]
|
[node name="Drawer" type="Node2D" parent="All"]
|
||||||
position = Vector2(20.5, 0)
|
position = Vector2(20.5, 0)
|
||||||
@ -341,7 +308,7 @@ texture = ExtResource("30_tgpfj")
|
|||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/Drawer/Draggable1"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/Drawer/Draggable1"]
|
||||||
position = Vector2(-1.15028, -1.11837)
|
position = Vector2(1, 7.62939e-06)
|
||||||
shape = SubResource("CircleShape2D_wq2wm")
|
shape = SubResource("CircleShape2D_wq2wm")
|
||||||
|
|
||||||
[node name="Draggable2" parent="All/Drawer" instance=ExtResource("16_h88gi")]
|
[node name="Draggable2" parent="All/Drawer" instance=ExtResource("16_h88gi")]
|
||||||
@ -352,10 +319,9 @@ item_name = "prop_无头小猫玩具"
|
|||||||
texture = ExtResource("31_wq2wm")
|
texture = ExtResource("31_wq2wm")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/Drawer/Draggable2"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/Drawer/Draggable2"]
|
||||||
position = Vector2(-2.01144, 7.74298)
|
position = Vector2(-1.99999, 0.999999)
|
||||||
scale = Vector2(3.06142, 3.16563)
|
polygon = PackedVector2Array(46.8, -40.3, 44, -39.5, 44, -38.3, 42, -37.2, 42, -30, 31.2, -30, 30, -32.5, 30, -34.3, 27.5, -35.4, 26.2, -34, 22.8, -34, 20, -36.8, 20, -38.3, 17.5, -39.4, 15.2, -37, 13.8, -37, 12.7, -35, 15.7, -30, 13.5, -30, 12, -35, 12, -37.3, 9.5, -38.4, 5, -33.8, -4, -31.6, -4, -30, -15.9, -30, -17, -31.7, -17, -33.6, -26.8, -36, -28.8, -36, -33.8, -31, -35.6, -31, -43, 4.8, -43, 10.4, -45.4, 9, -46.9, 9, -50.9, 3, -51, -12.3, -50.3, -12, -46.9, -12, -44.9, -15, -42.7, -15, -44, -25, -44, -28.9, -51, -34.9, -51, -37.2, -62.2, -36, -64.9, -36, -72.9, -27, -74.6, -27, -78.5, -11, -80.1, -11, -79, 14.1, -79, 20.6, -73, 30.5, -73, 33, -63, 40.9, -63, 42.4, -58.3, 44, -42.4, 44, -40, 50.4, -40, 53.1, -35, 56.1, -35, 57.8, -25.1, 59, 12.8, 59, 16, 55.8, 16, 48.4, 23.2, 46, 25.2, 48, 33.8, 48, 38.8, 58, 61, 58, 64, 54, 68, 54, 77, 41.7, 77, 28.4, 73.1, 22, 72, 13, 72, 3.2, 69, 0.199997, 69, -20.7, 56, -36.9, 56, -38.5, 53.1, -39.3, 50.4, -35)
|
||||||
shape = SubResource("RectangleShape2D_sg8mt")
|
|
||||||
|
|
||||||
[node name="Draggable3" parent="All/Drawer" instance=ExtResource("16_h88gi")]
|
[node name="Draggable3" parent="All/Drawer" instance=ExtResource("16_h88gi")]
|
||||||
position = Vector2(368.5, 175)
|
position = Vector2(368.5, 175)
|
||||||
@ -365,10 +331,9 @@ item_name = "prop_木头人偶"
|
|||||||
texture = ExtResource("32_sg8mt")
|
texture = ExtResource("32_sg8mt")
|
||||||
limit_rect = Rect2(150, 150, 220, 70)
|
limit_rect = Rect2(150, 150, 220, 70)
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="All/Drawer/Draggable3"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="All/Drawer/Draggable3"]
|
||||||
position = Vector2(-0.621627, 1.27025)
|
position = Vector2(-1.99999, 0.999999)
|
||||||
scale = Vector2(1.22064, 1.29461)
|
polygon = PackedVector2Array(-11, -44.2, -11, -42.1, -14, -40.1, -14, -34.4, -9, -26.4, -9, -23.8, -5.6, -22.1, -12, -14.8, -12, -14.2, -27.6, -4, -29.2, -4, -30.3, -1.9, -27.1, 3, -20.5, 3, -8.7, -3.4, -11, 6.8, -11, 11.7, -5, 18.8, -5, 29, -12.7, 35, -15, 35, -15, 43.8, -11, 47.8, -11, 49.3, -2.4, 53, 6.8, 53, 15.7, 45, 18, 45, 18, 36, 13, 32, 13, 30, 8, 30, 8, 25.6, 10, 23, 11.7, 23, 13.7, 12, 15.6, 12, 11.5, -3, 12, -9.9, 12, -15.4, 19, -25, 21, -25, 21, -34.8, 16.8, -39, 13.8, -39, 12, -35.7, 12, -41.8)
|
||||||
shape = SubResource("RectangleShape2D_0kog4")
|
|
||||||
|
|
||||||
[node name="BoxAnimation" type="AnimatedSprite2D" parent="All"]
|
[node name="BoxAnimation" type="AnimatedSprite2D" parent="All"]
|
||||||
visible = false
|
visible = false
|
||||||
|
Loading…
Reference in New Issue
Block a user