summary refs log tree commit diff stats
path: root/gamestate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gamestate.cpp')
-rw-r--r--gamestate.cpp180
1 files changed, 167 insertions, 13 deletions
diff --git a/gamestate.cpp b/gamestate.cpp index d1c17b2..e5c8d9f 100644 --- a/gamestate.cpp +++ b/gamestate.cpp
@@ -7,7 +7,7 @@ GameState::GameState()
7 newGame = true; 7 newGame = true;
8 doneMaking = false; 8 doneMaking = false;
9 9
10 level = Level(); 10 info.level = Level();
11} 11}
12 12
13void GameState::input(SDLKey key) 13void GameState::input(SDLKey key)
@@ -17,19 +17,19 @@ void GameState::input(SDLKey key)
17 switch (key) 17 switch (key)
18 { 18 {
19 case SDLK_LEFT: 19 case SDLK_LEFT:
20 move(playerx-1, playery); 20 move(info.playerx-1, info.playery);
21 21
22 break; 22 break;
23 case SDLK_RIGHT: 23 case SDLK_RIGHT:
24 move(playerx+1, playery); 24 move(info.playerx+1, info.playery);
25 25
26 break; 26 break;
27 case SDLK_UP: 27 case SDLK_UP:
28 move(playerx, playery-1); 28 move(info.playerx, info.playery-1);
29 29
30 break; 30 break;
31 case SDLK_DOWN: 31 case SDLK_DOWN:
32 move(playerx, playery+1); 32 move(info.playerx, info.playery+1);
33 33
34 break; 34 break;
35 } 35 }
@@ -40,12 +40,14 @@ void GameState::tick()
40{ 40{
41 if (newGame) 41 if (newGame)
42 { 42 {
43 playerx = 1; 43 info.playerx = 1;
44 playery = 1; 44 info.playery = 1;
45 board = Board(level); 45 board = Board(&info);
46 newGame = false; 46 newGame = false;
47 doneMaking = true; 47 doneMaking = true;
48 } 48 }
49
50 board.tick();
49} 51}
50 52
51void GameState::move(int x, int y) 53void GameState::move(int x, int y)
@@ -54,19 +56,171 @@ void GameState::move(int x, int y)
54 56
55 if (board.isObstructed(x,y)) return; 57 if (board.isObstructed(x,y)) return;
56 58
57 playerx = x; 59 info.playerx = x;
58 playery = y; 60 info.playery = y;
59} 61}
60 62
61void GameState::render(SDL_Surface* screen) 63void GameState::render(SDL_Surface* screen)
62{ 64{
63 board.render(screen, level); 65 board.render(screen);
64 66
65 SDL_Rect block; 67 SDL_Rect block;
66 block.x = playerx*16; 68 block.x = info.playerx*16;
67 block.y = playery*16; 69 block.y = info.playery*16;
68 block.w = 16; 70 block.w = 16;
69 block.h = 16; 71 block.h = 16;
70 72
71 SDL_FillRect(screen, &block, player_color); 73 SDL_FillRect(screen, &block, player_color);
72} 74}
75
76GameState::Level::Level()
77{
78 level = 1;
79
80 alive[0] = getColor(0, 0, 0); // Black
81 alive[1] = getColor(255, 0, 0); // Red
82 alive[2] = getColor(0, 255, 0); // Green
83 alive[3] = getColor(85, 85, 85); // Dark Gray
84 alive[4] = getColor(255, 0, 255); // Magenta
85
86 dead[0] = getColor(255, 255, 255); // White
87 dead[1] = getColor(255, 192, 203); // Pink
88 dead[2] = getColor(0, 255, 255); // Cyan
89 dead[3] = getColor(170, 170, 170); // Light Gray
90 dead[4] = getColor(255, 128, 0); // Orange
91}
92
93int GameState::Level::getLevel()
94{
95 return level;
96}
97
98int GameState::Level::getLevelGroup()
99{
100 return (level/10)+1;
101}
102
103bool GameState::Level::checkSquare(int x, int y)
104{
105 switch (getLevelGroup())
106 {
107 case 1:
108 return ((x>13)&&(x<16)&&(y>13)&&(y<16));
109 case 2:
110 return ((x>13)&&(x<17)&&(y>13)&&(y<17));
111 case 3:
112 case 4:
113 return ((x>12)&&(x<18)&&(y>12)&&(y<18));
114 case 5:
115 case 6:
116 return ((x>11)&&(x<19)&&(y>11)&&(y<19));
117 default:
118 return true;
119 }
120}
121
122Uint32 GameState::Level::getAliveColor()
123{
124 return alive[(getLevelGroup()-1)%5];
125}
126
127Uint32 GameState::Level::getDeadColor()
128{
129 return dead[(getLevelGroup()-1)%5];
130}
131
132GameState::Board::Board()
133{
134 GameState::Board::Board(new GameState::Info());
135}
136
137GameState::Board::Board(GameState::Info* info)
138{
139 this->info = info;
140
141 int x,y;
142 for (y=0;y<HEIGHT;y++)
143 {
144 for (x=0;x<WIDTH;x++)
145 {
146 if (info->level.checkSquare(x, y))
147 {
148 blocks[x][y] = rand() % 2;
149 } else {
150 blocks[x][y] = false;
151 }
152 }
153 }
154}
155
156bool GameState::Board::isObstructed(int x, int y)
157{
158 return blocks[x][y];
159}
160
161void GameState::Board::render(SDL_Surface* screen)
162{
163 SDL_Rect block;
164 block.w = 16;
165 block.h = 16;
166
167 int x,y;
168
169 for (y=0;y<HEIGHT;y++)
170 {
171 for (x=0;x<WIDTH;x++)
172 {
173 block.x = x*16;
174 block.y = y*16;
175
176 SDL_FillRect(screen, &block, (blocks[x][y] ? info->level.getAliveColor() : info->level.getDeadColor()));
177 }
178 }
179}
180
181void GameState::Board::tick()
182{
183 bool temp[WIDTH][HEIGHT];
184 int x,y;
185 for (x=0;x<WIDTH;x++)
186 {
187 for (y=0;y<HEIGHT;y++)
188 {
189 temp[x][y] = blocks[x][y];
190 }
191 }
192
193 for (x=0;x<WIDTH;x++)
194 {
195 for (y=0;y<HEIGHT;y++)
196 {
197 int neighbors = 0;
198
199 if ((x>0)&&(y>0)) incrementIfNeighbor(x-1,y-1,temp,&neighbors);
200 if ((x>0)) incrementIfNeighbor(x-1,y,temp,&neighbors);
201 if ((x>0)&&(y<HEIGHT-1)) incrementIfNeighbor(x-1,y+1,temp,&neighbors);
202 if ((y>0)) incrementIfNeighbor(x,y-1,temp,&neighbors);
203 if ((y<HEIGHT-1)) incrementIfNeighbor(x,y+1,temp,&neighbors);
204 if ((x<WIDTH-1)&&(y>0)) incrementIfNeighbor(x+1,y-1,temp,&neighbors);
205 if ((x<WIDTH-1)) incrementIfNeighbor(x+1,y,temp,&neighbors);
206 if ((x<WIDTH-1)&&(y<HEIGHT-1)) incrementIfNeighbor(x+1,y+1,temp,&neighbors);
207
208 if (temp[x][y])
209 {
210 blocks[x][y] = ((neighbors >= 1) && (neighbors <= 4));
211 } else {
212 blocks[x][y] = (neighbors == 3);
213 }
214 }
215 }
216}
217
218void GameState::Board::incrementIfNeighbor(int x, int y, bool temp[WIDTH][HEIGHT], int* tick)
219{
220 wrap(&x, &y);
221
222 if ((blocks[x][y])||((info->playerx==x)&&(info->playery==y)))
223 {
224 ++*tick;
225 }
226}