]> git.lizzy.rs Git - nothing.git/blobdiff - src/game.c
Remove Lt from LevelEditor
[nothing.git] / src / game.c
index f9ea658371c1fb6b29eaa65bda9d9096d1aea540..989319f84fd1faf0fe5a3ce0a0225b1b0d675596 100644 (file)
 #include "game/settings.h"
 #include "game/credits.h"
 
-
 typedef struct Game {
     Lt *lt;
 
     Game_state state;
     Sprite_font font;
+    Memory tmpmem;
     LevelPicker level_picker;
-    LevelEditor *level_editor;
+    LevelEditor level_editor;
     Credits *credits;
     Level *level;
     Settings settings;
@@ -40,6 +40,7 @@ typedef struct Game {
 
 void game_switch_state(Game *game, Game_state state)
 {
+    game->cursor.style = CURSOR_STYLE_POINTER;
     if (state == GAME_STATE_LEVEL_PICKER) {
         level_picker_clean_selection(&game->level_picker);
     }
@@ -66,6 +67,10 @@ Game *create_game(const char *level_folder,
         renderer,
         "./assets/images/charmap-oldschool.bmp");
 
+    game->tmpmem.capacity = TMPMEM_CAPACITY;
+    game->tmpmem.buffer = malloc(TMPMEM_CAPACITY);
+    trace_assert(game->tmpmem.buffer);
+
     level_picker_populate(&game->level_picker, level_folder);
 
     game->credits = PUSH_LT(
@@ -104,10 +109,13 @@ Game *create_game(const char *level_folder,
                     SDL_BLENDFACTOR_ONE,
                     SDL_BLENDFACTOR_ZERO,
                     SDL_BLENDOPERATION_ADD)) < 0) {
-            log_warn("SDL error: %s\n", SDL_GetError());
+            log_warn("SDL error while setting blending mode for `%s': %s\n",
+                     cursor_style_tex_files[style],
+                     SDL_GetError());
         }
     }
 
+    create_level_editor(&game->level_editor, &game->cursor);
 
     game->console = PUSH_LT(
         lt,
@@ -127,6 +135,7 @@ void destroy_game(Game *game)
 {
     trace_assert(game);
     destroy_level_picker(game->level_picker);
+    free(game->tmpmem.buffer);
     RETURN_LT0(game->lt);
 }
 
@@ -148,7 +157,7 @@ int game_render(const Game *game)
     } break;
 
     case GAME_STATE_LEVEL_EDITOR: {
-        if (level_editor_render(game->level_editor, &game->camera) < 0) {
+        if (level_editor_render(&game->level_editor, &game->camera) < 0) {
             return -1;
         }
     } break;
@@ -185,7 +194,7 @@ int game_sound(Game *game)
     case GAME_STATE_LEVEL:
         return level_sound(game->level, game->sound_samples);
     case GAME_STATE_LEVEL_EDITOR:
-        level_editor_sound(game->level_editor, game->sound_samples);
+        level_editor_sound(&game->level_editor, game->sound_samples);
         return 0;
     case GAME_STATE_LEVEL_PICKER:
     case GAME_STATE_CREDITS:
@@ -226,7 +235,7 @@ int game_update(Game *game, float delta_time)
     } break;
 
     case GAME_STATE_LEVEL_PICKER: {
-        if (level_picker_update(&game->level_picker, delta_time) < 0) {
+        if (level_picker_update(&game->level_picker, &game->camera, delta_time) < 0) {
             return -1;
         }
 
@@ -245,12 +254,12 @@ int game_update(Game *game, float delta_time)
 
     case GAME_STATE_LEVEL_EDITOR: {
         if (level_editor_focus_camera(
-                game->level_editor,
+                &game->level_editor,
                 &game->camera) < 0) {
             return -1;
         }
 
-        level_editor_update(game->level_editor, delta_time);
+        level_editor_update(&game->level_editor, delta_time);
     } break;
 
     case GAME_STATE_CREDITS: {
@@ -287,7 +296,7 @@ static int game_event_running(Game *game, const SDL_Event *event)
                     game->lt,
                     game->level,
                     create_level_from_level_editor(
-                        game->level_editor));
+                        &game->level_editor));
                 if (game->level == NULL) {
                     game_switch_state(game, GAME_STATE_QUIT);
                     return -1;
@@ -320,34 +329,20 @@ static int game_event_level_picker(Game *game, const SDL_Event *event)
     case SDL_KEYDOWN: {
         switch(event->key.keysym.sym) {
         case SDLK_n: {
-            if (game->level_editor == NULL) {
-                game->level_editor = PUSH_LT(
-                    game->lt,
-                    create_level_editor(&game->cursor),
-                    destroy_level_editor);
-            } else {
-                game->level_editor = RESET_LT(
-                    game->lt,
-                    game->level_editor,
-                    create_level_editor(&game->cursor));
-            }
-
-            if (game->level_editor == NULL) {
-                return -1;
-            }
+            level_editor_clean(&game->level_editor);
 
             if (game->level == NULL) {
                 game->level = PUSH_LT(
                     game->lt,
                     create_level_from_level_editor(
-                        game->level_editor),
+                        &game->level_editor),
                     destroy_level);
             } else {
                 game->level = RESET_LT(
                     game->lt,
                     game->level,
                     create_level_from_level_editor(
-                        game->level_editor));
+                        &game->level_editor));
             }
 
             if (game->level == NULL) {
@@ -384,7 +379,7 @@ static int game_event_level_editor(Game *game, const SDL_Event *event)
                 game->lt,
                 game->level,
                 create_level_from_level_editor(
-                    game->level_editor));
+                    &game->level_editor));
             if (game->level == NULL) {
                 return -1;
             }
