STUDIO HAZE · jeniapp
Topaz source
Open by house policy. Topaz is our own language.
Topaz 5.20.2 · 63 files
apps/slow-monster/core/battle.tpz
Topaz · 4364 B · Original file
1
// 전투 하위 상태와 승리 뒤의 경험, 레벨업, 드리프트를 둡니다. 비트 계산은 삼투 압력전 모듈이 합니다.2
// 하위 상태는 단계, 메뉴커서, 기술커서, 전투카운터, 적체력, ";;" 로 이은 메시지와 그 커서, 다음단계, 결과이고 저장 문자열 안에 들어갑니다.3
// 실수와 난수를 쓰지 않는 순수 함수라 같은 전투원과 경험은 늘 같은 성장입니다.4
// 저장 토큰은 닫힌 태그로 좁히고 모르는 값은 메뉴나 진행 중으로 되돌립니다. 레벨은 99, 한 판의 레벨업은 20 에서 멈춰 피해 계산이 넘치지 않게 합니다.5
// Battle sub-state tags, the empty battle, message lines and post-win experience, level-up and drift.7
import core.creature8
import core.genome { 드리프트증가, 드리프트가두기 }9
import data.species11
// move 와 message 는 옛 메뉴 전투의 단계이며 옛 저장을 읽으려고 남깁니다.12
export type 배틀단계 = "menu" | "move" | "message" | "clash" | "result"13
export type 배틀다음단계 = "menu" | "field" | "catch" | "evolve" | "clash"14
export type 배틀결과 = "" | "win" | "lose" | "fled" | "caught"16
export function 단계파싱(토큰: string) -> 배틀단계 {17
match 토큰 {18
case "move" => "move"19
case "message" => "message"20
case "clash" => "clash"21
case "result" => "result"22
case _ => "menu"23
}24
}26
export function 다음단계파싱(토큰: string) -> 배틀다음단계 {27
match 토큰 {28
case "field" => "field"29
case "catch" => "catch"30
case "evolve" => "evolve"31
case "clash" => "clash"32
case _ => "menu"33
}34
}36
export function 결과파싱(토큰: string) -> 배틀결과 {37
match 토큰 {38
case "win" => "win"39
case "lose" => "lose"40
case "fled" => "fled"41
case "caught" => "caught"42
case _ => ""43
}44
}46
// 압력전에서 메뉴커서는 압력이고 전투카운터는 비트 번호입니다.47
export type 배틀상태 = {48
단계: 배틀단계,49
메뉴커서: int,50
기술커서: int,51
전투카운터: int,52
적체력: int,53
메시지: string,54
메시지커서: int,55
다음단계: 배틀다음단계,56
결과: 배틀결과,57
}59
export type 턴결과 = { 배틀: 배틀상태, 플레이어: creature.전투원 }60
export type 성장결과 = { 전투원: creature.전투원, 오른레벨: int }62
export function 빈배틀() -> 배틀상태 {63
{64
단계: "menu",65
메뉴커서: 0,66
기술커서: 0,67
전투카운터: 0,68
적체력: 0,69
메시지: "",70
메시지커서: 0,71
다음단계: "menu",72
결과: "",73
}74
}76
// 커서가 범위 밖이면 빈 줄입니다.77
export function 메시지줄(메시지: string, 커서: int) -> string {78
if 메시지 == "" { return "" }79
let 줄들 = 메시지.split(";;")80
if 커서 < 0 || 커서 >= 줄들.length { "" } else { 줄들[커서] }81
}83
// 레벨이 오를 때마다 늘어난 최대체력만큼 현재체력도 채웁니다. 진화 부스트는 상수라 레벨마다의 체력 증가에 끼지 않습니다.84
// 드리프트는 승리 전 값에 이번 승리의 증가를 더합니다. 데모 플래그는 셸에서 여기까지 전해집니다.85
export function 경험적용(대상: creature.전투원, 얻은경험: int, 데모: bool) -> 성장결과 {86
let 종정보 = species.종찾기(대상.종아이디)87
let mut 레벨 = 대상.레벨88
let mut 경험 = 대상.경험 + 얻은경험89
let mut 체력 = 대상.현재체력90
let mut 오른 = 091
while 오른 < 20 && 레벨 < 99 && 경험 >= creature.다음레벨필요경험(레벨) {92
경험 -= creature.다음레벨필요경험(레벨)93
체력 += creature.최대체력(종정보, 레벨 + 1) - creature.최대체력(종정보, 레벨)94
레벨 += 195
오른 += 196
}97
let 부스트 = 대상.스탯부스트98
let 새최대 = creature.최대체력(종정보, 레벨) + 부스트 * 299
{100
전투원: 대상{101
레벨: 레벨,102
경험: 경험,103
현재체력: 체력.atMost(새최대),104
최대체력: 새최대,105
공격: 종정보.기본공격 + 레벨 + 부스트,106
방어: 종정보.기본방어 + 레벨 + 부스트,107
속도: 종정보.기본속도 + 레벨 + 부스트,108
드리프트: 드리프트가두기(대상.드리프트 + 드리프트증가(오른, true, 데모)),109
},110
오른레벨: 오른,111
}112
}SHA256 fe0f6619b903be29ccb249442ff5d305180a6d03679f1cb5bdaaf7bfdc395797