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//----------------------------------------------------------------------------------
29const int screenWidth = 1280;
30const int screenHeight = 720;
31
32// Required variables to manage screen transitions (fade-in, fade-out)
33float transAlpha = 0;
34bool onTransition = false;
35bool transFadeOut = false;
36int transFromScreen = -1;
37int transToScreen = -1;
38
39static Music music;
40
41//----------------------------------------------------------------------------------
42// Local Functions Declaration
43//----------------------------------------------------------------------------------
44void TransitionToScreen(int screen);
45void ChangeToScreen(int screen); // No transition effect
46void UpdateTransition(void);
47void DrawTransition(void);
48
49void UpdateDrawFrame(void); // Update and Draw one frame
50
51//----------------------------------------------------------------------------------
52// Main entry point
53//----------------------------------------------------------------------------------
54int 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
124void TransitionToScreen(int screen)
125{
126 onTransition = true;
127 transFromScreen = currentScreen;
128 transToScreen = screen;
129}
130
131void 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
152void 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
208void DrawTransition(void)
209{
210 DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(BLACK, transAlpha));
211}
212
213// Update and draw game frame
214void 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