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.7
export enum 엔티티종류 {8
없음,9
야생(int, int),10
인물(string)11
}13
export record 엔티티 {14
아이디: int,15
x: int,16
y: int,17
종류: 엔티티종류,18
}20
// 그리기 목록의 ENT 토큰이 읽는 정수입니다. 페이지 셸과 맞물려 있어 값을 바꾸지 않습니다.21
export function 종류코드(대상: 엔티티) -> int {22
match 대상.종류 {23
case 없음 => -124
case 야생(_, _) => 025
case 인물(_) => 126
}27
}29
// 종류 필드만 넘기면 다른 모듈에서 타입이 맞지 않아 엔티티를 통째로 받습니다. 토파즈 과제 '다른 모듈 열거형 값을 그 모듈 함수에 넘기기' 의 우회입니다.30
export function 야생인가(대상: 엔티티) -> bool {31
match 대상.종류 {32
case 야생(_, _) => true33
case 없음 | 인물(_) => false34
}35
}37
export function 인물인가(대상: 엔티티) -> bool {38
match 대상.종류 {39
case 인물(_) => true40
case 없음 | 야생(_, _) => false41
}42
}44
function 빈칸인가(종류: 엔티티종류) -> bool {45
match 종류 {46
case 없음 => true47
case 야생(_, _) | 인물(_) => false48
}49
}51
export function 없는엔티티() -> 엔티티 {52
엔티티 { 아이디: 0, x: -1, y: -1, 종류: 엔티티종류.없음 }53
}55
// 대사는 그리기 목록의 TXT 토큰으로 나가므로 파이프 문자를 넣지 않습니다.56
// 연못은 시작 칸 (3,5) 에서 아래를 보고 시작하므로 바로 아래에 약한 야생을 두어 A 한 번에 첫 배틀이 열립니다.57
// 심층은 아이디를 10 부터 써서 맵이 함께 쓰는 처치 목록에서 연못과 겹치지 않고, 입구 (3,4) 에서 멀수록 레벨이 오릅니다.58
// 가장 가까운 Lv7 은 덜 자란 파티도 이길 수 있어 진행이 막히지 않습니다.59
export 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
}81
}83
export function 엔티티에서(맵아이디: string, x: int, y: int) -> 엔티티 {84
let 일치 = 엔티티목록(맵아이디).filter(대상 => 대상.x == x && 대상.y == y)85
if 일치.length > 0 { 일치[0] } else { 없는엔티티() }86
}88
export function 처치된것인가(처치된것들: Array<int>, 아이디: int) -> bool {89
아이디 in 처치된것들90
}92
// 이동, 상호작용, 그리기가 모두 이 함수로 칸을 보므로 잡거나 이긴 야생은 맵에서 사라집니다.93
export function 활성엔티티에서(맵아이디: string, x: int, y: int, 처치된것들: Array<int>) -> 엔티티 {94
let 대상 = 엔티티에서(맵아이디, x, y)95
if 처치된것인가(처치된것들, 대상.아이디) { 없는엔티티() } else { 대상 }96
}98
export function 활성엔티티칸인가(맵아이디: string, x: int, y: int, 처치된것들: Array<int>) -> bool {99
!빈칸인가(활성엔티티에서(맵아이디, x, y, 처치된것들).종류)100
}SHA256 e549eaa6dea5f958af585ad047c291a950e3343159a00594b0ab12ef4030bae3