Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
message_window.c
Go to the documentation of this file.
1/* CARDGAME's message and menu windows, and the hand's spacing. */
2
4
5/* Draws the message window's frame at a scale */
6void CARDGAME_drawMessageFrame(CardScreen *screen, CardScreenItems *items, s16 scale, s32 x, s32 y) {
7 SpriteDrawer drawer;
8
9 initSpriteDrawer(&drawer);
10 drawer.setLayerId(0x100, 1);
11 drawer.setTexture(0x280, 0);
12 drawer.setPivot(0, 0x78);
13 drawer.setScale(scale, 0x1000, 0x1000);
14 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), 0x1A, x, y);
15}
16
17/* Draws sprite 0x18 of the message window */
19 SpriteDrawer drawer;
20
21 initSpriteDrawer(&drawer);
22 drawer.setLayerId(0x100, 1);
23 drawer.setTexture(0x280, 0);
24 drawer.setScale(0x1000, 0x1000, 0x1000);
25 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), 0x18, x, y);
26}
27
28/* Shows the message window's prompt and cursor, or hides them when it has
29 no prompt */
30static inline void showMessagePrompt(CardScreen *screen, CardScreenItems *items) {
31#if VERSION_US
32 if (screen->message.prompt != 0) {
33 items->cursor->setVisible(items->cursor, 1);
34 items->cursor->setPos(items->cursor, 0x14, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x11 + screen->message.choice * 14);
36 items->moreTexts[7]->setPos(items->moreTexts[7], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
37 } else {
38 items->moreTexts[7]->setVisible(items->moreTexts[7], 0);
39 items->cursor->setVisible(items->cursor, 0);
40 }
41#elif VERSION_EU || VERSION_JP
42 switch (screen->message.prompt) {
43 case 0:
44 default:
45 items->moreTexts[7]->setVisible(items->moreTexts[7], 0);
46 items->cursor->setVisible(items->cursor, 0);
47 break;
48 case 1:
49 items->cursor->setVisible(items->cursor, 1);
50 items->cursor->setPos(items->cursor, 0x14, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x11 + screen->message.choice * 14);
52 items->moreTexts[7]->setPos(items->moreTexts[7], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
53 break;
54 case 2:
55 case 3:
56 items->cursor->setVisible(items->cursor, 1);
57 items->cursor->setPos(items->cursor, 0x14, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x11 + screen->message.choice * 14);
59 if (screen->message.prompt == 3) {
60 items->moreTexts[7]->setPalette(items->moreTexts[7], PALETTE_GREY);
61 }
62 items->moreTexts[7]->setPos(items->moreTexts[7], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
63 items->texts[0]->setString(items->texts[0], FILE_CACHE.load(TEXT_FILE(TEXT_CARD_GAME)), 0x46);
64 items->texts[0]->setRightAlign(items->texts[0], 0);
65 items->texts[0]->setPos(items->texts[0], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x20);
66 break;
67 }
68#endif
69}
70
71/* Shows the message window's text: an item's name, the message with its wins
72 or opponent numbers, or nothing */
73static inline void showMessageText(CardScreen *screen, CardScreenItems *items) {
74 TextTools tools;
75 s32 i;
76 s32 x;
77
78 if (screen->message.place == 3) {
82 items->moreTexts[7]->setPos(items->moreTexts[7], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x40, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
83 } else if (screen->message.message != 0) {
86 if (screen->message.message == 0x13) {
88 items->moreTexts[7]->setPos(items->moreTexts[7], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
89 initTextTools(&tools);
90 x = tools.measure(items->moreTexts[7]->text, items->moreTexts[7]->style, items->moreTexts[7]->spacingX) + 0x1B;
91 for (i = 0; i < 2; i++) {
92 items->texts[i]->setPos(items->texts[i], CARDGAME_messageWindowPositions[screen->message.place][0] + x + 0xE, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12 + i * 14);
93 items->texts[i]->setNumber(items->texts[i], 0, screen->panels[i].wins);
94 items->texts[i]->setRightAlign(items->texts[i], 0);
95 }
96 } else if (screen->message.message == 0x3E) {
97 items->texts[0]->setPos(items->texts[0], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x3E, CARDGAME_messageWindowPositions[screen->message.place][1] + 4);
98 items->texts[0]->setNumber(items->texts[0], 0, screen->opponentLevel);
99 items->texts[0]->setRightAlign(items->texts[0], 1);
100 items->texts[1]->setString(items->texts[1], FILE_CACHE.load(TEXT_FILE(TEXT_DECK_EDITOR)), (screen->opponent + 1) / 2);
101 items->texts[1]->setPos(items->texts[1], CARDGAME_messageWindowPositions[screen->message.place][0] + 0x1B, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x12);
102 }
103 } else {
104 items->moreTexts[1]->setVisible(items->moreTexts[1], 0);
105 }
106}
107
108/* The message window: it opens at its place, shows its prompt
109 (showMessagePrompt) and message (showMessageText) with the cursor, then closes */
111 s16 scale;
112 s32 t;
113
114 if (screen->message.state == 0) {
115 return;
116 }
117 switch (screen->message.state) {
118 case 1:
119 default:
120 t = screen->message.time << 12;
121 scale = 0x1000 - (screen->message.duration != 0 ? t / screen->message.duration : t);
122 screen->message.time -= GFX.funcs.getFrameTime();
123 if (screen->message.time <= 0) {
124 screen->message.state = 2;
125 showMessagePrompt(screen, items);
126 showMessageText(screen, items);
127 }
128 break;
129 case 2:
130 scale = 0x1000;
131 if (screen->message.place == 3) {
132 CARDGAME_drawMessageMark(screen, items, 0x1C, 0x64);
133 }
134 if (screen->message.prompt != 0) {
135 items->cursor->setPos(items->cursor, 0x14, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x11 + screen->message.choice * 14);
136 }
137 break;
138 case 4:
139 scale = 0x1000;
140 items->cursor->setPos(items->cursor, 0x14 - rsin((screen->message.time << 12) / 20) / 512, CARDGAME_messageWindowPositions[screen->message.place][1] + 0x11 + screen->message.choice * 14);
141 screen->message.time -= GFX.funcs.getFrameTime();
142 if (screen->message.time <= 0) {
143 items->cursor->setVisible(items->cursor, 0);
144 screen->closeMessage(screen);
145 items->cursor->setIdleDelay(items->cursor, 0x20);
146 screen->message.state = 5;
147 }
148 break;
149 case 5:
150 items->cursor->setVisible(items->cursor, 0);
151 items->moreTexts[1]->setVisible(items->moreTexts[1], 0);
152#if VERSION_EU || VERSION_JP
153 items->moreTexts[7]->setPalette(items->moreTexts[7], PALETTE_WHITE);
154#endif
155 items->moreTexts[7]->setVisible(items->moreTexts[7], 0);
156 items->texts[0]->setVisible(items->texts[0], 0);
157 items->texts[1]->setVisible(items->texts[1], 0);
158 items->texts[2]->setVisible(items->texts[2], 0);
159 screen->message.time -= GFX.funcs.getFrameTime();
160 if (screen->message.time <= 0) {
161 screen->message.state = 0;
162 }
163 scale = (screen->message.time << 12) / screen->message.duration;
164 break;
165 }
167}
168
169/* Draws the menu window's frame at a scale */
170void CARDGAME_drawMenuFrame(CardScreen *screen, CardScreenItems *items, s16 scale, s32 x, s32 y) {
171 SpriteDrawer drawer;
172
173 initSpriteDrawer(&drawer);
174 drawer.setLayerId(0x100, 1);
175 drawer.setTexture(0x340, 0);
176 drawer.setPivot(0, 0x86);
177 drawer.setScale(scale, 0x1000, 0x1000);
178 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 1, x, y);
179}
180
181/* A menu window (CardScreen.menuState): it opens, shows text file 0x10 with
182 the cursor on menuRow, then closes */
184 s16 scale;
185 s32 t;
186
187 if (screen->menuState == 0) {
188 return;
189 }
190 switch (screen->menuState) {
191 case 1:
192 default:
193 t = screen->menuTime << 12;
194 scale = 0x1000 - (screen->menuDuration != 0 ? t / screen->menuDuration : t);
195 screen->menuTime -= GFX.funcs.getFrameTime();
196 if (screen->menuTime <= 0) {
197 screen->menuState = 2;
198 items->cursor->setVisible(items->cursor, 1);
199 items->cursor->setPos(items->cursor, 10, screen->menuRow * 14 + 0x65);
200 items->moreTexts[6]->setString(items->moreTexts[6], FILE_CACHE.load(TEXT_FILE(TEXT_CARD_GAME)), 0x20);
201 items->moreTexts[6]->setPos(items->moreTexts[6], 0x18, 0x65);
202 }
203 break;
204 case 2:
205 scale = 0x1000;
206 items->cursor->setPos(items->cursor, 10, screen->menuRow * 14 + 0x65);
207 break;
208 case 4:
209 scale = 0x1000;
210 items->cursor->setPos(items->cursor, 10 - rsin((screen->menuTime << 12) / 20) / 512, screen->menuRow * 14 + 0x65);
211 screen->menuTime -= GFX.funcs.getFrameTime();
212 if (screen->menuTime <= 0) {
213 items->cursor->setVisible(items->cursor, 0);
214 screen->closeMenu(screen);
215 items->cursor->setIdleDelay(items->cursor, 0x20);
216 screen->menuState = 5;
217 }
218 break;
219 case 5:
220 items->cursor->setVisible(items->cursor, 0);
221 items->moreTexts[6]->setVisible(items->moreTexts[6], 0);
222 screen->menuTime -= GFX.funcs.getFrameTime();
223 if (screen->menuTime <= 0) {
224 screen->menuState = 0;
225 }
226 scale = (screen->menuTime << 12) / screen->menuDuration;
227 break;
228 }
229 CARDGAME_drawMenuFrame(screen, items, scale, 0, 0x60);
230}
231
232/* CardScreen.getHandOffset: how far the hand's card index is from its first:
233 0x2900 a card up to six cards, else count share 0xF600 */
235 s32 step;
236
237 if (count < 7) {
238 step = 0x2900;
239 } else {
240 step = 0xF600 / count;
241 }
242 return step * index;
243}
CARDGAME.PRO: the card battle (mode 0x700).
s32 CARDGAME_messageWindowPositions[][2]
the message window's places (x, y), by CardScreen.message.place
Definition cardgame_3.c:30
signed int s32
Definition common.h:11
signed short s16
Definition common.h:9
GfxState GFX
GFX: the graphics state and its methods.
Definition display.c:209
#define TEXT_DECK_EDITOR
CRDDEK.
Definition file.h:206
#define TEXT_CARD_GAME
CARDGM: the card battle's.
Definition file.h:202
#define TEXT_FILE(file)
Definition file.h:190
#define TEXT_ITEM_NAMES
ITMNAM.
Definition file.h:215
FileCache FILE_CACHE
The file cache.
Definition file_cache.c:7
void CARDGAME_updateMenuWindow(CardScreen *screen, CardScreenItems *items)
A menu window (CardScreen.menuState): it opens, shows text file 0x10 with the cursor on menuRow,...
s32 CARDGAME_getHandOffset(s32 count, s32 index)
CardScreen.getHandOffset: how far the hand's card index is from its first: 0x2900 a card up to six ca...
void CARDGAME_drawMenuFrame(CardScreen *screen, CardScreenItems *items, s16 scale, s32 x, s32 y)
Draws the menu window's frame at a scale.
void CARDGAME_drawMessageFrame(CardScreen *screen, CardScreenItems *items, s16 scale, s32 x, s32 y)
Draws the message window's frame at a scale.
void CARDGAME_drawMessageMark(CardScreen *screen, CardScreenItems *items, s32 x, s32 y)
Draws sprite 0x18 of the message window.
void CARDGAME_updateMessageWindow(CardScreen *screen, CardScreenItems *items)
The message window: it opens at its place, shows its prompt (showMessagePrompt) and message (showMess...
static void showMessagePrompt(CardScreen *screen, CardScreenItems *items)
Shows the message window's prompt and cursor, or hides them when it has no prompt.
static void showMessageText(CardScreen *screen, CardScreenItems *items)
Shows the message window's text: an item's name, the message with its wins or opponent numbers,...
#define FILE_CARDGAME_TIMS
CARDGAME's own pictures, a TIM archive.
Definition screen.h:15
void initSpriteDrawer(SpriteDrawer *obj)
Clears a sprite drawer to neutral (no scale, gray tint, follows the scroll), gives it its methods and...
u8 prompt
what it asks: 0 nothing, else a choice with the cursor
Definition screen.h:257
s16 choice
the cursor's row
Definition screen.h:254
u8 state
1 opening, 2 open, 4 confirmed, 5 closing
Definition screen.h:256
s32 place
in CARDGAME_messageWindowPositions
Definition screen.h:249
s32 wins
the rounds won shown
Definition screen.h:158
The battle screen's task items.
Definition screen.h:87
TextWindow * moreTexts[8]
Definition screen.h:91
TextWindow * texts[3]
Definition screen.h:89
Cursor * cursor
Definition screen.h:88
The battle screen (created by CARDGAME_createScreen): the two panels, the cards on the table and the ...
Definition screen.h:263
CardMessageWindow message
Definition screen.h:274
void(* closeMenu)(struct CardScreen *screen)
Definition screen.h:307
void(* closeMessage)(struct CardScreen *screen)
Definition screen.h:303
s16 menuState
Definition screen.h:280
s16 menuTime
Definition screen.h:276
s16 opponent
CardBattle.arg.
Definition screen.h:268
s16 menuRow
Definition screen.h:278
s16 menuDuration
Definition screen.h:277
CardPanel panels[2]
Definition screen.h:270
s16 opponentLevel
CardBattle.opponentLevel.
Definition screen.h:269
void(* setIdleDelay)()
Definition text.h:36
void(* setPos)()
(cursor, x, y)
Definition text.h:34
void(* setVisible)()
(cursor, visible)
Definition text.h:33
void *(* load)(u32 file)
Definition file.h:92
void *(* getEntry)(u32 fileAndIndex)
Definition file.h:96
s32(* getFrameTime)(void)
Definition gfx.h:32
GfxFuncs funcs
Definition gfx.h:77
Draws sprites from a sprite sheet (such as file 0x277, the menu graphics): a sheet has a table of fra...
Definition gfx.h:223
void(* setPivot)()
(x, y)
Definition gfx.h:250
void(* setScale)()
(x, y, z), ONE = 1.0
Definition gfx.h:248
void(* setLayerId)()
(id, depth)
Definition gfx.h:244
void(* draw)()
(sheet, frame, x, y)
Definition gfx.h:246
void(* setTexture)()
(x, y)
Definition gfx.h:242
Text helpers (initTextTools)
Definition text.h:93
s32(* measure)()
(TextBuffer *, style, spacing)
Definition text.h:95
void(* setPalette)(struct TextWindow *obj, u8 arg)
Definition text.h:174
TextBuffer text[6]
Definition text.h:136
void(* setRightAlign)()
no prototype: callers would truncate u8 args
Definition text.h:178
void(* setNumber)()
Definition text.h:166
void(* setPos)(struct TextWindow *obj, s16 x, s16 y)
Definition text.h:173
void(* setString)()
Definition text.h:165
s16 spacingX
Definition text.h:145
struct TextStyle * style
Definition text.h:133
void(* setVisible)(struct TextWindow *obj, u8 arg)
Definition text.h:177
#define PALETTE_WHITE
The text windows' palettes (TextWindow.palette, setPalette): rows of the font's CLUTs,...
Definition text.h:112
#define PALETTE_GREY
what is unavailable
Definition text.h:119
void initTextTools(TextTools *obj)
Clears a text tools object, gives it its methods and binds it.
Definition text_tools.c:193