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/data/entities.tpz

Topaz · 5210 B · Original file

1// 맵 위에서 마주 서서 A 로 상호작용하는 대상을 둡니다. 무작위 조우 대신 보이는 대상과 맞붙습니다.
2// 대상은 아이디, 타일 좌표 x y, 종류이고 종류는 야생(종 아이디, 레벨) 또는 인물(대사)입니다. 칸으로 찾으면 대상이나 빈 칸 표시를 돌려줍니다.
3// 배치가 상수라 같은 맵, 같은 칸, 같은 처치 목록이면 늘 같은 대상입니다.
4// 처치 목록을 바꾸지 않습니다. 한 칸에 대상은 하나뿐이고 물, 나무, 시작 칸 위에는 두지 않습니다.
5// Map entities: wild microbes and talking characters placed on tiles, looked up by position.
7export enum 엔티티종류 {
8 없음,
9 야생(int, int),
10 인물(string)
13export record 엔티티 {
14 아이디: int,
15 x: int,
16 y: int,
17 종류: 엔티티종류,
20// 그리기 목록의 ENT 토큰이 읽는 정수입니다. 페이지 셸과 맞물려 있어 값을 바꾸지 않습니다.
21export function 종류코드(대상: 엔티티) -> int {
22 match 대상.종류 {
23 case 없음 => -1
24 case 야생(_, _) => 0
25 case 인물(_) => 1
26 }
29// 종류 필드만 넘기면 다른 모듈에서 타입이 맞지 않아 엔티티를 통째로 받습니다. 토파즈 과제 '다른 모듈 열거형 값을 그 모듈 함수에 넘기기' 의 우회입니다.
30export function 야생인가(대상: 엔티티) -> bool {
31 match 대상.종류 {
32 case 야생(_, _) => true
33 case 없음 | 인물(_) => false
34 }
37export function 인물인가(대상: 엔티티) -> bool {
38 match 대상.종류 {
39 case 인물(_) => true
40 case 없음 | 야생(_, _) => false
41 }
44function 빈칸인가(종류: 엔티티종류) -> bool {
45 match 종류 {
46 case 없음 => true
47 case 야생(_, _) | 인물(_) => false
48 }
51export function 없는엔티티() -> 엔티티 {
52 엔티티 { 아이디: 0, x: -1, y: -1, 종류: 엔티티종류.없음 }
55// 대사는 그리기 목록의 TXT 토큰으로 나가므로 파이프 문자를 넣지 않습니다.
56// 연못은 시작 칸 (3,5) 에서 아래를 보고 시작하므로 바로 아래에 약한 야생을 두어 A 한 번에 첫 배틀이 열립니다.
57// 심층은 아이디를 10 부터 써서 맵이 함께 쓰는 처치 목록에서 연못과 겹치지 않고, 입구 (3,4) 에서 멀수록 레벨이 오릅니다.
58// 가장 가까운 Lv7 은 덜 자란 파티도 이길 수 있어 진행이 막히지 않습니다.
59export function 엔티티목록(맵아이디: string) -> Array<엔티티> {
60 if 맵아이디 == "deep" {
61 [
62 엔티티 { 아이디: 10, x: 5, y: 5, 종류: 엔티티종류.인물("심층입니다. A를 누르면 쉬어 회복합니다. 가장 깊은 곳엔 심연군주가 있습니다 — 충분히 키운 계통이라야 마주할 수 있습니다.") },
63 엔티티 { 아이디: 11, x: 19, y: 3, 종류: 엔티티종류.야생(5, 11) },
64 엔티티 { 아이디: 12, x: 2, y: 9, 종류: 엔티티종류.야생(6, 7) },
65 엔티티 { 아이디: 13, x: 7, y: 14, 종류: 엔티티종류.야생(7, 9) },
66 엔티티 { 아이디: 14, x: 11, y: 19, 종류: 엔티티종류.야생(8, 15) },
67 ]
68 } else {
69 [
70 엔티티 { 아이디: 1, x: 3, y: 6, 종류: 엔티티종류.야생(1, 3) },
71 엔티티 { 아이디: 2, x: 5, y: 5, 종류: 엔티티종류.인물("여기서 A를 누르면 동료들이 쉬어 회복합니다. 마주 선 미생물에게 A를 누르면 맞붙습니다.") },
72 엔티티 { 아이디: 3, x: 6, y: 6, 종류: 엔티티종류.야생(2, 4) },
73 엔티티 { 아이디: 4, x: 9, y: 6, 종류: 엔티티종류.야생(3, 6) },
74 엔티티 { 아이디: 5, x: 8, y: 13, 종류: 엔티티종류.야생(1, 5) },
75 엔티티 { 아이디: 6, x: 2, y: 16, 종류: 엔티티종류.야생(2, 6) },
76 엔티티 { 아이디: 7, x: 11, y: 17, 종류: 엔티티종류.야생(3, 8) },
77 엔티티 { 아이디: 8, x: 20, y: 5, 종류: 엔티티종류.야생(1, 7) },
78 엔티티 { 아이디: 9, x: 13, y: 14, 종류: 엔티티종류.인물("남쪽 통로로 내려가면 더 깊은 심층입니다. 키운 동료가 충분히 자라면 천천히, 그리고 또 진화하며 계통이 깊어집니다.") },
79 ]
80 }
83export function 엔티티에서(맵아이디: string, x: int, y: int) -> 엔티티 {
84 let 일치 = 엔티티목록(맵아이디).filter(대상 => 대상.x == x && 대상.y == y)
85 if 일치.length > 0 { 일치[0] } else { 없는엔티티() }
88export function 처치된것인가(처치된것들: Array<int>, 아이디: int) -> bool {
89 아이디 in 처치된것들
92// 이동, 상호작용, 그리기가 모두 이 함수로 칸을 보므로 잡거나 이긴 야생은 맵에서 사라집니다.
93export function 활성엔티티에서(맵아이디: string, x: int, y: int, 처치된것들: Array<int>) -> 엔티티 {
94 let 대상 = 엔티티에서(맵아이디, x, y)
95 if 처치된것인가(처치된것들, 대상.아이디) { 없는엔티티() } else { 대상 }
98export function 활성엔티티칸인가(맵아이디: string, x: int, y: int, 처치된것들: Array<int>) -> bool {
99 !빈칸인가(활성엔티티에서(맵아이디, x, y, 처치된것들).종류)

SHA256 e549eaa6dea5f958af585ad047c291a950e3343159a00594b0ab12ef4030bae3