1/*******************************************************************************************
2*
3* SKULLY ESCAPE [KING GAME JAM 2015]
4*
5* A scary graphic adventure in an old mansion
6*
7* This game has been created using raylib 1.6 (www.raylib.com)
8* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
9*
10* Copyright (c) 2015 Ramon Santamaria (@raysan5)
11*
12********************************************************************************************/
13
14#include "raylib.h"
15#include "screens/screens.h" // NOTE: Defines global variable: currentScreen
16
17#include "player.h"
18
19#if defined(PLATFORM_WEB)
20 #include <emscripten/emscripten.h>
21#endif
22
23//----------------------------------------------------------------------------------
24// Global Variables Definition (local to this module)
25//----------------------------------------------------------------------------------
26const int screenWidth = 1280;
27const int screenHeight = 720;
28
29// Required variables to manage screen transitions (fade-in, fade-out)
30float transAlpha = 0;
31bool onTransition = false;
32bool transFadeOut = false;
33int transFromScreen = -1;
34int transToScreen = -1;
35
36static int framesCounter = 0;
37
38Music music;
39
40//----------------------------------------------------------------------------------
41// Local Functions Declaration
42//----------------------------------------------------------------------------------
43void TransitionToScreen(int screen);
44void ChangeToScreen(int screen); // No transition effect
45void UpdateTransition(void);
46void DrawTransition(void);
47
48void UpdateDrawFrame(void); // Update and Draw one frame
49
50//----------------------------------------------------------------------------------
51// Main entry point
52//----------------------------------------------------------------------------------
53int main(void)
54{
55 // Initialization (Note windowTitle is unused on Android)
56 //---------------------------------------------------------
57 InitWindow(screenWidth, screenHeight, "SKULLY ESCAPE [KING GAMEJAM 2015]");
58
59 // Global data loading (assets that must be available in all screens, i.e. fonts)
60 InitAudioDevice();
61
62 music = LoadMusicStream("resources/audio/come_play_with_me.ogg");
63 PlayMusicStream(music);
64
65 font = LoadFont("resources/textures/alagard.png");
66 doors = LoadTexture("resources/textures/doors.png");
67 sndDoor = LoadSound("resources/audio/door.ogg");
68 sndScream = LoadSound("resources/audio/scream.ogg");
69
70 InitPlayer();
71
72 // Setup and Init first screen
73 currentScreen = LOGO;
74 InitLogoScreen();
75
76#if defined(PLATFORM_WEB)
77 emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
78#else
79 SetTargetFPS(60); // Set our game to run at 60 frames-per-second
80 //--------------------------------------------------------------------------------------
81
82 // Main game loop
83 while (!WindowShouldClose()) // Detect window close button or ESC key
84 {
85 UpdateDrawFrame();
86 }
87#endif
88
89 // De-Initialization
90 //--------------------------------------------------------------------------------------
91
92 // Unload all global loaded data (i.e. fonts) here!
93 UnloadPlayer();
94 UnloadFont(font);
95 UnloadTexture(doors);
96 UnloadSound(sndDoor);
97 UnloadSound(sndScream);
98
99 UnloadMusicStream(music);
100
101 CloseAudioDevice();
102
103 CloseWindow(); // Close window and OpenGL context
104 //--------------------------------------------------------------------------------------
105
106 return 0;
107}
108
109void TransitionToScreen(int screen)
110{
111 onTransition = true;
112 transFromScreen = currentScreen;
113 transToScreen = screen;
114}
115
116void ChangeToScreen(int screen)
117{
118 switch (currentScreen)
119 {
120 case LOGO: UnloadLogoScreen(); break;
121 case LOGO_RL: rlUnloadLogoScreen(); break;
122 case TITLE: UnloadTitleScreen(); break;
123 case ATTIC: UnloadAtticScreen(); break;
124 case AISLE01: UnloadAisle01Screen();break;
125 case AISLE02: UnloadAisle02Screen();break;
126 case ARMORY: UnloadArmoryScreen();break;
127 case LIVINGROOM: UnloadLivingroomScreen();break;
128 case KITCHEN: UnloadKitchenScreen(); break;
129 case BATHROOM: UnloadBathroomScreen(); break;
130 case ENDING: UnloadEndingScreen(); break;
131 default: break;
132 }
133
134 switch (screen)
135 {
136 case LOGO: InitLogoScreen(); break;
137 case LOGO_RL: rlInitLogoScreen(); break;
138 case TITLE: InitTitleScreen(); break;
139 case ATTIC: InitAtticScreen(); break;
140 case AISLE01: InitAisle01Screen();break;
141 case AISLE02: InitAisle02Screen();break;
142 case ARMORY: InitArmoryScreen();break;
143 case LIVINGROOM: InitLivingroomScreen();break;
144 case KITCHEN: InitKitchenScreen(); break;
145 case BATHROOM: InitBathroomScreen(); break;
146 case ENDING: InitEndingScreen(); break;
147 default: break;
148 }
149
150 currentScreen = screen;
151}
152
153void UpdateTransition(void)
154{
155 if (!transFadeOut)
156 {
157 transAlpha += 0.05f;
158
159 if (transAlpha >= 1.0)
160 {
161 transAlpha = 1.0;
162
163 switch (transFromScreen)
164 {
165 case LOGO: UnloadLogoScreen(); break;
166 case LOGO_RL: rlUnloadLogoScreen(); break;
167 case TITLE: UnloadTitleScreen(); break;
168 case ATTIC: UnloadAtticScreen(); break;
169 case AISLE01: UnloadAisle01Screen();break;
170 case AISLE02: UnloadAisle02Screen();break;
171 case ARMORY: UnloadArmoryScreen();break;
172 case LIVINGROOM: UnloadLivingroomScreen();break;
173 case KITCHEN: UnloadKitchenScreen(); break;
174 case BATHROOM: UnloadBathroomScreen(); break;
175 case ENDING: UnloadEndingScreen(); break;
176 default: break;
177 }
178
179 switch (transToScreen)
180 {
181 case LOGO:
182 {
183 InitLogoScreen();
184 currentScreen = LOGO;
185 } break;
186 case LOGO_RL:
187 {
188 rlInitLogoScreen();
189 currentScreen = LOGO_RL;
190 } break;
191 case TITLE:
192 {
193 InitTitleScreen();
194 currentScreen = TITLE;
195 } break;
196 case ATTIC:
197 {
198 InitAtticScreen();
199 currentScreen = ATTIC;
200 } break;
201 case AISLE01:
202 {
203 InitAisle01Screen();
204 currentScreen = AISLE01;
205 } break;
206 case AISLE02:
207 {
208 InitAisle02Screen();
209 currentScreen = AISLE02;
210 } break;
211 case BATHROOM:
212 {
213 InitBathroomScreen();
214 currentScreen = BATHROOM;
215 } break;
216 case LIVINGROOM:
217 {
218 InitLivingroomScreen();
219 currentScreen = LIVINGROOM;
220 } break;
221 case KITCHEN:
222 {
223 InitKitchenScreen();
224 currentScreen = KITCHEN;
225 } break;
226 case ARMORY:
227 {
228 InitArmoryScreen();
229 currentScreen = ARMORY;
230 } break;
231 case ENDING:
232 {
233 InitEndingScreen();
234 currentScreen = ENDING;
235 } break;
236 default: break;
237 }
238
239 transFadeOut = true;
240 }
241 }
242 else // Transition fade out logic
243 {
244 transAlpha -= 0.05f;
245
246 if (transAlpha <= 0)
247 {
248 transAlpha = 0;
249 transFadeOut = false;
250 onTransition = false;
251 transFromScreen = -1;
252 transToScreen = -1;
253 }
254 }
255}
256
257void DrawTransition(void)
258{
259 DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha));
260}
261
262// Update and draw game frame
263void UpdateDrawFrame(void)
264{
265 // Update
266 //----------------------------------------------------------------------------------
267 if (!onTransition)
268 {
269 if (player.dead)
270 {
271 framesCounter++;
272
273 if (framesCounter > 80)
274 {
275 framesCounter = 0;
276 player.dead = false;
277 player.numLifes = 4;
278
279 TransitionToScreen(TITLE);
280 }
281 }
282
283 switch(currentScreen)
284 {
285 case LOGO:
286 {
287 UpdateLogoScreen();
288
289 if (FinishLogoScreen()) ChangeToScreen(LOGO_RL);
290
291 } break;
292 case LOGO_RL:
293 {
294 rlUpdateLogoScreen();
295
296 if (rlFinishLogoScreen()) TransitionToScreen(TITLE);
297
298 } break;
299 case TITLE:
300 {
301 UpdateTitleScreen();
302
303 if (FinishTitleScreen() == 1) TransitionToScreen(ATTIC);
304
305 } break;
306 case ATTIC:
307 {
308 UpdateAtticScreen();
309
310 if (FinishAtticScreen() == 1) TransitionToScreen(AISLE01);
311
312 } break;
313 case AISLE01:
314 {
315 UpdateAisle01Screen();
316
317 if (FinishAisle01Screen() == 1) TransitionToScreen(BATHROOM);
318 else if(FinishAisle01Screen() == 2) TransitionToScreen(KITCHEN);
319 else if(FinishAisle01Screen() == 3) TransitionToScreen(LIVINGROOM);
320
321 } break;
322 case BATHROOM:
323 {
324 UpdateBathroomScreen();
325
326 if (FinishBathroomScreen() == 1) TransitionToScreen(AISLE01);
327
328 } break;
329 case LIVINGROOM:
330 {
331 UpdateLivingroomScreen();
332
333 if (FinishLivingroomScreen() == 1) TransitionToScreen(AISLE01);
334 else if(FinishLivingroomScreen() == 2)TransitionToScreen(AISLE02);
335
336 } break;
337 case AISLE02:
338 {
339 UpdateAisle02Screen();
340
341 if (FinishAisle02Screen() == 1) TransitionToScreen(KITCHEN);
342
343 } break;
344 case KITCHEN:
345 {
346 UpdateKitchenScreen();
347
348 if (FinishKitchenScreen() == 1) TransitionToScreen(ARMORY);
349 else if(FinishKitchenScreen() == 2)TransitionToScreen(AISLE02);
350
351 } break;
352 case ARMORY:
353 {
354 UpdateArmoryScreen();
355
356 if(FinishArmoryScreen() == 1) TransitionToScreen(ENDING);
357 else if(FinishArmoryScreen() == 2) TransitionToScreen(KITCHEN);
358
359 } break;
360 case ENDING:
361 {
362 UpdateEndingScreen();
363
364 if (FinishEndingScreen()) TransitionToScreen(TITLE);
365
366 } break;
367 default: break;
368 }
369 }
370 else
371 {
372 // Update transition (fade-in, fade-out)
373 UpdateTransition();
374 }
375
376 UpdateMusicStream(music);
377 //----------------------------------------------------------------------------------
378
379 // Draw
380 //----------------------------------------------------------------------------------
381 BeginDrawing();
382
383 ClearBackground(RAYWHITE);
384
385 switch(currentScreen)
386 {
387 case LOGO: DrawLogoScreen(); break;
388 case LOGO_RL: rlDrawLogoScreen(); break;
389 case TITLE: DrawTitleScreen(); break;
390 case ATTIC: DrawAtticScreen(); break;
391 case AISLE01: DrawAisle01Screen();break;
392 case AISLE02: DrawAisle02Screen();break;
393 case BATHROOM: DrawBathroomScreen();break;
394 case LIVINGROOM: DrawLivingroomScreen();break;
395 case KITCHEN: DrawKitchenScreen();break;
396 case ARMORY: DrawArmoryScreen();break;
397 case ENDING: DrawEndingScreen(); break;
398 default: break;
399 }
400
401 if (onTransition) DrawTransition();
402
403 //DrawFPS(10, 10);
404
405 EndDrawing();
406 //----------------------------------------------------------------------------------
407}
408
409