Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
talk_box.c
Go to the documentation of this file.
1#include "engine/game.h"
2
3/* Draws a talk box's blinking "next" arrow where its type puts it */
5 SpriteDrawer obj;
6 SVECTOR unused; /* unused, but it is in the original stack frame */
7 s32 x;
8 DVECTOR *arrow;
9 DVECTOR *pos;
10
11 pos = &TALK_BOX_LAYOUTS[task->parent->type].arrow;
12 if ((u32)(task->parent->type - 2) < 2) {
13 x = task->parent->w - 14;
14 } else {
15 x = pos->vx;
16 }
17 if (task->showArrow) {
18 initSpriteDrawer(&obj);
19 obj.setLayerId(task->parent->layerId, 0);
20 obj.setTexture(0x140, 0);
21 /* the match depends on this copy of pos: it puts pos in $s2 and x in $s3 */
22 arrow = pos;
23 if (GFX.funcs.getTime() - task->arrowTime >= 6) {
24 task->arrowTime = GFX.funcs.getTime();
25 if (++task->arrowFrame >= 4) {
26 task->arrowFrame = 0;
27 }
28 }
29 obj.setClutRow(task->arrowFrame);
30 obj.draw(FILE_CACHE.getEntry(FILE_MENU_SPRITES << 16), 7, task->parent->x + x, task->parent->y + arrow->vy);
31 }
32}
33
34/* Draws a talk box's corner sprites and its semi-transparent panel */
36 SpriteDrawer obj;
37 SVECTOR v[4];
38 TalkBox *parent = task->parent;
39 u32 type = parent->type;
40 s32 widthOffset;
41 s32 i;
42 s32 x;
43 FileCache *cache;
44 u_long *ot;
45 Layer *layer;
46 POLY_FT4 *p;
47 DVECTOR *pos;
48
49 widthOffset = 0;
50 if (type < 2) {
51 widthOffset = parent->w;
52 }
53 pos = &TALK_BOX_LAYOUTS[type].spritePos;
54 initSpriteDrawer(&obj);
55 obj.setLayerId(task->parent->layerId, 0);
56 obj.setTexture(0x140, 0);
57 cache = &FILE_CACHE;
58 for (i = 0; i < 4; pos++, i++) {
59 switch (i) {
60 case 0:
61 obj.draw(cache->getEntry(FILE_MENU_SPRITES << 16), TALK_BOX_LAYOUTS[type].sprite, task->parent->x + pos->vx,
62 task->parent->y + pos->vy);
63 break;
64 case 1:
65 obj.draw(cache->getEntry(FILE_MENU_SPRITES << 16), 0, task->parent->x + pos->vx - widthOffset, task->parent->y + pos->vy);
66 break;
67 case 3:
68 if (type < 2) {
69 obj.draw(cache->getEntry(FILE_MENU_SPRITES << 16), 2, task->parent->x + pos->vx, task->parent->y + pos->vy);
70 } else {
71 x = task->parent->w - 14;
72 obj.draw(cache->getEntry(FILE_MENU_SPRITES << 16), 2, task->parent->x + x, task->parent->y + pos->vy);
73 }
74 break;
75 }
76 }
77 layer = GFX.funcs.getLayer(task->parent->layerId);
78 ot = layer->getOtEntry(layer, 0);
79 /* By name: the code adds the panel's offset (12) to the table's address,
80 where an array's &parts[2] adds 8 to the first position's */
81 pos = &TALK_BOX_LAYOUTS[type].panel;
82 v[0].vx = v[2].vx = task->parent->x + pos->vx - widthOffset;
83 v[1].vx = v[3].vx = v[0].vx + task->parent->w;
84 v[0].vy = v[1].vy = task->parent->y + pos->vy;
85 v[2].vy = v[3].vy = v[0].vy + task->parent->h;
86 v[0].vz = v[1].vz = v[2].vz = v[3].vz = 0;
87 p = GFX.funcs.getPrim();
88 setPolyFT4(p);
89 setRGB0(p, 0x80, 0x80, 0x80);
90 p->tpage = 0x45;
91#if VERSION_US || VERSION_JP
92 p->clut = 0x2E57;
93#elif VERSION_EU
94 p->clut = 0x2C57;
95#endif
96 setSemiTrans(p, 1);
97 p->x0 = v[0].vx;
98 p->y0 = v[0].vy;
99 p->x1 = v[1].vx;
100 p->y1 = v[1].vy;
101 p->x2 = v[2].vx;
102 p->y2 = v[2].vy;
103 p->x3 = v[3].vx;
104 p->y3 = v[3].vy;
105 setUV4(p, 0xBC, 0, 0xC7, 0, 0xBC, 0x3E, 0xC7, 0x3E);
106 addPrim(ot, p);
107 GFX.funcs.setPrim(p + 1);
108}
109
110/* The talk box frame task: idle until the box opens, then draws the frame and the arrow */
112 switch (task->state) {
113 case 0:
114 default:
115 task->setState(task, TASK_DONE);
116 break;
117 case 1:
118 drawTalkBoxArrow(task);
119 drawTalkBoxFrame(task);
120 break;
121 case 2:
122 case 3:
123 break;
124 }
125}
126
127/* The frame of a talk box */
130
131 task->parent = parent;
132 return task;
133}
134
135typedef struct Order4 {
137} Order4;
138
139/* The corner of the box each corner's side of the outline goes to */
140const Order4 OUTLINE_ORDER = {{1, 3, 0, 2}};
141
142/* Zooms the outline one frame in or out and draws it as four lines; ends when done */
143void drawZoomBox(ZoomBox *task) {
144 Layer *layer = GFX.funcs.getLayer(task->layerId);
145 u_long *ot = layer->getOtEntry(layer, 0);
146 SVECTOR out[4];
147 SVECTOR in[4];
148 LINE_F2 *line;
149 Order4 order;
150 s32 i;
151
152 if (task->closing == 0) {
153 task->zoom += task->speed;
154 if (task->zoom > ONE) {
155 task->zoom = ONE;
156 task->opened = 1;
157 task->setState(task, TASK_KILL);
158 }
159 } else {
160 task->zoom -= task->speed;
161 if (task->zoom < 0) {
162 task->zoom = 0;
163 task->setState(task, TASK_KILL);
164 }
165 }
166 task->scale.vz = 0;
167 task->scale.vx = task->scale.vy = task->zoom;
168 RotMatrixYXZ_gte(&task->rot, &task->matrix);
169 ScaleMatrix(&task->matrix, &task->scale);
170 in[0].vx = in[2].vx = task->left - task->x;
171 in[1].vx = in[3].vx = in[0].vx + task->w;
172 in[0].vy = in[1].vy = task->top - task->y;
173 in[2].vy = in[3].vy = in[0].vy + task->h;
174 in[0].vz = in[1].vz = in[2].vz = in[3].vz = 0;
175 for (i = 0; i < 4; i++) {
176 ApplyMatrixSV(&task->matrix, &in[i], &out[i]);
177 out[i].vx += task->x;
178 out[i].vy += task->y;
179 }
180 line = GFX.funcs.getPrim();
181 for (i = 0; i < 4; i++) {
182 order = OUTLINE_ORDER;
183 setLineF2(line);
184 setRGB0(line, 0, 0, 0xFF);
185 line->x0 = out[i].vx;
186 line->y0 = out[i].vy;
187 line->x1 = out[order.next[i]].vx;
188 line->y1 = out[order.next[i]].vy;
189 addPrim(ot, line);
190 line++;
191 }
192 GFX.funcs.setPrim(line);
193}
194
195/* The zoom box task: starts zoomed out (opening) or in (closing), then draws */
197 switch (task->state) {
198 case 0:
199 default:
200 task->unused68 = 0;
201 if (task->closing == 0) {
202 task->zoom = 0;
203 } else {
204 task->zoom = ONE;
205 }
206 task->trans.vz = 0;
207 task->trans.vx = task->x;
208 task->trans.vy = task->y;
209 task->nextState(task);
210 break;
211 case 1:
212 drawZoomBox(task);
213 break;
214 case 2:
215 case 3:
216 break;
217 }
218}
219
220/* A zoom box around a talk box of type `type` at (x, y) */
221ZoomBox *createZoomBox(s32 layerId, s16 x, s16 y, s32 w, s32 h, s32 type) {
222 s16 widthOffset = w;
223 ZoomBox *task = createTask(updateZoomBox, sizeof(ZoomBox), 0);
224
225 task->layerId = layerId;
226 task->x = x;
227 task->y = y;
228 task->w = w + 0x20;
229 task->h = h;
230 if (type == 2 || type == 3) {
231 widthOffset = 0;
232 }
233 task->offsetX = TALK_BOX_LAYOUTS[type].sprite0Pos.vx - widthOffset;
234 task->offsetY = TALK_BOX_LAYOUTS[type].sprite0Pos.vy;
235 task->left = x + task->offsetX;
236 task->top = y + task->offsetY;
237 return task;
238}
239
240/* Talk box method: moves the box with its outlines and windows */
241void talkBoxSetPos(TalkBox *task, s32 x, s32 y) {
242 TalkBoxChildren *children = task->children;
243 s32 i;
244 u32 type;
245 s32 wx;
246 s32 wy;
247 ZoomBox *item;
248
249 task->x = x;
250 task->y = y;
251 for (i = 0; i < 3; i++) {
252 item = children->zoomBoxes[i];
253 if (item != NULL && item->state == 1) {
254 item->left = item->offsetX + x;
255 item->top = item->offsetY + y;
256 }
257 }
258 type = task->type;
259 if (children->windows[0] != NULL) {
260 wx = task->x + TALK_BOX_LAYOUTS[type].nameX;
261 wy = task->y + TALK_BOX_LAYOUTS[type].nameY;
262 if (type < 2) {
263 wx -= task->w;
264 }
265 children->windows[0]->setPos(children->windows[0], wx, wy);
266 }
267 if (children->windows[1] != NULL) {
268 wx = task->x + TALK_BOX_LAYOUTS[type].textX;
269 wy = task->y + TALK_BOX_LAYOUTS[type].textY;
270 if (type < 2) {
271 wx -= task->w;
272 }
273 children->windows[1]->setPos(children->windows[1], wx, wy);
274 }
275}
276
277typedef struct Delays3 {
279} Delays3;
280
281/* The frames before each of the three zoom boxes of an opening or closing */
282const Delays3 ZOOM_BOX_DELAYS = {{0, 2, 4}};
283
284/* The talk box task: opens with its outlines, runs the text, then closes and ends */
285void updateTalkBox(TalkBox *task, TalkBoxChildren *children) {
286 Delays3 delays;
287
288 switch (task->state) {
289 case 0:
290 default:
291 task->setState(task, TASK_DONE);
292 break;
293 case 1:
294 if (children->windows[1]->isFinished(children->windows[1]) != 0) {
295 task->setState(task, TASK_DONE);
296 task->setSubstate(task, 1);
297 children->frame->setState(children->frame, TASK_DONE);
298 children->windows[0]->setVisible(children->windows[0], 0);
299 children->windows[1]->setVisible(children->windows[1], 0);
300 } else if (PAD_PRESSED(PAD_CROSS)) {
301 children->windows[1]->showPage(children->windows[1]);
302 }
303 if (children->windows[1]->isWaitingForButton(children->windows[1]) != 0) {
304 children->frame->showArrow = 1;
305 } else {
306 children->frame->showArrow = 0;
307 }
308 break;
309 case 2:
310 delays = ZOOM_BOX_DELAYS;
311 switch (task->step) {
312 case 0:
313 default:
314 if (task->substate == 0) {
316 } else {
318 }
319 /* fallthrough */
320 case 1:
321 case 2:
322 if (task->timer++ >= delays.frames[task->step]) {
323 children->zoomBoxes[task->step] = createZoomBox(task->layerId, task->x, task->y, task->w, task->h, task->type);
324 children->zoomBoxes[task->step]->closing = task->substate;
325 if (task->substate == 0) {
326 children->zoomBoxes[task->step]->speed = 0x199;
327 } else {
328 children->zoomBoxes[task->step]->speed = 0x333;
329 }
330 task->nextStep(task);
331 task->timer = 0;
332 }
333 break;
334 case 3:
335 if (task->substate == 0) {
336 if (children->zoomBoxes[2]->opened != 0) {
337 task->setState(task, TASK_RUN);
338 children->frame->setState(children->frame, TASK_RUN);
339 children->windows[0]->setVisible(children->windows[0], 1);
340 children->windows[1]->setVisible(children->windows[1], 1);
341 }
342 } else if (task->substate == 1) {
343 if (children->zoomBoxes[2] == NULL) {
344 task->setState(task, TASK_KILL);
345 }
346 }
347 break;
348 }
349 break;
350 case 3:
351 break;
352 }
353}
354
355/*
356 * A talk box with string `index` of a table (an optional speaker's name between 02 07 codes),
357 * sized to the text
358 */
359TalkBox *createTalkBox(s32 id, s16 x, s16 y, void *strings, s32 index, u32 type) {
360 TextTools fn;
361 char name[0x20];
362 TalkBox *task;
363 TalkBoxChildren *children;
364 s32 end;
365 u8 *text;
366 s32 w;
367 s32 i;
368
369 task = createTask(updateTalkBox, sizeof(TalkBox), sizeof(TalkBoxChildren));
370 task->layerId = id;
371 task->x = x;
372 task->y = y;
373 children = task->children;
374 task->setPos = talkBoxSetPos;
375 task->type = type;
376 initTextTools(&fn);
377 i = 0;
378 children->windows[0] = createTextWindow(task->layerId, 2, task->x + TALK_BOX_LAYOUTS[type].nameX, task->y + TALK_BOX_LAYOUTS[type].nameY);
379 children->windows[0]->setLines(children->windows[0], 3);
380 children->windows[1] = createTextWindow(task->layerId, 1, task->x + TALK_BOX_LAYOUTS[type].textX, task->y + TALK_BOX_LAYOUTS[type].textY);
381 children->windows[1]->setLines(children->windows[1], 3);
382 task->strings = strings;
383 text = fn.getString(strings, index);
384 if (text[0] == 2 && text[1] == 7) {
385 end = 2;
386 while (text[end] != 2 && text[end + 1] != 7) {
387 end++;
388 }
389 HEAP.zero(name, sizeof(name));
390 if (text[i + 2] == 2 && text[i + 3] == 9) {
391 strcpy(name, GAME.name);
392 } else {
393 strncpy(name, &text[i + 2], -2 - i + end);
394 }
395 children->windows[0]->setString(children->windows[0], name, -1);
396 children->windows[1]->setString(children->windows[1], &text[end + 2], -1);
397 } else {
398 children->windows[1]->setString(children->windows[1], text, -1);
399 }
400 children->windows[1]->setTypeDelay(children->windows[1], 6);
401 children->windows[1]->insertPlayerName(children->windows[1]);
402 w = fn.measure(children->windows[1]->text, children->windows[1]->style, 0);
403 if (w < 0x5F) {
404 w = 0x5F;
405 } else if (w >= 0x8C) {
406 w = 0x8B;
407 }
408 task->w = w;
409 task->h = 0x3E;
410 if (type < 2) {
411 children->windows[0]->setPos(children->windows[0], children->windows[0]->x - task->w, children->windows[0]->y);
412 children->windows[1]->setPos(children->windows[1], children->windows[1]->x - task->w, children->windows[1]->y);
413 }
414 for (i = 0; i < 2; i++) {
415 children->windows[i]->setPalette(children->windows[i], PALETTE_DARK_BLUE);
416 children->windows[i]->setVisible(children->windows[i], 0);
417 }
418 children->frame = createTalkBoxFrame(task);
419 return task;
420}
421
423 { 3, { 0, -16 }, { 0, -74 }, { 16, -74 }, { 16, -74 }, 6, -71, 6, -58, { 16, -38 } },
424 { 5, { 0, 0 }, { 0, 12 }, { 16, 12 }, { 16, 12 }, 6, 15, 6, 28, { 16, 48 } },
425 { 4, { -16, -16 }, { -26, -74 }, { -10, -74 }, { 125, -74 }, -20, -71, -20, -58, { 125, -38 } },
426 { 6, { -20, 0 }, { -26, 12 }, { -10, 12 }, { 125, 12 }, -20, 15, -20, 28, { 125, 48 } },
427};
#define NULL
Definition common.h:17
signed int s32
Definition common.h:11
unsigned int u32
Definition common.h:12
signed short s16
Definition common.h:9
unsigned char u8
Definition common.h:8
GfxState GFX
GFX: the graphics state and its methods.
Definition display.c:209
GameState GAME
The save data, the game mode and the methods.
Definition state.c:64
#define TASK_RUN
Definition task.h:35
#define TASK_KILL
Definition task.h:37
#define TASK_DONE
Definition task.h:36
#define FILE_MENU_SPRITES
Files the engine loads by number.
Definition file.h:188
FileCache FILE_CACHE
The file cache.
Definition file_cache.c:7
char * strncpy(char *dst, const char *src, s32 n)
char * strcpy(char *dst, const char *src)
Heap HEAP
The functions that return what a call left in v0 (allocMemHigh, findTask) and the ones that take othe...
Definition heap.c:184
#define PAD_CROSS
Definition pad.h:31
#define PAD_PRESSED(button)
One button of pad 1: newly pressed, auto-repeated while held, or held.
Definition pad.h:140
SoundState SOUND
rsin and rcos (libgte) read rsin_tbl[a - 0x800] and the like: their addresses before the table fall i...
Definition sound.c:180
#define SOUND_MENU_CLOSE
SYSTEM04.
Definition sound.h:42
#define SOUND_MENU_OPEN
SYSTEM03.
Definition sound.h:41
void initSpriteDrawer(SpriteDrawer *obj)
Clears a sprite drawer to neutral (no scale, gray tint, follows the scroll), gives it its methods and...
s32 frames[3]
Definition talk_box.c:278
The file cache (FILE_CACHE): up to 64 files loaded in the heap (tag 3), read in the background one at...
Definition file.h:85
void *(* getEntry)(u32 fileAndIndex)
Definition file.h:96
char name[0x18]
the player's
Definition game_state.h:509
void *(* getPrim)(void)
Definition gfx.h:19
struct Layer *(* getLayer)(s32 id)
Definition gfx.h:28
void(* setPrim)(void *next)
Definition gfx.h:20
s32(* getTime)(void)
Definition gfx.h:31
GfxFuncs funcs
Definition gfx.h:77
void(* zero)(void *ptr, s32 size)
Definition heap.h:32
A drawing layer (GFX.funcs.createLayer): a DRAWENV with a pair of ordering tables,...
Definition gfx.h:128
u_long *(* getOtEntry)(struct Layer *, s32 depth)
Definition gfx.h:155
s32 next[4]
Definition talk_box.c:136
short(* playSound)(s32 id)
returns the voice of a key-on
Definition sound.h:187
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(* setLayerId)()
(id, depth)
Definition gfx.h:244
void(* setClutRow)()
(row)
Definition gfx.h:247
void(* draw)()
(sheet, frame, x, y)
Definition gfx.h:246
void(* setTexture)()
(x, y)
Definition gfx.h:242
The children of a TalkBox.
Definition text.h:59
struct TextWindow * windows[2]
speaker, message
Definition text.h:61
struct TalkBoxFrame * frame
Definition text.h:62
struct ZoomBox * zoomBoxes[3]
Definition text.h:60
Draws a TalkBox's panel.
Definition text.h:84
TalkBox * parent
Definition text.h:86
u8 showArrow
Definition text.h:89
s32 arrowTime
Definition text.h:88
s32 arrowFrame
Definition text.h:87
void(* setState)(struct TalkBoxFrame *task, s32 state)
Definition text.h:85
s32 state
Definition text.h:85
Where the parts of a TalkBox go, for each of its four types.
Definition text.h:192
s16 textX
Definition text.h:200
DVECTOR sprite0Pos
also the ZoomBox's offset
Definition text.h:195
s16 nameY
Definition text.h:199
DVECTOR arrow
where the talk box arrow is drawn
Definition text.h:202
s16 nameX
Definition text.h:198
s16 textY
Definition text.h:201
DVECTOR panel
Definition text.h:196
DVECTOR spritePos
the four positions drawTalkBoxFrame walks
Definition text.h:194
s32 sprite
Definition text.h:193
A box with a speaker's name and a message (createTalkBox).
Definition text.h:70
void(* setState)(struct TalkBox *task, s32 state)
Definition text.h:71
s16 x
Definition text.h:76
void(* setSubstate)(struct TalkBox *task, s32 substate)
Definition text.h:71
s16 h
Definition text.h:79
void * strings
Definition text.h:72
s32 timer
Definition text.h:75
s32 state
Definition text.h:71
void * children
Definition text.h:71
s32 type
Definition text.h:74
s32 substate
Definition text.h:71
s32 step
Definition text.h:71
s32 layerId
Definition text.h:73
void(* setPos)(struct TalkBox *box, s32 x, s32 y)
Definition text.h:80
s16 y
Definition text.h:77
s16 w
Definition text.h:78
void(* nextStep)(struct TalkBox *task)
Definition text.h:71
Text helpers (initTextTools)
Definition text.h:93
char *(* getString)()
(table, index)
Definition text.h:94
s32(* measure)()
(TextBuffer *, style, spacing)
Definition text.h:95
s16 x
Definition text.h:143
s16 y
Definition text.h:144
s32(* isWaitingForButton)()
Definition text.h:188
void(* setPalette)(struct TextWindow *obj, u8 arg)
Definition text.h:174
TextBuffer text[6]
Definition text.h:136
s32(* isFinished)()
s32: callers don't truncate the result to a byte
Definition text.h:186
void(* insertPlayerName)()
Definition text.h:179
void(* setTypeDelay)()
Definition text.h:172
void(* setLines)()
no prototype: callers would truncate u8 args
Definition text.h:184
void(* setPos)(struct TextWindow *obj, s16 x, s16 y)
Definition text.h:173
void(* setString)()
Definition text.h:165
void(* showPage)()
Definition text.h:170
struct TextStyle * style
Definition text.h:133
void(* setVisible)(struct TextWindow *obj, u8 arg)
Definition text.h:177
A blue rectangle outline that zooms in (or out, when closing) around a TalkBox.
Definition text.h:270
s16 offsetY
Definition text.h:283
s16 speed
Definition text.h:278
s16 x
the zoom's centre
Definition text.h:274
s16 top
Definition text.h:273
s32 closing
Definition text.h:288
s32 opened
Definition text.h:289
MATRIX matrix
Definition text.h:287
s32 zoom
0-ONE
Definition text.h:279
s32 layerId
Definition text.h:280
s16 h
Definition text.h:277
void(* setState)(struct ZoomBox *task, s32 state)
Definition text.h:271
s32 unused68
only cleared when the box starts; nothing reads it
Definition text.h:281
s16 y
Definition text.h:275
VECTOR trans
the centre, set but not read
Definition text.h:286
void(* nextState)(struct ZoomBox *task)
Definition text.h:271
VECTOR scale
Definition text.h:284
s32 state
Definition text.h:271
s16 w
Definition text.h:276
s16 left
Definition text.h:272
SVECTOR rot
Definition text.h:285
s16 offsetX
Definition text.h:282
const Order4 OUTLINE_ORDER
The corner of the box each corner's side of the outline goes to.
Definition talk_box.c:140
void updateTalkBoxFrame(TalkBoxFrame *task)
The talk box frame task: idle until the box opens, then draws the frame and the arrow.
Definition talk_box.c:111
ZoomBox * createZoomBox(s32 layerId, s16 x, s16 y, s32 w, s32 h, s32 type)
A zoom box around a talk box of type type at (x, y)
Definition talk_box.c:221
void updateTalkBox(TalkBox *task, TalkBoxChildren *children)
The talk box task: opens with its outlines, runs the text, then closes and ends.
Definition talk_box.c:285
TalkBoxFrame * createTalkBoxFrame(TalkBox *parent)
The frame of a talk box.
Definition talk_box.c:128
const Delays3 ZOOM_BOX_DELAYS
The frames before each of the three zoom boxes of an opening or closing.
Definition talk_box.c:282
void talkBoxSetPos(TalkBox *task, s32 x, s32 y)
Talk box method: moves the box with its outlines and windows.
Definition talk_box.c:241
TalkBox * createTalkBox(s32 id, s16 x, s16 y, void *strings, s32 index, u32 type)
A talk box with string index of a table (an optional speaker's name between 02 07 codes),...
Definition talk_box.c:359
void drawTalkBoxFrame(TalkBoxFrame *task)
Draws a talk box's corner sprites and its semi-transparent panel.
Definition talk_box.c:35
void updateZoomBox(ZoomBox *task)
The zoom box task: starts zoomed out (opening) or in (closing), then draws.
Definition talk_box.c:196
void drawZoomBox(ZoomBox *task)
Zooms the outline one frame in or out and draws it as four lines; ends when done.
Definition talk_box.c:143
void drawTalkBoxArrow(TalkBoxFrame *task)
Draws a talk box's blinking "next" arrow where its type puts it.
Definition talk_box.c:4
TalkBoxLayout TALK_BOX_LAYOUTS[4]
Definition talk_box.c:422
void * createTask(void(*update)(), s32 size, s32 childrenSize)
createTaskWithId for a task nothing needs to find
Definition task.c:105
#define PALETTE_DARK_BLUE
Definition text.h:114
void initTextTools(TextTools *obj)
Clears a text tools object, gives it its methods and binds it.
Definition text_tools.c:193
TextWindow * createTextWindow(s16 layerId, s16 style, s16 x, s16 y)
A text window on a layer, in a font style, at (x, y)