diff --git a/src/Client/Block.c b/src/Client/Block.c index cf40d8e12..88cac0c0f 100644 --- a/src/Client/Block.c +++ b/src/Client/Block.c @@ -5,16 +5,18 @@ void Block_Reset(Game* game) { Block_Init(); - // TODO: Make this part of TerrainAtlas2D maybe? + /* TODO: Make this part of TerrainAtlas2D maybe? */ //Block_RecalculateSpriteBB(game->TerrainAtlas.AtlasBitmap); } void Block_Init() { #define DefinedCustomBlocks_Len (Block_Count >> 5) - for (Int32 i = 0; i < DefinedCustomBlocks_Len; i++) + for (Int32 i = 0; i < DefinedCustomBlocks_Len; i++) { DefinedCustomBlocks[i] = 0; - for (Int32 block = 0; block < Block_Count; block++) + } + for (Int32 block = 0; block < Block_Count; block++) { Block_ResetProps((BlockID)block); + } Block_UpdateCullingAll(); } @@ -33,11 +35,11 @@ void Block_SetDefaultPerms() { } void Block_SetCollide(BlockID block, UInt8 collide) { - // necessary for cases where servers redefined core blocks before extended types were introduced + /* necessary for cases where servers redefined core blocks before extended types were introduced. */ collide = DefaultSet_MapOldCollide(block, collide); Block_ExtendedCollide[block] = collide; - // Reduce extended collision types to their simpler forms + /* Reduce extended collision types to their simpler forms. */ if (collide == CollideType_Ice) collide = CollideType_Solid; if (collide == CollideType_SlipperyIce) collide = CollideType_Solid; @@ -47,8 +49,9 @@ void Block_SetCollide(BlockID block, UInt8 collide) { } void Block_SetDrawType(BlockID block, UInt8 draw) { - if (draw == DrawType_Opaque && Block_Collide[block] != CollideType_Solid) + if (draw == DrawType_Opaque && Block_Collide[block] != CollideType_Solid) { draw = DrawType_Transparent; + } Block_Draw[block] = draw; Vector3 zero = Vector3_Zero, one = Vector3_One; @@ -85,7 +88,7 @@ void Block_ResetProps(BlockID block) { if (block >= Block_CpeCount) { #if USE16_BIT - // give some random texture ids + /* give some random texture ids */ Block_SetTex((block * 10 + (block % 7) + 20) % 80, Side_Top, block); Block_SetTex((block * 8 + (block & 5) + 5) % 80, Side_Bottom, block); Block_SetSide((block * 4 + (block / 4) + 4) % 80, block); @@ -117,16 +120,13 @@ String Block_DefaultName(BlockID block) { if (block >= 256) return "ID " + block; #endif if (block >= Block_CpeCount) { - String str; - String_Constant(&str, "Invalid"); - return str; + return String_FromConstant("Invalid"); } - String blockNames; - // TODO: how much performance impact here - String_Constant(&blockNames, Block_RawNames); + /* TODO: how much performance impact here. */ + String blockNames = String_FromConstant(Block_RawNames); - // Find start and end of this particular block name + /* Find start and end of this particular block name. */ Int32 start = 0; for (Int32 i = 0; i < block; i++) { start = String_IndexOf(&blockNames, ' ', start) + 1; @@ -134,8 +134,7 @@ String Block_DefaultName(BlockID block) { Int32 end = String_IndexOf(&blockNames, ' ', start); if (end == -1) end = blockNames.length; - String buffer; - String_Empty(&buffer, Block_NamePtr(block), STRING_SIZE); + String buffer = String_FromBuffer(Block_NamePtr(block), STRING_SIZE); Block_SplitUppercase(&buffer, &blockNames, start, end); return buffer; } @@ -218,8 +217,7 @@ void Block_CalcRenderBounds(BlockID block) { min.X -= 0.1f / 16.0f; max.X -= 0.1f / 16.0f; min.Z -= 0.1f / 16.0f; max.Z -= 0.1f / 16.0f; min.Y -= 1.5f / 16.0f; max.Y -= 1.5f / 16.0f; - } - else if (Block_Draw[block] == DrawType_Translucent && Block_Collide[block] != CollideType_Solid) { + } else if (Block_Draw[block] == DrawType_Translucent && Block_Collide[block] != CollideType_Solid) { min.X += 0.1f / 16.0f; max.X += 0.1f / 16.0f; min.Z += 0.1f / 16.0f; max.Z += 0.1f / 16.0f; min.Y -= 0.1f / 16.0f; max.Y -= 0.1f / 16.0f; @@ -274,8 +272,9 @@ Real32 Block_GetSpriteBB_TopY(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp) for (Int32 y = 0; y < size; y++) { UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size); for (Int32 x = 0; x < size; x++) { - if ((UInt8)(row[x] >> 24) != 0) + if ((UInt8)(row[x] >> 24) != 0) { return 1 - (float)y / size; + } } } return 0; @@ -285,8 +284,9 @@ Real32 Block_GetSpriteBB_BottomY(Int32 size, Int32 tileX, Int32 tileY, Bitmap* b for (Int32 y = size - 1; y >= 0; y--) { UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size); for (Int32 x = 0; x < size; x++) { - if ((UInt8)(row[x] >> 24) != 0) + if ((UInt8)(row[x] >> 24) != 0) { return 1 - (float)(y + 1) / size; + } } } return 1; @@ -296,8 +296,9 @@ Real32 Block_GetSpriteBB_LeftX(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bmp for (Int32 x = 0; x < size; x++) { for (Int32 y = 0; y < size; y++) { UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size); - if ((UInt8)(row[x] >> 24) != 0) + if ((UInt8)(row[x] >> 24) != 0) { return (float)x / size; + } } } return 1; @@ -307,8 +308,9 @@ Real32 Block_GetSpriteBB_RightX(Int32 size, Int32 tileX, Int32 tileY, Bitmap* bm for (Int32 x = size - 1; x >= 0; x--) { for (Int32 y = 0; y < size; y++) { UInt32* row = Bitmap_GetRow(bmp, tileY * size + y) + (tileX * size); - if ((UInt8)(row[x] >> 24) != 0) + if ((UInt8)(row[x] >> 24) != 0) { return (float)(x + 1) / size; + } } } return 0; @@ -367,22 +369,22 @@ void Block_CalcCulling(BlockID block, BlockID other) { } bool Block_IsHidden(BlockID block, BlockID other, Int32 side) { - // Sprite blocks can never hide faces. + /* Sprite blocks can never hide faces. */ if (Block_Draw[block] == DrawType_Sprite) return false; - // NOTE: Water is always culled by lava + /* NOTE: Water is always culled by lava. */ if ((block == BlockID_Water || block == BlockID_StillWater) && (other == BlockID_Lava || other == BlockID_StillLava)) return true; - // All blocks (except for say leaves) cull with themselves. + /* All blocks (except for say leaves) cull with themselves. */ if (block == other) return Block_Draw[block] != DrawType_TransparentThick; - // An opaque neighbour (asides from lava) culls the face. + /* An opaque neighbour (asides from lava) culls the face. */ if (Block_Draw[other] == DrawType_Opaque && !Block_IsLiquid(other)) return true; if (Block_Draw[block] != DrawType_Translucent || Block_Draw[other] != DrawType_Translucent) return false; - // e.g. for water / ice, don't need to draw water. + /* e.g. for water / ice, don't need to draw water. */ UInt8 bType = Block_Collide[block], oType = Block_Collide[other]; bool canSkip = (bType == CollideType_Solid && oType == CollideType_Solid) || bType != CollideType_Solid; @@ -405,11 +407,11 @@ bool Block_IsFaceHidden(BlockID block, BlockID other, Int32 side) { } void Block_SetXStretch(BlockID block, bool stretch) { - Block_CanStretch[block] &= 0xC3; // ~0x3C + Block_CanStretch[block] &= 0xC3; /* ~0x3C */ Block_CanStretch[block] |= (stretch ? 0x3C : (UInt8)0); } void Block_SetZStretch(BlockID block, bool stretch) { - Block_CanStretch[block] &= 0xFC; // ~0x03 + Block_CanStretch[block] &= 0xFC; /* ~0x03 */ Block_CanStretch[block] |= (stretch ? 0x03 : (UInt8)0); } \ No newline at end of file diff --git a/src/Client/NotchyGenerator.c b/src/Client/NotchyGenerator.c index c59e8cff1..d6dea53a2 100644 --- a/src/Client/NotchyGenerator.c +++ b/src/Client/NotchyGenerator.c @@ -6,7 +6,7 @@ #include "ExtMath.h" /* External variables */ -/* TODO: how do they even work? */ +String CurrentState; Real32 CurrentProgress; /* Internal variables */ @@ -28,6 +28,7 @@ void NotchyGen_Init(Int32 width, Int32 height, Int32 length, minHeight = Height; CurrentProgress = 0.0f; + CurrentState = String_FromConstant(""); } @@ -39,7 +40,7 @@ void NotchyGen_CreateHeightmap() { OctaveNoise_Init(&n3, &rnd, 6); Int32 index = 0; - //CurrentState = "Building heightmap"; + CurrentState = String_FromConstant("Building heightmap"); for (Int32 z = 0; z < Length; z++) { CurrentProgress = (Real32)z / Length; @@ -64,7 +65,7 @@ void NotchyGen_CreateHeightmap() { void NotchyGen_CreateStrata() { OctaveNoise n; OctaveNoise_Init(&n, &rnd, 8); - //CurrentState = "Creating strata"; + CurrentState = String_FromConstant("Creating strata"); Int32 hMapIndex = 0, maxY = Height - 1, mapIndex = 0; /* Try to bulk fill bottom of the map if possible */ Int32 minStoneY = NotchyGen_CreateStrataFast(); @@ -120,7 +121,7 @@ void NotchyGen_CreateSurfaceLayer() { OctaveNoise n1, n2; OctaveNoise_Init(&n1, &rnd, 8); OctaveNoise_Init(&n2, &rnd, 8); - //CurrentState = "Creating surface"; + CurrentState = String_FromConstant("Creating surface"); /* TODO: update heightmap */ Int32 hMapIndex = 0; @@ -143,7 +144,7 @@ void NotchyGen_CreateSurfaceLayer() { void NotchyGen_PlantFlowers() { Int32 numPatches = Width * Length / 3000; - //CurrentState = "Planting flowers"; + CurrentState = String_FromConstant("Planting flowers"); for (Int32 i = 0; i < numPatches; i++) { CurrentProgress = (Real32)i / numPatches; @@ -170,7 +171,7 @@ void NotchyGen_PlantFlowers() { void NotchyGen_PlantMushrooms() { Int32 numPatches = volume / 2000; - //CurrentState = "Planting mushrooms"; + CurrentState = String_FromConstant("Planting mushrooms"); for (Int32 i = 0; i < numPatches; i++) { CurrentProgress = (Real32)i / numPatches; @@ -201,7 +202,7 @@ void NotchyGen_PlantMushrooms() { void NotchyGen_PlantTrees() { Int32 numPatches = Width * Length / 4000; - //CurrentState = "Planting trees"; + CurrentState = String_FromConstant("Planting trees"); for (Int32 i = 0; i < numPatches; i++) { CurrentProgress = (Real32)i / numPatches; @@ -231,7 +232,7 @@ void NotchyGen_PlantTrees() { } bool NotchyGen_CanGrowTree(Int32 treeX, Int32 treeY, Int32 treeZ, Int32 treeHeight) { - // check tree base + /* check tree base */ Int32 baseHeight = treeHeight - 4; for (Int32 y = treeY; y < treeY + baseHeight; y++) for (Int32 z = treeZ - 1; z <= treeZ + 1; z++) @@ -243,7 +244,7 @@ bool NotchyGen_CanGrowTree(Int32 treeX, Int32 treeY, Int32 treeZ, Int32 treeHeig if (Blocks[index] != 0) return false; } - // and also check canopy + /* and also check canopy */ for (Int32 y = treeY + baseHeight; y < treeY + treeHeight; y++) for (Int32 z = treeZ - 2; z <= treeZ + 2; z++) for (Int32 x = treeX - 2; x <= treeX + 2; x++) @@ -260,7 +261,7 @@ void NotchyGen_GrowTree(Int32 treeX, Int32 treeY, Int32 treeZ, Int32 height) { Int32 baseHeight = height - 4; Int32 index = 0; - // leaves bottom layer + /* leaves bottom layer */ for (Int32 y = treeY + baseHeight; y < treeY + baseHeight + 2; y++) for (Int32 zz = -2; zz <= 2; zz++) for (Int32 xx = -2; xx <= 2; xx++) @@ -276,7 +277,7 @@ void NotchyGen_GrowTree(Int32 treeX, Int32 treeY, Int32 treeZ, Int32 height) { } } - // leaves top layer + /* leaves top layer */ Int32 bottomY = treeY + baseHeight + 2; for (Int32 y = treeY + baseHeight + 2; y < treeY + height; y++) for (Int32 zz = -1; zz <= 1; zz++) @@ -292,7 +293,7 @@ void NotchyGen_GrowTree(Int32 treeX, Int32 treeY, Int32 treeZ, Int32 height) { } } - // then place trunk + /* then place trunk */ index = (treeY * Length + treeZ) * Width + treeX; for (Int32 y = 0; y < height - 1; y++) { Blocks[index] = BlockID_Log; diff --git a/src/Client/NotchyGenerator.h b/src/Client/NotchyGenerator.h index 821f274cf..c20a9b793 100644 --- a/src/Client/NotchyGenerator.h +++ b/src/Client/NotchyGenerator.h @@ -2,6 +2,7 @@ #define CS_NOTCHY_GEN_H #include "Compiler.h" #include "Typedefs.h" +#include "String.h" /* Implements original classic vanilla map generation Based on: https://github.com/UnknownShadow200/ClassicalSharp/wiki/Minecraft-Classic-map-generation-algorithm Thanks to Jerralish for originally reverse engineering classic's algorithm, then preparing a high level overview of the algorithm. @@ -9,6 +10,12 @@ Copyright 2014 - 2017 ClassicalSharp | Licensed under BSD-3 */ +/* Progress of current operation. */ +extern Real32 CurrentProgress; + +/* Name of current operation being performed. */ +extern String CurrentState; + /* Initalises state for map generation. */ CLIENT_FUNC void NotchyGen_Init(Int32 width, Int32 height, Int32 length, diff --git a/src/Client/String.c b/src/Client/String.c index 761a6a899..091431d77 100644 --- a/src/Client/String.c +++ b/src/Client/String.c @@ -1,13 +1,15 @@ #include "String.h" #include "Funcs.h" -void String_Empty(String* str, UInt8* buffer, UInt16 capacity) { - str->buffer = buffer; - str->capacity = capacity; - str->length = 0; +String String_FromBuffer(UInt8* buffer, UInt16 capacity) { + String str; + str.buffer = buffer; + str.capacity = capacity; + str.length = 0; + return str; } -void String_Constant(String* str, const UInt8* buffer) { +String String_FromConstant(const UInt8* buffer) { UInt16 length = 0; UInt8 cur = 0; UInt8* ptr = buffer; @@ -16,9 +18,11 @@ void String_Constant(String* str, const UInt8* buffer) { length++; buffer++; } - str->buffer = ptr; - str->capacity = length; - str->length = length; + String str; + str.buffer = ptr; + str.capacity = length; + str.length = length; + return str; } bool String_Equals(String* a, String* b) { diff --git a/src/Client/String.h b/src/Client/String.h index 601d64673..670eae325 100644 --- a/src/Client/String.h +++ b/src/Client/String.h @@ -19,10 +19,10 @@ typedef struct String { } String; /* Constructs a new string, filled with NULL characters. */ -void String_Empty(String* str, UInt8* buffer, UInt16 capacity); +String String_FromBuffer(UInt8* buffer, UInt16 capacity); /* Constructs a new string from a constant readonly string. */ -void String_Constant(String* str, const UInt8* buffer); +String String_FromConstant(const UInt8* buffer); /* Returns whether two strings have same contents. */ bool String_Equals(String* a, String* b);