1/*******************************************************************************************
2*
3* WAVE COLLECTOR [GLOBAL GAME JAM 2017]
4*
5* The ultimate wave particles collector is here!
6* You must follow the wave and collect all the particles
7* The level is actually the wave and the wave is the level!
8* Be fast! Be smart! Be the best wave collector!
9*
10* This game has been created using raylib v1.7 (www.raylib.com)
11* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
12*
13* Copyright (c) 2017 Ramon Santamaria (@raysan5)
14*
15********************************************************************************************/
16
17#include "raylib.h"
18#include "screens/screens.h" // NOTE: Defines global variable: currentScreen
19
20#include <stdlib.h>
21
22#include <stdio.h> // Required for: printf()
23#include <string.h> // Required for: strcpy()
24
25#if defined(PLATFORM_WEB)
26 #include <emscripten/emscripten.h>
27#endif
28
29//----------------------------------------------------------------------------------
30// Global Variables Definition (local to this module)
31//----------------------------------------------------------------------------------
32const int screenWidth = 1280;
33const int screenHeight = 720;
34
35// Required variables to manage screen transitions (fade-in, fade-out)
36static float transAlpha = 0.0f;
37static bool onTransition = false;
38static bool transFadeOut = false;
39static int transFromScreen = -1;
40static int transToScreen = -1;
41
42// NOTE: Some global variables that require to be visible for all screens,
43// are defined in screens.h (i.e. currentScreen)
44
45//----------------------------------------------------------------------------------
46// Local Functions Declaration
47//----------------------------------------------------------------------------------
48static void ChangeToScreen(int screen); // No transition effect
49
50static void TransitionToScreen(int screen);
51static void UpdateTransition(void);
52static void DrawTransition(void);
53
54static void UpdateDrawFrame(void); // Update and Draw one frame
55
56//----------------------------------------------------------------------------------
57// Main entry point
58//----------------------------------------------------------------------------------
59int main(int argc, char *argv[])
60{
61 // Initialization
62 //---------------------------------------------------------
63#if defined(PLATFORM_DESKTOP)
64 // TODO: Support for dropped files on the exe
65
66 // Support command line argument for custom music file
67 if (argc > 1)
68 {
69 // Just supporting an input argument parameter!!! o__O
70
71 if ((IsFileExtension(argv[1], ".ogg")) ||
72 (IsFileExtension(argv[1], ".wav")))
73 {
74 if (sampleFilename != NULL) free(sampleFilename);
75
76 sampleFilename = (char *)malloc(256);
77 strcpy(sampleFilename, argv[1]);
78
79 printf("Custom audio file: %s", sampleFilename);
80 }
81 }
82#endif
83
84#ifndef PLATFORM_ANDROID
85 SetConfigFlags(FLAG_MSAA_4X_HINT);
86#endif
87 // Note windowTitle is unused on Android
88 InitWindow(screenWidth, screenHeight, "WAVE COLLECTOR [GGJ17]");
89
90 // Global data loading (assets that must be available in all screens, i.e. fonts)
91 InitAudioDevice();
92
93 font = LoadFont("resources/font.fnt");
94 music = LoadMusicStream("resources/audio/wave.ogg");
95
96 SetMusicVolume(music, 1.0f);
97
98 // Setup and Init first screen
99 currentScreen = LOGO;
100 InitLogoScreen();
101 //InitTitleScreen();
102 //InitGameplayScreen();
103 //InitEndingScreen();
104
105#if defined(PLATFORM_WEB)
106 emscripten_set_main_loop(UpdateDrawFrame, 0, 1);
107#else
108 SetTargetFPS(60); // Set our game to run at 60 frames-per-second
109 //--------------------------------------------------------------------------------------
110
111 // Main game loop
112 while (!WindowShouldClose()) // Detect window close button or ESC key
113 {
114 UpdateDrawFrame();
115 }
116#endif
117
118 // De-Initialization
119 //--------------------------------------------------------------------------------------
120 switch (currentScreen)
121 {
122 case LOGO: UnloadLogoScreen(); break;
123 case TITLE: UnloadTitleScreen(); break;
124 case GAMEPLAY: UnloadGameplayScreen(); break;
125 case ENDING: UnloadEndingScreen(); break;
126 default: break;
127 }
128
129 // Unload all global loaded data (i.e. fonts) here!
130 UnloadFont(font);
131 UnloadMusicStream(music);
132
133 CloseAudioDevice(); // Close audio context
134
135 CloseWindow(); // Close window and OpenGL context
136 //--------------------------------------------------------------------------------------
137
138 return 0;
139}
140
141//----------------------------------------------------------------------------------
142// Module specific Functions Definition
143//----------------------------------------------------------------------------------
144
145// Change to next screen, no transition
146static void ChangeToScreen(int screen)
147{
148 // Unload current screen
149 switch (currentScreen)
150 {
151 case LOGO: UnloadLogoScreen(); break;
152 case TITLE: UnloadTitleScreen(); break;
153 case GAMEPLAY: UnloadGameplayScreen(); break;
154 case ENDING: UnloadEndingScreen(); break;
155 default: break;
156 }
157
158 // Init next screen
159 switch (screen)
160 {
161 case LOGO: InitLogoScreen(); break;
162 case TITLE: InitTitleScreen(); break;
163 case GAMEPLAY: InitGameplayScreen(); break;
164 case ENDING: InitEndingScreen(); break;
165 default: break;
166 }
167
168 currentScreen = screen;
169}
170
171// Define transition to next screen
172static void TransitionToScreen(int screen)
173{
174 onTransition = true;
175 transFadeOut = false;
176 transFromScreen = currentScreen;
177 transToScreen = screen;
178 transAlpha = 0.0f;
179}
180
181// Update transition effect
182static void UpdateTransition(void)
183{
184 if (!transFadeOut)
185 {
186 transAlpha += 0.05f;
187
188 // NOTE: Due to float internal representation, condition jumps on 1.0f instead of 1.05f
189 // For that reason we compare against 1.01f, to avoid last frame loading stop
190 if ((int)transAlpha >= 1)
191 {
192 transAlpha = 1.0f;
193
194 // Unload current screen
195 switch (transFromScreen)
196 {
197 case LOGO: UnloadLogoScreen(); break;
198 case TITLE: UnloadTitleScreen(); break;
199 case GAMEPLAY: UnloadGameplayScreen(); break;
200 case ENDING: UnloadEndingScreen(); break;
201 default: break;
202 }
203
204 // Load next screen
205 switch (transToScreen)
206 {
207 case LOGO: InitLogoScreen(); break;
208 case TITLE: InitTitleScreen(); break;
209 case GAMEPLAY: InitGameplayScreen(); break;
210 case ENDING: InitEndingScreen(); break;
211 default: break;
212 }
213
214 currentScreen = transToScreen;
215
216 // Activate fade out effect to next loaded screen
217 transFadeOut = true;
218 }
219 }
220 else // Transition fade out logic
221 {
222 transAlpha -= 0.05f;
223
224 if ((int)transAlpha <= 0)
225 {
226 transAlpha = 0.0f;
227 transFadeOut = false;
228 onTransition = false;
229 transFromScreen = -1;
230 transToScreen = -1;
231 }
232 }
233}
234
235// Draw transition effect (full-screen rectangle)
236static void DrawTransition(void)
237{
238 DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, transAlpha));
239}
240
241// Update and draw game frame
242static void UpdateDrawFrame(void)
243{
244 // Update
245 //----------------------------------------------------------------------------------
246 if (!onTransition)
247 {
248 switch(currentScreen)
249 {
250 case LOGO:
251 {
252 UpdateLogoScreen();
253
254 if (FinishLogoScreen()) TransitionToScreen(TITLE);
255
256 } break;
257 case TITLE:
258 {
259 UpdateTitleScreen();
260
261 if (FinishTitleScreen() == 1) TransitionToScreen(GAMEPLAY);
262
263 } break;
264 case GAMEPLAY:
265 {
266 UpdateGameplayScreen();
267
268 if (FinishGameplayScreen() == 1) TransitionToScreen(ENDING);
269 //else if (FinishGameplayScreen() == 2) TransitionToScreen(TITLE);
270
271 } break;
272 case ENDING:
273 {
274 UpdateEndingScreen();
275
276 if (FinishEndingScreen() == 1) TransitionToScreen(TITLE);
277
278 } break;
279 default: break;
280 }
281 }
282 else UpdateTransition(); // Update transition (fade-in, fade-out)
283
284 // TODO: Review! It breaks the game... issues with audio buffering...
285 if (currentScreen != ENDING) UpdateMusicStream(music);
286 //----------------------------------------------------------------------------------
287
288 // Draw
289 //----------------------------------------------------------------------------------
290 BeginDrawing();
291
292 ClearBackground(RAYWHITE);
293
294 switch(currentScreen)
295 {
296 case LOGO: DrawLogoScreen(); break;
297 case TITLE: DrawTitleScreen(); break;
298 case GAMEPLAY: DrawGameplayScreen(); break;
299 case ENDING: DrawEndingScreen(); break;
300 default: break;
301 }
302
303 // Draw full screen rectangle in front of everything
304 if (onTransition) DrawTransition();
305
306 EndDrawing();
307 //----------------------------------------------------------------------------------
308}
309