/* * Created by snapshot112 on 15/10/2025. * * A game engine build on top of a grid api to run and display games using ncurses. * * Please make sure to initialize the game engine before running any games. */ #ifndef MINIGAME_MENU_GRID_GAME_ENGINE_H #define MINIGAME_MENU_GRID_GAME_ENGINE_H #include "grid/grid.h" #define KEY_ESCAPE 27 typedef struct { int x; int y; } coordinate; // Start at 1 since the color 0 is reserved for no_color. typedef enum { BLACK = 1, WHITE = 2, BLUE = 3, GREEN = 4, CYAN = 5, MAGENTA = 6, YELLOW = 7, RED = 8 } game_colors; typedef struct { char name[100]; grid *game_map; } game_maps; /* * Checks if 2 coordinates are the same. * * Input: * a: coordinate 1 * b: coordinate 2 * * Returns: * If they point to the same location: 1 * Otherwise: 0 */ int same_coordinate(coordinate a, coordinate b); /* * A proper modulo function. * The one provided by c: '%' doesn't work according to the mathematical definition. */ int modulo(int number, int mod); /* * Displays the given grid with the given offset using ncurses. * * Input: * gp: A pointer to the grid. * * Side effect: * The console is cleared and the grid is printed. */ void show_grid_on_offset(const grid *gp, int starting_x, int starting_y); /* * Displays the given grid with ncurses. * * Input: * gp: A pointer to the grid. * * Side effect: * The console is cleared and the grid is printed. */ void show_grid(const grid *gp); /* * Turn on color highlighting for ncurses * * Input: * color: The color you want the highlight to be. * * Side Effects: * Enables color highlighting in ncurses. * * Note: * This should always be disabled with disable_highlights before being called again. * Not disabling the current highlight before enabling another one is undefined behaviour. */ void enable_highlight(game_colors color); /* * Turn off color highlighting for ncurses * * Input: * color: The color highlighting you want to turn off. * * Side Effects: * Enables color highlighting in ncurses. * * Note: * This should always be enabled with enable_highlights before being called. * Disabling the highlight before enabling it is undefined behaviour. */ void disable_highlight(game_colors color); /* * Updates a single location in the grid. * * Input: * gp: A pointer to the grid. * c: The character to update the location with. * x: The x-coordinate of the spot you want to update. * y: The y-coordinate of the spot you want to update. * * Side effect: * The update gets applied both on the grid and on the screen. */ void update_grid(grid *gp, char c, int x, int y); /* * Display the ending screen that matches the end state of the grid. * * Input: * gp: A pointer to the grid. * coordinate: The location to show the ending screen. * * Side Effects: * The end of game screen gets displayed with a graceful exit. */ void game_exit_message(const grid *gp, coordinate location); /* * Waits for you to press ENTER before exiting the game. * * Input: * coordinate: The location to show the message. * * Side effect: Prints "Press ENTER to exit." game to the console. */ void graceful_exit(coordinate message_location); /* * Initialize ncurses. * * This enables cbreak, noecho, hides the cursor and enables the extra keys. * This also creates the color pairs needed for game_colors and sets ESCDELAY to 0. */ void init_engine(void); /* * Cleanup ncurses. */ void cleanup_engine(void); #endif //MINIGAME_MENU_GRID_GAME_ENGINE_H