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