1 #include "HImage.h"
2 #include "Local.h"
3 #include "Timer_Control.h"
4 #include "Sys_Globals.h"
5 #include "Fade_Screen.h"
6 #include "SysUtil.h"
7 #include "Cursor_Control.h"
8 #include "Music_Control.h"
9 #include "Render_Dirty.h"
10 #include "GameLoop.h"
11 #include "VObject.h"
12 #include "Video.h"
13 #include "VSurface.h"
14 #include "UILayout.h"
15
16
17 static ScreenID guiExitScreen;
18 BOOLEAN gfFadeInitialized = FALSE;
19 INT16 gsFadeLimit;
20 UINT32 guiTime;
21 UINT32 guiFadeDelay;
22 BOOLEAN gfFirstTimeInFade = FALSE;
23 INT16 gsFadeCount;
24 static INT8 gbFadeType;
25 INT16 gsFadeRealCount;
26 BOOLEAN gfFadeInVideo;
27
28
29 FADE_FUNCTION gFadeFunction = NULL;
30
31 FADE_HOOK gFadeInDoneCallback = NULL;
32 FADE_HOOK gFadeOutDoneCallback = NULL;
33
34
35 BOOLEAN gfFadeIn = FALSE;
36 BOOLEAN gfFadeOut = FALSE;
37 BOOLEAN gfFadeOutDone = FALSE;
38 BOOLEAN gfFadeInDone = FALSE;
39
40
FadeInNextFrame()41 void FadeInNextFrame( )
42 {
43 gfFadeIn = TRUE;
44 gfFadeInDone = FALSE;
45 }
46
FadeOutNextFrame()47 void FadeOutNextFrame( )
48 {
49 gfFadeOut = TRUE;
50 gfFadeOutDone = FALSE;
51 }
52
53
54 static void BeginFade(ScreenID uiExitScreen, INT8 bFadeValue, INT8 bType, UINT32 uiDelay);
55
56
HandleBeginFadeIn(ScreenID const uiScreenExit)57 BOOLEAN HandleBeginFadeIn(ScreenID const uiScreenExit)
58 {
59 if ( gfFadeIn )
60 {
61 BeginFade( uiScreenExit, 35, FADE_IN_REALFADE, 5 );
62
63 gfFadeIn = FALSE;
64
65 gfFadeInDone = TRUE;
66
67 return( TRUE );
68 }
69
70 return( FALSE );
71 }
72
HandleBeginFadeOut(ScreenID const uiScreenExit)73 BOOLEAN HandleBeginFadeOut(ScreenID const uiScreenExit)
74 {
75 if ( gfFadeOut )
76 {
77 BeginFade( uiScreenExit, 35, FADE_OUT_REALFADE, 5 );
78
79 gfFadeOut = FALSE;
80
81 gfFadeOutDone = TRUE;
82
83 return( TRUE );
84 }
85
86 return( FALSE );
87 }
88
89
HandleFadeOutCallback()90 BOOLEAN HandleFadeOutCallback( )
91 {
92 if ( gfFadeOutDone )
93 {
94 gfFadeOutDone = FALSE;
95
96 if ( gFadeOutDoneCallback != NULL )
97 {
98 gFadeOutDoneCallback( );
99
100 gFadeOutDoneCallback = NULL;
101
102 return( TRUE );
103 }
104 }
105
106 return( FALSE );
107 }
108
109
HandleFadeInCallback()110 BOOLEAN HandleFadeInCallback( )
111 {
112 if ( gfFadeInDone )
113 {
114 gfFadeInDone = FALSE;
115
116 if ( gFadeInDoneCallback != NULL )
117 {
118 gFadeInDoneCallback( );
119 }
120
121 gFadeInDoneCallback = NULL;
122
123 return( TRUE );
124 }
125
126 return( FALSE );
127 }
128
129
130 static void FadeFrameBufferRealFade(void);
131 static void FadeInFrameBufferRealFade(void);
132
133
BeginFade(ScreenID const uiExitScreen,INT8 const bFadeValue,INT8 const bType,UINT32 const uiDelay)134 static void BeginFade(ScreenID const uiExitScreen, INT8 const bFadeValue, INT8 const bType, UINT32 const uiDelay)
135 {
136 //Init some paramters
137 guiExitScreen = uiExitScreen;
138 guiFadeDelay = uiDelay;
139 gfFadeIn = FALSE;
140 gfFadeInVideo = TRUE;
141
142
143 // Calculate step;
144 switch (bType)
145 {
146 case FADE_IN_REALFADE:
147 gsFadeRealCount = -1;
148 gsFadeLimit = 8;
149 gFadeFunction = FadeInFrameBufferRealFade;
150 gfFadeInVideo = FALSE;
151
152 BltVideoSurface(guiSAVEBUFFER, FRAME_BUFFER, 0, 0, NULL);
153 FRAME_BUFFER->Fill(Get16BPPColor(FROMRGB(0, 0, 0)));
154 break;
155
156 case FADE_OUT_REALFADE:
157 gsFadeRealCount = -1;
158 gsFadeLimit = 10;
159 gFadeFunction = FadeFrameBufferRealFade;
160 gfFadeInVideo = FALSE;
161 break;
162 }
163
164 gfFadeInitialized = TRUE;
165 gfFirstTimeInFade = TRUE;
166 gsFadeCount = 0;
167 gbFadeType = bType;
168
169 SetPendingNewScreen(FADE_SCREEN);
170 }
171
172
FadeScreenHandle()173 ScreenID FadeScreenHandle()
174 {
175 UINT32 uiTime;
176
177 if ( !gfFadeInitialized )
178 {
179 SET_ERROR( "Fade Screen called but not intialized " );
180 return( ERROR_SCREEN );
181 }
182
183 // ATE: Remove cursor
184 SetCurrentCursorFromDatabase( VIDEO_NO_CURSOR );
185
186
187 if ( gfFirstTimeInFade )
188 {
189 gfFirstTimeInFade = FALSE;
190
191 // Calcuate delay
192 guiTime = GetJA2Clock( );
193 }
194
195 // Get time
196 uiTime = GetJA2Clock( );
197
198 MusicPoll();
199
200 if ( ( uiTime - guiTime ) > guiFadeDelay )
201 {
202 // Fade!
203 if ( !gfFadeIn )
204 {
205 //gFadeFunction( );
206 }
207
208 InvalidateScreen();
209
210 if ( !gfFadeInVideo )
211 {
212 gFadeFunction( );
213 }
214
215 gsFadeCount++;
216
217 if ( gsFadeCount > gsFadeLimit )
218 {
219 switch( gbFadeType )
220 {
221 case FADE_OUT_REALFADE:
222 FRAME_BUFFER->Fill(Get16BPPColor(FROMRGB(0, 0, 0)));
223 break;
224 }
225
226 //End!
227 gfFadeInitialized = FALSE;
228 gfFadeIn = FALSE;
229
230 return( guiExitScreen );
231 }
232 }
233
234 return( FADE_SCREEN );
235 }
236
237
FadeFrameBufferRealFade(void)238 static void FadeFrameBufferRealFade(void)
239 {
240 if ( gsFadeRealCount != gsFadeCount )
241 {
242 FRAME_BUFFER->ShadowRectUsingLowPercentTable(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
243
244 gsFadeRealCount = gsFadeCount;
245 }
246
247 }
248
249
FadeInFrameBufferRealFade(void)250 static void FadeInFrameBufferRealFade(void)
251 {
252 INT32 cnt;
253
254 if ( gsFadeRealCount != gsFadeCount )
255 {
256
257 for ( cnt = 0; cnt < ( gsFadeLimit - gsFadeCount ); cnt++ )
258 {
259 FRAME_BUFFER->ShadowRectUsingLowPercentTable(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
260 }
261
262 RefreshScreen();
263
264 // Copy save buffer back
265 RestoreExternBackgroundRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
266
267 gsFadeRealCount = gsFadeCount;
268 }
269
270 }
271