Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
partner.c
Go to the documentation of this file.
1#include "engine/game.h"
2
3/* The index of Digimon `id` among a partner's entries, or -1 */
4s32 findPartnerEntry(s32 partner, s32 id) {
5 s32 i;
6
7 for (i = 0; i < PARTNER_ENTRY_COUNT; i++) {
8 if (GAME.partners[partner].info.entries[i].id < FIRST_ENTRY_ID) {
9 continue;
10 }
11 if (GAME.partners[partner].info.entries[i].id == id) {
12 return i;
13 }
14 }
15 return -1;
16}
17
18/* Copies the ids of the Digimon a partner takes to battle; returns how many there are */
19s32 getPartnerSlots(s32 partner, s16 *out) {
20 s32 i;
21 s32 n;
22 s32 index;
23
24 for (i = 0, n = 0; i < PARTNER_SLOT_COUNT; i++) {
25 if (GAME.partners[partner].info.slots[i] >= FIRST_ENTRY_ID) {
26 index = findPartnerEntry(partner, GAME.partners[partner].info.slots[i]);
27 if (index >= 0 && GAME.partners[partner].info.entries[index].id >= FIRST_ENTRY_ID) {
28 out[n] = GAME.partners[partner].info.entries[index].id;
29 n++;
30 }
31 }
32 }
33 for (i = n; i < PARTNER_SLOT_COUNT; i++) {
34 out[i] = -1;
35 }
36 return n;
37}
38
39/* Picks the Digimon a partner takes to battle (-1 for ids it does not have) */
40void setPartnerSlots(s32 partner, s16 *ids) {
41 s32 i;
42 s32 index;
43
44 for (i = 0; i < PARTNER_SLOT_COUNT; i++) {
45 index = findPartnerEntry(partner, ids[i]);
46 if (index >= 0) {
47 GAME.partners[partner].info.slots[i] = GAME.partners[partner].info.entries[index].id;
48 } else {
49 GAME.partners[partner].info.slots[i] = -1;
50 }
51 }
52}
53
54/* Copies the ids of a partner's Digimon, zero-filled; returns how many there are */
55s32 listPartnerEntries(s32 partner, u16 *out) {
56 s32 i;
57 s32 n;
58 s32 count;
59
60 for (n = i = 0; i < PARTNER_ENTRY_COUNT; i++) {
61 if (GAME.partners[partner].info.entries[i].id >= FIRST_ENTRY_ID) {
62 out[n] = GAME.partners[partner].info.entries[i].id;
63 n++;
64 }
65 }
66 count = n;
67 for (; n < PARTNER_ENTRY_COUNT; n++) {
68 out[n] = 0;
69 }
70 return count;
71}
72
73/* Gives a partner Digimon `id` at level 1; 0 if it has it already or has no room */
74s32 addPartnerEntry(s32 partner, s32 id) {
75 s32 i;
76 s32 index;
77
78 if (findPartnerEntry(partner, id) != -1) {
79 return 0;
80 }
81 for (i = 0, index = -1; i < PARTNER_ENTRY_COUNT; i++) {
82 if (GAME.partners[partner].info.entries[i].id == 0) {
83 index = i;
84 break;
85 }
86 }
87 if (index == -1) {
88 return 0;
89 }
90 GET_DIGIMON(id); /* its result goes unused */
91 GAME.partners[partner].info.entries[index].id = id;
92 GAME.partners[partner].info.entries[index].level = 1;
93 return 1;
94}
95
96/* Copies a partner's Digimon `id`; returns its index, or -1 */
98 s32 i = findPartnerEntry(partner, id);
99
100 if (i != -1) {
101 *out = GAME.partners[partner].info.entries[i];
102 }
103 return i;
104}
105
106/* Overwrites a partner's Digimon `id`; returns its index, or -1 */
108 s32 i = findPartnerEntry(partner, id);
109
110 if (i != -1) {
111 GAME.partners[partner].info.entries[i] = *in;
112 }
113 return i;
114}
115
116/* A partner's name, stats and Digimon */
118 return &GAME.partners[partner].info;
119}
signed int s32
Definition common.h:11
signed short s16
Definition common.h:9
unsigned short u16
Definition common.h:10
s32 addPartnerEntry(s32 partner, s32 id)
Gives a partner Digimon id at level 1; 0 if it has it already or has no room.
Definition partner.c:74
PartnerStats * getPartnerStats(s32 partner)
A partner's name, stats and Digimon.
Definition partner.c:117
s32 getPartnerSlots(s32 partner, s16 *out)
Copies the ids of the Digimon a partner takes to battle; returns how many there are.
Definition partner.c:19
s32 listPartnerEntries(s32 partner, u16 *out)
Copies the ids of a partner's Digimon, zero-filled; returns how many there are.
Definition partner.c:55
void setPartnerSlots(s32 partner, s16 *ids)
Picks the Digimon a partner takes to battle (-1 for ids it does not have)
Definition partner.c:40
s32 findPartnerEntry(s32 partner, s32 id)
The index of Digimon id among a partner's entries, or -1.
Definition partner.c:4
s32 setPartnerEntry(s32 partner, s32 id, PartnerEntry *in)
Overwrites a partner's Digimon id; returns its index, or -1.
Definition partner.c:107
s32 getPartnerEntry(s32 partner, s32 id, PartnerEntry *out)
Copies a partner's Digimon id; returns its index, or -1.
Definition partner.c:97
GameState GAME
The save data, the game mode and the methods.
Definition state.c:64
#define FIRST_ENTRY_ID
The first PartnerEntry.id of a Digimon: 0 is a free entry, 1 and 2 unused ones.
Definition game_state.h:244
#define PARTNER_SLOT_COUNT
Definition game_state.h:241
#define PARTNER_ENTRY_COUNT
The Digimon a partner can have, and the ones it takes to battle.
Definition game_state.h:240
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
Partner partners[PARTNER_COUNT]
Definition game_state.h:517
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 id
FIRST_ENTRY_ID and up.
Definition game_state.h:248
A partner Digimon from its name on (Partner.info), as getPartnerStats gives it.
Definition game_state.h:303
s16 slots[4]
PARTNER_SLOT_COUNT entries picked from entries[].
Definition game_state.h:308
PartnerEntry entries[44]
Definition game_state.h:309
PartnerStats info
Definition game_state.h:349