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/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.
7import core.creature
8import core.genome { 드리프트증가, 드리프트가두기 }
9import data.species
11// move 와 message 는 옛 메뉴 전투의 단계이며 옛 저장을 읽으려고 남깁니다.
12export type 배틀단계 = "menu" | "move" | "message" | "clash" | "result"
13export type 배틀다음단계 = "menu" | "field" | "catch" | "evolve" | "clash"
14export type 배틀결과 = "" | "win" | "lose" | "fled" | "caught"
16export function 단계파싱(토큰: string) -> 배틀단계 {
17 match 토큰 {
18 case "move" => "move"
19 case "message" => "message"
20 case "clash" => "clash"
21 case "result" => "result"
22 case _ => "menu"
23 }
26export function 다음단계파싱(토큰: string) -> 배틀다음단계 {
27 match 토큰 {
28 case "field" => "field"
29 case "catch" => "catch"
30 case "evolve" => "evolve"
31 case "clash" => "clash"
32 case _ => "menu"
33 }
36export function 결과파싱(토큰: string) -> 배틀결과 {
37 match 토큰 {
38 case "win" => "win"
39 case "lose" => "lose"
40 case "fled" => "fled"
41 case "caught" => "caught"
42 case _ => ""
43 }
46// 압력전에서 메뉴커서는 압력이고 전투카운터는 비트 번호입니다.
47export type 배틀상태 = {
48 단계: 배틀단계,
49 메뉴커서: int,
50 기술커서: int,
51 전투카운터: int,
52 적체력: int,
53 메시지: string,
54 메시지커서: int,
55 다음단계: 배틀다음단계,
56 결과: 배틀결과,
59export type 턴결과 = { 배틀: 배틀상태, 플레이어: creature.전투원 }
60export type 성장결과 = { 전투원: creature.전투원, 오른레벨: int }
62export function 빈배틀() -> 배틀상태 {
63 {
64 단계: "menu",
65 메뉴커서: 0,
66 기술커서: 0,
67 전투카운터: 0,
68 적체력: 0,
69 메시지: "",
70 메시지커서: 0,
71 다음단계: "menu",
72 결과: "",
73 }
76// 커서가 범위 밖이면 빈 줄입니다.
77export function 메시지줄(메시지: string, 커서: int) -> string {
78 if 메시지 == "" { return "" }
79 let 줄들 = 메시지.split(";;")
80 if 커서 < 0 || 커서 >= 줄들.length { "" } else { 줄들[커서] }
83// 레벨이 오를 때마다 늘어난 최대체력만큼 현재체력도 채웁니다. 진화 부스트는 상수라 레벨마다의 체력 증가에 끼지 않습니다.
84// 드리프트는 승리 전 값에 이번 승리의 증가를 더합니다. 데모 플래그는 셸에서 여기까지 전해집니다.
85export function 경험적용(대상: creature.전투원, 얻은경험: int, 데모: bool) -> 성장결과 {
86 let 종정보 = species.종찾기(대상.종아이디)
87 let mut 레벨 = 대상.레벨
88 let mut 경험 = 대상.경험 + 얻은경험
89 let mut 체력 = 대상.현재체력
90 let mut 오른 = 0
91 while 오른 < 20 && 레벨 < 99 && 경험 >= creature.다음레벨필요경험(레벨) {
92 경험 -= creature.다음레벨필요경험(레벨)
93 체력 += creature.최대체력(종정보, 레벨 + 1) - creature.최대체력(종정보, 레벨)
94 레벨 += 1
95 오른 += 1
96 }
97 let 부스트 = 대상.스탯부스트
98 let 새최대 = creature.최대체력(종정보, 레벨) + 부스트 * 2
99 {
100 전투원: 대상{
101 레벨: 레벨,
102 경험: 경험,
103 현재체력: 체력.atMost(새최대),
104 최대체력: 새최대,
105 공격: 종정보.기본공격 + 레벨 + 부스트,
106 방어: 종정보.기본방어 + 레벨 + 부스트,
107 속도: 종정보.기본속도 + 레벨 + 부스트,
108 드리프트: 드리프트가두기(대상.드리프트 + 드리프트증가(오른, true, 데모)),
109 },
110 오른레벨: 오른,
111 }

SHA256 fe0f6619b903be29ccb249442ff5d305180a6d03679f1cb5bdaaf7bfdc395797