Skip to content

Commit b2e7c19

Browse files
committed
game: level transittion
2 parents 6a0f7f1 + bd762d6 commit b2e7c19

File tree

9 files changed

+1298
-730
lines changed

9 files changed

+1298
-730
lines changed

kernel/game_be.c

+127-87
Original file line numberDiff line numberDiff line change
@@ -18,68 +18,89 @@
1818
const char directionKey[] = {'w', 'a', 's', 'd'};
1919
const int yOffset[] = {-1, 0, 1, 0};
2020
const int xOffset[] = {0, -1, 0, 1};
21-
uint16_t currentRadius = 40;
21+
uint16_t currentRadius = LIGHT_RADIUS;
22+
2223

2324
void render_scene(const Maze *maze, const Asset *asset, const bool isFOVShown);
25+
void game_start(Maze *mz, int *_optIdx, int *_mazeIdx);
2426
void debug_pos(Position pos);
2527
void update_pos(Position *des, Direction dir);
2628
void handle_collision(ItemMeta *item, Maze *maze, Player *player);
2729
int cmp_pos(Position pos1, Position pos2);
2830
void debug_item(ItemMeta item);
31+
void game_over(int *_optIdx);
2932

3033
void game_enter() {
3134
// init
3235
framebf_init(GAME_W, GAME_H, GAME_W, GAME_H);
3336
framebf_drawImg(0, 0, MENU_BACKGROUND_SIZE, MENU_BACKGROUND_SIZE, bitmap_menu_background);
34-
curDarken = 1.0f;
35-
currentRadius = 40;
3637

3738
// maze1
3839
Asset playerAsset = {ASSET_HIDDEN, ASSET_HIDDEN, PLAYER_SZ, PLAYER_SZ, bitmap_player};
3940
Position playerPos = {0, MAZE_SZ_CELL / 2};
4041
Player player = {&playerAsset, &playerPos};
4142

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};
4550

4651
Maze mz1 = {.level = 1, .pathColor = -1, .bitmap = bitmap_maze1, .bitmapState = bitmap_mazeState1,
47-
.itemMetas = {&visionMeta}, .itemMetasSz = 1,
52+
.itemMetas = {&visionMeta1, &visionMeta12}, .itemMetasSz = 2,
4853
.player = &player};
4954

5055
// 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-
5656
Asset visionAsset2 = {ASSET_HIDDEN, ASSET_HIDDEN, ITEM_SZ, ITEM_SZ, bitmap_vision};
57-
Position visionPos2 = {3, 8};
57+
Position visionPos2 = {9, 7};
5858
ItemMeta visionMeta2 = {&visionAsset2, &visionPos2, VISION, false};
5959

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+
6069
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,
6371
.player = &player};
6472

6573
// 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+
7495

7596
// menu
7697
int menuPosX = 220, menuPosY = 250, yOffset = 50;
7798
char *opts[] = {"Start", "Choose Level", "How To Play?", "Exit"};
7899
int optSz = sizeof(opts) / sizeof(opts[0]);
79-
// <<<<<<< HEAD
80100

81-
int optIdx = -1;
101+
int optIdx = -1, mazeIdx = 1;
82102
while (1) {
103+
str_debug_num(optIdx);
83104
if (optIdx == -1) {
84105
drawMenu(menuPosX, menuPosY, yOffset, opts,
85106
optSz, MENU_FOREGND, MENU_BACKGND, true);
@@ -91,13 +112,10 @@ void game_enter() {
91112

92113
switch (optIdx) {
93114
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");
98117
break;
99118
}
100-
101119
case 1: //continue
102120
optIdx = -1;
103121
game_continue();
@@ -134,18 +152,20 @@ int game_menu_enter() {
134152
}
135153

136154

137-
void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
155+
void game_start(Maze *mz, int *_optIdx, int *_mazeIdx){
138156
uart_puts("Starting Game...\n");
139157
bool isFOVShown = true;
140158
Player *pl = mz->player;
141159
*_optIdx = -1;
142160

143-
// rseset maze
161+
// reset player
144162
pl->pos->posX = 0; pl->pos->posY = MAZE_SZ_CELL / 2;
145163
pl->step = 0;
164+
165+
// reset maze
146166
curDarken = 1;
167+
currentRadius = LIGHT_RADIUS;
147168
getMazePathColor(mz);
148-
// TODO: reset item status
149169
for (int i = 0 ; i < mz->itemMetasSz; i++){
150170
ItemMeta *meta = mz->itemMetas[i];
151171
meta->collided = false;
@@ -166,7 +186,6 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
166186
for (int i = 0 ; i < mz->itemMetasSz; i++){
167187
ItemMeta *meta = mz->itemMetas[i];
168188
posBeToFe(meta->pos, meta->asset);
169-
embedAsset(mz, meta->asset, true);
170189
}
171190
render_scene(mz, pl->asset, isFOVShown);
172191
// TODO: paint breakable wall !!!
@@ -179,17 +198,18 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
179198
debug_pos(*(pl->pos));
180199

181200
// 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
193213
int game_stage = game_menu_enter();
194214
switch (game_stage) {
195215
case 0:
@@ -201,13 +221,13 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
201221
MENU_BACKGROUND_SIZE, bitmap_menu_background);
202222
return;
203223
}
204-
// str_debug_num(game_stage);
205224
}
206225
else if (c == 'q'){
226+
// explode wall with bomb
207227
effect_bomb(mz, pl);
208228
}
209229
else {
210-
// spinning
230+
// TODO: spinning function
211231
Direction dir = -1;
212232
for (int i = 0; i < 4; i++){
213233
if (directionKey[i] == c){
@@ -216,16 +236,16 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
216236
}
217237
if (dir == -1) continue;
218238
drawFOV(mz, pl->asset);
219-
drawMoveAnimation(pl->asset, dir, 2);
239+
drawMovementFrame(pl->asset, dir, 2);
220240

221-
// update position
241+
// TODO: update position function
222242
Position posTmp = {pl->pos->posX, pl->pos->posY};
223243
update_pos(&posTmp, dir); uart_puts("-> "); debug_pos(posTmp);
224244
if (posTmp.posX < 0 || posTmp.posY < 0 ||
225245
posTmp.posX >= MAZE_SZ_CELL || posTmp.posY >= MAZE_SZ_CELL) continue;
226246

227247
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);
229249
if (mazeState == 0) continue;
230250

231251
// post-moving
@@ -235,57 +255,36 @@ void game_start(Maze *mz, int *_optIdx, const uint8_t mazeIdx){
235255

236256
// detect end of maze
237257
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+
}
244268
return;
245269
}
246270

247-
// darken screen interval
271+
// darken screen interval + game over
248272
pl->step += 1;
249-
if (pl->step % 3 == 0) {
273+
if (pl->step % 7 == 0) {
250274
adjustBrightness(mz, pl->asset, true);
251275
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;
279278
}
280279
}
281280

281+
// colision
282282
handle_collision(collidedItem, mz, pl);
283283
}
284284
}
285285
}
286286

287287

288-
289288
void game_continue() {
290289
int menuPosX = 220, menuPosY = 250, yOffset = 50;
291290
char *opts[] = {"Level 1", "Level 2", "Level 3", "Back to Menu"};
@@ -346,10 +345,51 @@ void game_help() {
346345
void game_exit() {
347346
clearScreen();
348347
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+
}
350380
}
351381

352382

383+
384+
385+
386+
387+
388+
389+
390+
391+
392+
353393
// ============================== GAME ITEM
354394
void effect_vision(Maze *maze, Player *player){
355395
currentRadius = currentRadius + 20;

0 commit comments

Comments
 (0)