summary refs log tree commit diff stats
path: root/hslist.cpp
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2009-11-08 13:42:14 -0500
committerKelly Rauchenberger <fefferburbia@gmail.com>2009-11-08 13:42:14 -0500
commitba90715d26e84fd176a0d44bd8e5dde826067d93 (patch)
treea5f0ca481895197f1d0e5db341e7263e3fcc0529 /hslist.cpp
parentc027f1b9cd6c9deb60931a7f9f75bb4ee130291b (diff)
downloadmazeoflife-ba90715d26e84fd176a0d44bd8e5dde826067d93.tar.gz
mazeoflife-ba90715d26e84fd176a0d44bd8e5dde826067d93.tar.bz2
mazeoflife-ba90715d26e84fd176a0d44bd8e5dde826067d93.zip
Added global highscore list
You can now view and submit highscores to the global highscore list. If the connection fails, you are allowed to retry sending it so your score is not
lost. The actual global highscore list is a PHP file and MySQL database that will need to be uploaded to Four Island Other for this to work.

Some other things were done. Because it was discovered that the frequent window caption changes were making Maze Of Life crash, they were removed and the
player is now notified of their score by the level number appearing in 100 point font at the beginning of each level during the doneWorking stage. Also,
a cheat was added that allows you to play the game in fullscreen if you press F4 on a supporting platform. The player is now also slightly faster.

Closes #104
Diffstat (limited to 'hslist.cpp')
-rw-r--r--hslist.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/hslist.cpp b/hslist.cpp index d2901b4..ec99a77 100644 --- a/hslist.cpp +++ b/hslist.cpp
@@ -76,10 +76,123 @@ std::vector<Highscore> HighscoreList::getLocalHighscores()
76 76
77std::vector<Highscore> HighscoreList::getGlobalHighscores() 77std::vector<Highscore> HighscoreList::getGlobalHighscores()
78{ 78{
79 IPaddress ipaddress;
79 80
81 if (SDLNet_ResolveHost(&ipaddress, "other.fourisland.com", 80) == -1)
82 {
83 printf("Could not resolve host \"other.fourisland.com\": %s\n", SDLNet_GetError());
84 throw 1;
85 }
86
87 TCPsocket tcpsock = SDLNet_TCP_Open(&ipaddress);
88 if (!tcpsock)
89 {
90 printf("Could not connect to host \"other.fourisland.com\": %s\n", SDLNet_GetError());
91 throw 2;
92 }
93
94 char* headers = "GET /mol/hslist.php HTTP/1.1\nHost: other.fourisland.com\nUser-Agent: Maze Of Life v2.0\nAccept: text/plain\nKeep-Alive: 300\nConnection: keep-alive\n\n";
95 if (SDLNet_TCP_Send(tcpsock, headers, strlen(headers)+1) < strlen(headers))
96 {
97 printf("Connection closed by peer: %s\n", SDLNet_GetError());
98 throw 3;
99 }
100
101 std::stringstream download(std::stringstream::in | std::stringstream::out);
102 char hslist[1024];
103 SDLNet_TCP_Recv(tcpsock, hslist, 1024);
104 download << hslist;
105 SDLNet_TCP_Close(tcpsock);
106
107 char temps[256];
108 download.getline(temps,256);
109 while (strlen(temps) != 1)
110 {
111 download.getline(temps,256);
112 }
113
114 std::vector<Highscore> temp = std::vector<Highscore>();
115 int scores;
116 download.getline(temps, 256);
117 if (sscanf(temps, "%d%*c", &scores) != 1)
118 {
119 printf("Recieved data is of an invalid format: %s\n", temps);
120 throw 4;
121 }
122
123 for (int i=0; i<scores; i++)
124 {
125 int namelen;
126 char namelens[13];
127 char* name = (char*) calloc(25, sizeof(char));
128 int score;
129 download.getline(temps, 256);
130
131 if (sscanf(temps, "%d", &namelen) != 1)
132 {
133 printf("Recieved data is of an invalid format: %s\n", temps);
134 throw 4;
135 }
136
137 sprintf(namelens, "%%*d%%%dc", namelen);
138
139 if (sscanf(temps, namelens, name) != 1)
140 {
141 printf("Recieved data is of an invalid format: %s\n", temps);
142 throw 4;
143 }
144
145 sprintf(namelens, "%%*d%%*%dc%%d%%*c", namelen);
146
147 if (sscanf(temps, namelens, &score) != 1)
148 {
149 printf("Recieved data is of an invalid format: %s\n", temps);
150 throw 4;
151 }
152
153 Highscore h = Highscore(name, score);
154 h.setRank(i+1);
155
156 temp.push_back(h);
157 }
158
159 return temp;
80} 160}
81 161
82LocalHighscoreList::LocalHighscoreList() 162LocalHighscoreList::LocalHighscoreList()
83{ 163{
84 this->hslist = getLocalHighscores(); 164 this->hslist = getLocalHighscores();
85} 165}
166
167GlobalHighscoreList::GlobalHighscoreList()
168{
169 fail = false;
170
171 try
172 {
173 this->hslist = getGlobalHighscores();
174 } catch (int e)
175 {
176 fail = true;
177 }
178}
179
180SDL_Surface* GlobalHighscoreList::render()
181{
182 if (fail)
183 {
184 SDL_Surface* tmp = SDL_CreateRGBSurface(SDL_SWSURFACE || SDL_SRCCOLORKEY, 480, 480, 32, 0,0,0,0);
185 Uint32 bgColor = SDL_MapRGB(tmp->format, 255, 255, 255);
186 SDL_FillRect(tmp, NULL, bgColor);
187 SDL_SetColorKey(tmp, SDL_SRCCOLORKEY, bgColor);
188 TTF_Font* dataFont = loadFont(25);
189 SDL_Color fontColor = {0, 0, 0, 0};
190 SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Error retrieving highscores", fontColor);
191 SDL_Rect tSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h};
192 SDL_BlitSurface(text, NULL, tmp, &tSpace);
193
194 return tmp;
195 } else {
196 return super::render();
197 }
198}