Digimon World 3 decomp
The European version, SLES_039.36
Loading...
Searching...
No Matches
fader.c
Go to the documentation of this file.
1/* CARDGAME's screen fader. */
2
4
5/* Draws the fader over RECT, in layer 0x100 */
6void CARDGAME_drawFader(CardFader *fader, RECT rect) {
7 Layer *layer = GFX.funcs.getLayer(0x100);
8 u_long *ot = layer->getOtEntry(layer, 0);
9 POLY_F4 *poly = GFX.funcs.getPrim();
10 DR_TPAGE *mode;
11
12 poly->r0 = fader->color[0];
13 poly->g0 = fader->color[1];
14 poly->b0 = fader->color[2];
15 setlen(poly, 5);
16 poly->code = 0x2A;
17 poly->x0 = rect.x;
18 poly->x1 = rect.x + rect.w;
19 poly->x2 = rect.x;
20 poly->x3 = rect.x + rect.w;
21 poly->y0 = rect.y;
22 poly->y1 = rect.y;
23 poly->y2 = rect.y + rect.h;
24 poly->y3 = rect.y + rect.h;
25 addPrim(ot, poly);
26 mode = (DR_TPAGE *)(poly + 1);
27 setlen(mode, 1);
28 mode->code[0] = ((fader->blend & 3) << 5) | 0xE1000205;
29 addPrim(ot, mode);
30 GFX.funcs.setPrim(mode + 1);
31}
32
33/* Moves the colour towards the target as the time runs out */
35 s32 i;
36
37 fader->time -= GFX.funcs.getFrameTime();
38 if (fader->time > 0) {
39 for (i = 0; i < 3; i++) {
40 fader->color[i] = fader->target[i] - (fader->target[i] - fader->from[i]) * fader->time / fader->duration;
41 }
42 return;
43 }
44 if (fader->killWhenDone != 0) {
45 fader->mode = 2;
46 return;
47 }
48 fader->mode = 0;
49 fader->color[0] = fader->target[0];
50 fader->color[1] = fader->target[1];
51 fader->color[2] = fader->target[2];
52}
53
54/* Sets the colour at once */
55void CARDGAME_setFaderColor(CardFader *fader, u8 r, u8 g, u8 b) {
56 fader->color[0] = r;
57 fader->color[1] = g;
58 fader->color[2] = b;
59}
60
61/* Fades from the current colour to r, g, b in FRAMES vsyncs; the task
62 ends at the end when KILLWHENDONE is set */
63void CARDGAME_startFade(CardFader *fader, u8 r, u8 g, u8 b, s32 frames, s32 killWhenDone) {
64 s32 i;
65
66 for (i = 0; i < 3; i++) {
67 fader->from[i] = fader->color[i];
68 }
69 fader->target[0] = r;
70 fader->target[1] = g;
71 fader->target[2] = b;
72 fader->time = frames;
73 fader->duration = frames;
74 fader->mode = 1;
75 fader->killWhenDone = killWhenDone;
76}
77
78/* 1 once the fade has reached its colour */
80 return fader->mode == 0;
81}
82
83/* Ends the task */
85 fader->mode = 2;
86}
87
88/* A fader's task: steps its fade while fading, draws it over
89 CARDGAME_fadeRect every frame and ends once killed */
91 switch (fader->state) {
92 case 0:
93 default:
94 fader->nextState(fader);
95 break;
96 case 1:
97 if (fader->mode == 1) {
98 CARDGAME_stepFader(fader);
99 }
101 if (fader->mode == 2) {
102 fader->setState(fader, 3);
103 }
104 break;
105 case 2:
106 case 3:
107 break;
108 }
109}
110
111/* Creates a fader, with the semi-transparency rate BLEND */
113 CardFader *fader = createTask(CARDGAME_tickFader, sizeof(CardFader), 4);
114
116 fader->start = CARDGAME_startFade;
118 fader->blend = blend;
119 fader->kill = CARDGAME_killFader;
120 return fader;
121}
CARDGAME.PRO: the card battle (mode 0x700).
CardFader * CARDGAME_createFader(u8 blend)
Creates a fader, with the semi-transparency rate BLEND.
Definition fader.c:112
void CARDGAME_tickFader(CardFader *fader)
A fader's task: steps its fade while fading, draws it over CARDGAME_fadeRect every frame and ends onc...
Definition fader.c:90
void CARDGAME_setFaderColor(CardFader *fader, u8 r, u8 g, u8 b)
Sets the colour at once.
Definition fader.c:55
void CARDGAME_killFader(CardFader *fader)
Ends the task.
Definition fader.c:84
void CARDGAME_drawFader(CardFader *fader, RECT rect)
Draws the fader over RECT, in layer 0x100.
Definition fader.c:6
void CARDGAME_startFade(CardFader *fader, u8 r, u8 g, u8 b, s32 frames, s32 killWhenDone)
Fades from the current colour to r, g, b in FRAMES vsyncs; the task ends at the end when KILLWHENDONE...
Definition fader.c:63
void CARDGAME_stepFader(CardFader *fader)
Moves the colour towards the target as the time runs out.
Definition fader.c:34
s32 CARDGAME_isFadeDone(CardFader *fader)
1 once the fade has reached its colour
Definition fader.c:79
RECT CARDGAME_fadeRect
Definition cardgame_3.c:178
signed int s32
Definition common.h:11
unsigned char u8
Definition common.h:8
GfxState GFX
GFX: the graphics state and its methods.
Definition display.c:209
Fades the screen to a colour: a POLY_F4 over it, blended (blend is the semi-transparency rate)
Definition screen.h:34
u8 color[3]
Definition screen.h:43
s32 state
Definition screen.h:35
s32 time
left
Definition screen.h:37
u8 from[3]
Definition screen.h:42
void(* kill)(struct CardFader *fader)
Definition screen.h:47
void(* setState)(struct CardFader *task, s32 state)
Definition screen.h:35
void(* setColor)(struct CardFader *fader, u8 r, u8 g, u8 b)
Definition screen.h:44
u8 blend
Definition screen.h:39
s32 duration
Definition screen.h:38
u8 killWhenDone
Definition screen.h:40
u8 target[3]
Definition screen.h:41
s32(* isDone)(struct CardFader *fader)
Definition screen.h:46
void(* nextState)(struct CardFader *task)
Definition screen.h:35
s32 mode
0 idle, 1 fading, 2 done: the task ends
Definition screen.h:36
void(* start)(struct CardFader *fader, u8 r, u8 g, u8 b, s32 frames, s32 killWhenDone)
Definition screen.h:45
void *(* getPrim)(void)
Definition gfx.h:19
s32(* getFrameTime)(void)
Definition gfx.h:32
struct Layer *(* getLayer)(s32 id)
Definition gfx.h:28
void(* setPrim)(void *next)
Definition gfx.h:20
GfxFuncs funcs
Definition gfx.h:77
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
void * createTask(void(*update)(), s32 size, s32 childrenSize)
createTaskWithId for a task nothing needs to find
Definition task.c:105