diff options
| author | Starla Insigna <starla4444@gmail.com> | 2013-08-29 12:44:18 -0400 |
|---|---|---|
| committer | Starla Insigna <starla4444@gmail.com> | 2013-08-29 12:44:18 -0400 |
| commit | f42c9936ca65695c097900ad3bdf24ef13d512c4 (patch) | |
| tree | 77e5006c595883c1bb050683a611b4fb73c13c39 | |
| parent | 19a20b3c0bb1ff4230b2f3504bd5ed8e43ffab3c (diff) | |
| download | mazeoflife-f42c9936ca65695c097900ad3bdf24ef13d512c4.tar.gz mazeoflife-f42c9936ca65695c097900ad3bdf24ef13d512c4.tar.bz2 mazeoflife-f42c9936ca65695c097900ad3bdf24ef13d512c4.zip | |
Added ability to add highscores to global highscore list
| -rw-r--r-- | hslist.cpp | 314 | ||||
| -rw-r--r-- | hslist.h | 35 |
2 files changed, 347 insertions, 2 deletions
| diff --git a/hslist.cpp b/hslist.cpp index 3e11e41..9a12dac 100644 --- a/hslist.cpp +++ b/hslist.cpp | |||
| @@ -231,6 +231,87 @@ GlobalHighscoreList::GlobalHighscoreList() | |||
| 231 | } | 231 | } |
| 232 | } | 232 | } |
| 233 | 233 | ||
| 234 | GlobalHighscoreList::GlobalHighscoreList(Highscore* h) | ||
| 235 | { | ||
| 236 | fail = false; | ||
| 237 | |||
| 238 | try | ||
| 239 | { | ||
| 240 | IPaddress ipaddress; | ||
| 241 | |||
| 242 | if (SDLNet_ResolveHost(&ipaddress, "other.fourisland.com", 80) == -1) | ||
| 243 | { | ||
| 244 | printf("Could not resolve host \"other.fourisland.com\": %s\n", SDLNet_GetError()); | ||
| 245 | throw 1; | ||
| 246 | } | ||
| 247 | |||
| 248 | TCPsocket tcpsock = SDLNet_TCP_Open(&ipaddress); | ||
| 249 | if (!tcpsock) | ||
| 250 | { | ||
| 251 | printf("Could not connect to host \"other.fourisland.com\": %s\n", SDLNet_GetError()); | ||
| 252 | throw 2; | ||
| 253 | } | ||
| 254 | |||
| 255 | char body[256]; | ||
| 256 | sprintf(body, "name=%s&level=%d", h->getName(), h->getLevel()); | ||
| 257 | char headers[256]; | ||
| 258 | sprintf(headers, "POST /mol/hslist.php?add HTTP/1.1\nHost: other.fourisland.com\nUser-Agent: Maze Of Life v2.0\nAccept: text/plain\nKeep-Alive: 300\nConnection: keep-alive\nContent-Type: application/x-www-form-urlencoded\nContent-Length: %d\n\n%s\n", (int) strlen(body), body); | ||
| 259 | if (SDLNet_TCP_Send(tcpsock, headers, strlen(headers)+1) < strlen(headers)) | ||
| 260 | { | ||
| 261 | printf("Connection closed by peer: %s\n", SDLNet_GetError()); | ||
| 262 | throw 3; | ||
| 263 | } | ||
| 264 | |||
| 265 | std::stringstream download(std::stringstream::in | std::stringstream::out); | ||
| 266 | char hslist[1024]; | ||
| 267 | SDLNet_TCP_Recv(tcpsock, hslist, 1024); | ||
| 268 | download << hslist; | ||
| 269 | SDLNet_TCP_Close(tcpsock); | ||
| 270 | |||
| 271 | char temps[256]; | ||
| 272 | download.getline(temps,256); | ||
| 273 | while (strlen(temps) != 1) | ||
| 274 | { | ||
| 275 | download.getline(temps,256); | ||
| 276 | } | ||
| 277 | |||
| 278 | int rank; | ||
| 279 | download.getline(temps, 256); | ||
| 280 | if (sscanf(temps, "%d%*c", &rank) != 1) | ||
| 281 | { | ||
| 282 | printf("Recieved data is of an invalid format: %s\n", temps); | ||
| 283 | throw 4; | ||
| 284 | } | ||
| 285 | |||
| 286 | this->hslist = getGlobalHighscores(); | ||
| 287 | |||
| 288 | if (this->hslist.empty()) | ||
| 289 | { | ||
| 290 | printf("Global Highscore List cannot be empty after adding a score to it.\n"); | ||
| 291 | throw 5; | ||
| 292 | } | ||
| 293 | |||
| 294 | if (rank > 10) | ||
| 295 | { | ||
| 296 | h->setRank(rank); | ||
| 297 | |||
| 298 | this->hslist[9] = h; | ||
| 299 | } else { | ||
| 300 | this->hslist.push_back(h); | ||
| 301 | std::sort(this->hslist.begin(), this->hslist.end(), hslist_comp_i); | ||
| 302 | resetRanks(this->hslist); | ||
| 303 | |||
| 304 | if (this->hslist.size() > 10) | ||
| 305 | { | ||
| 306 | this->hslist.resize(10); | ||
| 307 | } | ||
| 308 | } | ||
| 309 | } catch (int e) | ||
| 310 | { | ||
| 311 | fail = true; | ||
| 312 | } | ||
| 313 | } | ||
| 314 | |||
| 234 | SDL_Surface* GlobalHighscoreList::render() | 315 | SDL_Surface* GlobalHighscoreList::render() |
| 235 | { | 316 | { |
| 236 | if (fail) | 317 | if (fail) |
| @@ -251,6 +332,11 @@ SDL_Surface* GlobalHighscoreList::render() | |||
| 251 | } | 332 | } |
| 252 | } | 333 | } |
| 253 | 334 | ||
| 335 | bool GlobalHighscoreList::didFail() | ||
| 336 | { | ||
| 337 | return fail; | ||
| 338 | } | ||
| 339 | |||
| 254 | State* ChooseHighscoreListState::operator() (SDL_Window* window, SDL_Renderer* renderer) | 340 | State* ChooseHighscoreListState::operator() (SDL_Window* window, SDL_Renderer* renderer) |
| 255 | { | 341 | { |
| 256 | SDL_Texture* background = loadImage(renderer, "resources/chl.bmp"); | 342 | SDL_Texture* background = loadImage(renderer, "resources/chl.bmp"); |
| @@ -390,7 +476,6 @@ State* DisplayAndReturnLocalHighscoreListState::operator() (SDL_Window* window, | |||
| 390 | case 1: return new TitleState(); | 476 | case 1: return new TitleState(); |
| 391 | } | 477 | } |
| 392 | } | 478 | } |
| 393 | |||
| 394 | } | 479 | } |
| 395 | } | 480 | } |
| 396 | } | 481 | } |
| @@ -680,7 +765,7 @@ State* NewHighscoreState::operator() (SDL_Window* window, SDL_Renderer* renderer | |||
| 680 | switch (selection) | 765 | switch (selection) |
| 681 | { | 766 | { |
| 682 | case 0: return new GameState(); | 767 | case 0: return new GameState(); |
| 683 | //case 1: return new SubmitHighscoreListState(hsname, level); | 768 | case 1: return new SubmitHighscoreState(h); |
| 684 | case 2: return new TitleState(); | 769 | case 2: return new TitleState(); |
| 685 | } | 770 | } |
| 686 | } | 771 | } |
| @@ -688,3 +773,228 @@ State* NewHighscoreState::operator() (SDL_Window* window, SDL_Renderer* renderer | |||
| 688 | } | 773 | } |
| 689 | } | 774 | } |
| 690 | } | 775 | } |
| 776 | |||
| 777 | SubmitHighscoreState::SubmitHighscoreState(Highscore* h) | ||
| 778 | { | ||
| 779 | this->h = h; | ||
| 780 | } | ||
| 781 | |||
| 782 | State* SubmitHighscoreState::operator() (SDL_Window* window, SDL_Renderer* renderer) | ||
| 783 | { | ||
| 784 | SDL_Surface* list_s = SDL_CreateRGBSurface(0, 480, 480, 32, 0,0,0,0); | ||
| 785 | Uint32 bgColor = SDL_MapRGB(list_s->format, 255, 255, 255); | ||
| 786 | SDL_FillRect(list_s, NULL, bgColor); | ||
| 787 | SDL_SetColorKey(list_s, SDL_TRUE, bgColor); | ||
| 788 | TTF_Font* dataFont = loadFont(25); | ||
| 789 | SDL_Color fontColor = {0, 0, 0, 0}; | ||
| 790 | SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Sending highscore....", fontColor); | ||
| 791 | SDL_Rect aSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h}; | ||
| 792 | SDL_BlitSurface(text, NULL, list_s, &aSpace); | ||
| 793 | SDL_FreeSurface(text); | ||
| 794 | |||
| 795 | SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor); | ||
| 796 | SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h}; | ||
| 797 | SDL_BlitSurface(title, NULL, list_s, &tSpace); | ||
| 798 | SDL_FreeSurface(title); | ||
| 799 | |||
| 800 | SDL_Texture* list = SDL_CreateTextureFromSurface(renderer, list_s); | ||
| 801 | SDL_FreeSurface(list_s); | ||
| 802 | |||
| 803 | // Start submitting score | ||
| 804 | m = SDL_CreateMutex(); | ||
| 805 | SDL_CreateThread(&SubmitHighscore, "SubmitHighscore", this); | ||
| 806 | |||
| 807 | SDL_Event e; | ||
| 808 | |||
| 809 | for (;;) | ||
| 810 | { | ||
| 811 | SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); | ||
| 812 | SDL_RenderClear(renderer); | ||
| 813 | SDL_RenderCopy(renderer, list, NULL, NULL); | ||
| 814 | SDL_RenderPresent(renderer); | ||
| 815 | |||
| 816 | if (SDL_LockMutex(m) == 0) | ||
| 817 | { | ||
| 818 | if (lhl != NULL) | ||
| 819 | { | ||
| 820 | SDL_UnlockMutex(m); | ||
| 821 | SDL_DestroyMutex(m); | ||
| 822 | |||
| 823 | if (lhl->didFail()) | ||
| 824 | { | ||
| 825 | return new FailedSubmittingHighscoreState(h); | ||
| 826 | } else { | ||
| 827 | return new SubmittedHighscoreState(lhl, h); | ||
| 828 | } | ||
| 829 | } else { | ||
| 830 | SDL_UnlockMutex(m); | ||
| 831 | } | ||
| 832 | } | ||
| 833 | |||
| 834 | while (SDL_PollEvent(&e)) | ||
| 835 | { | ||
| 836 | if (e.type == SDL_QUIT) | ||
| 837 | { | ||
| 838 | SDL_DestroyMutex(m); | ||
| 839 | |||
| 840 | return NULL; | ||
| 841 | } | ||
| 842 | } | ||
| 843 | } | ||
| 844 | } | ||
| 845 | |||
| 846 | int SubmitHighscoreState::SubmitHighscore(void* pParam) | ||
| 847 | { | ||
| 848 | SubmitHighscoreState* parent = (SubmitHighscoreState*) pParam; | ||
| 849 | if (SDL_LockMutex(parent->m) == 0) | ||
| 850 | { | ||
| 851 | parent->lhl = new GlobalHighscoreList(parent->h); | ||
| 852 | |||
| 853 | SDL_UnlockMutex(parent->m); | ||
| 854 | } else { | ||
| 855 | printf("Could not lock mutex: %s\n", SDL_GetError()); | ||
| 856 | } | ||
| 857 | } | ||
| 858 | |||
| 859 | FailedSubmittingHighscoreState::FailedSubmittingHighscoreState(Highscore* h) | ||
| 860 | { | ||
| 861 | this->h = h; | ||
| 862 | } | ||
| 863 | |||
| 864 | State* FailedSubmittingHighscoreState::operator() (SDL_Window* window, SDL_Renderer* renderer) | ||
| 865 | { | ||
| 866 | SDL_Surface* list_s = SDL_CreateRGBSurface(0, 480, 480, 32, 0,0,0,0); | ||
| 867 | Uint32 bgColor = SDL_MapRGB(list_s->format, 255, 255, 255); | ||
| 868 | SDL_FillRect(list_s, NULL, bgColor); | ||
| 869 | SDL_SetColorKey(list_s, SDL_TRUE, bgColor); | ||
| 870 | TTF_Font* dataFont = loadFont(25); | ||
| 871 | SDL_Color fontColor = {0, 0, 0, 0}; | ||
| 872 | SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Error submitting highscores", fontColor); | ||
| 873 | SDL_Rect tSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h}; | ||
| 874 | SDL_BlitSurface(text, NULL, list_s, &tSpace); | ||
| 875 | SDL_FreeSurface(text); | ||
| 876 | |||
| 877 | SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor); | ||
| 878 | SDL_Rect aSpace = {240-(title->w/2), 0, title->w, title->h}; | ||
| 879 | SDL_BlitSurface(title, NULL, list_s, &aSpace); | ||
| 880 | SDL_FreeSurface(title); | ||
| 881 | |||
| 882 | SDL_Surface* options_s = SDL_LoadBMP("resources/hlo_passartm.bmp"); | ||
| 883 | SDL_Rect oSpace = {0, 440, options_s->w, options_s->h}; | ||
| 884 | SDL_BlitSurface(options_s, NULL, list_s, &oSpace); | ||
| 885 | SDL_FreeSurface(options_s); | ||
| 886 | |||
| 887 | SDL_Texture* list = SDL_CreateTextureFromSurface(renderer, list_s); | ||
| 888 | SDL_FreeSurface(list_s); | ||
| 889 | |||
| 890 | SDL_Texture* pointer = loadImage(renderer, "resources/pointer.bmp"); | ||
| 891 | int selection = 0; | ||
| 892 | SDL_Event e; | ||
| 893 | |||
| 894 | for (;;) | ||
| 895 | { | ||
| 896 | SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); | ||
| 897 | SDL_RenderClear(renderer); | ||
| 898 | SDL_RenderCopy(renderer, list, NULL, NULL); | ||
| 899 | applyTexture(renderer, pointer, selection==0?13:(selection==1?138:284), 448); | ||
| 900 | SDL_RenderPresent(renderer); | ||
| 901 | |||
| 902 | while (SDL_PollEvent(&e)) | ||
| 903 | { | ||
| 904 | if (e.type == SDL_QUIT) | ||
| 905 | { | ||
| 906 | return NULL; | ||
| 907 | } else if (e.type == SDL_KEYDOWN) | ||
| 908 | { | ||
| 909 | if ((e.key.keysym.sym == SDLK_LEFT) && (selection != 0)) | ||
| 910 | { | ||
| 911 | selection--; | ||
| 912 | } else if ((e.key.keysym.sym == SDLK_RIGHT) && (selection != 2)) | ||
| 913 | { | ||
| 914 | selection++; | ||
| 915 | } else if (e.key.keysym.sym == SDLK_RETURN) | ||
| 916 | { | ||
| 917 | switch (selection) | ||
| 918 | { | ||
| 919 | case 0: return new GameState(); | ||
| 920 | case 1: return new SubmitHighscoreState(h); | ||
| 921 | case 2: return new TitleState(); | ||
| 922 | } | ||
| 923 | } | ||
| 924 | } | ||
| 925 | } | ||
| 926 | } | ||
| 927 | } | ||
| 928 | |||
| 929 | SubmittedHighscoreState::SubmittedHighscoreState(GlobalHighscoreList* lhl, Highscore* h) | ||
| 930 | { | ||
| 931 | this->lhl = lhl; | ||
| 932 | this->h = h; | ||
| 933 | } | ||
| 934 | |||
| 935 | State* SubmittedHighscoreState::operator() (SDL_Window* window, SDL_Renderer* renderer) | ||
| 936 | { | ||
| 937 | SDL_Surface* list_s = lhl->render(); | ||
| 938 | |||
| 939 | SDL_Color fontColor = {0, 0, 0, 0}; | ||
| 940 | SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor); | ||
| 941 | SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h}; | ||
| 942 | SDL_BlitSurface(title, NULL, list_s, &tSpace); | ||
| 943 | SDL_FreeSurface(title); | ||
| 944 | |||
| 945 | SDL_Surface* options_s = SDL_LoadBMP("resources/hlo_paartm.bmp"); | ||
| 946 | SDL_Rect oSpace = {0, 440, options_s->w, options_s->h}; | ||
| 947 | SDL_BlitSurface(options_s, NULL, list_s, &oSpace); | ||
| 948 | SDL_FreeSurface(options_s); | ||
| 949 | |||
| 950 | SDL_Texture* list = SDL_CreateTextureFromSurface(renderer, list_s); | ||
| 951 | SDL_FreeSurface(list_s); | ||
| 952 | |||
| 953 | SDL_Texture* pointer = loadImage(renderer, "resources/pointer.bmp"); | ||
| 954 | int selection = 0; | ||
| 955 | SDL_Event e; | ||
| 956 | |||
| 957 | int newpos = h->getRank(); | ||
| 958 | if (newpos > 10) | ||
| 959 | { | ||
| 960 | newpos = 10; | ||
| 961 | } | ||
| 962 | |||
| 963 | for (;;) | ||
| 964 | { | ||
| 965 | SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); | ||
| 966 | SDL_RenderClear(renderer); | ||
| 967 | |||
| 968 | SDL_Rect eSpace = {0, newpos*40, 480, 40}; | ||
| 969 | SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255); | ||
| 970 | SDL_RenderFillRect(renderer, &eSpace); | ||
| 971 | |||
| 972 | SDL_RenderCopy(renderer, list, NULL, NULL); | ||
| 973 | applyTexture(renderer, pointer, selection==0?52:225, 447); | ||
| 974 | SDL_RenderPresent(renderer); | ||
| 975 | |||
| 976 | while (SDL_PollEvent(&e)) | ||
| 977 | { | ||
| 978 | if (e.type == SDL_QUIT) | ||
| 979 | { | ||
| 980 | return NULL; | ||
| 981 | } else if (e.type == SDL_KEYDOWN) | ||
| 982 | { | ||
| 983 | if ((e.key.keysym.sym == SDLK_LEFT) && (selection != 0)) | ||
| 984 | { | ||
| 985 | selection--; | ||
| 986 | } else if ((e.key.keysym.sym == SDLK_RIGHT) && (selection != 1)) | ||
| 987 | { | ||
| 988 | selection++; | ||
| 989 | } else if (e.key.keysym.sym == SDLK_RETURN) | ||
| 990 | { | ||
| 991 | switch (selection) | ||
| 992 | { | ||
| 993 | case 0: return new GameState(); | ||
| 994 | case 1: return new TitleState(); | ||
| 995 | } | ||
| 996 | } | ||
| 997 | } | ||
| 998 | } | ||
| 999 | } | ||
| 1000 | } | ||
| diff --git a/hslist.h b/hslist.h index 8d450af..844bf37 100644 --- a/hslist.h +++ b/hslist.h | |||
| @@ -32,7 +32,9 @@ class LocalHighscoreList : public HighscoreList { | |||
| 32 | class GlobalHighscoreList : public HighscoreList { | 32 | class GlobalHighscoreList : public HighscoreList { |
| 33 | public: | 33 | public: |
| 34 | GlobalHighscoreList(); | 34 | GlobalHighscoreList(); |
| 35 | GlobalHighscoreList(Highscore* h); | ||
| 35 | SDL_Surface* render(); | 36 | SDL_Surface* render(); |
| 37 | bool didFail(); | ||
| 36 | 38 | ||
| 37 | private: | 39 | private: |
| 38 | typedef HighscoreList super; | 40 | typedef HighscoreList super; |
| @@ -91,4 +93,37 @@ class NewHighscoreState : public State { | |||
| 91 | Highscore* h; | 93 | Highscore* h; |
| 92 | }; | 94 | }; |
| 93 | 95 | ||
| 96 | class SubmitHighscoreState : public State { | ||
| 97 | public: | ||
| 98 | SubmitHighscoreState(Highscore* h); | ||
| 99 | State* operator() (SDL_Window* window, SDL_Renderer* renderer); | ||
| 100 | |||
| 101 | protected: | ||
| 102 | Highscore* h; | ||
| 103 | SDL_mutex* m; | ||
| 104 | GlobalHighscoreList* lhl; | ||
| 105 | |||
| 106 | private: | ||
| 107 | static int SubmitHighscore(void* pParam); | ||
| 108 | }; | ||
| 109 | |||
| 110 | class FailedSubmittingHighscoreState : public State { | ||
| 111 | public: | ||
| 112 | FailedSubmittingHighscoreState(Highscore* h); | ||
| 113 | State* operator() (SDL_Window* window, SDL_Renderer* renderer); | ||
| 114 | |||
| 115 | private: | ||
| 116 | Highscore* h; | ||
| 117 | }; | ||
| 118 | |||
| 119 | class SubmittedHighscoreState : public State { | ||
| 120 | public: | ||
| 121 | SubmittedHighscoreState(GlobalHighscoreList* lhl, Highscore* h); | ||
| 122 | State* operator() (SDL_Window* window, SDL_Renderer* renderer); | ||
| 123 | |||
| 124 | private: | ||
| 125 | GlobalHighscoreList* lhl; | ||
| 126 | Highscore* h; | ||
| 127 | }; | ||
| 128 | |||
| 94 | #endif | 129 | #endif |
