From 813c23ad00082e81e58676ae52e26a4802442d86 Mon Sep 17 00:00:00 2001 From: mibi88 Date: Tue, 11 Jul 2023 11:23:27 +0200 Subject: [PATCH] Dialogs management should work, had not the time to test it yet. --- src/dialogs.c | 70 ++++++++++++++++++++++++++++++++++++++++++++------- src/map.c | 57 ++++++++++++++++++++--------------------- src/map.h | 4 +-- 3 files changed, 90 insertions(+), 41 deletions(-) diff --git a/src/dialogs.c b/src/dialogs.c index b4cb299..abc7ba3 100644 --- a/src/dialogs.c +++ b/src/dialogs.c @@ -6,10 +6,15 @@ #define BOX_HEIGHT (F_HEIGHT/PXSIZE+8) extern font_t fontRPG; +#define FONT_USED fontRPG void showtext(Game *game, bopti_image_t *face, char *text) { - dfont(&fontRPG); - unsigned int i; + dfont(&FONT_USED); + unsigned int i, n, y = 1, l = 0; + int line_max_chars; + unsigned int max_lines_amount = BOX_HEIGHT/(FONT_USED.line_height + + FONT_USED.char_spacing); + /* Run a little fancy animation. */ for(i=0;i0; n--) { + /* If we found a space, we can draw this line and do the same for + * the next line. */ + if(text[i+n] == ' '){ + dtext_opt(1, y, C_BLACK, C_NONE, DTEXT_TOP, DTEXT_LEFT, text+i, + n); /* Draw everything. */ + /* Increment y by the line height plus the space between them. + */ + y += FONT_USED.line_height+FONT_USED.char_spacing; + i += n; /* We drew everything to i+n */ + l++; /* We drew one more line. */ + break; + } + } + if(l>=max_lines_amount-1){ + /* We drew one entire screen, reset everything to draw the next one. + */ + /* Make a little animation :). */ + dupdate(); + while(game->frame_duration < 20) sleep(); + game->frame_duration = 0; + /* Ask the user to press EXE to continue. */ + dtext(1, y, C_BLACK, "[EXE] To continue ..."); + /* Reset y and l. */ + y = 1; + l = 0; + /* Clear the screen. */ + drect(0, i*PXSIZE, DWIDTH, (i+1)*PXSIZE, C_BLACK); + } + /* Make a little animation :). */ + dupdate(); + if(l>=max_lines_amount-1){ + while(getkey().key != KEY_EXE) sleep(); + } + else{ + while(game->frame_duration < 20) sleep(); + } + game->frame_duration = 0; } + if(lframe_duration < 20) sleep(); + game->frame_duration = 0; + /* Ask the user to press EXE to continue. */ + dtext(1, y, C_BLACK, "[EXE] To continue ..."); + while(getkey().key != KEY_EXE) sleep(); + } + /* Run another little fancy animation. */ for(i=40;i>0;i--){ draw(game); drect(0, 0, DWIDTH, i*PXSIZE, C_WHITE); @@ -42,5 +96,3 @@ void showtext(Game *game, bopti_image_t *face, char *text) { game->frame_duration = 0; } } - - diff --git a/src/map.c b/src/map.c index e80fe10..361e592 100644 --- a/src/map.c +++ b/src/map.c @@ -26,6 +26,8 @@ void render_map(Player *player, Map *map_level) { unsigned short int xtile, ytile; /* The layer we're drawing */ unsigned char l; + /* The index of the current tile we're drawing in the layer. */ + int current_index; /* Fix sx. */ if(player->xnblayers-1; l++){ /* Draw a layer of the map on screen. */ for(y=0;y=0 && tx+x < map_level->w && ty+y>=0 && ty+y < map_level->h){ /* index of the current tile */ - int currentIndex = (y+ty) * map_level->w + tx+x; + current_index = (y+ty) * map_level->w + tx+x; /* we get the ID of the tile in the current drawable layers */ - tile = map_level->layers[l][currentIndex]; + tile = map_level->layers[l][current_index]; /* tile == -1 means nothing to be drawn */ if(tile >= 0){ @@ -115,8 +116,6 @@ void render_map_by_layer(Player *player, Map *map_level, int layer) { unsigned short int sx, sy; /* The position of the tile in the tileset. */ unsigned short int xtile, ytile; - /* The layer we're drawing */ - unsigned char l; /* Fix sx. */ if(player->x=0 && tx+x < map_level->w && - ty+y>=0 && ty+y < map_level->h){ - /* index of the current tile */ - int currentIndex = (y+ty) * map_level->w + tx+x; - /* we get the ID of the tile in the current drawable layers - */ - tile = map_level->layers[layer][currentIndex]; - - /* tile == -1 means nothing to be drawn */ - if(tile >= 0){ - /* get x and y position in the tileset image */ - xtile = (tile % map_level->tileset_size) * T_WIDTH; - ytile = (tile / map_level->tileset_size) * T_HEIGHT; - /* render */ - dsubimage(x*T_WIDTH-mx, y*T_HEIGHT-my, - map_level->tileset, xtile, ytile, T_WIDTH, - T_HEIGHT, DIMAGE_NONE); - } + /* Draw a layer of the map on screen. */ + for(y=0;y=0 && tx+x < map_level->w && + ty+y>=0 && ty+y < map_level->h){ + /* index of the current tile */ + int currentIndex = (y+ty) * map_level->w + tx+x; + /* we get the ID of the tile in the current drawable layers + */ + tile = map_level->layers[layer][currentIndex]; + + /* tile == -1 means nothing to be drawn */ + if(tile >= 0){ + /* get x and y position in the tileset image */ + xtile = (tile % map_level->tileset_size) * T_WIDTH; + ytile = (tile / map_level->tileset_size) * T_HEIGHT; + /* render */ + dsubimage(x*T_WIDTH-mx, y*T_HEIGHT-my, + map_level->tileset, xtile, ytile, T_WIDTH, + T_HEIGHT, DIMAGE_NONE); } } } + } } diff --git a/src/map.h b/src/map.h index be18c01..37d3eef 100644 --- a/src/map.h +++ b/src/map.h @@ -28,7 +28,8 @@ /* Draws the map map on the entire screen to be viewed by the player player. */ void render_map(Player *player, Map *map_level); -/* Draws the map layer on the entire screen to be viewed by the player player. */ +/* Draws the map layer on the entire screen to be viewed by the player player. + */ void render_map_by_layer(Player *player, Map *map_level, int layer); /* Get the tile at (x, y) of the map map. If the tile is located outside of the @@ -39,4 +40,3 @@ short int get_tile(Map *map_level, int x, int y, int l); short int get_walkable(Map *map_level, int x, int y); #endif -