From fcdf44221f8b29b1532736fc66d5201447df9df8 Mon Sep 17 00:00:00 2001 From: John Landers Date: Mon, 15 Jan 2024 23:17:48 -0600 Subject: [PATCH] remove old code and move rewrite to src proper, added new textures --- src/{rewrite => }/Makefile | 0 src/{rewrite => }/block.h | 0 src/{rewrite => }/m_block.c | 2 + src/{rewrite => }/m_block.h | 1 + src/{rewrite => }/m_tetromino.c | 0 src/{rewrite => }/m_tetromino.h | 0 src/old/Makefile | 13 - src/old/app.c | 74 ----- src/old/app.h | 13 - src/old/main.c | 24 -- src/old/manager.c | 409 -------------------------- src/old/manager.h | 17 -- src/old/renderer.c | 73 ----- src/old/renderer.h | 17 -- src/old/resources/black.png | Bin 881 -> 0 bytes src/old/resources/blue.png | Bin 900 -> 0 bytes src/old/resources/green.png | Bin 897 -> 0 bytes src/old/resources/light-blue.png | Bin 900 -> 0 bytes src/old/resources/orange.png | Bin 900 -> 0 bytes src/old/resources/purple.png | Bin 138 -> 0 bytes src/old/resources/red.png | Bin 899 -> 0 bytes src/old/resources/yellow.png | Bin 901 -> 0 bytes src/old/tetromino.h | 12 - src/{rewrite => }/point.h | 0 src/{rewrite => }/r_block.c | 1 + src/{rewrite => }/r_block.h | 0 src/{rewrite => }/r_def.h | 0 src/r_ui.c | 80 +++++ src/r_ui.h | 10 + src/{rewrite => }/resources/black.png | Bin src/resources/blue.png | Bin 0 -> 6715 bytes src/resources/green.png | Bin 0 -> 6721 bytes src/resources/light-blue.png | Bin 0 -> 6787 bytes src/resources/orange.png | Bin 0 -> 6704 bytes src/resources/purple.png | Bin 0 -> 6721 bytes src/resources/red.png | Bin 0 -> 5917 bytes src/resources/tetromino_I.png | Bin 0 -> 6855 bytes src/resources/tetromino_J.png | Bin 0 -> 8232 bytes src/resources/tetromino_L.png | Bin 0 -> 8048 bytes src/resources/tetromino_O.png | Bin 0 -> 7015 bytes src/resources/tetromino_S.png | Bin 0 -> 8266 bytes src/resources/tetromino_T.png | Bin 0 -> 8794 bytes src/resources/tetromino_Z.png | Bin 0 -> 8933 bytes src/resources/yellow.png | Bin 0 -> 6715 bytes src/rewrite/r_ui.c | 28 -- src/rewrite/r_ui.h | 7 - src/rewrite/resources/blue.png | Bin 900 -> 0 bytes src/rewrite/resources/green.png | Bin 897 -> 0 bytes src/rewrite/resources/light-blue.png | Bin 900 -> 0 bytes src/rewrite/resources/orange.png | Bin 900 -> 0 bytes src/rewrite/resources/purple.png | Bin 138 -> 0 bytes src/rewrite/resources/red.png | Bin 899 -> 0 bytes src/rewrite/resources/yellow.png | Bin 901 -> 0 bytes src/{rewrite => }/sc_def.h | 0 src/{rewrite => }/tc_input.c | 0 src/{rewrite => }/tc_input.h | 0 src/{rewrite => }/tc_main.c | 5 +- src/{rewrite => }/tc_settings.c | 0 src/{rewrite => }/tc_settings.h | 0 src/{rewrite => }/tc_window.c | 0 src/{rewrite => }/tc_window.h | 0 src/{rewrite => }/tetromino.h | 0 62 files changed, 97 insertions(+), 689 deletions(-) rename src/{rewrite => }/Makefile (100%) rename src/{rewrite => }/block.h (100%) rename src/{rewrite => }/m_block.c (99%) rename src/{rewrite => }/m_block.h (97%) rename src/{rewrite => }/m_tetromino.c (100%) rename src/{rewrite => }/m_tetromino.h (100%) delete mode 100644 src/old/Makefile delete mode 100644 src/old/app.c delete mode 100644 src/old/app.h delete mode 100644 src/old/main.c delete mode 100644 src/old/manager.c delete mode 100644 src/old/manager.h delete mode 100644 src/old/renderer.c delete mode 100644 src/old/renderer.h delete mode 100644 src/old/resources/black.png delete mode 100644 src/old/resources/blue.png delete mode 100644 src/old/resources/green.png delete mode 100644 src/old/resources/light-blue.png delete mode 100644 src/old/resources/orange.png delete mode 100644 src/old/resources/purple.png delete mode 100644 src/old/resources/red.png delete mode 100644 src/old/resources/yellow.png delete mode 100644 src/old/tetromino.h rename src/{rewrite => }/point.h (100%) rename src/{rewrite => }/r_block.c (97%) rename src/{rewrite => }/r_block.h (100%) rename src/{rewrite => }/r_def.h (100%) create mode 100644 src/r_ui.c create mode 100644 src/r_ui.h rename src/{rewrite => }/resources/black.png (100%) create mode 100644 src/resources/blue.png create mode 100644 src/resources/green.png create mode 100644 src/resources/light-blue.png create mode 100644 src/resources/orange.png create mode 100644 src/resources/purple.png create mode 100644 src/resources/red.png create mode 100644 src/resources/tetromino_I.png create mode 100644 src/resources/tetromino_J.png create mode 100644 src/resources/tetromino_L.png create mode 100644 src/resources/tetromino_O.png create mode 100644 src/resources/tetromino_S.png create mode 100644 src/resources/tetromino_T.png create mode 100644 src/resources/tetromino_Z.png create mode 100644 src/resources/yellow.png delete mode 100644 src/rewrite/r_ui.c delete mode 100644 src/rewrite/r_ui.h delete mode 100644 src/rewrite/resources/blue.png delete mode 100644 src/rewrite/resources/green.png delete mode 100644 src/rewrite/resources/light-blue.png delete mode 100644 src/rewrite/resources/orange.png delete mode 100644 src/rewrite/resources/purple.png delete mode 100644 src/rewrite/resources/red.png delete mode 100644 src/rewrite/resources/yellow.png rename src/{rewrite => }/sc_def.h (100%) rename src/{rewrite => }/tc_input.c (100%) rename src/{rewrite => }/tc_input.h (100%) rename src/{rewrite => }/tc_main.c (95%) rename src/{rewrite => }/tc_settings.c (100%) rename src/{rewrite => }/tc_settings.h (100%) rename src/{rewrite => }/tc_window.c (100%) rename src/{rewrite => }/tc_window.h (100%) rename src/{rewrite => }/tetromino.h (100%) diff --git a/src/rewrite/Makefile b/src/Makefile similarity index 100% rename from src/rewrite/Makefile rename to src/Makefile diff --git a/src/rewrite/block.h b/src/block.h similarity index 100% rename from src/rewrite/block.h rename to src/block.h diff --git a/src/rewrite/m_block.c b/src/m_block.c similarity index 99% rename from src/rewrite/m_block.c rename to src/m_block.c index 2becb76..518b744 100644 --- a/src/rewrite/m_block.c +++ b/src/m_block.c @@ -179,6 +179,8 @@ void M_B_Set_Next_Block_Type(void) { _next_block_type = M_B_Get_Random_Block_Type(); } +btype_t M_B_Get_Next_Block_Type(void) { return _next_block_type; } + btype_t M_B_Get_Random_Block_Type(void) { srand(time(NULL)); return (btype_t)(rand() % 7) + 1; diff --git a/src/rewrite/m_block.h b/src/m_block.h similarity index 97% rename from src/rewrite/m_block.h rename to src/m_block.h index dea1233..96fee36 100644 --- a/src/rewrite/m_block.h +++ b/src/m_block.h @@ -10,6 +10,7 @@ void M_B_Destroy_Blocks(void); void M_B_Reset_Blocks_Updated(void); void M_B_Spawn_Blocks(void); void M_B_Set_Next_Block_Type(void); +btype_t M_B_Get_Next_Block_Type(void); btype_t M_B_Get_Random_Block_Type(void); int M_B_Try_Spawn_Blocks_With_Offset(point_offset_t *offsets); block_t *M_B_Get_Block_At_Point(point_t point); diff --git a/src/rewrite/m_tetromino.c b/src/m_tetromino.c similarity index 100% rename from src/rewrite/m_tetromino.c rename to src/m_tetromino.c diff --git a/src/rewrite/m_tetromino.h b/src/m_tetromino.h similarity index 100% rename from src/rewrite/m_tetromino.h rename to src/m_tetromino.h diff --git a/src/old/Makefile b/src/old/Makefile deleted file mode 100644 index 49af283..0000000 --- a/src/old/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC=clang -CFLAGS=-Wall -Wextra -std=c89 -pedantic -include raylib.h -LIBS=-lraylib -lGL -lm -lpthread -ldl -lrt -lX11 - -tetris-clone: main.c manager.c renderer.c app.c - $(CC) -o $@ $^ $(CFLAGS) $(LIBS) - -.PHONY: clean - -clean: - rm -f ./tetris-clone - rm -f ./*.o - rm -f ./*.gch diff --git a/src/old/app.c b/src/old/app.c deleted file mode 100644 index 9bfdbeb..0000000 --- a/src/old/app.c +++ /dev/null @@ -1,74 +0,0 @@ -#include - -#include "app.h" -#include "manager.h" -#include "raylib.h" -#include "renderer.h" -#include "tetromino.h" - -#define TARGET_FPS 60 - -int _a_tick_rate = 0; - -void a_run(int tick_rate) { - _a_initialize(tick_rate); - _a_loop(); - _a_cleanup(); -} - -void _a_initialize(int tick_rate) { - _a_initialize_raylib(); - m_initialize(); - r_initialize(); - _a_gameboard_clear(); - _a_tick_rate = tick_rate; -} - -void _a_initialize_raylib(void) { - InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Tetris Clone"); - SetTargetFPS(TARGET_FPS); -} - -void _a_gameboard_clear(void) { - m_blocks_set_empty(); - int number_blocks_updated = 0; - struct TetrominoBlock **blocks_updated = - m_blocks_get_updated(&number_blocks_updated); - r_render_blocks(blocks_updated, number_blocks_updated); -} - -void _a_loop(void) { - int tick_rate_counter = 0; - while (!WindowShouldClose()) { - if (m_tetromino_can_spawn()) { - _a_input_process(); - if (tick_rate_counter == 0) { - m_update(); - tick_rate_counter = _a_tick_rate; - } - int number_blocks_updated = 0; - struct TetrominoBlock **blocks_updated = - m_blocks_get_updated(&number_blocks_updated); - r_render_blocks(blocks_updated, number_blocks_updated); - tick_rate_counter--; - } else { - r_render_game_over(0); - } - } -} - -void _a_input_process(void) { - if (IsKeyPressed(KEY_SPACE)) { - m_request_falling_tetromino_rotate(); - } - if (IsKeyDown(KEY_A)) { - m_request_falling_tetromino_move_left(); - } else if (IsKeyDown(KEY_D)) { - m_request_falling_tetromino_move_right(); - } -} - -void _a_cleanup() { - m_deactivate(); - CloseWindow(); -} diff --git a/src/old/app.h b/src/old/app.h deleted file mode 100644 index 0b1ad81..0000000 --- a/src/old/app.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef TETRIS_CLONE_APP_H_ -#define TETRIS_CLONE_APP_H_ - -void a_run(int tick_rate); - -void _a_initialize(int tick_rate); -void _a_initialize_raylib(void); -void _a_gameboard_clear(void); -void _a_loop(void); -void _a_input_process(void); -void _a_cleanup(void); - -#endif // TETRIS_CLONE_APP_H_ diff --git a/src/old/main.c b/src/old/main.c deleted file mode 100644 index ca165d6..0000000 --- a/src/old/main.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include - -#include "app.h" - -int main(int argc, char **argv) -{ - // Not great code if I were to need multiple options, but I just need to be - // able to debug - if (argc > 1) - { - if (strcmp(argv[1], "--speed") == 0) - { - a_run(atoi(argv[2])); - } - } - else - { - a_run(50); - } - - return 0; -} diff --git a/src/old/manager.c b/src/old/manager.c deleted file mode 100644 index 86722d9..0000000 --- a/src/old/manager.c +++ /dev/null @@ -1,409 +0,0 @@ -#include //srand,rand, -#include //time -#define __USE_MISC -#include //cos,sin - -#include "manager.h" - -#define FIELD_WIDTH 10 -#define FIELD_HEIGHT 20 -#define BLOCKS_WITHIN_A_TETROMINO 4 - -// should probably call these offsets -struct Offset { - int xOffset; - int yOffset; -}; - -struct Point { - int x; - int y; -}; - -struct Tetromino { - enum TetrominoType type; - struct TetrominoBlock *blocks[BLOCKS_WITHIN_A_TETROMINO]; -}; - -struct TetrominoBlock *_m_block_at_point(struct Point point); -void _m_blocks_updated_register_block(struct TetrominoBlock *pTetrominoBlock); -void _m_blocks_alloc(void); -void _m_blocks_updated_erase(void); -void _m_blocks_spawn_at_offset_from_spawn_point(enum TetrominoType type, - struct Offset *offsets); -void _m_tetromino_spawn(void); -enum TetrominoType _m_tetromino_type_random(void); -void _m_block_set_type(struct TetrominoBlock *pTetrominoBlock, - enum TetrominoType type); -void _m_falling_tetromino_rotate(void); -bool _m_falling_tetromino_can_move_right(void); -void _m_falling_tetromino_translate(struct Offset offset); -bool _m_point_intersects_static_block(struct Point point); -bool _m_block_can_fall(struct TetrominoBlock block); -bool _m_falling_tetromino_can_fall(void); -void _m_falling_tetromino_fall(void); -bool _m_block_can_move_left(struct TetrominoBlock block); -bool _m_falling_tetromino_can_move_left(void); -bool _m_block_can_move_right(struct TetrominoBlock block); - -// To find block (x,y) index = (x % FIELD_WIDTH) + (y * FIELD_WIDTH) -// Height doesn't matter but height is just the factor of how tall the board -// is. And in the end each row is just the next representation of width * -// units, height just determines row count. Doesn't factor into determining -// X,Y -struct TetrominoBlock *_blocks[FIELD_HEIGHT * FIELD_WIDTH]; -struct TetrominoBlock *_blocks_updated[FIELD_HEIGHT * FIELD_WIDTH] = {NULL}; -int _blocks_updated_length = 0; -bool _should_spawn_tetromino; -struct Tetromino fallingTetromino; -const char kSpawnX = FIELD_WIDTH / 2 - 1; -const struct Offset kShiftDownOffset = {.xOffset = 0, .yOffset = 1}; -const struct Offset kShiftLeftOffset = {.xOffset = -1, .yOffset = 0}; -const struct Offset kShiftRightOffset = {.xOffset = 1, .yOffset = 0}; - -bool _should_tetromino_move_left = false; -bool _should_tetromino_move_right = false; -bool _should_tetromino_rotate = false; -bool _tetromino_can_spawn = true; - -void m_initialize(void) { - _m_blocks_alloc(); - _should_spawn_tetromino = true; -} - -void m_update(void) { - _m_blocks_updated_erase(); - if (_should_spawn_tetromino) { - _should_tetromino_move_left = false; - _should_tetromino_move_right = false; - _m_tetromino_spawn(); - _should_spawn_tetromino = false; - } else { - // TODO move left and right refactor naming - - if (_should_tetromino_rotate) { - _m_falling_tetromino_rotate(); - _should_tetromino_rotate = false; - } - - if (_should_tetromino_move_right && _m_falling_tetromino_can_move_right()) { - _m_falling_tetromino_translate(kShiftRightOffset); - _should_tetromino_move_right = false; - } - - if (_should_tetromino_move_left && _m_falling_tetromino_can_move_left()) { - _m_falling_tetromino_translate(kShiftLeftOffset); - _should_tetromino_move_left = false; - } - - _m_falling_tetromino_fall(); - } -} - -void m_blocks_set_empty(void) { - for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { - _m_block_set_type(_blocks[i], TT_EMPTY); - } -} - -bool m_tetromino_can_spawn(void) { return _tetromino_can_spawn; } - -void m_request_falling_tetromino_rotate(void) { - _should_tetromino_rotate = true; -} - -void m_request_falling_tetromino_move_left(void) { - _should_tetromino_move_left = true; - _should_tetromino_move_right = false; -} - -void m_request_falling_tetromino_move_right(void) { - _should_tetromino_move_right = true; - _should_tetromino_move_left = false; -} - -struct TetrominoBlock **m_blocks_get_updated(int *numberOfUpdatedBlocks) { - *numberOfUpdatedBlocks = _blocks_updated_length; - - return &_blocks_updated[0]; -} - -void m_deactivate(void) { - for (int i = 0; i < sizeof(_blocks) / sizeof(struct TetrominoBlock *); i++) { - free(_blocks[i]); - } -} - -void _m_blocks_alloc(void) { - for (int i = 0; i < FIELD_HEIGHT * FIELD_WIDTH; i++) { - struct TetrominoBlock *block = calloc(1, sizeof(struct TetrominoBlock)); - block->x = i % FIELD_WIDTH; - block->y = i / FIELD_WIDTH; - - _blocks[i] = block; - } -} - -void _m_blocks_updated_erase() { _blocks_updated_length = 0; } - -void _m_tetromino_spawn() { - enum TetrominoType type = _m_tetromino_type_random(); - - struct Offset offsets[BLOCKS_WITHIN_A_TETROMINO]; - - if (type == TT_O) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; - - offsets[1].xOffset = 1; - offsets[1].yOffset = 0; - - offsets[2].xOffset = 0; - offsets[2].yOffset = 1; - - offsets[3].xOffset = 1; - offsets[3].yOffset = 1; - } else if (type == TT_J) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; - - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; - - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; - - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } else if (type == TT_L) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 1; - - offsets[1].xOffset = 1; - offsets[1].yOffset = 1; - - offsets[2].xOffset = 2; - offsets[2].yOffset = 1; - - offsets[3].xOffset = 2; - offsets[3].yOffset = 0; - } else if (type == TT_I) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; - - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; - - offsets[2].xOffset = 0; - offsets[2].yOffset = 2; - - offsets[3].xOffset = 0; - offsets[3].yOffset = 3; - } else if (type == TT_S) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 1; - - offsets[1].xOffset = 1; - offsets[1].yOffset = 1; - - offsets[2].xOffset = 1; - offsets[2].yOffset = 0; - - offsets[3].xOffset = 2; - offsets[3].yOffset = 0; - } else if (type == TT_Z) { - offsets[0].xOffset = 0; - offsets[0].yOffset = 0; - - offsets[1].xOffset = 1; - offsets[1].yOffset = 0; - - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; - - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } else if (type == TT_T) { - offsets[0].xOffset = 1; - offsets[0].yOffset = 0; - - offsets[1].xOffset = 0; - offsets[1].yOffset = 1; - - offsets[2].xOffset = 1; - offsets[2].yOffset = 1; - - offsets[3].xOffset = 2; - offsets[3].yOffset = 1; - } - - _m_blocks_spawn_at_offset_from_spawn_point(type, offsets); -} - -enum TetrominoType _m_tetromino_type_random(void) { - srand(time(NULL)); - return (enum TetrominoType)rand() % 6; -} - -void _m_blocks_spawn_at_offset_from_spawn_point(enum TetrominoType type, - struct Offset *offsets) { - fallingTetromino.type = type; - int index = 0; - while (index < BLOCKS_WITHIN_A_TETROMINO) { - struct Point spawnPoint; - spawnPoint.x = kSpawnX + offsets->xOffset; - spawnPoint.y = offsets->yOffset; - - struct TetrominoBlock *spawnBlock = _m_block_at_point(spawnPoint); - if (spawnBlock->type != TT_EMPTY) { - _tetromino_can_spawn = false; - return; - } - _m_block_set_type(spawnBlock, type); - - // I'm not sure if this makes more sense to be here or return a list of - // spawnedBlocks to be handled in Parent function - fallingTetromino.blocks[index] = spawnBlock; - - index++; - offsets++; - } -} - -struct TetrominoBlock *_m_block_at_point(struct Point point) { - return _blocks[(point.x % FIELD_WIDTH) + (point.y * FIELD_WIDTH)]; -} - -void _m_block_set_type(struct TetrominoBlock *pTetrominoBlock, - enum TetrominoType type) { - pTetrominoBlock->type = type; - _m_blocks_updated_register_block(pTetrominoBlock); -} - -void _m_blocks_updated_register_block(struct TetrominoBlock *pTetrominoBlock) { - if (_blocks_updated_length < FIELD_HEIGHT * FIELD_WIDTH) { - _blocks_updated[_blocks_updated_length] = pTetrominoBlock; - _blocks_updated_length++; - } -} - -void _m_falling_tetromino_rotate(void) { - if (fallingTetromino.type != TT_O) { - // i'm not a fan of this implementation - // check this out instead and re-write - // https://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array?page=1&tab=scoredesc#tab-top - } -} - -bool _m_falling_tetromino_can_move_right(void) { - bool result = true; - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_move_right(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } - } - - return result; -} - -void _m_falling_tetromino_translate(struct Offset offset) { - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - _m_block_set_type(fallingTetromino.blocks[i], TT_EMPTY); - _m_blocks_updated_register_block(fallingTetromino.blocks[i]); - } - - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - struct Point updatedPoint = { - .x = fallingTetromino.blocks[i]->x + offset.xOffset, - .y = fallingTetromino.blocks[i]->y + offset.yOffset}; - fallingTetromino.blocks[i] = _m_block_at_point(updatedPoint); - - _m_block_set_type(fallingTetromino.blocks[i], fallingTetromino.type); - _m_blocks_updated_register_block(fallingTetromino.blocks[i]); - } -} - -bool _m_point_intersects_static_block(struct Point point) { - bool result = false; - - struct TetrominoBlock *blockAtPoint = _m_block_at_point(point); - - if (blockAtPoint->type != TT_EMPTY) { - result = true; - - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (fallingTetromino.blocks[i] == blockAtPoint) { - result = false; - break; - } - } - } - - return result; -} - -bool _m_block_can_fall(struct TetrominoBlock block) { - struct Point newBlockPoint = {.x = block.x, .y = block.y + 1}; - if (newBlockPoint.y >= FIELD_HEIGHT) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } -} - -bool _m_falling_tetromino_can_fall(void) { - bool result = true; - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_fall(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } - } - - return result; -} - -void _m_falling_tetromino_fall(void) { - if (_m_falling_tetromino_can_fall()) { - _m_falling_tetromino_translate(kShiftDownOffset); - } else { - _should_spawn_tetromino = true; - } -} - -bool _m_block_can_move_left(struct TetrominoBlock block) { - struct Point newBlockPoint = {.x = block.x - 1, .y = block.y}; - if (newBlockPoint.x < 0) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } -} - -bool _m_falling_tetromino_can_move_left(void) { - bool result = true; - for (int i = 0; i < BLOCKS_WITHIN_A_TETROMINO; i++) { - if (!_m_block_can_move_left(*(fallingTetromino.blocks[i]))) { - result = false; - break; - } - } - - return result; -} - -bool _m_block_can_move_right(struct TetrominoBlock block) { - struct Point newBlockPoint = {.x = block.x + 1, .y = block.y}; - if (newBlockPoint.x >= FIELD_WIDTH) { - return false; - } else if (_m_point_intersects_static_block(newBlockPoint)) { - return false; - } else { - return true; - } -} diff --git a/src/old/manager.h b/src/old/manager.h deleted file mode 100644 index 069594b..0000000 --- a/src/old/manager.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef TETRIS_CLONE_MANAGER_H_ -#define TETRIS_CLONE_MANAGER_H_ - -#include - -#include "tetromino.h" -void m_initialize(void); -void m_update(void); -void m_blocks_set_empty(void); -bool m_tetromino_can_spawn(void); // Bad name + Doesn't follow naming -void m_request_falling_tetromino_rotate(void); -void m_request_falling_tetromino_move_left(void); -void m_request_falling_tetromino_move_right(void); -struct TetrominoBlock **m_blocks_get_updated(int *lengthOfBlocksUpdated); -void m_deactivate(void); - -#endif diff --git a/src/old/renderer.c b/src/old/renderer.c deleted file mode 100644 index 002e066..0000000 --- a/src/old/renderer.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "renderer.h" - -#define RES_PNG_FILE(name) "resources/" #name ".png" -#define TEXTURE_SIZE 32 - -Texture2D _yellow_texture; -Texture2D _blue_texture; -Texture2D _light_blue_texture; -Texture2D _red_texture; -Texture2D _purple_texture; -Texture2D _green_texture; -Texture2D _orange_texture; -Texture2D _empty_texture; - -void r_initialize(void) { - _yellow_texture = LoadTexture(RES_PNG_FILE(yellow)); - _blue_texture = LoadTexture(RES_PNG_FILE(blue)); - _light_blue_texture = LoadTexture(RES_PNG_FILE(light - blue)); - _red_texture = LoadTexture(RES_PNG_FILE(red)); - _purple_texture = LoadTexture(RES_PNG_FILE(purple)); - _green_texture = LoadTexture(RES_PNG_FILE(green)); - _orange_texture = LoadTexture(RES_PNG_FILE(orange)); - _empty_texture = LoadTexture(RES_PNG_FILE(black)); -} - -void r_render_blocks(struct TetrominoBlock **blocks, int length) { - BeginDrawing(); - while (length--) { - _r_render_block(*(*blocks)); - blocks++; - } - EndDrawing(); -} - -void r_render_game_over(int score) { - BeginDrawing(); - ClearBackground(BLACK); - DrawText("Game Over", SCREEN_WIDTH / 2 - MeasureText("Game Over", 24) / 2, - 200, 24, RED); - char *score_message = TextFormat("Score: %d", score); - DrawText(score_message, SCREEN_WIDTH / 2 - MeasureText(score_message, 18) / 2, - 232, 18, RED); - // Draw a play again button - EndDrawing(); -} - -void _r_render_block(struct TetrominoBlock blockToRender) { - Texture2D *textureToRender = - _r_get_texture_by_tetromino_type(blockToRender.type); - DrawTexture(*textureToRender, blockToRender.x * TEXTURE_SIZE, - blockToRender.y * TEXTURE_SIZE, WHITE); -} - -Texture2D *_r_get_texture_by_tetromino_type(enum TetrominoType type) { - switch (type) { - case TT_O: - return &_yellow_texture; - case TT_I: - return &_light_blue_texture; - case TT_T: - return &_purple_texture; - case TT_J: - return &_blue_texture; - case TT_L: - return &_orange_texture; - case TT_S: - return &_green_texture; - case TT_Z: - return &_red_texture; - default: - return &_empty_texture; - } -} \ No newline at end of file diff --git a/src/old/renderer.h b/src/old/renderer.h deleted file mode 100644 index bde2a31..0000000 --- a/src/old/renderer.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef TETRIS_CLONE_RENDERER_H_ -#define TETRIS_CLONE_RENDERER_H_ -#include "raylib.h" - -#include "tetromino.h" - -#define SCREEN_HEIGHT 640 -#define SCREEN_WIDTH 320 - -void r_initialize(void); -void r_render_blocks(struct TetrominoBlock **blocks, int length); -void r_render_game_over(int score); - -void _r_render_block(struct TetrominoBlock blockToRender); -Texture2D *_r_get_texture_by_tetromino_type(enum TetrominoType type); - -#endif diff --git a/src/old/resources/black.png b/src/old/resources/black.png deleted file mode 100644 index d0f2187ad676479054224529fd175f3ddcdb42c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 881 zcmZvav1(R95QQfiBm^R2B~}S+B^Ew`8u^1BkPtM5jo=HM$}WY4o$cu@d;!a2Wo2Qf zh2=bhoweiKKM?-=Ul;D~>}6-aGiUb0+3C}R{k!`Sae!y57rh=%-`7Lk2opfJ|?nOij2 zn?Ooe%=YIJ+gc`a^OxpTIa78gg6tE@qz$QKX7>FZAhYLD3-#qnrD;KIy{cpyR@cEw zq`N*;cHL9<9M;Zk^4h>FWH^Z><&7& zG9VX~VD~^VI4^g4BPufmcjpl7I_IweG4D@{j8vG>$19v62i4Ek70Q+n4O)+%_pa@B za38DV^H<+~|2W=>2Yd19*WZs{?z}tPdHMAwzwge+!=u|fj~>4sx26kla=QBb91T5FK(sB$&cZtWs>F{~#8MdWSxgaA*ok!9oOIWg(uOjhOOvX@vU$+BsO* z1giwW!op&HfFRh}$~fP567KGEVP|KTnSF2G%$w=nt?jLgTV}S6+v9t6?sWU?nX=Dj zv)^VTo8H}@)HVB^{gHLcZbgKCNrABtX043^71MqTyC|guBJX|h{AR3ydD?}%R#-d3wjHv(1K}6Y>1NP||3a1NV z@l^)H;i@{Af$*vi8C7?ey$V*!EaR1cr;yd$1!_?#;2wUUoUJNX*X2^WCZ{|o2h~7p zv8J^Z(IvT!9%~tpClz4zK-RcgZZ{)JX9!-MgR$ydod(!ye~P4q%xM*#=3#Q9YHU4C zQ539z`t|kl#%4L!FuuP3;PbEV^YgZIZu98%eD`2}^<;E3z4_(si^C63j;~yL`sr}; l6&p5QWE=AR#26CVHg;km=s5R22=Bh@h25RK?Cf{u%)Z>;yScu)v1(@PxHY|7>t;7r&er_+ z@bIVElI`C)*sX2$Bl{(5m)#c;?k-Gp>uW{Jr*(`Pb$Fbfvj;@Zudr%&Jesh2V>Pad=0Q+e@di<%xQHz&BNqI)wA_9 zMMeeN#A?%wp>^@q>?0X{RE5C8xG diff --git a/src/old/resources/light-blue.png b/src/old/resources/light-blue.png deleted file mode 100644 index 23c3f3958ba3202c63b76c53ee5164bf65dda0f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmZvaKWkM%5XFx%h8TP(NE)kGY-Q&M@K59g9gq;@6&4D9fm5YRCBY`xoi6wR1Pkp3 zL_{U6poO3?*l8o!X=5|aeGkIB?|NZ(XD>VZJ9B0acXw`$HZE-d7}@Q~-CD=pSYNAo zZ-4(ca2mUJrrWj6*~r-K2^cQTJD15jD3Qs87#O zI9(=|US%-cTvZ1%EWGNojHj_0kK!Il8$IC0L66#&5QWDzY77R0U?V77TomjCJCUet&;zoB7{pQwv5-@(RVuO4_Ei1^EA6Jx zMhV!)La>+>U4XmDQyQaWLlKXYtp>Bz+&nwRMja<4>?bwUwzhg2~m>i!B4QFF_I`t%Hi(*?2g zDudy0RUOPgc-4oDs=LcxhLtmmyfW|vS?jVPTVcy$iOs&n}@z?S<{A}wT2tK(@NCO4{{t*0qU zf)%L$j&6?DD%i&4{{FMWzkhCBw(-{CukUwe?|)poaq;@?H@I;8_B3?jDWK{NDch@mzN&cBYfh51zmK2gMbcY5)KL diff --git a/src/old/resources/purple.png b/src/old/resources/purple.png deleted file mode 100644 index 19f10b4bd60585233e3a8420d4102a4330e61037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@*O>0977^n z-(EKqWl#_}eBr=hW#%Lc;}mdKI;Vst0In+}R{#J2 diff --git a/src/old/resources/red.png b/src/old/resources/red.png deleted file mode 100644 index 958e9a5f46b1fc5eabf7ff5393ed88f1b2eb2a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmZvav1^n;5XHwN#N)`JA|hDG6ws&`br?xp8Ia{)J*?ke=?vh9XXsv~ro5_r3Fl&|7`xRmCCK+jfwf`Lo3pbaE zMi^S%)JyB*(>)|71+cZ0f^6gK#u8CJ}X_ zA<<^}5i2yfF9Io@Fw37gwzPEQ;`hzV^a#0EBFH+S2)aY6m=Se<1&FA*Wlw#2hQjHB zSbCMgaJZ@tW+1%kLq^rzWiP|ZnMGb1c!I3v&Z#A(z%zW$Ia_wFwu_~7O-^}G4yu9H zV#RAKp$m2!JytRxPb$Fbfvj=4-0qDiogsL24#ui;`8B|n`%@ws#M1 q9zQ=nzVXyft!)g>&Vz$T2XD@tyTAVO@6{iJ?n>6&p5QQf(#1Qh(LK~}BEEZabD2QDmFX#aYK_b|hKX6b`5mG(u?BulKA5gKJ zTF_2G3&CPU@CVpg*o|}VgYe$FUfA8)%g%mh&g}F3y_=)WbDL&1!mY`jTF2ekSg-lf z(a|5X6SjZ*V7Io}kL;JMU3OnYxVt2h09tEd=4LXZ8O&N`4Sq$KyGceGVC{d0!otmE zq7jBxHx1H;_;e4+Ndasvr63(p#bf|p0T4Bp)C>=oiz0}I=IIL238Aqm#ULC_jY&kE zXh^g^KVpdn_jw?tV`lj?!PPVnI0kcN(5Oa6hU`L6*HpluK*D>w;ZTX&rmpB z5KFHz7!Fs}!3=~~eaNV~yX-|+IWx~I1CNo_+!?i`6u8F^oU=veYCB&_*W{E3<)9j9 zEtb5t5;|wM(PJqC@}vT+9>^LO%kAEX(iwtR=U}Wl7heNxu|Fl!LgutOp5|e4qw3ju znxZ6Ff%@;uh1InRwlUc`xcA}r_seH(y!G+x`!{Dke|vcG)cLEAvGwErgS)Rj9j?5% se&y%r<*&7k)8p-_t*p+1>EBCFUY~qBTHm>b>C^5~?Cwq8-8g*q54 + +#define UI_PADDING 16 + +Texture2D i_texture; +Texture2D j_texture; +Texture2D l_texture; +Texture2D o_texture; +Texture2D s_texture; +Texture2D t_texture; +Texture2D z_texture; + +void R_UI_Load_Textures(void) { + i_texture = LoadTexture("./resources/tetromino_I.png"); + j_texture = LoadTexture("./resources/tetromino_J.png"); + l_texture = LoadTexture("./resources/tetromino_L.png"); + o_texture = LoadTexture("./resources/tetromino_O.png"); + s_texture = LoadTexture("./resources/tetromino_S.png"); + t_texture = LoadTexture("./resources/tetromino_T.png"); + z_texture = LoadTexture("./resources/tetromino_Z.png"); +} + +void R_UI_Draw_Ui(void) { + int up_next_box_size; + btype_t next_block_type = M_B_Get_Next_Block_Type(); + Texture2D *next_tetromino_texture = + R_UI_Get_Texture_By_Block_Type(next_block_type); + BeginDrawing(); + DrawRectangle(SC_GAME_WIDTH, 0, SC_UI_WIDTH, SC_HEIGHT, SC_Gray); + up_next_box_size = SC_UI_WIDTH - UI_PADDING * 3; + DrawRectangle(SC_GAME_WIDTH + UI_PADDING, UI_PADDING, up_next_box_size, + up_next_box_size, SC_Black); + if (next_tetromino_texture) { + DrawTexture(*next_tetromino_texture, + (SC_GAME_WIDTH + UI_PADDING + up_next_box_size / 2) - + next_tetromino_texture->width / 2, + UI_PADDING + + (up_next_box_size - next_tetromino_texture->height) / 2, + SC_White); + } + EndDrawing(); +} + +void R_UI_Draw_Game_Over(int score) { + const char *score_message = TextFormat("Score: %d", score); + BeginDrawing(); + DrawRectangle(0, 0, SC_GAME_WIDTH, SC_HEIGHT, SC_Black); + DrawText("Game Over", SC_GAME_WIDTH / 2 - MeasureText("Game Over", 24) / 2, + 200, 24, SC_Red); + DrawText(score_message, + SC_GAME_WIDTH / 2 - MeasureText(score_message, 18) / 2, 232, 18, + SC_Red); + /* Draw a play again button */ + EndDrawing(); +} + +Texture2D *R_UI_Get_Texture_By_Block_Type(btype_t block_type) { + switch (block_type) { + case bt_O: + return &o_texture; + case bt_I: + return &i_texture; + case bt_T: + return &t_texture; + case bt_J: + return &j_texture; + case bt_L: + return &l_texture; + case bt_S: + return &s_texture; + case bt_Z: + return &z_texture; + default: + return NULL; + } +} diff --git a/src/r_ui.h b/src/r_ui.h new file mode 100644 index 0000000..9fbab4a --- /dev/null +++ b/src/r_ui.h @@ -0,0 +1,10 @@ +#ifndef R_UI_H_ +#define R_UI_H_ +#include "block.h" + +void R_UI_Load_Textures(void); +void R_UI_Draw_Ui(void); +void R_UI_Draw_Game_Over(int score); +Texture2D *R_UI_Get_Texture_By_Block_Type(btype_t block_type); + +#endif diff --git a/src/rewrite/resources/black.png b/src/resources/black.png similarity index 100% rename from src/rewrite/resources/black.png rename to src/resources/black.png diff --git a/src/resources/blue.png b/src/resources/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3cfa888a0778a7490e64bade011b034db55f89 GIT binary patch literal 6715 zcmeHLd0Z3M77mD_2#AV;pfW~O5GTomge)Zpge^)i0xGyN$xJXpG9eit;EGseaX}Om z3o1$#72LoLXazUW)~!|F6Yz&B3HvvIf?bBbM|H&^CX6`-ryXSoOobTRD znk2~I!pzQ$LZMiQ0(^qOe@K7z?ghTJiHT1rlpePeL&L~mG#*lG2)QB}hsXpq4&ge5 zoI=snl}uYWpu)-gkIfK5IJUv1>Ke)*I7ZKr0nwd`1)B*w~` z&tzU%xTVsva9{o5wFTGLIP_oXRHt&fpW;sRD6_AvFU#2wxOs=^r7pj(AzE9 zvtB$IYTd$4a=1{L__*)9*5{Ppk0k#(#KK!VJB2#o+0v|ndGj49&BKCLyNuZC;cY== z&kjo{Ygu^gi_$^5X^+Na-V%O$Ki;u5Jon=G1j|E*e>-@r@Z7o?K`pB*p34`WA5vO7 z!ualyNq0A#jrQ7GbxN(YeAcw}NYBw^&N6A(l|d5=;8;Xv2UF)LB+k<{tmp#_o zyplhawZY}pHN|XROnzX>l{p-lV8&y9BUw^0ApC&)B@701t1JLl0)tjdR{<8!si<^6Ii9zR=k&}~%#e@OiS^^$TOcH`_N=8Ojk zPped{m=+~7xAa9`jp(;*a-Xt2ZR*~%eOr$SrD0e-0#9Je@D+EBDHK(%Fa=@ z=HC*PYink`hz^*W?099crDdDR8Q*dTFP8cBrOnjq&#jcHN50COSy*9lu228?fmsXFUOHEp&pxkSTisNA;vo9rVFUZm~IMJ_SN zl6u?M4;ipvmT+_TO!6D&C#E8|v-hnKvxYdRE~{?ON{)+kQhI z)GWTRnEQODXVLmx`Io1S#D~v?Qfcx7yQM$77`F&hHG%RRWQ<7k+v$G^ri3({($U+> z$8YmL7jE7=^~s5cMSD5&Ins-(%)>C zQ-QfX!jBCeSJ>k5;FbgV$AF{On(V6D{Y%VPwR;?X@3*M+>e)#_y8PoYTW+0-@kmKJ zKWocmZCbt-mZ$g?Hi4U1?zlPSKIy>y+o zN59I=mpFLR>ls_-pR1qo>+l`@JU7N=R~lJbCap1kI{SG-{Ipm9d0nD-&}u52u31+! zXh0x^GSET+)ILlc$d?gH8j2B8oTgK%K~_*G?&Ec8R2GGkkQ9$ps07s3iepqrfeEP7 z*kXoQEyU+40unWNNMcZ^EHO&P!>Hpu%-nT+0HDN46w)c9Ra(AIKsDgU2LyN$Q0J1Qnop<4$H&v+U1@|S zl8*3rJUW9(XEI@60c#UfB&vf|+L3yQb_^d}E7O2fRuC#kkBLf&SW-Zxf_~_Ye@eAj z+zGGJcCY~WpzBaI9icJkN+td65n9qW4uEtx^v)65P_SvzgK;eptC8Wpakz>c*&QMn z?~3UIAb@!{08G~DfI3zaZQuiw(eY?p3FguQw~=l>`-{Yq&JlVJBNa-uVH8-cZkFn~ z1W9P;66#L#Ztit<8<=@JCQ>1PPe}TnznFu0-#x<{)(zOeN-XC45VBZ(Tq2)0$%GLy z1;+1mhL3Z37|xU8Fpr5~Fau*rVIC@z!x)RnVewc}6k+n-0u-sVB&w3(dO$D*O##4M z*=&^I%D`ZzT!z3bnHvM0E&h35Dt^g zhH)tegJn321*5nWAoCE0tBmD_vT-*96ei=#35^m3>7-DikvLtgiZpcS*Ng8Z5ecYF z8l$U45{;7j0Rn2ELKUm)>IhXR@emT#bBb^nY*#LW$3l1r7uD}!F z69WywP!fF~9QRLfARvW2;eT1{6$5ey(}QdaP-sa)lVE6Smyr-Wrv0h?FmXMS2s0R0n1pEr9UV5R1ByTDeVgi+doTe#M z7!j{^?(RVRTwK56@1>po0g-9ZIQ&m>$>yS}NE~bi9pdqK@w#!@9E8Q;!g8F6!8{hr z6@0lNFv3O=DI1Y;F?oBIe#&^?(OEVSNkCm?{UH-$xJL08s^6Zr(=+JPIPecwn!&_5To#)HOA(G7W@0Qk z%)>ynyE1WCIf5W=434~edVYe;{+N~ihw(Dy7zYDU!H6pY_6)8Zfw^2aCXBL}Tq#@5 z;V_WD&uo9N4IA_gaxy6T`-+zZGxYTm%4G7{Y@nGi!%eT59XaJr*B@@)sFXYXuR7Kt zZ9eV!&>94TIAyu8g}CT`u!HiJAT=YwR!&LQsQ;r$>Zjf{C;$3l~K2k z=UQ6s%3r>&<2u_}$>&f#=93kxHm+Q~=+OyA_}JJ57HerGE<2|6j9NmQWt@@w%HA?> Yd}&{`(Tf|L`TFohzCk{Fyd#$W7Y)9M#sB~S literal 0 HcmV?d00001 diff --git a/src/resources/green.png b/src/resources/green.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ae258bf37dc1cd7110254734bdfc749ad7047a GIT binary patch literal 6721 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

