/* * Copyright Luka Jankovic 2025 * * This file is part of Kubo. * * Kubo is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * Kubo is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Kubo. If not, see . */ #include "kubo_window.h" void kubo_window_init(struct kubo_context *context) { SetConfigFlags(FLAG_WINDOW_RESIZABLE); InitWindow(KUBO_WINDOW_WIDTH, KUBO_WINDOW_HEIGHT, "Kubo"); SetExitKey(0); } void kubo_window_cleanup(struct kubo_context *context) { CloseWindow(); } bool kubo_window_should_close(struct kubo_context *context) { return context->exit_pending || WindowShouldClose(); } void kubo_window_tick(struct kubo_context *context) { window_render(context); if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { window_left_mouse(context); } if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) { window_right_mouse(context); } window_key_input(context); } static void window_render(struct kubo_context *context) { BeginDrawing(); ClearBackground(WHITE); for (int i = 0; i < context->walls.count; i++) { struct kubo_wall *wall = kubo_wall_arr_get(&context->walls, i); assert(wall != NULL); kubo_wall_render(wall, context->state == KUBO_CONTEXT_WALL_SELECT); } kubo_bar_render(context); EndDrawing(); } static void window_left_mouse(struct kubo_context *context) { switch (context->state) { case KUBO_CONTEXT_WALL_NEW: new_wall_click(context); break; case KUBO_CONTEXT_WALL_SELECT: break; default: break; } } static void window_right_mouse(struct kubo_context *context) { switch (context->state) { case KUBO_CONTEXT_WALL_NEW: new_wall_end(context); break; case KUBO_CONTEXT_WALL_SELECT: break; default: break; } } static void window_key_input(struct kubo_context *context) { window_char_input(context); int key_code = GetKeyPressed(); if (context->state == KUBO_CONTEXT_COMMAND) { switch (key_code) { case KEY_ESCAPE: kubo_context_set_state(context, KUBO_CONTEXT_NORMAL); break; case KEY_ENTER: kubo_context_accept_cmd(context); default: break; } return; } if (!key_code) { return; } switch (key_code) { case KEY_Q: kubo_context_set_state(context, KUBO_CONTEXT_NORMAL); break; case KEY_W: kubo_context_set_state(context, KUBO_CONTEXT_WALL_NEW); break; case KEY_S: kubo_context_set_state(context, KUBO_CONTEXT_WALL_SELECT); break; case KEY_RIGHT: case KEY_UP: case KEY_L: case KEY_K: kubo_context_select_next_wall(context); break; case KEY_LEFT: case KEY_DOWN: case KEY_J: case KEY_H: kubo_context_select_prev_wall(context); break; default: break; } } static void window_char_input(struct kubo_context *context) { int char_code; do { char_code = GetCharPressed(); if (char_code && context->state == KUBO_CONTEXT_COMMAND) { kubo_char_arr_add(&context->command, char_code); } else if (char_code == ':') { kubo_context_set_state(context, KUBO_CONTEXT_COMMAND); } } while (char_code > 0); } static void new_wall_click(struct kubo_context *context) { struct kubo_wall *current_wall = kubo_context_get_pending_wall(context); if (!current_wall) { return; } int bar_limit = GetScreenHeight() - KUBO_BAR_HEIGHT; Vector2 new_pos = GetMousePosition(); if (new_pos.y < bar_limit) { kubo_wall_add_vertex(current_wall, new_pos); current_wall->state = KUBO_WALL_DRAWING; } } static void new_wall_end(struct kubo_context *context) { struct kubo_wall *current_wall = kubo_context_get_pending_wall(context); if (!current_wall) { return; } current_wall->state = KUBO_WALL_DONE; }