diff --git a/Game.cpp b/Game.cpp index 7138c5d..46758f9 100644 --- a/Game.cpp +++ b/Game.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "MessageStructs.h" LGame::LGame(LWindow &window, std::string playerName, std::string opponentName, int &sockfd, sockaddr_in &theiraddr) : LScreen(window), playerName(playerName), opponentName(opponentName), sockfd(sockfd), theirAddr(theiraddr) @@ -29,29 +30,23 @@ LGame::LGame(LWindow &window, std::string playerName, std::string opponentName, Mix_PlayChannel(-1, introMusic, 0); Mix_PlayMusic(backGroundMusic, -1); initObjs(); + initTasks(); // initSocket(); } -void LGame::initSocket() +void LGame::initTasks() { - if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + for (int i = 0; i < tasksNum; i++) { - perror("socket creation failed"); + std::vector>::iterator it; + std::pair t; + do + { + t = allTasks[rand() % allTasks.size()]; + it = std::find(currTasks.begin(), currTasks.end(), t); + } while (it != currTasks.end()); + currTasks.push_back(t); } - - fcntl(sockfd, F_SETFL, O_NONBLOCK); - - // memset(&myAddr, 0, sizeof(myAddr)); - memset(&theirAddr, 0, sizeof(theirAddr)); - - // myAddr.sin_family = AF_INET; // IPv4 - // myAddr.sin_addr.s_addr = INADDR_ANY; - // myAddr.sin_port = htons(2000); - - theirAddr.sin_family = AF_INET; - theirAddr.sin_port = htons(8080); - // theirAddr.sin_addr.s_addr = INADDR_ANY; - inet_pton(AF_INET, serverIp.c_str(), &(theirAddr.sin_addr.s_addr)); } void LGame::handleEvent(SDL_Event &e) @@ -450,9 +445,12 @@ std ::function getHostelEventListener(std :: player.getCurrentTaskTimer().start(); player.setTaskText("resting ... "); player.setTaskAnimation(player.getGame().sleepingAnimation); - player.setUpdateStateParameters({gMaxPlayerHealth, - 0, - 0}); + player.setUpdateStateParameters({ + gMaxPlayerHealth, + 0, + 0, + 0, + }); } break; case SDLK_b: @@ -463,6 +461,7 @@ std ::function getHostelEventListener(std :: player.setCurrentTaskTime(3000); player.getCurrentTaskTimer().start(); player.setUpdateStateParameters({30, + 0, 0, 0}); } @@ -475,6 +474,7 @@ std ::function getHostelEventListener(std :: player.setCurrentTaskTime(3000); player.getCurrentTaskTimer().start(); player.setUpdateStateParameters({30, + 0, 0, 0}); } @@ -487,6 +487,7 @@ std ::function getHostelEventListener(std :: player.setCurrentTaskTime(3000); player.getCurrentTaskTimer().start(); player.setUpdateStateParameters({30, + 0, 0, 0}); } @@ -568,6 +569,7 @@ void LGame::initEntities() player.setCurrentTaskTime(5000); player.getCurrentTaskTimer().start(); player.setUpdateStateParameters({0, + 0, 0, 0}); break; @@ -594,6 +596,7 @@ void LGame::initEntities() player.getCurrentTaskTimer().start(); player.setUpdateStateParameters({20, -20, + 0, 0}); } break; @@ -618,6 +621,7 @@ void LGame::initEntities() player.setTaskAnimation(player.getGame().icecreamAnimation); player.setUpdateStateParameters({10, -10, + 0, 0}); } break; @@ -638,21 +642,56 @@ void LGame::initEntities() switch (e.key.keysym.sym) { case SDLK_b: - player.setTaskText("having hotdog... "); + player.setTaskText("playing basketball... "); player.setTaskAnimation(player.getGame().basketballAnimation); player.setCurrentTaskTime(3000); player.getCurrentTaskTimer().start(); - player.setUpdateStateParameters({0, + player.setUpdateStateParameters({-5, 0, - 0}); + 0, + 10}); break; } } }); - Entity athletic("athletic", [&](Player &player, std::string &displayText) - { displayText = "athletic"; }); - Entity cricket("cricket", [&](Player &player, std::string &displayText) - { displayText = "cricket"; }); + + Entity athletic("athletic", getTextPromptFunc("PRESS A TO DO ATHLETICS"), [&](SDL_Event &e, Player &player) + { + if (e.type == SDL_KEYDOWN && e.key.repeat == 0) + { + switch (e.key.keysym.sym) + { + case SDLK_a: + player.setTaskText("doing athletics... "); + //player.setTaskAnimation(player.getGame().basketballAnimation); + player.setCurrentTaskTime(3000); + player.getCurrentTaskTimer().start(); + player.setUpdateStateParameters({-5, + 0, + 0, + 10}); + break; + } + } }); + + Entity cricket("cricket", getTextPromptFunc("PRESS C TO PLAY CRICKET"), [&](SDL_Event &e, Player &player) + { + if (e.type == SDL_KEYDOWN && e.key.repeat == 0) + { + switch (e.key.keysym.sym) + { + case SDLK_c: + player.setTaskText("playing cricket... "); + //player.setTaskAnimation(player.getGame().basketballAnimation); + player.setCurrentTaskTime(3000); + player.getCurrentTaskTimer().start(); + player.setUpdateStateParameters({-5, + 0, + 0, + 10}); + break; + } + } }); Entity lhc("lhc", [&](Player &player, std::string &displayText) { displayText = "lhc"; }); Entity police("police", [&](Player &player, std::string &displayText) @@ -682,6 +721,7 @@ void LGame::initEntities() player.setUpdateStateParameters({ 20 , -20 , + 0, 0 }) ; } @@ -775,4 +815,64 @@ int LGame::getWindowHeight() LTimer LGame ::getTimer() { return globalTime; +} + +bool LGame::hasTask(std::pair task) +{ + std::vector>::iterator it; + it = std::find(currTasks.begin(), currTasks.end(), task); + return it != currTasks.end(); +} + +bool LGame::hasTask(int task) +{ + for (int i = 0; i < currTasks.size(); i++) + { + if (currTasks[i].first == task) + { + return true; + } + } + return false; +} + +void LGame::replaceTask(std::pair task) +{ + std::vector>::iterator it; + it = std::find(currTasks.begin(), currTasks.end(), task); + int index = it - currTasks.begin(); + std::vector>::iterator it2; + std::pair t; + do + { + t = allTasks[rand() % allTasks.size()]; + it2 = std::find(currTasks.begin(), currTasks.end(), t); + } while (it2 != currTasks.end()); + currTasks[index] = t; +} + +void LGame::replaceTask(int task) +{ + int index = -1; + for (int i = 0; i < currTasks.size(); i++) + { + if (currTasks[i].first == task) + { + index = i; + break; + } + } + if (index == -1) + { + return; + } + + std::vector>::iterator it2; + std::pair t; + do + { + t = allTasks[rand() % allTasks.size()]; + it2 = std::find(currTasks.begin(), currTasks.end(), t); + } while (it2 != currTasks.end()); + currTasks[index] = t; } \ No newline at end of file diff --git a/Game.h b/Game.h index dd50381..f122b89 100644 --- a/Game.h +++ b/Game.h @@ -26,10 +26,15 @@ #include #include #include +#include class LGame : public LScreen { private: + const std::vector> allTasks = {std::pair(27, "Play Basketball"), std::pair(28, "Do Athletics"), std::pair(29, "Play Cricket")}; + std::vector> currTasks; + int tasksNum = 2; + std::string serverIp; std::string playerName, opponentName; @@ -60,6 +65,7 @@ class LGame : public LScreen int mTileHeight; int mMaxPlayerHealth; bool initObjs(); + void initTasks(); bool setTiles(); void initEntities(); @@ -91,6 +97,10 @@ class LGame : public LScreen LTimer getTimer(); Mix_Music *backGroundMusic; Mix_Chunk *introMusic; + bool hasTask(std::pair task); + bool hasTask(int task); + void replaceTask(std::pair task); + void replaceTask(int task); }; #endif \ No newline at end of file diff --git a/Player.cpp b/Player.cpp index 8f49930..c0f82b0 100644 --- a/Player.cpp +++ b/Player.cpp @@ -12,6 +12,7 @@ #include #include #include "constants.h" +#include std ::vector hostelNames{"nilgiri", "kara", "aravali", "jwala", "kumaon", "vindy", "satpura", "udai_girnar", "himadri", "kailash"}; @@ -30,7 +31,7 @@ Player ::Player(LTexture &myTexture, LGame &game, int playerHeight, int playerWi hostelName = "nilgiri"; // for testing currentTaskTime = 0; currentTaskTimer = LTimer(); - updateState = {0.0, 0, 0}; + updateState = {0.0, 0, 0, 0}; // Initialize the velocity mVelX = 0; mVelY = 0; @@ -93,7 +94,7 @@ void Player ::resetPlayer() currentTaskTime = 0; currentTaskTimer.stop(); direction = 'D'; - updateState = {0, 0, 0}; + updateState = {0, 0, 0, 0}; } void Player::handleEvent(SDL_Event &e) @@ -407,7 +408,7 @@ void Player::update() currentTaskTime = 0; currentTaskTimer.stop(); updateStateParameters(updateState); - updateState = {0.0, 0, 0}; + updateState = {0.0, 0, 0, 0}; taskText = ""; hasTaskAnimation = false; // update player stats @@ -495,6 +496,11 @@ void Player::updateStateParameters(playerStateUpdate s) setHealth(getHealth() + s.health); setPoints(getPoints() + s.points); setMoney(getMoney() + s.money); + if (mGame.hasTask(lastTileType)) + { + setPoints(getPoints() + s.pointsIfTask); + mGame.replaceTask(lastTileType); + } } void Player::setUpdateStateParameters(playerStateUpdate s) diff --git a/main.cpp b/main.cpp index e9abed9..c379da8 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "MyWindow.h" #include "Game.h" @@ -15,6 +17,7 @@ const int SCREEN_HEIGHT = 480; int main(int argc, char *args[]) { + srand(time(0)); std::string serverIp = "192.168.227.10"; if (argc > 1) { diff --git a/utilities.h b/utilities.h index 0b05104..530dbe0 100644 --- a/utilities.h +++ b/utilities.h @@ -1,6 +1,8 @@ -struct playerStateUpdate{ - - float health ; - int money ; - int points ; -} ; \ No newline at end of file +struct playerStateUpdate +{ + + float health; + int money; + int points; + int pointsIfTask; +}; \ No newline at end of file