Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
growth.c
Go to the documentation of this file.
1/* A partner's growth: its stats at a new level, its exp and levels, the
2 Digimon it learns, its Digimon's exp, levels and skills. */
3
4#include "battle/report.h"
5
6/* Raises a partner's max HP, max MP, battle stats and, up to level 40, its
7 resistances for a new level, by its growth (DIGIMON_DATA) and at random */
8void STFGTREP_raiseStats(s32 partner, s32 level) {
9 PartnerStats *stats = GAME.funcs.getPartnerStats(partner);
10 DigimonData *digimon = &DIGIMON_DATA[partner];
11 s32 tier;
12 s32 i;
13 s32 growth;
14 s32 gain;
15 s16 *values;
16
17 if (level < 5) {
18 tier = 0;
19 } else if (level < 20) {
20 tier = 1;
21 } else if (level < 40) {
22 tier = 2;
23 } else {
24 tier = 3;
25 }
26 /* read into a variable of its own: the match depends on it, since the
27 original reads the growth before it calls RANDOM.next and adds the
28 gain as a whole */
29 growth = digimon->hpGrowth;
30 gain = growth - STFGTREP_vitalCuts[tier] + STFGTREP_vitalRandom[RANDOM.next() % 9];
31 stats->stats[STAT_MAX_HP] += gain;
32 if (stats->stats[STAT_MAX_HP] >= 10000) {
33 stats->stats[STAT_MAX_HP] = 9999;
34 }
35 growth = digimon->mpGrowth;
36 gain = growth - STFGTREP_vitalCuts[tier] + STFGTREP_vitalRandom[RANDOM.next() % 9];
37 stats->stats[STAT_MAX_MP] += gain;
38 if (stats->stats[STAT_MAX_MP] >= 10000) {
39 stats->stats[STAT_MAX_MP] = 9999;
40 }
41 values = stats->stats;
42 if (level < 5) {
43 tier = 0;
44 } else if (level < 20) {
45 tier = 1;
46 } else if (level < 40) {
47 tier = 2;
48 } else if (level < 60) {
49 tier = 3;
50 } else if (level < 80) {
51 tier = 4;
52 } else {
53 tier = 5;
54 }
55 for (i = 0; i < 6; i++) {
56 growth = digimon->statGrowth[i];
57 gain = STFGTREP_statGains[tier][growth + RANDOM.next() % 5];
58 values[6 + i] += gain;
59 if (values[6 + i] >= 1000) {
60 values[6 + i] = 999;
61 }
62 }
63 if (level < 41) {
64 for (i = 0; i < 7; i++) {
65 growth = digimon->resistGrowth[i];
66 gain = STFGTREP_resistGains[growth + RANDOM.next() % 4];
67 values[12 + i] += gain;
68 if (values[12 + i] >= 1000) {
69 values[12 + i] = 999;
70 }
71 }
72 }
73}
74
75/* Adds exp to a partner and raises its level, and its stats with it, as far
76 as the exp reaches; whether it went up */
77s32 STFGTREP_addExp(s32 partner, s32 exp) {
78 PartnerStats *stats = GAME.funcs.getPartnerStats(partner);
79 DigimonData *digimon = &DIGIMON_DATA[partner];
80 s32 leveled;
81 s32 level;
82 s32 tier;
83 s32 up;
84
85 stats->exp += exp;
86 if (stats->exp > 999999) {
87 stats->exp = 999999;
88 }
89 leveled = 0;
90 /* two statements: the match depends on it, since the level is loaded
91 into the register that counts the levels */
92 level = stats->stats[STAT_LEVEL];
93 level++;
94 do {
95 if (level < 5) {
96 tier = 0;
97 } else if (level < 20) {
98 tier = 1;
99 } else if (level < 40) {
100 tier = 2;
101 } else if (level < 100) {
102 tier = 3;
103 } else {
104 break;
105 }
106 if ((level * level * level + level * 5 - 6) * digimon->expRate / 10 + STFGTREP_levelExp[tier] < stats->exp) {
107 if (++stats->stats[STAT_LEVEL] < 100) {
108 STFGTREP_raiseStats(partner, stats->stats[STAT_LEVEL]);
109 } else {
110 stats->stats[STAT_LEVEL] = 99;
111 }
112 stats->stats[STAT_TP] += 5;
113 if (stats->stats[STAT_TP] >= 100) {
114 stats->stats[STAT_TP] = 99;
115 }
116 leveled = 1;
117 up = 1;
118 } else {
119 up = 0;
120 }
121 level++;
122 } while (up);
123 return leveled;
124}
125
126/* Gives a partner the first Digimon of its evolution list (STFGTREP_evolutions)
127 it hasn't yet and whose needs it meets: the Digimon it must have at a
128 level, and a stat (1-6 battle stats, 7 the level, 8-14 resistances) of at
129 least a value. The Digimon also takes the first free slot (below 3); the
130 Digimon, or 0 */
132 PartnerEntry entry;
133 s16 slots[3];
134 PartnerStats *stats;
135 Evolution *list;
136 s32 n;
137 s32 id;
138 s32 i;
139 s32 j;
140
141 list = STFGTREP_evolutions[partner];
142 for (n = 0; n < 44; n++) {
143 id = DIGIMON_DATA[list[n].digimon - 1].id;
144 if (GAME.funcs.getPartnerEntry(partner, id, &entry) >= 0 || id <= 0) {
145 continue;
146 }
147 for (i = 0; i < 2; i++) {
148 if (list[n].needs[i].digimon != 0) {
149 if (GAME.funcs.getPartnerEntry(partner, DIGIMON_DATA[list[n].needs[i].digimon - 1].id, &entry) == -1) {
150 id = -1;
151 } else if (entry.level < list[n].needs[i].level) {
152 id = -1;
153 }
154 }
155 }
156 if (id <= 0) {
157 continue;
158 }
159 if (list[n].stat != 0) {
160 stats = GAME.funcs.getPartnerStats(partner);
161 /* pointer sums, not stats[stat + 5]: the match depends on them,
162 which add the 5 and the 4 to the load's offset */
163 if (list[n].stat < 7) {
164 if (*(stats->stats + list[n].stat + 5) < list[n].value) {
165 id = -1;
166 }
167 } else if (list[n].stat == 7) {
168 if (stats->stats[STAT_LEVEL] < list[n].value) {
169 id = -1;
170 }
171 } else if (list[n].stat >= 8) {
172 if (*(stats->stats + list[n].stat + 4) < list[n].value) {
173 id = -1;
174 }
175 }
176 }
177 if (id <= 0) {
178 continue;
179 }
180 GAME.funcs.addPartnerEntry(partner, id);
181 GAME.funcs.getPartnerSlots(partner, slots);
182 for (j = 0; j < 3; j++) {
183 if (slots[j] < 3) {
184 slots[j] = id;
185 GAME.funcs.setPartnerSlots(partner, slots);
186 break;
187 }
188 }
189 return id;
190 }
191 return 0;
192}
193
194/* Adds exp to one of a partner's Digimon and raises its level as far as the
195 exp reaches, up to 99; whether it went up */
197 DigimonData *digimon = GET_DIGIMON(id);
198 PartnerEntry entry;
199 s32 leveled;
200 s32 need;
201 s32 up;
202 s32 n;
203
204 GAME.funcs.getPartnerEntry(partner, id, &entry);
205 entry.exp += exp;
206 if (entry.exp > 9999999) {
207 entry.exp = 9999999;
208 }
209 if (entry.level >= 99) {
210 return 0;
211 }
212 leveled = 0;
213 do {
214 /* 10 exp a level up to expLevel, 50 after it */
215 if (digimon->expLevel >= entry.level + 1) {
216 need = entry.level * 10;
217 } else {
218 n = digimon->expLevel - 1;
219 need = n * 10 + (entry.level - n) * 50;
220 }
221 up = 0;
222 if (entry.exp >= need) {
223 leveled = 1;
224 entry.level++;
225 up = entry.level < 99;
226 }
227 } while (up);
228 GAME.funcs.setPartnerEntry(partner, id, &entry);
229 return leveled;
230}
231
232/* Gives one of a partner's Digimon the first skill whose level it has
233 reached and that it hasn't yet (DigimonData.skills); the skill, or 0 */
235 PartnerEntry entry;
236 DigimonData *digimon;
237 s32 i;
238
239 GAME.funcs.getPartnerEntry(partner, id, &entry);
240 for (i = 0; i < 6; i++) {
241 if (entry.skills[i] == 0) {
242 digimon = GET_DIGIMON(id);
243 if (digimon->skills[i + 1] != 0 && entry.level >= digimon->skillLevels[i]) {
244 entry.skills[i] = digimon->skills[i + 1];
245 if (i == 5) {
246 entry.skills[i] |= SKILL_LAST;
247 }
248 GAME.funcs.setPartnerEntry(partner, id, &entry);
249 return digimon->skills[i + 1];
250 }
251 }
252 }
253 return 0;
254}
255
256/* Marks known (SKILL_KNOWN) the first skill of one of a partner's Digimon whose
257 level it has reached (DigimonData.knownLevels); the skill, or 0 */
259 PartnerEntry entry;
260 DigimonData *digimon;
261 s32 i;
262
263 GAME.funcs.getPartnerEntry(partner, id, &entry);
264 digimon = GET_DIGIMON(id);
265 for (i = 0; i < 5; i++) {
266 if (entry.skills[i] > 0 && !(entry.skills[i] & SKILL_KNOWN) && entry.level >= digimon->knownLevels[i]) {
267 entry.skills[i] |= SKILL_KNOWN;
268 GAME.funcs.setPartnerEntry(partner, id, &entry);
269 return entry.skills[i] & SKILL_ID;
270 }
271 }
272 return 0;
273}
274
275/* The exp one of a partner's Digimon gets of a battle's: less as the partner
276 goes up in level, shared by the Digimon used, at least 1 and at most 10,
277 or 50 once the Digimon is past its expLevel */
278s32 STFGTREP_getDigimonExp(s32 partner, s32 id, s32 exp, s32 used) {
279 PartnerEntry entry;
280 DigimonData *digimon;
281 s32 level = GAME.funcs.getPartnerStats(partner)->stats[STAT_LEVEL];
282 s32 share;
283 s32 n;
284 s32 tenfold;
285
286 /* computed apart: the match depends on it, since the original multiplies
287 before it compares the level */
288 tenfold = exp * 10;
289 if (level < 51) {
290 n = tenfold / level;
291 } else {
292 n = exp / 5;
293 }
294 switch (used) {
295 case 0:
296 case 1:
297 share = n;
298 break;
299 case 2:
300 share = n * 6 / 10;
301 break;
302 default:
303 share = n / used;
304 break;
305 }
306 digimon = GET_DIGIMON(id);
307 GAME.funcs.getPartnerEntry(partner, id, &entry);
308 if (share <= 0) {
309 share = 1;
310 } else if (entry.level < digimon->expLevel) {
311 if (share > 10) {
312 share = 10;
313 }
314 } else if (share > 50) {
315 share = 50;
316 }
317 return share;
318}
signed int s32
Definition common.h:11
signed short s16
Definition common.h:9
DigimonData DIGIMON_DATA[55]
55 entries: the 52 Digimon, then three placeholders (0x1D4-0x1D6)
Definition digimon.c:7
GameState GAME
The save data, the game mode and the methods.
Definition state.c:64
#define STAT_MAX_HP
Definition game_state.h:282
#define SKILL_KNOWN
Definition game_state.h:256
#define STAT_TP
what the training's intensities cost
Definition game_state.h:280
#define STAT_LEVEL
Indices of a partner's stats (PartnerStats.stats, computeStats, setStat)
Definition game_state.h:279
#define STAT_MAX_MP
Definition game_state.h:284
#define SKILL_LAST
the sixth skill
Definition game_state.h:258
#define SKILL_ID
PartnerEntry.skills.
Definition game_state.h:255
DigimonData *(* GET_DIGIMON)(s32 id)
getDigimon for the overlays, in the small data (.sdata) between game/items.c's and file/file_table....
Definition get_digimon.c:10
s32 STFGTREP_addDigimonExp(s32 partner, s32 id, s32 exp)
Adds exp to one of a partner's Digimon and raises its level as far as the exp reaches,...
Definition growth.c:196
void STFGTREP_raiseStats(s32 partner, s32 level)
Raises a partner's max HP, max MP, battle stats and, up to level 40, its resistances for a new level,...
Definition growth.c:8
s32 STFGTREP_learnSkill(s32 partner, s32 id)
Marks known (SKILL_KNOWN) the first skill of one of a partner's Digimon whose level it has reached (D...
Definition growth.c:258
s32 STFGTREP_addSkill(s32 partner, s32 id)
Gives one of a partner's Digimon the first skill whose level it has reached and that it hasn't yet (D...
Definition growth.c:234
s32 STFGTREP_getDigimonExp(s32 partner, s32 id, s32 exp, s32 used)
The exp one of a partner's Digimon gets of a battle's: less as the partner goes up in level,...
Definition growth.c:278
s32 STFGTREP_learnDigimon(s32 partner)
Gives a partner the first Digimon of its evolution list (STFGTREP_evolutions) it hasn't yet and whose...
Definition growth.c:131
s32 STFGTREP_addExp(s32 partner, s32 exp)
Adds exp to a partner and raises its level, and its stats with it, as far as the exp reaches; whether...
Definition growth.c:77
Random RANDOM
Definition random.c:533
STFGTREP.PRO: mode 0x1400, the report after a battle.
Evolution * STFGTREP_evolutions[]
each partner's (STFGTREP_learnDigimon)
Definition stfgtrep.c:1054
s32 STFGTREP_resistGains[]
A resistance's gain, from its growth plus 0-3 at random.
Definition stfgtrep.c:1094
s32 STFGTREP_statGains[][9]
A battle stat's gain by tier, from its growth plus 0-4 at random.
Definition stfgtrep.c:1086
s32 STFGTREP_levelExp[]
What a level adds to the exp the next one needs, by tier.
Definition stfgtrep.c:1075
s32 STFGTREP_vitalRandom[]
Definition stfgtrep.c:1081
s32 STFGTREP_vitalCuts[]
What is taken from the HP and MP growth, by tier, and added at random.
Definition stfgtrep.c:1078
Digimon definition (DIGIMON_DATA, 52 of them; the first 8 are the partners)
Definition game_state.h:86
u8 resistGrowth[7]
1-5: how fast the gyms raise them
Definition game_state.h:103
u16 skills[7]
[1]-[6] are learnt at skillLevels
Definition game_state.h:90
u8 expLevel
the level after which its exp grows faster
Definition game_state.h:95
u8 expRate
a partner's exp per level, in tenths
Definition game_state.h:97
u8 hpGrowth
what a partner's max HP grows by a level
Definition game_state.h:100
u8 skillLevels[6]
Definition game_state.h:93
u8 statGrowth[6]
columns of the growth tables
Definition game_state.h:102
u8 knownLevels[5]
the levels that mark an entry's skills[0]-[4] known
Definition game_state.h:94
A Digimon a partner can learn, once the conditions are met.
Definition report.h:31
struct Evolution::@5 needs[2]
s16 value
the least the stat must be
Definition report.h:38
s16 stat
1-6 battle stats, 7 level, 8-14 resistances
Definition report.h:37
s32 digimon
DIGIMON_DATA index + 1.
Definition report.h:32
s16 level
Definition report.h:35
s32(* setPartnerEntry)()
Definition game_state.h:37
s32(* getPartnerEntry)()
-1 if it hasn't the Digimon
Definition game_state.h:36
struct PartnerStats *(* getPartnerStats)(s32 partner)
Definition game_state.h:38
s32(* addPartnerEntry)()
(partner, id): 0 if it has it or has no room
Definition game_state.h:35
void(* setPartnerSlots)()
Definition game_state.h:33
s32(* getPartnerSlots)()
(partner, s16 *out): the count
Definition game_state.h:32
GameFuncs funcs
Definition game_state.h:582
One of a partner's Digimon (getPartnerEntry, setPartnerEntry)
Definition game_state.h:247
s8 level
shown in the lab; 1 when added
Definition game_state.h:249
s16 skills[6]
SKILL_ID and the flags below, 0 for none.
Definition game_state.h:251
A partner Digimon from its name on (Partner.info), as getPartnerStats gives it.
Definition game_state.h:303
s16 stats[19]
Definition game_state.h:306
s32(* next)(void)
0 to RANDOM_COUNT - 1
Definition random.h:15