1
0
game/client/LoginWindow.cpp

136 lines
4.9 KiB
C++

#include <raylib.h>
#include <raygui.h>
#include <cstring>
#include <string>
#include <memory>
#include "net/NetworkManager.hpp"
class LoginWindow {
private:
std::shared_ptr<NetworkManager> 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<NetworkManager> 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<NetworkManager> network, LoginResult& result) {
LoginWindow window;
if (window.Run(network)) {
result = window.GetLoginResult();
return true;
}
return false;
}