1 | /******************************************************************************************* |
2 | * |
3 | * LIGHT MY RITUAL [GLOBAL GAME JAM 2016] |
4 | * |
5 | * Preparing a ritual session is not that easy. |
6 | * You must light all the candles before the astral alignment finishes... |
7 | * but dark creatures move in the shadows to put out all your lights! |
8 | * Be fast! Be smart! Light my ritual! |
9 | * |
10 | * This game has been created using raylib 1.6 (www.raylib.com) |
11 | * raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) |
12 | * |
13 | * Copyright (c) 2016 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 | #if defined(PLATFORM_WEB) |
23 | #include <emscripten/emscripten.h> |
24 | #endif |
25 | |
26 | //---------------------------------------------------------------------------------- |
27 | // Global Variables Definition (local to this module) |
28 | //---------------------------------------------------------------------------------- |
29 | const int screenWidth = 1280; |
30 | const int screenHeight = 720; |
31 | |
32 | // Required variables to manage screen transitions (fade-in, fade-out) |
33 | float transAlpha = 0; |
34 | bool onTransition = false; |
35 | bool transFadeOut = false; |
36 | int transFromScreen = -1; |
37 | int transToScreen = -1; |
38 | |
39 | static Music music; |
40 | |
41 | //---------------------------------------------------------------------------------- |
42 | // Local Functions Declaration |
43 | //---------------------------------------------------------------------------------- |
44 | void TransitionToScreen(int screen); |
45 | void ChangeToScreen(int screen); // No transition effect |
46 | void UpdateTransition(void); |
47 | void DrawTransition(void); |
48 | |
49 | void UpdateDrawFrame(void); // Update and Draw one frame |
50 | |
51 | //---------------------------------------------------------------------------------- |
52 | // Main entry point |
53 | //---------------------------------------------------------------------------------- |
54 | int main(void) |
55 | { |
56 | // Initialization (Note windowTitle is unused on Android) |
57 | //--------------------------------------------------------- |
58 | InitWindow(screenWidth, screenHeight, "LIGHT MY RITUAL! [GGJ16]" ); |
59 | |
60 | // Global data loading (assets that must be available in all screens, i.e. fonts) |
61 | InitAudioDevice(); |
62 | |
63 | Image image = LoadImage("resources/lights_map.png" ); // Load image in CPU memory (RAM) |
64 | |
65 | lightsMap = GetImageData(image); // Get image pixels data as an array of Color |
66 | lightsMapWidth = image.width; |
67 | lightsMapHeight = image.height; |
68 | |
69 | UnloadImage(image); // Unload image from CPU memory (RAM) |
70 | |
71 | font = LoadFont("resources/font_arcadian.png" ); |
72 | //doors = LoadTexture("resources/textures/doors.png"); |
73 | //sndDoor = LoadSound("resources/audio/door.ogg"); |
74 | |
75 | music = LoadMusicStream("resources/audio/ambient.ogg" ); |
76 | PlayMusicStream(music); |
77 | SetMusicVolume(music, 1.0f); |
78 | |
79 | // Setup and Init first screen |
80 | currentScreen = LOGO_RL; |
81 | //InitTitleScreen(); |
82 | //InitGameplayScreen(); |
83 | rlInitLogoScreen(); |
84 | |
85 | #if defined(PLATFORM_WEB) |
86 | emscripten_set_main_loop(UpdateDrawFrame, 0, 1); |
87 | #else |
88 | SetTargetFPS(60); // Set our game to run at 60 frames-per-second |
89 | //-------------------------------------------------------------------------------------- |
90 | |
91 | // Main game loop |
92 | while (!WindowShouldClose()) // Detect window close button or ESC key |
93 | { |
94 | UpdateDrawFrame(); |
95 | } |
96 | #endif |
97 | |
98 | // De-Initialization |
99 | //-------------------------------------------------------------------------------------- |
100 | switch (currentScreen) |
101 | { |
102 | case LOGO_RL: rlUnloadLogoScreen(); break; |
103 | case TITLE: UnloadTitleScreen(); break; |
104 | case GAMEPLAY: UnloadGameplayScreen(); break; |
105 | default: break; |
106 | } |
107 | |
108 | // Unload all global loaded data (i.e. fonts) here! |
109 | UnloadFont(font); |
110 | //UnloadSound(sndDoor); |
111 | |
112 | UnloadMusicStream(music); |
113 | |
114 | free(lightsMap); |
115 | |
116 | CloseAudioDevice(); |
117 | |
118 | CloseWindow(); // Close window and OpenGL context |
119 | //-------------------------------------------------------------------------------------- |
120 | |
121 | return 0; |
122 | } |
123 | |
124 | void TransitionToScreen(int screen) |
125 | { |
126 | onTransition = true; |
127 | transFromScreen = currentScreen; |
128 | transToScreen = screen; |
129 | } |
130 | |
131 | void ChangeToScreen(int screen) |
132 | { |
133 | switch (currentScreen) |
134 | { |
135 | case LOGO_RL: rlUnloadLogoScreen(); break; |
136 | case TITLE: UnloadTitleScreen(); break; |
137 | case GAMEPLAY: UnloadGameplayScreen(); break; |
138 | default: break; |
139 | } |
140 | |
141 | switch (screen) |
142 | { |
143 | case LOGO_RL: rlInitLogoScreen(); break; |
144 | case TITLE: InitTitleScreen(); break; |
145 | case GAMEPLAY: InitGameplayScreen(); break; |
146 | default: break; |
147 | } |
148 | |
149 | currentScreen = screen; |
150 | } |
151 | |
152 | void UpdateTransition(void) |
153 | { |
154 | if (!transFadeOut) |
155 | { |
156 | transAlpha += 0.05f; |
157 | |
158 | if (transAlpha >= 1.0) |
159 | { |
160 | transAlpha = 1.0; |
161 | |
162 | switch (transFromScreen) |
163 | { |
164 | case LOGO_RL: rlUnloadLogoScreen(); break; |
165 | case TITLE: UnloadTitleScreen(); break; |
166 | case GAMEPLAY: UnloadGameplayScreen(); break; |
167 | default: break; |
168 | } |
169 | |
170 | switch (transToScreen) |
171 | { |
172 | case LOGO_RL: |
173 | { |
174 | rlInitLogoScreen(); |
175 | currentScreen = LOGO_RL; |
176 | } break; |
177 | case TITLE: |
178 | { |
179 | InitTitleScreen(); |
180 | currentScreen = TITLE; |
181 | } break; |
182 | case GAMEPLAY: |
183 | { |
184 | InitGameplayScreen(); |
185 | currentScreen = GAMEPLAY; |
186 | } break; |
187 | default: break; |
188 | } |
189 | |
190 | transFadeOut = true; |
191 | } |
192 | } |
193 | else // Transition fade out logic |
194 | { |
195 | transAlpha -= 0.05f; |
196 | |
197 | if (transAlpha <= 0) |
198 | { |
199 | transAlpha = 0; |
200 | transFadeOut = false; |
201 | onTransition = false; |
202 | transFromScreen = -1; |
203 | transToScreen = -1; |
204 | } |
205 | } |
206 | } |
207 | |
208 | void DrawTransition(void) |
209 | { |
210 | DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha)); |
211 | } |
212 | |
213 | // Update and draw game frame |
214 | void UpdateDrawFrame(void) |
215 | { |
216 | // Update |
217 | //---------------------------------------------------------------------------------- |
218 | if (!onTransition) |
219 | { |
220 | switch(currentScreen) |
221 | { |
222 | case LOGO_RL: |
223 | { |
224 | rlUpdateLogoScreen(); |
225 | |
226 | if (rlFinishLogoScreen()) TransitionToScreen(TITLE); |
227 | |
228 | } break; |
229 | case TITLE: |
230 | { |
231 | UpdateTitleScreen(); |
232 | |
233 | if (FinishTitleScreen() == 1) |
234 | { |
235 | StopMusicStream(music); |
236 | TransitionToScreen(GAMEPLAY); |
237 | } |
238 | |
239 | } break; |
240 | case GAMEPLAY: |
241 | { |
242 | UpdateGameplayScreen(); |
243 | |
244 | if (FinishGameplayScreen() == 1) ChangeToScreen(LOGO_RL); |
245 | else if (FinishGameplayScreen() == 2) TransitionToScreen(TITLE); |
246 | |
247 | } break; |
248 | default: break; |
249 | } |
250 | } |
251 | else |
252 | { |
253 | // Update transition (fade-in, fade-out) |
254 | UpdateTransition(); |
255 | } |
256 | |
257 | if (currentScreen != GAMEPLAY) UpdateMusicStream(music); |
258 | //---------------------------------------------------------------------------------- |
259 | |
260 | // Draw |
261 | //---------------------------------------------------------------------------------- |
262 | BeginDrawing(); |
263 | |
264 | ClearBackground(RAYWHITE); |
265 | |
266 | switch(currentScreen) |
267 | { |
268 | case LOGO_RL: rlDrawLogoScreen(); break; |
269 | case TITLE: DrawTitleScreen(); break; |
270 | case GAMEPLAY: DrawGameplayScreen(); break; |
271 | default: break; |
272 | } |
273 | |
274 | if (onTransition) DrawTransition(); |
275 | |
276 | //DrawFPS(10, 10); |
277 | |
278 | EndDrawing(); |
279 | //---------------------------------------------------------------------------------- |
280 | } |
281 | |
282 | |