#include #include #include #include #include #include "net/NetworkManager.hpp" class LoginWindow { private: std::shared_ptr network; char usernameBuffer[32] = ""; char passwordBuffer[32] = ""; bool editingUsername = false; bool editingPassword = false; bool attemptingLogin = false; std::string statusMessage = ""; LoginResult loginResult; public: bool Run(std::shared_ptr net) { network = net; InitWindow(400, 300, "Game Login"); SetTargetFPS(60); // Connect to login server network->connectToLoginServer("localhost", 9998); bool loginSuccess = false; while (!WindowShouldClose() && !loginSuccess) { // Handle login attempt result if (attemptingLogin) { LoginResult result; if (network->waitForLoginResponse(result, 0.1f)) { attemptingLogin = false; if (result.success) { loginResult = result; loginSuccess = true; statusMessage = "Login successful!"; } else { statusMessage = result.message; } } } BeginDrawing(); ClearBackground(DARKGRAY); // Title DrawText("Game Login", 400/2 - MeasureText("Game Login", 30)/2, 20, 30, RAYWHITE); // Username field DrawText("Username:", 50, 80, 20, RAYWHITE); if (GuiTextBox((Rectangle){50, 105, 300, 30}, usernameBuffer, 32, editingUsername)) { editingUsername = !editingUsername; if (editingUsername) editingPassword = false; } // Password field DrawText("Password:", 50, 145, 20, RAYWHITE); // Simple password masking - show asterisks char displayBuffer[32]; int passLen = strlen(passwordBuffer); for (int i = 0; i < passLen && i < 31; i++) { displayBuffer[i] = '*'; } displayBuffer[passLen] = '\0'; if (editingPassword) { // Show actual password when editing if (GuiTextBox((Rectangle){50, 170, 300, 30}, passwordBuffer, 32, editingPassword)) { editingPassword = !editingPassword; } } else { // Show masked password when not editing if (GuiTextBox((Rectangle){50, 170, 300, 30}, displayBuffer, 32, editingPassword)) { editingPassword = !editingPassword; if (editingPassword) editingUsername = false; } // Allow typing into password field even when showing asterisks if (editingPassword == false && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) { Rectangle passBox = {50, 170, 300, 30}; if (CheckCollisionPointRec(GetMousePosition(), passBox)) { editingPassword = true; editingUsername = false; } } } // Login button (or Enter key) bool doLogin = GuiButton((Rectangle){150, 215, 100, 30}, "Login"); if (IsKeyPressed(KEY_ENTER) && !editingUsername && !editingPassword) { doLogin = true; } if (doLogin && !attemptingLogin) { if (strlen(usernameBuffer) > 0 && strlen(passwordBuffer) > 0) { attemptingLogin = true; statusMessage = "Logging in..."; network->sendLoginRequest(usernameBuffer, passwordBuffer); } else { statusMessage = "Please enter username and password"; } } // Status message if (!statusMessage.empty()) { Color msgColor = (statusMessage.find("successful") != std::string::npos) ? GREEN : (statusMessage.find("...") != std::string::npos) ? YELLOW : RED; int textWidth = MeasureText(statusMessage.c_str(), 16); DrawText(statusMessage.c_str(), 400/2 - textWidth/2, 255, 16, msgColor); } EndDrawing(); } CloseWindow(); return loginSuccess; } LoginResult GetLoginResult() const { return loginResult; } }; // Export function for main.cpp to use bool ShowLoginWindow(std::shared_ptr network, LoginResult& result) { LoginWindow window; if (window.Run(network)) { result = window.GetLoginResult(); return true; } return false; }