static void gui_render(struct engine *engine) { /* Clear the gui console */ TCOD_console_set_default_background(engine->gui->con, TCOD_black); TCOD_console_clear(engine->gui->con); /* Render health bar */ engine->gui->render_bar(engine, 1, 1, BAR_W, "HP", engine->player->life->hp, engine->player->life->max_hp, TCOD_white, TCOD_lighter_gray); /* Render XP bar */ double next_level_xp = calc_next_level_xp(engine, engine->player); char xp_txt[20]; sprintf(xp_txt, "level %d XP", engine->player->ai->xp_level); engine->gui->render_bar(engine, 1, 2, BAR_W, xp_txt, engine->player->ai->xp, next_level_xp, TCOD_white, TCOD_lighter_gray); render_status(engine->gui->con, 1, 4, engine->player); engine->gui->render_log(engine, MSG_X, 1); engine->gui->render_mouse_look(engine); TCOD_console_blit(engine->gui->con, 0, 0, engine->window_w, PANEL_H, NULL, 0, engine->window_h - PANEL_H, 1.f, 1.f); }
/* renders the textfield */ void TCOD_text_render (TCOD_text_t txt, TCOD_console_t con) { text_t * data = (text_t*)txt; uint32 time; bool cursor_on; char back=0; int curx,cury,cursorx,cursory, curpos; char *ptr; TCOD_IFNOT(data && data->con ) return; time = TCOD_sys_elapsed_milli(); cursor_on = (int)( time % data->interval ) > data->halfinterval; TCOD_console_set_default_background(data->con, data->back); TCOD_console_set_default_foreground(data->con, data->fore); TCOD_console_clear(data->con); /* compute cursor position */ get_cursor_coords(data,&cursorx,&cursory); if ( cursor_on && data->ascii_cursor) { /* save the character under cursor position */ back = data->text[data->cursor_pos]; data->text[data->cursor_pos] = data->ascii_cursor; } /* render prompt */ if (data->prompt) TCOD_console_print_rect_ex(data->con,0,0,data->w,data->h,TCOD_BKGND_SET,TCOD_LEFT,"%s",data->prompt); /* render text */ curx=data->textx; cury=data->texty; ptr=data->text; curpos=0; while (*ptr) { if ( *ptr == '\n') { if ( (curx == 0 || curpos == 0 ) && curpos >= data->sel_start && curpos < data->sel_end ) { /* inverted colors for selected empty lines */ TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con, curx, cury, data->back); } curx=0; cury++; } else { if ( curpos >= data->sel_start && curpos < data->sel_end ) { /* inverted colors for selection */ TCOD_console_set_char_background(data->con, curx, cury, data->fore, TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con, curx, cury, data->back); } TCOD_console_set_char(data->con,curx,cury,*ptr); curx++; if ( curx == data->w ) { curx=0; cury++; } } ptr++; curpos++; } if ( cursor_on ) { if ( data->ascii_cursor) { /* restore the character under cursor */ data->text[data->cursor_pos] = back; } else { /* invert colors at cursor position */ TCOD_console_set_char_background(data->con,cursorx,cursory,data->fore,TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->back); } } else if (! cursor_on && ! data->ascii_cursor && data->multiline ) { /* normal colors for cursor ( might be inside selection ) */ TCOD_console_set_char_background(data->con,cursorx,cursory,data->back,TCOD_BKGND_SET); TCOD_console_set_char_foreground(data->con,cursorx,cursory,data->fore); } TCOD_console_blit(data->con,0,0,data->w,data->h,con,data->x,data->y,1.0f,data->transparency); }
void TCODConsole::blit(const TCODConsole *srcCon,int xSrc, int ySrc, int wSrc, int hSrc, TCODConsole *dstCon, int xDst, int yDst, float foreground_alpha, float background_alpha) { TCOD_console_blit(srcCon->data,xSrc,ySrc,wSrc,hSrc,dstCon->data,xDst,yDst,foreground_alpha, background_alpha); }
/* The main game loop */ void play(void) { int playing = 1; int x, y, vpx, vpy; /* A messy way to do the map, works for now */ map_t *map = map_new(50, 50); generate_cave(map); map_fov_build(map); /* Set up the offscreen consoles */ map_layer = TCOD_console_new(ui_viewport_width, ui_viewport_height); psion_layer = TCOD_console_new(ui_viewport_width, ui_viewport_height); TCOD_console_set_key_color(psion_layer, C_KEY); bgcolor(psion_layer, C_KEY); /* Set up the player */ init_player(); rename_player("Gu the Cabeboy"); blink_player(map); /* Initialize the inventory */ /* Enter the main game loop! */ while (playing) { /* Prepare the screen for drawing */ clear(NULL); /* Calculate the position of the viewport */ vpx = player->x - ui_viewport_width/2 > 0 ? player->x - ui_viewport_width/2 : 0; vpy = player->y - ui_viewport_height/2 > 0 ? player->y - ui_viewport_height/2 : 0; if ((vpx + ui_viewport_width) > map->width) { vpx = map->width - ui_viewport_width; } if ((vpy + ui_viewport_height) > map->height) { vpy = map->height - ui_viewport_height; } if (ui_viewport_width > map->width) { vpx = 0; } if (ui_viewport_height > map->height) { vpy = 0; } /* Calculate the field of view */ map_fov_do(map, player->x, player->y); /* Only display the part of the map inside the viewport */ for (y = 0; y < ui_viewport_height; y++) { for (x = 0; x < ui_viewport_width; x++) { if (((vpy+y) < map->height) && ((vpx+x) < map->width)) { tile_t *tile = tile_at(map, vpx+x, vpy+y); if (TCOD_map_is_in_fov(map->fov, vpx+x, vpy+y)) { fgcolor(map_layer, tile->fg_lit); } else { fgcolor(map_layer, tile->fg_dark); } putch(map_layer, x, y, tile->glyph); } } } TCOD_console_blit(map_layer, 0, 0, ui_viewport_width, ui_viewport_height, NULL, ui_viewport_x, ui_viewport_y, 255); /* Draw the player and status */ fgcolor(NULL, C_WHITE); putch(NULL, ui_viewport_x+player->x-vpx, ui_viewport_y+player->y-vpy, '@'); fgcolor(NULL, C_MSG); putstr(NULL, 1, 23, player->name); /* Redraw the screen */ update(); /* Handle keypress */ TCOD_key_t k = getkey(); if (k.c == 0) { switch (k.vk) { /* Move around */ case TCODK_KP7: /* up left */ attempt_move(map, player->x-1, player->y-1); break; case TCODK_KP8: /* up */ case TCODK_UP: attempt_move(map, player->x, player->y-1); break; case TCODK_KP9: /* up right */ attempt_move(map, player->x+1, player->y-1); break; case TCODK_KP1: /* down left */ attempt_move(map, player->x-1, player->y+1); break; case TCODK_KP2: /* down */ case TCODK_DOWN: attempt_move(map, player->x, player->y+1); break; case TCODK_KP3: /* down right */ attempt_move(map, player->x+1, player->y+1); break; case TCODK_KP4: /* left */ case TCODK_LEFT: attempt_move(map, player->x-1, player->y); break; case TCODK_KP6: /* right */ case TCODK_RIGHT: attempt_move(map, player->x+1, player->y); break; /* View character summary */ case TCODK_TAB: character(); break; default: printf("%d %d\n", TCODK_TAB, k.vk); break; } } else { switch (k.c) { /* Quit the game */ case 'Q': playing = quit(); break; /* Open up the inventory */ case 'i': inventory(); break; /* View character summary */ case 'c': character(); break; /* Use scan ability */ case 's': psion_scan(map); break; default: break; } } } /* Clean up, the game is over */ map_destroy(map); }