/* * 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_context.h" static const struct kubo_context_state_data kubo_context_states[] = { { .id = KUBO_CONTEXT_NORMAL, .label = "Normal", .color = BLACK }, { .id = KUBO_CONTEXT_COMMAND, .label = "Command", .color = RED }, { .id = KUBO_CONTEXT_WALL_NEW, .label = "Wall New", .color = GREEN }, { .id = KUBO_CONTEXT_WALL_SELECT, .label = "Wall Select", .color = BLUE } }; void kubo_context_init(struct kubo_context *context) { if (!context) { return; } kubo_wall_arr_init(&context->walls); context->wall_select_index = 0; context->exit_pending = false; context->state = kubo_context_states[KUBO_CONTEXT_NORMAL]; } void kubo_context_cleanup(struct kubo_context *context) { kubo_wall_arr_free(&context->walls); } void kubo_context_set_state(struct kubo_context *context, enum kubo_context_state state) { context->state = kubo_context_states[state]; for (unsigned i = 0; i < kubo_state_data_length; i++) { if (context->state.id == kubo_state_data[i].id && kubo_state_data[i].data.state_entered != NULL) { kubo_state_data[i].data.state_entered(context); } } } struct kubo_wall *kubo_context_get_pending_wall(struct kubo_context *context) { if (context->state.id != KUBO_CONTEXT_WALL_NEW) { return NULL; } if (context->walls.count > 0) { struct kubo_wall *last_wall = kubo_wall_arr_get(&context->walls, context->walls.count - 1); switch (last_wall->state) { case KUBO_WALL_INIT: case KUBO_WALL_DRAWING: return last_wall; break; default: break; } } struct kubo_wall *wall = malloc(sizeof(struct kubo_wall)); kubo_wall_init(wall); kubo_wall_arr_add(&context->walls, wall); return wall; } void kubo_context_key(struct kubo_context *context, int key_code) { for (unsigned i = 0; i < kubo_state_data_length; i++) { if (context->state.id == kubo_state_data[i].id && kubo_state_data[i].data.state_key != NULL) { kubo_state_data[i].data.state_key(context, key_code); } } }