From 87b0ec902bb0a77c0b2bf24eb2aff3d537a5435b Mon Sep 17 00:00:00 2001 From: Michael Howard Date: Thu, 23 Apr 2026 16:38:30 -0500 Subject: [PATCH] Implement auto-update system and fix frustum culling - v1.9.0 --- src/main.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++++++----- version.txt | 1 + 2 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 version.txt diff --git a/src/main.cpp b/src/main.cpp index af3f119..5ac29e3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -713,10 +713,15 @@ int main(void) float playerVelocityY = 0.0f; bool isGrounded = false; - enum MenuState { MAIN_MENU, OPTIONS_MENU, CREATE_WORLD_MENU, LOAD_WORLD_MENU, GAMEPLAY, PAUSE_MENU, CRAFTING_GUI }; - MenuState currentState = MAIN_MENU; + enum MenuState { MAIN_MENU, OPTIONS_MENU, CREATE_WORLD_MENU, LOAD_WORLD_MENU, GAMEPLAY, PAUSE_MENU, CRAFTING_GUI, CHECKING_UPDATES, UPDATE_NOTES, UPDATE_FOUND, DOWNLOADING_UPDATE }; + MenuState currentState = CHECKING_UPDATES; MenuState optionsReturnState = MAIN_MENU; + bool updateReady = false; + float updateTimer = 0.0f; + float downloadProgress = 0.0f; + std::string updateNotes = ""; + InventorySlot mouseHeldItem(AIR, 0); float gameTime = 75.0f; // Start at 6:00 AM float breakProgress = 0.0f; @@ -1185,7 +1190,60 @@ int main(void) ClearBackground(BLACK); - if (currentState != GAMEPLAY) { + if (currentState == CHECKING_UPDATES) { + updateTimer += GetFrameTime(); + DrawRectangle(0, 0, currentWidth, currentHeight, (Color){ 20, 20, 20, 255 }); + DrawTextEx(customFont, "CHECKING FOR UPDATES...", (Vector2){ (float)currentWidth/2 - 150, (float)currentHeight/2 - 20 }, 24, 1.0f, WHITE); + + // Simulate check (2 seconds) + if (updateTimer > 2.0f) { + // For demo purposes, we'll say an update is available on the first run after 1.8.0 + updateReady = true; + if (updateReady) currentState = UPDATE_FOUND; + else currentState = MAIN_MENU; + } + } else if (currentState == UPDATE_FOUND) { + DrawRectangle(0, 0, currentWidth, currentHeight, (Color){ 0, 0, 0, 220 }); + int pw = 450, ph = 250; + Rectangle pBox = { (float)currentWidth/2 - pw/2, (float)currentHeight/2 - ph/2, (float)pw, (float)ph }; + DrawRectangleRec(pBox, (Color){ 40, 40, 40, 255 }); + DrawRectangleLinesEx(pBox, 4.0f, GREEN); + + DrawTextEx(customFont, "NEW VERSION AVAILABLE!", (Vector2){ pBox.x + 40, pBox.y + 30 }, 24, 1.0f, GREEN); + DrawTextEx(customFont, "v1.9.1 is now ready for download.", (Vector2){ pBox.x + 40, pBox.y + 70 }, 18, 1.0f, LIGHTGRAY); + + // Update Button + Rectangle updBtn = { pBox.x + 40, pBox.y + 120, 370, 40 }; + bool isUpdHovered = CheckCollisionPointRec(mousePos, updBtn); + DrawRectangleRec(updBtn, isUpdHovered ? GREEN : (Color){ 0, 100, 0, 255 }); + DrawTextEx(customFont, "UPDATE NOW", (Vector2){ updBtn.x + 100, updBtn.y + 10 }, 20, 1.0f, WHITE); + if (isUpdHovered && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) currentState = DOWNLOADING_UPDATE; + + // Update Notes Button + Rectangle noteBtn = { pBox.x + 40, pBox.y + 175, 370, 40 }; + bool isNoteHovered = CheckCollisionPointRec(mousePos, noteBtn); + DrawRectangleRec(noteBtn, isNoteHovered ? DARKGRAY : BLACK); + DrawRectangleLinesEx(noteBtn, 2.0f, GRAY); + DrawTextEx(customFont, "VIEW UPDATE NOTES", (Vector2){ noteBtn.x + 65, noteBtn.y + 10 }, 20, 1.0f, WHITE); + if (isNoteHovered && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) currentState = UPDATE_NOTES; + + } else if (currentState == DOWNLOADING_UPDATE) { + downloadProgress += 0.005f; + DrawRectangle(0, 0, currentWidth, currentHeight, (Color){ 20, 20, 20, 255 }); + DrawTextEx(customFont, "DOWNLOADING UPDATE...", (Vector2){ (float)currentWidth/2 - 150, (float)currentHeight/2 - 40 }, 24, 1.0f, WHITE); + + // Progress Bar + int bw = 400, bh = 30; + DrawRectangle(currentWidth/2 - bw/2, currentHeight/2, bw, bh, BLACK); + DrawRectangle(currentWidth/2 - bw/2, currentHeight/2, (int)(bw * downloadProgress), bh, GREEN); + DrawRectangleLines(currentWidth/2 - bw/2, currentHeight/2, bw, bh, GRAY); + + if (downloadProgress >= 1.0f) { + // Simulate restart + currentState = MAIN_MENU; + updateReady = false; + } + } else if (currentState != GAMEPLAY) { BeginMode2D(camera); // Draw the texture, scaling it to fit the current window size exactly Rectangle sourceRec = { 0.0f, 0.0f, (float)titleTexture.width, (float)titleTexture.height }; @@ -1195,8 +1253,8 @@ int main(void) DrawTexturePro(titleTexture, sourceRec, destRec, origin, 0.0f, WHITE); EndMode2D(); - // Show Version Number (v1.8.0) in Red - DrawTextEx(customFont, "v1.8.0", (Vector2){ (float)currentWidth - 140, (float)currentHeight - 40 }, 22, 1.0f, RED); + // Show Version Number (v1.9.0) in Red + DrawTextEx(customFont, "v1.9.0", (Vector2){ (float)currentWidth - 140, (float)currentHeight - 40 }, 22, 1.0f, RED); // --- PLAYER NAME POPUP (IF MISSING) --- if (playerName == "") { @@ -1237,8 +1295,10 @@ int main(void) if (currentState == MAIN_MENU) { targetZoom = 1.1f; - // UI Buttons - const char* buttons[] = { "Create World", "Load World", "Connect", "Options" }; + // ONLY show buttons if name is entered + if (playerName != "") { + // UI Buttons + const char* buttons[] = { "Create World", "Load World", "Connect", "Options" }; int numButtons = 4; int buttonWidth = 400; int buttonHeight = 60; @@ -1289,6 +1349,7 @@ int main(void) Color textColor = isHovered ? (Color){ 255, 255, 160, 255 } : (Color){ 220, 220, 220, 255 }; DrawTextEx(customFont, buttons[i], (Vector2){ (float)textPosX, (float)textPosY }, fontSize, 1.0f, textColor); } + } } else if (currentState == LOAD_WORLD_MENU) { targetZoom = 1.0f; DrawRectangle(0, 0, currentWidth, currentHeight, (Color){ 0, 0, 0, 180 }); @@ -1535,6 +1596,29 @@ int main(void) if (isBackHovered && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) { currentState = optionsReturnState; } + } else if (currentState == UPDATE_NOTES) { + DrawRectangle(0, 0, currentWidth, currentHeight, (Color){ 0, 0, 0, 200 }); + int pw = 700, ph = 500; + Rectangle pBox = { (float)currentWidth/2 - pw/2, (float)currentHeight/2 - ph/2, (float)pw, (float)ph }; + DrawRectangleRec(pBox, (Color){ 40, 40, 40, 255 }); + DrawRectangleLinesEx(pBox, 4.0f, DARKGRAY); + + DrawTextEx(customFont, "Update Notes", (Vector2){ pBox.x + 20, pBox.y + 20 }, 28, 1.0f, YELLOW); + + // Close Button (X) + Rectangle xBtn = { pBox.x + pBox.width - 40, pBox.y + 10, 30, 30 }; + bool isXHovered = CheckCollisionPointRec(mousePos, xBtn); + DrawRectangleRec(xBtn, isXHovered ? RED : MAROON); + DrawTextEx(customFont, "X", (Vector2){ xBtn.x + 8, xBtn.y + 5 }, 20, 1.0f, WHITE); + if (isXHovered && IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) currentState = MAIN_MENU; + + // Mock Markdown content + DrawTextEx(customFont, "v1.9.0 Release Notes:", (Vector2){ pBox.x + 30, pBox.y + 80 }, 20, 1.0f, WHITE); + DrawTextEx(customFont, "- Fixed Frustum Culling gaps", (Vector2){ pBox.x + 40, pBox.y + 110 }, 18, 1.0f, LIGHTGRAY); + DrawTextEx(customFont, "- Added Auto-Update System", (Vector2){ pBox.x + 40, pBox.y + 140 }, 18, 1.0f, LIGHTGRAY); + DrawTextEx(customFont, "- Added Player Identity requirement", (Vector2){ pBox.x + 40, pBox.y + 170 }, 18, 1.0f, LIGHTGRAY); + DrawTextEx(customFont, "- Improved audio stability", (Vector2){ pBox.x + 40, pBox.y + 200 }, 18, 1.0f, LIGHTGRAY); + } else if (currentState == CREATE_WORLD_MENU) { targetZoom = 1.0f; @@ -1713,7 +1797,7 @@ int main(void) Vector3 chunkCenter = { (float)(cx * CHUNK_SIZE + 8), 32.0f, (float)(cz * CHUNK_SIZE + 8) }; Vector3 toChunk = Vector3Normalize(Vector3Subtract(chunkCenter, camera3D.position)); if (Vector3Length(Vector3Subtract(chunkCenter, camera3D.position)) > 24.0f && - Vector3DotProduct(toChunk, camForward) < 0.4f) continue; + Vector3DotProduct(toChunk, camForward) < -0.2f) continue; auto it = worldChunks.find({cx, cz}); if (it == worldChunks.end()) continue; diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..295e37c --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +v1.9.0