diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b112f1..b12f427 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,9 +8,15 @@ if(CMAKE_BUILD_TYPE MATCHES DEBUG) add_link_options(-fsanitize=address) endif() - -if(MINGW) - set(CMAKE_C_FLAGS "-Wno-undef --static -windows") +if(EMSCRIPTEN) + set(CMAKE_C_FLAGS "-s USE_SDL=2 -s USE_SDL_IMAGE=2 -s USE_SDL_TTF=2 -s USE_SDL_MIXER=2 -s SDL2_IMAGE_FORMATS='[\"png\"]' -s USE_OGG=1 -sALLOW_MEMORY_GROWTH --use-preload-plugins --preload-file assets") + set(CMAKE_C_FLAGS_DEBUG "-g -O0") + set(CMAKE_C_FLAGS_RELEASE "-O2") + set(CMAKE_EXECUTABLE_SUFFIX_C ".html") + #help with clangd + add_definitions(-D__EMSCRIPTEN__ -DEXIT_RUNTIME=1 -DMUSIC_WAV) +elseif(MINGW) + set(CMAKE_C_FLAGS "-Wno-undef --static") set(CMAKE_C_FLAGS_DEBUG "-g -O0") set(CMAKE_C_FLAGS_RELEASE "-O2") else() @@ -51,5 +57,5 @@ set_property(TARGET LEGEND_OF_ADAME PROPERTY C_STANDARD 23) file(COPY assets DESTINATION ${CMAKE_BINARY_DIR}) if(MINGW) - target_link_libraries(LEGEND_OF_ADAME ws2_32 windows mingw32 SDLmain SDL) + target_link_libraries(LEGEND_OF_ADAME ws2_32) endif() diff --git a/assets/music/chinese rap.mp3 b/assets/music/chinese rap.mp3 deleted file mode 100644 index 2f1ac78..0000000 Binary files a/assets/music/chinese rap.mp3 and /dev/null differ diff --git a/assets/music/chinese rap.ogg b/assets/music/chinese rap.ogg new file mode 100644 index 0000000..e32248c Binary files /dev/null and b/assets/music/chinese rap.ogg differ diff --git a/assets/music/game.ogg b/assets/music/game.ogg new file mode 100644 index 0000000..c2c3d17 Binary files /dev/null and b/assets/music/game.ogg differ diff --git a/assets/music/game.wav b/assets/music/game.wav deleted file mode 100644 index 6b21d0d..0000000 Binary files a/assets/music/game.wav and /dev/null differ diff --git a/assets/music/ko-effect-gain.mp3 b/assets/music/ko-effect-gain.mp3 deleted file mode 100644 index 2cc672b..0000000 Binary files a/assets/music/ko-effect-gain.mp3 and /dev/null differ diff --git a/assets/music/ko-effect-gain.ogg b/assets/music/ko-effect-gain.ogg new file mode 100644 index 0000000..f1dd4e4 Binary files /dev/null and b/assets/music/ko-effect-gain.ogg differ diff --git a/assets/music/ko-effect.mp3 b/assets/music/ko-effect.mp3 deleted file mode 100644 index 03c1c09..0000000 Binary files a/assets/music/ko-effect.mp3 and /dev/null differ diff --git a/assets/music/ko-effect.ogg b/assets/music/ko-effect.ogg new file mode 100644 index 0000000..f8ba70c Binary files /dev/null and b/assets/music/ko-effect.ogg differ diff --git a/assets/music/menu.ogg b/assets/music/menu.ogg new file mode 100644 index 0000000..268ff75 Binary files /dev/null and b/assets/music/menu.ogg differ diff --git a/assets/music/menu.wav b/assets/music/menu.wav deleted file mode 100644 index 8ba9a23..0000000 Binary files a/assets/music/menu.wav and /dev/null differ diff --git a/assets/music/pet.mp3 b/assets/music/pet.mp3 deleted file mode 100644 index 3740cf6..0000000 Binary files a/assets/music/pet.mp3 and /dev/null differ diff --git a/assets/music/pet.ogg b/assets/music/pet.ogg new file mode 100644 index 0000000..5fe2c68 Binary files /dev/null and b/assets/music/pet.ogg differ diff --git a/src/cinematic.c b/src/cinematic.c index 5dda3a5..2e93b09 100644 --- a/src/cinematic.c +++ b/src/cinematic.c @@ -20,7 +20,7 @@ void cinematic_staticRender(void) { text_renderText(&AdamesLegend, 8, 0.8f, white, "./assets/fonts/Quinquefive.ttf", 40, "Adame est l'eleve modele de Polytech,\n Membre de plusieurs associations il est connu de tous.\n Lors de l'edition 21.2 de la Nantarena,\n Adame s'est retrouve a engeuler des joueurs pour leur demander de mettre leur putain de masque.\n\n L'edition finie, Adame a kidnappe l'ensemble des joueurs qui forcaient pour leur apprendre a respecter l'autorite a coup de coup de pied au cul.\n\n Press space to continue"); scene_addRenderObject(&cinematicScene, AdamesLegend, 10, 80); - music = Mix_LoadMUS("./assets/music/chinese rap.mp3"); + music = Mix_LoadMUS("./assets/music/chinese rap.ogg"); if(music == NULL) { fprintf(stderr, "Chinese rap not found!\n"); exit(1); diff --git a/src/game.c b/src/game.c index d239e84..47dd276 100644 --- a/src/game.c +++ b/src/game.c @@ -12,6 +12,11 @@ #include "text.h" #include "input.h" +//Web asembly +#ifdef __EMSCRIPTEN__ +#include +#endif + #define GRAVITY 10000.f @@ -84,21 +89,21 @@ RenderId_t steroidText; static void playMusic(){ - music = Mix_LoadMUS("./assets/music/game.wav"); + music = Mix_LoadMUS("./assets/music/game.ogg"); if(music == NULL) { - fprintf(stderr, "Game audio not found!\n"); + fprintf(stderr, "Game audio not found! %s\n", Mix_GetError()); exit(1); } - petMusic = Mix_LoadWAV("./assets/music/pet.mp3"); + petMusic = Mix_LoadWAV("./assets/music/pet.ogg"); if(petMusic == NULL){ - fprintf(stderr, "Pet audio not found!\n"); + fprintf(stderr, "Pet audio not found! %s\n", Mix_GetError()); exit(1); } - koMusic = Mix_LoadWAV("./assets/music/ko-effect-gain.mp3"); + koMusic = Mix_LoadWAV("./assets/music/ko-effect-gain.ogg"); if(koMusic == NULL){ - fprintf(stderr, "ko effect audio not found!\n"); + fprintf(stderr, "ko effect audio not found %s\n", Mix_GetError()); exit(1); } @@ -120,8 +125,12 @@ int game_staticRender(void){ SDL_Surface* gameBackgroundSurface = IMG_Load("./assets/img/game_bg.png"); if(gameBackgroundSurface == NULL){ - printf("cannot load background"); + printf("cannot load background\n"); + #ifdef __EMSCRIPTEN__ + emscripten_pause_main_loop(); + #else return -1; + #endif } SDL_Surface* gameBackgroundSurface2 = IMG_Load("./assets/img/game_bg.png"); diff --git a/src/main.c b/src/main.c index e8ad765..9787595 100644 --- a/src/main.c +++ b/src/main.c @@ -12,6 +12,12 @@ #include #include "cinematic.h" #include "scaller.h" +#include "main.h" + +//Web asembly +#ifdef __EMSCRIPTEN__ +#include +#endif clock_t timecode; long iter; @@ -40,14 +46,10 @@ static void game_setup(void) { RenderObject_t text = EMPTY_RENDER_OBJECT; SDL_Color white = {255, 255, 255, 255}; TTF_Init(); - if(text_renderText(&text, 1000, 1, white, "./assets/fonts/arial.ttf", 25, "Hello World") < 0){ - printf("error"); - exit(1); - } input_listenKeyDown(SDL_SCANCODE_SPACE, space); } -static void game_loop(void) { +void game_loop(void) { float delta = ((float)(clock() - timecode)) / CLOCKS_PER_SEC; //update time @@ -62,7 +64,6 @@ static void game_loop(void) { timecode = clock(); } - int main(int argc, char ** argv) { TTF_Init(); if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096) != 0){ @@ -75,9 +76,15 @@ int main(int argc, char ** argv) { timecode = clock(); Mix_Init(MIX_INIT_MP3); - renderer_main(argc, argv, game_setup, game_loop); + renderer_main(argc, argv, game_setup); Mix_CloseAudio(); text_freeFontCache(); return 0; } + +#ifdef __MINGW32__ +int WinMain(int argc, char ** argv) { + main(argc, argv); +} +#endif diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..de4c4e4 --- /dev/null +++ b/src/main.h @@ -0,0 +1,6 @@ +#ifndef __MAIN_H__ +#define __MAIN_H__ + +void game_loop(void); + +#endif diff --git a/src/menu.c b/src/menu.c index 82a8a50..f306ea5 100644 --- a/src/menu.c +++ b/src/menu.c @@ -20,21 +20,30 @@ static Mix_Music * music; Scene_t menuScene = { NULL, 0, 0, 0, 0, 0 }; +//Web asembly +#ifdef __EMSCRIPTEN__ +#include +#endif + + int menu_staticRender(void){ MonitorSize_t size = renderer_getMonitorSize(); float aspectRatio = (float)size.width / size.height; - SDL_Surface* backgroundImageSurface = IMG_Load("./assets/img/menu_bg.png"); + SDL_Surface* backgroundImageSurface = IMG_Load("assets/img/menu_bg.png"); if(backgroundImageSurface == NULL){ - printf("cannot load background"); - return -1; + printf("Could not load menu background\n"); + #ifdef __EMSCRIPTEN__ + emscripten_pause_main_loop(); + #endif + return -1; } - music = Mix_LoadMUS("./assets/music/menu.wav"); + music = Mix_LoadMUS("assets/music/menu.ogg"); if(music == NULL) { - fprintf(stderr, "Menu music not found!\n"); + fprintf(stderr, "Menu music not found!: %s\n", Mix_GetError()); exit(1); } diff --git a/src/renderer.c b/src/renderer.c index 5880952..56dddd5 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -14,6 +14,12 @@ #include #include "input.h" #include "scene.h" +#include "main.h" + +//Web asembly +#ifdef __EMSCRIPTEN__ +#include +#endif bool running; MonitorSize_t monitorSize; @@ -36,8 +42,50 @@ static void toggleFullscreen(void) { } } +static bool main_loop(void) { + SDL_RenderClear(renderer); + + game_loop(); + + SDL_Event event; + + // Events management + while (SDL_PollEvent(&event)) { + switch (event.type) { + + case SDL_QUIT: + // handling of close button + running = false; + printf("Quitting my job!\n"); + break; + + case SDL_KEYDOWN: + // keyboard API for key pressed + input_pollKeyDown(event.key.keysym.scancode); + break; + case SDL_KEYUP: + input_pollKeyUp(event.key.keysym.scancode); + break; + } + } + + if(!running) + return false; + + if(scene != NULL) + scene_render(scene); + + SDL_RenderPresent(renderer); + + #ifndef __EMSCRIPTEN__ + SDL_Delay(1000 / 60); + #endif + + return true; +} + //int (*compar)(const void [.size], const void [.size], void *) -void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_loop)(void)) { +void renderer_main(int argc, char ** argv, void(*game_setup)(void)) { // returns zero on success else non-zero if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { printf("error initializing SDL: %s\n", SDL_GetError()); @@ -75,44 +123,16 @@ void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_l running = true; game_setup(); - while(running) { - SDL_RenderClear(renderer); - game_loop(); - - SDL_Event event; - - // Events management - while (SDL_PollEvent(&event)) { - switch (event.type) { - - case SDL_QUIT: - // handling of close button - running = false; - printf("Quitting my job!\n"); - break; - - case SDL_KEYDOWN: - // keyboard API for key pressed - input_pollKeyDown(event.key.keysym.scancode); - break; - case SDL_KEYUP: - input_pollKeyUp(event.key.keysym.scancode); - break; - } - } - - //no need to make an extra render pass - if(!running) break; - - if(scene != NULL) - scene_render(scene); - - SDL_RenderPresent(renderer); - SDL_Delay(1000 / 400); //400fps or u a pussy - } + #ifdef __EMSCRIPTEN__ + emscripten_set_main_loop((em_callback_func)main_loop, 0, true); + #else + while(main_loop()); + #endif } + + void renderer_setScene(const Scene_t * newScene) { scene = newScene; } diff --git a/src/renderer.h b/src/renderer.h index 83e3151..beb90b1 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -16,7 +16,7 @@ typedef struct MonitorSize { int width, height; } MonitorSize_t; -void renderer_main(int argc, char ** argv, void(*game_setup)(void), void(*game_loop)(void)); +void renderer_main(int argc, char ** argv, void(*game_loop)(void)); MonitorSize_t renderer_getMonitorSize(void); void renderer_setScene(const Scene_t * newScene); const Scene_t * renderer_getScene(void); diff --git a/src/scene.c b/src/scene.c index dc9a4fc..5926a79 100644 --- a/src/scene.c +++ b/src/scene.c @@ -5,9 +5,11 @@ #include #include #include +#include #include #include #include +#include const RenderObject_t EMPTY_RENDER_OBJECT = { 0, 0.f, 0.f, 0.f, 0.f, 0.f, NULL, "Undefined" }; @@ -83,7 +85,7 @@ RenderId_t scene_addRenderObject(Scene_t * scene, RenderObject_t object, int x, scene->objects[scene->objectCount - 1] = item; //the objects are sorted - #ifdef __MINGW32__ + #if defined(__MINGW32__) || defined(__EMSCRIPTEN__) qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (int (__cdecl *)(const void *,const void *))compartSort); #else qsort(scene->objects, scene->objectCount, sizeof(SceneObject_t), (__compar_fn_t)compartSort);