Collab_RPG/src/dialogs.c

99 lines
3.6 KiB
C
Raw Normal View History

#include "dialogs.h"
#include <gint/keyboard.h>
#include <gint/cpu.h>
#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(&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;i<BOX_HEIGHT;i++){
draw(game);
drect(0, 0, DWIDTH, i*PXSIZE, C_WHITE);
drect(0, i*PXSIZE, DWIDTH, (i+1)*PXSIZE, C_BLACK);
dsubimage(4*PXSIZE, 2*PXSIZE, face, 0, 0, F_WIDTH, (i-8)*PXSIZE,
DIMAGE_NONE);
dupdate();
while(game->frame_duration < 20) sleep();
game->frame_duration = 0;
}
/* We should start to drawint the text on the x axis at BOX_HEIGHT to avoid
* drawing on the face. */
/* Show a little message that showing text in dialogs is not implemented
* yet. */
for(i=0;i<strlen(text);i++){
/* Get how many chars we can draw on screen with a padding on the left
* and on the right of 1 px. */
drsize(text+i, &FONT_USED, DWIDTH-2, &line_max_chars);
/* TODO: Handle lines that are longer than what I can draw. */
/* Loop from the end to the start for word wrap. */
for(n=line_max_chars; n>0; 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(l<max_lines_amount-1){
/* If we have not filled everthing with text at the end. */
/* 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 ...");
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);
drect(0, i*PXSIZE, DWIDTH, (i+1)*PXSIZE, C_BLACK);
dsubimage(4*PXSIZE, 2*PXSIZE, face, 0, 0, F_WIDTH, (i-8)*PXSIZE,
DIMAGE_NONE);
dupdate();
while(game->frame_duration < 20) sleep();
game->frame_duration = 0;
}
}