slow.monster

STUDIO HAZE · jeniapp

Topaz source

Open by house policy. Topaz is our own language.

Topaz 5.20.2 · 63 files

apps/slow-monster/core/story.tpz

Topaz · 3629 B · Original file

1// 이야기 이정표를 한 번씩만 띄우는 내레이션 비트셋을 다룹니다.
2// 비트셋은 정수 하나이고 비트 번호는 첫 조우 0, 첫 포획 1, 첫 초점 2, 첫 심층 7, 정복 10 입니다. 파생비트는 상태에서 도달한 비트셋을, 비트내레이션은 비트의 두 줄 문구를 돌려줍니다.
3// 비트셋이 저장 상태에 들어가고 도달 여부가 상태의 순수 함수라 같은 상태는 늘 같은 비트입니다.
4// 비트 연산을 쓰지 않습니다. 게임 결과에 영향을 주지 않는 연출입니다.
5// Story beats: an arithmetic bitset of fire-once milestones and their narration.
7import data.entities
8import core.state
10export let 비트수 = 15
11export let 비트_첫조우 = 0
12export let 비트_첫포획 = 1
13export let 비트_첫초점 = 2
14export let 비트_첫심층 = 7
15export let 비트_정복 = 10
17// 비트 연산이 없어 2 의 거듭제곱으로 비트를 다룹니다. 토파즈 과제 '비트 연산' 의 우회입니다.
18// 조작된 큰 k 에서도 넘치지 않게 서른 번에서 멈춥니다.
19function 이의거듭제곱(k: int) -> int {
20 let mut 결과 = 1
21 for _ in 0..<k.atMost(30) { 결과 = 결과 * 2 }
22 결과
25export function 켜진비트인가(n: int, k: int) -> bool {
26 (n / 이의거듭제곱(k)) % 2 == 1
29export function 비트켜기(n: int, k: int) -> int {
30 if 켜진비트인가(n, k) { n } else { n + 이의거듭제곱(k) }
33export function 비트끄기(n: int, k: int) -> int {
34 if 켜진비트인가(n, k) { n - 이의거듭제곱(k) } else { n }
37// 대기열에서 다음에 보여 줄 비트입니다. 없으면 -1 입니다.
38export function 최하위비트(n: int) -> int {
39 for k in 0..<비트수 {
40 if 켜진비트인가(n, k) { return k }
41 }
42 -1
45// 호출자가 이미 본 비트를 빼서 새 비트만 추립니다. 맵에 야생이 늘 있어 첫 조우는 시작부터 켜지고 오프닝 카드가 됩니다.
46export function 파생비트(현재: state.상태) -> int {
47 let mut 비트셋 = 0
48 if entities.엔티티목록(현재.맵아이디).filter(entities.야생인가).length > 0 { 비트셋 = 비트켜기(비트셋, 비트_첫조우) }
49 if 현재.파티.length > 1 { 비트셋 = 비트켜기(비트셋, 비트_첫포획) }
50 if 현재.초점 > 0 { 비트셋 = 비트켜기(비트셋, 비트_첫초점) }
51 if 현재.맵아이디 == "deep" { 비트셋 = 비트켜기(비트셋, 비트_첫심층) }
52 // 엔티티 14 는 심연군주입니다.
53 if entities.처치된것인가(현재.처치된것들, 14) { 비트셋 = 비트켜기(비트셋, 비트_정복) }
54 비트셋
57// 두 줄 문구는 \n 으로 나눕니다. 문구가 없는 비트는 빈 문자열입니다.
58export function 비트내레이션(비트: int) -> string {
59 if 비트 == 비트_첫조우 {
60 "세계가 조금씩 얇아지고 있습니다.\n저 작은 표본은 아직 사라지지 않은 생명의 결입니다."
61 } else if 비트 == 비트_첫포획 {
62 "한 표본이 씨앗의 숲에 머물기로 했습니다.\n서두르지 마십시오. 오래 지켜본 생명만이 길을 냅니다."
63 } else if 비트 == 비트_첫초점 {
64 "이제 이 표본은 하나의 줄기가 됩니다.\n당신의 보살핌은 계보가 되어 남습니다."
65 } else if 비트 == 비트_첫심층 {
66 "깊은 곳이 열렸습니다.\n그곳은 적의 땅이 아니라, 오래전에 멈춘 생명의 뿌리입니다."
67 } else if 비트 == 비트_정복 {
68 "숲은 사라지지 않았습니다.\n느리게 자란 계보가, 다시 살아갈 수 있음을 증명했습니다."
69 } else {
70 ""
71 }

SHA256 225295ef1bc0173d5757de5aee1040360976eb12d0ada8799562b2661c4971e3