Skip to content

Commit 26122b8

Browse files
committed
Add support for extracting a specific character's dialogue
1 parent 63a441a commit 26122b8

File tree

1 file changed

+42
-21
lines changed
  • scripts/CharacterInfoExtraction/HigurashiTextExtractor

1 file changed

+42
-21
lines changed

scripts/CharacterInfoExtraction/HigurashiTextExtractor/main.swift

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22

33
guard CommandLine.arguments.count > 1 else {
4-
print("Usage: \(CommandLine.arguments[0]) file [(e|j)]\nExtracts text from Higurashi script files. Use e or j to specify English or Japanese, otherwise you'll get both")
4+
print("Usage: \(CommandLine.arguments[0]) file [(e|j)][-name <name>]\nExtracts text from Higurashi script files. Use e or j to specify English or Japanese, otherwise you'll get both. Specify a name to extract only a specific character's speech (for use on mod scripts)")
55
exit(EXIT_FAILURE)
66
}
77

@@ -13,6 +13,12 @@ if CommandLine.arguments.count >= 3 {
1313
if CommandLine.arguments.contains(where: { $0.lowercased() == "-v" }) { verbose = true }
1414
}
1515

16+
var searchName = ""
17+
18+
if let arg = CommandLine.arguments.firstIndex(of: "-name"), arg <= CommandLine.arguments.count - 2 {
19+
searchName = CommandLine.arguments[arg + 1]
20+
}
21+
1622
var standardError = FileHandle.standardError
1723

1824
extension FileHandle : TextOutputStream {
@@ -60,8 +66,6 @@ let commands = tokens.compactMap { tokens -> Command? in
6066
}
6167

6268
let ignore: Set = ["FadeOutBGM", "DisableWindow", "DrawScene", "PlayBGM", "Wait", "SetValidityOfInput", "DrawSceneWithMask", "SetSpeedOfMessage", "DrawBustshot", "FadeBustshot", "DrawBustshotWithFiltering", "FadeBustshotWithFiltering", "PlaySE", "ShakeScreen", "DrawFilm", "FadeFilm", "FadeAllBustshots", "DrawSpriteWithFiltering", "MoveSprite", "DrawSprite", "FadeSprite", "TitleScreen", "SetLocalFlag", "ShowChapterPreview", "SetCharSpacing", "SetLineSpacing", "SetScreenAspect", "SetWindowPos", "SetWindowSize", "SetWindowMargins", "FadeBG", "SetValidityOfSkipping", "SetGUIPosition", "SetStyleOfMessageSwinging", "EnableJumpingOfReturnIcon", "SetValidityOfTextFade", "SetValidityOfInterface", "Negative", "CallScript", "SavePoint", "SetValidityOfWindowDisablingWhenGraphicsControl", "SetFontSize", "SetNameFormat", "SetFontId", "StopBGM", "SetGlobalFlag", "LanguagePrompt", "SetValidityOfSaving", "ShowTips", "CheckTipsAchievements", "if", "StoreValueToLocalWork", "DrawBG", "ChangeScene", "StopSE", "ShakeScreenSx", "StopSE", "GetAchievement", "CallSection", "JumpSection", "SetDrawingPointOfMessage"]
63-
var japanese = ""
64-
var english = ""
6569

6670
func stringFromLiteral(literal: Token) -> String {
6771
guard literal.type == .stringLiteral else {
@@ -71,23 +75,40 @@ func stringFromLiteral(literal: Token) -> String {
7175
return literal.value.replacingOccurrences(of: "\\\"", with: "\"").replacingOccurrences(of: "\\n", with: "\n")
7276
}
7377

74-
for command in commands {
75-
if ignore.contains(command.name) { continue }
76-
77-
switch command.name {
78-
case "OutputLine":
79-
japanese += stringFromLiteral(literal: command.arguments[1])
80-
english += stringFromLiteral(literal: command.arguments[3])
81-
case "OutputLineAll":
82-
let line = stringFromLiteral(literal: command.arguments[1])
83-
japanese += line
84-
english += line
85-
case "ClearMessage":
86-
japanese += "\n\n"
87-
english += "\n\n"
88-
default: if verbose { print(command, to: &standardError) }
78+
do {
79+
var japanese = ""
80+
var english = ""
81+
var enable = false
82+
83+
for command in commands {
84+
if ignore.contains(command.name) { continue }
85+
86+
switch command.name {
87+
case "OutputLine":
88+
if command.arguments[0].value != "NULL" {
89+
enable = searchName.isEmpty || command.arguments[0].value.contains(searchName) || command.arguments[2].value.contains(searchName)
90+
}
91+
if enable {
92+
japanese += stringFromLiteral(literal: command.arguments[1])
93+
english += stringFromLiteral(literal: command.arguments[3])
94+
}
95+
case "OutputLineAll":
96+
if command.arguments[0].value != "NULL" {
97+
enable = searchName.isEmpty || command.arguments[0].value.contains(searchName) || command.arguments[2].value.contains(searchName)
98+
}
99+
if enable {
100+
let line = stringFromLiteral(literal: command.arguments[1])
101+
japanese += line
102+
english += line
103+
}
104+
case "ClearMessage":
105+
if !japanese.hasSuffix("\n") { japanese += "\n" }
106+
if !english.hasSuffix("\n") { english += "\n" }
107+
break
108+
default: if verbose { print(command, to: &standardError) }
109+
}
89110
}
90-
}
91111

92-
if mode & 1 > 0 { print(japanese) }
93-
if mode & 2 > 0 { print(english) }
112+
if mode & 1 > 0 { print(japanese) }
113+
if mode & 2 > 0 { print(english) }
114+
}

0 commit comments

Comments
 (0)