2025-02-07 01:56:12 +00:00
|
|
|
|
@tool
|
|
|
|
|
extends Sprite2D
|
|
|
|
|
|
2025-02-09 11:43:35 +00:00
|
|
|
|
signal finished
|
|
|
|
|
|
2025-03-17 14:12:53 +00:00
|
|
|
|
@export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps
|
2025-02-07 01:56:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func play() -> void:
|
|
|
|
|
visible = true
|
|
|
|
|
var tween = create_tween()
|
2025-03-20 10:00:53 +00:00
|
|
|
|
tween.tween_interval(2.0)
|
2025-03-17 14:12:53 +00:00
|
|
|
|
# var final_modulate = Color.PALE_VIOLET_RED
|
2025-02-07 12:52:15 +00:00
|
|
|
|
tween.tween_property(self, "self_modulate:a", 0.0, 4.0)
|
2025-03-17 14:12:53 +00:00
|
|
|
|
# tween.parallel().tween_property(get_parent(), "modulate", final_modulate, 12.0)
|
2025-02-07 01:56:12 +00:00
|
|
|
|
tween = create_tween()
|
2025-03-20 10:00:53 +00:00
|
|
|
|
# 在小蝶名字消失的末尾(还没完全消失),开始盖章
|
|
|
|
|
tween.tween_interval(4.5)
|
2025-02-07 12:52:15 +00:00
|
|
|
|
# 小蝶名字消失后再显示其他名字
|
2025-03-20 10:00:53 +00:00
|
|
|
|
var interval = 1.0
|
2025-03-18 15:14:57 +00:00
|
|
|
|
# var interval = 0.1 # 很快,测试用
|
2025-03-18 14:19:39 +00:00
|
|
|
|
var children = $seals.get_children()
|
|
|
|
|
# 前四个按顺序,后面的乱序
|
|
|
|
|
var part1 = children.slice(0, 4)
|
|
|
|
|
var part2 = children.slice(4, children.size())
|
|
|
|
|
part2.shuffle()
|
|
|
|
|
for c in part1:
|
2025-02-07 01:56:12 +00:00
|
|
|
|
c.visible = false
|
2025-02-07 12:52:15 +00:00
|
|
|
|
tween.tween_interval(interval)
|
2025-02-09 11:43:35 +00:00
|
|
|
|
tween.tween_callback(_stamp_seal.bind(c))
|
2025-03-18 14:19:39 +00:00
|
|
|
|
for c in part2:
|
|
|
|
|
c.visible = false
|
|
|
|
|
tween.tween_interval(interval)
|
|
|
|
|
tween.tween_callback(_stamp_seal.bind(c))
|
2025-03-20 10:00:53 +00:00
|
|
|
|
interval = lerpf(interval, 0.15, 0.35)
|
2025-02-09 11:43:35 +00:00
|
|
|
|
# 最后一个印章消失后,稍加等待,发射完成信号
|
2025-03-17 14:12:53 +00:00
|
|
|
|
tween.tween_callback(_final_effect)
|
2025-03-18 14:19:39 +00:00
|
|
|
|
tween.tween_interval(4.5)
|
2025-03-17 14:12:53 +00:00
|
|
|
|
tween.tween_callback(_jump_scare)
|
2025-03-20 10:00:53 +00:00
|
|
|
|
tween.tween_interval(1.0)
|
2025-02-09 11:43:35 +00:00
|
|
|
|
tween.tween_callback(finished.emit)
|
2025-02-07 01:56:12 +00:00
|
|
|
|
|
2025-03-17 14:12:53 +00:00
|
|
|
|
# 共 6 画 28 个印章,+前 4 个独立布置,共至少 32 seals
|
|
|
|
|
var points_per_stroke = [5, 3, 6, 4, 7, 3]
|
|
|
|
|
|
|
|
|
|
func _debug_reset_stamps():
|
|
|
|
|
print("Reset Stamps")
|
|
|
|
|
var paths_root = $PathRoot
|
|
|
|
|
var stroke_id = 0
|
|
|
|
|
var stamp_id = 5 # 从 5 开始,1-4 手动布置
|
|
|
|
|
for p in paths_root.get_children():
|
|
|
|
|
if p is Path2D:
|
|
|
|
|
var p_follow = p.get_node("PathFollow2D") as PathFollow2D
|
|
|
|
|
var stroke_points = points_per_stroke[stroke_id]
|
|
|
|
|
for i in range(stroke_points):
|
|
|
|
|
var stamp = get_node("seals/seal%d" % stamp_id) as Sprite2D
|
|
|
|
|
stamp_id += 1
|
|
|
|
|
p_follow.progress_ratio = float(i) / float(stroke_points)
|
|
|
|
|
stamp.global_position = p_follow.global_position
|
|
|
|
|
stamp.rotation = p_follow.rotation + PI / 2.0
|
|
|
|
|
stroke_id += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _final_effect():
|
|
|
|
|
# TODO 渐进的铃铛声
|
|
|
|
|
SceneManager.pop_debug_dialog_info("音效", "渐进的铃铛声")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _jump_scare():
|
2025-03-18 15:14:57 +00:00
|
|
|
|
# 毛玻璃模糊 / 熔蜡扭曲
|
|
|
|
|
# var e_materaial = $"../effect".material
|
|
|
|
|
# tween.tween_property(e_materaial, "shader_parameter/intensity", 0.05, 1.0)
|
|
|
|
|
# tween.tween_property(e_materaial, "shader_parameter/tint_amount", 0.4, 1.0)
|
|
|
|
|
|
|
|
|
|
# # 屏幕四周闪红,jump scare屏幕抖动效果
|
|
|
|
|
# var shading_layer = SceneManager.get_shading_layer()
|
|
|
|
|
# shading_layer.flash_palette()
|
|
|
|
|
# shading_layer.flash_glitch()
|
|
|
|
|
|
2025-03-20 10:00:53 +00:00
|
|
|
|
# 闪烁
|
|
|
|
|
$AnimationPlayer.play("flash")
|
2025-03-18 15:14:57 +00:00
|
|
|
|
|
2025-03-17 14:12:53 +00:00
|
|
|
|
# TODO 哈气
|
|
|
|
|
SceneManager.pop_debug_dialog_info("音效", "突然哈气")
|
2025-03-18 14:19:39 +00:00
|
|
|
|
$"SfxScare".play()
|
2025-03-17 14:12:53 +00:00
|
|
|
|
|
2025-02-07 01:56:12 +00:00
|
|
|
|
|
|
|
|
|
func _stamp_seal(seal: Sprite2D) -> void:
|
|
|
|
|
# rand self_modulate
|
|
|
|
|
seal.self_modulate = Color(randf_range(.8, 1.), randf_range(.8, 1.), randf_range(.8, 1.), 1.)
|
2025-03-17 14:12:53 +00:00
|
|
|
|
# # rand rotation
|
|
|
|
|
# seal.rotation = randf_range(-1., 1.)
|
|
|
|
|
# # rand position within area
|
|
|
|
|
# seal.position = Vector2(
|
|
|
|
|
# randf_range(-area_size.x * 0.5, area_size.x * 0.5),
|
|
|
|
|
# randf_range(-area_size.y * 0.5, area_size.y * 0.5)
|
|
|
|
|
# )
|
2025-02-07 01:56:12 +00:00
|
|
|
|
# stamp
|
2025-02-09 11:43:35 +00:00
|
|
|
|
$"SfxStamp".play()
|
2025-02-07 01:56:12 +00:00
|
|
|
|
# show
|
|
|
|
|
seal.visible = true
|
|
|
|
|
var origin_scale = seal.scale
|
|
|
|
|
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.05, 1.05), .1)
|
2025-02-07 12:52:15 +00:00
|
|
|
|
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.0, 1.), .1)
|