From 1a68a517559fac859006e318015fcb38370cbc0c Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Mon, 13 Jun 2022 12:16:54 +0800 Subject: [PATCH] update templates --- linux/templates/raylib-game.ico | Bin 0 -> 67646 bytes linux/templates/raylib-snake.ico | Bin 0 -> 67646 bytes linux/templates/raylib-tetris.ico | Bin 0 -> 67646 bytes linux/templates/raylib.template | 6 +- linux/templates/raylib_snake.template | 20 + linux/templates/raylib_snake_c.txt | 286 ++++++++ linux/templates/raylib_tetris.template | 20 + linux/templates/raylib_tetris_c.txt | 791 +++++++++++++++++++++++ linux/templates/rdrawing.ico | Bin 0 -> 67646 bytes linux/templates/rdrawing.template | 20 + linux/templates/rdrawing_c.txt | 48 ++ windows/templates/raylib-game.ico | Bin 0 -> 67646 bytes windows/templates/raylib-snake.ico | Bin 0 -> 67646 bytes windows/templates/raylib-tetris.ico | Bin 0 -> 67646 bytes windows/templates/raylib.template | 6 +- windows/templates/raylib_snake.template | 20 + windows/templates/raylib_snake_c.txt | 286 ++++++++ windows/templates/raylib_tetris.template | 20 + windows/templates/raylib_tetris_c.txt | 791 +++++++++++++++++++++++ windows/templates/rdrawing.ico | Bin 0 -> 67646 bytes windows/templates/rdrawing.template | 20 + windows/templates/rdrawing_c.txt | 48 ++ 22 files changed, 2376 insertions(+), 6 deletions(-) create mode 100644 linux/templates/raylib-game.ico create mode 100644 linux/templates/raylib-snake.ico create mode 100644 linux/templates/raylib-tetris.ico create mode 100644 linux/templates/raylib_snake.template create mode 100644 linux/templates/raylib_snake_c.txt create mode 100644 linux/templates/raylib_tetris.template create mode 100644 linux/templates/raylib_tetris_c.txt create mode 100644 linux/templates/rdrawing.ico create mode 100644 linux/templates/rdrawing.template create mode 100644 linux/templates/rdrawing_c.txt create mode 100644 windows/templates/raylib-game.ico create mode 100644 windows/templates/raylib-snake.ico create mode 100644 windows/templates/raylib-tetris.ico create mode 100644 windows/templates/raylib_snake.template create mode 100644 windows/templates/raylib_snake_c.txt create mode 100644 windows/templates/raylib_tetris.template create mode 100644 windows/templates/raylib_tetris_c.txt create mode 100644 windows/templates/rdrawing.ico create mode 100644 windows/templates/rdrawing.template create mode 100644 windows/templates/rdrawing_c.txt diff --git a/linux/templates/raylib-game.ico b/linux/templates/raylib-game.ico new file mode 100644 index 0000000000000000000000000000000000000000..ad1169842500f9bca3320eb86ad088c0c12e5215 GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/linux/templates/raylib-snake.ico b/linux/templates/raylib-snake.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e8ce4af533f8f63d084d4cdf39aa6b2c8e21c3c GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/linux/templates/raylib-tetris.ico b/linux/templates/raylib-tetris.ico new file mode 100644 index 0000000000000000000000000000000000000000..f026b7506408642e8baf0c6fe93d54b7571aa195 GIT binary patch literal 67646 zcmeI5&yQ3^5Xav_Hmt{KX~&yg>qz3~IuW3m1QcUHJpJ zd0G#8)+50SG7%GvC+?c)T|F3MP=nG|%}&2JRsF^tqSgJ_{x<3Dt)7{#?)ucX-kS*n zMKMBumX-?oxxLsqHd0I$MX{4QP4Q%Ro_{Uqv6?nbb6-%uL*1cg5d&t;%$fa7FwcT{ zowlL-ylWn6e%}1+Y69jm&x!Wecb#>wyXUa>$?GqCa3jd?$M?3(&+E^|zVz9bPrvVO zz5S_q*M0}tey^5eoo`Ejer@ny{a)9{%5nt%iUah&5(~?G^J_!@Ro>NUkmr1?EXO+E zmj3+O;1B*f_i+CwbHZ!Ia?}iB)g9%L!GGho|4W;sIt zl65K$sr-UJ`0Lz5{g*jmS%3Z7ngQGXG0PG9m#kB9NaYv&!C&Vd>c7kh%lhlr)(qJ8 zk6Dh;zhs??Ln^=E5B@s$Q2%94Sk_;^wr0S#f6Q`({w3>F98&oOfAH72hx#vb!m|GQ zwKW5_{bQCR^e`VKfo!lP9xAxn!X~?Rz=(K_XvybupYxcpu zwEx84|I7+L9Txm${)0dCpHmJ%|Ioj<2IKmlll*c0C))k_pA~#MEb2e__ve52JsIBr zWm5*Af9N0juW}$8;r9*-{a5T+2e~!y2Y=N6DhHr{eEyqL4xs*5+Q;>uVu8Re*%t@Qi#a%e%?on2L8>>_Za+lk&`Cr4|}P2#Nf|9t|A8pYv9=}mz;GU z5PxP9qm7c2Gt@6pUyR&;Ab&#hiSPf!UU+YBJ^#0P*D>hXG_3j7p%aRjC;tAo*bDCs z{7rKZ{HeZZ4fJf&z&B)Z@CSd9|ET}v^{^olHQfgE5B)>`>K>RB$1%yFLI2P{^bh@) zIe_~=-2cV+_b2G$TISrp{f^InOm9PQ{m1oR=n(b4tV^cCYslizKlBg%*WZgYM53nK zfc~L>=pXtoa{%{$xc|fZ|85SLUU(a_IIjP={+G3%aB_?-=-OHY-cLKH>#-0@CU|aK_ojfO=GpxVJ&+CxCSZ$dcH6T z_x~8MU6{M(M%RsZ&oa7x+%3#~7Ch(FzVF>5Do=*-8TmOe`ERAOeHZzBb@}!y?cvqB zeH`2Mx%2(C`ET4ChyDz>dYzv=@UuI<`%A~8pVQ;HgTK2I&wN#`$!o9X*Zcp!$LFT6 z)cKCdpN?Me_s+Wn0DshfkpmWb*K0!mspKB` z73`UdW@TZ6f50Kt1o)%=iyW}fyIvFePbK%juVBwyG%E`m`~wcDCcq!{U*v#=-u0T$ ze=4~Leg*qFE*Z>qf~e#(0seW{|2rAzd$k>;tAN)Gs==Iv>LzX`1ac;1C k0o&FMN4$8j+r_^4v)%gdHZvdLwYbrG-L_)EUMunV2VD1tj{pDw literal 0 HcmV?d00001 diff --git a/linux/templates/raylib.template b/linux/templates/raylib.template index dd3486e4..112d1c47 100644 --- a/linux/templates/raylib.template +++ b/linux/templates/raylib.template @@ -2,9 +2,9 @@ ver=2 Name=raylib Name[zh_CN]=raylib -Icon=raylib.ico -Description=A simple program using raylib ( https://raylib.com ) -Description[zh_CN]=简单的raylib绘图程序 ( https://raylib.com ) +Icon=raylib-game.ico +Description=A simple interactive animation using raylib ( https://raylib.com ) +Description[zh_CN]=简单的raylib交互动画 ( https://raylib.com ) Category=Multimedia Category[zh_CN]=多媒体 diff --git a/linux/templates/raylib_snake.template b/linux/templates/raylib_snake.template new file mode 100644 index 00000000..ad94dc9a --- /dev/null +++ b/linux/templates/raylib_snake.template @@ -0,0 +1,20 @@ +[Template] +ver=2 +Name=snake +Name[zh_CN]=吞食蛇 +Icon=raylib-snake.ico +Description=snake game using raylib ( https://raylib.com ) +Description[zh_CN]=经典的吞食蛇游戏(基于raylib) ( https://raylib.com ) +Category=Game +Category[zh_CN]=游戏 + +[Unit0] +CName=main.c +C=raylib_snake_c.txt + +[Project] +UnitCount=1 +Type=1 +IsCpp=0 +linker=-lraylib -lGL -lm -lpthread -ldl -lrt -lX11 + diff --git a/linux/templates/raylib_snake_c.txt b/linux/templates/raylib_snake_c.txt new file mode 100644 index 00000000..62eace4d --- /dev/null +++ b/linux/templates/raylib_snake_c.txt @@ -0,0 +1,286 @@ +/******************************************************************************************* +* +* raylib - classic game: snake +* +* Sample game developed by Ian Eito, Albert Martos and Ramon Santamaria +* +* This game has been created using raylib v1.3 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#if defined(PLATFORM_WEB) + #include +#endif + +//---------------------------------------------------------------------------------- +// Some Defines +//---------------------------------------------------------------------------------- +#define SNAKE_LENGTH 256 +#define SQUARE_SIZE 31 + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef struct Snake { + Vector2 position; + Vector2 size; + Vector2 speed; + Color color; +} Snake; + +typedef struct Food { + Vector2 position; + Vector2 size; + bool active; + Color color; +} Food; + +//------------------------------------------------------------------------------------ +// Global Variables Declaration +//------------------------------------------------------------------------------------ +static const int screenWidth = 800; +static const int screenHeight = 450; + +static int framesCounter = 0; +static bool gameOver = false; +static bool pause = false; + +static Food fruit = { 0 }; +static Snake snake[SNAKE_LENGTH] = { 0 }; +static Vector2 snakePosition[SNAKE_LENGTH] = { 0 }; +static bool allowMove = false; +static Vector2 offset = { 0 }; +static int counterTail = 0; + +//------------------------------------------------------------------------------------ +// Module Functions Declaration (local) +//------------------------------------------------------------------------------------ +static void InitGame(void); // Initialize game +static void UpdateGame(void); // Update game (one frame) +static void DrawGame(void); // Draw game (one frame) +static void UnloadGame(void); // Unload game +static void UpdateDrawFrame(void); // Update and Draw (one frame) + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization (Note windowTitle is unused on Android) + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "classic game: snake"); + + InitGame(); + +#if defined(PLATFORM_WEB) + emscripten_set_main_loop(UpdateDrawFrame, 60, 1); +#else + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update and Draw + //---------------------------------------------------------------------------------- + UpdateDrawFrame(); + //---------------------------------------------------------------------------------- + } +#endif + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadGame(); // Unload loaded data (textures, sounds, models...) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//------------------------------------------------------------------------------------ +// Module Functions Definitions (local) +//------------------------------------------------------------------------------------ + +// Initialize game variables +void InitGame(void) +{ + framesCounter = 0; + gameOver = false; + pause = false; + + counterTail = 1; + allowMove = false; + + offset.x = screenWidth%SQUARE_SIZE; + offset.y = screenHeight%SQUARE_SIZE; + + for (int i = 0; i < SNAKE_LENGTH; i++) + { + snake[i].position = (Vector2){ offset.x/2, offset.y/2 }; + snake[i].size = (Vector2){ SQUARE_SIZE, SQUARE_SIZE }; + snake[i].speed = (Vector2){ SQUARE_SIZE, 0 }; + + if (i == 0) snake[i].color = DARKBLUE; + else snake[i].color = BLUE; + } + + for (int i = 0; i < SNAKE_LENGTH; i++) + { + snakePosition[i] = (Vector2){ 0.0f, 0.0f }; + } + + fruit.size = (Vector2){ SQUARE_SIZE, SQUARE_SIZE }; + fruit.color = SKYBLUE; + fruit.active = false; +} + +// Update game (one frame) +void UpdateGame(void) +{ + if (!gameOver) + { + if (IsKeyPressed('P')) pause = !pause; + + if (!pause) + { + // Player control + if (IsKeyPressed(KEY_RIGHT) && (snake[0].speed.x == 0) && allowMove) + { + snake[0].speed = (Vector2){ SQUARE_SIZE, 0 }; + allowMove = false; + } + if (IsKeyPressed(KEY_LEFT) && (snake[0].speed.x == 0) && allowMove) + { + snake[0].speed = (Vector2){ -SQUARE_SIZE, 0 }; + allowMove = false; + } + if (IsKeyPressed(KEY_UP) && (snake[0].speed.y == 0) && allowMove) + { + snake[0].speed = (Vector2){ 0, -SQUARE_SIZE }; + allowMove = false; + } + if (IsKeyPressed(KEY_DOWN) && (snake[0].speed.y == 0) && allowMove) + { + snake[0].speed = (Vector2){ 0, SQUARE_SIZE }; + allowMove = false; + } + + // Snake movement + for (int i = 0; i < counterTail; i++) snakePosition[i] = snake[i].position; + + if ((framesCounter%5) == 0) + { + for (int i = 0; i < counterTail; i++) + { + if (i == 0) + { + snake[0].position.x += snake[0].speed.x; + snake[0].position.y += snake[0].speed.y; + allowMove = true; + } + else snake[i].position = snakePosition[i-1]; + } + } + + // Wall behaviour + if (((snake[0].position.x) > (screenWidth - offset.x)) || + ((snake[0].position.y) > (screenHeight - offset.y)) || + (snake[0].position.x < 0) || (snake[0].position.y < 0)) + { + gameOver = true; + } + + // Collision with yourself + for (int i = 1; i < counterTail; i++) + { + if ((snake[0].position.x == snake[i].position.x) && (snake[0].position.y == snake[i].position.y)) gameOver = true; + } + + // Fruit position calculation + if (!fruit.active) + { + fruit.active = true; + fruit.position = (Vector2){ GetRandomValue(0, (screenWidth/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.x/2, GetRandomValue(0, (screenHeight/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.y/2 }; + + for (int i = 0; i < counterTail; i++) + { + while ((fruit.position.x == snake[i].position.x) && (fruit.position.y == snake[i].position.y)) + { + fruit.position = (Vector2){ GetRandomValue(0, (screenWidth/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.x/2, GetRandomValue(0, (screenHeight/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.y/2 }; + i = 0; + } + } + } + + // Collision + if ((snake[0].position.x < (fruit.position.x + fruit.size.x) && (snake[0].position.x + snake[0].size.x) > fruit.position.x) && + (snake[0].position.y < (fruit.position.y + fruit.size.y) && (snake[0].position.y + snake[0].size.y) > fruit.position.y)) + { + snake[counterTail].position = snakePosition[counterTail - 1]; + counterTail += 1; + fruit.active = false; + } + + framesCounter++; + } + } + else + { + if (IsKeyPressed(KEY_ENTER)) + { + InitGame(); + gameOver = false; + } + } +} + +// Draw game (one frame) +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (!gameOver) + { + // Draw grid lines + for (int i = 0; i < screenWidth/SQUARE_SIZE + 1; i++) + { + DrawLineV((Vector2){SQUARE_SIZE*i + offset.x/2, offset.y/2}, (Vector2){SQUARE_SIZE*i + offset.x/2, screenHeight - offset.y/2}, LIGHTGRAY); + } + + for (int i = 0; i < screenHeight/SQUARE_SIZE + 1; i++) + { + DrawLineV((Vector2){offset.x/2, SQUARE_SIZE*i + offset.y/2}, (Vector2){screenWidth - offset.x/2, SQUARE_SIZE*i + offset.y/2}, LIGHTGRAY); + } + + // Draw snake + for (int i = 0; i < counterTail; i++) DrawRectangleV(snake[i].position, snake[i].size, snake[i].color); + + // Draw fruit to pick + DrawRectangleV(fruit.position, fruit.size, fruit.color); + + if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY); + } + else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY); + + EndDrawing(); +} + +// Unload game variables +void UnloadGame(void) +{ + // TODO: Unload all dynamic loaded data (textures, sounds, models...) +} + +// Update and Draw (one frame) +void UpdateDrawFrame(void) +{ + UpdateGame(); + DrawGame(); +} \ No newline at end of file diff --git a/linux/templates/raylib_tetris.template b/linux/templates/raylib_tetris.template new file mode 100644 index 00000000..061ca1ed --- /dev/null +++ b/linux/templates/raylib_tetris.template @@ -0,0 +1,20 @@ +[Template] +ver=2 +Name=Tetris +Name[zh_CN]=俄罗斯方块 +Icon=raylib-tetris.ico +Description=Tetris game using raylib ( https://raylib.com ) +Description[zh_CN]=经典的俄罗斯方块游戏(基于raylib) ( https://raylib.com ) +Category=Game +Category[zh_CN]=游戏 + +[Unit0] +CName=main.c +C=raylib_tetris_c.txt + +[Project] +UnitCount=1 +Type=1 +IsCpp=0 +linker=-lraylib -lGL -lm -lpthread -ldl -lrt -lX11 + diff --git a/linux/templates/raylib_tetris_c.txt b/linux/templates/raylib_tetris_c.txt new file mode 100644 index 00000000..08f37557 --- /dev/null +++ b/linux/templates/raylib_tetris_c.txt @@ -0,0 +1,791 @@ +/******************************************************************************************* +* +* raylib - classic game: tetris +* +* Sample game developed by Marc Palau and Ramon Santamaria +* +* This game has been created using raylib v1.3 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include +#include +#include +#include + +#if defined(PLATFORM_WEB) + #include +#endif + +//---------------------------------------------------------------------------------- +// Some Defines +//---------------------------------------------------------------------------------- +#define SQUARE_SIZE 20 + +#define GRID_HORIZONTAL_SIZE 12 +#define GRID_VERTICAL_SIZE 20 + +#define LATERAL_SPEED 10 +#define TURNING_SPEED 12 +#define FAST_FALL_AWAIT_COUNTER 30 + +#define FADING_TIME 33 + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef enum GridSquare { EMPTY, MOVING, FULL, BLOCK, FADING } GridSquare; + +//------------------------------------------------------------------------------------ +// Global Variables Declaration +//------------------------------------------------------------------------------------ +static const int screenWidth = 800; +static const int screenHeight = 450; + +static bool gameOver = false; +static bool pause = false; + +// Matrices +static GridSquare grid [GRID_HORIZONTAL_SIZE][GRID_VERTICAL_SIZE]; +static GridSquare piece [4][4]; +static GridSquare incomingPiece [4][4]; + +// Theese variables keep track of the active piece position +static int piecePositionX = 0; +static int piecePositionY = 0; + +// Game parameters +static Color fadingColor; +//static int fallingSpeed; // In frames + +static bool beginPlay = true; // This var is only true at the begining of the game, used for the first matrix creations +static bool pieceActive = false; +static bool detection = false; +static bool lineToDelete = false; + +// Statistics +static int level = 1; +static int lines = 0; + +// Counters +static int gravityMovementCounter = 0; +static int lateralMovementCounter = 0; +static int turnMovementCounter = 0; +static int fastFallMovementCounter = 0; + +static int fadeLineCounter = 0; + +// Based on level +static int gravitySpeed = 30; + +//------------------------------------------------------------------------------------ +// Module Functions Declaration (local) +//------------------------------------------------------------------------------------ +static void InitGame(void); // Initialize game +static void UpdateGame(void); // Update game (one frame) +static void DrawGame(void); // Draw game (one frame) +static void UnloadGame(void); // Unload game +static void UpdateDrawFrame(void); // Update and Draw (one frame) + +// Additional module functions +static bool Createpiece(); +static void GetRandompiece(); +static void ResolveFallingMovement(bool *detection, bool *pieceActive); +static bool ResolveLateralMovement(); +static bool ResolveTurnMovement(); +static void CheckDetection(bool *detection); +static void CheckCompletion(bool *lineToDelete); +static void DeleteCompleteLines(); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization (Note windowTitle is unused on Android) + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "classic game: tetris"); + + InitGame(); + +#if defined(PLATFORM_WEB) + emscripten_set_main_loop(UpdateDrawFrame, 60, 1); +#else + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update and Draw + //---------------------------------------------------------------------------------- + UpdateDrawFrame(); + //---------------------------------------------------------------------------------- + } +#endif + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadGame(); // Unload loaded data (textures, sounds, models...) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//-------------------------------------------------------------------------------------- +// Game Module Functions Definition +//-------------------------------------------------------------------------------------- + +// Initialize game variables +void InitGame(void) +{ + // Initialize game statistics + level = 1; + lines = 0; + + fadingColor = GRAY; + + piecePositionX = 0; + piecePositionY = 0; + + pause = false; + + beginPlay = true; + pieceActive = false; + detection = false; + lineToDelete = false; + + // Counters + gravityMovementCounter = 0; + lateralMovementCounter = 0; + turnMovementCounter = 0; + fastFallMovementCounter = 0; + + fadeLineCounter = 0; + gravitySpeed = 30; + + // Initialize grid matrices + for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++) + { + for (int j = 0; j < GRID_VERTICAL_SIZE; j++) + { + if ((j == GRID_VERTICAL_SIZE - 1) || (i == 0) || (i == GRID_HORIZONTAL_SIZE - 1)) grid[i][j] = BLOCK; + else grid[i][j] = EMPTY; + } + } + + // Initialize incoming piece matrices + for (int i = 0; i < 4; i++) + { + for (int j = 0; j< 4; j++) + { + incomingPiece[i][j] = EMPTY; + } + } +} + +// Update game (one frame) +void UpdateGame(void) +{ + if (!gameOver) + { + if (IsKeyPressed('P')) pause = !pause; + + if (!pause) + { + if (!lineToDelete) + { + if (!pieceActive) + { + // Get another piece + pieceActive = Createpiece(); + + // We leave a little time before starting the fast falling down + fastFallMovementCounter = 0; + } + else // Piece falling + { + // Counters update + fastFallMovementCounter++; + gravityMovementCounter++; + lateralMovementCounter++; + turnMovementCounter++; + + // We make sure to move if we've pressed the key this frame + if (IsKeyPressed(KEY_LEFT) || IsKeyPressed(KEY_RIGHT)) lateralMovementCounter = LATERAL_SPEED; + if (IsKeyPressed(KEY_UP)) turnMovementCounter = TURNING_SPEED; + + // Fall down + if (IsKeyDown(KEY_DOWN) && (fastFallMovementCounter >= FAST_FALL_AWAIT_COUNTER)) + { + // We make sure the piece is going to fall this frame + gravityMovementCounter += gravitySpeed; + } + + if (gravityMovementCounter >= gravitySpeed) + { + // Basic falling movement + CheckDetection(&detection); + + // Check if the piece has collided with another piece or with the boundings + ResolveFallingMovement(&detection, &pieceActive); + + // Check if we fullfilled a line and if so, erase the line and pull down the the lines above + CheckCompletion(&lineToDelete); + + gravityMovementCounter = 0; + } + + // Move laterally at player's will + if (lateralMovementCounter >= LATERAL_SPEED) + { + // Update the lateral movement and if success, reset the lateral counter + if (!ResolveLateralMovement()) lateralMovementCounter = 0; + } + + // Turn the piece at player's will + if (turnMovementCounter >= TURNING_SPEED) + { + // Update the turning movement and reset the turning counter + if (ResolveTurnMovement()) turnMovementCounter = 0; + } + } + + // Game over logic + for (int j = 0; j < 2; j++) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == FULL) + { + gameOver = true; + } + } + } + } + else + { + // Animation when deleting lines + fadeLineCounter++; + + if (fadeLineCounter%8 < 4) fadingColor = MAROON; + else fadingColor = GRAY; + + if (fadeLineCounter >= FADING_TIME) + { + DeleteCompleteLines(); + fadeLineCounter = 0; + lineToDelete = false; + + lines++; + } + } + } + } + else + { + if (IsKeyPressed(KEY_ENTER)) + { + InitGame(); + gameOver = false; + } + } +} + +// Draw game (one frame) +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (!gameOver) + { + // Draw gameplay area + Vector2 offset; + offset.x = screenWidth/2 - (GRID_HORIZONTAL_SIZE*SQUARE_SIZE/2) - 50; + offset.y = screenHeight/2 - ((GRID_VERTICAL_SIZE - 1)*SQUARE_SIZE/2) + SQUARE_SIZE*2; + + offset.y -= 50; // NOTE: Harcoded position! + + int controller = offset.x; + + for (int j = 0; j < GRID_VERTICAL_SIZE; j++) + { + for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++) + { + // Draw each square of the grid + if (grid[i][j] == EMPTY) + { + DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY ); + DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == FULL) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == MOVING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, DARKGRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == BLOCK) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, LIGHTGRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == FADING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, fadingColor); + offset.x += SQUARE_SIZE; + } + } + + offset.x = controller; + offset.y += SQUARE_SIZE; + } + + // Draw incoming piece (hardcoded) + offset.x = 500; + offset.y = 45; + + int controler = offset.x; + + for (int j = 0; j < 4; j++) + { + for (int i = 0; i < 4; i++) + { + if (incomingPiece[i][j] == EMPTY) + { + DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY ); + DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + offset.x += SQUARE_SIZE; + } + else if (incomingPiece[i][j] == MOVING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY); + offset.x += SQUARE_SIZE; + } + } + + offset.x = controler; + offset.y += SQUARE_SIZE; + } + + DrawText("INCOMING:", offset.x, offset.y - 100, 10, GRAY); + DrawText(TextFormat("LINES: %04i", lines), offset.x, offset.y + 20, 10, GRAY); + + if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY); + } + else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY); + + EndDrawing(); +} + +// Unload game variables +void UnloadGame(void) +{ + // TODO: Unload all dynamic loaded data (textures, sounds, models...) +} + +// Update and Draw (one frame) +void UpdateDrawFrame(void) +{ + UpdateGame(); + DrawGame(); +} + +//-------------------------------------------------------------------------------------- +// Additional module functions +//-------------------------------------------------------------------------------------- +static bool Createpiece() +{ + piecePositionX = (int)((GRID_HORIZONTAL_SIZE - 4)/2); + piecePositionY = 0; + + // If the game is starting and you are going to create the first piece, we create an extra one + if (beginPlay) + { + GetRandompiece(); + beginPlay = false; + } + + // We assign the incoming piece to the actual piece + for (int i = 0; i < 4; i++) + { + for (int j = 0; j< 4; j++) + { + piece[i][j] = incomingPiece[i][j]; + } + } + + // We assign a random piece to the incoming one + GetRandompiece(); + + // Assign the piece to the grid + for (int i = piecePositionX; i < piecePositionX + 4; i++) + { + for (int j = 0; j < 4; j++) + { + if (piece[i - (int)piecePositionX][j] == MOVING) grid[i][j] = MOVING; + } + } + + return true; +} + +static void GetRandompiece() +{ + int random = GetRandomValue(0, 6); + + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + incomingPiece[i][j] = EMPTY; + } + } + + switch (random) + { + case 0: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break; //Cube + case 1: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break; //L + case 2: { incomingPiece[1][2] = MOVING; incomingPiece[2][0] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; } break; //L inversa + case 3: { incomingPiece[0][1] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break; //Recta + case 4: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][1] = MOVING; } break; //Creu tallada + case 5: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[3][2] = MOVING; } break; //S + case 6: { incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break; //S inversa + } +} + +static void ResolveFallingMovement(bool *detection, bool *pieceActive) +{ + // If we finished moving this piece, we stop it + if (*detection) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j] = FULL; + *detection = false; + *pieceActive = false; + } + } + } + } + else // We move down the piece + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j+1] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionY++; + } +} + +static bool ResolveLateralMovement() +{ + bool collision = false; + + // Piece movement + if (IsKeyDown(KEY_LEFT)) // Move left + { + // Check if is possible to move to left + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + // Check if we are touching the left wall or we have a full square at the left + if ((i-1 == 0) || (grid[i-1][j] == FULL)) collision = true; + } + } + } + + // If able, move left + if (!collision) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) // We check the matrix from left to right + { + // Move everything to the left + if (grid[i][j] == MOVING) + { + grid[i-1][j] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionX--; + } + } + else if (IsKeyDown(KEY_RIGHT)) // Move right + { + // Check if is possible to move to right + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + // Check if we are touching the right wall or we have a full square at the right + if ((i+1 == GRID_HORIZONTAL_SIZE - 1) || (grid[i+1][j] == FULL)) + { + collision = true; + + } + } + } + } + + // If able move right + if (!collision) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = GRID_HORIZONTAL_SIZE - 1; i >= 1; i--) // We check the matrix from right to left + { + // Move everything to the right + if (grid[i][j] == MOVING) + { + grid[i+1][j] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionX++; + } + } + + return collision; +} + +static bool ResolveTurnMovement() +{ + // Input for turning the piece + if (IsKeyDown(KEY_UP)) + { + GridSquare aux; + bool checker = false; + + // Check all turning possibilities + if ((grid[piecePositionX + 3][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY] != EMPTY) && + (grid[piecePositionX][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 2] != MOVING)) checker = true; + + if (!checker) + { + aux = piece[0][0]; + piece[0][0] = piece[3][0]; + piece[3][0] = piece[3][3]; + piece[3][3] = piece[0][3]; + piece[0][3] = aux; + + aux = piece[1][0]; + piece[1][0] = piece[3][1]; + piece[3][1] = piece[2][3]; + piece[2][3] = piece[0][2]; + piece[0][2] = aux; + + aux = piece[2][0]; + piece[2][0] = piece[3][2]; + piece[3][2] = piece[1][3]; + piece[1][3] = piece[0][1]; + piece[0][1] = aux; + + aux = piece[1][1]; + piece[1][1] = piece[2][1]; + piece[2][1] = piece[2][2]; + piece[2][2] = piece[1][2]; + piece[1][2] = aux; + } + + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j] = EMPTY; + } + } + } + + for (int i = piecePositionX; i < piecePositionX + 4; i++) + { + for (int j = piecePositionY; j < piecePositionY + 4; j++) + { + if (piece[i - piecePositionX][j - piecePositionY] == MOVING) + { + grid[i][j] = MOVING; + } + } + } + + return true; + } + + return false; +} + +static void CheckDetection(bool *detection) +{ + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if ((grid[i][j] == MOVING) && ((grid[i][j+1] == FULL) || (grid[i][j+1] == BLOCK))) *detection = true; + } + } +} + +static void CheckCompletion(bool *lineToDelete) +{ + int calculator = 0; + + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + calculator = 0; + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + // Count each square of the line + if (grid[i][j] == FULL) + { + calculator++; + } + + // Check if we completed the whole line + if (calculator == GRID_HORIZONTAL_SIZE - 2) + { + *lineToDelete = true; + calculator = 0; + // points++; + + // Mark the completed line + for (int z = 1; z < GRID_HORIZONTAL_SIZE - 1; z++) + { + grid[z][j] = FADING; + } + } + } + } +} + +static void DeleteCompleteLines() +{ + // Erase the completed line + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + while (grid[1][j] == FADING) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + grid[i][j] = EMPTY; + } + + for (int j2 = j-1; j2 >= 0; j2--) + { + for (int i2 = 1; i2 < GRID_HORIZONTAL_SIZE - 1; i2++) + { + if (grid[i2][j2] == FULL) + { + grid[i2][j2+1] = FULL; + grid[i2][j2] = EMPTY; + } + else if (grid[i2][j2] == FADING) + { + grid[i2][j2+1] = FADING; + grid[i2][j2] = EMPTY; + } + } + } + } + } +} \ No newline at end of file diff --git a/linux/templates/rdrawing.ico b/linux/templates/rdrawing.ico new file mode 100644 index 0000000000000000000000000000000000000000..054968fdc28e3b6acf7d330068db56a1df6db3df GIT binary patch literal 67646 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 +#include +#include + + +void paintstar(Image* pImage, double x, double y, double r, double a) +{ + int vx[5]; + int vy[5]; + for (int i = 0; i < 5; ++i) + { + vx[i] = (int)( -cos( PI * 4 / 5 * i + a ) * r + x ); + vy[i] = (int)( sin( PI * 4 / 5 * i + a) * r + y ); + } + ImageFillPolygonEx(pImage,vx,vy,5,LIGHTRED); + ImageDrawPolygonEx(pImage,vx,vy,5,2,DARKBROWN); +} + +int main() { + InitWindow(640,480,"rdrawing"); + SetTraceLogLevel(LOG_WARNING); + SetTargetFPS(60); + + Image img=GenImageColor(640,480,BLANK); + + double r = 0; + while(!WindowShouldClose()) { + //update datas + r += 0.02; + if (r > PI * 2) r -= PI * 2; + + //update image (in CPU) + ImageClearBackground(&img,BLANK); + paintstar(&img,320,240,200,r); + + //Drawing in GPU + Texture texture = LoadTextureFromImage(img); + BeginDrawing(); + ClearBackground(WHITE); + DrawTexture(texture,0,0,WHITE); + EndDrawing(); + UnloadTexture(texture); + } + + //Clean up + UnloadImage(img); + CloseWindow(); +} \ No newline at end of file diff --git a/windows/templates/raylib-game.ico b/windows/templates/raylib-game.ico new file mode 100644 index 0000000000000000000000000000000000000000..ad1169842500f9bca3320eb86ad088c0c12e5215 GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/windows/templates/raylib-snake.ico b/windows/templates/raylib-snake.ico new file mode 100644 index 0000000000000000000000000000000000000000..9e8ce4af533f8f63d084d4cdf39aa6b2c8e21c3c GIT binary patch literal 67646 zcmeHw2XvgrbuMMuaY=Hd^c=^rT%uU9Jl3& z!3tn279c?!DhF zb7yABl85lGsc8xR|I(5tKJ(C$zh1Ir$rC6zMJL61+FgR*7XKDoV6g=jTVSyT7F%E; zwLoO|>PMow*E|~4S@x*4WA&q!w$ew#+ln7Go+v^oeAIZn;8DZ$Lg(?jxvk_;Yv<}m zV{m`W$u*B!PnLXoA$|MDwXV@UYrkyiT>V6Nd+`(DCyJIQwXaHntZ& z5z)QsiSVxC&wO0l{SWb7(H(2TqS{txTaT~WZ8%!AH}d$JA4jy8e-z$U!gVJKx%xyN zS9RnvWoIrocI9wmXExJ!W^r9t7T0uVF7x6yxdG2LbY*Z|cRJU1XEGzs)3eohuc|$l>DuzRxucky+6wR^Ed9KptvKFtymWW;u~nB%$BX_8a?BK+ z`ApV<(wWQTpotuGRdr=Ew7n>*t{et>F=a;~Q?wT|MO!hGV=HejVJh6G>d0g2>q-HR z=PuLl(}?@?@s50^z`b%58Qv%F$_2kgU-TzqZYjF>* zXSk1Rr2^XK;vIN)SC+S4cwc9pcphD^qkHg9UDaE;5fxjeYLO^T*Y*%@bxvl798)z}N6+aZyvo6AXr0|9CV|l+KIU)I^_IeNt=@Tsq>=tbES;Wy| z7I$>@L{wX8{9JetS{3cYW>S1|9%)^S!aSy9@Bs{FyoAR(`U+Tl^{b`?=>;C)w zo4LK@6S3`U6j4XYJ*pG=kfU5KhyA4K$mHRW8IoI~zrfMk*k7>sL-utjWVez%s>QdH z&QiDKF!LKloslmW7pS%*7N|ES@0HcYpABAbJsVPC9W*v1b8S@|Q?HNZ>WUa{em0#O zTT+>EZw8M%kk3sAa^F+zO+BkUkabqSJE3{8`-bvNx^m z1w8n4I@9BOwa|f*Emi=0E_{IL4_g9lL3%^cl}C0hSD=t?F|-x&@S}xX^+GE9?nV>; zPNjjbs5G*b*gjLO=TBD|*fW*k{HZD=IWf)B;;kb`kN>|h)VI}p!h`xAKZ zp;#8SKb~t^Qn;Zx{io_Z$*rb6>9P8KsegX2aR6}_OVsf-KMUiq#C{3y2=lVh9tBL*UI;w^KSkI(3*MW+mey!laHWB* zs0?S%R2kVa@Wb*76I+UH$d*W^+8@W12V$8TTP>A+@ht2Rl{glP^Acagiu0x7@DI^3oso=fZ}R z{0CvLinf7FkS&Tf(-2R<_aK`y#h8m^$~1og_$p}H1ib|;XJ4+oXK{_ zLgwSSpf$<=zC^A74=8X>LC3%d*@0LddN2w&5zFNJ61cu4`S;ob$%i#9iGOmp_#om) zNtO9{vG}e)^!kHK|G@Z%{7Ui})QB^v-^}69Y>48|RFd4AK>u)2R#pHD>Wy60k^nl# zGvWgU=r7+N&*Y#z6&WzWe;>zmjw|=YbJMQmcMW?}jCaZd))OU_A)N)kCyduTpmx2$ zyu0}A?be>{gR z-D={n10ermOLhTYR%_t0y|F}d;6Jcnn#}vl|KvWf0d^x>`CK&DwkGnpmYkOi`%@mi z6+W=GmHchgku@L6Q9nZ$d^_@E?$-Bv_3UhI`El1D0{gu-0>vT8UZ5Db>PR+U+GOR+ zyz~#LwD6@>2EKf&S>Qj}|AEjS@((?cD0~Jv?$NgDMJWlOXOph>{^t887Oh@?jgx4gmL_;aw zMLxcS3sjFl>_-=O!UM*(qECb$E&2t%1$3v_>->)AkzGPOidg<+ zp*ZC9Lf0t+DAe~jz3A|4iepou{vdi6=qUA7(H8gINg-Y!-Xfn${bDAgc)&{dg|G)1 zVghXWCJWj9H`V>K*#_h*#_lip7yZ7JKe`zYM4nikuZRDN?;(8`kj|rT_whb${f}>T z|5ooOd7?f$#N0$IQiXUV(Z;Vn(zmpe4TJMOnIoFv9DSp7UTj4SM~nU_6zn6W2N|G# zB6<(eh_FEPEsK4M_X)Z8e;?t%O%Mt|ha>{CHo$)1Cs{X!yF;U3LPsZ9A=8rK{_-ym#tdI#wZJ$OV<{XoP|gp&c{KYibg-$?pO z*n|?FoycR)Y>7ZzP|ufF7!WJc^N?pFZ=mZ;yf72}Nf#hqz;(^ZS8hgsOIzXFs_wwz zcwV^?*yr1)t)Lk&jkb4ENH0pyqIUP~3%x1MD^6sw&^JJz7gEUHVX~GO7PiaELZ7v; z(5(?HWUK$y!elr%Rjf<~|4O!%%G7!3KDt*bp|~atHdrW1&~`Hm-WAD0S`cq}E{3UI zPGst%8BEzueVKuMudki_+eP$cqrK3tj5uKy@)6MfFXypu*BDq3ILzeS7#{qC9vQF(M;YF|3A8x?}<3(jC?wUt5kof zkK=m$^Vvfb?@~wweYU{K?tHH3K|aUnVy-w>%H`)v8EsX)tGV)ADN~*+=E@$5EmHqF zVvB^$qOTo#7yJ6-IDS2YDGsFo3*qDJjAWtPEF84qA=^ObZ4unB_#caXT!Y^&EDT%u zRtr~vH)PT|ah`q;-fp31@lgC0wlxCRMTqNYKa8GF=dtzQ$2mG?%001M@q8NBzJdIr zHrSKxCnri3hIL!!yNImHya zH_sH^l4COOO*iRwCq_o@%Q|9xKI>=Nmc(DFgp9`m*J8MmY`*;zFH8hx0Q0a98vqy( z%OVeC?4Fzcx$kKyjvWB~ssD%iyojfX-t?U^=rLJ0a%xT&arOCCT-#s9wDz@J=Um6t z&UH-XSj&}8D%i(44T=`~T1Pooo<{x`o?`%h8_>t3JBmJ(mr_{pzG%LDr-iS0)(pB3 z%`IGpHur9co{VTEqw`XMOq;Q9=JIW3hJx#fPDFE}X#`h#X&i!M!U?gZeO!maf{7nc zg1o%tPxG1ffg89!k}t#iR{$gA2jjW^jV$m2@`aE)K=hYlKIHRH`3ypTp#6O9?W4aD z*Tl4!U7L$mzTfowlfPnYNv<>u=^=CO!O87wqpYL0{gH7qgt~r`|g`*OY)B# zmw<2^w3l!g^_Nrs#+hQK>|4V$jQy9qlXWY{g#S>~_!uy8J-`C z_j=`CY-!)WknD@!aj#-a6qBLvCUgsU6X)sqD|Z8T52r9K`hk%T!$jPd>_fs&6!If! z>#q;QK70W~+v<;IqS0*U3B2R;8Es{IK}M*RYyIbsK}8=)_79Nv=kf$6!d zznSeBp(h~!h)w$Vk?JzrKH)lKoiLn1wmHeOw=jik9ap&4b2-r-TiRD*U&y=z*MU#u zJ%zwW!hEy?@-0;_rSg?K&A?&kTF5TpdC*o9TfPH*BP~%p`1u4D2AfXPf&SDpWz2Mb z9XIt?aE+btV?C#$!L$93aSp##aJ{3F8~ZDm0r%+7lpz-sxrE4HkmGqW^u+|jE?m|U z$(Qen;LmJF40gMTuSB7`ki5&bTW7@oNh}cfLl|VGLUx6~q7Y#>nD`3dmmKz|;aD~| zl0G9JgK$8UsW$e>zZ!ZlxUG;So~qQ$MyuJ*>-Q!9iM2V?rfE$A{zDc>7f}4*U<{MB zrgPo?bQ%^m%yEjrIqf=@_&YGzZ;D&IQiv zA@iEP)m+|#Tq@uNWB~XGz4&S>3*H0#eAdjvwuAm8bGxH>*o&~c+lrX}d^z~4f`{Q* z#7p2Qt^l5((3UF(${7mw%TQ>GV_f6APU)_|HMoBO_hUifYz zXVyTU6>$Y(av?7!!>)|y!8;?t55OJh64DVq{X_I8TakD*SmGC%xAJfTH=fAB_apWPy+D4Y6l0^dmGo&iYzH~~4CGPjW+c>2PKF;y|KsSx1^o)d z|AG$?{V5(4%Yuz|WV`net=_Q#-DIw*PzX=e`p4 zS2!w|+P0pli7%j^!d^{dvb`~k_+h2cBUa!QFdtYELcEJ}?L!V1vE1{zlWN*U$3j=*aw?+aN zrgR3`ox}%{FJUEL1A5KGmC!qeHmO~td7NU4Np&e& z<9QH#)-c%8=u?`N{;{3qp%{Zh@-J+0pZ-UkM4Ur;rbOs?;P7NyQXBc&l`vP}0PKA7 z@4~u8Y!lBytekS^+mJJOI9=G)Va+j!*T4pVj+QyWE94gdj}-%JVJia5=~;fy4wQa@ zTsPY_-tQ3K{=@8-j4ayHCDIn9vJm9@G-eDDJ2B_6O+&4j?zat(aSmmfR8j1r8icf6}-o<^2%k zkA)tL=JGk{PuCmU3MagDpVR{s2UWnYBfFmDoAf7bsU3ZVXhpc7v9DzcU_IG&A}&w- z3||4`1DNvp6t--KMPQ$?4|K*oDg*8C_>z&x}2*nDWI`whaC%`6$7{k05Hx`ZlpoCfFpRSELUDiT5?!qP!eQ8o`TzR&H z{5gTYk}dDWV$h1@p70)eo`*@fZpir;`Jn>yX`Dvb3rXNKfZ_}kU$m0008R+r;K92i&GxG`Z71?Y^W>8TKZ>qd;83a4>aF`a@1X8-Bd#XDZ~c(ikj?>wqV@9J)LV z_)IoF(O*NDjeU|`+A90YL~I+j!=(K{V=0uR?_W;kE1p9hBkXJF(OGFUQ~TeH=Ki#t zPxm9nA-+>beDFdFUn%4tHUVP$LEr_%2ShB2>;>U3LLaPb#<^ozY-LY6Pd>hG;7;l8 zf4_BKMuDz1^#k*v%vt?^-}RAgC8=Q;8>OT%lkh{xSA(u2oSvjV$pjsfEv z`ul7KvLW@rGd=vMr(a6o>VDD{B-alJ{ecHE&swGiCK&C&imoEIv?ZEsKd#tpVk+=~ z@E^eo6u(pgBZ9Yu^U#(kjCIW8(QmFQ_0i*QY%TjTJ{RAd?+D~sh`)Z))V6Ab`Xn@n zU1?yu3;M%{COt^7F~9}pvE!7n9He1-)>Ps&h~PGMiq3*An2 zzgLCiLWbCc9J&s=L9`j-3rz892KtgHF5v5*l57J7bOOa6slQ3vn)P%2;jFtpmN2R% z`_qBYpRS4RE|Zx~7@@3?1$PMsPi&&(x16Z&tQs{rk{-j?J zx*7f>?1AtdDcb_2)4jY-b0SZnK34Dxiur||MtmPSpJKSg&l-FaVtu3!m=5+1`S}#j zm15h7ZJ`egF+z&_i||j8_ie!Jy$*b>+HXO-94hMC}vOr86lk~#Ysbi&a7bC zvt=~ahby)SzW~^8A{&t#pN;>y=GnNvx|ejlm1paZ6{<9CxxbL1Ur63t0$mS!+be~S zMm`YvY8p3i9rl6zR1xe&DW56qB=Q>WA->)#+`gyJMSBUofUS_5{&Kb)evwS*1LPNM zjQXu8Be4*}qQy=HdOM`>3FvWOoSs3?{q!rDU!~yhy(%>y`UK&)azi=Jfc> z#1m!1h*9vM9?aWut_1Pga_Tqn#s#GQKjLeO69}CL-XNL;N|!*dn~fJ1!u^5=ynIdm zlhy?r5wTD0n+0R4*K_C9c<yJ%)miIc)bKehNhn1Ldm3^w$4}vA_EB{_VTa z_9Mkrt(Ql{ zb%@ztcm3pZZ?oRFem{If)KBAv{zSZp@?4C)bsp%0TN<}FpLisux2{+VUjY5ML_Z0q z1He_fmfFvEkC)cserccN9KJMU28H^L;eV7Nz9#a1r2HSyQ~Hg5uf)D|5Ag)`&v*;* z4E8BDK|D5z{nx$Uzb=97Pp^L<_sA(Gih5|h`fCMZ#-t~b`Zm5ipJ;k3b%}RwDwZSW z9fVvg`nEvZ#s50AouCD6DSoK-R5G1s12+t9=HbIzm}z7yH;ruL<_kNRd3YzcjO_9i zW*Nr5RHXfp9o#&!otcKW;ohxWKe&l$2O8mj)gqo%16@!JUa9ixi7EaIgns_l_}4$s zec?Z&jlc&&hiSmGzyYr4ul;?reS`H@+I_xUo9x+=`V8V-nt<`&t0#ml2RVg&Ya9*C zIIx*T4DVo(7k9JhOM6+=rQIldCQIbSW@f$EDoP}_QI~wBg+*ONxkRNE_v4z878Ge; zT#MuAk-efs4dXe3yP0ul3)2iV02``=PN7^v&=LGW`omjD-`q{zK+nTF==t;>6^a_T z8H~P`h~By%8tl~zZhlFFv-XR@&Kmf(ezuq&uKUZ3Zy#I8JMw5;)hztN77jY|=u6E+ zcOHGQg+~#+E@B_YQ5Qisv2Ec*)2NYF9*q(^vX95%x;We$e{naDAKAqcfeQ)1g1F&b zEPiA+Pq?^;3X8-w=F2Ff&CEQyhnuh;HPXyuz!NdpM&q7{fo)9dZsZC(VFPSNfn^dd zN&7eGtGl8<1QtLaP`{bEudaN)$aSFgunaW*g~h({=L)jJX2E~bzx10|mawhhI!_ai zxU>uMEYVrWJoZ6vlxE1Z*b2TN{)hms>qa&+?cfHk9cbb@R|9;`TJ$wm^H66Mat*2x zm#)IIt9cmgQ54$pQ0%K5HC*qk<$6~gaHfHq2AjBfXbbelv&<@a)fKRiflXBd&tK^UMl4q zqMzzSCR4nc#%0Jk33)Mzq3|HYS69BA%z|D`;lZz^a@mnA7L45Upp(c=J%fBLYBZaX>N}Bl!x(g}#aLl*l<%cViA|*K@h-AOyn5f4lYY1L{|vSSXfJXi>D>m=*H+2q z3ta=PhtXd73FEoyam@hr4T*klJ|~(+@O)zR(DphSON73S5XUOyc>`PA^)9t*(-paMgXAZmzf%Q#)<8#7 zEJ+3|5z=i0IE z^wFcgH(%Jxl=gbO3-xiYVFov@7xs+woi}@r|2zHnr|5s9&J6FX`@b4zb-?*M^MMCU zj+#G>?yLKG7{+`ezA5}c6?_7b69snT0sY3K``nWiawb* zTjRT?{>tx8Z^zWj$I|l0Z673GJ;jWpFTh``X9nTt!q*XeP2p=5z(%Fc&U@Q&%e8O?l@MiMuK=XaD@r3M8%D)-09i0pu5T1D;3rRsSx@zVUF( zK+~6JYumibCxh0FdOl3K=HT()JIySf!(7qZUr$@%=V@SnOY#J4rT8x7$$&9pPw$W7 za_D?T3(bF;2tQBAnHax`d?b;ZHW}L``KLCe^WY20U6b^wu<3*@qVsf44V%*9s5>8S zul~wxboW1BGGSX$GVb|V+JuXxU$gVntH&@FU<-UsiWA^Hf|de@qTNjMk{%qB#{c`ME4wiMzh0+h5b_nmSLfi=7h`I<} zKwID+`NKEVcNYCL{W=|D86nVtF|G}*)9bMij`fb3PsiFfz9jF5-Gufrz{W4EPFT0LBtS&(ru@4aV6iv4#BJK!3C$^`{DZ zAcXYH0O;*p178h&tH4ifZ|#Sc{`yzcj>>>=ey(rv{Z=~WT2VCW{?Cl@L7qD?035J$ z%ca*5H?AR>m+Tk9FUnE4UHSvRLf}hVdTV(6;HD7YyBFd%!rt&jOJDs<;kFvW0cIX- zLVV|0f&J0w-=Vm_=-YuVuw32>%mlqbO9@X2Q>8+EXVY<#uBG{9LSZi!|ipYdRx_>-HSFWA9d&DUU9LE@d1`S?qMlcohDK^Ho@eQkc;|Fp_BuJ?N~3oklTn9pY{} z*ip!vrQBKkRz>vwO+;Vq2Pv+t|7z~5ZH{m>#zr{nzkt5e`?>~K&ba&2+2gJsq+A`~ z853@vHZjQ3#%)|Tuo<{dxv@9Kb*9@d{>T3NgmsuJjr15|T@4?=2DojTWj@h#jQJa1NA%6AG0&WzHVo*eJx7)&QNSs164as!;PCv=WD{E9F0%T^qfD$ zxzY(weCmXoWnOi&ROo^9u|bx4wH@{fYyt9r0<`z1Uk4kQY+;cbpoLC}aW*Yz8{iK? zoBQ$3{0Yw=6ObzGv|rx84HfS1%ZH#s+?u4h%>~j4*xt0^&pc@Jlw6ze04sW%|>cBe4H~ z|7+m)tb@+0*>&qRTfF0bwZPhm;U6S}{%LR7c^dq}CLl7_h+XYWU&(`j*A_+H8;zduwgEtXWf) z2D)!#a?l?!At^3=i}V+KfqXTUt#Xn6w?~@$a#zuWXC369JSBH~(e$Npy22Z({|9gSJ{d~HaVbk)T{f1ZkdflTaYOn7+ml~c$W zLtZlC`81cP5Bq658|L3|9=b!_U%TLP!*8o07wAp-S3Q3V-2aeb0b~beVVenGF!P!X zIm??UrVYJ+>-t~91LV&*8k!eq(>yTM&YW<+4f?Yr&_9PTV8R0&u%nNg@&t(Xw}Jg4 zhPWOvz)h|PrXd&Thn7ru-X{Am;o1Pp!xs9VXQFQ~@p9W_UhD1PKlO`SY)y;wpXYqB zeqvD2KMwTIN1tHEH76H#;8-8%Uro6Ix269{cNqH{7U@6F>Ax2Ar}&ScKjjJn|Ir`7 zvJe~4xeyDQV~osFEW8$M~MOQsv%e*$g z3%&6lkrOm_foHtcFJi$-SK1Npnd%F^75t}h4F+57qWsTe7J%RXwS;RfUOXn@Kja^I zfnNGw8Rn_u-H89)9{n+fibuE?@qZqZf63~rgDL3u;{}j^ivLW}ANYS|Ks|De|`|B7>68v1;)5%;6`Kk$E2|7VU4qfh80Vt}_9|D(8}t9&v3KaZKL@OwkO zndI}K4;Vfm@<4p}Z)2IG$O*dx{6}m6bH-II(tn=Pzwp}Nr&1@J7pU(Cwm-+105AQA zcslxjApbmRlKZZgv?&*4wQAqFnzH%|#sUfKM;<7! zpT-8IU2|gVf&L$631hFo_xFu+y@?(`oQTG@VB8wUK46R^=0MTgYZmiA<|%g+!uHD{ zdPDXp2Z((C3>p`N_&>Jr|1MyTyXOP$|Ha${(DyWc6nO*S8J)B0mu8G{nWvxsz*nni z%-xa-o1d_s=ufsE<$g@kAMro)a0})A1r-0odOM&$)=9*Av|%(ysH18z|92j9*{X5Z zuPNt?aDQs+k?3B;@u`zBlE3Ok%zl|7k2J<^N_(^h1toXzmKkMdX`T z{KoOX{yE>6-;RYN=Cj;W&XXM*Uz?{*@IY3p=-S|4thqXPBpq^1w?qWNG{6qKS8aFo&?q>>`W0uByz?Tom{ztBO*x+i+ zQ(pHA%z5&uyZs#t;d$w24t=7^F*J}rIwnTQ6UE>NHdIoWt77XWub&^u80)b^hdcy3aH}(|x)*Rhwwd~b8kh{v4+TQ3fMAHnT57TiI_F1DJE^Gwm+$K=>Xx$VFriswx$(|teE|JUq@`R&AO7TFVw$^8&BskO&it% zcr}$jgZ0#(ZjEP#mrHm??;gHp;uNd+Usrh1PsVx1_b!3{=zESKOGDiooHqao88}{(%p#g67xS84Q!dfg2%(-P_>hr*kGw1kH;K$RQ{d`%c z9awUXrHuk(pzozZaeiq(4Ss$a^iVpD`vmVLjyIycEr~C~+5obaG#=aD#EUN-Wex8Q@v5JKAHIK?>~Nli@i-Wp#qxp6MH5b* z4W7tE|7<4wG@(PTI-ozum#2c5-NXf+GCs@`FMBW-yPJn}_3_Zob1d2;#rXW=d_;4a z3sA&-@$5|G{2D#GC+qK{IobEVeINeQJWLTHT@&pa zdqM|k-oG{8SedYusJ$kOxBcKt(K)mw*-5aKwTP>kAv3yjxlGxX#8w`(vZXDt%Mf-e-A=0NI6?@O{|NI^{5E*y?r{fZ7J4I^TUX>0m(;1vG!I! zP_l1wRR6WsQT;*Cg%ZsDNH|IQ^2Yho#d_o9N1@O2CyMZvM1ns3~~9{vrK-rk77N(0-gaLP^^#cA=~p>ALi}aNb@~NKA)e=&m{lo z>&11no&k6oF@IW*2J@MQ-l;q-r2BRK6;G-`O9T46LTwG`_gYQzJ!|`s4v-4T%UUiI zYw=*sP~1aBPHQ>}oh#PuVY>b`TubYJy`IWe9*E(=Em2(kTsDtst7Vyv{e1OXr+Cf3 zTwrBCxylQ^e@WzTrH*4RH_(;l^`yBRi00uAJCmR8#kek^sZn78?5TxQC9lHah8R=-E`Omh&9lB4lL5` zV4RqZgB^1XpDkq}?HPR8!Duc&n9T|nP8H zy^sibC%-?&<6yE=HeiC&i~ls&4`d%UW6EeJQ`*qSFZ2=dX<+mJ>wr__1B80YS&Xak zeWSbPPZkpG?nYhB_WCC=zYT1A@_lNso&(LFPc#SpK_k(YqX`NW-%(eDcCU?E*ZnWn@dxp+d^N`in^kd|>Gb>~_^3qPG!}^Z` z|Dg+nZ-jYpiT?hDFjHn<#bSmUS^W5ZmVN0kOWIY+o_Oj@>|0O#y(o`=>x;}>pMu|7 zpjWD~ewVa14AF@60Tr?r39k*{LDC~3kVWG;#BKH@vciiUtl;fSVoYbG`yAp0G?qge z-;ss&KjJRG3c1HR(v-7FbN`F_lHDIzu5SpgGh@C>oE@AdKcv6rEv zHj=L?{12h0#674d?w^hRw4Mik17DDyBbx+vAL9HmwuV&;jb8VnzGq2am%!qZq zvHrVQ9};V~Gac595&2VSV`_7u17PQe0sG}$87v9w$fu4TU?D|OEM~=bSY3*V)uo%+ zssue-`uOKjzQjUeLJ*%h$kOpV8c(luQe5_WeKP%6iS?m_4=1qH!GkROtut8b>2;>I z?*!i0LtlWF0`DoOD=@4V*8v;EIwq(;i|2H z$ju@8i~DcXO*1|hYvPK2-7ws%$DFPSwhiwi?)^6lkyiJr&WS_YA4_&_d0S_z<)(oq z9({QStrf^4FYe>!i`(Jb*HIn?=!bq2vfZ$Dv${JQ^P{b2YX=$mMfOCY0hWAe54XVHmSb-98EH=Xz>hD~pc(8#&>YuOTtd*F z)_KFR(DU%~0;WH(i|)t!<4@QATco}28~3Um7xHuC2e$lu+@&r5PYW5*V=a})kzG7` zWIt@fR;(AfhwBG7fJT^8AMqlr<%u;CO1SQ1CQCS9#j_mETvigpzP<7r{98*O=OLMT zR@}3bN005}g;#L@Irx{SvtR>|P3b59f|imk=udybY(Z=E-;@59*8e6wPxh#9owplo zQ$P6!&Assp5q|*RU~SL;W9qA1r2QOB8tH2KL}XvnQOcPjpUiM!6Z-L+QChKPAm|7m zQ9IZO-Al1E(8!5315af$-KheW;Mu@(#`dyo*n3&93v*F&u-0s}4fbPaCR6pKGWD54 zto<(NFZy0cmWl3nt595$)}d5l{0`MoJ+PiFA6&!Cy;bj9daLewZrU78xnO^?V6Ct; z_p{Hd>{Y)}4p0tN12ZF*69Zk4FpNTcFuVh6Zf(GtzF3D9u{>S>YOXq&&(vM{+;XOj zN1a>8qRy=5;ob1%I@6e;JDKZGCUW`7Y+6TH$R@2%EMfUf^6!Tcet0qIzjs%d{D5MvIa|O~r*pZYCyOhfBNRQ^TnWEk*-L9O zh%t7+b;9$R={%jTK6~+I^vAe8vQPN3Vf1Ii-!z}Ebr@~64^*H2-Q+LW$)8DdZmdW- z-}G;WK42<*KEuc+7C~!>LNAcNXvO;S;TLx^&Cmw;i-fz9U#1fI0+QcIHX{|HH}$zw z44Afp{y2BH@Lz{#>7kcYwwm9Wd+T4;+p8AbTJCp~es}9x5zfX(t@g%btnd0`ZGR2c zR)C){xEc20ZrF*fJmNwtkAYr@8Qz1w*zG*rvl0CYh|$4@SHb6}HKL_lO!PH@?ig!< z_&-dThbq}?Qu-^hrrI)JE}g6=&j4VTi?F;oT(PT zeE6RVw>K;`*lON{eZZF?XG}ZTBxoLiHHCo(JZ_kZw8nHK#$ZJbZf7RXM$o?&wgh}g z-~#AITcQ7n_FlTrN`JbZ`s>M$qj?%=y>Sge6OrxwIYr!Y2#)o1(Thrrun_jf^*1xZ&G1s6^*gzEz9jxc7p^eNqycPXRI}lIW%@J3G zAGw=b5fegTx*_0#qyuh{e}NMeHzvG5e~$__Js(dsagK&Mv!mt- zle6|uAGEgoxP7l-pzg2CLycP9K(!Wq!dlQ@ix|IF?OCtY4OMHc!&|h;qr0_H7dCzV zH7aElgv#CPIDakylO@3_f({Frn?+)byv zkMv!>Rj>yLTUBmUPv#NV5C{Nc3YkER{}ZrU+>0rikAHj9u|GWoOH93f$z%B4pPu5_J#~RN_IshkQd7Uv^SK`d zB@UXpVfwMeqf@_2EIG$Fp7~@$~k+?sz&qrXNqI=M?=V z0!=?&GRYtOJ#gj}e+gE>uRi{}@mTyg^*h}v{vMOwM65gGu}u0MEg}6)KW?1%`^}D} z%O@q&$1cA2Pe1lGr?0+}I89-c@7SkPB=N&bnxyJJ=6xTD68*`1$M1}}@V$Nfe_e&_+ICbnN%+g7`(eHMg`_S)ge)rw5`~Lx~xkQEl literal 0 HcmV?d00001 diff --git a/windows/templates/raylib-tetris.ico b/windows/templates/raylib-tetris.ico new file mode 100644 index 0000000000000000000000000000000000000000..f026b7506408642e8baf0c6fe93d54b7571aa195 GIT binary patch literal 67646 zcmeI5&yQ3^5Xav_Hmt{KX~&yg>qz3~IuW3m1QcUHJpJ zd0G#8)+50SG7%GvC+?c)T|F3MP=nG|%}&2JRsF^tqSgJ_{x<3Dt)7{#?)ucX-kS*n zMKMBumX-?oxxLsqHd0I$MX{4QP4Q%Ro_{Uqv6?nbb6-%uL*1cg5d&t;%$fa7FwcT{ zowlL-ylWn6e%}1+Y69jm&x!Wecb#>wyXUa>$?GqCa3jd?$M?3(&+E^|zVz9bPrvVO zz5S_q*M0}tey^5eoo`Ejer@ny{a)9{%5nt%iUah&5(~?G^J_!@Ro>NUkmr1?EXO+E zmj3+O;1B*f_i+CwbHZ!Ia?}iB)g9%L!GGho|4W;sIt zl65K$sr-UJ`0Lz5{g*jmS%3Z7ngQGXG0PG9m#kB9NaYv&!C&Vd>c7kh%lhlr)(qJ8 zk6Dh;zhs??Ln^=E5B@s$Q2%94Sk_;^wr0S#f6Q`({w3>F98&oOfAH72hx#vb!m|GQ zwKW5_{bQCR^e`VKfo!lP9xAxn!X~?Rz=(K_XvybupYxcpu zwEx84|I7+L9Txm${)0dCpHmJ%|Ioj<2IKmlll*c0C))k_pA~#MEb2e__ve52JsIBr zWm5*Af9N0juW}$8;r9*-{a5T+2e~!y2Y=N6DhHr{eEyqL4xs*5+Q;>uVu8Re*%t@Qi#a%e%?on2L8>>_Za+lk&`Cr4|}P2#Nf|9t|A8pYv9=}mz;GU z5PxP9qm7c2Gt@6pUyR&;Ab&#hiSPf!UU+YBJ^#0P*D>hXG_3j7p%aRjC;tAo*bDCs z{7rKZ{HeZZ4fJf&z&B)Z@CSd9|ET}v^{^olHQfgE5B)>`>K>RB$1%yFLI2P{^bh@) zIe_~=-2cV+_b2G$TISrp{f^InOm9PQ{m1oR=n(b4tV^cCYslizKlBg%*WZgYM53nK zfc~L>=pXtoa{%{$xc|fZ|85SLUU(a_IIjP={+G3%aB_?-=-OHY-cLKH>#-0@CU|aK_ojfO=GpxVJ&+CxCSZ$dcH6T z_x~8MU6{M(M%RsZ&oa7x+%3#~7Ch(FzVF>5Do=*-8TmOe`ERAOeHZzBb@}!y?cvqB zeH`2Mx%2(C`ET4ChyDz>dYzv=@UuI<`%A~8pVQ;HgTK2I&wN#`$!o9X*Zcp!$LFT6 z)cKCdpN?Me_s+Wn0DshfkpmWb*K0!mspKB` z73`UdW@TZ6f50Kt1o)%=iyW}fyIvFePbK%juVBwyG%E`m`~wcDCcq!{U*v#=-u0T$ ze=4~Leg*qFE*Z>qf~e#(0seW{|2rAzd$k>;tAN)Gs==Iv>LzX`1ac;1C k0o&FMN4$8j+r_^4v)%gdHZvdLwYbrG-L_)EUMunV2VD1tj{pDw literal 0 HcmV?d00001 diff --git a/windows/templates/raylib.template b/windows/templates/raylib.template index 0e59d296..5b4c3408 100644 --- a/windows/templates/raylib.template +++ b/windows/templates/raylib.template @@ -2,9 +2,9 @@ ver=2 Name=raylib Name[zh_CN]=raylib -Icon=raylib.ico -Description=A simple program using raylib ( https://raylib.com ) -Description[zh_CN]=简单的raylib绘图程序 ( https://raylib.com ) +Icon=raylib-game.ico +Description=A simple interactive animation using raylib ( https://raylib.com ) +Description[zh_CN]=简单的raylib交互动画 ( https://raylib.com ) Category=Multimedia Category[zh_CN]=多媒体 diff --git a/windows/templates/raylib_snake.template b/windows/templates/raylib_snake.template new file mode 100644 index 00000000..57943f7e --- /dev/null +++ b/windows/templates/raylib_snake.template @@ -0,0 +1,20 @@ +[Template] +ver=2 +Name=snake +Name[zh_CN]=吞食蛇 +Icon=raylib-snake.ico +Description=snake game using raylib ( https://raylib.com ) +Description[zh_CN]=经典的吞食蛇游戏(基于raylib) ( https://raylib.com ) +Category=Game +Category[zh_CN]=游戏 + +[Unit0] +CName=main.c +C=raylib_snake_c.txt + +[Project] +UnitCount=1 +Type=1 +IsCpp=0 +linker=-lraylib -lopengl32 -lgdi32 -lwinmm + diff --git a/windows/templates/raylib_snake_c.txt b/windows/templates/raylib_snake_c.txt new file mode 100644 index 00000000..62eace4d --- /dev/null +++ b/windows/templates/raylib_snake_c.txt @@ -0,0 +1,286 @@ +/******************************************************************************************* +* +* raylib - classic game: snake +* +* Sample game developed by Ian Eito, Albert Martos and Ramon Santamaria +* +* This game has been created using raylib v1.3 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#if defined(PLATFORM_WEB) + #include +#endif + +//---------------------------------------------------------------------------------- +// Some Defines +//---------------------------------------------------------------------------------- +#define SNAKE_LENGTH 256 +#define SQUARE_SIZE 31 + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef struct Snake { + Vector2 position; + Vector2 size; + Vector2 speed; + Color color; +} Snake; + +typedef struct Food { + Vector2 position; + Vector2 size; + bool active; + Color color; +} Food; + +//------------------------------------------------------------------------------------ +// Global Variables Declaration +//------------------------------------------------------------------------------------ +static const int screenWidth = 800; +static const int screenHeight = 450; + +static int framesCounter = 0; +static bool gameOver = false; +static bool pause = false; + +static Food fruit = { 0 }; +static Snake snake[SNAKE_LENGTH] = { 0 }; +static Vector2 snakePosition[SNAKE_LENGTH] = { 0 }; +static bool allowMove = false; +static Vector2 offset = { 0 }; +static int counterTail = 0; + +//------------------------------------------------------------------------------------ +// Module Functions Declaration (local) +//------------------------------------------------------------------------------------ +static void InitGame(void); // Initialize game +static void UpdateGame(void); // Update game (one frame) +static void DrawGame(void); // Draw game (one frame) +static void UnloadGame(void); // Unload game +static void UpdateDrawFrame(void); // Update and Draw (one frame) + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization (Note windowTitle is unused on Android) + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "classic game: snake"); + + InitGame(); + +#if defined(PLATFORM_WEB) + emscripten_set_main_loop(UpdateDrawFrame, 60, 1); +#else + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update and Draw + //---------------------------------------------------------------------------------- + UpdateDrawFrame(); + //---------------------------------------------------------------------------------- + } +#endif + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadGame(); // Unload loaded data (textures, sounds, models...) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//------------------------------------------------------------------------------------ +// Module Functions Definitions (local) +//------------------------------------------------------------------------------------ + +// Initialize game variables +void InitGame(void) +{ + framesCounter = 0; + gameOver = false; + pause = false; + + counterTail = 1; + allowMove = false; + + offset.x = screenWidth%SQUARE_SIZE; + offset.y = screenHeight%SQUARE_SIZE; + + for (int i = 0; i < SNAKE_LENGTH; i++) + { + snake[i].position = (Vector2){ offset.x/2, offset.y/2 }; + snake[i].size = (Vector2){ SQUARE_SIZE, SQUARE_SIZE }; + snake[i].speed = (Vector2){ SQUARE_SIZE, 0 }; + + if (i == 0) snake[i].color = DARKBLUE; + else snake[i].color = BLUE; + } + + for (int i = 0; i < SNAKE_LENGTH; i++) + { + snakePosition[i] = (Vector2){ 0.0f, 0.0f }; + } + + fruit.size = (Vector2){ SQUARE_SIZE, SQUARE_SIZE }; + fruit.color = SKYBLUE; + fruit.active = false; +} + +// Update game (one frame) +void UpdateGame(void) +{ + if (!gameOver) + { + if (IsKeyPressed('P')) pause = !pause; + + if (!pause) + { + // Player control + if (IsKeyPressed(KEY_RIGHT) && (snake[0].speed.x == 0) && allowMove) + { + snake[0].speed = (Vector2){ SQUARE_SIZE, 0 }; + allowMove = false; + } + if (IsKeyPressed(KEY_LEFT) && (snake[0].speed.x == 0) && allowMove) + { + snake[0].speed = (Vector2){ -SQUARE_SIZE, 0 }; + allowMove = false; + } + if (IsKeyPressed(KEY_UP) && (snake[0].speed.y == 0) && allowMove) + { + snake[0].speed = (Vector2){ 0, -SQUARE_SIZE }; + allowMove = false; + } + if (IsKeyPressed(KEY_DOWN) && (snake[0].speed.y == 0) && allowMove) + { + snake[0].speed = (Vector2){ 0, SQUARE_SIZE }; + allowMove = false; + } + + // Snake movement + for (int i = 0; i < counterTail; i++) snakePosition[i] = snake[i].position; + + if ((framesCounter%5) == 0) + { + for (int i = 0; i < counterTail; i++) + { + if (i == 0) + { + snake[0].position.x += snake[0].speed.x; + snake[0].position.y += snake[0].speed.y; + allowMove = true; + } + else snake[i].position = snakePosition[i-1]; + } + } + + // Wall behaviour + if (((snake[0].position.x) > (screenWidth - offset.x)) || + ((snake[0].position.y) > (screenHeight - offset.y)) || + (snake[0].position.x < 0) || (snake[0].position.y < 0)) + { + gameOver = true; + } + + // Collision with yourself + for (int i = 1; i < counterTail; i++) + { + if ((snake[0].position.x == snake[i].position.x) && (snake[0].position.y == snake[i].position.y)) gameOver = true; + } + + // Fruit position calculation + if (!fruit.active) + { + fruit.active = true; + fruit.position = (Vector2){ GetRandomValue(0, (screenWidth/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.x/2, GetRandomValue(0, (screenHeight/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.y/2 }; + + for (int i = 0; i < counterTail; i++) + { + while ((fruit.position.x == snake[i].position.x) && (fruit.position.y == snake[i].position.y)) + { + fruit.position = (Vector2){ GetRandomValue(0, (screenWidth/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.x/2, GetRandomValue(0, (screenHeight/SQUARE_SIZE) - 1)*SQUARE_SIZE + offset.y/2 }; + i = 0; + } + } + } + + // Collision + if ((snake[0].position.x < (fruit.position.x + fruit.size.x) && (snake[0].position.x + snake[0].size.x) > fruit.position.x) && + (snake[0].position.y < (fruit.position.y + fruit.size.y) && (snake[0].position.y + snake[0].size.y) > fruit.position.y)) + { + snake[counterTail].position = snakePosition[counterTail - 1]; + counterTail += 1; + fruit.active = false; + } + + framesCounter++; + } + } + else + { + if (IsKeyPressed(KEY_ENTER)) + { + InitGame(); + gameOver = false; + } + } +} + +// Draw game (one frame) +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (!gameOver) + { + // Draw grid lines + for (int i = 0; i < screenWidth/SQUARE_SIZE + 1; i++) + { + DrawLineV((Vector2){SQUARE_SIZE*i + offset.x/2, offset.y/2}, (Vector2){SQUARE_SIZE*i + offset.x/2, screenHeight - offset.y/2}, LIGHTGRAY); + } + + for (int i = 0; i < screenHeight/SQUARE_SIZE + 1; i++) + { + DrawLineV((Vector2){offset.x/2, SQUARE_SIZE*i + offset.y/2}, (Vector2){screenWidth - offset.x/2, SQUARE_SIZE*i + offset.y/2}, LIGHTGRAY); + } + + // Draw snake + for (int i = 0; i < counterTail; i++) DrawRectangleV(snake[i].position, snake[i].size, snake[i].color); + + // Draw fruit to pick + DrawRectangleV(fruit.position, fruit.size, fruit.color); + + if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY); + } + else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY); + + EndDrawing(); +} + +// Unload game variables +void UnloadGame(void) +{ + // TODO: Unload all dynamic loaded data (textures, sounds, models...) +} + +// Update and Draw (one frame) +void UpdateDrawFrame(void) +{ + UpdateGame(); + DrawGame(); +} \ No newline at end of file diff --git a/windows/templates/raylib_tetris.template b/windows/templates/raylib_tetris.template new file mode 100644 index 00000000..dccb9cd9 --- /dev/null +++ b/windows/templates/raylib_tetris.template @@ -0,0 +1,20 @@ +[Template] +ver=2 +Name=Tetris +Name[zh_CN]=俄罗斯方块 +Icon=raylib-tetris.ico +Description=Tetris game using raylib ( https://raylib.com ) +Description[zh_CN]=经典的俄罗斯方块游戏(基于raylib) ( https://raylib.com ) +Category=Game +Category[zh_CN]=游戏 + +[Unit0] +CName=main.c +C=raylib_tetris_c.txt + +[Project] +UnitCount=1 +Type=1 +IsCpp=0 +linker=-lraylib -lopengl32 -lgdi32 -lwinmm + diff --git a/windows/templates/raylib_tetris_c.txt b/windows/templates/raylib_tetris_c.txt new file mode 100644 index 00000000..08f37557 --- /dev/null +++ b/windows/templates/raylib_tetris_c.txt @@ -0,0 +1,791 @@ +/******************************************************************************************* +* +* raylib - classic game: tetris +* +* Sample game developed by Marc Palau and Ramon Santamaria +* +* This game has been created using raylib v1.3 (www.raylib.com) +* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details) +* +* Copyright (c) 2015 Ramon Santamaria (@raysan5) +* +********************************************************************************************/ + +#include "raylib.h" + +#include +#include +#include +#include + +#if defined(PLATFORM_WEB) + #include +#endif + +//---------------------------------------------------------------------------------- +// Some Defines +//---------------------------------------------------------------------------------- +#define SQUARE_SIZE 20 + +#define GRID_HORIZONTAL_SIZE 12 +#define GRID_VERTICAL_SIZE 20 + +#define LATERAL_SPEED 10 +#define TURNING_SPEED 12 +#define FAST_FALL_AWAIT_COUNTER 30 + +#define FADING_TIME 33 + +//---------------------------------------------------------------------------------- +// Types and Structures Definition +//---------------------------------------------------------------------------------- +typedef enum GridSquare { EMPTY, MOVING, FULL, BLOCK, FADING } GridSquare; + +//------------------------------------------------------------------------------------ +// Global Variables Declaration +//------------------------------------------------------------------------------------ +static const int screenWidth = 800; +static const int screenHeight = 450; + +static bool gameOver = false; +static bool pause = false; + +// Matrices +static GridSquare grid [GRID_HORIZONTAL_SIZE][GRID_VERTICAL_SIZE]; +static GridSquare piece [4][4]; +static GridSquare incomingPiece [4][4]; + +// Theese variables keep track of the active piece position +static int piecePositionX = 0; +static int piecePositionY = 0; + +// Game parameters +static Color fadingColor; +//static int fallingSpeed; // In frames + +static bool beginPlay = true; // This var is only true at the begining of the game, used for the first matrix creations +static bool pieceActive = false; +static bool detection = false; +static bool lineToDelete = false; + +// Statistics +static int level = 1; +static int lines = 0; + +// Counters +static int gravityMovementCounter = 0; +static int lateralMovementCounter = 0; +static int turnMovementCounter = 0; +static int fastFallMovementCounter = 0; + +static int fadeLineCounter = 0; + +// Based on level +static int gravitySpeed = 30; + +//------------------------------------------------------------------------------------ +// Module Functions Declaration (local) +//------------------------------------------------------------------------------------ +static void InitGame(void); // Initialize game +static void UpdateGame(void); // Update game (one frame) +static void DrawGame(void); // Draw game (one frame) +static void UnloadGame(void); // Unload game +static void UpdateDrawFrame(void); // Update and Draw (one frame) + +// Additional module functions +static bool Createpiece(); +static void GetRandompiece(); +static void ResolveFallingMovement(bool *detection, bool *pieceActive); +static bool ResolveLateralMovement(); +static bool ResolveTurnMovement(); +static void CheckDetection(bool *detection); +static void CheckCompletion(bool *lineToDelete); +static void DeleteCompleteLines(); + +//------------------------------------------------------------------------------------ +// Program main entry point +//------------------------------------------------------------------------------------ +int main(void) +{ + // Initialization (Note windowTitle is unused on Android) + //--------------------------------------------------------- + InitWindow(screenWidth, screenHeight, "classic game: tetris"); + + InitGame(); + +#if defined(PLATFORM_WEB) + emscripten_set_main_loop(UpdateDrawFrame, 60, 1); +#else + SetTargetFPS(60); + //-------------------------------------------------------------------------------------- + + // Main game loop + while (!WindowShouldClose()) // Detect window close button or ESC key + { + // Update and Draw + //---------------------------------------------------------------------------------- + UpdateDrawFrame(); + //---------------------------------------------------------------------------------- + } +#endif + // De-Initialization + //-------------------------------------------------------------------------------------- + UnloadGame(); // Unload loaded data (textures, sounds, models...) + + CloseWindow(); // Close window and OpenGL context + //-------------------------------------------------------------------------------------- + + return 0; +} + +//-------------------------------------------------------------------------------------- +// Game Module Functions Definition +//-------------------------------------------------------------------------------------- + +// Initialize game variables +void InitGame(void) +{ + // Initialize game statistics + level = 1; + lines = 0; + + fadingColor = GRAY; + + piecePositionX = 0; + piecePositionY = 0; + + pause = false; + + beginPlay = true; + pieceActive = false; + detection = false; + lineToDelete = false; + + // Counters + gravityMovementCounter = 0; + lateralMovementCounter = 0; + turnMovementCounter = 0; + fastFallMovementCounter = 0; + + fadeLineCounter = 0; + gravitySpeed = 30; + + // Initialize grid matrices + for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++) + { + for (int j = 0; j < GRID_VERTICAL_SIZE; j++) + { + if ((j == GRID_VERTICAL_SIZE - 1) || (i == 0) || (i == GRID_HORIZONTAL_SIZE - 1)) grid[i][j] = BLOCK; + else grid[i][j] = EMPTY; + } + } + + // Initialize incoming piece matrices + for (int i = 0; i < 4; i++) + { + for (int j = 0; j< 4; j++) + { + incomingPiece[i][j] = EMPTY; + } + } +} + +// Update game (one frame) +void UpdateGame(void) +{ + if (!gameOver) + { + if (IsKeyPressed('P')) pause = !pause; + + if (!pause) + { + if (!lineToDelete) + { + if (!pieceActive) + { + // Get another piece + pieceActive = Createpiece(); + + // We leave a little time before starting the fast falling down + fastFallMovementCounter = 0; + } + else // Piece falling + { + // Counters update + fastFallMovementCounter++; + gravityMovementCounter++; + lateralMovementCounter++; + turnMovementCounter++; + + // We make sure to move if we've pressed the key this frame + if (IsKeyPressed(KEY_LEFT) || IsKeyPressed(KEY_RIGHT)) lateralMovementCounter = LATERAL_SPEED; + if (IsKeyPressed(KEY_UP)) turnMovementCounter = TURNING_SPEED; + + // Fall down + if (IsKeyDown(KEY_DOWN) && (fastFallMovementCounter >= FAST_FALL_AWAIT_COUNTER)) + { + // We make sure the piece is going to fall this frame + gravityMovementCounter += gravitySpeed; + } + + if (gravityMovementCounter >= gravitySpeed) + { + // Basic falling movement + CheckDetection(&detection); + + // Check if the piece has collided with another piece or with the boundings + ResolveFallingMovement(&detection, &pieceActive); + + // Check if we fullfilled a line and if so, erase the line and pull down the the lines above + CheckCompletion(&lineToDelete); + + gravityMovementCounter = 0; + } + + // Move laterally at player's will + if (lateralMovementCounter >= LATERAL_SPEED) + { + // Update the lateral movement and if success, reset the lateral counter + if (!ResolveLateralMovement()) lateralMovementCounter = 0; + } + + // Turn the piece at player's will + if (turnMovementCounter >= TURNING_SPEED) + { + // Update the turning movement and reset the turning counter + if (ResolveTurnMovement()) turnMovementCounter = 0; + } + } + + // Game over logic + for (int j = 0; j < 2; j++) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == FULL) + { + gameOver = true; + } + } + } + } + else + { + // Animation when deleting lines + fadeLineCounter++; + + if (fadeLineCounter%8 < 4) fadingColor = MAROON; + else fadingColor = GRAY; + + if (fadeLineCounter >= FADING_TIME) + { + DeleteCompleteLines(); + fadeLineCounter = 0; + lineToDelete = false; + + lines++; + } + } + } + } + else + { + if (IsKeyPressed(KEY_ENTER)) + { + InitGame(); + gameOver = false; + } + } +} + +// Draw game (one frame) +void DrawGame(void) +{ + BeginDrawing(); + + ClearBackground(RAYWHITE); + + if (!gameOver) + { + // Draw gameplay area + Vector2 offset; + offset.x = screenWidth/2 - (GRID_HORIZONTAL_SIZE*SQUARE_SIZE/2) - 50; + offset.y = screenHeight/2 - ((GRID_VERTICAL_SIZE - 1)*SQUARE_SIZE/2) + SQUARE_SIZE*2; + + offset.y -= 50; // NOTE: Harcoded position! + + int controller = offset.x; + + for (int j = 0; j < GRID_VERTICAL_SIZE; j++) + { + for (int i = 0; i < GRID_HORIZONTAL_SIZE; i++) + { + // Draw each square of the grid + if (grid[i][j] == EMPTY) + { + DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY ); + DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == FULL) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == MOVING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, DARKGRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == BLOCK) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, LIGHTGRAY); + offset.x += SQUARE_SIZE; + } + else if (grid[i][j] == FADING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, fadingColor); + offset.x += SQUARE_SIZE; + } + } + + offset.x = controller; + offset.y += SQUARE_SIZE; + } + + // Draw incoming piece (hardcoded) + offset.x = 500; + offset.y = 45; + + int controler = offset.x; + + for (int j = 0; j < 4; j++) + { + for (int i = 0; i < 4; i++) + { + if (incomingPiece[i][j] == EMPTY) + { + DrawLine(offset.x, offset.y, offset.x + SQUARE_SIZE, offset.y, LIGHTGRAY ); + DrawLine(offset.x, offset.y, offset.x, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x + SQUARE_SIZE, offset.y, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + DrawLine(offset.x, offset.y + SQUARE_SIZE, offset.x + SQUARE_SIZE, offset.y + SQUARE_SIZE, LIGHTGRAY ); + offset.x += SQUARE_SIZE; + } + else if (incomingPiece[i][j] == MOVING) + { + DrawRectangle(offset.x, offset.y, SQUARE_SIZE, SQUARE_SIZE, GRAY); + offset.x += SQUARE_SIZE; + } + } + + offset.x = controler; + offset.y += SQUARE_SIZE; + } + + DrawText("INCOMING:", offset.x, offset.y - 100, 10, GRAY); + DrawText(TextFormat("LINES: %04i", lines), offset.x, offset.y + 20, 10, GRAY); + + if (pause) DrawText("GAME PAUSED", screenWidth/2 - MeasureText("GAME PAUSED", 40)/2, screenHeight/2 - 40, 40, GRAY); + } + else DrawText("PRESS [ENTER] TO PLAY AGAIN", GetScreenWidth()/2 - MeasureText("PRESS [ENTER] TO PLAY AGAIN", 20)/2, GetScreenHeight()/2 - 50, 20, GRAY); + + EndDrawing(); +} + +// Unload game variables +void UnloadGame(void) +{ + // TODO: Unload all dynamic loaded data (textures, sounds, models...) +} + +// Update and Draw (one frame) +void UpdateDrawFrame(void) +{ + UpdateGame(); + DrawGame(); +} + +//-------------------------------------------------------------------------------------- +// Additional module functions +//-------------------------------------------------------------------------------------- +static bool Createpiece() +{ + piecePositionX = (int)((GRID_HORIZONTAL_SIZE - 4)/2); + piecePositionY = 0; + + // If the game is starting and you are going to create the first piece, we create an extra one + if (beginPlay) + { + GetRandompiece(); + beginPlay = false; + } + + // We assign the incoming piece to the actual piece + for (int i = 0; i < 4; i++) + { + for (int j = 0; j< 4; j++) + { + piece[i][j] = incomingPiece[i][j]; + } + } + + // We assign a random piece to the incoming one + GetRandompiece(); + + // Assign the piece to the grid + for (int i = piecePositionX; i < piecePositionX + 4; i++) + { + for (int j = 0; j < 4; j++) + { + if (piece[i - (int)piecePositionX][j] == MOVING) grid[i][j] = MOVING; + } + } + + return true; +} + +static void GetRandompiece() +{ + int random = GetRandomValue(0, 6); + + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + incomingPiece[i][j] = EMPTY; + } + } + + switch (random) + { + case 0: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break; //Cube + case 1: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; } break; //L + case 2: { incomingPiece[1][2] = MOVING; incomingPiece[2][0] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; } break; //L inversa + case 3: { incomingPiece[0][1] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break; //Recta + case 4: { incomingPiece[1][0] = MOVING; incomingPiece[1][1] = MOVING; incomingPiece[1][2] = MOVING; incomingPiece[2][1] = MOVING; } break; //Creu tallada + case 5: { incomingPiece[1][1] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[3][2] = MOVING; } break; //S + case 6: { incomingPiece[1][2] = MOVING; incomingPiece[2][2] = MOVING; incomingPiece[2][1] = MOVING; incomingPiece[3][1] = MOVING; } break; //S inversa + } +} + +static void ResolveFallingMovement(bool *detection, bool *pieceActive) +{ + // If we finished moving this piece, we stop it + if (*detection) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j] = FULL; + *detection = false; + *pieceActive = false; + } + } + } + } + else // We move down the piece + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j+1] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionY++; + } +} + +static bool ResolveLateralMovement() +{ + bool collision = false; + + // Piece movement + if (IsKeyDown(KEY_LEFT)) // Move left + { + // Check if is possible to move to left + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + // Check if we are touching the left wall or we have a full square at the left + if ((i-1 == 0) || (grid[i-1][j] == FULL)) collision = true; + } + } + } + + // If able, move left + if (!collision) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) // We check the matrix from left to right + { + // Move everything to the left + if (grid[i][j] == MOVING) + { + grid[i-1][j] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionX--; + } + } + else if (IsKeyDown(KEY_RIGHT)) // Move right + { + // Check if is possible to move to right + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + // Check if we are touching the right wall or we have a full square at the right + if ((i+1 == GRID_HORIZONTAL_SIZE - 1) || (grid[i+1][j] == FULL)) + { + collision = true; + + } + } + } + } + + // If able move right + if (!collision) + { + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = GRID_HORIZONTAL_SIZE - 1; i >= 1; i--) // We check the matrix from right to left + { + // Move everything to the right + if (grid[i][j] == MOVING) + { + grid[i+1][j] = MOVING; + grid[i][j] = EMPTY; + } + } + } + + piecePositionX++; + } + } + + return collision; +} + +static bool ResolveTurnMovement() +{ + // Input for turning the piece + if (IsKeyDown(KEY_UP)) + { + GridSquare aux; + bool checker = false; + + // Check all turning possibilities + if ((grid[piecePositionX + 3][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY] != EMPTY) && + (grid[piecePositionX][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY] == MOVING) && + (grid[piecePositionX][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 3][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 3] == MOVING) && + (grid[piecePositionX + 3][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 3][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 3] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 3] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 2] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 1] == MOVING) && + (grid[piecePositionX + 1][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 1][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 2][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 1] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 1] != MOVING)) checker = true; + + if ((grid[piecePositionX + 1][piecePositionY + 2] == MOVING) && + (grid[piecePositionX + 2][piecePositionY + 2] != EMPTY) && + (grid[piecePositionX + 2][piecePositionY + 2] != MOVING)) checker = true; + + if (!checker) + { + aux = piece[0][0]; + piece[0][0] = piece[3][0]; + piece[3][0] = piece[3][3]; + piece[3][3] = piece[0][3]; + piece[0][3] = aux; + + aux = piece[1][0]; + piece[1][0] = piece[3][1]; + piece[3][1] = piece[2][3]; + piece[2][3] = piece[0][2]; + piece[0][2] = aux; + + aux = piece[2][0]; + piece[2][0] = piece[3][2]; + piece[3][2] = piece[1][3]; + piece[1][3] = piece[0][1]; + piece[0][1] = aux; + + aux = piece[1][1]; + piece[1][1] = piece[2][1]; + piece[2][1] = piece[2][2]; + piece[2][2] = piece[1][2]; + piece[1][2] = aux; + } + + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if (grid[i][j] == MOVING) + { + grid[i][j] = EMPTY; + } + } + } + + for (int i = piecePositionX; i < piecePositionX + 4; i++) + { + for (int j = piecePositionY; j < piecePositionY + 4; j++) + { + if (piece[i - piecePositionX][j - piecePositionY] == MOVING) + { + grid[i][j] = MOVING; + } + } + } + + return true; + } + + return false; +} + +static void CheckDetection(bool *detection) +{ + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + if ((grid[i][j] == MOVING) && ((grid[i][j+1] == FULL) || (grid[i][j+1] == BLOCK))) *detection = true; + } + } +} + +static void CheckCompletion(bool *lineToDelete) +{ + int calculator = 0; + + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + calculator = 0; + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + // Count each square of the line + if (grid[i][j] == FULL) + { + calculator++; + } + + // Check if we completed the whole line + if (calculator == GRID_HORIZONTAL_SIZE - 2) + { + *lineToDelete = true; + calculator = 0; + // points++; + + // Mark the completed line + for (int z = 1; z < GRID_HORIZONTAL_SIZE - 1; z++) + { + grid[z][j] = FADING; + } + } + } + } +} + +static void DeleteCompleteLines() +{ + // Erase the completed line + for (int j = GRID_VERTICAL_SIZE - 2; j >= 0; j--) + { + while (grid[1][j] == FADING) + { + for (int i = 1; i < GRID_HORIZONTAL_SIZE - 1; i++) + { + grid[i][j] = EMPTY; + } + + for (int j2 = j-1; j2 >= 0; j2--) + { + for (int i2 = 1; i2 < GRID_HORIZONTAL_SIZE - 1; i2++) + { + if (grid[i2][j2] == FULL) + { + grid[i2][j2+1] = FULL; + grid[i2][j2] = EMPTY; + } + else if (grid[i2][j2] == FADING) + { + grid[i2][j2+1] = FADING; + grid[i2][j2] = EMPTY; + } + } + } + } + } +} \ No newline at end of file diff --git a/windows/templates/rdrawing.ico b/windows/templates/rdrawing.ico new file mode 100644 index 0000000000000000000000000000000000000000..054968fdc28e3b6acf7d330068db56a1df6db3df GIT binary patch literal 67646 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 +#include +#include + + +void paintstar(Image* pImage, double x, double y, double r, double a) +{ + int vx[5]; + int vy[5]; + for (int i = 0; i < 5; ++i) + { + vx[i] = (int)( -cos( PI * 4 / 5 * i + a ) * r + x ); + vy[i] = (int)( sin( PI * 4 / 5 * i + a) * r + y ); + } + ImageFillPolygonEx(pImage,vx,vy,5,LIGHTRED); + ImageDrawPolygonEx(pImage,vx,vy,5,2,DARKBROWN); +} + +int main() { + InitWindow(640,480,"rdrawing"); + SetTraceLogLevel(LOG_WARNING); + SetTargetFPS(60); + + Image img=GenImageColor(640,480,BLANK); + + double r = 0; + while(!WindowShouldClose()) { + //update datas + r += 0.02; + if (r > PI * 2) r -= PI * 2; + + //update image (in CPU) + ImageClearBackground(&img,BLANK); + paintstar(&img,320,240,200,r); + + //Drawing in GPU + Texture texture = LoadTextureFromImage(img); + BeginDrawing(); + ClearBackground(WHITE); + DrawTexture(texture,0,0,WHITE); + EndDrawing(); + UnloadTexture(texture); + } + + //Clean up + UnloadImage(img); + CloseWindow(); +} \ No newline at end of file