diff options
Diffstat (limited to 'src/client.cpp')
-rw-r--r-- | src/client.cpp | 418 |
1 files changed, 365 insertions, 53 deletions
diff --git a/src/client.cpp b/src/client.cpp index b7f59658..713e429a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -4,12 +4,13 @@ #include <iostream> #include "defines.h" #include "messageout.h" +#include "messagein.h" int main(int argc, char *argv[]) { // Initialize SDL if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { - printf("SDL_Init: %s\n", SDL_GetError()); + std::cout << "SDL_Init: " << SDL_GetError() << std::endl; exit(1); } @@ -18,7 +19,7 @@ int main(int argc, char *argv[]) // Initialize SDL_net if (SDLNet_Init() == -1) { - printf("SDLNet_Init: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_Init: " << SDLNet_GetError() << std::endl; exit(2); } @@ -27,17 +28,17 @@ int main(int argc, char *argv[]) TCPsocket tcpsock; if (SDLNet_ResolveHost(&ip, "localhost", 9601) == -1) { - printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_ResolveHost: " << SDLNet_GetError() << std::endl; exit(1); } tcpsock = SDLNet_TCP_Open(&ip); if (!tcpsock) { - printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError()); + std::cout << "SDLNet_TCP_Open: " << SDLNet_GetError() << std::endl; exit(2); } - printf("Successfully connected!\n"); + std::cout << "Successfully connected!" << std::endl; int answer = 1; char line[256] = ""; @@ -47,33 +48,29 @@ int main(int argc, char *argv[]) bool responseRequired = true; MessageOut msg; - printf ("0) Quit\n"); - printf ("1) Register\n"); - printf ("2) Unregister\n"); - printf ("3) Login\n"); - printf ("4) Logout\n"); - printf ("5) Chat\n"); - printf ("6) Create character\n"); - printf ("7) Character selection\n"); - printf ("8) Delete Character\n"); - printf ("9) List Characters\n"); - printf ("10) Move Character\n"); - printf ("11) Equip Item\n"); - printf ("12) Ruby Expression\n"); - printf ("Choose your option: "); + std::cout << "0) Quit 9) Character selection" << std::endl; + std::cout << "1) Register 10) Delete Character" << std::endl; + std::cout << "2) Unregister 11) List Characters" << std::endl; + std::cout << "3) Login 12) Move Character" << std::endl; + std::cout << "4) Logout 13) Chat" << std::endl; + std::cout << "5) Change Password 14) Equip Item" << std::endl; + std::cout << "6) Change Email 15) Ruby Expression" << std::endl; + std::cout << "7) Get Email" << std::endl; + std::cout << "8) Create character" << std::endl; + std::cout << "Choose your option: "; std::cin >> answer; switch (answer) { case 1: // Register msg.writeShort(CMSG_REGISTER); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout <<"Password: "; std::cin >> line; msg.writeString(line); - printf("Email address: ", line); + std::cout << "Email address: "; std::cin >> line; msg.writeString(line); break; @@ -81,10 +78,10 @@ int main(int argc, char *argv[]) case 2: // Unregister (deleting an account) msg.writeShort(CMSG_UNREGISTER); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout << "Password: "; std::cin >> line; msg.writeString(line); break; @@ -92,10 +89,10 @@ int main(int argc, char *argv[]) case 3: // Login msg.writeShort(CMSG_LOGIN); - printf("Account name: ", line); + std::cout << "Account name: "; std::cin >> line; msg.writeString(line); - printf("Password: ", line); + std::cout << "Password: "; std::cin >> line; msg.writeString(line); break; @@ -107,51 +104,67 @@ int main(int argc, char *argv[]) break; case 5: - // Chat - msg.writeShort(CMSG_SAY); - printf("\nChat: ", line); + // Change Password + msg.writeShort(CMSG_PASSWORD_CHANGE); + std::cout << "Old Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "New Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Retype new Password: "; std::cin >> line; msg.writeString(line); - msg.writeShort(0); - responseRequired = false; break; case 6: + // Change Email + msg.writeShort(CMSG_EMAIL_CHANGE); + std::cout << "New Email: "; + std::cin >> line; + msg.writeString(line); + break; + + case 7: + // Get current Account's Email value + msg.writeShort(CMSG_EMAIL_GET); + break; + + case 8: { // Create character msg.writeShort(CMSG_CHAR_CREATE); - printf("\nName: "); + std::cout << "Name: "; std::cin >> line; msg.writeString(line); msg.writeByte(0); } break; - case 7: + case 9: { // Select character msg.writeShort(CMSG_CHAR_SELECT); - printf("\nCharacter ID: "); + std::cout << "Character ID: "; std::cin >> line; msg.writeByte(atoi(line)); } break; - case 8: + case 10: { // Delete character msg.writeShort(CMSG_CHAR_DELETE); - printf("\nCharacter ID: "); + std::cout << "Character ID: "; std::cin >> line; msg.writeByte(atoi(line)); } break; - case 9: + case 11: { // List characters msg.writeShort(CMSG_CHAR_LIST); - std::cout <<"Character List:" << std::endl; } break; - case 10: + case 12: { // Move character long x, y; @@ -167,7 +180,17 @@ int main(int argc, char *argv[]) responseRequired = false; } break; - case 11: + case 13: + // Chat + msg.writeShort(CMSG_SAY); + std::cout << "Chat: "; + std::cin >> line; + msg.writeString(line); + msg.writeShort(0); + responseRequired = false; + break; + + case 14: { // Equip unsigned int itemId; @@ -181,7 +204,7 @@ int main(int argc, char *argv[]) msg.writeByte(slot); } break; - case 12: + case 15: { std::cout << "Expr: "; std::cin >> line; @@ -194,32 +217,321 @@ int main(int argc, char *argv[]) default: continue; } - printf("\n"); - + std::cout << "Sent: " << std::endl; + // Message hex for (unsigned int i = 0; i < msg.getPacket()->length; i++) { - printf("%x ", msg.getPacket()->data[i]); + std::cout << int(msg.getPacket()->data[i]) << " "; } - printf("\n\n"); + std::cout << std::endl; SDLNet_TCP_Send(tcpsock, msg.getPacket()->data, msg.getPacket()->length); + // Raw Datas + char data[1024]; + int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024); + if (responseRequired) { - char data[1024]; - int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024); - printf("Received:\n"); + std::cout << "Received: "; if (recvLength != -1) { for (unsigned int i = 0; i < recvLength; i++) { - printf("%x ", data[i]); + std::cout << int(data[i]) << " "; } } else { - printf("ERROR!"); + std::cout << "ERROR!" << std::endl; } - printf("\n\n"); + std::cout << std::endl; } - } - + + // Response handling + // Transforming it into a MessageIn object + if (recvLength >= 2) + { + Packet *packet = new Packet(data, recvLength); + MessageIn msg(packet); // (MessageIn frees packet) + + switch (msg.getId()) { + case SMSG_REGISTER_RESPONSE: + // Register + switch (msg.readByte()) + { + case REGISTER_OK: + std::cout << "Account registered." << std::endl; + break; + case REGISTER_INVALID_USERNAME: + std::cout << "Account registering: Invalid username." << std::endl; + break; + case REGISTER_INVALID_PASSWORD: + std::cout << "Account registering: Invalid password." << std::endl; + break; + case REGISTER_INVALID_EMAIL: + std::cout << "Account registering: Invalid Email." << std::endl; + break; + case REGISTER_EXISTS_USERNAME: + std::cout << "Account registering: Username already exists." << std::endl; + break; + case REGISTER_EXISTS_EMAIL: + std::cout << "Account registering: Email already exists." << std::endl; + break; + } + break; + + case SMSG_UNREGISTER_RESPONSE: + // Register + switch (msg.readByte()) + { + case UNREGISTER_OK: + std::cout << "Account unregistered." << std::endl; + break; + case UNREGISTER_INVALID_PASSWORD: + std::cout << "Account unregistering: Invalid password." << std::endl; + break; + case UNREGISTER_INVALID_USERNAME: + std::cout << "Account unregistering: Invalid username." << std::endl; + break; + case UNREGISTER_INVALID_UNSUFFICIENT_RIGHTS: + std::cout << "Account unregistering: unsufficient rights." << std::endl; + break; + } + break; + + case SMSG_LOGIN_RESPONSE: + // Register + switch (msg.readByte()) + { + case LOGIN_OK: + char charNumber; + charNumber = msg.readByte(); + std::cout << "Account has " << int(charNumber) << " characters." << std::endl; + for (unsigned int i = 0; i < charNumber; i++) + { + if (i >0) std::cout << ", "; + std::cout << msg.readString(); + } + std::cout << "." << std::endl; + break; + case LOGIN_INVALID_USERNAME: + std::cout << "Login: Invalid Username." << std::endl; + break; + case LOGIN_INVALID_PASSWORD: + std::cout << "Login: Invalid Password." << std::endl; + break; + case LOGIN_INVALID_VERSION: + std::cout << "TODO:Login: Invalid Version." << std::endl; + break; + case LOGIN_ALREADY_LOGGED: + std::cout << "Login: Already logged with another account." << std::endl; + break; + case LOGIN_SERVER_FULL: + std::cout << "TODO:Login: Server has reached maximum of clients." << std::endl; + break; + case LOGIN_ACCOUNT_BANNED: + std::cout << "Login: Your account has been banned." << std::endl; + break; + case LOGIN_ACCOUNT_REVIEW: + std::cout << "TODO:Login: Your account is being reviewed." << std::endl; + break; + default: + case LOGIN_UNKNOWN: + std::cout << "Login: Unknown error." << std::endl; + break; + } + break; + + case SMSG_LOGOUT_RESPONSE: + { + switch (msg.readByte()) + { + case LOGOUT_OK: + std::cout << "Logout..." << std::endl; + break; + default: + case LOGOUT_UNSUCCESSFULL: + std::cout << "Logout: unsuccessfull." << std::endl; + break; + } + } + break; + + case SMSG_PASSWORD_CHANGE_RESPONSE: + { + switch (msg.readByte()) + { + case PASSCHG_OK: + std::cout << "Password correctly changed." << std::endl; + break; + default: + case PASSCHG_NOLOGIN: + std::cout << "Password change: Not logged in." << std::endl; + break; + case PASSCHG_MISMATCH: + std::cout << "Password change: Passwords mismatch." << std::endl; + break; + case PASSCHG_INVALID: + std::cout << "Password change: New password is invalid." << std::endl; + break; + } + } + break; + + case SMSG_EMAIL_CHANGE_RESPONSE: + { + switch (msg.readByte()) + { + case EMAILCHG_OK: + std::cout << "Email correctly changed." << std::endl; + break; + default: + case EMAILCHG_NOLOGIN: + std::cout << "Email change: Not logged in." << std::endl; + break; + case EMAILCHG_EXISTS_EMAIL: + std::cout << "Email change: Email already exists." << std::endl; + break; + case EMAILCHG_INVALID: + std::cout << "Email change: New Email is invalid." << std::endl; + break; + } + } + break; + + case SMSG_EMAIL_GET_RESPONSE: + { + switch (msg.readByte()) + { + case EMAILGET_OK: + std::cout << "Current Email: " << msg.readString() << std::endl; + break; + default: + case EMAILGET_NOLOGIN: + std::cout << "Email change: Not logged in." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_CREATE_RESPONSE: + { + switch (msg.readByte()) + { + case CREATE_OK: + std::cout << "Character Created successfully." << std::endl; + break; + case CREATE_EXISTS_NAME: + std::cout << "Character Creation: Character's name already exists." + << std::endl; + break; + case CREATE_NOLOGIN: + std::cout << "Character Creation: Not logged in." << std::endl; + break; + case CREATE_TOO_MUCH_CHARACTERS: + std::cout << "Character Creation: Too much characters." << std::endl; + break; + case CREATE_INVALID_HAIR: + std::cout << "Character Creation: Invalid Hair Value." << std::endl; + break; + case CREATE_INVALID_NAME: + std::cout << "Character Creation: Invalid Name." << std::endl; + break; + case CREATE_INVALID_SEX: + std::cout << "Character Creation: Invalid Sex value." << std::endl; + break; + case CREATE_INVALID_RAW_STATS: + std::cout << "TODO: Character Creation: Invalid Raw Stats." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_DELETE_RESPONSE: + { + switch (msg.readByte()) + { + case DELETE_OK: + std::cout << "Character deleted." << std::endl; + break; + case DELETE_INVALID_NAME: + std::cout << "Character Deletion: Character's name doesn't exist." + << std::endl; + break; + case DELETE_NOLOGIN: + std::cout << "Character Deletion: Not logged in." << std::endl; + break; + case DELETE_NO_MORE_CHARACTERS: + std::cout << "Character Creation: No more characters." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_SELECT_RESPONSE: + { + switch (msg.readByte()) + { + case SELECT_OK: + std::cout << "Character selected." << std::endl; + break; + case SELECT_INVALID: + std::cout << "Character Selection: invalid ID." + << std::endl; + break; + case SELECT_NOLOGIN: + std::cout << "Character Selection: Not logged in." << std::endl; + break; + case SELECT_NOT_YET_CHARACTERS: + std::cout << "Character Selection: No character to select." << std::endl; + break; + } + } + break; + + case SMSG_CHAR_LIST_RESPONSE: + { + switch (msg.readByte()) + { + case CHAR_LIST_OK: + char charNumber; + charNumber = msg.readByte(); + std::cout << "Character List:" << std::endl + << "---------------" << std::endl; + std::cout << int(charNumber) << " characters in the account." + << std::endl; + for (unsigned int i = 0; i < charNumber; i++) + { + std::cout << msg.readString() << ":" << std::endl; + std::cout << "Gender: " << int(msg.readByte()) << ", "; + std::cout << "Level: " << int(msg.readByte()) << ", "; + std::cout << "Money: " << int(msg.readByte()) << ", " + << std::endl; + std::cout << "Strength: " << int(msg.readByte()) << ", "; + std::cout << "Agility: " << int(msg.readByte()) << ", "; + std::cout << "Vitality: " << int(msg.readByte()) << ", " + << std::endl; + std::cout << "Intelligence: " << int(msg.readByte()) << ", "; + std::cout << "Dexterity: " << int(msg.readByte()) << ", "; + std::cout << "Luck: " << int(msg.readByte()) << ", " + << std::endl << std::endl; + } + break; + case CHAR_LIST_NOLOGIN: + std::cout << "Character List: Not logged in." + << std::endl; + break; + } + } + break; + + + default: + continue; + } // End switch MessageId + + } // end if recLength > 2 (MessageLength > 2) + + + } // End running loop + SDLNet_TCP_Close(tcpsock); return 0; |