@@ -394,7 +389,7 @@ static int game_event_level_editor(Game *game, const SDL_Event *event)
     } break;
     }
 
-    return level_editor_event(game->level_editor, event, &game->camera);
+    return level_editor_event(&game->level_editor, event, &game->camera);
 }
 
 int game_event(Game *game, const SDL_Event *event)
@@ -410,7 +405,8 @@ int game_event(Game *game, const SDL_Event *event)
     } break;
 
     case SDL_KEYDOWN: {
-        if (event->key.keysym.sym == SDLK_q && event->key.keysym.mod & KMOD_CTRL) {
+        if ((event->key.keysym.sym == SDLK_q && event->key.keysym.mod & KMOD_CTRL) ||
+            (event->key.keysym.sym == SDLK_F4 && event->key.keysym.mod & KMOD_ALT)) {
             game_switch_state(game, GAME_STATE_QUIT);
             return 0;
         }
@@ -536,34 +532,21 @@ int game_load_level(Game *game, const char *level_filename)
     trace_assert(game);
     trace_assert(level_filename);
 
-    if (game->level_editor == NULL) {
-        game->level_editor = PUSH_LT(
-            game->lt,
-            create_level_editor_from_file(level_filename, &game->cursor),
-            destroy_level_editor);
-    } else {
-        game->level_editor = RESET_LT(
-            game->lt,
-            game->level_editor,
-            create_level_editor_from_file(level_filename, &game->cursor));
-    }
-
-    if (game->level_editor == NULL) {
-        return -1;
-    }
+    memory_clean(&game->tmpmem);
+    level_editor_load_from_file(&game->level_editor, &game->tmpmem, level_filename);
 
     if (game->level == NULL) {
         game->level = PUSH_LT(
             game->lt,
             create_level_from_level_editor(
-                game->level_editor),
+                &game->level_editor),
             destroy_level);
     } else {
         game->level = RESET_LT(
             game->lt,
             game->level,
             create_level_from_level_editor(
-                game->level_editor));
+                &game->level_editor));
     }
 
     if (game->level == NULL) {