NXEngine v1.0.0.6
[NXEngine.git] / screeneffect.cpp
blob5a37c88f366916a5a0bc2a3d6370bbf237f9ff9f
2 #include "nx.h"
3 #include "screeneffect.h"
4 #include "screeneffect.fdh"
6 SE_FlashScreen flashscreen;
7 SE_Starflash starflash;
8 SE_Fade fade;
11 void c------------------------------() {}
14 // FlashScreen simply flashes the screen white several times,
15 // and is used in various places, such as when Misery casts spells.
16 void SE_FlashScreen::Start(void)
18 timer = -1;
19 flashes_left = 5;
20 flashstate = true;
22 enabled = true;
25 void SE_FlashScreen::Draw(void)
27 if (++timer >= 2)
29 timer = 0;
30 flashstate ^= 1;
32 if (!flashstate)
34 if (--flashes_left <= 0)
35 enabled = false;
39 if (flashstate)
40 ClearScreen(0xff, 0xff, 0xff);
44 void c------------------------------() {}
47 // Starflash is a full-screen white explosion in the shape of a '+',
48 // used when some bosses are defeated.
50 void SE_Starflash::Start(int x, int y)
52 sound(SND_EXPLOSION1);
53 enabled = true;
54 state = 0;
55 centerx = x;
56 centery = y;
57 size = speed = 0;
60 void SE_Starflash::Draw(void)
62 SE_Starflash * const &star = this;
63 int scr_x1, scr_y1, scr_x2, scr_y2;
64 int rel_x, rel_y;
66 if (state == 0)
67 { // flash getting bigger
68 star->speed += (1 << CSF);
69 star->size += star->speed;
71 else
72 { // flash getting smaller
73 star->size -= (star->size >> 3);
75 if (star->size < 255)
77 enabled = false;
78 return;
82 // draw the flash
83 rel_x = (star->centerx - map.displayed_xscroll);
84 rel_y = (star->centery - map.displayed_yscroll);
86 // draw a horizontal bar
87 scr_y1 = (rel_y - star->size) >> CSF;
88 scr_y2 = (rel_y + star->size) >> CSF;
89 FillRect(0, scr_y1, SCREEN_WIDTH, scr_y2, 255, 255, 255);
91 if (star->state == 0)
93 // draw a vertical bar
94 scr_x1 = (rel_x - starflash.size) >> CSF;
95 scr_x2 = (rel_x + starflash.size) >> CSF;
96 FillRect(scr_x1, 0, scr_x2, SCREEN_HEIGHT, 255, 255, 255);
98 // once it's big enough, switch to making it smaller
99 if (star->size > (1280<<CSF))
101 star->size = (SCREEN_HEIGHT << CSF);
102 star->state = 1;
108 void c------------------------------() {}
111 #define FADE_LAST_FRAME 15
113 // Fade is the fade-in/out used on every stage transistion/TRA.
114 // Unlike other effects, it is drawn underneath the textboxes and Nikumaru counter,
115 // and so isn't drawn from ScreenEffects::Draw().
117 SE_Fade::SE_Fade()
119 state = FS_NO_FADE;
120 enabled = false;
123 // start a fade in or out.
124 // fadedir: either FADE_IN or FADE_OUT
125 // sweepdir: direction to "sweep" the fade
126 // spr: the sprite to use for the fading
127 void SE_Fade::Start(int fadedir, int sweepdir, int spr)
129 if (fadedir == FADE_OUT)
131 // when fading out, the directions are reversed
132 switch(sweepdir)
134 case FADE_LEFT: sweepdir = FADE_RIGHT; break;
135 case FADE_RIGHT: sweepdir = FADE_LEFT; break;
136 case FADE_UP: sweepdir = FADE_DOWN; break;
137 case FADE_DOWN: sweepdir = FADE_UP; break;
141 state = FS_FADING;
142 enabled = true;
144 fade.sprite = spr;
146 fade.fadedir = fadedir;
147 fade.sweepdir = sweepdir;
148 fade.curframe = (fadedir == FADE_OUT) ? -FADE_LAST_FRAME : FADE_LAST_FRAME;
152 void SE_Fade::Draw(void)
154 int x, y;
156 #define DRAW_VCOLUMN \
158 if (frame >= 0) \
160 if (frame > FADE_LAST_FRAME) frame = FADE_LAST_FRAME; \
162 for(y=0;y<SCREEN_HEIGHT;y+=16) \
163 draw_sprite(x, y, fade.sprite, frame); \
167 #define DRAW_HROW \
169 if (frame >= 0) \
171 if (frame > FADE_LAST_FRAME) frame = FADE_LAST_FRAME; \
173 for(x=0;x<SCREEN_WIDTH;x+=16) \
174 draw_sprite(x, y, fade.sprite, frame); \
178 if (state == FS_NO_FADE)
180 return;
182 else if (state == FS_FADED_OUT)
184 ClearScreen(DK_BLUE);
185 return;
188 int frame = fade.curframe;
189 switch(fade.sweepdir)
191 case FADE_RIGHT:for(x=0;x<SCREEN_WIDTH;x+=16) { DRAW_VCOLUMN; frame++; } break;
192 case FADE_LEFT: for(x=SCREEN_WIDTH-1;x>=-16;x-=16) { DRAW_VCOLUMN; frame++; } break;
193 case FADE_DOWN: for(y=0;y<SCREEN_HEIGHT;y+=16) { DRAW_HROW; frame++; } break;
194 case FADE_UP: for(y=SCREEN_HEIGHT-1;y>=-16;y-=16) { DRAW_HROW; frame++; } break;
196 case FADE_CENTER:
198 int startframe = fade.curframe;
199 int centerx = (SCREEN_WIDTH/2)-8;
200 int centery = (SCREEN_HEIGHT/2)-8;
202 for(x=0;x<centerx+16;x+=16)
204 frame = startframe;
206 for(y=0;y<centery+16;y+=16)
208 if (frame >= 0)
210 if (frame > FADE_LAST_FRAME) frame = FADE_LAST_FRAME;
212 draw_sprite(centerx+x, centery+y, fade.sprite, frame);
213 draw_sprite(centerx-x, centery+y, fade.sprite, frame);
214 draw_sprite(centerx+x, centery-y, fade.sprite, frame);
215 draw_sprite(centerx-x, centery-y, fade.sprite, frame);
218 frame++;
221 startframe++;
224 break;
227 if (fade.fadedir == FADE_OUT)
229 fade.curframe++;
230 if (fade.curframe > FADE_LAST_FRAME)
231 state = FS_FADED_OUT;
233 else
234 { // fading in--terminate fade when done
235 fade.curframe--;
236 if (fade.curframe < -20)
238 state = FS_NO_FADE;
239 enabled = false;
244 void SE_Fade::set_full(int dir)
246 if (dir == FADE_OUT)
248 state = FS_FADED_OUT;
250 fade.fadedir = FADE_OUT;
251 fade.sweepdir = FADE_RIGHT; // doesn't matter
252 fade.curframe = FADE_LAST_FRAME;
253 fade.sprite = SPR_FADE_DIAMOND;
255 else
257 state = FS_NO_FADE;
258 enabled = false;
262 int SE_Fade::getstate(void)
264 return this->state;
268 void c------------------------------() {}
271 void ScreenEffects::Draw(void)
273 if (starflash.enabled)
274 starflash.Draw();
276 if (flashscreen.enabled)
277 flashscreen.Draw();
280 void ScreenEffects::Stop()
282 starflash.enabled = false;
283 flashscreen.enabled = false;