"Lost treasure of mBedungu" 100 level puzzle game for RETRO
Dependencies: LCD_ST7735 RetroPlatform mbed
Game/GameScreen.cpp@0:f5f961973d01, 2015-02-21 (annotated)
- Committer:
- Architect
- Date:
- Sat Feb 21 06:19:29 2015 +0000
- Revision:
- 0:f5f961973d01
- Child:
- 1:dcea5500a32d
Before switching to 16 colors
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Architect | 0:f5f961973d01 | 1 | #include "GameScreen.h" |
Architect | 0:f5f961973d01 | 2 | #include "Retro.h" |
Architect | 0:f5f961973d01 | 3 | #include "Sprites.h" |
Architect | 0:f5f961973d01 | 4 | #include "Levels.h" |
Architect | 0:f5f961973d01 | 5 | |
Architect | 0:f5f961973d01 | 6 | extern Retro retro; |
Architect | 0:f5f961973d01 | 7 | |
Architect | 0:f5f961973d01 | 8 | #ifdef FULL_COLOR |
Architect | 0:f5f961973d01 | 9 | const uint16_t * sprites[] = { |
Architect | 0:f5f961973d01 | 10 | #else |
Architect | 0:f5f961973d01 | 11 | const uint8_t * sprites[] = { |
Architect | 0:f5f961973d01 | 12 | #endif |
Architect | 0:f5f961973d01 | 13 | NULL, |
Architect | 0:f5f961973d01 | 14 | wall, |
Architect | 0:f5f961973d01 | 15 | barrel, |
Architect | 0:f5f961973d01 | 16 | ladder, |
Architect | 0:f5f961973d01 | 17 | key, |
Architect | 0:f5f961973d01 | 18 | door, |
Architect | 0:f5f961973d01 | 19 | left, |
Architect | 0:f5f961973d01 | 20 | right, |
Architect | 0:f5f961973d01 | 21 | crate, |
Architect | 0:f5f961973d01 | 22 | totem, |
Architect | 0:f5f961973d01 | 23 | rick |
Architect | 0:f5f961973d01 | 24 | }; |
Architect | 0:f5f961973d01 | 25 | |
Architect | 0:f5f961973d01 | 26 | GameScreen::GameScreen() |
Architect | 0:f5f961973d01 | 27 | { |
Architect | 0:f5f961973d01 | 28 | _level = 0; |
Architect | 0:f5f961973d01 | 29 | _state = 0; |
Architect | 0:f5f961973d01 | 30 | _pocket[0] = 0; |
Architect | 0:f5f961973d01 | 31 | _pocket[1] = 0; |
Architect | 0:f5f961973d01 | 32 | _rickDirection = 0; |
Architect | 0:f5f961973d01 | 33 | } |
Architect | 0:f5f961973d01 | 34 | |
Architect | 0:f5f961973d01 | 35 | bool GameScreen::isPocketFull() |
Architect | 0:f5f961973d01 | 36 | { |
Architect | 0:f5f961973d01 | 37 | return (_pocket[0] != 0 && _pocket[1] != 0); |
Architect | 0:f5f961973d01 | 38 | } |
Architect | 0:f5f961973d01 | 39 | |
Architect | 0:f5f961973d01 | 40 | bool GameScreen::isPocketEmpty() |
Architect | 0:f5f961973d01 | 41 | { |
Architect | 0:f5f961973d01 | 42 | return (_pocket[0] == 0 && _pocket[1] == 0); |
Architect | 0:f5f961973d01 | 43 | } |
Architect | 0:f5f961973d01 | 44 | |
Architect | 0:f5f961973d01 | 45 | bool GameScreen::putInPocket( int item ) |
Architect | 0:f5f961973d01 | 46 | { |
Architect | 0:f5f961973d01 | 47 | if( item != CELL_BARREL && item != CELL_KEY ) |
Architect | 0:f5f961973d01 | 48 | return false; |
Architect | 0:f5f961973d01 | 49 | |
Architect | 0:f5f961973d01 | 50 | bool bRet = true; |
Architect | 0:f5f961973d01 | 51 | |
Architect | 0:f5f961973d01 | 52 | if( _pocket[0] == 0 ) |
Architect | 0:f5f961973d01 | 53 | _pocket[0] = item; |
Architect | 0:f5f961973d01 | 54 | else if( _pocket[1] == 0 ) |
Architect | 0:f5f961973d01 | 55 | _pocket[1] = item; |
Architect | 0:f5f961973d01 | 56 | else |
Architect | 0:f5f961973d01 | 57 | bRet = false; |
Architect | 0:f5f961973d01 | 58 | |
Architect | 0:f5f961973d01 | 59 | return bRet; |
Architect | 0:f5f961973d01 | 60 | } |
Architect | 0:f5f961973d01 | 61 | |
Architect | 0:f5f961973d01 | 62 | bool GameScreen::getKeyFromPocket() |
Architect | 0:f5f961973d01 | 63 | { |
Architect | 0:f5f961973d01 | 64 | bool bRet = true; |
Architect | 0:f5f961973d01 | 65 | |
Architect | 0:f5f961973d01 | 66 | if( _pocket[0] == CELL_KEY ) |
Architect | 0:f5f961973d01 | 67 | _pocket[0] = 0; |
Architect | 0:f5f961973d01 | 68 | else if( _pocket[1] == CELL_KEY ) |
Architect | 0:f5f961973d01 | 69 | _pocket[1] = 0; |
Architect | 0:f5f961973d01 | 70 | else |
Architect | 0:f5f961973d01 | 71 | bRet = false; |
Architect | 0:f5f961973d01 | 72 | |
Architect | 0:f5f961973d01 | 73 | return bRet; |
Architect | 0:f5f961973d01 | 74 | } |
Architect | 0:f5f961973d01 | 75 | |
Architect | 0:f5f961973d01 | 76 | bool GameScreen::getBarrelFromPocket() |
Architect | 0:f5f961973d01 | 77 | { |
Architect | 0:f5f961973d01 | 78 | bool bRet = true; |
Architect | 0:f5f961973d01 | 79 | |
Architect | 0:f5f961973d01 | 80 | if( _pocket[0] == CELL_BARREL ) |
Architect | 0:f5f961973d01 | 81 | _pocket[0] = 0; |
Architect | 0:f5f961973d01 | 82 | else if( _pocket[1] == CELL_BARREL ) |
Architect | 0:f5f961973d01 | 83 | _pocket[1] = 0; |
Architect | 0:f5f961973d01 | 84 | else |
Architect | 0:f5f961973d01 | 85 | bRet = false; |
Architect | 0:f5f961973d01 | 86 | |
Architect | 0:f5f961973d01 | 87 | return bRet; |
Architect | 0:f5f961973d01 | 88 | } |
Architect | 0:f5f961973d01 | 89 | |
Architect | 0:f5f961973d01 | 90 | void GameScreen::moveleft() |
Architect | 0:f5f961973d01 | 91 | { |
Architect | 0:f5f961973d01 | 92 | if( _rickDirection == 0 ) |
Architect | 0:f5f961973d01 | 93 | { |
Architect | 0:f5f961973d01 | 94 | _rickDirection = 1; |
Architect | 0:f5f961973d01 | 95 | drawSprite(_rickX,_rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 96 | } |
Architect | 0:f5f961973d01 | 97 | |
Architect | 0:f5f961973d01 | 98 | if( _rickX == 0 ) |
Architect | 0:f5f961973d01 | 99 | return; |
Architect | 0:f5f961973d01 | 100 | |
Architect | 0:f5f961973d01 | 101 | uint8_t cell = _maze[(_rickY<<3)+_rickX-1]; |
Architect | 0:f5f961973d01 | 102 | |
Architect | 0:f5f961973d01 | 103 | |
Architect | 0:f5f961973d01 | 104 | if( cell == CELL_KEY || cell == CELL_BARREL ) { |
Architect | 0:f5f961973d01 | 105 | if( putInPocket(cell) ) { |
Architect | 0:f5f961973d01 | 106 | _maze[(_rickY<<3)+_rickX-1] = CELL_EMPTY; |
Architect | 0:f5f961973d01 | 107 | drawSprite((_rickX-1),_rickY, CELL_EMPTY); |
Architect | 0:f5f961973d01 | 108 | drawPocket(); |
Architect | 0:f5f961973d01 | 109 | } |
Architect | 0:f5f961973d01 | 110 | return; |
Architect | 0:f5f961973d01 | 111 | } |
Architect | 0:f5f961973d01 | 112 | |
Architect | 0:f5f961973d01 | 113 | if( cell == CELL_CRATE && (_rickX-1)>0 ) |
Architect | 0:f5f961973d01 | 114 | { |
Architect | 0:f5f961973d01 | 115 | if( moveto(_rickX-1,_rickY, _rickX-2,_rickY) ) |
Architect | 0:f5f961973d01 | 116 | fall(_rickX-2,_rickY); |
Architect | 0:f5f961973d01 | 117 | return; |
Architect | 0:f5f961973d01 | 118 | } |
Architect | 0:f5f961973d01 | 119 | |
Architect | 0:f5f961973d01 | 120 | |
Architect | 0:f5f961973d01 | 121 | if( moveto(_rickX,_rickY,_rickX-1,_rickY) ) |
Architect | 0:f5f961973d01 | 122 | fall(_rickX,_rickY); |
Architect | 0:f5f961973d01 | 123 | |
Architect | 0:f5f961973d01 | 124 | } |
Architect | 0:f5f961973d01 | 125 | |
Architect | 0:f5f961973d01 | 126 | void GameScreen::moveright() |
Architect | 0:f5f961973d01 | 127 | { |
Architect | 0:f5f961973d01 | 128 | if( _rickDirection == 1 ) |
Architect | 0:f5f961973d01 | 129 | { |
Architect | 0:f5f961973d01 | 130 | _rickDirection = 0; |
Architect | 0:f5f961973d01 | 131 | drawSprite(_rickX,_rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 132 | } |
Architect | 0:f5f961973d01 | 133 | |
Architect | 0:f5f961973d01 | 134 | if( _rickX == 7 ) |
Architect | 0:f5f961973d01 | 135 | return; |
Architect | 0:f5f961973d01 | 136 | |
Architect | 0:f5f961973d01 | 137 | uint8_t cell = _maze[(_rickY<<3)+_rickX+1]; |
Architect | 0:f5f961973d01 | 138 | |
Architect | 0:f5f961973d01 | 139 | if( cell == CELL_KEY || cell == CELL_BARREL ) { |
Architect | 0:f5f961973d01 | 140 | if( putInPocket(cell) ) { |
Architect | 0:f5f961973d01 | 141 | _maze[(_rickY<<3)+_rickX+1] = CELL_EMPTY; |
Architect | 0:f5f961973d01 | 142 | drawSprite((_rickX+1),_rickY, CELL_EMPTY); |
Architect | 0:f5f961973d01 | 143 | drawPocket(); |
Architect | 0:f5f961973d01 | 144 | } |
Architect | 0:f5f961973d01 | 145 | return; |
Architect | 0:f5f961973d01 | 146 | } |
Architect | 0:f5f961973d01 | 147 | |
Architect | 0:f5f961973d01 | 148 | if( cell == CELL_CRATE && (_rickX+1)<7 ) |
Architect | 0:f5f961973d01 | 149 | { |
Architect | 0:f5f961973d01 | 150 | if( moveto(_rickX+1,_rickY, _rickX+2,_rickY) ) |
Architect | 0:f5f961973d01 | 151 | fall(_rickX+2,_rickY); |
Architect | 0:f5f961973d01 | 152 | return; |
Architect | 0:f5f961973d01 | 153 | } |
Architect | 0:f5f961973d01 | 154 | |
Architect | 0:f5f961973d01 | 155 | if( moveto(_rickX,_rickY,_rickX+1,_rickY) ) |
Architect | 0:f5f961973d01 | 156 | fall(_rickX,_rickY); |
Architect | 0:f5f961973d01 | 157 | |
Architect | 0:f5f961973d01 | 158 | } |
Architect | 0:f5f961973d01 | 159 | |
Architect | 0:f5f961973d01 | 160 | void GameScreen::moveup() |
Architect | 0:f5f961973d01 | 161 | { |
Architect | 0:f5f961973d01 | 162 | if( _rickY == 0 ) |
Architect | 0:f5f961973d01 | 163 | return; |
Architect | 0:f5f961973d01 | 164 | |
Architect | 0:f5f961973d01 | 165 | uint8_t currentCell = _maze[((_rickY)<<3)+_rickX]; |
Architect | 0:f5f961973d01 | 166 | uint8_t aboveCell = _maze[((_rickY-1)<<3)+_rickX]; |
Architect | 0:f5f961973d01 | 167 | |
Architect | 0:f5f961973d01 | 168 | //if already on ladder |
Architect | 0:f5f961973d01 | 169 | if( currentCell == CELL_LADDER ) |
Architect | 0:f5f961973d01 | 170 | moveto(_rickX,_rickY,_rickX,_rickY-1); |
Architect | 0:f5f961973d01 | 171 | else if( currentCell == CELL_EMPTY && !isPocketEmpty()) { |
Architect | 0:f5f961973d01 | 172 | uint8_t x = _rickX; |
Architect | 0:f5f961973d01 | 173 | uint8_t y = _rickY; |
Architect | 0:f5f961973d01 | 174 | if( moveto(_rickX,_rickY,_rickX,_rickY-1) ) { |
Architect | 0:f5f961973d01 | 175 | if( getBarrelFromPocket() ) { |
Architect | 0:f5f961973d01 | 176 | _maze[(y<<3)+x] = CELL_BARREL; |
Architect | 0:f5f961973d01 | 177 | drawSprite(x,y,CELL_BARREL); |
Architect | 0:f5f961973d01 | 178 | } else if( getKeyFromPocket() ) { |
Architect | 0:f5f961973d01 | 179 | _maze[(y<<3)+x] = CELL_KEY; |
Architect | 0:f5f961973d01 | 180 | drawSprite(x,y,CELL_KEY); |
Architect | 0:f5f961973d01 | 181 | } |
Architect | 0:f5f961973d01 | 182 | |
Architect | 0:f5f961973d01 | 183 | drawPocket(); |
Architect | 0:f5f961973d01 | 184 | } |
Architect | 0:f5f961973d01 | 185 | } |
Architect | 0:f5f961973d01 | 186 | } |
Architect | 0:f5f961973d01 | 187 | |
Architect | 0:f5f961973d01 | 188 | void GameScreen::movedown() |
Architect | 0:f5f961973d01 | 189 | { |
Architect | 0:f5f961973d01 | 190 | if( _rickY == 0 ) |
Architect | 0:f5f961973d01 | 191 | return; |
Architect | 0:f5f961973d01 | 192 | |
Architect | 0:f5f961973d01 | 193 | // uint8_t currentCell = _maze[((_rickY)<<3)+_rickX]; |
Architect | 0:f5f961973d01 | 194 | // uint8_t belowCell = _maze[((_rickY+1)<<3)+_rickX]; |
Architect | 0:f5f961973d01 | 195 | |
Architect | 0:f5f961973d01 | 196 | |
Architect | 0:f5f961973d01 | 197 | if( moveto(_rickX,_rickY,_rickX,_rickY+1) ) |
Architect | 0:f5f961973d01 | 198 | { |
Architect | 0:f5f961973d01 | 199 | fall(_rickX,_rickY); |
Architect | 0:f5f961973d01 | 200 | } |
Architect | 0:f5f961973d01 | 201 | // if( _rickY > 0 ) { |
Architect | 0:f5f961973d01 | 202 | // uint8_t cellAbove = _maze[((_rickY-1)<<3)+_rickX]; |
Architect | 0:f5f961973d01 | 203 | // if(cellAbove == CELL_EMPTY && !isPocketEmpty()) { |
Architect | 0:f5f961973d01 | 204 | // if( getKeyFromPocket() ) { |
Architect | 0:f5f961973d01 | 205 | // _maze[(_rickY<<3)+_rickX] = CELL_KEY; |
Architect | 0:f5f961973d01 | 206 | // } else if( getBarrelFromPocket() ) |
Architect | 0:f5f961973d01 | 207 | // _maze[(_rickY<<3)+_rickX] = CELL_BARREL; |
Architect | 0:f5f961973d01 | 208 | // |
Architect | 0:f5f961973d01 | 209 | // _rickY--; |
Architect | 0:f5f961973d01 | 210 | // drawSprite(_rickX,_rickY+1, _maze[((_rickY+1)<<3)+_rickX]); |
Architect | 0:f5f961973d01 | 211 | // drawSprite(_rickX,_rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 212 | // drawPocket(); |
Architect | 0:f5f961973d01 | 213 | // } |
Architect | 0:f5f961973d01 | 214 | // } |
Architect | 0:f5f961973d01 | 215 | } |
Architect | 0:f5f961973d01 | 216 | |
Architect | 0:f5f961973d01 | 217 | |
Architect | 0:f5f961973d01 | 218 | bool GameScreen::moveto(uint8_t fromX, uint8_t fromY, uint8_t toX, uint8_t toY) |
Architect | 0:f5f961973d01 | 219 | { |
Architect | 0:f5f961973d01 | 220 | |
Architect | 0:f5f961973d01 | 221 | bool isRick = false; |
Architect | 0:f5f961973d01 | 222 | |
Architect | 0:f5f961973d01 | 223 | if( fromX == _rickX && fromY == _rickY ) |
Architect | 0:f5f961973d01 | 224 | isRick = true; |
Architect | 0:f5f961973d01 | 225 | |
Architect | 0:f5f961973d01 | 226 | uint8_t fromCell = _maze[((fromY)<<3)+fromX]; |
Architect | 0:f5f961973d01 | 227 | uint8_t toCell = _maze[((toY)<<3)+toX]; |
Architect | 0:f5f961973d01 | 228 | |
Architect | 0:f5f961973d01 | 229 | if( isRick ) { |
Architect | 0:f5f961973d01 | 230 | if( toCell == CELL_EMPTY || toCell == CELL_LADDER || toCell == CELL_TOTEM ) { |
Architect | 0:f5f961973d01 | 231 | drawSprite(fromX,fromY, fromCell); |
Architect | 0:f5f961973d01 | 232 | _rickX = toX; |
Architect | 0:f5f961973d01 | 233 | _rickY = toY; |
Architect | 0:f5f961973d01 | 234 | drawSprite(_rickX,_rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 235 | return true; |
Architect | 0:f5f961973d01 | 236 | } |
Architect | 0:f5f961973d01 | 237 | if( toCell == CELL_DOOR ) { |
Architect | 0:f5f961973d01 | 238 | if( getKeyFromPocket() ) { |
Architect | 0:f5f961973d01 | 239 | drawSprite(fromX,fromY, fromCell); |
Architect | 0:f5f961973d01 | 240 | _maze[((toY)<<3)+toX] = CELL_EMPTY; |
Architect | 0:f5f961973d01 | 241 | _rickX = toX; |
Architect | 0:f5f961973d01 | 242 | _rickY = toY; |
Architect | 0:f5f961973d01 | 243 | drawSprite(_rickX,_rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 244 | drawPocket(); |
Architect | 0:f5f961973d01 | 245 | return true; |
Architect | 0:f5f961973d01 | 246 | } |
Architect | 0:f5f961973d01 | 247 | } |
Architect | 0:f5f961973d01 | 248 | }else if( fromCell == CELL_CRATE && toCell == CELL_EMPTY ) |
Architect | 0:f5f961973d01 | 249 | { |
Architect | 0:f5f961973d01 | 250 | _maze[((toY)<<3)+toX] = CELL_CRATE; |
Architect | 0:f5f961973d01 | 251 | _maze[((fromY)<<3)+fromX] = CELL_EMPTY; |
Architect | 0:f5f961973d01 | 252 | |
Architect | 0:f5f961973d01 | 253 | drawSprite(fromX,fromY, toCell); |
Architect | 0:f5f961973d01 | 254 | drawSprite(toX,toY, fromCell); |
Architect | 0:f5f961973d01 | 255 | return true; |
Architect | 0:f5f961973d01 | 256 | } |
Architect | 0:f5f961973d01 | 257 | |
Architect | 0:f5f961973d01 | 258 | return false; |
Architect | 0:f5f961973d01 | 259 | } |
Architect | 0:f5f961973d01 | 260 | |
Architect | 0:f5f961973d01 | 261 | bool GameScreen::fall(uint8_t fromX, uint8_t fromY) |
Architect | 0:f5f961973d01 | 262 | { |
Architect | 0:f5f961973d01 | 263 | if( fromY == 7 ) |
Architect | 0:f5f961973d01 | 264 | return false; |
Architect | 0:f5f961973d01 | 265 | |
Architect | 0:f5f961973d01 | 266 | uint8_t curCell = _maze[(fromY<<3)+fromX]; |
Architect | 0:f5f961973d01 | 267 | |
Architect | 0:f5f961973d01 | 268 | if( curCell == CELL_LADDER ) |
Architect | 0:f5f961973d01 | 269 | return false; |
Architect | 0:f5f961973d01 | 270 | |
Architect | 0:f5f961973d01 | 271 | uint8_t cell = _maze[((fromY+1)<<3)+fromX]; |
Architect | 0:f5f961973d01 | 272 | |
Architect | 0:f5f961973d01 | 273 | |
Architect | 0:f5f961973d01 | 274 | |
Architect | 0:f5f961973d01 | 275 | while( cell == CELL_EMPTY || cell == CELL_TOTEM ) { |
Architect | 0:f5f961973d01 | 276 | if( moveto(fromX,fromY,fromX,fromY+1) ) { |
Architect | 0:f5f961973d01 | 277 | fromY++; |
Architect | 0:f5f961973d01 | 278 | |
Architect | 0:f5f961973d01 | 279 | if( fromY == 7 ) |
Architect | 0:f5f961973d01 | 280 | break; |
Architect | 0:f5f961973d01 | 281 | |
Architect | 0:f5f961973d01 | 282 | cell = _maze[((fromY+1)<<3)+fromX]; |
Architect | 0:f5f961973d01 | 283 | } else { |
Architect | 0:f5f961973d01 | 284 | break; |
Architect | 0:f5f961973d01 | 285 | } |
Architect | 0:f5f961973d01 | 286 | } |
Architect | 0:f5f961973d01 | 287 | |
Architect | 0:f5f961973d01 | 288 | return true; |
Architect | 0:f5f961973d01 | 289 | } |
Architect | 0:f5f961973d01 | 290 | |
Architect | 0:f5f961973d01 | 291 | |
Architect | 0:f5f961973d01 | 292 | |
Architect | 0:f5f961973d01 | 293 | |
Architect | 0:f5f961973d01 | 294 | void GameScreen::unpackLevel( int level ) |
Architect | 0:f5f961973d01 | 295 | { |
Architect | 0:f5f961973d01 | 296 | if( level < 0 || level > 99 ) |
Architect | 0:f5f961973d01 | 297 | level = 0; |
Architect | 0:f5f961973d01 | 298 | |
Architect | 0:f5f961973d01 | 299 | _level = level; |
Architect | 0:f5f961973d01 | 300 | |
Architect | 0:f5f961973d01 | 301 | const uint32_t * pLevel = &levels[level*8]; |
Architect | 0:f5f961973d01 | 302 | |
Architect | 0:f5f961973d01 | 303 | for( int y = 0; y < 8; y++ ) |
Architect | 0:f5f961973d01 | 304 | for( int x = 0; x < 8; x++ ) { |
Architect | 0:f5f961973d01 | 305 | _maze[(y<<3) + x] = (pLevel[y]>>(28-(x<<2))) & 0x0F; |
Architect | 0:f5f961973d01 | 306 | |
Architect | 0:f5f961973d01 | 307 | switch( _maze[(y<<3) + x] ) { |
Architect | 0:f5f961973d01 | 308 | case CELL_RICK: |
Architect | 0:f5f961973d01 | 309 | //The level data has specialy marked cell for Rick |
Architect | 0:f5f961973d01 | 310 | //During the game Rick position is tracked separately |
Architect | 0:f5f961973d01 | 311 | //This allows us to put Rick on none EMPTY cells |
Architect | 0:f5f961973d01 | 312 | _maze[(y<<3) + x] = CELL_EMPTY; |
Architect | 0:f5f961973d01 | 313 | _rickX = x; |
Architect | 0:f5f961973d01 | 314 | _rickY = y; |
Architect | 0:f5f961973d01 | 315 | break; |
Architect | 0:f5f961973d01 | 316 | case CELL_TOTEM: |
Architect | 0:f5f961973d01 | 317 | _totemX = x; |
Architect | 0:f5f961973d01 | 318 | _totemY = y; |
Architect | 0:f5f961973d01 | 319 | break; |
Architect | 0:f5f961973d01 | 320 | default: |
Architect | 0:f5f961973d01 | 321 | break; |
Architect | 0:f5f961973d01 | 322 | } |
Architect | 0:f5f961973d01 | 323 | } |
Architect | 0:f5f961973d01 | 324 | } |
Architect | 0:f5f961973d01 | 325 | |
Architect | 0:f5f961973d01 | 326 | void GameScreen::resetLevel() |
Architect | 0:f5f961973d01 | 327 | { |
Architect | 0:f5f961973d01 | 328 | unpackLevel(_level); |
Architect | 0:f5f961973d01 | 329 | |
Architect | 0:f5f961973d01 | 330 | _state = 0; |
Architect | 0:f5f961973d01 | 331 | _pocket[0] = 0; |
Architect | 0:f5f961973d01 | 332 | _pocket[1] = 0; |
Architect | 0:f5f961973d01 | 333 | _rickDirection = 0; |
Architect | 0:f5f961973d01 | 334 | } |
Architect | 0:f5f961973d01 | 335 | |
Architect | 0:f5f961973d01 | 336 | void GameScreen::drawSprite(int x, int y, int sprite, bool mirrored) |
Architect | 0:f5f961973d01 | 337 | { |
Architect | 0:f5f961973d01 | 338 | int screenx = x<<4; |
Architect | 0:f5f961973d01 | 339 | int screeny = y<<4; |
Architect | 0:f5f961973d01 | 340 | if( sprite == 0 ) |
Architect | 0:f5f961973d01 | 341 | retro.display.fillRect(screenx,screeny, screenx+15,screeny+15,0); |
Architect | 0:f5f961973d01 | 342 | else |
Architect | 0:f5f961973d01 | 343 | { |
Architect | 0:f5f961973d01 | 344 | retro.display.drawBitmapIndexed(screenx,screeny, 16,16,sprites[sprite],palette, mirrored); |
Architect | 0:f5f961973d01 | 345 | } |
Architect | 0:f5f961973d01 | 346 | } |
Architect | 0:f5f961973d01 | 347 | |
Architect | 0:f5f961973d01 | 348 | void GameScreen::drawPocket() |
Architect | 0:f5f961973d01 | 349 | { |
Architect | 0:f5f961973d01 | 350 | if( _pocket[0] == 0 ) |
Architect | 0:f5f961973d01 | 351 | retro.display.fillRect(136,80,151,95,0); |
Architect | 0:f5f961973d01 | 352 | else |
Architect | 0:f5f961973d01 | 353 | retro.display.drawBitmapIndexed(136,80, 16,16,sprites[_pocket[0]], palette); |
Architect | 0:f5f961973d01 | 354 | |
Architect | 0:f5f961973d01 | 355 | if( _pocket[1] == 0 ) |
Architect | 0:f5f961973d01 | 356 | retro.display.fillRect(136,96,151,111,0); |
Architect | 0:f5f961973d01 | 357 | else |
Architect | 0:f5f961973d01 | 358 | retro.display.drawBitmapIndexed(136,96, 16,16,sprites[_pocket[1]], palette); |
Architect | 0:f5f961973d01 | 359 | } |
Architect | 0:f5f961973d01 | 360 | |
Architect | 0:f5f961973d01 | 361 | |
Architect | 0:f5f961973d01 | 362 | void GameScreen::drawLevel() |
Architect | 0:f5f961973d01 | 363 | { |
Architect | 0:f5f961973d01 | 364 | //Draw the maze |
Architect | 0:f5f961973d01 | 365 | for( int y = 0; y < 8; y++ ) |
Architect | 0:f5f961973d01 | 366 | for( int x = 0; x < 8; x++ ) { |
Architect | 0:f5f961973d01 | 367 | drawSprite(x, y, _maze[(y<<3)+x]); |
Architect | 0:f5f961973d01 | 368 | } |
Architect | 0:f5f961973d01 | 369 | |
Architect | 0:f5f961973d01 | 370 | //Put Rick on the map |
Architect | 0:f5f961973d01 | 371 | drawSprite(_rickX, _rickY, CELL_RICK, _rickDirection == 1); |
Architect | 0:f5f961973d01 | 372 | |
Architect | 0:f5f961973d01 | 373 | //Draw the statistics and "pocket" area |
Architect | 0:f5f961973d01 | 374 | for( int y = 0; y < 8; y++ ) { |
Architect | 0:f5f961973d01 | 375 | retro.display.drawBitmapIndexed(128,y<<4, 16,16,wall, palette); |
Architect | 0:f5f961973d01 | 376 | retro.display.drawBitmapIndexed(144,y<<4, 16,16, wall, palette); |
Architect | 0:f5f961973d01 | 377 | } |
Architect | 0:f5f961973d01 | 378 | retro.display.drawBitmapIndexed(136,16, 16,16,totem,palette); |
Architect | 0:f5f961973d01 | 379 | retro.display.fillRect(132,32,155,39,0); |
Architect | 0:f5f961973d01 | 380 | |
Architect | 0:f5f961973d01 | 381 | char buff[4]; |
Architect | 0:f5f961973d01 | 382 | sprintf(buff,"%d",_level); |
Architect | 0:f5f961973d01 | 383 | |
Architect | 0:f5f961973d01 | 384 | drawString(132,32,buff); |
Architect | 0:f5f961973d01 | 385 | |
Architect | 0:f5f961973d01 | 386 | drawPocket(); |
Architect | 0:f5f961973d01 | 387 | } |
Architect | 0:f5f961973d01 | 388 | |
Architect | 0:f5f961973d01 | 389 | |
Architect | 0:f5f961973d01 | 390 | Screen GameScreen::Update() |
Architect | 0:f5f961973d01 | 391 | { |
Architect | 0:f5f961973d01 | 392 | if( _state == 0 ) { |
Architect | 0:f5f961973d01 | 393 | drawLevel(); |
Architect | 0:f5f961973d01 | 394 | _state = 1; |
Architect | 0:f5f961973d01 | 395 | } |
Architect | 0:f5f961973d01 | 396 | |
Architect | 0:f5f961973d01 | 397 | if(retro.buttons.pressed(BTN_LEFT)) { |
Architect | 0:f5f961973d01 | 398 | moveleft(); |
Architect | 0:f5f961973d01 | 399 | } |
Architect | 0:f5f961973d01 | 400 | if(retro.buttons.pressed(BTN_RIGHT)) { |
Architect | 0:f5f961973d01 | 401 | moveright(); |
Architect | 0:f5f961973d01 | 402 | } |
Architect | 0:f5f961973d01 | 403 | if(retro.buttons.pressed(BTN_UP)) { |
Architect | 0:f5f961973d01 | 404 | moveup(); |
Architect | 0:f5f961973d01 | 405 | } |
Architect | 0:f5f961973d01 | 406 | if(retro.buttons.pressed(BTN_DOWN)) { |
Architect | 0:f5f961973d01 | 407 | movedown(); |
Architect | 0:f5f961973d01 | 408 | } |
Architect | 0:f5f961973d01 | 409 | if(retro.buttons.pressed(BTN_ROBOT)) { |
Architect | 0:f5f961973d01 | 410 | _state = 0; |
Architect | 0:f5f961973d01 | 411 | return Menu; |
Architect | 0:f5f961973d01 | 412 | } |
Architect | 0:f5f961973d01 | 413 | |
Architect | 0:f5f961973d01 | 414 | return Game; |
Architect | 0:f5f961973d01 | 415 | } |