summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--chlstate.cpp6
-rw-r--r--gamestate.cpp83
-rw-r--r--gamestate.h4
-rw-r--r--hsglobal.cpp63
-rw-r--r--hsglobal.h18
-rw-r--r--hslist.cpp113
-rw-r--r--hslist.h12
-rw-r--r--hslocal.cpp2
-rw-r--r--hsnew.cpp5
-rw-r--r--hssubmit.cpp226
-rw-r--r--hssubmit.h34
-rw-r--r--htpstate.cpp2
-rw-r--r--includes.h6
-rw-r--r--mazeoflife.cpp23
-rw-r--r--mazeoflife.h2
-rw-r--r--titlestate.cpp2
17 files changed, 545 insertions, 60 deletions
diff --git a/Makefile b/Makefile index b4a9b9b..27d70a9 100644 --- a/Makefile +++ b/Makefile
@@ -12,9 +12,9 @@ WINSRC = $(addsuffix win,$(SOURCES))
12RES = $(wildcard resources/*) 12RES = $(wildcard resources/*)
13CRES = $(patsubst resources/%,build/%,$(addsuffix .o,$(RES))) 13CRES = $(patsubst resources/%,build/%,$(addsuffix .o,$(RES)))
14LINCCFL = `sdl-config --cflags` 14LINCCFL = `sdl-config --cflags`
15LINLDFL = `sdl-config --libs` -lSDL_ttf 15LINLDFL = `sdl-config --libs` -lSDL_ttf -lSDL_net
16WINCCFL = `/opt/SDL-1.2.9/bin/i386-mingw32msvc-sdl-config --cflags` -DWINDOWS 16WINCCFL = `/opt/SDL-1.2.9/bin/i386-mingw32msvc-sdl-config --cflags` -DWINDOWS
17WINLDFL = `/opt/SDL-1.2.9/bin/i386-mingw32msvc-sdl-config --libs` -lSDL_ttf 17WINLDFL = `/opt/SDL-1.2.9/bin/i386-mingw32msvc-sdl-config --libs` -lSDL_ttf -lSDL_net
18 18
19all: init $(LTARGET) $(WTARGET) 19all: init $(LTARGET) $(WTARGET)
20linux: init $(LTARGET) 20linux: init $(LTARGET)
diff --git a/chlstate.cpp b/chlstate.cpp index 3f3000d..14182a2 100644 --- a/chlstate.cpp +++ b/chlstate.cpp
@@ -6,8 +6,6 @@ ChooseHighscoreListState::ChooseHighscoreListState()
6 LOADIMAGE(pointer,pointer) 6 LOADIMAGE(pointer,pointer)
7 7
8 selection = 0; 8 selection = 0;
9
10 SDL_WM_SetCaption("Maze Of Life - Choose Highscore List", NULL);
11} 9}
12 10
13void ChooseHighscoreListState::input(SDL_keysym key) 11void ChooseHighscoreListState::input(SDL_keysym key)
@@ -26,7 +24,9 @@ void ChooseHighscoreListState::input(SDL_keysym key)
26 changeState(new LocalHighscoreListState(false)); 24 changeState(new LocalHighscoreListState(false));
27 25
28 break; 26 break;
29 case 1: // Go to global highscore list 27 case 1:
28 changeState(new GlobalHighscoreListState());
29
30 break; 30 break;
31 case 2: 31 case 2:
32 changeState(new TitleState()); 32 changeState(new TitleState());
diff --git a/gamestate.cpp b/gamestate.cpp index 9a50b32..95d1769 100644 --- a/gamestate.cpp +++ b/gamestate.cpp
@@ -7,35 +7,34 @@ GameState::GameState()
7 7
8 newGame = false; 8 newGame = false;
9 9
10 info.playerx = 1; 10 info = new Info();
11 info.playery = 1; 11 info->playerx = 1;
12 info.level = Level(); 12 info->playery = 1;
13 info.doneMaking = false; 13 info->level = Level();
14 board = Board(&info); 14 info->doneMaking = false;
15 15 board = Board(info);
16 SDL_WM_SetCaption("Maze Of Life - Level 1", NULL);
17} 16}
18 17
19void GameState::input(SDL_keysym key) 18void GameState::input(SDL_keysym key)
20{ 19{
21 if (info.doneMaking) 20 if (info->doneMaking)
22 { 21 {
23 switch (key.sym) 22 switch (key.sym)
24 { 23 {
25 case SDLK_LEFT: 24 case SDLK_LEFT:
26 move(info.playerx-1, info.playery); 25 move(info->playerx-1, info->playery);
27 26
28 break; 27 break;
29 case SDLK_RIGHT: 28 case SDLK_RIGHT:
30 move(info.playerx+1, info.playery); 29 move(info->playerx+1, info->playery);
31 30
32 break; 31 break;
33 case SDLK_UP: 32 case SDLK_UP:
34 move(info.playerx, info.playery-1); 33 move(info->playerx, info->playery-1);
35 34
36 break; 35 break;
37 case SDLK_DOWN: 36 case SDLK_DOWN:
38 move(info.playerx, info.playery+1); 37 move(info->playerx, info->playery+1);
39 38
40 break; 39 break;
41 case SDLK_ESCAPE: 40 case SDLK_ESCAPE:
@@ -52,7 +51,7 @@ void GameState::input(SDL_keysym key)
52 { 51 {
53 fclose(hslist); 52 fclose(hslist);
54 53
55 changeState(new NewHighscoreState(info.level.getLevel())); 54 changeState(new NewHighscoreState(info->level.getLevel()));
56 } else { 55 } else {
57 for (int i=0; i<scores; i++) 56 for (int i=0; i<scores; i++)
58 { 57 {
@@ -71,15 +70,15 @@ void GameState::input(SDL_keysym key)
71 70
72 fclose(hslist); 71 fclose(hslist);
73 72
74 if (h->getLevel() < info.level.getLevel()) 73 if (h->getLevel() < info->level.getLevel())
75 { 74 {
76 changeState(new NewHighscoreState(info.level.getLevel())); 75 changeState(new NewHighscoreState(info->level.getLevel()));
77 } else { 76 } else {
78 changeState(new LocalHighscoreListState(true)); 77 changeState(new LocalHighscoreListState(true));
79 } 78 }
80 } 79 }
81 } else { 80 } else {
82 changeState(new NewHighscoreState(info.level.getLevel())); 81 changeState(new NewHighscoreState(info->level.getLevel()));
83 } 82 }
84 83
85 break; 84 break;
@@ -93,20 +92,17 @@ void GameState::tick()
93 { 92 {
94 switch (rand()%4) 93 switch (rand()%4)
95 { 94 {
96 case 0: info.playerx = 1; info.playery = 1; break; 95 case 0: info->playerx = 1; info->playery = 1; break;
97 case 1: info.playerx = 1; info.playery = HEIGHT-2; break; 96 case 1: info->playerx = 1; info->playery = HEIGHT-2; break;
98 case 2: info.playerx = WIDTH-2; info.playery = HEIGHT-2; break; 97 case 2: info->playerx = WIDTH-2; info->playery = HEIGHT-2; break;
99 case 3: info.playerx = WIDTH-2; info.playery = 1; break; 98 case 3: info->playerx = WIDTH-2; info->playery = 1; break;
100 } 99 }
101 100
102 info.level.incrementLevel(); 101 info->level.incrementLevel();
103 info.doneMaking = false; 102 info->doneMaking = false;
104 board = Board(&info); 103 info->gens = 0;
104 board = Board(info);
105 newGame = false; 105 newGame = false;
106
107 char title[32];
108 sprintf(title, "Maze Of Life - Level %d", info.level.getLevel());
109 SDL_WM_SetCaption(title, NULL);
110 } 106 }
111 107
112 board.tick(); 108 board.tick();
@@ -119,8 +115,8 @@ void GameState::move(int x, int y)
119 if (board.isObstructed(x,y)) return; 115 if (board.isObstructed(x,y)) return;
120 if ((x==15)&&(y==15)) newGame = true; 116 if ((x==15)&&(y==15)) newGame = true;
121 117
122 info.playerx = x; 118 info->playerx = x;
123 info.playery = y; 119 info->playery = y;
124} 120}
125 121
126void GameState::render(SDL_Surface* screen) 122void GameState::render(SDL_Surface* screen)
@@ -128,20 +124,31 @@ void GameState::render(SDL_Surface* screen)
128 // Paint maze 124 // Paint maze
129 board.render(screen); 125 board.render(screen);
130 126
131 // Paint player 127 // Paint event
132 SDL_Rect block; 128 SDL_Rect block;
133 block.x = info.playerx*16; 129 block.x = 15*16;
134 block.y = info.playery*16; 130 block.y = 15*16;
135 block.w = 16; 131 block.w = 16;
136 block.h = 16; 132 block.h = 16;
137 133
138 SDL_FillRect(screen, &block, player_color); 134 SDL_FillRect(screen, &block, event_color);
139 135
140 // Paint event 136 if (!info->doneMaking)
141 block.x = 15*16; 137 {
142 block.y = 15*16; 138 SDL_Color fontColor = {0, 0, 0, 0};
139 char levelnum[8];
140 sprintf(levelnum, "%d", info->level.getLevel());
141 SDL_Surface* title = TTF_RenderText_Solid(loadFont(100), levelnum, fontColor);
142 SDL_Rect tSpace = {240-(title->w/2), 240-(title->h/2), title->w, title->h};
143 SDL_FillRect(screen, NULL, info->level.getDeadColor());
144 SDL_BlitSurface(title, NULL, screen, &tSpace);
145 }
143 146
144 SDL_FillRect(screen, &block, event_color); 147 // Paint player
148 block.x = info->playerx*16;
149 block.y = info->playery*16;
150
151 SDL_FillRect(screen, &block, player_color);
145} 152}
146 153
147GameState::Level::Level() 154GameState::Level::Level()
@@ -292,7 +299,7 @@ void GameState::Board::tick()
292 } 299 }
293 } 300 }
294 301
295 if (!info->doneMaking && ++gens > 100) info->doneMaking = true; 302 if (!info->doneMaking && ++info->gens > 50) info->doneMaking = true;
296} 303}
297 304
298void GameState::Board::incrementIfNeighbor(int x, int y, bool temp[WIDTH][HEIGHT], int* tick) 305void GameState::Board::incrementIfNeighbor(int x, int y, bool temp[WIDTH][HEIGHT], int* tick)
diff --git a/gamestate.h b/gamestate.h index d1b90ad..28b85c0 100644 --- a/gamestate.h +++ b/gamestate.h
@@ -29,6 +29,7 @@ class GameState : public State {
29 int playerx, playery; 29 int playerx, playery;
30 Level level; 30 Level level;
31 bool doneMaking; 31 bool doneMaking;
32 int gens;
32 }; 33 };
33 34
34 class Board 35 class Board
@@ -37,7 +38,6 @@ class GameState : public State {
37 bool blocks[WIDTH][HEIGHT]; 38 bool blocks[WIDTH][HEIGHT];
38 void incrementIfNeighbor(int x, int y, bool temp[WIDTH][HEIGHT], int* tick); 39 void incrementIfNeighbor(int x, int y, bool temp[WIDTH][HEIGHT], int* tick);
39 GameState::Info* info; 40 GameState::Info* info;
40 int gens;
41 41
42 public: 42 public:
43 Board(); 43 Board();
@@ -51,7 +51,7 @@ class GameState : public State {
51 Uint32 player_color; 51 Uint32 player_color;
52 Uint32 event_color; 52 Uint32 event_color;
53 bool newGame; 53 bool newGame;
54 Info info; 54 Info* info;
55 Board board; 55 Board board;
56 void move(int x, int y); 56 void move(int x, int y);
57}; 57};
diff --git a/hsglobal.cpp b/hsglobal.cpp new file mode 100644 index 0000000..37db44b --- /dev/null +++ b/hsglobal.cpp
@@ -0,0 +1,63 @@
1#include "includes.h"
2
3GlobalHighscoreListState::GlobalHighscoreListState()
4{
5 LOADIMAGE(options,hlo_rtm)
6 LOADIMAGE(pointer,pointer)
7
8 list = SDL_CreateRGBSurface(SDL_SWSURFACE || SDL_SRCCOLORKEY, 480, 480, 32, 0,0,0,0);
9 Uint32 bgColor = SDL_MapRGB(list->format, 255, 255, 255);
10 SDL_FillRect(list, NULL, bgColor);
11 SDL_SetColorKey(list, SDL_SRCCOLORKEY, bgColor);
12 TTF_Font* dataFont = loadFont(25);
13 SDL_Color fontColor = {0, 0, 0, 0};
14 SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Fetching highscores....", fontColor);
15 SDL_Rect aSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h};
16 SDL_BlitSurface(text, NULL, list, &aSpace);
17
18 SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor);
19 SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h};
20 SDL_BlitSurface(title, NULL, list, &tSpace);
21
22 SDL_Rect oSpace = {0, 440, options->w, options->h};
23 SDL_BlitSurface(options, NULL, list, &oSpace);
24
25 SDL_CreateThread(&LoadHighscoreList, this);
26}
27
28int GlobalHighscoreListState::LoadHighscoreList(void* pParam)
29{
30 GlobalHighscoreList* lhl = new GlobalHighscoreList();
31 ((GlobalHighscoreListState*)pParam)->list = lhl->render();
32
33 SDL_Color fontColor = {0, 0, 0, 0};
34 SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor);
35 SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h};
36 SDL_BlitSurface(title, NULL, ((GlobalHighscoreListState*)pParam)->list, &tSpace);
37
38 SDL_Rect oSpace = {0, 440, ((GlobalHighscoreListState*)pParam)->options->w, ((GlobalHighscoreListState*)pParam)->options->h};
39 SDL_BlitSurface(((GlobalHighscoreListState*)pParam)->options, NULL, ((GlobalHighscoreListState*)pParam)->list, &oSpace);
40}
41
42void GlobalHighscoreListState::input(SDL_keysym key)
43{
44 if (key.sym == SDLK_RETURN)
45 {
46 changeState(new ChooseHighscoreListState());
47 }
48}
49
50void GlobalHighscoreListState::render(SDL_Surface* screen)
51{
52 SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
53
54 SDL_BlitSurface(list, NULL, screen, NULL);
55
56 SDL_Rect pSpace;
57 pSpace.x = 137;
58 pSpace.y = 449;
59 pSpace.w = pointer->w;
60 pSpace.h = pointer->h;
61
62 SDL_BlitSurface(pointer, NULL, screen, &pSpace);
63}
diff --git a/hsglobal.h b/hsglobal.h new file mode 100644 index 0000000..5b92b0e --- /dev/null +++ b/hsglobal.h
@@ -0,0 +1,18 @@
1#ifndef HSGLOBAL_H
2#define HSGLOBAL_H
3
4class GlobalHighscoreListState : public State {
5 public:
6 GlobalHighscoreListState();
7 void input(SDL_keysym key);
8 void render(SDL_Surface* screen);
9
10 private:
11 static int LoadHighscoreList(void* pParam);
12
13 SDL_Surface* list;
14 SDL_Surface* options;
15 SDL_Surface* pointer;
16};
17
18#endif
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}
diff --git a/hslist.h b/hslist.h index 88c47c4..bebb85a 100644 --- a/hslist.h +++ b/hslist.h
@@ -18,4 +18,16 @@ class LocalHighscoreList : public HighscoreList {
18 LocalHighscoreList(); 18 LocalHighscoreList();
19}; 19};
20 20
21class GlobalHighscoreList : public HighscoreList {
22 public:
23 GlobalHighscoreList();
24 SDL_Surface* render();
25
26 private:
27 typedef HighscoreList super;
28
29 protected:
30 bool fail;
31};
32
21#endif 33#endif
diff --git a/hslocal.cpp b/hslocal.cpp index 17cae1b..c53f397 100644 --- a/hslocal.cpp +++ b/hslocal.cpp
@@ -25,8 +25,6 @@ LocalHighscoreListState::LocalHighscoreListState(bool fromGame)
25 SDL_BlitSurface(options, NULL, list, &oSpace); 25 SDL_BlitSurface(options, NULL, list, &oSpace);
26 26
27 selection = 0; 27 selection = 0;
28
29 SDL_WM_SetCaption("Maze Of Life - Highscore List", NULL);
30} 28}
31 29
32void LocalHighscoreListState::input(SDL_keysym key) 30void LocalHighscoreListState::input(SDL_keysym key)
diff --git a/hsnew.cpp b/hsnew.cpp index 3bec468..8b752a6 100644 --- a/hsnew.cpp +++ b/hsnew.cpp
@@ -38,7 +38,6 @@ NewHighscoreState::NewHighscoreState(int level)
38 rntSpace.w = newName->w; 38 rntSpace.w = newName->w;
39 rntSpace.h = newName->h; 39 rntSpace.h = newName->h;
40 40
41 SDL_WM_SetCaption("Maze Of Life - New Highscore!", NULL);
42 SDL_EnableUNICODE(1); 41 SDL_EnableUNICODE(1);
43} 42}
44 43
@@ -99,7 +98,9 @@ void NewHighscoreState::input(SDL_keysym key)
99 changeState(new GameState()); 98 changeState(new GameState());
100 99
101 break; 100 break;
102 case 1: // Submit score to Global highscore list 101 case 1:
102 changeState(new SubmitHighscoreListState(hsname, level));
103
103 break; 104 break;
104 case 2: 105 case 2:
105 changeState(new TitleState()); 106 changeState(new TitleState());
diff --git a/hssubmit.cpp b/hssubmit.cpp new file mode 100644 index 0000000..690749a --- /dev/null +++ b/hssubmit.cpp
@@ -0,0 +1,226 @@
1#include "includes.h"
2
3SubmitHighscoreListState::SubmitHighscoreListState(char* hsname, int level)
4{
5 LOADIMAGE(pointer,pointer)
6
7 this->hsname = hsname;
8 this->level = level;
9 this->scoreSent = false;
10 this->selection = 0;
11
12 list = SDL_CreateRGBSurface(SDL_SWSURFACE || SDL_SRCCOLORKEY, 480, 480, 32, 0,0,0,0);
13 Uint32 bgColor = SDL_MapRGB(list->format, 255, 255, 255);
14 SDL_FillRect(list, NULL, bgColor);
15 SDL_SetColorKey(list, SDL_SRCCOLORKEY, bgColor);
16 TTF_Font* dataFont = loadFont(25);
17 SDL_Color fontColor = {0, 0, 0, 0};
18 SDL_Surface* text = TTF_RenderText_Blended(dataFont, "Sending highscore....", fontColor);
19 SDL_Rect aSpace = {240-(text->w/2), 240-(text->h/2), text->w, text->h};
20 SDL_BlitSurface(text, NULL, list, &aSpace);
21
22 SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor);
23 SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h};
24 SDL_BlitSurface(title, NULL, list, &tSpace);
25
26 SDL_CreateThread(&LoadHighscoreList, this);
27}
28
29int SubmitHighscoreListState::LoadHighscoreList(void* pParam)
30{
31 SubmitHighscoreList* lhl = new SubmitHighscoreList(((SubmitHighscoreListState*)pParam)->hsname, ((SubmitHighscoreListState*)pParam)->level);
32 ((SubmitHighscoreListState*)pParam)->list = lhl->render();
33
34 SDL_Color fontColor = {0, 0, 0, 0};
35 SDL_Surface* title = TTF_RenderText_Blended(loadFont(40), "Highscore List", fontColor);
36 SDL_Rect tSpace = {240-(title->w/2), 0, title->w, title->h};
37 SDL_BlitSurface(title, NULL, ((SubmitHighscoreListState*)pParam)->list, &tSpace);
38
39 if (lhl->hasFailed())
40 {
41 LOADIMAGE(((SubmitHighscoreListState*)pParam)->options,hlo_passartm)
42 } else {
43 LOADIMAGE(((SubmitHighscoreListState*)pParam)->options,hlo_paartm)
44 }
45
46 SDL_Rect oSpace = {0, 440, ((SubmitHighscoreListState*)pParam)->options->w, ((SubmitHighscoreListState*)pParam)->options->h};
47 SDL_BlitSurface(((SubmitHighscoreListState*)pParam)->options, NULL, ((SubmitHighscoreListState*)pParam)->list, &oSpace);
48
49 ((SubmitHighscoreListState*)pParam)->fail = lhl->hasFailed();
50 ((SubmitHighscoreListState*)pParam)->newpos = lhl->getNewPos();
51 ((SubmitHighscoreListState*)pParam)->scoreSent = true;
52}
53
54void SubmitHighscoreListState::input(SDL_keysym key)
55{
56 if (scoreSent)
57 {
58 if ((key.sym == SDLK_LEFT) && (selection != 0))
59 {
60 selection--;
61 } else if ((key.sym == SDLK_RIGHT) && (selection != (fail?2:1)))
62 {
63 selection++;
64 } else if (key.sym == SDLK_RETURN)
65 {
66 if (fail)
67 {
68 switch (selection)
69 {
70 case 0:
71 changeState(new GameState());
72
73 break;
74 case 1:
75 changeState(new SubmitHighscoreListState(hsname, level));
76
77 break;
78 case 2:
79 changeState(new TitleState());
80
81 break;
82 }
83 } else {
84 switch (selection)
85 {
86 case 0:
87 changeState(new GameState());
88
89 break;
90 case 1:
91 changeState(new TitleState());
92
93 break;
94 }
95 }
96 }
97 }
98}
99
100void SubmitHighscoreListState::render(SDL_Surface* screen)
101{
102 SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
103
104 if (scoreSent)
105 {
106 SDL_Rect pSpace;
107 if (fail)
108 {
109 pSpace.x = (selection==0?13:(selection==1?138:284));
110 pSpace.y = 448;
111 } else {
112 pSpace.x = (selection==0?52:225);
113 pSpace.y = 447;
114 }
115 pSpace.w = pointer->w;
116 pSpace.h = pointer->h;
117
118 SDL_BlitSurface(pointer, NULL, screen, &pSpace);
119
120 SDL_Rect eSpace = {0, newpos*40, 480, 40};
121 SDL_FillRect(screen, &eSpace, SDL_MapRGB(screen->format, 255, 255, 0));
122 }
123
124 SDL_BlitSurface(list, NULL, screen, NULL);
125}
126
127SubmitHighscoreListState::SubmitHighscoreList::SubmitHighscoreList(char* hsname, int level)
128{
129 fail = false;
130
131 try
132 {
133 IPaddress ipaddress;
134
135 if (SDLNet_ResolveHost(&ipaddress, "other.fourisland.com", 80) == -1)
136 {
137 printf("Could not resolve host \"other.fourisland.com\": %s\n", SDLNet_GetError());
138 throw 1;
139 }
140
141 TCPsocket tcpsock = SDLNet_TCP_Open(&ipaddress);
142 if (!tcpsock)
143 {
144 printf("Could not connect to host \"other.fourisland.com\": %s\n", SDLNet_GetError());
145 throw 2;
146 }
147
148 char body[256];
149 sprintf(body, "name=%s&level=%d", hsname, level);
150 char headers[256];
151 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", strlen(body), body);
152 if (SDLNet_TCP_Send(tcpsock, headers, strlen(headers)+1) < strlen(headers))
153 {
154 printf("Connection closed by peer: %s\n", SDLNet_GetError());
155 throw 3;
156 }
157
158 std::stringstream download(std::stringstream::in | std::stringstream::out);
159 char hslist[1024];
160 SDLNet_TCP_Recv(tcpsock, hslist, 1024);
161 download << hslist;
162 SDLNet_TCP_Close(tcpsock);
163
164 char temps[256];
165 download.getline(temps,256);
166 while (strlen(temps) != 1)
167 {
168 download.getline(temps,256);
169 }
170
171 int rank;
172 download.getline(temps, 256);
173 if (sscanf(temps, "%d%*c", &rank) != 1)
174 {
175 printf("Recieved data is of an invalid format: %s\n", temps);
176 throw 4;
177 }
178
179 this->hslist = getGlobalHighscores();
180
181 if (this->hslist.empty())
182 {
183 printf("Global Highscore List cannot be empty after adding a score to it.\n");
184 throw 5;
185 }
186
187 if (rank > 10)
188 {
189 Highscore temph(hsname, level);
190 temph.setRank(rank);
191
192 this->hslist[9] = temph;
193 this->newpos = 10;
194 } else {
195 std::vector<Highscore>::iterator it;
196 bool found = false;
197
198 for (it=this->hslist.begin(); it<this->hslist.end(); it++)
199 {
200 Highscore h = *it;
201
202 if (!found)
203 {
204 if ((strcmp(h.getName(),hsname) == 0) && (h.getLevel() == level))
205 {
206 this->newpos = h.getRank();
207 found = true;
208 }
209 }
210 }
211 }
212 } catch (int e)
213 {
214 fail = true;
215 }
216}
217
218int SubmitHighscoreListState::SubmitHighscoreList::getNewPos()
219{
220 return newpos;
221}
222
223bool SubmitHighscoreListState::SubmitHighscoreList::hasFailed()
224{
225 return fail;
226}
diff --git a/hssubmit.h b/hssubmit.h new file mode 100644 index 0000000..243dab8 --- /dev/null +++ b/hssubmit.h
@@ -0,0 +1,34 @@
1#ifndef HSSUBMIT_H
2#define HSSUBMIT_H
3
4class SubmitHighscoreListState : public State {
5 public:
6 SubmitHighscoreListState(char* hsname, int level);
7 void input(SDL_keysym key);
8 void render(SDL_Surface* screen);
9
10 private:
11 static int LoadHighscoreList(void* pParam);
12
13 class SubmitHighscoreList : public GlobalHighscoreList {
14 public:
15 SubmitHighscoreList(char* hsname, int level);
16 int getNewPos();
17 bool hasFailed();
18
19 private:
20 int newpos;
21 };
22
23 SDL_Surface* list;
24 SDL_Surface* options;
25 SDL_Surface* pointer;
26 char* hsname;
27 int level;
28 bool scoreSent;
29 int selection;
30 int newpos;
31 bool fail;
32};
33
34#endif
diff --git a/htpstate.cpp b/htpstate.cpp index da4b6a2..03d02c6 100644 --- a/htpstate.cpp +++ b/htpstate.cpp
@@ -8,8 +8,6 @@ HowToPlayState::HowToPlayState()
8 8
9 secondPage = false; 9 secondPage = false;
10 selection = 0; 10 selection = 0;
11
12 SDL_WM_SetCaption("Maze Of Life - How To Play", NULL);
13} 11}
14 12
15void HowToPlayState::input(SDL_keysym key) 13void HowToPlayState::input(SDL_keysym key)
diff --git a/includes.h b/includes.h index cd5c1e9..b7c0d56 100644 --- a/includes.h +++ b/includes.h
@@ -1,10 +1,14 @@
1#include <SDL.h> 1#include <SDL.h>
2#include <SDL_ttf.h> 2#include <SDL_ttf.h>
3#include <SDL_net.h>
4#include <SDL_thread.h>
3#include <stdio.h> 5#include <stdio.h>
4#include <time.h> 6#include <time.h>
5#include <string> 7#include <string>
6#include <vector> 8#include <vector>
7#include <fstream> 9#include <fstream>
10#include <sstream>
11#include <exception>
8#include "state.h" 12#include "state.h"
9#include "mazeoflife.h" 13#include "mazeoflife.h"
10#include "resources.h" 14#include "resources.h"
@@ -16,3 +20,5 @@
16#include "hslist.h" 20#include "hslist.h"
17#include "hslocal.h" 21#include "hslocal.h"
18#include "hsnew.h" 22#include "hsnew.h"
23#include "hsglobal.h"
24#include "hssubmit.h"
diff --git a/mazeoflife.cpp b/mazeoflife.cpp index c744b28..45fc377 100644 --- a/mazeoflife.cpp +++ b/mazeoflife.cpp
@@ -19,9 +19,16 @@ int main(int argc, char *argv[])
19 exit(-1); 19 exit(-1);
20 } 20 }
21 21
22 if (SDLNet_Init() == -1)
23 {
24 printf("Cound not initalize SDL_net: %s.\n", SDLNet_GetError());
25 exit(-1);
26 }
27
22 /* Clean up on exit */ 28 /* Clean up on exit */
23 atexit(SDL_Quit); 29 atexit(SDL_Quit);
24 atexit(TTF_Quit); 30 atexit(TTF_Quit);
31 atexit(SDLNet_Quit);
25 32
26 SDL_WM_SetCaption("Maze Of Life", NULL); 33 SDL_WM_SetCaption("Maze Of Life", NULL);
27 34
@@ -39,7 +46,7 @@ int main(int argc, char *argv[])
39 exit(1); 46 exit(1);
40 } 47 }
41 48
42 SDL_EnableKeyRepeat(100, 50); 49 SDL_EnableKeyRepeat(100, 70);
43 50
44 state = new TitleState(); 51 state = new TitleState();
45 52
@@ -57,15 +64,16 @@ int main(int argc, char *argv[])
57 64
58 break; 65 break;
59 case SDL_KEYDOWN: 66 case SDL_KEYDOWN:
60 state->input(anEvent.key.keysym); 67 if (anEvent.key.keysym.sym == SDLK_F4)
68 {
69 SDL_WM_ToggleFullScreen(screen);
70 } else {
71 state->input(anEvent.key.keysym);
72 }
61 73
62 break; 74 break;
63 } 75 }
64 } 76 }
65
66 state->render(screen);
67
68 SDL_Flip(screen);
69 } 77 }
70 78
71 exit(0); 79 exit(0);
@@ -101,6 +109,9 @@ void changeState(State* nState)
101Uint32 tick(Uint32 interval, void *param) 109Uint32 tick(Uint32 interval, void *param)
102{ 110{
103 state->tick(); 111 state->tick();
112 state->render(screen);
113
114 SDL_Flip(screen);
104 115
105 return interval; 116 return interval;
106} 117}
diff --git a/mazeoflife.h b/mazeoflife.h index 411a87b..00a31cf 100644 --- a/mazeoflife.h +++ b/mazeoflife.h
@@ -3,7 +3,7 @@
3 3
4const int WIDTH = 30; 4const int WIDTH = 30;
5const int HEIGHT = 30; 5const int HEIGHT = 30;
6const int TICKDELAY = 10; 6const int TICKDELAY = 5;
7 7
8void wrap(int* x, int* y); 8void wrap(int* x, int* y);
9Uint32 getColor(int r, int g, int b); 9Uint32 getColor(int r, int g, int b);
diff --git a/titlestate.cpp b/titlestate.cpp index ae18c48..2622caa 100644 --- a/titlestate.cpp +++ b/titlestate.cpp
@@ -6,8 +6,6 @@ TitleState::TitleState()
6 LOADIMAGE(pointer,pointer) 6 LOADIMAGE(pointer,pointer)
7 7
8 selection = 0; 8 selection = 0;
9
10 SDL_WM_SetCaption("Maze Of Life", NULL);
11} 9}
12 10
13void TitleState::input(SDL_keysym key) 11void TitleState::input(SDL_keysym key)