STUDIO HAZE · kakao
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.6.1 · 4 files
games/domain-war/core/game.tpz
Topaz · 2866 B · Original file
1
// 도메인 전쟁 순수 스테퍼. (STATE, EVENT) -> 새 STATE + 장면 i18n 키 패킷.2
// Domain War pure stepper. (STATE, EVENT) -> new STATE + scene i18n-key packet.3
//4
// 하우스룰(core): 게임 로직은 모두 결정론적이다. 시간, IO, 저장소, 라우터, 번역을 읽지 않는다.5
// House rule (core): all game logic is deterministic. It reads no time, IO, storage, router, or translations.6
//7
// DW1 packet contract:8
// 입력: DW1 / STATE:<직전 STATE 또는 빈칸> / EVENT:<choice_0|choice_1|choice_2|back|restart>9
// 출력: DW1 / STATE:<새 STATE> / SCENE:<scene id> / TEXT:<scene text key> / CHOICES:<choice text keys pipe-separated>10
//11
// The stepper deals ONLY in i18n keys. The shell translates text keys with next-i18next.12
// 스테퍼는 i18n 키만 다룬다. 플레이어에게 보이는 문장은 셸이 next-i18next로 번역한다.14
import core.state15
import data.scenes17
export type 이벤트 = "choice_0" | "choice_1" | "choice_2" | "back" | "restart"19
export function 이벤트파싱(토큰: string) -> 이벤트 {20
match 토큰 {21
case "choice_0" => "choice_0"22
case "choice_1" => "choice_1"23
case "choice_2" => "choice_2"24
case "back" => "back"25
case "restart" => "restart"26
case _ => "back"27
}28
}30
function 선택인덱스(이벤트값: 이벤트) -> int {31
match 이벤트값 {32
case "choice_0" => 033
case "choice_1" => 134
case "choice_2" => 235
case "back" => -136
case "restart" => -137
}38
}40
function 선택적용(직전: state.상태, 인덱스: int) -> state.상태 {41
let 현재장면 = scenes.장면찾기(직전.현재)42
if 인덱스 < 0 || 인덱스 >= 현재장면.선택지들.length { return 직전 }43
let 선택지 = 현재장면.선택지들[인덱스]44
state.이동(직전, 선택지.다음)45
}47
export function 진행(직전: state.상태, 이벤트값: 이벤트) -> state.상태 {48
match 이벤트값 {49
case "restart" => state.기본상태()50
case "back" => state.뒤로(직전)51
case "choice_0" => 선택적용(직전, 선택인덱스(이벤트값))52
case "choice_1" => 선택적용(직전, 선택인덱스(이벤트값))53
case "choice_2" => 선택적용(직전, 선택인덱스(이벤트값))54
}55
}57
function 선택키들(장면값: scenes.장면) -> string {58
장면값.선택지들.map((선택지) => 선택지.텍스트키).join("|")59
}61
export function 출력패킷(에스: state.상태) -> string {62
let 장면값 = scenes.장면찾기(에스.현재)63
"DW1\nSTATE:{state.직렬화(에스)}\nSCENE:{장면값.아이디}\nTEXT:{장면값.텍스트키}\nCHOICES:{선택키들(장면값)}"64
}66
export function 처리(상태문자열: string, 이벤트문자열: string) -> string {67
let 직전 = state.역직렬화(상태문자열)68
let 이벤트값 = 이벤트파싱(이벤트문자열)69
출력패킷(진행(직전, 이벤트값))70
}SHA256 b6f7f2307323f1aaf0f11f6ccdfa065d9fdd96d4d2c4e682b61bb25615720aba