136 lines
4.9 KiB
C++
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;
|
|
} |