18
18
const char directionKey [] = {'w' , 'a' , 's' , 'd' };
19
19
const int yOffset [] = {-1 , 0 , 1 , 0 };
20
20
const int xOffset [] = {0 , -1 , 0 , 1 };
21
- uint16_t currentRadius = 40 ;
21
+ uint16_t currentRadius = LIGHT_RADIUS ;
22
+
22
23
23
24
void render_scene (const Maze * maze , const Asset * asset , const bool isFOVShown );
25
+ void game_start (Maze * mz , int * _optIdx , int * _mazeIdx );
24
26
void debug_pos (Position pos );
25
27
void update_pos (Position * des , Direction dir );
26
28
void handle_collision (ItemMeta * item , Maze * maze , Player * player );
27
29
int cmp_pos (Position pos1 , Position pos2 );
28
30
void debug_item (ItemMeta item );
31
+ void game_over (int * _optIdx );
29
32
30
33
void game_enter () {
31
34
// init
32
35
framebf_init (GAME_W , GAME_H , GAME_W , GAME_H );
33
36
framebf_drawImg (0 , 0 , MENU_BACKGROUND_SIZE , MENU_BACKGROUND_SIZE , bitmap_menu_background );
34
- curDarken = 1.0f ;
35
- currentRadius = 40 ;
36
37
37
38
// maze1
38
39
Asset playerAsset = {ASSET_HIDDEN , ASSET_HIDDEN , PLAYER_SZ , PLAYER_SZ , bitmap_player };
39
40
Position playerPos = {0 , MAZE_SZ_CELL / 2 };
40
41
Player player = {& playerAsset , & playerPos };
41
42
42
- Asset visionAsset = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
43
- Position visionPos = {7 , 5 };
44
- ItemMeta visionMeta = {& visionAsset , & visionPos , VISION , false};
43
+ Asset visionAsset1 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
44
+ Position visionPos1 = {1 ,9 };
45
+ ItemMeta visionMeta1 = {& visionAsset1 , & visionPos1 , VISION , false};
46
+
47
+ Asset visionAsset12 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
48
+ Position visionPos12 = {5 ,1 };
49
+ ItemMeta visionMeta12 = {& visionAsset12 , & visionPos12 , VISION , false};
45
50
46
51
Maze mz1 = {.level = 1 , .pathColor = -1 , .bitmap = bitmap_maze1 , .bitmapState = bitmap_mazeState1 ,
47
- .itemMetas = {& visionMeta }, .itemMetasSz = 1 ,
52
+ .itemMetas = {& visionMeta1 , & visionMeta12 }, .itemMetasSz = 2 ,
48
53
.player = & player };
49
54
50
55
// maze2
51
- Asset bombAsset2 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_bomb };
52
- Position bombPos2 = {1 ,4 }, bombWall2 = {6 ,7 };
53
- ItemMeta bombMeta2 = {& bombAsset2 , & bombPos2 , BOMB , false};
54
- Bomb bomb2 = {& bombMeta2 , & bombWall2 , false};
55
-
56
56
Asset visionAsset2 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
57
- Position visionPos2 = {3 , 8 };
57
+ Position visionPos2 = {9 , 7 };
58
58
ItemMeta visionMeta2 = {& visionAsset2 , & visionPos2 , VISION , false};
59
59
60
+ Asset visionAsset22 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
61
+ Position visionPos22 = {9 , 1 };
62
+ ItemMeta visionMeta22 = {& visionAsset22 , & visionPos22 , VISION , false};
63
+
64
+ Asset portalAsset2 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_portal };
65
+ Position portalPos2 = {3 , 5 }, portalDes2 = {5 ,9 };
66
+ ItemMeta portalMeta2 = {& portalAsset2 , & portalPos2 , PORTAL , false};
67
+ Portal portal2 = {& portalMeta2 , & portalDes2 };
68
+
60
69
Maze mz2 = {.level = 1 , .pathColor = -1 , .bitmap = bitmap_maze2 , .bitmapState = bitmap_mazeState2 ,
61
- .itemMetas = {& bombMeta2 , & visionMeta2 }, .itemMetasSz = 2 ,
62
- .bomb = & bomb2 ,
70
+ .itemMetas = {& visionMeta2 , & visionMeta22 , & portalMeta2 }, .itemMetasSz = 3 , .portal = & portal2 ,
63
71
.player = & player };
64
72
65
73
// maze 3
66
- Asset portalAsset = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_portal };
67
- Position portalPos = {2 , 5 }, portalDes = {4 ,5 };
68
- ItemMeta portalMeta = {& portalAsset , & portalPos , PORTAL , false};
69
- Portal portal = {& portalMeta , & portalDes };
70
- Maze mz3 = {};
71
-
72
- Maze * mazes [] = {& mz1 , & mz2 , & mz2 };
73
-
74
+ Asset bombAsset3 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_bomb };
75
+ Position bombPos3 = {9 ,1 }, bombWall3 = {8 ,5 };
76
+ ItemMeta bombMeta3 = {& bombAsset3 , & bombPos3 , BOMB , false};
77
+ Bomb bomb3 = {& bombMeta3 , & bombWall3 , false};
78
+
79
+ Asset visionAsset3 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_vision };
80
+ Position visionPos3 = {9 , 7 };
81
+ ItemMeta visionMeta3 = {& visionAsset3 , & visionPos3 , VISION , false};
82
+
83
+ Asset portalAsset3 = {ASSET_HIDDEN , ASSET_HIDDEN , ITEM_SZ , ITEM_SZ , bitmap_portal };
84
+ Position portalPos3 = {3 , 5 }, portalDes3 = {3 ,9 };
85
+ ItemMeta portalMeta3 = {& portalAsset3 , & portalPos3 , PORTAL , false};
86
+ Portal portal3 = {& portalMeta3 , & portalDes3 };
87
+
88
+ Maze mz3 = {.level = 1 , .pathColor = -1 , .bitmap = bitmap_maze3 , .bitmapState = bitmap_mazeState3 ,
89
+ .itemMetas = {& bombMeta3 , & visionMeta3 , & portalMeta3 }, .itemMetasSz = 3 ,
90
+ .bomb = & bomb3 , .portal = & portal3 ,
91
+ .player = & player };
92
+
93
+ Maze * mazes [] = {& mz1 , & mz2 , & mz3 };
94
+
74
95
75
96
// menu
76
97
int menuPosX = 220 , menuPosY = 250 , yOffset = 50 ;
77
98
char * opts [] = {"Start" , "Choose Level" , "How To Play?" , "Exit" };
78
99
int optSz = sizeof (opts ) / sizeof (opts [0 ]);
79
- // <<<<<<< HEAD
80
100
81
- int optIdx = -1 ;
101
+ int optIdx = -1 , mazeIdx = 1 ;
82
102
while (1 ) {
103
+ str_debug_num (optIdx );
83
104
if (optIdx == -1 ) {
84
105
drawMenu (menuPosX , menuPosY , yOffset , opts ,
85
106
optSz , MENU_FOREGND , MENU_BACKGND , true);
@@ -91,13 +112,10 @@ void game_enter() {
91
112
92
113
switch (optIdx ) {
93
114
case 0 : {
94
- for (int i = 0 ; i < 3 ; i ++ ) {
95
- game_start (mazes [i ], & optIdx , i );
96
- }
97
- clearScreen ();
115
+ game_start (mazes [mazeIdx ], & optIdx , & mazeIdx );
116
+ uart_puts ("> optIdx:" ); uart_dec (optIdx ); uart_puts (", maze level: " ); uart_dec (mazeIdx ); uart_puts ("\n" );
98
117
break ;
99
118
}
100
-
101
119
case 1 : //continue
102
120
optIdx = -1 ;
103
121
game_continue ();
@@ -134,18 +152,20 @@ int game_menu_enter() {
134
152
}
135
153
136
154
137
- void game_start (Maze * mz , int * _optIdx , const uint8_t mazeIdx ){
155
+ void game_start (Maze * mz , int * _optIdx , int * _mazeIdx ){
138
156
uart_puts ("Starting Game...\n" );
139
157
bool isFOVShown = true;
140
158
Player * pl = mz -> player ;
141
159
* _optIdx = -1 ;
142
160
143
- // rseset maze
161
+ // reset player
144
162
pl -> pos -> posX = 0 ; pl -> pos -> posY = MAZE_SZ_CELL / 2 ;
145
163
pl -> step = 0 ;
164
+
165
+ // reset maze
146
166
curDarken = 1 ;
167
+ currentRadius = LIGHT_RADIUS ;
147
168
getMazePathColor (mz );
148
- // TODO: reset item status
149
169
for (int i = 0 ; i < mz -> itemMetasSz ; i ++ ){
150
170
ItemMeta * meta = mz -> itemMetas [i ];
151
171
meta -> collided = false;
@@ -166,7 +186,6 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
166
186
for (int i = 0 ; i < mz -> itemMetasSz ; i ++ ){
167
187
ItemMeta * meta = mz -> itemMetas [i ];
168
188
posBeToFe (meta -> pos , meta -> asset );
169
- embedAsset (mz , meta -> asset , true);
170
189
}
171
190
render_scene (mz , pl -> asset , isFOVShown );
172
191
// TODO: paint breakable wall !!!
@@ -179,17 +198,18 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
179
198
debug_pos (* (pl -> pos ));
180
199
181
200
// DEBUG / screen shading
182
- if (c == 'o' ){
183
- adjustBrightness (mz , pl -> asset , true);
184
- }
185
- else if (c == 'p' ){
186
- adjustBrightness (mz , pl -> asset , false);
187
- }
188
- else if (c == 'k' ) {
189
- isFOVShown = !isFOVShown ;
190
- render_scene (mz , pl -> asset , isFOVShown );
191
- }
192
- else if (c == 27 ) { // game menu
201
+ // if(c == 'o'){
202
+ // adjustBrightness(mz, pl->asset, true);
203
+ // }
204
+ // else if(c == 'p'){
205
+ // adjustBrightness(mz, pl->asset, false);
206
+ // }
207
+ // else if (c == 'k') {
208
+ // isFOVShown = !isFOVShown;
209
+ // render_scene(mz, pl->asset, isFOVShown);
210
+ // }
211
+ if (c == 27 ) {
212
+ // pause menu
193
213
int game_stage = game_menu_enter ();
194
214
switch (game_stage ) {
195
215
case 0 :
@@ -201,13 +221,13 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
201
221
MENU_BACKGROUND_SIZE , bitmap_menu_background );
202
222
return ;
203
223
}
204
- // str_debug_num(game_stage);
205
224
}
206
225
else if (c == 'q' ){
226
+ // explode wall with bomb
207
227
effect_bomb (mz , pl );
208
228
}
209
229
else {
210
- // spinning
230
+ // TODO: spinning function
211
231
Direction dir = -1 ;
212
232
for (int i = 0 ; i < 4 ; i ++ ){
213
233
if (directionKey [i ] == c ){
@@ -216,16 +236,16 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
216
236
}
217
237
if (dir == -1 ) continue ;
218
238
drawFOV (mz , pl -> asset );
219
- drawMoveAnimation (pl -> asset , dir , 2 );
239
+ drawMovementFrame (pl -> asset , dir , 2 );
220
240
221
- // update position
241
+ // TODO: update position function
222
242
Position posTmp = {pl -> pos -> posX , pl -> pos -> posY };
223
243
update_pos (& posTmp , dir ); uart_puts ("-> " ); debug_pos (posTmp );
224
244
if (posTmp .posX < 0 || posTmp .posY < 0 ||
225
245
posTmp .posX >= MAZE_SZ_CELL || posTmp .posY >= MAZE_SZ_CELL ) continue ;
226
246
227
247
int mazeState = mz -> bitmapState [MAZE_SZ_CELL * posTmp .posY + posTmp .posX ];
228
- str_debug_num (mazeState );
248
+ uart_puts ( "maze state:" ); str_debug_num (mazeState );
229
249
if (mazeState == 0 ) continue ;
230
250
231
251
// post-moving
@@ -235,57 +255,36 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
235
255
236
256
// detect end of maze
237
257
if (pl -> pos -> posX % MAZE_SZ_CELL == MAZE_SZ_CELL - 1 ) {
238
- str_debug ("end of maze reached" );
239
- drawLevelTransitionText (mazeIdx + 1 );
240
-
241
- char c = 0 ;
242
- while ((c = uart_getc ()) != '\n' ) {}
243
-
258
+ str_debug ("end of maze reached!" );
259
+ drawLevelTransitionText (* (_mazeIdx ) + 1 );
260
+ * _optIdx = (* (_mazeIdx ) == 2 ) ? -1 : 0 ;
261
+ * _mazeIdx = (* (_mazeIdx ) + 1 ) % 3 ;
262
+
263
+ while (uart_getc () != '\n' );
264
+ if (* (_mazeIdx ) == 0 ) {
265
+ clearScreen ();
266
+ framebf_drawImg (0 , 0 , MENU_BACKGROUND_SIZE , MENU_BACKGROUND_SIZE , bitmap_menu_background );
267
+ }
244
268
return ;
245
269
}
246
270
247
- // darken screen interval
271
+ // darken screen interval + game over
248
272
pl -> step += 1 ;
249
- if (pl -> step % 3 == 0 ) {
273
+ if (pl -> step % 7 == 0 ) {
250
274
adjustBrightness (mz , pl -> asset , true);
251
275
if (curDarken <= LIGHT_THRESHOLD ) {
252
- str_debug ("game over :(" );
253
- wait_msec (1000000 );
254
- clearScreen ();
255
-
256
-
257
- font_drawString (150 , 150 , "Game Over :(" , MENU_FOREGND , 2 , 1 );
258
- int menuPosX = 220 , menuPosY = 250 , yOffset = 50 ;
259
- char * opts [] = {"Start Over" , "Rage Quit ?" };
260
- int optSz = sizeof (opts ) / sizeof (opts [0 ]);
261
-
262
- drawMenu (menuPosX , menuPosY , yOffset , opts ,
263
- optSz , MENU_FOREGND , MENU_BACKGND , true);
264
- int optIdx = getMenuOpt (menuPosX - 50 , menuPosY , yOffset ,
265
- optSz , MENU_FOREGND , MENU_BACKGND );
266
-
267
- switch (optIdx ) {
268
- case 0 : //start over
269
- // TODO: start over mechanic ?
270
- * _optIdx = 0 ;
271
- clearScreen ();
272
- return ;
273
- case 1 : //quit
274
- clearScreen ();
275
- framebf_drawImg (0 , 0 , MENU_BACKGROUND_SIZE ,
276
- MENU_BACKGROUND_SIZE , bitmap_menu_background );
277
- return ;
278
- }
276
+ game_over (_optIdx );
277
+ return ;
279
278
}
280
279
}
281
280
281
+ // colision
282
282
handle_collision (collidedItem , mz , pl );
283
283
}
284
284
}
285
285
}
286
286
287
287
288
-
289
288
void game_continue () {
290
289
int menuPosX = 220 , menuPosY = 250 , yOffset = 50 ;
291
290
char * opts [] = {"Level 1" , "Level 2" , "Level 3" , "Back to Menu" };
@@ -346,10 +345,51 @@ void game_help() {
346
345
void game_exit () {
347
346
clearScreen ();
348
347
uart_puts ("Exiting game...\n" );
349
- font_drawString (150 , 150 , "Ta reng Ta reng Ta reng" , MENU_FOREGND , 2 , 1 );
348
+ font_drawString (150 , 150 , "Thank you for playing <3" , MENU_FOREGND , 2 , 1 );
349
+ }
350
+
351
+
352
+ void game_over (int * _optIdx ) {
353
+ str_debug ("Game Over :(" );
354
+ wait_msec (1000000 );
355
+ clearScreen ();
356
+
357
+ font_drawString (150 , 150 , "Game Over :(" , MENU_FOREGND , 2 , 1 );
358
+ int menuPosX = 220 , menuPosY = 250 , yOffset = 50 ;
359
+ char * opts [] = {"Start Over" , "Rage Quit ?" };
360
+ int optSz = sizeof (opts ) / sizeof (opts [0 ]);
361
+
362
+ drawMenu (menuPosX , menuPosY , yOffset , opts ,
363
+ optSz , MENU_FOREGND , MENU_BACKGND , true);
364
+ int optIdx = getMenuOpt (menuPosX - 50 , menuPosY , yOffset ,
365
+ optSz , MENU_FOREGND , MENU_BACKGND );
366
+
367
+ clearScreen ();
368
+ switch (optIdx ) {
369
+ case 0 : {
370
+ * _optIdx = 0 ;
371
+ return ;
372
+ }
373
+ case 1 : {
374
+ //quit
375
+ framebf_drawImg (0 , 0 , MENU_BACKGROUND_SIZE ,
376
+ MENU_BACKGROUND_SIZE , bitmap_menu_background );
377
+ return ;
378
+ }
379
+ }
350
380
}
351
381
352
382
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
353
393
// ============================== GAME ITEM
354
394
void effect_vision (Maze * maze , Player * player ){
355
395
currentRadius = currentRadius + 20 ;
0 commit comments