From f99a9d8b3528a2a871b7ade1a5492aee23401b7b Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 30 Apr 2022 19:56:42 -0400 Subject: [PATCH] Updated block system to use macros instead of hardcoding the block IDs everywhere --- src/blocks.h | 15 +++++++++++++ src/gameloop.c | 5 +++-- src/gui.c | 3 ++- src/terrain.c | 61 +++++++++++++++++++++++++++++++------------------- src/textures.c | 49 +++++++++++++++++----------------------- 5 files changed, 79 insertions(+), 54 deletions(-) create mode 100644 src/blocks.h diff --git a/src/blocks.h b/src/blocks.h new file mode 100644 index 0000000..b94d6a1 --- /dev/null +++ b/src/blocks.h @@ -0,0 +1,15 @@ +#pragma once + +#define BLOCK_AIR 0 +#define BLOCK_GRASS 1 +#define BLOCK_DIRT 2 +#define BLOCK_SAND 3 +#define BLOCK_STONE 4 +#define BLOCK_BRICKS 5 +#define BLOCK_GRAVEL 6 +#define BLOCK_WOOD 7 +#define BLOCK_LEAVES 8 +#define BLOCK_COBBLESTONE 9 + +#define BLOCK_PLAYER_HEAD 14 +#define BLOCK_PLAYER_BODY 15 diff --git a/src/gameloop.c b/src/gameloop.c index e15d27f..b3189cd 100644 --- a/src/gameloop.c +++ b/src/gameloop.c @@ -2,6 +2,7 @@ #include "gameloop.h" #include "textures.h" #include "utility.h" +#include "blocks.h" #include "menus.h" #include "data.h" #include "gui.h" @@ -257,7 +258,7 @@ int gameLoop ( ); // Can't break other players - if (blockid != 14 && blockid != 15) { + if (blockid != BLOCK_PLAYER_BODY && blockid != BLOCK_PLAYER_HEAD) { InvSlot pickedUp = { .blockid = blockid, .amount = 1, @@ -492,7 +493,7 @@ int gameLoop ( goto chunkNull; } - if (intersectedBlock > 0) { + if (intersectedBlock != BLOCK_AIR) { // I'm guessing this eldritch horror figures out what pixel of // the block we hit i6 = (int)((f34 + f36) * 16.0) & 0xF; diff --git a/src/gui.c b/src/gui.c index 7efcf0e..29c88ed 100644 --- a/src/gui.c +++ b/src/gui.c @@ -1,4 +1,5 @@ #include "gui.h" +#include "blocks.h" const int BUFFER_W = 214; const int BUFFER_H = 120; @@ -348,7 +349,7 @@ void dirtBg (SDL_Renderer *renderer) { color = textures [ (x & 0xF) + (y & 0xF) * 16 + - 2 * 256 * 3 + BLOCK_DIRT * 256 * 3 ]; SDL_SetRenderDrawColor( diff --git a/src/terrain.c b/src/terrain.c index 02d5381..a90b950 100644 --- a/src/terrain.c +++ b/src/terrain.c @@ -1,4 +1,5 @@ #include "terrain.h" +#include "blocks.h" /* World_sort * Sorts all chunks in a world by hash @@ -96,7 +97,7 @@ int World_setBlock ( ) { static int b; static Chunk *chunk; - b = World_getBlock(world, x, y, z) < 1; + b = World_getBlock(world, x, y, z) == BLOCK_AIR; if (force || b) { // If the block was air or we don't care chunk = chunkLookup(world, x, y, z); @@ -150,7 +151,7 @@ int ch_setBlock ( nmod(x, CHUNK_SIZE) + (nmod(y, CHUNK_SIZE) * CHUNK_SIZE) + (nmod(z, CHUNK_SIZE) * CHUNK_SIZE * CHUNK_SIZE) - ] > 0; + ] != BLOCK_AIR; blocks[x + (y * CHUNK_SIZE) + (z * CHUNK_SIZE * CHUNK_SIZE)] = block; return notAir; } @@ -212,10 +213,10 @@ void genStructure ( switch (type) { case 0: // tree for (int trunk = randm(2) + 4; trunk > 0; trunk --) { - World_setBlock(world, x, y --, z, 7, 1); + World_setBlock(world, x, y --, z, BLOCK_WOOD, 1); } - setCube(world, x - 2, y + 1, z - 2, 5, 2, 5, 8, 0); - setCube(world, x - 1, y - 1, z - 1, 3, 2, 3, 8, 0); + setCube(world, x - 2, y + 1, z - 2, 5, 2, 5, BLOCK_LEAVES, 0); + setCube(world, x - 1, y - 1, z - 1, 3, 2, 3, BLOCK_LEAVES, 0); break; case 1: // pyramid @@ -228,7 +229,7 @@ void genStructure ( y ++, z - step / 2, step, 1, step, - 5, 1 + BLOCK_BRICKS, 1 ); } break; @@ -272,7 +273,7 @@ int genChunk ( distMax = 0; distMaxI = 0; for (i = 0; i < CHUNKARR_SIZE; i ++) { - int dist = sqrt( + int dist = sqrt ( pow(coords.x - world->chunk[i].center.x, 2) + pow(coords.y - world->chunk[i].center.y, 2) + pow(coords.z - world->chunk[i].center.z, 2) @@ -373,7 +374,10 @@ void ch_genClassic (Block *blocks, int yOffset) { for (int z = 0; z < CHUNK_SIZE; z ++) if (y + yOffset > 32) { Block block = randm(2) == 0 ? randm(9) : 0; - if (block == 3 || block == 6) { block = 2; } + if ( + block == BLOCK_SAND || + block == BLOCK_GRAVEL + ) { block = BLOCK_DIRT; } ch_setBlock(blocks, x, y, z, block); } } @@ -410,13 +414,13 @@ void ch_genNew ( for (int y = 0; y < CHUNK_SIZE; y ++) for (int z = 0; z < CHUNK_SIZE; z ++) { if (y + yOffset > heightmap[x][z] + 4) - ch_setBlock(blocks, x, y, z, 4); + ch_setBlock(blocks, x, y, z, BLOCK_STONE); else if (y + yOffset > heightmap[x][z]) - ch_setBlock(blocks, x, y, z, 2); + ch_setBlock(blocks, x, y, z, BLOCK_DIRT); else if (y + yOffset == heightmap[x][z]) - ch_setBlock(blocks, x, y, z, 1); + ch_setBlock(blocks, x, y, z, BLOCK_GRASS); else - ch_setBlock(blocks, x, y, z, 0); + ch_setBlock(blocks, x, y, z, BLOCK_AIR); } // Generate caves @@ -450,16 +454,21 @@ void ch_genNew ( int highPoint = 64 - elevation - height; for (int y = highPoint; y < lowPoint; y ++) { - ch_setBlock(blocks, x, y, z, 0); + ch_setBlock(blocks, x, y, z, BLOCK_AIR); } // Don't have bare dirt on the bottom if (ch_getBlock(blocks, x, lowPoint, z) == 2) { // What block we place down depends on the block above - if (ch_getBlock(blocks, x, highPoint - 1, z) == 0) { - ch_setBlock(blocks, x, lowPoint, z, 1); + if ( + ch_getBlock(blocks, x, highPoint - 1, z) == + BLOCK_AIR + ) { + ch_setBlock (blocks, x, lowPoint, z, + BLOCK_GRASS); } else { - ch_setBlock(blocks, x, lowPoint, z, 6); + ch_setBlock (blocks, x, lowPoint, z, + BLOCK_GRAVEL); } } } @@ -495,9 +504,9 @@ void ch_genStone (Block *blocks, int yOffset) { for (int y = 0; y < CHUNK_SIZE; y ++) for (int z = 0; z < CHUNK_SIZE; z ++) if (y + yOffset > 32) { - ch_setBlock(blocks, x, y, z, 4); + ch_setBlock(blocks, x, y, z, BLOCK_STONE); } else { - ch_setBlock(blocks, x, y, z, 0); + ch_setBlock(blocks, x, y, z, BLOCK_AIR); } } @@ -505,9 +514,15 @@ void ch_genFlat (Block *blocks, int yOffset) { for (int x = 0; x < CHUNK_SIZE; x ++) for (int z = 0; z < CHUNK_SIZE; z ++) for (int y = 0; y < CHUNK_SIZE; y ++) { - if (y + yOffset < 32) { ch_setBlock(blocks, x, y, z, 0); } - if (y + yOffset == 32) { ch_setBlock(blocks, x, y, z, 1); } - if (y + yOffset > 32) { ch_setBlock(blocks, x, y, z, 2); } + if (y + yOffset < 32) { + ch_setBlock(blocks, x, y, z, BLOCK_AIR); + } + if (y + yOffset == 32) { + ch_setBlock(blocks, x, y, z, BLOCK_GRASS); + } + if (y + yOffset > 32) { + ch_setBlock(blocks, x, y, z, BLOCK_DIRT); + } } } @@ -520,7 +535,7 @@ void ch_genDev (Block *blocks, int xOffset, int yOffset, int zOffset) { for (int x = 0; x < CHUNK_SIZE; x ++) for (int z = 0; z < CHUNK_SIZE; z ++) { - ch_setBlock(blocks, x, 3, z, 14); - ch_setBlock(blocks, x, 4, z, 15); + ch_setBlock(blocks, x, 3, z, BLOCK_PLAYER_BODY); + ch_setBlock(blocks, x, 4, z, BLOCK_PLAYER_HEAD); } } diff --git a/src/textures.c b/src/textures.c index de93cd9..372f422 100644 --- a/src/textures.c +++ b/src/textures.c @@ -1,4 +1,5 @@ #include "textures.h" +#include "blocks.h" int textures[12288] = {0}; const u_int16_t cobbleCracks[16] = { @@ -40,42 +41,36 @@ void genTexture (int blockId) { int noiseFloor = 255; int noiseScale = 96; - // sand - if (blockId == 3) { + if (blockId == BLOCK_SAND) { baseColor = 0xd8ce9b; noiseScale = 48; } - // stone - if (blockId == 4) + if (blockId == BLOCK_STONE) baseColor = 8355711; - // gravel - if (blockId == 6) { + if (blockId == BLOCK_GRAVEL) { baseColor = 0xAAAAAA; noiseScale = 140; } - // add noise - if (blockId != 4 || randm(3) == 0) + if (blockId != BLOCK_STONE || randm(3) == 0) k = noiseFloor - randm(noiseScale); - // grass if ( - blockId == 1 && + blockId == BLOCK_GRASS && y < (x * x * (3 + x) * 81 >> 2 & 0x3) + 18 ) { baseColor = 6990400; } else if ( - blockId == 1 && + blockId == BLOCK_GRASS && y < (x * x * (3 + x) * 81 >> 2 & 0x3) + 19 ) { k = k * 2 / 3; } - // logs - if (blockId == 7) { + if (blockId == BLOCK_WOOD) { baseColor = 6771249; if ( x > 0 && x < 15 && @@ -95,21 +90,19 @@ void genTexture (int blockId) { } } - // bricks - if (blockId == 5) { + switch (blockId) { + case BLOCK_BRICKS: baseColor = 11876885; if ((x + y / 4 * 4) % 8 == 0 || y % 4 == 0) baseColor = 12365733; - } - - // cobblestone - if (blockId == 9) { + break; + + case BLOCK_COBBLESTONE: baseColor = 0x999999; k -= ((cobbleCracks[y & 0xF] >> x) & 0b1) * 128; - } - - // Character head - if (blockId == 14) { + break; + + case BLOCK_PLAYER_HEAD: k = 255; if ( dist2d(x, 8, y % 16, 8) > 6.2 || @@ -120,10 +113,9 @@ void genTexture (int blockId) { baseColor = 0xFFFFFF; k -= dist2d(x, 8, y % 16, 2) * 8; } - } - - // Character body - if (blockId == 15) { + break; + + case BLOCK_PLAYER_BODY: k = 255; if ( (dist2d(x, 8, y % 16, 16) > 12.2 || @@ -135,12 +127,13 @@ void genTexture (int blockId) { baseColor = 0xFFFFFF; k -= dist2d(x, 8, y % 16, 2) * 8; } + break; } int i2 = k; if (y >= 32) i2 /= 2; - if (blockId == 8) { + if (blockId == BLOCK_LEAVES) { baseColor = 5298487; if (randm(2) == 0) { baseColor = 0;