// Command chdigeststat 判断 etc/storydigest/{scene,digest}.etc 当前处于哪种状态: // - 已停用:所有段落都指向 blackBoardScene.ani(占位黑屏) // - 正常:段落指向 origin_cinematic_NN.avi 等真实影片 // // 用法: // // go run ./cmd/scratch/chdigeststat -pvf package main import ( "encoding/binary" "flag" "fmt" "os" "strings" platformpvf "longheng.io/server/internal/platform/pvf" ) func main() { pvfPath := flag.String("pvf", "", "Script.pvf 路径") flag.Parse() if *pvfPath == "" { fmt.Fprintln(os.Stderr, "需要 -pvf") os.Exit(2) } archive, err := platformpvf.Open(*pvfPath) if err != nil { fmt.Fprintln(os.Stderr, "打开 PVF 失败:", err) os.Exit(1) } // 需要统计的字符串:黑屏占位 + 前 13 个章节影片 names := []string{ "etc/StoryDigest/Animation/blackBoardScene.ani", } for i := 0; i < 13; i++ { names = append(names, fmt.Sprintf("Video/movie/origin_cinematic_%02d.avi", i)) } magic := archive.FindStringMagicOffsets(names) for _, rel := range []string{"etc/storydigest/scene.etc", "etc/storydigest/digest.etc"} { raw, err := archive.ReadRaw(rel) if err != nil { fmt.Printf("%s\t读取失败: %v\n", rel, err) continue } fmt.Printf("=== %s %d 字节\n", rel, len(raw)) for _, name := range names { off, ok := magic[name] if !ok { fmt.Printf(" %-46s (池中未找到)\n", name) continue } count := countU32LE(raw, uint32(off)) if count > 0 || strings.Contains(name, "blackBoard") { label := name if len(label) > 46 { label = label[:46] } fmt.Printf(" %-46s 引用 %d 次 (magic=0x%08X)\n", label, count, off) } } } } // countU32LE 统计 raw 里 4 字节小端整数的出现次数。 func countU32LE(raw []byte, value uint32) int { count := 0 for i := 0; i+4 <= len(raw); i++ { if binary.LittleEndian.Uint32(raw[i:i+4]) == value { count++ } } return count }