토파즈 원본
// ===== main.tpz =====
// 도메인 전쟁 Topaz 엔트리. 입력 패킷을 파싱하고 pure core에 위임한 뒤 DW1 패킷을 프린트한다.
// Domain War Topaz entry. Parse the input packet, delegate to the pure core, and print a DW1 packet.
//
// 하우스룰(app): app 계층은 패킷 파싱 + 코어 호출 + print만 한다. 게임 규칙은 core/game.tpz에 있다.
// House rule (app): packet parsing + core call + print only. Game rules live in core/game.tpz.
//
// DW1 packet contract:
// 입력: DW1 / STATE:<prev> / EVENT:<choice_0|choice_1|choice_2|back|restart>
// 출력: DW1 / STATE:<new> / SCENE:<scene id> / TEXT:<text key> / CHOICES:<choice text keys pipe-separated>
import core.game { 처리 }
// 문자열에서 접두사 뒤의 꼬리를 돌려준다. Topaz string에는 slice가 없으므로 scalar 배열을 잘라 합친다.
// Return the tail of a string after a prefix. Topaz string has no slice, so we slice scalars and join.
function 접두사뒤(전체: string, 접두사: string) -> string {
let 글자들 = 전체.scalars()
let 자른 = 글자들.slice(접두사.scalars().length, 글자들.length)
let mut 결과 = ""
for 글 in 자른 { 결과 = 결과 + 글 }
결과
}
// "PREFIX:"로 시작하는 줄에서 값을 읽는다. 없으면 빈 문자열.
// Read the value after a "PREFIX:" line. Missing values become empty string.
function 줄값(원본: string, 접두사: string) -> string {
let mut 값 = ""
for 줄 in 원본.split("\n") {
let 다듬 = 줄.trim()
if 다듬.startsWith(접두사) { 값 = 접두사뒤(다듬, 접두사) }
}
값.trim()
}
let 패킷 = input()
print(처리(줄값(패킷, "STATE:"), 줄값(패킷, "EVENT:")))
// ===== core/game.tpz =====
// 도메인 전쟁 순수 스테퍼. (STATE, EVENT) -> 새 STATE + 장면 i18n 키 패킷.
// Domain War pure stepper. (STATE, EVENT) -> new STATE + scene i18n-key packet.
//
// 하우스룰(core): 게임 로직은 모두 결정론적이다. 시간, IO, 저장소, 라우터, 번역을 읽지 않는다.
// House rule (core): all game logic is deterministic. It reads no time, IO, storage, router, or translations.
//
// DW1 packet contract:
// 입력: DW1 / STATE:<직전 STATE 또는 빈칸> / EVENT:<choice_0|choice_1|choice_2|back|restart>
// 출력: DW1 / STATE:<새 STATE> / SCENE:<scene id> / TEXT:<scene text key> / CHOICES:<choice text keys pipe-separated>
//
// The stepper deals ONLY in i18n keys. The shell translates text keys with next-i18next.
// 스테퍼는 i18n 키만 다룬다. 플레이어에게 보이는 문장은 셸이 next-i18next로 번역한다.
import core.state
import data.scenes
export type 이벤트 = "choice_0" | "choice_1" | "choice_2" | "back" | "restart"
export function 이벤트파싱(토큰: string) -> 이벤트 {
match 토큰 {
case "choice_0" => "choice_0"
case "choice_1" => "choice_1"
case "choice_2" => "choice_2"
case "back" => "back"
case "restart" => "restart"
case _ => "back"
}
}
function 선택인덱스(이벤트값: 이벤트) -> int {
match 이벤트값 {
case "choice_0" => 0
case "choice_1" => 1
case "choice_2" => 2
case "back" => -1
case "restart" => -1
}
}
function 선택적용(직전: state.상태, 인덱스: int) -> state.상태 {
let 현재장면 = scenes.장면찾기(직전.현재)
if 인덱스 < 0 || 인덱스 >= 현재장면.선택지들.length { return 직전 }
let 선택지 = 현재장면.선택지들[인덱스]
state.이동(직전, 선택지.다음)
}
export function 진행(직전: state.상태, 이벤트값: 이벤트) -> state.상태 {
match 이벤트값 {
case "restart" => state.기본상태()
case "back" => state.뒤로(직전)
case "choice_0" => 선택적용(직전, 선택인덱스(이벤트값))
case "choice_1" => 선택적용(직전, 선택인덱스(이벤트값))
case "choice_2" => 선택적용(직전, 선택인덱스(이벤트값))
}
}
function 선택키들(장면값: scenes.장면) -> string {
let mut 결과 = ""
let mut i = 0
while i < 장면값.선택지들.length {
if i > 0 { 결과 = "{결과}|" }
결과 = "{결과}{장면값.선택지들[i].텍스트키}"
i = i + 1
}
결과
}
export function 출력패킷(에스: state.상태) -> string {
let 장면값 = scenes.장면찾기(에스.현재)
"DW1\nSTATE:{state.직렬화(에스)}\nSCENE:{장면값.아이디}\nTEXT:{장면값.텍스트키}\nCHOICES:{선택키들(장면값)}"
}
export function 처리(상태문자열: string, 이벤트문자열: string) -> string {
let 직전 = state.역직렬화(상태문자열)
let 이벤트값 = 이벤트파싱(이벤트문자열)
출력패킷(진행(직전, 이벤트값))
}
// ===== core/state.tpz =====
// 도메인 전쟁 STATE 문자열. 순수 코어는 브라우저 저장소나 URL을 읽지 않고, 이 한 줄 상태만 주고받는다.
// Domain War STATE string. The pure core never reads browser storage or the URL; it only receives and returns this one-line state.
//
// 하우스룰(core): export는 타입/함수/불변 값만. 최상위 가변 상태, print, input, now_millis, 파일 IO 금지.
// House rule (core): export only types/functions/immutable values; no module-level mutability, print, input, now_millis, or file IO.
//
// STATE v1:
// v1:<currentScene>:<visitedSceneIds comma-separated>
// 예: v1:ch3_scene4:ch1_scene0,ch1_scene1,ch1_scene3,ch2_scene0
// Example: v1:ch3_scene4:ch1_scene0,ch1_scene1,ch1_scene3,ch2_scene0
//
// 방문경로는 "뒤로"를 위한 순수 스택이다. URL deep-link는 빈 방문경로로 특정 장면을 렌더한다.
// visitedPath is the pure stack for Back. URL deep links render a scene with an empty path.
import data.scenes
export type 상태 = {
버전: int,
현재: scenes.장면아이디,
방문경로: Array<scenes.장면아이디>
}
export function 기본상태() -> 상태 {
{ 버전: 1, 현재: scenes.시작장면(), 방문경로: [] }
}
export function 위치상태(아이디: scenes.장면아이디) -> 상태 {
{ 버전: 1, 현재: 아이디, 방문경로: [] }
}
function 경로직렬화(경로: Array<scenes.장면아이디>) -> string {
let mut 결과 = ""
let mut i = 0
while i < 경로.length {
if i > 0 { 결과 = "{결과}," }
결과 = "{결과}{경로[i]}"
i = i + 1
}
결과
}
export function 직렬화(에스: 상태) -> string {
"v1:{에스.현재}:{경로직렬화(에스.방문경로)}"
}
function 경로파싱(토큰: string) -> Array<scenes.장면아이디> {
let mut 결과: Array<scenes.장면아이디> = []
let 다듬 = 토큰.trim()
if 다듬 == "" { return 결과 }
let 조각들 = 다듬.split(",")
let mut i = 0
while i < 조각들.length && i < 128 {
let 조각 = 조각들[i].trim()
if 조각 != "" { 결과.push(scenes.장면파싱(조각)) }
i = i + 1
}
결과
}
export function 역직렬화(문자열: string) -> 상태 {
let 다듬 = 문자열.trim()
if 다듬 == "" { return 기본상태() }
let 부분 = 다듬.split(":")
if 부분.length < 2 { return 기본상태() }
let 현재 = scenes.장면파싱(부분[1])
let 경로 = if 부분.length >= 3 { 경로파싱(부분[2]) } else { [] }
{ 버전: 1, 현재: 현재, 방문경로: 경로 }
}
function 경로복사추가(경로: Array<scenes.장면아이디>, 아이디: scenes.장면아이디) -> Array<scenes.장면아이디> {
let mut 결과: Array<scenes.장면아이디> = []
let mut i = 0
while i < 경로.length && i < 127 {
결과.push(경로[i])
i = i + 1
}
결과.push(아이디)
결과
}
function 경로끝제거(경로: Array<scenes.장면아이디>) -> Array<scenes.장면아이디> {
let mut 결과: Array<scenes.장면아이디> = []
let mut i = 0
while i + 1 < 경로.length {
결과.push(경로[i])
i = i + 1
}
결과
}
export function 이동(에스: 상태, 다음: scenes.장면아이디) -> 상태 {
{ 버전: 1, 현재: 다음, 방문경로: 경로복사추가(에스.방문경로, 에스.현재) }
}
export function 뒤로(에스: 상태) -> 상태 {
if 에스.방문경로.length == 0 { return 에스 }
let 이전 = 에스.방문경로[에스.방문경로.length - 1]
{ 버전: 1, 현재: 이전, 방문경로: 경로끝제거(에스.방문경로) }
}
// ===== data/scenes.tpz =====
// 도메인 전쟁 장면 그래프 데이터. data/gameContent JSON의 모든 장면과 선택지를 Topaz 레코드로 포팅한다.
// Domain War scene graph data. Every scene and choice edge from data/gameContent is ported as typed Topaz records.
//
// 하우스룰(data): 순수 불변 데이터만 둔다. 플레이어에게 보이는 문장은 절대 담지 않고 i18n 키만 담는다.
// House rule (data): immutable pure data only. Player-visible copy never lives here; only i18n keys do.
//
// 패리티 표식(parity marker): 선택지의 원래다음(oldNext)은 JSON의 choices[].next 값 그대로다.
// The parity marker oldNext is copied byte-for-byte from JSON choices[].next.
//
// Key identifiers: 장면아이디=SceneId, 텍스트키=TextKey, 선택지=Choice, 장면=Scene, 장면찾기=findScene.
export type 장면아이디 = "ch1_scene0" | "ch1_scene1" | "ch1_scene2" | "ch1_scene3" | "ch1_scene4" | "ch1_scene5" | "ch2_scene0" | "ch2_scene1" | "ch2_scene2" | "ch2_scene3" | "ch2_scene4" | "ch2_scene5" | "ch2_scene6" | "ch3_scene0" | "ch3_scene1" | "ch3_scene2" | "ch3_scene3" | "ch3_scene4" | "ch4_scene0" | "ch4_scene1" | "ch4_scene2" | "ch4_scene3" | "ch4_scene4" | "ch5_scene0" | "ch5_scene1" | "ch5_scene2" | "ch5_scene3" | "ch5_scene4" | "ch5_scene5" | "ch6_scene0" | "ch6_scene1" | "ch6_scene2" | "ch6_scene3" | "ch6_scene4" | "ch6_scene5" | "ch7_scene0" | "ch7_scene1" | "ch7_scene2" | "ch7_scene3" | "ch7_scene4" | "ch8_scene0" | "ch8_scene1" | "ch8_scene2" | "ch8_scene3" | "ch8_scene4" | "ch9_scene0" | "ch9_scene1" | "ch9_scene2"
export type 텍스트키 = "domainCh1_scene0_text" | "domainCh1_scene0_choice0_text" | "domainCh1_scene0_choice1_text" | "domainCh1_scene1_text" | "domainCh1_scene1_choice0_text" | "domainCh1_scene1_choice1_text" | "domainCh1_scene2_text" | "domainCh1_scene2_choice0_text" | "domainCh1_scene2_choice1_text" | "domainCh1_scene3_text" | "domainCh1_scene3_choice0_text" | "domainCh1_scene4_text" | "domainCh1_scene4_choice0_text" | "domainCh1_scene5_text" | "domainCh1_scene5_choice0_text" | "domainCh2_scene0_text" | "domainCh2_scene0_choice0_text" | "domainCh2_scene0_choice1_text" | "domainCh2_scene1_text" | "domainCh2_scene1_choice0_text" | "domainCh2_scene1_choice1_text" | "domainCh2_scene2_text" | "domainCh2_scene2_choice0_text" | "domainCh2_scene2_choice1_text" | "domainCh2_scene3_text" | "domainCh2_scene3_choice0_text" | "domainCh2_scene4_text" | "domainCh2_scene4_choice0_text" | "domainCh2_scene5_text" | "domainCh2_scene5_choice0_text" | "domainCh2_scene6_text" | "domainCh2_scene6_choice0_text" | "domainCh3_scene0_text" | "domainCh3_scene0_choice0_text" | "domainCh3_scene0_choice1_text" | "domainCh3_scene0_choice2_text" | "domainCh3_scene1_text" | "domainCh3_scene1_choice0_text" | "domainCh3_scene1_choice1_text" | "domainCh3_scene2_text" | "domainCh3_scene2_choice0_text" | "domainCh3_scene2_choice1_text" | "domainCh3_scene3_text" | "domainCh3_scene3_choice0_text" | "domainCh3_scene4_text" | "domainCh3_scene4_choice0_text" | "domainCh4_scene0_text" | "domainCh4_scene0_choice0_text" | "domainCh4_scene0_choice1_text" | "domainCh4_scene1_text" | "domainCh4_scene1_choice0_text" | "domainCh4_scene1_choice1_text" | "domainCh4_scene2_text" | "domainCh4_scene2_choice0_text" | "domainCh4_scene2_choice1_text" | "domainCh4_scene3_text" | "domainCh4_scene3_choice0_text" | "domainCh4_scene4_text" | "domainCh4_scene4_choice0_text" | "domainCh5_scene0_text" | "domainCh5_scene0_choice0_text" | "domainCh5_scene0_choice1_text" | "domainCh5_scene0_choice2_text" | "domainCh5_scene1_text" | "domainCh5_scene1_choice0_text" | "domainCh5_scene2_text" | "domainCh5_scene2_choice0_text" | "domainCh5_scene3_text" | "domainCh5_scene3_choice0_text" | "domainCh5_scene4_text" | "domainCh5_scene4_choice0_text" | "domainCh5_scene5_text" | "domainCh5_scene5_choice0_text" | "domainCh6_scene0_text" | "domainCh6_scene0_choice0_text" | "domainCh6_scene0_choice1_text" | "domainCh6_scene0_choice2_text" | "domainCh6_scene1_text" | "domainCh6_scene1_choice0_text" | "domainCh6_scene2_text" | "domainCh6_scene2_choice0_text" | "domainCh6_scene3_text" | "domainCh6_scene3_choice0_text" | "domainCh6_scene4_text" | "domainCh6_scene4_choice0_text" | "domainCh6_scene5_text" | "domainCh6_scene5_choice0_text" | "domainCh7_scene0_text" | "domainCh7_scene0_choice0_text" | "domainCh7_scene0_choice1_text" | "domainCh7_scene0_choice2_text" | "domainCh7_scene1_text" | "domainCh7_scene1_choice0_text" | "domainCh7_scene2_text" | "domainCh7_scene2_choice0_text" | "domainCh7_scene3_text" | "domainCh7_scene3_choice0_text" | "domainCh7_scene4_text" | "domainCh7_scene4_choice0_text" | "domainCh8_scene0_text" | "domainCh8_scene0_choice0_text" | "domainCh8_scene0_choice1_text" | "domainCh8_scene0_choice2_text" | "domainCh8_scene1_text" | "domainCh8_scene1_choice0_text" | "domainCh8_scene2_text" | "domainCh8_scene2_choice0_text" | "domainCh8_scene3_text" | "domainCh8_scene3_choice0_text" | "domainCh8_scene4_text" | "domainCh8_scene4_choice0_text" | "domainCh9_scene0_text" | "domainCh9_scene0_choice0_text" | "domainCh9_scene1_text" | "domainCh9_scene1_choice0_text" | "domainCh9_scene2_text" | "domainCh9_scene2_choice0_text"
export type 선택지 = {
텍스트키: 텍스트키,
다음: 장면아이디,
원래다음: int
}
export type 장면 = {
아이디: 장면아이디,
텍스트키: 텍스트키,
선택지들: Array<선택지>
}
function 선택(텍스트: 텍스트키, 다음: 장면아이디, 원래다음: int) -> 선택지 {
{ 텍스트키: 텍스트, 다음: 다음, 원래다음: 원래다음 }
}
function 장면만들기(아이디: 장면아이디, 텍스트: 텍스트키, 선택지들: Array<선택지>) -> 장면 {
{ 아이디: 아이디, 텍스트키: 텍스트, 선택지들: 선택지들 }
}
export function 시작장면() -> 장면아이디 { "ch1_scene0" }
// STATE와 URL에서 들어온 문자열을 닫힌 장면 union으로 좁힌다. 손상 값은 시작 장면으로 복귀한다.
// Narrow a STATE/URL string into the closed SceneId union. Corrupt values safely return to the start scene.
export function 장면파싱(토큰: string) -> 장면아이디 {
match 토큰 {
case "ch1_scene0" => "ch1_scene0"
case "ch1_scene1" => "ch1_scene1"
case "ch1_scene2" => "ch1_scene2"
case "ch1_scene3" => "ch1_scene3"
case "ch1_scene4" => "ch1_scene4"
case "ch1_scene5" => "ch1_scene5"
case "ch2_scene0" => "ch2_scene0"
case "ch2_scene1" => "ch2_scene1"
case "ch2_scene2" => "ch2_scene2"
case "ch2_scene3" => "ch2_scene3"
case "ch2_scene4" => "ch2_scene4"
case "ch2_scene5" => "ch2_scene5"
case "ch2_scene6" => "ch2_scene6"
case "ch3_scene0" => "ch3_scene0"
case "ch3_scene1" => "ch3_scene1"
case "ch3_scene2" => "ch3_scene2"
case "ch3_scene3" => "ch3_scene3"
case "ch3_scene4" => "ch3_scene4"
case "ch4_scene0" => "ch4_scene0"
case "ch4_scene1" => "ch4_scene1"
case "ch4_scene2" => "ch4_scene2"
case "ch4_scene3" => "ch4_scene3"
case "ch4_scene4" => "ch4_scene4"
case "ch5_scene0" => "ch5_scene0"
case "ch5_scene1" => "ch5_scene1"
case "ch5_scene2" => "ch5_scene2"
case "ch5_scene3" => "ch5_scene3"
case "ch5_scene4" => "ch5_scene4"
case "ch5_scene5" => "ch5_scene5"
case "ch6_scene0" => "ch6_scene0"
case "ch6_scene1" => "ch6_scene1"
case "ch6_scene2" => "ch6_scene2"
case "ch6_scene3" => "ch6_scene3"
case "ch6_scene4" => "ch6_scene4"
case "ch6_scene5" => "ch6_scene5"
case "ch7_scene0" => "ch7_scene0"
case "ch7_scene1" => "ch7_scene1"
case "ch7_scene2" => "ch7_scene2"
case "ch7_scene3" => "ch7_scene3"
case "ch7_scene4" => "ch7_scene4"
case "ch8_scene0" => "ch8_scene0"
case "ch8_scene1" => "ch8_scene1"
case "ch8_scene2" => "ch8_scene2"
case "ch8_scene3" => "ch8_scene3"
case "ch8_scene4" => "ch8_scene4"
case "ch9_scene0" => "ch9_scene0"
case "ch9_scene1" => "ch9_scene1"
case "ch9_scene2" => "ch9_scene2"
case _ => 시작장면()
}
}
// 장면 데이터는 match 하나로 닫혀 있다. 새 장면을 추가하면 이 함수가 exhaustive gate가 된다.
// Scene data is closed over one match. Adding a scene makes this function the exhaustive gate.
export function 장면찾기(아이디: 장면아이디) -> 장면 {
match 아이디 {
case "ch1_scene0" => 장면만들기("ch1_scene0", "domainCh1_scene0_text", [
선택("domainCh1_scene0_choice0_text", "ch1_scene1", 1),
선택("domainCh1_scene0_choice1_text", "ch1_scene2", 2)
])
case "ch1_scene1" => 장면만들기("ch1_scene1", "domainCh1_scene1_text", [
선택("domainCh1_scene1_choice0_text", "ch1_scene3", 3),
선택("domainCh1_scene1_choice1_text", "ch1_scene4", 4)
])
case "ch1_scene2" => 장면만들기("ch1_scene2", "domainCh1_scene2_text", [
선택("domainCh1_scene2_choice0_text", "ch1_scene5", 5),
선택("domainCh1_scene2_choice1_text", "ch1_scene4", 4)
])
case "ch1_scene3" => 장면만들기("ch1_scene3", "domainCh1_scene3_text", [
선택("domainCh1_scene3_choice0_text", "ch2_scene1", 999)
])
case "ch1_scene4" => 장면만들기("ch1_scene4", "domainCh1_scene4_text", [
선택("domainCh1_scene4_choice0_text", "ch2_scene2", 999)
])
case "ch1_scene5" => 장면만들기("ch1_scene5", "domainCh1_scene5_text", [
선택("domainCh1_scene5_choice0_text", "ch2_scene0", 999)
])
case "ch2_scene0" => 장면만들기("ch2_scene0", "domainCh2_scene0_text", [
선택("domainCh2_scene0_choice0_text", "ch2_scene1", 1),
선택("domainCh2_scene0_choice1_text", "ch2_scene2", 2)
])
case "ch2_scene1" => 장면만들기("ch2_scene1", "domainCh2_scene1_text", [
선택("domainCh2_scene1_choice0_text", "ch2_scene3", 3),
선택("domainCh2_scene1_choice1_text", "ch2_scene4", 4)
])
case "ch2_scene2" => 장면만들기("ch2_scene2", "domainCh2_scene2_text", [
선택("domainCh2_scene2_choice0_text", "ch2_scene5", 5),
선택("domainCh2_scene2_choice1_text", "ch2_scene6", 6)
])
case "ch2_scene3" => 장면만들기("ch2_scene3", "domainCh2_scene3_text", [
선택("domainCh2_scene3_choice0_text", "ch3_scene0", 999)
])
case "ch2_scene4" => 장면만들기("ch2_scene4", "domainCh2_scene4_text", [
선택("domainCh2_scene4_choice0_text", "ch3_scene0", 999)
])
case "ch2_scene5" => 장면만들기("ch2_scene5", "domainCh2_scene5_text", [
선택("domainCh2_scene5_choice0_text", "ch3_scene0", 999)
])
case "ch2_scene6" => 장면만들기("ch2_scene6", "domainCh2_scene6_text", [
선택("domainCh2_scene6_choice0_text", "ch3_scene0", 999)
])
case "ch3_scene0" => 장면만들기("ch3_scene0", "domainCh3_scene0_text", [
선택("domainCh3_scene0_choice0_text", "ch3_scene1", 1),
선택("domainCh3_scene0_choice1_text", "ch3_scene2", 2),
선택("domainCh3_scene0_choice2_text", "ch3_scene3", 3)
])
case "ch3_scene1" => 장면만들기("ch3_scene1", "domainCh3_scene1_text", [
선택("domainCh3_scene1_choice0_text", "ch3_scene2", 2),
선택("domainCh3_scene1_choice1_text", "ch3_scene3", 3)
])
case "ch3_scene2" => 장면만들기("ch3_scene2", "domainCh3_scene2_text", [
선택("domainCh3_scene2_choice0_text", "ch3_scene1", 1),
선택("domainCh3_scene2_choice1_text", "ch3_scene3", 3)
])
case "ch3_scene3" => 장면만들기("ch3_scene3", "domainCh3_scene3_text", [
선택("domainCh3_scene3_choice0_text", "ch3_scene4", 4)
])
case "ch3_scene4" => 장면만들기("ch3_scene4", "domainCh3_scene4_text", [
선택("domainCh3_scene4_choice0_text", "ch4_scene0", 999)
])
case "ch4_scene0" => 장면만들기("ch4_scene0", "domainCh4_scene0_text", [
선택("domainCh4_scene0_choice0_text", "ch4_scene1", 1),
선택("domainCh4_scene0_choice1_text", "ch4_scene2", 2)
])
case "ch4_scene1" => 장면만들기("ch4_scene1", "domainCh4_scene1_text", [
선택("domainCh4_scene1_choice0_text", "ch4_scene3", 3),
선택("domainCh4_scene1_choice1_text", "ch4_scene4", 4)
])
case "ch4_scene2" => 장면만들기("ch4_scene2", "domainCh4_scene2_text", [
선택("domainCh4_scene2_choice0_text", "ch4_scene3", 3),
선택("domainCh4_scene2_choice1_text", "ch4_scene4", 4)
])
case "ch4_scene3" => 장면만들기("ch4_scene3", "domainCh4_scene3_text", [
선택("domainCh4_scene3_choice0_text", "ch5_scene0", 999)
])
case "ch4_scene4" => 장면만들기("ch4_scene4", "domainCh4_scene4_text", [
선택("domainCh4_scene4_choice0_text", "ch1_scene0", 0)
])
case "ch5_scene0" => 장면만들기("ch5_scene0", "domainCh5_scene0_text", [
선택("domainCh5_scene0_choice0_text", "ch5_scene1", 1),
선택("domainCh5_scene0_choice1_text", "ch5_scene2", 2),
선택("domainCh5_scene0_choice2_text", "ch5_scene3", 3)
])
case "ch5_scene1" => 장면만들기("ch5_scene1", "domainCh5_scene1_text", [
선택("domainCh5_scene1_choice0_text", "ch5_scene4", 4)
])
case "ch5_scene2" => 장면만들기("ch5_scene2", "domainCh5_scene2_text", [
선택("domainCh5_scene2_choice0_text", "ch5_scene4", 4)
])
case "ch5_scene3" => 장면만들기("ch5_scene3", "domainCh5_scene3_text", [
선택("domainCh5_scene3_choice0_text", "ch5_scene4", 4)
])
case "ch5_scene4" => 장면만들기("ch5_scene4", "domainCh5_scene4_text", [
선택("domainCh5_scene4_choice0_text", "ch5_scene5", 5)
])
case "ch5_scene5" => 장면만들기("ch5_scene5", "domainCh5_scene5_text", [
선택("domainCh5_scene5_choice0_text", "ch6_scene0", 999)
])
case "ch6_scene0" => 장면만들기("ch6_scene0", "domainCh6_scene0_text", [
선택("domainCh6_scene0_choice0_text", "ch6_scene1", 1),
선택("domainCh6_scene0_choice1_text", "ch6_scene2", 2),
선택("domainCh6_scene0_choice2_text", "ch6_scene3", 3)
])
case "ch6_scene1" => 장면만들기("ch6_scene1", "domainCh6_scene1_text", [
선택("domainCh6_scene1_choice0_text", "ch6_scene4", 4)
])
case "ch6_scene2" => 장면만들기("ch6_scene2", "domainCh6_scene2_text", [
선택("domainCh6_scene2_choice0_text", "ch6_scene4", 4)
])
case "ch6_scene3" => 장면만들기("ch6_scene3", "domainCh6_scene3_text", [
선택("domainCh6_scene3_choice0_text", "ch6_scene4", 4)
])
case "ch6_scene4" => 장면만들기("ch6_scene4", "domainCh6_scene4_text", [
선택("domainCh6_scene4_choice0_text", "ch6_scene5", 5)
])
case "ch6_scene5" => 장면만들기("ch6_scene5", "domainCh6_scene5_text", [
선택("domainCh6_scene5_choice0_text", "ch7_scene0", 999)
])
case "ch7_scene0" => 장면만들기("ch7_scene0", "domainCh7_scene0_text", [
선택("domainCh7_scene0_choice0_text", "ch7_scene1", 1),
선택("domainCh7_scene0_choice1_text", "ch7_scene2", 2),
선택("domainCh7_scene0_choice2_text", "ch7_scene3", 3)
])
case "ch7_scene1" => 장면만들기("ch7_scene1", "domainCh7_scene1_text", [
선택("domainCh7_scene1_choice0_text", "ch7_scene4", 4)
])
case "ch7_scene2" => 장면만들기("ch7_scene2", "domainCh7_scene2_text", [
선택("domainCh7_scene2_choice0_text", "ch7_scene3", 3)
])
case "ch7_scene3" => 장면만들기("ch7_scene3", "domainCh7_scene3_text", [
선택("domainCh7_scene3_choice0_text", "ch7_scene4", 4)
])
case "ch7_scene4" => 장면만들기("ch7_scene4", "domainCh7_scene4_text", [
선택("domainCh7_scene4_choice0_text", "ch8_scene0", 999)
])
case "ch8_scene0" => 장면만들기("ch8_scene0", "domainCh8_scene0_text", [
선택("domainCh8_scene0_choice0_text", "ch8_scene1", 1),
선택("domainCh8_scene0_choice1_text", "ch8_scene2", 2),
선택("domainCh8_scene0_choice2_text", "ch8_scene3", 3)
])
case "ch8_scene1" => 장면만들기("ch8_scene1", "domainCh8_scene1_text", [
선택("domainCh8_scene1_choice0_text", "ch8_scene4", 4)
])
case "ch8_scene2" => 장면만들기("ch8_scene2", "domainCh8_scene2_text", [
선택("domainCh8_scene2_choice0_text", "ch8_scene4", 4)
])
case "ch8_scene3" => 장면만들기("ch8_scene3", "domainCh8_scene3_text", [
선택("domainCh8_scene3_choice0_text", "ch8_scene4", 4)
])
case "ch8_scene4" => 장면만들기("ch8_scene4", "domainCh8_scene4_text", [
선택("domainCh8_scene4_choice0_text", "ch9_scene0", 999)
])
case "ch9_scene0" => 장면만들기("ch9_scene0", "domainCh9_scene0_text", [
선택("domainCh9_scene0_choice0_text", "ch9_scene1", 1)
])
case "ch9_scene1" => 장면만들기("ch9_scene1", "domainCh9_scene1_text", [
선택("domainCh9_scene1_choice0_text", "ch9_scene2", 2)
])
case "ch9_scene2" => 장면만들기("ch9_scene2", "domainCh9_scene2_text", [
선택("domainCh9_scene2_choice0_text", "ch1_scene0", 0)
])
}
}