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/creature.tpz

Topaz · 6362 B · Original file

1// 전투원 레코드와 스탯 유도, 레벨과 경험 곡선을 둡니다. 파티와 야생이 같은 타입을 씁니다.
2// 스탯은 정수 공식으로 유도합니다. 최대체력 = 기본체력 + 레벨 * 2 + 부스트 * 2, 공격 방어 속도 = 기본치 + 레벨 + 부스트. 다음 레벨까지 레벨 * 8, 처치 경험은 적 레벨 * 14 입니다.
3// 실수를 쓰지 않는 순수 함수라 같은 종, 레벨, 저장값은 늘 같은 전투원입니다.
4// 저장 문자열을 읽거나 쓰지 않습니다. 복원할 때 모든 저장값을 가둬 손상된 상태가 정수 넘침을 일으키지 않게 합니다.
5// Combatant record, integer stat derivation, level and experience curve, and clamped restore.
7import data.species
8import core.genome
9import core.util { 범위가두기 }
11// 저장하는 값은 레벨, 경험, 현재체력, 계통시드, 드리프트와 진화 상태이고 나머지 스탯은 그때마다 유도합니다.
12// 진화하면 게놈이 더는 계통시드의 함수가 아니므로 돌연변이 게놈을 저장합니다. 형태이름 "" 은 미진화입니다.
13export type 전투원 = {
14 종아이디: int,
15 레벨: int,
16 경험: int,
17 현재체력: int,
18 최대체력: int,
19 공격: int,
20 방어: int,
21 속도: int,
22 속성: int,
23 스프라이트: int,
24 기술1: int,
25 기술2: int,
26 기술3: int,
27 기술4: int,
28 계통시드: string,
29 드리프트: int,
30 게놈: genome.게놈,
31 세대: int,
32 진화카운터: int,
33 형태이름: string,
34 스탯부스트: int,
37export function 최대체력(종정보: species.종, 레벨: int) -> int {
38 종정보.기본체력 + 레벨 * 2
41export function 다음레벨필요경험(레벨: int) -> int {
42 레벨 * 8
45export function 획득경험(적레벨: int) -> int {
46 적레벨 * 14
49// 조작된 저장의 거대한 레벨이 피해 계산의 정수를 넘기지 않게 가둡니다.
50export function 레벨가두기(레벨: int) -> int {
51 범위가두기(레벨, 1, 99)
54// 시작종과 갓 잡은 야생이 쓰는 생성자입니다. 체력은 가득, 드리프트 0, 미진화로 태어납니다.
55export function 종에서전투원(아이디: int, 레벨: int, 계통시드: string) -> 전투원 {
56 let 종정보 = species.종찾기(아이디)
57 let 가둔레벨 = 레벨가두기(레벨)
58 let 체력상한 = 최대체력(종정보, 가둔레벨)
59 {
60 종아이디: 종정보.아이디,
61 레벨: 가둔레벨,
62 경험: 0,
63 현재체력: 체력상한,
64 최대체력: 체력상한,
65 공격: 종정보.기본공격 + 가둔레벨,
66 방어: 종정보.기본방어 + 가둔레벨,
67 속도: 종정보.기본속도 + 가둔레벨,
68 속성: 종정보.속성,
69 스프라이트: 종정보.스프라이트,
70 기술1: 종정보.기술1,
71 기술2: 종정보.기술2,
72 기술3: 종정보.기술3,
73 기술4: 종정보.기술4,
74 계통시드: 계통시드,
75 드리프트: 0,
76 게놈: genome.게놈유도(계통시드),
77 세대: 0,
78 진화카운터: 0,
79 형태이름: "",
80 스탯부스트: 0,
81 }
84export function 세대가두기(세대: int) -> int {
85 범위가두기(세대, 0, 99)
88export function 진화카운터가두기(카운터: int) -> int {
89 범위가두기(카운터, 0, 1000000)
92// 진화 한 번에 2~5 씩 올라 99 세대면 495 까지 갈 수 있지만 400 으로 가둬 공격이 500 근처를 넘지 않게 합니다.
93export function 스탯부스트가두기(부스트: int) -> int {
94 범위가두기(부스트, 0, 400)
97// 저장값에서 되살리거나 체력과 드리프트를 바꾼 전투원이 모두 거치는 가두기입니다. 종, 레벨, 부스트에서 스탯을 다시 유도하므로 원의 스탯 칸은 읽지 않습니다.
98// 미진화면 게놈을 계통시드에서 다시 유도하고 진화했으면 들고 있는 게놈을 씁니다.
99export function 전투원가두기(원: 전투원) -> 전투원 {
100 let 종정보 = species.종찾기(원.종아이디)
101 let 가둔레벨 = 레벨가두기(원.레벨)
102 let 가둔세대 = 세대가두기(원.세대)
103 let 부스트 = 스탯부스트가두기(원.스탯부스트)
104 let 체력상한 = 최대체력(종정보, 가둔레벨) + 부스트 * 2
105 let 기준게놈 = if 가둔세대 <= 0 { genome.게놈유도(원.계통시드) } else { 원.게놈 }
106 {
107 종아이디: 종정보.아이디,
108 레벨: 가둔레벨,
109 경험: 원.경험,
110 현재체력: 범위가두기(원.현재체력, 0, 체력상한),
111 최대체력: 체력상한,
112 공격: 종정보.기본공격 + 가둔레벨 + 부스트,
113 방어: 종정보.기본방어 + 가둔레벨 + 부스트,
114 속도: 종정보.기본속도 + 가둔레벨 + 부스트,
115 속성: 종정보.속성,
116 스프라이트: 종정보.스프라이트,
117 기술1: 종정보.기술1,
118 기술2: 종정보.기술2,
119 기술3: 종정보.기술3,
120 기술4: 종정보.기술4,
121 계통시드: 원.계통시드,
122 드리프트: genome.드리프트가두기(원.드리프트),
123 게놈: 기준게놈,
124 세대: 가둔세대,
125 진화카운터: 진화카운터가두기(원.진화카운터),
126 형태이름: 원.형태이름,
127 스탯부스트: 부스트,
128 }
131// 휴식은 체력만 채우고 레벨, 경험, 드리프트, 진화 형태는 그대로 둡니다.
132export function 회복(원: 전투원) -> 전투원 {
133 전투원가두기(원{ 현재체력: 원.최대체력 })
136export function 체력설정(원: 전투원, 새체력: int) -> 전투원 {
137 전투원가두기(원{ 현재체력: 새체력 })
140// 패배에서 배운 드리프트를 얹고 체력을 채웁니다.
141export function 드리프트설정(원: 전투원, 새드리프트: int) -> 전투원 {
142 전투원가두기(원{ 현재체력: 원.최대체력, 드리프트: genome.드리프트가두기(새드리프트) })
145// 종아이디 0 은 빈 파티 자리입니다.
146export function 빈전투원() -> 전투원 {
147 {
148 종아이디: 0,
149 레벨: 0,
150 경험: 0,
151 현재체력: 0,
152 최대체력: 0,
153 공격: 0,
154 방어: 0,
155 속도: 0,
156 속성: 0,
157 스프라이트: 0,
158 기술1: 0,
159 기술2: 0,
160 기술3: 0,
161 기술4: 0,
162 계통시드: "",
163 드리프트: 0,
164 게놈: genome.게놈유도(""),
165 세대: 0,
166 진화카운터: 0,
167 형태이름: "",
168 스탯부스트: 0,
169 }

SHA256 163407ce8181038b3e4c937fb9cf0a719e20fab020f77411c2946521e50a9e07