音频ogg适配性完整检查;编译器@warning_ignore处理;弹珠游戏独立 dialog balloon;二楼追猫猪头怪allow_restart_game潜在bug修复;

This commit is contained in:
cakipaul 2025-07-13 17:01:36 +08:00
parent d6e4f01b25
commit b0e3b1ad4d
38 changed files with 204 additions and 181 deletions

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://w6tooix5scis"
path="res://.godot/imported/摇啊摇诡异pipa.WAV-c8e618d96347eea3669bc9c4eab37cf3.sample"
[deps]
source_file="res://asset/audio/BGM/摇啊摇诡异pipa.WAV"
dest_files=["res://.godot/imported/摇啊摇诡异pipa.WAV-c8e618d96347eea3669bc9c4eab37cf3.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=0

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://csgc3241h5vin"
path="res://.godot/imported/鬼差追击.MP3-499cf5622e51384ac240c25cf08d7314.mp3str"
[deps]
source_file="res://asset/audio/sfx/bgm/序章/鬼差追击.MP3"
dest_files=["res://.godot/imported/鬼差追击.MP3-499cf5622e51384ac240c25cf08d7314.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

View File

@ -1,19 +0,0 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://cm80s51o5xt0r"
path="res://.godot/imported/打开铁门后不循环背景音.MP3-4616ac2763069f54bec960c43f9c2510.mp3str"
[deps]
source_file="res://asset/audio/sfx/bgm/第一章/打开铁门后不循环背景音.MP3"
dest_files=["res://.godot/imported/打开铁门后不循环背景音.MP3-4616ac2763069f54bec960c43f9c2510.mp3str"]
[params]
loop=false
loop_offset=0
bpm=0
beat_count=0
bar_beats=4

View File

@ -120,7 +120,7 @@ custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="./xiandie.dmg"
export_path="../xiandie.dmg"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""

View File

@ -1,13 +1,23 @@
[gd_resource type="Resource" script_class="VibeGroupCollection" load_steps=13 format=3 uid="uid://bfhwn1v0c2io7"]
[gd_resource type="Resource" script_class="VibeGroupCollection" load_steps=22 format=3 uid="uid://bfhwn1v0c2io7"]
[ext_resource type="Script" uid="uid://cy1ngx5no67v" path="res://manager/audio_manager/vibe_group.gd" id="1_0bbao"]
[ext_resource type="Script" uid="uid://bo8gxwe8hfs01" path="res://manager/audio_manager/vibe_group_collection.gd" id="2_h4hph"]
[ext_resource type="AudioStream" uid="uid://c2xr0rfmo60gn" path="res://asset/audio/sfx/环境音/白噪音/白噪声书店外.ogg" id="2_wktgr"]
[ext_resource type="Script" uid="uid://eydkufjbf7n6" path="res://manager/audio_manager/embellishment.gd" id="3_scrw7"]
[ext_resource type="AudioStream" uid="uid://b2mudqvq1dmng" path="res://asset/audio/sfx/环境音/白噪音/白噪声房间里1.ogg" id="4_is4rg"]
[ext_resource type="AudioStream" uid="uid://o57tyriodr0c" path="res://asset/audio/sfx/环境音/白噪音/白噪声房间里2.ogg" id="5_ldvt0"]
[ext_resource type="AudioStream" uid="uid://dvc2emnfcmabx" path="res://asset/audio/sfx/环境音/白噪音/白噪声楼道1.ogg" id="6_vm1rc"]
[ext_resource type="AudioStream" uid="uid://6oc0cgc3mbqb" path="res://asset/audio/sfx/环境音/白噪音/白噪声楼道2.ogg" id="7_lca37"]
[ext_resource type="AudioStream" uid="uid://c6ehv3lgway26" path="res://asset/audio/sfx/环境音/白噪音/白噪声诡异室外.ogg" id="8_646q0"]
[ext_resource type="AudioStream" uid="uid://s7uigovfp5g3" path="res://asset/audio/sfx/环境音/第一章/火灾演出.ogg" id="9_wuwx1"]
[ext_resource type="AudioStream" uid="uid://d0ef0felylt8d" path="res://asset/audio/sfx/环境音/第一章/氛围不受欢迎的存在.ogg" id="10_uwtc1"]
[ext_resource type="AudioStream" uid="uid://bal423qlb3jp2" path="res://asset/audio/sfx/环境音/点缀音/sfx_夜晚虫鸣.ogg" id="11_scrw7"]
[sub_resource type="Resource" id="Resource_bjndi"]
script = ExtResource("1_0bbao")
group_name = &"c01_书店外"
group_db = -5.0
base_sound = ExtResource("2_wktgr")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -16,6 +26,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_房间里1"
group_db = -5.0
base_sound = ExtResource("4_is4rg")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -24,6 +35,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_房间里2"
group_db = -5.0
base_sound = ExtResource("5_ldvt0")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -32,6 +44,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_楼道1"
group_db = -5.0
base_sound = ExtResource("6_vm1rc")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -40,6 +53,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_楼道2"
group_db = -5.0
base_sound = ExtResource("7_lca37")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -48,6 +62,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_诡异室外"
group_db = -5.0
base_sound = ExtResource("8_646q0")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -56,6 +71,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"c02_火灾"
group_db = 0.0
base_sound = ExtResource("9_wuwx1")
base_sound_db = 0.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -64,6 +80,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"氛围_不受欢迎的存在"
group_db = 0.0
base_sound = ExtResource("10_uwtc1")
base_sound_db = -12.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"
@ -72,6 +89,7 @@ metadata/_custom_type_script = "uid://cy1ngx5no67v"
script = ExtResource("1_0bbao")
group_name = &"夜晚虫鸣"
group_db = 0.0
base_sound = ExtResource("11_scrw7")
base_sound_db = -10.0
embellishments = Array[ExtResource("3_scrw7")]([])
metadata/_custom_type_script = "uid://cy1ngx5no67v"

View File

@ -14,6 +14,9 @@ var _base_db := 0.0:
func _init(group: VibeGroup):
if not group or not group.base_sound:
printerr("VibeGroupPlayer: vibe_group or base sound is null, cannot initialize.")
return
vibe_group = group
# 初始化基础播放器
_base_player = AudioStreamPlayer.new()
@ -80,6 +83,9 @@ func set_volume_linear(volume: float):
func play():
if not vibe_group or not vibe_group.base_sound:
printerr("VibeGroupPlayer: vibe_group or base sound is null, cannot play.")
return
_base_player.play()
# 设置并启动所有点缀音的计时器
for i in range(vibe_group.embellishments.size()):

View File

@ -2,7 +2,9 @@
class_name VibeSfx
extends Node
@warning_ignore("unused_private_class_variable")
@export_tool_button("播放") var _play = _debug_play.bind(true)
@warning_ignore("unused_private_class_variable")
@export_tool_button("停止") var _stop = _debug_play.bind(false)
## VibeSfx.gd

View File

@ -77,20 +77,25 @@ func _on_timer_timeout():
if _on_timer_timeout_counter % 6 == 0:
print_global_info()
# @warning_ignore("intege")
func print_global_info():
var archive := ArchiveManager.archive
if not archive or not config:
return
@warning_ignore("integer_division")
var hour := archive.game_seconds / 3600
@warning_ignore("integer_division")
var minute := (archive.game_seconds % 3600) / 60
var second := archive.game_seconds % 60
var round_info = "r" + str(config.game_rounds) + "_c" + str(archive.current_chapter)
var game_time_info = "game:" + str(hour) + ":" + str(minute) + ":" + str(second)
# get ticks since game app run
var ticks = Time.get_ticks_msec()
@warning_ignore("integer_division")
hour = ticks / 3600000
@warning_ignore("integer_division")
minute = (ticks % 3600000) / 60000
@warning_ignore("integer_division")
second = (ticks % 60000) / 1000
var msec = ticks % 1000
var tick_time_info = (

View File

@ -70,7 +70,7 @@ func _on_global_stage_updated(e: StringName, s: int):
_on_stage_updated()
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
pass

View File

@ -8,8 +8,11 @@ enum VIBE {
}
# 从 ground loader 控制该信号
@warning_ignore("unused_signal")
signal ground_ready(ground: Ground2D)
@warning_ignore("unused_signal")
signal ground_start
@warning_ignore("unused_signal")
signal ground_transition_pre_paused

View File

@ -273,9 +273,7 @@ func _on_balloon_gui_input(event: InputEvent) -> void:
# 根据全局配置,是否允许忽略输入
# ignore 的情况下不需要 block input
if temporary_game_states.has(GlobalConfig.DIALOG_IGNORE_INPUT):
if not GlobalConfig.DEBUG:
return
SceneManager.pop_debug_dialog_info("程序", "调试模式 DIALOG_IGNORE_INPUT 不生效")
return
if current_line_ban_skip:
# debug 模式下不禁用

View File

@ -163,7 +163,6 @@ func _area_entered(_area = null):
func _do_trigger():
var time = Time.get_ticks_msec()
var has_triggered = false
# 确保只有一个线程进入该逻辑,因为有时 player 碰撞和首次进入 tree 都会触发该方法
if not trigger_mutex.try_lock():
print("Ambush trigger mutex lock fail, name=", name)

View File

@ -1,6 +1,7 @@
extends Control
class_name ContentInspector
@warning_ignore("unused_signal")
signal exit
@onready var label = $TipContainer/Label as Label

View File

@ -121,7 +121,7 @@ func transition_to_scene(scene_name: String, portal: String, wait_time := 1.4) -
print("GroundLoader transition_to_scene: pause prev ground.")
# 先发送,再暂停,允许 sfx 等节点执行 ease out
SceneManager.ground_transition_pre_paused.emit()
ground.process_mode = Node.PROCESS_MODE_DISABLED
ground.set_deferred("process_mode", Node.PROCESS_MODE_DISABLED)
# print reenter lock status
print("GroundLoader transition_to_scene: reenter lock status: ", ground.reenter_lock)
var scene_path = GROUND_SCENE_PATH_DICT.get(scene_name)
@ -159,10 +159,6 @@ var _allow_ground_start := false:
"GroundLoader _allow_ground_start: unfrozen. frozen duration(ms):",
Time.get_ticks_msec() - _frozen_start_time_ms
)
# else:
# print("GroundLoader _allow_ground_start: frozen")
# ground.process_mode = Node.PROCESS_MODE_DISABLED
# _frozen_start_time_ms = Time.get_ticks_msec()
func _update_archive():
@ -183,7 +179,7 @@ func _do_transition(scene_name: String) -> void:
# 其中间接用到了 GroundLoader 的 ground
ground = _load_ground_node(scene_name)
if not _allow_ground_start:
ground.process_mode = Node.PROCESS_MODE_DISABLED
ground.set_deferred("process_mode", Node.PROCESS_MODE_DISABLED)
print("GroundLoader not _allow_ground_start: frozen (delayed)")
_frozen_start_time_ms = Time.get_ticks_msec()
_add_ground()

View File

@ -6,7 +6,7 @@
[ext_resource type="AudioStream" uid="uid://cbciw1yg7uc8t" path="res://asset/audio/sfx/环境音/序章/01_院长房间_屋外钟声.ogg" id="3_6ir3d"]
[ext_resource type="Texture2D" uid="uid://ds8xteyjjrqoy" path="res://asset/art/scene/c01/s05_院长房间/全局参考.png" id="3_7u4bh"]
[ext_resource type="AudioStream" uid="uid://c45hu50ivpd42" path="res://asset/audio/sfx/交互/序章/01_院长房间_扶正相框.ogg" id="3_jk3np"]
[ext_resource type="AudioStream" uid="uid://b5iv527ujwp0i" path="res://asset/audio/peiyin/c01/c01_1小小蝶_开头阅读1.ogg" id="3_sluu3"]
[ext_resource type="AudioStream" uid="uid://bnqapiuht2hqc" path="res://asset/audio/peiyin/c01/c01_1小小蝶_开头阅读1.ogg" id="3_sluu3"]
[ext_resource type="Texture2D" uid="uid://blv2ftjrmvlmh" path="res://asset/art/scene/c01/s05_院长房间/fg_前景.png" id="3_vmr0f"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_1jor4"]
[ext_resource type="Texture2D" uid="uid://bh7l6ykoayvve" path="res://asset/art/scene/c01/s05_院长房间/e_门.png" id="4_gdhoy"]

View File

@ -2,7 +2,7 @@
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_b3cca"]
[ext_resource type="Script" uid="uid://6q2pfbqsw10t" path="res://scene/ground/scene/c01/s08_书店.gd" id="2_0lque"]
[ext_resource type="AudioStream" uid="uid://d31pxjnnvqdpn" path="res://asset/audio/sfx/环境音/序章/04_书店内.ogg" id="3_0x288"]
[ext_resource type="AudioStream" uid="uid://nklo52h3ox02" path="res://asset/audio/sfx/环境音/序章/04_书店内.ogg" id="3_0x288"]
[ext_resource type="Texture2D" uid="uid://coo8sw8yigii6" path="res://asset/art/scene/c01/s08_书店/bg_书店.png" id="3_322m4"]
[ext_resource type="AudioStream" uid="uid://vygcjwgo1j4a" path="res://asset/audio/sfx/环境音/序章/04_书店内_奶奶写字.ogg" id="4_5j1ov"]
[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="4_c4lg5"]

View File

@ -86,7 +86,7 @@ func intro() -> void:
func _intro_dialog() -> void:
DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s12_诡异的书店外发钱")
DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s12_诡异的书店外发钱", [GlobalConfig.DIALOG_IGNORE_INPUT])
func ambush_begger_interacted():

View File

@ -16,7 +16,7 @@
[ext_resource type="PackedScene" uid="uid://ci34db7xool2n" path="res://scene/ground/script/c01/s01_书店外_自动枯萎的花朵.tscn" id="7_aq8vg"]
[ext_resource type="AudioStream" uid="uid://c5rgfl6ub4chw" path="res://asset/audio/sfx/交互/序章/sfx_鬼差擦肩而过.ogg" id="7_denrd"]
[ext_resource type="PackedScene" uid="uid://h0s5ms7r7d8g" path="res://scene/effect/ghost.tscn" id="8_gk0gq"]
[ext_resource type="AudioStream" uid="uid://csgc3241h5vin" path="res://asset/audio/sfx/bgm/序章/鬼差追击.ogg" id="9_denrd"]
[ext_resource type="AudioStream" uid="uid://cj167fmakl7vr" path="res://asset/audio/sfx/bgm/序章/鬼差追击.ogg" id="9_denrd"]
[ext_resource type="PackedScene" uid="uid://bnf3lkcbpx1ar" path="res://scene/entity/ambush.tscn" id="9_nqlku"]
[ext_resource type="Script" uid="uid://dxq5c05ab7uyu" path="res://scene/ground/script/c01/s00_ghost_footstep.gd" id="10_1tspp"]
[ext_resource type="PackedScene" uid="uid://cn1ypquvs07wx" path="res://scene/ground/script/c01/s12_飘动的寻人启事.tscn" id="11_pwu7i"]

View File

@ -6,7 +6,7 @@
[ext_resource type="SpriteFrames" uid="uid://3nas025c2c5u" path="res://asset/art/gif/c02_杂项/c02_杂项_frames.tres" id="4_gd6xp"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_ygnci"]
[ext_resource type="PackedScene" uid="uid://61pis75a8fdq" path="res://scene/entity/portal.tscn" id="5_00b7a"]
[ext_resource type="AudioStream" uid="uid://cm80s51o5xt0r" path="res://asset/audio/sfx/bgm/第一章/打开铁门后不循环背景音.ogg" id="5_qt2qg"]
[ext_resource type="AudioStream" uid="uid://bk5cdc06s8x10" path="res://asset/audio/sfx/bgm/第一章/打开铁门后不循环背景音.ogg" id="5_qt2qg"]
[ext_resource type="Texture2D" uid="uid://f8yjp5ggr8qw" path="res://asset/art/scene/c02/s03_公寓一楼院子/算卦布.png" id="6_1tart"]
[ext_resource type="Texture2D" uid="uid://0uh6qaalhqju" path="res://asset/art/scene/c02/s11_一楼火灾/总背景/bg_院子1楼火灾.png" id="6_d7h4s"]
[ext_resource type="AudioStream" uid="uid://bhaws2ungqaf5" path="res://asset/audio/sfx/交互/角色/sfx_哼歌.ogg" id="6_jhod7"]
@ -55,7 +55,7 @@
[ext_resource type="PackedScene" uid="uid://0sofmhrl358m" path="res://scene/entity/npc.tscn" id="35_plfv5"]
[ext_resource type="Texture2D" uid="uid://uh2ruegr3d7v" path="res://asset/art/gif/c02_一楼火灾/7-最左木箱 烧痕.png" id="36_rnk1v"]
[ext_resource type="SpriteFrames" uid="uid://b0icyhxpj16tv" path="res://asset/art/gif/c02_谢幕演出/c02_谢幕演出_frames.tres" id="39_rnk1v"]
[ext_resource type="AudioStream" uid="uid://dxoj6vg0wrj0j" path="res://asset/audio/peiyin/c02/c02_8小男孩童谣.ogg" id="46_qqdxs"]
[ext_resource type="AudioStream" uid="uid://broetvd8vuc05" path="res://asset/audio/peiyin/c02/c02_8小男孩童谣.ogg" id="46_qqdxs"]
[ext_resource type="Script" uid="uid://cnt01hiw52bmn" path="res://scene/entity/ux/sign_snapper.gd" id="51_vddfx"]
[ext_resource type="AudioStream" uid="uid://bxp3f263aaqkp" path="res://asset/audio/sfx/脚步/02_室外_1.ogg" id="52_qqdxs"]
[ext_resource type="AudioStream" uid="uid://dwa7xdvg5o0i" path="res://asset/audio/sfx/脚步/02_室外_3.ogg" id="53_jhod7"]

View File

@ -6,7 +6,7 @@ extends AnimationRoot
func _default_data() -> Dictionary:
return {
"hole_interacted_times": 0,
"first_entered": true
"has_entered": false
}
@ -63,8 +63,12 @@ func _on_ground_ready() -> void:
boxcat_portal.get_node("Sprite2D").texture = preload("uid://b8sv81cw7mcn4") # e_墙上纸张_blood
$"../DeployLayer/Closeup讨厌他们".enabled = true
if data["first_entered"]:
set_data("first_entered", false)
if not data["has_entered"]:
var player = SceneManager.get_player()
player.set_facing_direction(Vector2.LEFT)
player.global_position.x = 670
set_data("has_entered", true)
await Util.wait(1.0)
SceneManager.pop_os_with_str("c02_离开红色演出")

View File

@ -16,19 +16,32 @@ func _ready() -> void:
func _on_ground_ready() -> void:
pass
# ambush
func knock_light_door():
var layer = $"../盒子猫CanvasLayer"
layer.disable_crawl = true
$"../DeployLayer/Ambush终点光芒互动".enabled = false
# 禁止猪头怪动画播放结束后重开游戏
var boss = get_node_or_null("../DeployLayer/追猫猪头怪_左侧")
if boss:
boss.allow_restart_game = false
boss = get_node_or_null("../DeployLayer/追猫猪头怪_右侧")
if boss:
boss.allow_restart_game = false
boss = get_node_or_null("追猫猪头怪_传送")
if boss:
boss.allow_restart_game = false
do_knock_light_door.call_deferred()
func do_knock_light_door():
var knock_stream = preload("uid://6q5qi1qon35r")
var player = SceneManager.get_player()
# 禁止猪头怪动画播放结束后重开游戏
$"../DeployLayer/追猫猪头怪_传送".allow_restart_game = false
SceneManager.lock_player()
# 一直循环下去
for _i in range(100):
AudioManager.play_sfx(knock_stream)
SceneManager.lock_player(0, 6)
SceneManager.player_action(6)
await Util.wait(0.5)
# 被抓时打断
if not player.visible or player.hide_sprite:
@ -50,4 +63,5 @@ func _outtro_show():
await Util.wait(10.0)
# 盒子猫逃脱成功/被抓走,游戏结束,解锁瞎子卧室门
ArchiveManager.set_global_entry(&"c02_the_blind_room_unlocked", true)
SceneManager.unlock_player()
SceneManager.get_ground_loader().transition_to_scene("c02_s08", "1")

View File

@ -14,7 +14,7 @@ func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
_on_stage_updated()

View File

@ -14,7 +14,7 @@ func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
_on_stage_updated()
func _on_pre_stage_updated():

View File

@ -15,7 +15,7 @@ func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
if $"Inspectable小猫纸条".icount > 0:
EventManager.set_stage_if_greater(pre_event_name, 4)
# else:

View File

@ -1,3 +1,4 @@
@tool
extends Event2D
# var prev_stage := 0
@ -12,7 +13,7 @@ func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
_on_stage_updated()

View File

@ -0,0 +1,5 @@
extends CanvasLayer
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME

View File

@ -0,0 +1 @@
uid://befm61kt22miu

View File

@ -1,13 +1,13 @@
[gd_scene load_steps=6 format=3 uid="uid://dd8dfoik0ig3y"]
[ext_resource type="Script" uid="uid://dnrql1t0j6v8i" path="res://scene/entity/closeup_template.gd" id="1_jgyts"]
[ext_resource type="Script" uid="uid://befm61kt22miu" path="res://scene/ground/script/c02/s08_画特写.gd" id="1_4p6cc"]
[ext_resource type="Texture2D" uid="uid://d1seskftkw08q" path="res://asset/art/scene/c02/s08_瞎子卧室/ux_盒子猫初次特写.png" id="2_jo6o1"]
[ext_resource type="Texture2D" uid="uid://cbql1i4hblmt1" path="res://asset/art/ui/遮罩/inspect特写通用遮罩.png" id="3_myoho"]
[ext_resource type="PackedScene" uid="uid://dmysq4sxx8iqh" path="res://scene/entity/ux/content_inspector.tscn" id="4_4p6cc"]
[ext_resource type="Texture2D" uid="uid://f186lvt5y2ql" path="res://asset/art/ui/遮罩/inspect背景遮罩.png" id="5_i34yq"]
[node name="s08_画特写" type="CanvasLayer"]
script = ExtResource("1_jgyts")
script = ExtResource("1_4p6cc")
[node name="TextureRect" type="TextureRect" parent="."]
offset_right = 40.0

View File

@ -1,6 +1,6 @@
[gd_scene load_steps=8 format=3 uid="uid://cxv7vdgwb8lqb"]
[ext_resource type="Script" uid="uid://dnrql1t0j6v8i" path="res://scene/entity/closeup_template.gd" id="1_2sinf"]
[ext_resource type="Script" uid="uid://befm61kt22miu" path="res://scene/ground/script/c02/s08_画特写.gd" id="1_tja8r"]
[ext_resource type="Texture2D" uid="uid://k6164drvkbg8" path="res://asset/art/scene/c02/s08_瞎子卧室/ux_盒子猫结束特写.png" id="2_qrck0"]
[ext_resource type="Texture2D" uid="uid://cbql1i4hblmt1" path="res://asset/art/ui/遮罩/inspect特写通用遮罩.png" id="3_7dv3t"]
[ext_resource type="Texture2D" uid="uid://tcjm158n8hnw" path="res://asset/art/scene/c02/s12_to_s17_盒子猫/小脚脚印.png" id="4_tja8r"]
@ -9,7 +9,7 @@
[ext_resource type="Texture2D" uid="uid://f186lvt5y2ql" path="res://asset/art/ui/遮罩/inspect背景遮罩.png" id="7_tja8r"]
[node name="s08_盒子猫初次特写" type="CanvasLayer"]
script = ExtResource("1_2sinf")
script = ExtResource("1_tja8r")
[node name="TextureRect" type="TextureRect" parent="."]
offset_right = 40.0

View File

@ -162,7 +162,6 @@ func _toggle_flip_h():
# 抓小猫
func do_catch(front: bool):
move_and_detect = false
SceneManager.freeze_player(0)
# 抓小猫时 lock palyer
SceneManager.lock_player()
# 呼吸一帧,然后抓取
@ -181,6 +180,7 @@ func do_catch(front: bool):
$"Sfx喘气".easing_kill()
SceneManager.pop_debug_dialog_info("音效", "抓取过程。 从捡小猫开始=" + str(front))
await sprite2d.animation_finished
SceneManager.unlock_player()
# 等待动画播放后秒,再检查是否允许重开游戏
if allow_restart_game:
SceneManager.get_ground_loader().transition_to_scene("c02_s12", "left")

View File

@ -0,0 +1,39 @@
extends CanvasLayer
signal ball_dialogue_ended
@onready var label = %RichTextLabel as RichTextLabel
## The current line
var dialogue_line: DialogueLine:
set(value):
if value:
dialogue_line = value
apply_dialogue_line()
get:
return dialogue_line
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_DIALOG
func start(
dialogue_resource: DialogueResource, title: String, extra_game_states: Array = []
) -> void:
var temporary_game_states = [self] + extra_game_states
self.dialogue_line = await dialogue_resource.get_next_dialogue_line(
title, temporary_game_states
)
## Apply any changes to the balloon given a new [DialogueLine].
func apply_dialogue_line() -> void:
var translation_key = dialogue_line.translation_key
label.text = ("[wave amp=10.0 freq=5.0][shake rate=4.0 level=3]" + tr(translation_key).strip_edges())
var tween = create_tween()
tween.tween_property(label, "modulate:a", 1.0, 0.5)
tween.tween_interval(2.0)
tween.tween_property(label, "modulate:a", 0.0, 0.5)
tween.tween_callback(ball_dialogue_ended.emit)
tween.tween_callback(queue_free)

View File

@ -0,0 +1 @@
uid://c1oruu8vpy4pk

View File

@ -0,0 +1,48 @@
[gd_scene load_steps=3 format=3 uid="uid://d03hwa7axelmb"]
[ext_resource type="FontFile" uid="uid://bnxdsxp7dst7f" path="res://asset/font/锐字太空混元像素简繁-闪 超黑_mianfeiziti.com.ttf" id="1_5lxgi"]
[ext_resource type="Script" uid="uid://c1oruu8vpy4pk" path="res://scene/little_game/弹珠游戏/dialogue_balloon.gd" id="1_7ag4e"]
[node name="DialogueBalloon" type="CanvasLayer"]
script = ExtResource("1_7ag4e")
[node name="Control" type="Control" parent="."]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="Container" type="MarginContainer" parent="Control"]
z_index = 10
layout_mode = 1
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -150.0
offset_right = 150.0
offset_bottom = 182.0
grow_horizontal = 2
size_flags_vertical = 0
mouse_filter = 2
theme_override_constants/margin_top = 100
[node name="RichTextLabel" type="RichTextLabel" parent="Control/Container"]
unique_name_in_owner = true
custom_minimum_size = Vector2(300, 0)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 2
theme_override_colors/default_color = Color(0.686241, 0.191934, 0.178785, 1)
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_fonts/normal_font = ExtResource("1_5lxgi")
theme_override_font_sizes/normal_font_size = 40
bbcode_enabled = true
text = "[wave amp=10.0 freq=5.0][shake rate=4.0 level=3] 先碰到边界你就输了"
fit_content = true
autowrap_mode = 1
horizontal_alignment = 1
vertical_alignment = 1

View File

@ -5,13 +5,14 @@ signal exit(success)
@onready var animation_player = $AnimationPlayer as AnimationPlayer
@onready var pivot = $Pivot as Node2D
@onready var hand_pivot = $Pivot/HandPivot as Node2D
@onready var label = %RichTextLabel as RichTextLabel
# ogg文件丢球drop 地面明显碰撞声)+球碰球hit 响亮)+细碎滚动声loop三个部分
@onready var sfx_hit = $SfxHit as Sfx
@onready var sfx_shoot = $SfxShoot as Sfx
@onready var sfx_dispatch = $SfxDispatch as Sfx
var dialog_balloon_scene = preload("uid://d03hwa7axelmb")
var dialogue_c02 = preload("res://asset/dialogue/c02.dialogue")
var balls_scene_dict = {
@ -26,7 +27,6 @@ var debug_directly_win = false
func _ready() -> void:
layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME
hand_pivot.modulate.a = 0
label.modulate.a = 0
if GlobalConfig.DEBUG and debug_directly_win:
game_win()
else:
@ -46,8 +46,8 @@ func intro():
get_node(balls_name).visible = false
get_tree().call_group(balls_name, "hide_away")
pivot.get_child(0).modulate.a = 0
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏0")
await ball_dialogue_ended
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏0")
await scene.ball_dialogue_ended
func intro_finished():
@ -207,12 +207,10 @@ func _on_hit_ball_finished(count: int):
if round_id == 0:
round_ready = false
_success_dialogue()
await ball_dialogue_ended
checkout_round(1)
elif round_id == 1 and hit_count >= 3:
round_ready = false
_success_dialogue()
await ball_dialogue_ended
checkout_round(2)
elif round_id == 2 and hit_count >= 5:
round_ready = false
@ -225,11 +223,14 @@ func _on_hit_ball_finished(count: int):
func _success_dialogue():
match round_id:
0:
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏1")
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏1")
await scene.ball_dialogue_ended
1:
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏2")
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏2")
await scene.ball_dialogue_ended
2:
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏3")
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏3")
await scene.ball_dialogue_ended
func _on_hit_boundary():
@ -237,8 +238,8 @@ func _on_hit_boundary():
if round_id > 0:
# 后面的回合必须每次都击中球
get_tree().call_group("Balls" + str(round_id), "ease_out")
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏fail")
await ball_dialogue_ended
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏fail")
await scene.ball_dialogue_ended
reload_round()
else:
reload_hand_ball()
@ -248,6 +249,7 @@ func _on_hit_boundary():
func game_win() -> void:
print("game_win 弹珠游戏胜利")
animation_player.stop()
# 0:默认 1:寻找弹珠(老虎钳可以换弹珠) 2:给出弹珠 3:游戏结束(小猫纸片) 4:游戏结束(小猫离开)
EventManager.set_stage(&"c02_ball_game_stage", 3)
$"Sfx结尾小孩跑_耳鸣".global_play()
@ -255,8 +257,8 @@ func game_win() -> void:
# 弹珠雨
$BallsFalling.emitting = true
pivot.visible = false
DialogueManager.show_dialogue_balloon_scene(self, dialogue_c02, "c02_弹珠游戏4")
await ball_dialogue_ended
var scene = DialogueManager.show_dialogue_balloon_scene(dialog_balloon_scene, dialogue_c02, "c02_弹珠游戏4")
await scene.ball_dialogue_ended
await Util.wait(3.0)
exit.emit(true)
@ -278,35 +280,3 @@ func _unhandled_input(event: InputEvent) -> void:
# if round_id >= 0:
# shoot()
# get_viewport().set_input_as_handled()
signal ball_dialogue_ended
## The current line
var dialogue_line: DialogueLine:
set(value):
if value:
dialogue_line = value
apply_dialogue_line()
get:
return dialogue_line
func start(
dialogue_resource: DialogueResource, title: String, extra_game_states: Array = []
) -> void:
var temporary_game_states = [self] + extra_game_states
self.dialogue_line = await dialogue_resource.get_next_dialogue_line(
title, temporary_game_states
)
## Apply any changes to the balloon given a new [DialogueLine].
func apply_dialogue_line() -> void:
var translation_key = dialogue_line.translation_key
label.text = ("[wave amp=10.0 freq=5.0][shake rate=4.0 level=3] " + tr(translation_key))
var tween = create_tween()
tween.tween_property(label, "modulate:a", 1.0, 0.5)
tween.tween_interval(2.0)
tween.tween_property(label, "modulate:a", 0.0, 0.5)
ball_dialogue_ended.emit()

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=27 format=3 uid="uid://cjx7o685ox8c1"]
[gd_scene load_steps=26 format=3 uid="uid://cjx7o685ox8c1"]
[ext_resource type="Script" uid="uid://c5s4giu182isu" path="res://scene/little_game/弹珠游戏/弹珠游戏.gd" id="1_p2trd"]
[ext_resource type="AudioStream" uid="uid://cra6rqbs6r1qd" path="res://asset/audio/sfx/旧版/child/小孩从近到远跑步.ogg" id="2_aqxy0"]
@ -6,7 +6,6 @@
[ext_resource type="AudioStream" uid="uid://b8sbtn3l37uh" path="res://asset/audio/sfx/旧版/c02/红屏.ogg" id="2_w5xa1"]
[ext_resource type="Texture2D" uid="uid://bs4tp4amd1kkm" path="res://asset/art/little_game/弹珠/抱手.png" id="3_3kvx4"]
[ext_resource type="AudioStream" uid="uid://bb6njoaxi2hbx" path="res://asset/audio/sfx/game/弹珠游戏/hit.ogg" id="3_co06r"]
[ext_resource type="FontFile" uid="uid://bnxdsxp7dst7f" path="res://asset/font/锐字太空混元像素简繁-闪 超黑_mianfeiziti.com.ttf" id="3_ctokx"]
[ext_resource type="PackedScene" uid="uid://bbcfjksjlyfx5" path="res://scene/little_game/弹珠游戏/ball.tscn" id="4_bm1k0"]
[ext_resource type="Script" uid="uid://rq6w1vuhuq1m" path="res://scene/entity/audio/sfx.gd" id="4_co06r"]
[ext_resource type="Texture2D" uid="uid://btplp6xvmc6sx" path="res://asset/art/little_game/弹珠/手屈伸/0.png" id="4_fk3jp"]
@ -280,33 +279,6 @@ size_flags_horizontal = 4
size_flags_vertical = 4
texture = ExtResource("2_bm1k0")
[node name="MarginContainer" type="MarginContainer" parent="."]
z_index = 10
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -100.0
offset_top = -1.0
offset_right = 100.0
offset_bottom = 78.0
grow_horizontal = 2
theme_override_constants/margin_top = 100
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer"]
unique_name_in_owner = true
custom_minimum_size = Vector2(300, 0)
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_colors/default_color = Color(0.686241, 0.191934, 0.178785, 1)
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_fonts/normal_font = ExtResource("3_ctokx")
theme_override_font_sizes/normal_font_size = 40
bbcode_enabled = true
text = "[wave amp=10.0 freq=5.0][shake rate=4.0 level=3] 弹珠拿出来"
fit_content = true
horizontal_alignment = 1
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
libraries = {
&"": SubResource("AnimationLibrary_fk3jp")

View File

@ -62,7 +62,7 @@ func _hide():
func _post_hide():
status = STATUS_HIDDEN
scroll_container.mouse_filter = Control.MOUSE_FILTER_IGNORE
holding = false
locking = false
origin_texture.texture = null
full_texture.texture = null
texture_cover = null
@ -96,7 +96,7 @@ func pop_standard_inspection(
content_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_LEFT
if status != STATUS_HIDDEN:
_hide()
holding = true
locking = true
status = STATUS_INSPECTING_COVER
visible = true
full_texture.texture = cover_texture
@ -116,15 +116,15 @@ func pop_standard_inspection(
var _lock_mutex := Mutex.new()
var holding = false:
var locking = false:
set(val):
_lock_mutex.lock()
if val != holding:
holding = val
if val != locking:
locking = val
if val:
SceneManager.hold_player()
SceneManager.lock_player()
else:
SceneManager.unhold_player()
SceneManager.unlock_player()
_lock_mutex.unlock()
var balloon
@ -143,7 +143,7 @@ func pop_prop_inspection(
# STATUS_INSPECTING_PROP 状态下不 hide跳过重复 lock
if status != STATUS_HIDDEN and status != STATUS_INSPECTING_PROP:
_hide()
holding = true
locking = true
status = STATUS_INSPECTING_PROP
visible = true
var tween = create_tween()

View File

@ -14,7 +14,7 @@ func _on_global_stage_updated(e: StringName, s: int):
super._on_global_stage_updated(e, s)
func _on_ground_ready(ground: Ground2D):
func _on_ground_ready(_ground: Ground2D):
pass

View File

@ -8,6 +8,8 @@ extends Node
if is_node_ready():
refresh()
@export var vertical := false
@warning_ignore("unused_private_class_variable")
@export_tool_button("刷新") var _refresh = refresh