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.7
import core.genome8
import core.creature9
import core.battle10
import core.evolution { 지배트레이트 }11
import core.rng { 난수범위 }12
import core.util { 범위가두기 }13
import data.species15
// 비트상한에 닿으면 안정도 비율이 높은 쪽이 이깁니다. 적 안정도가 최대의 30% 이하면 포자 정착을 시도합니다.16
export let 비트상한 = 817
let 포획문턱 = 3019
function 형질가두기(값: int) -> int {20
범위가두기(값, 0, genome.강도상한 - 1)21
}23
// 야생은 게놈이 없어 유도합니다. 크기는 레벨에 비례해 얕은 연못이 약하고 심연군주가 강하며, 어느 형질이 두드러지는지는 종과 시드가 정합니다.24
export function 적게놈유도(종아이디: int, 적레벨: int, 시드: string) -> genome.게놈 {25
let 풍미 = genome.게놈유도("{시드}#foe@{종아이디}")26
let 단위 = 적레벨 / 327
genome.게놈만들기(형질가두기(단위 + 풍미.색소 % 2), 형질가두기(단위 + 풍미.막 % 2), 형질가두기(단위 + 풍미.크기 % 2), 형질가두기(단위 + 풍미.대사 % 2), 형질가두기(단위 + 풍미.촉수 % 2))28
}30
// 플레이어 체력과 같은 곡선이라 양쪽이 공정하게 맞섭니다.31
export function 적안정도최대(적종: int, 적레벨: int) -> int {32
creature.최대체력(species.종찾기(적종), 적레벨)33
}35
function 형질문구(편: string, 형질: int) -> string {36
match 형질 {37
case 0 => "{편} 색소가 압력을 휘게 합니다"38
case 1 => "{편} 막이 버팁니다"39
case 2 => "{편} 부피가 버팁니다"40
case 3 => "{편} 대사가 갉아냅니다"41
case _ => "{편} 촉수가 파고듭니다"42
}43
}45
// 레벨, 진화 부스트, 세대를 더해 키운 만큼 강해집니다. 보스는 진화하지 않으므로 야생을 다 비운 플레이어가 보스를 이깁니다.46
function 공세(대상: genome.게놈, 레벨: int, 부스트: int, 세대: int) -> int {47
대상.대사 * 3 + 대상.촉수 * 2 + 대상.크기 + 레벨 * 2 + 부스트 * 3 + 세대 * 348
}50
function 방어(대상: genome.게놈, 레벨: int, 부스트: int, 세대: int) -> int {51
대상.막 * 3 + 대상.크기 + 레벨 + 부스트 * 2 + 세대 * 252
}54
export function 압력전시작(적종: int, 적레벨: int) -> battle.배틀상태 {55
{56
단계: "clash",57
메뉴커서: 0,58
기술커서: 0,59
전투카운터: 0,60
적체력: 적안정도최대(적종, 적레벨),61
메시지: "두 세포가 한 주머니에서 맞닿습니다.",62
메시지커서: 0,63
다음단계: "clash",64
결과: "",65
}66
}68
function 포자정착판정(시드: string, 비트: int, 적종: int, 적게놈: genome.게놈, 적안정도: int, 적최대: int, 볼: int, 내색소: int) -> bool {69
if 볼 <= 0 { return false }70
let 약화 = (적최대 - 적안정도) * 100 / (적최대 + 1)71
let 점수 = 볼 * 8 + 약화 + 내색소 * 2 - 적게놈.막 * 372
점수 > 난수범위("spore", 적종, 비트, 시드, 0, 100) + 4073
}75
function 비트결과(배틀: battle.배틀상태, 플레이어: creature.전투원, 단계: battle.배틀단계, 적체력: int, 메시지: string, 다음단계: battle.배틀다음단계, 결과: battle.배틀결과) -> battle.턴결과 {76
{77
배틀: 배틀{78
단계: 단계,79
기술커서: 0,80
적체력: 적체력,81
메시지: 메시지,82
메시지커서: 0,83
다음단계: 다음단계,84
결과: 결과,85
},86
플레이어: 플레이어,87
}88
}90
// 패배, 승리, 포자 정착, 비트상한 순으로 판정합니다. 포획은 숲의 뿌리를 몇 그루 심을 때만 원하고, 기본은 쓰러뜨려 경험과 드리프트로 초점을 키웁니다.91
export 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", "")116
}SHA256 e44de6f62e8dde0f8fb811da5fc1ce45e3db1cd533d43352e60c1ef80c45228d