69Jk)|Is z)CCkfu>TOqBdUYE-66i02NU5inJ|FT+v?Vs3pfF*gzCx-_@QqHlyE&%II6)t!3CzK zP!X8IfT?sLg~FxNxfHe&h0Ue(J2PmlPze=^I37{Q1Eh0z5KI6xM2u?Cx4|+SWvx>T$OTLfvdu@T)+kiT`lfyv3C835-}+zUqvQi-`P$_6es8lXiB&i+rR1FSIipF&- z{#M$_?+}?9O~ii{7Z#1mqj0bp42Z|?#fvc5EDi?BfdYOo4W-jy5e-3L5re~)h%qLG zBknJUL8t%xcn9<1UE;+Q@%^{@_Z}FocRQa0!euQ4Y-J&{3F!F_^Fj0}WIP zgUZ1A_2~a)rT<{OOoYNj5GD=ABs3OG=O7eV#6sCH&XUlXIEJv9l;4ln8*IaReS>D` z75#0+ONS{4j4*^$Dwo0HA~dj-=rnU6r(DRo!_7;Tav}d##|EU$vp>J)faKLnm|6o4 z7F@8I4sNet==*J9K<9KAZ_>GUuls%s#UI^L^>p-;@yf{$2wZ;~I8lNFDtYjPI-qZ#y^KF(*9W@Zi-Gqt{*YaN8eOJC-?(r&_+KUo ze8Ku`+*%xb{W2EK_4d?%2b0yi?fC*cja2%Cs|kcrHM+|n+iBE9&^SWF7kG`hYhW>) zV?Hy(@;GR!9jRUIlB1Rjd7$^O@f3GT@Tpw2yOG>TbnH|)u*OY1=}W6 zmVPhK3wEDheCqhBjls2X#*-Fh3QzTt+a6!8-w{eMv`8fkhX@8HZs3vd!~KnYWfA-O z9u-A*#mw=~`B+u&b6a)ypMk!~J*SOrmZ#+)&1QXD8Z%A1D@)c*?m5=ye0}@lajQPc VI7&Xa+e*rmZk$?aI literal 0 HcmV?d00001 diff --git a/src/resources/purple.png b/src/resources/purple.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae67ab41290d0ba1bc2fbe352bfdc1b8f75f818 GIT binary patch literal 6721 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 UveIP6Eq(Z6|3JSIpUBkz0OE|5f&c&j literal 0 HcmV?d00001 diff --git a/src/resources/red.png b/src/resources/red.png new file mode 100644 index 0000000000000000000000000000000000000000..2d08fa3eb73e96eff99372c6768a50eb4540f075 GIT binary patch literal 5917 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 E4YIkXwEzGB literal 0 HcmV?d00001 diff --git a/src/resources/tetromino_I.png b/src/resources/tetromino_I.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f10adab79e066d8c9cb85097b50e1d58302301 GIT binary patch literal 6855 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 P)F$oY>F=?_Ju>Y-U((av literal 0 HcmV?d00001 diff --git a/src/resources/tetromino_J.png b/src/resources/tetromino_J.png new file mode 100644 index 0000000000000000000000000000000000000000..fff79fc9fcf7215f341b1ec4a9c00721bf13b7de GIT binary patch literal 8232 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 literal 0 HcmV?d00001 diff --git a/src/resources/tetromino_L.png b/src/resources/tetromino_L.png new file mode 100644 index 0000000000000000000000000000000000000000..6404646b36fb349ac685f2aa0ef23deec73f1b36 GIT binary patch literal 8048 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

  • c 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 Wk@ONIp=)7=X@8@7Um{`{1W^C06@^p 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 literal 0 HcmV?d00001 diff --git a/src/resources/tetromino_T.png b/src/resources/tetromino_T.png new file mode 100644 index 0000000000000000000000000000000000000000..14bdb8feb294b7000b437c42673e9273bc9e128c GIT binary patch literal 8794 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 LnQpH3t^@xElq0@x literal 0 HcmV?d00001 diff --git a/src/resources/tetromino_Z.png b/src/resources/tetromino_Z.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ffaf08f8fb41bc4af715e56ee1c7cf57779dcb GIT binary patch literal 8933 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 literal 0 HcmV?d00001 diff --git a/src/resources/yellow.png b/src/resources/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..6366f2d47788eae6583342698b939bd8786a01e0 GIT binary patch literal 6715 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 Usuph*1mYnH{epb+#zrjuH{%hNFaQ7m literal 0 HcmV?d00001 diff --git a/src/rewrite/r_ui.c b/src/rewrite/r_ui.c deleted file mode 100644 index 5ca4fc8..0000000 --- a/src/rewrite/r_ui.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "r_ui.h" -#include "raylib.h" -#include "sc_def.h" - -#define UI_PADDING 16 - -void R_Draw_Ui(void) { - int up_next_box_size; - BeginDrawing(); - DrawRectangle(SC_GAME_WIDTH, 0, SC_UI_WIDTH, SC_HEIGHT, SC_Gray); - up_next_box_size = SC_UI_WIDTH - UI_PADDING * 3; - DrawRectangle(SC_GAME_WIDTH + UI_PADDING, 0 + UI_PADDING, up_next_box_size, - up_next_box_size, SC_Black); - EndDrawing(); -} - -void R_Draw_Game_Over(int score) { - const char *score_message = TextFormat("Score: %d", score); - BeginDrawing(); - DrawRectangle(0, 0, SC_GAME_WIDTH, SC_HEIGHT, SC_Black); - DrawText("Game Over", SC_GAME_WIDTH / 2 - MeasureText("Game Over", 24) / 2, - 200, 24, SC_Red); - DrawText(score_message, - SC_GAME_WIDTH / 2 - MeasureText(score_message, 18) / 2, 232, 18, - SC_Red); - /* Draw a play again button */ - EndDrawing(); -} diff --git a/src/rewrite/r_ui.h b/src/rewrite/r_ui.h deleted file mode 100644 index ec6b1a8..0000000 --- a/src/rewrite/r_ui.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef R_UI_H_ -#define R_UI_H_ - -void R_Draw_Ui(void); -void R_Draw_Game_Over(int score); - -#endif diff --git a/src/rewrite/resources/blue.png b/src/rewrite/resources/blue.png deleted file mode 100644 index de063413e0a8da88c0c2ef53525c05f79959d23c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmZuvF>91T5FK(sB$&cZtWs>F{~#8MdWSxgaA*ok!9oOIWg(uOjhOOvX@vU$+BsO* z1giwW!op&HfFRh}$~fP567KGEVP|KTnSF2G%$w=nt?jLgTV}S6+v9t6?sWU?nX=Dj zv)^VTo8H}@)HVB^{gHLcZbgKCNrABtX043^71MqTyC|guBJX|h{AR3ydD?}%R#-d3wjHv(1K}6Y>1NP||3a1NV z@l^)H;i@{Af$*vi8C7?ey$V*!EaR1cr;yd$1!_?#;2wUUoUJNX*X2^WCZ{|o2h~7p zv8J^Z(IvT!9%~tpClz4zK-RcgZZ{)JX9!-MgR$ydod(!ye~P4q%xM*#=3#Q9YHU4C zQ539z`t|kl#%4L!FuuP3;PbEV^YgZIZu98%eD`2}^<;E3z4_(si^C63j;~yL`sr}; l6&p5QWE=AR#26CVHg;km=s5R22=Bh@h25RK?Cf{u%)Z>;yScu)v1(@PxHY|7>t;7r&er_+ z@bIVElI`C)*sX2$Bl{(5m)#c;?k-Gp>uW{Jr*(`Pb$Fbfvj;@Zudr%&Jesh2V>Pad=0Q+e@di<%xQHz&BNqI)wA_9 zMMeeN#A?%wp>^@q>?0X{RE5C8xG diff --git a/src/rewrite/resources/light-blue.png b/src/rewrite/resources/light-blue.png deleted file mode 100644 index 23c3f3958ba3202c63b76c53ee5164bf65dda0f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 900 zcmZvaKWkM%5XFx%h8TP(NE)kGY-Q&M@K59g9gq;@6&4D9fm5YRCBY`xoi6wR1Pkp3 zL_{U6poO3?*l8o!X=5|aeGkIB?|NZ(XD>VZJ9B0acXw`$HZE-d7}@Q~-CD=pSYNAo zZ-4(ca2mUJrrWj6*~r-K2^cQTJD15jD3Qs87#O zI9(=|US%-cTvZ1%EWGNojHj_0kK!Il8$IC0L66#&5QWDzY77R0U?V77TomjCJCUet&;zoB7{pQwv5-@(RVuO4_Ei1^EA6Jx zMhV!)La>+>U4XmDQyQaWLlKXYtp>Bz+&nwRMja<4>?bwUwzhg2~m>i!B4QFF_I`t%Hi(*?2g zDudy0RUOPgc-4oDs=LcxhLtmmyfW|vS?jVPTVcy$iOs&n}@z?S<{A}wT2tK(@NCO4{{t*0qU zf)%L$j&6?DD%i&4{{FMWzkhCBw(-{CukUwe?|)poaq;@?H@I;8_B3?jDWK{NDch@mzN&cBYfh51zmK2gMbcY5)KL diff --git a/src/rewrite/resources/purple.png b/src/rewrite/resources/purple.png deleted file mode 100644 index 19f10b4bd60585233e3a8420d4102a4330e61037..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@*O>0977^n z-(EKqWl#_}eBr=hW#%Lc;}mdKI;Vst0In+}R{#J2 diff --git a/src/rewrite/resources/red.png b/src/rewrite/resources/red.png deleted file mode 100644 index 958e9a5f46b1fc5eabf7ff5393ed88f1b2eb2a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 899 zcmZvav1^n;5XHwN#N)`JA|hDG6ws&`br?xp8Ia{)J*?ke=?vh9XXsv~ro5_r3Fl&|7`xRmCCK+jfwf`Lo3pbaE zMi^S%)JyB*(>)|71+cZ0f^6gK#u8CJ}X_ zA<<^}5i2yfF9Io@Fw37gwzPEQ;`hzV^a#0EBFH+S2)aY6m=Se<1&FA*Wlw#2hQjHB zSbCMgaJZ@tW+1%kLq^rzWiP|ZnMGb1c!I3v&Z#A(z%zW$Ia_wFwu_~7O-^}G4yu9H zV#RAKp$m2!JytRxPb$Fbfvj=4-0qDiogsL24#ui;`8B|n`%@ws#M1 q9zQ=nzVXyft!)g>&Vz$T2XD@tyTAVO@6{iJ?n>6&p5QQf(#1Qh(LK~}BEEZabD2QDmFX#aYK_b|hKX6b`5mG(u?BulKA5gKJ zTF_2G3&CPU@CVpg*o|}VgYe$FUfA8)%g%mh&g}F3y_=)WbDL&1!mY`jTF2ekSg-lf z(a|5X6SjZ*V7Io}kL;JMU3OnYxVt2h09tEd=4LXZ8O&N`4Sq$KyGceGVC{d0!otmE zq7jBxHx1H;_;e4+Ndasvr63(p#bf|p0T4Bp)C>=oiz0}I=IIL238Aqm#ULC_jY&kE zXh^g^KVpdn_jw?tV`lj?!PPVnI0kcN(5Oa6hU`L6*HpluK*D>w;ZTX&rmpB z5KFHz7!Fs}!3=~~eaNV~yX-|+IWx~I1CNo_+!?i`6u8F^oU=veYCB&_*W{E3<)9j9 zEtb5t5;|wM(PJqC@}vT+9>^LO%kAEX(iwtR=U}Wl7heNxu|Fl!LgutOp5|e4qw3ju znxZ6Ff%@;uh1InRwlUc`xcA}r_seH(y!G+x`!{Dke|vcG)cLEAvGwErgS)Rj9j?5% se&y%r<*&7k)8p-_t*p+1>EBCFUY~qBTHm>b>C^5~?Cwq8-8g*q54