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

Topaz · 7082 B · Original file

1// 삼투 압력전입니다. 두 미생물이 한 주머니에서 서로를 흔들고, 메뉴 없이 키운 게놈이 곧 전투력입니다.
2// 형질의 역할은 색소 적응, 막 응집, 크기 부피, 대사 부식, 촉수 템포입니다. 내 안정도는 전투원 현재체력, 적 안정도는 배틀 적체력, 압력 -100~100 은 배틀 메뉴커서, 비트 번호는 전투카운터에 둡니다.
3// 비트 하나를 시드, 비트 번호, 양쪽 게놈만으로 계산하므로 같은 상태는 늘 같은 다음 비트입니다.
4// 그리기는 하지 않습니다. 페이지가 비트마다 결과를 영화처럼 그립니다.
5// Osmosis clash: a deterministic, menu-free battle where the cultivated genome decides each beat.
7import core.genome
8import core.creature
9import core.battle
10import core.evolution { 지배트레이트 }
11import core.rng { 난수범위 }
12import core.util { 범위가두기 }
13import data.species
15// 비트상한에 닿으면 안정도 비율이 높은 쪽이 이깁니다. 적 안정도가 최대의 30% 이하면 포자 정착을 시도합니다.
16export let 비트상한 = 8
17let 포획문턱 = 30
19function 형질가두기(값: int) -> int {
20 범위가두기(값, 0, genome.강도상한 - 1)
23// 야생은 게놈이 없어 유도합니다. 크기는 레벨에 비례해 얕은 연못이 약하고 심연군주가 강하며, 어느 형질이 두드러지는지는 종과 시드가 정합니다.
24export function 적게놈유도(종아이디: int, 적레벨: int, 시드: string) -> genome.게놈 {
25 let 풍미 = genome.게놈유도("{시드}#foe@{종아이디}")
26 let 단위 = 적레벨 / 3
27 genome.게놈만들기(형질가두기(단위 + 풍미.색소 % 2), 형질가두기(단위 + 풍미.막 % 2), 형질가두기(단위 + 풍미.크기 % 2), 형질가두기(단위 + 풍미.대사 % 2), 형질가두기(단위 + 풍미.촉수 % 2))
30// 플레이어 체력과 같은 곡선이라 양쪽이 공정하게 맞섭니다.
31export function 적안정도최대(적종: int, 적레벨: int) -> int {
32 creature.최대체력(species.종찾기(적종), 적레벨)
35function 형질문구(편: string, 형질: int) -> string {
36 match 형질 {
37 case 0 => "{편} 색소가 압력을 휘게 합니다"
38 case 1 => "{편} 막이 버팁니다"
39 case 2 => "{편} 부피가 버팁니다"
40 case 3 => "{편} 대사가 갉아냅니다"
41 case _ => "{편} 촉수가 파고듭니다"
42 }
45// 레벨, 진화 부스트, 세대를 더해 키운 만큼 강해집니다. 보스는 진화하지 않으므로 야생을 다 비운 플레이어가 보스를 이깁니다.
46function 공세(대상: genome.게놈, 레벨: int, 부스트: int, 세대: int) -> int {
47 대상.대사 * 3 + 대상.촉수 * 2 + 대상.크기 + 레벨 * 2 + 부스트 * 3 + 세대 * 3
50function 방어(대상: genome.게놈, 레벨: int, 부스트: int, 세대: int) -> int {
51 대상.막 * 3 + 대상.크기 + 레벨 + 부스트 * 2 + 세대 * 2
54export function 압력전시작(적종: int, 적레벨: int) -> battle.배틀상태 {
55 {
56 단계: "clash",
57 메뉴커서: 0,
58 기술커서: 0,
59 전투카운터: 0,
60 적체력: 적안정도최대(적종, 적레벨),
61 메시지: "두 세포가 한 주머니에서 맞닿습니다.",
62 메시지커서: 0,
63 다음단계: "clash",
64 결과: "",
65 }
68function 포자정착판정(시드: string, 비트: int, 적종: int, 적게놈: genome.게놈, 적안정도: int, 적최대: int, 볼: int, 내색소: int) -> bool {
69 if 볼 <= 0 { return false }
70 let 약화 = (적최대 - 적안정도) * 100 / (적최대 + 1)
71 let 점수 = 볼 * 8 + 약화 + 내색소 * 2 - 적게놈.막 * 3
72 점수 > 난수범위("spore", 적종, 비트, 시드, 0, 100) + 40
75function 비트결과(배틀: battle.배틀상태, 플레이어: creature.전투원, 단계: battle.배틀단계, 적체력: int, 메시지: string, 다음단계: battle.배틀다음단계, 결과: battle.배틀결과) -> battle.턴결과 {
76 {
77 배틀: 배틀{
78 단계: 단계,
79 기술커서: 0,
80 적체력: 적체력,
81 메시지: 메시지,
82 메시지커서: 0,
83 다음단계: 다음단계,
84 결과: 결과,
85 },
86 플레이어: 플레이어,
87 }
90// 패배, 승리, 포자 정착, 비트상한 순으로 판정합니다. 포획은 숲의 뿌리를 몇 그루 심을 때만 원하고, 기본은 쓰러뜨려 경험과 드리프트로 초점을 키웁니다.
91export function 비트진행(시드: string, 직전배틀: battle.배틀상태, 활성: creature.전투원, 적종: int, 적레벨: int, 볼: int, 포획원함: bool) -> battle.턴결과 {
92 let 비트 = 직전배틀.전투카운터
93 let 적최대 = 적안정도최대(적종, 적레벨)
94 let 내게놈 = genome.표현형(활성.게놈, 활성.계통시드, 활성.드리프트)
95 let 적게놈 = 적게놈유도(적종, 적레벨, 시드)
96 // 4 로 나눠 한 판이 5~8 비트 이어지게 하고 적 피해는 최소 2 로 진행을 보장합니다. 색소는 받는 피해를 줄입니다.
97 let 적피해 = ((공세(내게놈, 활성.레벨, 활성.스탯부스트, 활성.세대) - 방어(적게놈, 적레벨, 0, 0)) / 4 + 난수범위("clash_p", 적종, 비트, 시드, 0, 2)).atLeast(2)
98 let 내피해 = ((공세(적게놈, 적레벨, 0, 0) - 방어(내게놈, 활성.레벨, 활성.스탯부스트, 활성.세대)) / 4 + 난수범위("clash_f", 적종, 비트, 시드, 0, 2) - 내게놈.색소 / 2).atLeast(0)
99 let 새적 = 직전배틀.적체력 - 적피해
100 let 새체력 = (활성.현재체력 - 내피해).atLeast(0)
101 let 다음배틀 = 직전배틀{ 메뉴커서: 범위가두기(직전배틀.메뉴커서 + (적피해 - 내피해), -100, 100), 전투카운터: 비트 + 1 }
102 let 새활성 = creature.체력설정(활성, 새체력)
103 if 새체력 <= 0 { return 비트결과(다음배틀, 새활성, "result", 새적, "버티지 못하고 흩어집니다.", "field", "lose") }
104 if 새적 <= 0 { return 비트결과(다음배틀, 새활성, "result", 0, "상대가 더는 응집하지 못합니다.", "field", "win") }
105 if 포획원함 && 새적 * 100 <= 적최대 * 포획문턱 && 포자정착판정(시드, 비트, 적종, 적게놈, 새적, 적최대, 볼, 내게놈.색소) {
106 return 비트결과(다음배틀, 새활성, "result", 새적, "포자가 상대를 감싸 정착시킵니다.", "catch", "caught")
107 }
108 if 비트 + 1 >= 비트상한 {
109 let 내비율 = 새체력 * 100 / (활성.최대체력 + 1)
110 let 적비율 = 새적 * 100 / (적최대 + 1)
111 if 내비율 >= 적비율 { return 비트결과(다음배틀, 새활성, "result", 새적, "압력이 가라앉고, 당신 쪽이 더 안정적입니다.", "field", "win") }
112 return 비트결과(다음배틀, 새활성, "result", 새적, "압력이 가라앉고, 당신 쪽이 더 흔들립니다.", "field", "lose")
113 }
114 let 메시지 = "{형질문구("내", 지배트레이트(내게놈))} · {형질문구("적", 지배트레이트(적게놈))}"
115 비트결과(다음배틀, 새활성, "clash", 새적, 메시지, "clash", "")

SHA256 e44de6f62e8dde0f8fb811da5fc1ce45e3db1cd533d43352e60c1ef80c45228d