slow.monster

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로 번역한다.
14import core.state
15import data.scenes
17export type 이벤트 = "choice_0" | "choice_1" | "choice_2" | "back" | "restart"
19export 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 }
30function 선택인덱스(이벤트값: 이벤트) -> int {
31 match 이벤트값 {
32 case "choice_0" => 0
33 case "choice_1" => 1
34 case "choice_2" => 2
35 case "back" => -1
36 case "restart" => -1
37 }
40function 선택적용(직전: state.상태, 인덱스: int) -> state.상태 {
41 let 현재장면 = scenes.장면찾기(직전.현재)
42 if 인덱스 < 0 || 인덱스 >= 현재장면.선택지들.length { return 직전 }
43 let 선택지 = 현재장면.선택지들[인덱스]
44 state.이동(직전, 선택지.다음)
47export 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 }
57function 선택키들(장면값: scenes.장면) -> string {
58 장면값.선택지들.map((선택지) => 선택지.텍스트키).join("|")
61export function 출력패킷(에스: state.상태) -> string {
62 let 장면값 = scenes.장면찾기(에스.현재)
63 "DW1\nSTATE:{state.직렬화(에스)}\nSCENE:{장면값.아이디}\nTEXT:{장면값.텍스트키}\nCHOICES:{선택키들(장면값)}"
66export function 처리(상태문자열: string, 이벤트문자열: string) -> string {
67 let 직전 = state.역직렬화(상태문자열)
68 let 이벤트값 = 이벤트파싱(이벤트문자열)
69 출력패킷(진행(직전, 이벤트값))

SHA256 b6f7f2307323f1aaf0f11f6ccdfa065d9fdd96d4d2c4e682b61bb25615720aba