Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
sprites.c
Go to the documentation of this file.
1/* CARDGAME's card sprites: their moves, effects and drawing. */
2
4
5/* Whether sprite is scaled: its scaleX and scaleY, read as one word, aren't
6 both 0x1000 */
7static inline s32 isScaled(CardSprite *sprite) {
8 return *(s32 *)&sprite->scaleX != 0x10001000;
9}
10
11/* Moves and scales a sprite towards its targets; at the end it plays a sound (unless in state 3) and goes to state 1 */
13 sprite->time -= GFX.funcs.getFrameTime();
14 if (sprite->time > 0) {
15 if (sprite->x != sprite->targetX || sprite->y != sprite->targetY) {
16 sprite->x = sprite->targetX - (sprite->targetX - sprite->startX) * sprite->time / sprite->duration;
17 sprite->y = sprite->targetY - (sprite->targetY - sprite->startY) * sprite->time / sprite->duration;
18 }
19 /* both scales, read as one word */
20 if (*(s32 *)&sprite->scaleX != *(s32 *)&sprite->targetScaleX) {
21 sprite->scaleX = sprite->targetScaleX - (sprite->targetScaleX - sprite->startScaleX) * sprite->time / sprite->duration;
22 sprite->scaleY = sprite->targetScaleY - (sprite->targetScaleY - sprite->startScaleY) * sprite->time / sprite->duration;
23 }
24 } else {
25 if (sprite->state != 3) {
27 }
28 sprite->state = 1;
29 sprite->time = 0;
30 sprite->duration = 0;
31 sprite->x = sprite->targetX;
32 sprite->y = sprite->targetY;
33 sprite->scaleX = sprite->targetScaleX;
34 sprite->scaleY = sprite->targetScaleY;
35 if (sprite->highlight == 0) {
36 sprite->moving = 0;
37 }
38 }
39}
40
41/* Flies a sprite from start to target along an arc while scaling it; at the end it swaps start and target, goes to state 2 with 2.5 times the time, and returns 1 */
43 s32 done = 0;
44 s32 dy;
45 s32 offset;
46 s32 startX;
47 s32 startY;
48 s32 scaledDy;
49 s16 scaleX;
50 s16 scaleY;
51
52 if (sprite->growTime > 0) {
53 sprite->growTime -= GFX.funcs.getFrameTime();
54 sprite->scaleX = 0x1C00 - sprite->growTime * 0xC0;
55 sprite->scaleY = 0x1C00 - sprite->growTime * 0xC0;
56 if (sprite->growTime <= 0) {
57 sprite->highlight |= 5;
58 SOUND.playSound(0x8004603C);
59 sprite->targetScaleX = 0x1200;
60 sprite->targetScaleY = 0x1200;
61 sprite->startScaleX = sprite->scaleX = 0x1C00;
62 sprite->startScaleY = sprite->scaleY = 0x1C00;
63 sprite->growTime = 0;
64 }
65 return 0;
66 }
67 sprite->time -= GFX.funcs.getFrameTime();
68 if (sprite->time > 0) {
69 dy = sprite->targetY - sprite->startY;
70 scaledDy = dy * sprite->time;
71 sprite->x = sprite->targetX - (sprite->targetX - sprite->startX) * sprite->time / sprite->duration;
72 sprite->y = sprite->targetY - scaledDy / sprite->duration;
73 offset = rsin((sprite->time << 12) / (sprite->duration * 2)) * 0x1C00;
74 sprite->y += (dy > 0 ? -offset : offset) / 0x1000;
75 sprite->scaleX = sprite->targetScaleX - (sprite->targetScaleX - sprite->startScaleX) * sprite->time / sprite->duration;
76 sprite->scaleY = sprite->targetScaleY - (sprite->targetScaleY - sprite->startScaleY) * sprite->time / sprite->duration;
77 } else {
78 startX = sprite->startX;
79 startY = sprite->startY;
80 sprite->x = sprite->startX = sprite->targetX;
81 sprite->y = sprite->startY = sprite->targetY;
82 sprite->targetX = startX;
83 sprite->targetY = startY;
84 scaleX = sprite->targetScaleX;
85 scaleY = sprite->targetScaleY;
86 sprite->state = 2;
87 sprite->targetScaleX = 0x1000;
88 sprite->targetScaleY = 0x1000;
89 sprite->scaleX = scaleX;
90 sprite->scaleY = scaleY;
91 sprite->highlight &= ~5;
92 sprite->time = sprite->duration = sprite->duration * 2 + sprite->duration / 2;
93 sprite->startScaleX = sprite->scaleX;
94 sprite->startScaleY = sprite->scaleY;
95 done = 1;
96 }
97 return done;
98}
99
100/* Shakes a sprite sideways and stretches it, for 12 frames: 1 at the end */
102 s32 done = 0;
103
104 sprite->x = sprite->startX + CARDGAME_shakeOffsets[sprite->time & 7];
105 sprite->scaleY = rsin((sprite->time << 12) / 24) / 16 + 0x1000;
106 sprite->time += GFX.funcs.getFrameTime();
107 if (sprite->time >= 12) {
108 sprite->state = 1;
109 sprite->moving = 0;
110 sprite->effect = 0;
111 sprite->scaleY = 0x1000;
112 sprite->x = sprite->startX;
113 done = 1;
114 }
115 return done;
116}
117
118/* Ends a sprite's move and puts it in STATE */
119static inline void resetSprite(CardSprite *sprite, s32 state) {
120 sprite->state = state;
121 sprite->duration = 0;
122 sprite->time = 0;
123 sprite->moving = 0;
124 sprite->effect = 0;
125}
126
127/* Holds a sprite for 10 frames, then starts its blink: 1 at the end */
129 s32 done = 0;
130
131 sprite->time += GFX.funcs.getFrameTime();
132 if (sprite->time >= 10) {
133 resetSprite(sprite, 11);
134 done = 1;
135 }
136 return done;
137}
138
139/* Holds a sprite for duration frames, then ends its effect: 1 at the end */
140s32 CARDGAME_holdSprite(CardScreen *screen, CardSprite *sprite, s32 duration) {
141 s32 done = 0;
142
143 sprite->time += GFX.funcs.getFrameTime();
144 if (sprite->time >= duration) {
145 resetSprite(sprite, 1);
146 done = 1;
147 }
148 return done;
149}
150
151/* Jitters a sprite about where it started and squashes it, for 12 frames: 1
152 at the end */
154 s32 done;
155
156 sprite->x = sprite->startX + CARDGAME_jitterOffsets[sprite->time & 7];
157 sprite->y = sprite->startY + CARDGAME_jitterOffsets[RANDOM.next() & 7];
158 done = 0;
159 sprite->scaleY = 0x1000 - rsin((sprite->time << 12) / 24) / 8;
160 sprite->time += GFX.funcs.getFrameTime();
161 if (sprite->time >= 12) {
162 sprite->state = 1;
163 sprite->moving = 0;
164 sprite->scaleY = 0x1000;
165 sprite->effect = 0;
166 sprite->x = sprite->startX;
167 sprite->y = sprite->startY;
168 done = 1;
169 }
170 return done;
171}
172
173/* The end of a sprite's flip (CARDGAME_flipSprite) */
174static inline void endSpriteFlip(CardSprite *sprite, s32 state) {
175 sprite->state = state;
176 sprite->moving = 0;
177 sprite->scaleX = 0x1000;
178}
179
180/* Turns a sprite over for 12 frames, its side swapped after 7: 1 at the end */
182 s32 done = 0;
183
184 sprite->scaleX = 0x1000 - rsin((sprite->time << 12) / 24);
185 sprite->time += GFX.funcs.getFrameTime();
186 if (sprite->duration == 0 && sprite->time >= 7) {
187 sprite->duration = 1;
188 sprite->visible ^= 3;
189 }
190 if (sprite->time >= 12) {
191 endSpriteFlip(sprite, 1);
192 done = 1;
193 }
194 return done;
195}
196
197/* The part of a sprite sheet at offset, one of the offsets it starts with */
198static inline void *getSheetPart(s32 *sheet, s32 offset) {
199 return (u8 *)sheet + offset;
200}
201
202/* Draws a card's picture: a one-part sprite sheet (CARDGAME_pictureSheet) made on the fly,
203 the 32x32 cell `index` of an 8-row grid with the card's own CLUT row */
205 SpriteDrawer drawer;
206 s16 *frame;
207 SpritePart *part;
208 s32 u;
209 s32 v;
210 s32 *sheet;
211
212 u = sprite->index / 8 * 32;
213 v = sprite->index % 8 * 32;
214 sheet = CARDGAME_pictureSheet;
215 frame = getSheetPart(sheet, sheet[2]);
216 frame[0] = 1;
217 frame[2] = -1;
218 frame[1] = sprite->index;
219 frame[3] = 0;
220 frame[4] = 4;
221 frame[5] = 2;
222 part = getSheetPart(sheet, sheet[0]);
223 part->u = u;
224 part->v = v;
225 part->w = 32;
226 part->h = 32;
227 part->clutX = 0;
228 part->clutY = 0x100;
229 part->mode = 1;
230 initSpriteDrawer(&drawer);
231 if (isScaled(sprite)) {
232 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
233 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
234 }
235 drawer.setLayerId(0x100, 1);
236 drawer.setTexture(0x140, 0x100);
237 drawer.setAltClut(0x300, 0x100);
238 drawer.draw(sheet, 0, sprite->x >> 8, sprite->y >> 8);
239}
240
241/* Draws a sprite's effect animation (1-4, frames 0x28-0x4C of the fourth TIM) and ends it when its time runs out */
243 SpriteDrawer drawer;
244
245 if (sprite->visible != 0 && sprite->effect != 0) {
246 initSpriteDrawer(&drawer);
247 /* both scales at 0x1000, read as one word */
248 if (isScaled(sprite)) {
249 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
250 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
251 }
252 drawer.setLayerId(0x100, 1);
253 drawer.setTexture(0x340, 0);
254 switch (sprite->effect) {
255 case 1:
256 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), CARDGAME_loopFrames[(screen->time >> 2) & 3] + 0x28,
257 sprite->x >> 8, sprite->y >> 8);
258 break;
259 case 2:
260 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), CARDGAME_onceFrames[(sprite->effectTime >> 2) % 4] + 0x2C,
261 sprite->x >> 8, sprite->y >> 8);
262 if (sprite->effectTime >= 8) {
263 sprite->effect = 0;
264 sprite->effectTime = 0;
265 }
266 sprite->effectTime += GFX.funcs.getFrameTime();
267 break;
268 case 3:
269 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), (sprite->effectTime >> 1) % 9 + 0x3C,
270 sprite->x >> 8, sprite->y >> 8);
271 if (sprite->effectTime++ >= 36) {
272 sprite->effect = 0;
273 sprite->effectTime = 0;
274 }
275 sprite->effectTime += GFX.funcs.getFrameTime();
276 break;
277 case 4:
278 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), (sprite->effectTime >> 1) % 7 + 0x46,
279 sprite->x >> 8, sprite->y >> 8);
280 if (sprite->effectTime >= 28) {
281 sprite->effect = 0;
282 sprite->effectTime = 0;
283 }
284 sprite->effectTime += GFX.funcs.getFrameTime();
285 break;
286 }
287 }
288}
289
290/* Draws the highlights over a sprite (highlight bits 0-2), with a cycling palette */
292 SpriteDrawer drawer;
293
294 if (sprite->visible != 0) {
295 if (sprite->highlight & 6) {
296 initSpriteDrawer(&drawer);
297 if (sprite->highlight & 4) {
298 drawer.setClutRow(CARDGAME_highlightCluts[(screen->time >> 2) % 6] + 5);
299 } else {
300 drawer.setClutRow(4);
301 }
302 /* both scales at 0x1000, read as one word */
303 if (isScaled(sprite)) {
304 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
305 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
306 }
307 drawer.setLayerId(0x100, 1);
308 drawer.setTexture(0x340, 0);
309 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 8, sprite->x >> 8, sprite->y >> 8);
310 }
311 if (sprite->highlight & 1) {
312 initSpriteDrawer(&drawer);
313 drawer.setClutRow(CARDGAME_highlightCluts[(screen->time >> 2) % 6]);
314 /* both scales at 0x1000, read as one word */
315 if (isScaled(sprite)) {
316 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
317 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
318 }
319 drawer.setLayerId(0x100, 1);
320 drawer.setTexture(0x340, 0);
321 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 8, sprite->x >> 8, sprite->y >> 8);
322 }
323 }
324}
325
326/* Draws a sprite's order number (order), the place of its card in the record */
328 SpriteDrawer drawer;
329
330 if (sprite->visible != 0 && sprite->order != 0) {
331 initSpriteDrawer(&drawer);
332 /* both scales at 0x1000, read as one word */
333 if (isScaled(sprite)) {
334 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
335 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
336 }
337 drawer.setLayerId(0x100, 1);
338 drawer.setTexture(0x280, 0);
339 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), sprite->order + 0x33, (sprite->x >> 8) + 3, (sprite->y >> 8) + 2);
340 }
341}
342
343/* Draws a card's marks that are set (marks[0..2]: sprites 0x37 to 0x39), in a row 8 pixels apart */
345 SpriteDrawer drawer;
346 s32 i;
347 s32 n;
348
349 if (sprite->visible != 0) {
350 for (i = 0, n = 0; i < 3; i++) {
351 if (sprite->marks[i] != 0) {
352 initSpriteDrawer(&drawer);
353 /* both scales at 0x1000, read as one word */
354 if (isScaled(sprite)) {
355 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
356 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
357 }
358 drawer.setLayerId(0x100, 1);
359 drawer.setTexture(0x280, 0);
360 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), i + 0x37, (sprite->x >> 8) + 3 + n * 8, (sprite->y >> 8) + 0x15);
361 n++;
362 }
363 }
364 }
365}
366
367/* Draws a card's two numbers (ap and hp) and the sprite between them */
368static inline void drawCardNumbers(CardSprite *sprite) {
369 CardNumber number;
370 SpriteDrawer drawer;
371
372 number.depth = 1;
373 number.digits = 2;
374 number.leadingZeros = 0;
375 number.x = (sprite->x >> 8) + 4;
376 number.y = (sprite->y >> 8) + 0x21;
377 number.value = sprite->ap;
378 number.pivotX = (sprite->x >> 8) + 0x14;
379 number.pivotY = (sprite->y >> 8) + 0x17;
380 number.scaleX = sprite->scaleX;
381 number.scaleY = sprite->scaleY;
382 CARDGAME_drawNumber(&number, 1);
383 number.x = (sprite->x >> 8) + 0x17;
384 number.y = (sprite->y >> 8) + 0x21;
385 number.value = sprite->hp;
386 number.pivotX = (sprite->x >> 8) + 0x14;
387 number.pivotY = (sprite->y >> 8) + 0x17;
388 number.scaleX = sprite->scaleX;
389 number.scaleY = sprite->scaleY;
390 CARDGAME_drawNumber(&number, 1);
391 initSpriteDrawer(&drawer);
392 /* both scales at 0x1000, read as one word */
393 if (isScaled(sprite)) {
394 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
395 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
396 }
397 drawer.setLayerId(0x100, 1);
398 drawer.setTexture(0x340, 0);
399 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 0x1F, (sprite->x >> 8) + 0x12, (sprite->y >> 8) + 0x21);
400}
401
402/* Draws the mark (sprite 0x1E) of a card that is not of kind 16 */
403static inline void drawCardMark(CardSprite *sprite) {
404 SpriteDrawer drawer;
405
406 initSpriteDrawer(&drawer);
407 /* both scales at 0x1000, read as one word */
408 if (isScaled(sprite)) {
409 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
410 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
411 }
412 drawer.setLayerId(0x100, 1);
413 drawer.setTexture(0x340, 0);
414 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 0x1E, (sprite->x >> 8) + 4, (sprite->y >> 8) + 0x21);
415}
416
417/* Draws a card sprite: its frame (visible 1, with the numbers or the mark and the image) or its back (visible 2 or 3) */
419 /* the match depends on the early return together with the empty case 0 */
420 if (sprite->visible == 0) {
421 return;
422 }
423 switch (sprite->visible) {
424 case 0:
425 break;
426 case 1:
427 if (sprite->isKind16 != 0) {
428 drawCardNumbers(sprite);
429 } else {
430 drawCardMark(sprite);
431 }
432 {
433 SpriteDrawer drawer;
434
435 initSpriteDrawer(&drawer);
436 /* both scales at 0x1000, read as one word */
437 if (isScaled(sprite)) {
438 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
439 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
440 }
441 drawer.setLayerId(0x100, 1);
442 drawer.setTexture(0x280, 0);
443 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), sprite->dimmed == 1 ? sprite->color + 0x3C : sprite->color,
444 sprite->x >> 8, sprite->y >> 8);
445 }
447 break;
448 case 2: {
449 SpriteDrawer drawer;
450
451 initSpriteDrawer(&drawer);
452 /* both scales at 0x1000, read as one word */
453 if (isScaled(sprite)) {
454 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
455 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
456 }
457 drawer.setLayerId(0x100, 1);
458 drawer.setTexture(0x280, 0);
459 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), 0x10, sprite->x >> 8, sprite->y >> 8);
460 break;
461 }
462 case 3: {
463 SpriteDrawer drawer;
464
465 initSpriteDrawer(&drawer);
466 /* both scales at 0x1000, read as one word */
467 if (isScaled(sprite)) {
468 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
469 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
470 }
471 drawer.setLayerId(0x100, 1);
472 drawer.setTexture(0x280, 0);
473 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 2), 0xC, sprite->x >> 8, sprite->y >> 8);
474 break;
475 }
476 }
477}
478
479/* Draws the shade over a dimmed sprite */
481 SpriteDrawer drawer;
482
483 if (sprite->visible != 0 && sprite->dimmed != 0) {
484 initSpriteDrawer(&drawer);
485 /* both scales at 0x1000, read as one word */
486 if (isScaled(sprite)) {
487 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
488 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
489 }
490 drawer.setLayerId(0x100, 1);
491 drawer.setTexture(0x340, 0);
492 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 10, sprite->x >> 8, sprite->y >> 8);
493 }
494}
495
496/* Draws a blinking sprite's flash (state 11), its CLUT row changing */
498 SpriteDrawer drawer;
499
500 if (sprite->visible != 0 && sprite->state == 11) {
501 initSpriteDrawer(&drawer);
502 drawer.setClutRow((sprite->duration / 2) % 5);
503 drawer.setPivot((sprite->x >> 8) + 0x14, (sprite->y >> 8) + 0x17);
504 drawer.setScale(sprite->scaleX, sprite->scaleY, 0x1000);
505 drawer.setLayerId(0x100, 1);
506 drawer.setTexture(0x340, 0);
507 drawer.draw(FILE_CACHE.getEntry(FILE_CARDGAME_TIMS << 16 | 3), 9, sprite->x >> 8, sprite->y >> 8);
508 }
509}
510
511/* Runs a sprite's animation for its state; sets bit 0 of spriteFlags while one runs */
513 switch (sprite->state) {
514 case 0:
515 sprite->visible = 0;
516 break;
517 case 2:
518 case 3:
519 screen->spriteFlags |= 1;
520 CARDGAME_moveSprite(screen, sprite);
521 break;
522 case 4:
523 screen->spriteFlags |= 1;
524 CARDGAME_flipSprite(screen, sprite);
525 break;
526 case 5:
527 screen->spriteFlags |= 1;
528 if (CARDGAME_flySprite(screen, sprite) != 0) {
529 screen->spriteFlags |= 2;
530 }
531 break;
532 case 6:
533 screen->spriteFlags |= 1;
534 CARDGAME_jitterSprite(screen, sprite);
535 break;
536 case 7:
537 screen->spriteFlags |= 1;
538 CARDGAME_shakeSprite(screen, sprite);
539 break;
540 case 8:
541 screen->spriteFlags |= 1;
542 CARDGAME_holdSpriteThenBlink(screen, sprite);
543 break;
544 case 11:
545 screen->spriteFlags |= 1;
546 sprite->duration += GFX.funcs.getFrameTime();
547 if (sprite->duration >= 11) {
548 sprite->state = 1;
549 }
550 break;
551 case 9:
552 CARDGAME_holdSprite(screen, sprite, 36);
553 screen->spriteFlags |= 1;
554 break;
555 case 10:
556 CARDGAME_holdSprite(screen, sprite, 28);
557 screen->spriteFlags |= 1;
558 break;
559 case 1:
560 break;
561 }
562}
563
564/* Draws a sprite and its marks, unless it is scaled to nothing */
566 if (sprite->scaleX != 0 && sprite->scaleY != 0) {
567 CARDGAME_drawSpriteHighlights(screen, sprite);
568 CARDGAME_drawSpriteMarks(screen, sprite);
569 CARDGAME_drawSpriteOrder(screen, sprite);
570 CARDGAME_drawSpriteEffect(screen, sprite);
571 CARDGAME_drawSpriteDim(screen, sprite);
572 CARDGAME_drawSpriteCard(screen, sprite);
573 }
574}
575
576/* Animates the sprites, then draws them: the moving ones first */
578 s32 i;
579 s32 pass;
580
581 for (i = 39; i >= 0; i--) {
582 CARDGAME_animateSprite(screen, items, &screen->sprites[i]);
583 CARDGAME_drawSpriteBlink(screen, &screen->sprites[i]);
584 }
585 for (pass = 0; pass < 2; pass++) {
586 for (i = 39; i >= 0; i--) {
587 if ((pass == 0 && screen->sprites[i].moving != 0) || (pass != 0 && screen->sprites[i].moving == 0)) {
588 CARDGAME_drawSprite(screen, &screen->sprites[i]);
589 }
590 }
591 }
592}
CARDGAME.PRO: the card battle (mode 0x700).
u8 CARDGAME_highlightCluts[]
a palette cycle: 0, 1, 2, 3, 2, 1
Definition cardgame_3.c:82
u8 CARDGAME_loopFrames[]
the frames of a sprite's effect 1, which loops
Definition cardgame_3.c:76
u8 CARDGAME_onceFrames[]
the frames of its effect 2, which plays once
Definition cardgame_3.c:79
s16 CARDGAME_shakeOffsets[]
CARDGAME_shakeSprite's x offsets, by time.
Definition cardgame_3.c:65
s16 CARDGAME_jitterOffsets[]
CARDGAME_jitterSprite's x and y offsets.
Definition cardgame_3.c:68
s32 CARDGAME_pictureSheet[]
the sprite sheet CARDGAME_drawCardPicture draws a card's picture with
Definition cardgame_3.c:71
signed int s32
Definition common.h:11
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
FileCache FILE_CACHE
The file cache.
Definition file_cache.c:7
Random RANDOM
Definition random.c:533
#define FILE_CARDGAME_TIMS
CARDGAME's own pictures, a TIM archive.
Definition screen.h:15
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_CARD_001
Definition sound.h:61
void initSpriteDrawer(SpriteDrawer *obj)
Clears a sprite drawer to neutral (no scale, gray tint, follows the scroll), gives it its methods and...
void CARDGAME_drawSpriteEffect(CardScreen *screen, CardSprite *sprite)
Draws a sprite's effect animation (1-4, frames 0x28-0x4C of the fourth TIM) and ends it when its time...
Definition sprites.c:242
void CARDGAME_updateSprites(CardScreen *screen, CardScreenItems *items)
Animates the sprites, then draws them: the moving ones first.
Definition sprites.c:577
static void endSpriteFlip(CardSprite *sprite, s32 state)
The end of a sprite's flip (CARDGAME_flipSprite)
Definition sprites.c:174
static void drawCardMark(CardSprite *sprite)
Draws the mark (sprite 0x1E) of a card that is not of kind 16.
Definition sprites.c:403
void CARDGAME_animateSprite(CardScreen *screen, CardScreenItems *items, CardSprite *sprite)
Runs a sprite's animation for its state; sets bit 0 of spriteFlags while one runs.
Definition sprites.c:512
void CARDGAME_drawSpriteBlink(CardScreen *screen, CardSprite *sprite)
Draws a blinking sprite's flash (state 11), its CLUT row changing.
Definition sprites.c:497
s32 CARDGAME_holdSprite(CardScreen *screen, CardSprite *sprite, s32 duration)
Holds a sprite for duration frames, then ends its effect: 1 at the end.
Definition sprites.c:140
void CARDGAME_drawSpriteHighlights(CardScreen *screen, CardSprite *sprite)
Draws the highlights over a sprite (highlight bits 0-2), with a cycling palette.
Definition sprites.c:291
s32 CARDGAME_flipSprite(CardScreen *screen, CardSprite *sprite)
Turns a sprite over for 12 frames, its side swapped after 7: 1 at the end.
Definition sprites.c:181
static s32 isScaled(CardSprite *sprite)
Whether sprite is scaled: its scaleX and scaleY, read as one word, aren't both 0x1000.
Definition sprites.c:7
void CARDGAME_drawSpriteMarks(CardScreen *screen, CardSprite *sprite)
Draws a card's marks that are set (marks[0..2]: sprites 0x37 to 0x39), in a row 8 pixels apart.
Definition sprites.c:344
void CARDGAME_drawSpriteOrder(CardScreen *screen, CardSprite *sprite)
Draws a sprite's order number (order), the place of its card in the record.
Definition sprites.c:327
s32 CARDGAME_holdSpriteThenBlink(CardScreen *screen, CardSprite *sprite)
Holds a sprite for 10 frames, then starts its blink: 1 at the end.
Definition sprites.c:128
void CARDGAME_drawSpriteCard(CardScreen *screen, CardSprite *sprite)
Draws a card sprite: its frame (visible 1, with the numbers or the mark and the image) or its back (v...
Definition sprites.c:418
s32 CARDGAME_jitterSprite(CardScreen *screen, CardSprite *sprite)
Jitters a sprite about where it started and squashes it, for 12 frames: 1 at the end.
Definition sprites.c:153
static void drawCardNumbers(CardSprite *sprite)
Draws a card's two numbers (ap and hp) and the sprite between them.
Definition sprites.c:368
void CARDGAME_drawSprite(CardScreen *screen, CardSprite *sprite)
Draws a sprite and its marks, unless it is scaled to nothing.
Definition sprites.c:565
static void resetSprite(CardSprite *sprite, s32 state)
Ends a sprite's move and puts it in STATE.
Definition sprites.c:119
static void * getSheetPart(s32 *sheet, s32 offset)
The part of a sprite sheet at offset, one of the offsets it starts with.
Definition sprites.c:198
s32 CARDGAME_shakeSprite(CardScreen *screen, CardSprite *sprite)
Shakes a sprite sideways and stretches it, for 12 frames: 1 at the end.
Definition sprites.c:101
void CARDGAME_drawCardPicture(CardSprite *sprite)
Draws a card's picture: a one-part sprite sheet (CARDGAME_pictureSheet) made on the fly,...
Definition sprites.c:204
s32 CARDGAME_flySprite(CardScreen *screen, CardSprite *sprite)
Flies a sprite from start to target along an arc while scaling it; at the end it swaps start and targ...
Definition sprites.c:42
void CARDGAME_moveSprite(CardScreen *screen, CardSprite *sprite)
Moves and scales a sprite towards its targets; at the end it plays a sound (unless in state 3) and go...
Definition sprites.c:12
void CARDGAME_drawSpriteDim(CardScreen *screen, CardSprite *sprite)
Draws the shade over a dimmed sprite.
Definition sprites.c:480
A number drawn with the TIM archive's digits (CARDGAME_drawNumber)
Definition screen.h:73
s16 x
Definition screen.h:75
u8 leadingZeros
Definition screen.h:82
s16 pivotX
Definition screen.h:79
s16 scaleX
Definition screen.h:77
u8 digits
Definition screen.h:81
s16 y
Definition screen.h:76
s16 value
Definition screen.h:74
s16 scaleY
Definition screen.h:78
u8 depth
Definition screen.h:83
s16 pivotY
Definition screen.h:80
The battle screen's task items.
Definition screen.h:87
The battle screen (created by CARDGAME_createScreen): the two panels, the cards on the table and the ...
Definition screen.h:263
u32 time
Definition screen.h:267
CardSprite sprites[40]
Definition screen.h:271
s32 spriteFlags
this frame: bit 0 a sprite is animated, bit 1 a flying one landed
Definition screen.h:266
A card on the battle screen (CardScreen.sprites)
Definition screen.h:163
s32 growTime
the frames it grows for before it flies (CARDGAME_flySprite)
Definition screen.h:180
s16 index
in the battle's card list
Definition screen.h:183
s16 moving
Definition screen.h:177
u8 ap
the values shown, which count towards the slot's
Definition screen.h:188
s16 targetScaleY
Definition screen.h:173
s32 duration
Definition screen.h:179
u8 dimmed
Definition screen.h:194
s16 color
the card's colour, from 0
Definition screen.h:182
s32 startY
Definition screen.h:169
s32 startX
Definition screen.h:168
s16 targetScaleX
Definition screen.h:172
s16 startScaleX
Definition screen.h:174
s32 effectTime
Definition screen.h:181
s32 targetY
Definition screen.h:167
s32 time
Definition screen.h:178
u8 order
a played card's place in the record, from 1
Definition screen.h:191
u8 visible
Definition screen.h:190
u8 highlight
bit 0 the cursor, bit 1 picked, bit 2 glowing
Definition screen.h:193
s16 isKind16
Definition screen.h:184
s16 startScaleY
Definition screen.h:175
s32 targetX
Definition screen.h:166
s16 scaleX
Definition screen.h:170
u8 marks[3]
the plays that apply to the card, drawn as marks
Definition screen.h:185
u8 effect
1-4, drawn by CARDGAME_drawSpriteEffect
Definition screen.h:192
s16 scaleY
Definition screen.h:171
void *(* getEntry)(u32 fileAndIndex)
Definition file.h:96
s32(* getFrameTime)(void)
Definition gfx.h:32
GfxFuncs funcs
Definition gfx.h:77
s32(* next)(void)
0 to RANDOM_COUNT - 1
Definition random.h:15
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(* setAltClut)()
(x, y)
Definition gfx.h:243
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(* setClutRow)()
(row)
Definition gfx.h:247
void(* draw)()
(sheet, frame, x, y)
Definition gfx.h:246
void(* setTexture)()
(x, y)
Definition gfx.h:242
One part of a sprite sheet, a rectangle of its texture.
Definition gfx.h:285
s16 h
Definition gfx.h:289
s16 v
Definition gfx.h:287
s16 u
Definition gfx.h:286
s16 clutX
added to the drawer's CLUT position
Definition gfx.h:290
s16 w
Definition gfx.h:288
s16 clutY
Definition gfx.h:291
s16 mode
0: 4-bit texture, 1: 8-bit, with the drawer's other CLUT
Definition gfx.h:292
void CARDGAME_drawNumber(CardNumber *number, s32 scaled)
Draws a number with the TIM archive's digits, seven pixels apart, without leading zeros unless asked;...
Definition windows.c:41