void consoleInputDraw() { for (int x = 76; x < 99; x++) TCOD_console_put_char(NULL, x, 73, ' ', TCOD_BKGND_NONE); TCOD_console_print_left_rect(NULL, 76, 73, 23, 1, TCOD_BKGND_NONE, g_cConsoleInput); return; }
void consoleInputClear() { memset(&g_cConsoleInput, 0, sizeof(g_cConsoleInput)); g_iConsoleInputCount = 0; for (int x = 76; x < 99; x++) TCOD_console_put_char(NULL, x, 73, ' ', TCOD_BKGND_NONE); return; }
static void draw_tile(int x, int y, unsigned tile, bool vis) { if (vis) { TCOD_console_set_default_foreground(NULL, tiles[tile].lit); } else { TCOD_console_set_default_foreground(NULL, tiles[tile].unlit); } TCOD_console_put_char(NULL, x, y, tiles[tile].face, TCOD_BKGND_NONE); }
void consoleDraw() { TCOD_console_put_char(NULL, 75, 44, 204, TCOD_BKGND_NONE); for (int x = 76; x < 99; x++) TCOD_console_put_char(NULL, x, 44, 205, TCOD_BKGND_NONE); TCOD_console_put_char(NULL, 99, 44, 185, TCOD_BKGND_NONE); TCOD_console_print_left(NULL, 78, 44, TCOD_BKGND_NONE, "Console"); for (int x = 76; x < 99; x++) for (int y = 45; y < 73; y++) TCOD_console_put_char(NULL, x, y, ' ', TCOD_BKGND_NONE); int iCount = 0; int iHeight = 0; for (int i = 0; i < 32; i++) { if (g_cConsole[i] != NULL) { iCount += iHeight = TCOD_console_height_left_rect(NULL, 76, 45, 23, 29, g_cConsole[i]); if (iCount < 29) TCOD_console_print_left_rect(NULL, 76, 73-iCount, 23, iHeight, TCOD_BKGND_NONE, g_cConsole[i]); } } return; }
void TCOD_console_print_double_frame(TCOD_console_t con,int x,int y,int w,int h, bool empty, TCOD_bkgnd_flag_t flag, const char *fmt, ...) { TCOD_console_data_t *dat = con ? (TCOD_console_data_t *)con : TCOD_ctx.root; TCOD_console_put_char(con,x,y,TCOD_CHAR_DNW,flag); TCOD_console_put_char(con,x+w-1,y,TCOD_CHAR_DNE,flag); TCOD_console_put_char(con,x,y+h-1,TCOD_CHAR_DSW,flag); TCOD_console_put_char(con,x+w-1,y+h-1,TCOD_CHAR_DSE,flag); TCOD_console_double_hline(con,x+1,y,w-2, flag); TCOD_console_double_hline(con,x+1,y+h-1,w-2, flag); TCOD_console_double_vline(con,x,y+1,h-2, flag); TCOD_console_double_vline(con,x+w-1,y+1,h-2, flag); if ( h > 2 ) { TCOD_console_vline(con,x,y+1,h-2,flag); TCOD_console_vline(con,x+w-1,y+1,h-2,flag); if ( empty ) { TCOD_console_rect(con,x+1,y+1,w-2,h-2,true,flag); } } if (fmt) { va_list ap; int xs; TCOD_color_t tmp; char *title; va_start(ap,fmt); title = TCOD_console_vsprint(fmt,ap); va_end(ap); title[w-3]=0; /* truncate if needed */ xs = x + (w-strlen(title)-2)/2; tmp=dat->back; /* swap colors */ dat->back=dat->fore; dat->fore=tmp; TCOD_console_print_ex(con,xs,y,TCOD_BKGND_SET,TCOD_LEFT," %s ",title); tmp=dat->back; /* swap colors */ dat->back=dat->fore; dat->fore=tmp; } }
void TCOD_console_double_vline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { int i; for (i=y; i< y+l; i++) TCOD_console_put_char(con,x,i,TCOD_CHAR_DVLINE,flag); }
void TCOD_console_double_hline(TCOD_console_t con,int x,int y, int l, TCOD_bkgnd_flag_t flag) { int i; for (i=x; i< x+l; i++) TCOD_console_put_char(con,i,y,TCOD_CHAR_DHLINE,flag); }
int main(int argc, char **argv) { int iItemToPlace = ITEM_ORE_STONE; int iInventoryOffset = 0; int iInventoryPointer = 0; int iInventorySelection = -1; int iLookX = 0; int iLookY = 0; int iNewX = 0; int iNewY = 0; int iSelect = 0; TCOD_key_t tKey; char cCharCode; bool bTurnOver = false; globalsInit(); TCOD_console_set_custom_font("terminal8x8_gs_ro.png", TCOD_FONT_TYPE_GREYSCALE | TCOD_FONT_LAYOUT_ASCII_INROW, 16, 16); TCOD_console_init_root(100, 75, "RogueCraft", false); TCOD_console_set_background_color(NULL, TCOD_black); TCOD_console_set_foreground_color(NULL, TCOD_light_grey); g_tcodMap = TCOD_map_new(DEF_WORLD_X, DEF_WORLD_Y); mapClear(); generateBSPtoMap(true); itemPopulate(ITEM_ORE_IRON, 0, 45, 100); itemPopulate(ITEM_ORE_COPPER, 0, 35, 100); itemPopulate(ITEM_ORE_STONE_WEAK, 0, 25, 100); /* Populate a torch ... or three. */ itemPopulate(25, 1, 35, 100); mapRemapLight(25); playerInit(); TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW); iNewX = g_ego.m_stats.m_iWorldX; iNewY = g_ego.m_stats.m_iWorldY; /* Debug code for inventory management */ inventoryAdd(&g_ego.m_inventory, 30, 1); inventoryAdd(&g_ego.m_inventory, 31, 1); g_iGameMode = MODE_INTRO; npcPopulate(1, 1, 55, 100); while (!TCOD_console_is_window_closed()) { tKey = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED); cCharCode = tolower(tKey.c); /* Global inputs */ switch (tKey.vk) { case TCODK_ESCAPE: if (g_iGameMode != MODE_GAME && g_iGameMode != MODE_INTRO) { if (g_iGameMode == MODE_LOOK) { iNewX = g_ego.m_stats.m_iWorldX; iNewY = g_ego.m_stats.m_iWorldY; TCOD_console_put_char(NULL, iLookX, iLookY, 0, TCOD_BKGND_NONE); } g_iGameMode = MODE_GAME; inventoryClear(); } else { TCOD_console_delete(NULL); SDL_Quit(); return 1; } break; case TCODK_PRINTSCREEN: TCOD_sys_save_screenshot(NULL); break; case TCODK_KP1: iNewX--; iNewY++; break; case TCODK_KP2: iNewY++; break; case TCODK_KP3: iNewX++; iNewY++; break; case TCODK_KP4: iNewX--; break; case TCODK_KP6: iNewX++; break; case TCODK_KP7: iNewX--; iNewY--; break; case TCODK_KP8: iNewY--; break; case TCODK_KP9: iNewX++; iNewY--; break; default: break; } /* Mode inputs */ switch (g_iGameMode) { case MODE_INTRO: TCOD_console_clear(NULL); scene_intro(); scene_intro_input(tKey, cCharCode); break; case MODE_GAME: mapDraw(); inventoryDrawBorder(); playerStatsList(); consoleDraw(); consoleInputDraw(); TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 16, TCOD_BKGND_NONE); TCOD_console_put_char(NULL, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, '@', TCOD_BKGND_NONE); iInventorySelection = inventoryList(&g_ego.m_inventory, iInventoryPointer, iInventoryOffset); TCOD_console_print_left(NULL, 78, 31, TCOD_BKGND_NONE, "Inventory"); if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) { if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) { if (g_npcMap[iNewX][iNewY] == NULL) { if (g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable) { g_ego.m_stats.m_iWorldX = iNewX; g_ego.m_stats.m_iWorldY = iNewY; TCOD_console_put_char(NULL, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, ' ', TCOD_BKGND_NONE); g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_WALK_ONTO, iNewX, iNewY, NULL); } else { g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_WALK_INTO, iNewX, iNewY, NULL); iNewX = g_ego.m_stats.m_iWorldX; iNewY = g_ego.m_stats.m_iWorldY; mapMakeFOV(); inventoryClear(); } } else { /* We've bumped into an NPC. */ g_npcMap[iNewX][iNewY]->m_vFunc(ACT_WALK_INTO, iNewX, iNewY, g_npcMap[iNewX][iNewY]); iNewX = g_ego.m_stats.m_iWorldX; iNewY = g_ego.m_stats.m_iWorldY; } TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW); TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable); TCOD_map_copy(g_tcodMap, g_tcodLightmap); mapRemapLight(25); playerCalcVisibility(); bTurnOver = true; } } switch (cCharCode) { case 'q': /* Place block (why q?) */ g_iGameMode = MODE_BLOCK; consoleAdd("Place where?"); break; case 'o': /* Open something */ g_iGameMode = MODE_OPEN; consoleAdd("Open where?"); break; case 'l': /* Look around */ g_iGameMode = MODE_LOOK; iLookX = g_ego.m_stats.m_iWorldX; iLookY = g_ego.m_stats.m_iWorldY; iNewX = iLookX; iNewY = iLookY; playerLook(iLookX, iLookY); inventoryClear(); iInventoryOffset = 0; iInventoryPointer = 0; consoleAdd("Looking around..."); break; case 'e': /* Equip selected item in inventory */ g_itemData[iInventorySelection].m_vFunc(ACT_EQUIP, 0, 0,(void *)(iInventorySelection)); break; case 'd': /* Dequip an item */ g_iGameMode = MODE_DEQUIP; consoleAdd("Remove what?"); break; case 14: /* Up arrow (move inventory pointer) */ if (iInventoryPointer > 0) { TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 32, TCOD_BKGND_NONE); iInventoryPointer--; } else iInventoryOffset--; break; case 17: /* Down arrow (move inventory pointer) */ if (iInventoryPointer < 9) { TCOD_console_put_char(NULL, 76, 33 + iInventoryPointer, 32, TCOD_BKGND_NONE); iInventoryPointer++; } else iInventoryOffset++; break; case 64: /* Space */ g_iGameMode = MODE_CONSOLE_INPUT; break; default: break; } break; case MODE_BLOCK: if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) { if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) { g_itemData[iItemToPlace].m_vFunc(ACT_PLACE_ONTO, iNewX, iNewY, (void *)iItemToPlace); mapMakeFOV(); g_iGameMode = MODE_GAME; TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW); TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable); TCOD_map_copy(g_tcodMap, g_tcodLightmap); mapRemapLight(25); playerCalcVisibility(); bTurnOver = true; } } else { if (cCharCode == '1') iItemToPlace = ITEM_ORE_STONE; if (cCharCode == '2') iItemToPlace = ITEM_ORE_IRON; if (cCharCode == '3') iItemToPlace = ITEM_ORE_COPPER; if (cCharCode == '4') iItemToPlace = ITEM_ORE_SILVER; if (cCharCode == '5') iItemToPlace = ITEM_ORE_GOLD; } break; case MODE_OPEN: if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) { if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) { g_itemData[g_iWorld[iNewX][iNewY]].m_vFunc(ACT_OPEN, iNewX, iNewY, NULL); mapMakeFOV(); g_iGameMode = MODE_GAME; TCOD_map_compute_fov(g_tcodMap, g_ego.m_stats.m_iWorldX, g_ego.m_stats.m_iWorldY, (int)g_ego.m_fFOVDistance, true, FOV_SHADOW); TCOD_map_set_properties(g_tcodMap, iNewX, iNewY, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bTransparent, g_itemData[g_iWorld[iNewX][iNewY]].m_stats.m_bWalkable); TCOD_map_copy(g_tcodMap, g_tcodLightmap); mapRemapLight(25); playerCalcVisibility(); bTurnOver = true; } } break; case MODE_DEQUIP: switch (cCharCode) { case '1': iSelect = g_ego.m_equipment.m_iHand_L; g_ego.m_equipment.m_iHand_L = ITEM_NOTHING; break; case '2': iSelect = g_ego.m_equipment.m_iHand_R; g_ego.m_equipment.m_iHand_R = ITEM_NOTHING; break; case '3': iSelect = g_ego.m_equipment.m_iHead; g_ego.m_equipment.m_iHead = ITEM_NOTHING; break; case '4': iSelect = g_ego.m_equipment.m_iEar_L; g_ego.m_equipment.m_iEar_L = ITEM_NOTHING; break; case '5': iSelect = g_ego.m_equipment.m_iEar_R; g_ego.m_equipment.m_iEar_R = ITEM_NOTHING; break; case '6': iSelect = g_ego.m_equipment.m_iFace; g_ego.m_equipment.m_iFace = ITEM_NOTHING; break; case '7': iSelect = g_ego.m_equipment.m_iNeck; g_ego.m_equipment.m_iNeck = ITEM_NOTHING; break; case '8': iSelect = g_ego.m_equipment.m_iBack; g_ego.m_equipment.m_iBack = ITEM_NOTHING; break; case '9': iSelect = g_ego.m_equipment.m_iChest; g_ego.m_equipment.m_iChest = ITEM_NOTHING; break; case '0': iSelect = g_ego.m_equipment.m_iHands; g_ego.m_equipment.m_iHands = ITEM_NOTHING; break; case 'a': iSelect = g_ego.m_equipment.m_iWaist; g_ego.m_equipment.m_iWaist = ITEM_NOTHING; break; case 'b': iSelect = g_ego.m_equipment.m_iLegs; g_ego.m_equipment.m_iLegs = ITEM_NOTHING; break; case 'c': iSelect = g_ego.m_equipment.m_iFeet; g_ego.m_equipment.m_iFeet = ITEM_NOTHING; break; default: break; } if (iSelect != 0) { g_itemData[iSelect].m_vFunc(ACT_DEQUIP, 0, 0,(void *)(iSelect)); g_iGameMode = MODE_GAME; } break; case MODE_LOOK: if (tKey.vk >= TCODK_KP1 && tKey.vk <= TCODK_KP9) { if (iNewX >= 0 && iNewX < DEF_WORLD_X && iNewY >= 0 && iNewY < DEF_WORLD_Y) { TCOD_console_put_char(NULL, iLookX, iLookY, 0, TCOD_BKGND_NONE); iLookX = iNewX; iLookY = iNewY; playerLook(iLookX, iLookY); inventoryClear(); iInventoryOffset = 0; iInventoryPointer = 0; } } TCOD_console_put_char(NULL, iLookX, iLookY, 4, TCOD_BKGND_NONE); iInventorySelection = inventoryList(&g_itemLook, iInventoryPointer, iInventoryOffset); playerLook(iLookX, iLookY); break; case MODE_CONSOLE_INPUT: switch (tKey.vk) { case TCODK_ENTER: consoleAdd(g_cConsoleInput); consoleInputClear(); g_iGameMode = MODE_GAME; break; case TCODK_BACKSPACE: consoleInputDel(); break; default: if (cCharCode >= 32 && cCharCode <= 126) consoleInputAdd(cCharCode); break; } break; default: break; } if (bTurnOver) { npcExecute(&g_npcList); bTurnOver = false; } TCOD_console_flush(); } return 1; }
void TCOD_image_blit_2x(TCOD_image_t image, TCOD_console_t con, int dx, int dy, int sx, int sy, int w, int h) { TCOD_color_t grid[4]; TCOD_color_t cols[2]; int nbCols; int width,height,ascii,cx,cy; TCOD_console_data_t *dat; image_data_t *img=(image_data_t *)image; int maxx,maxy; TCOD_IFNOT(image != NULL) return; TCOD_image_get_size(image,&width,&height); if ( con == NULL ) dat = TCOD_root; else dat=(TCOD_console_data_t *)(con); if ( w == -1 ) w=width; if ( h == -1 ) h=height; // check that the sx,sy/w,h rectangle is inside the image TCOD_ASSERT(sx >= 0 && sy >= 0 && sx+w <= width && sy+h <= height); TCOD_IFNOT(w > 0 && h > 0) return; sx=MAX(0,sx); sy=MAX(0,sy); w = MIN(w,width-sx); h = MIN(h,height-sy); maxx=dx+w/2 <= dat->w ? w : (dat->w-dx)*2; maxy=dy+h/2 <= dat->h ? h : (dat->h-dy)*2; // check that the image is not blitted outside the console TCOD_IFNOT(dx+maxx/2 >= 0 && dy+maxy/2 >= 0 && dx < dat->w && dy < dat->h) return; maxx+=sx; maxy+=sy; for (cx=sx; cx < maxx; cx += 2) { for (cy=sy; cy < maxy; cy += 2) { // get the 2x2 super pixel colors from the image int conx=dx+(cx-sx)/2; int cony=dy+(cy-sy)/2; TCOD_color_t consoleBack=TCOD_console_get_back(con,conx,cony); grid[0]=TCOD_image_get_pixel(image,cx,cy); if ( img->has_key_color && grid[0].r == img->key_color.r && grid[0].g == img->key_color.g && grid[0].b == img->key_color.b) grid[0]=consoleBack; if ( cx < w-1 ) { grid[1]=TCOD_image_get_pixel(image,cx+1,cy); if ( img->has_key_color && grid[1].r == img->key_color.r && grid[1].g == img->key_color.g && grid[1].b == img->key_color.b) grid[1]=consoleBack; } else grid[1]=consoleBack; if ( cy < h-1 ) { grid[2]=TCOD_image_get_pixel(image,cx,cy+1); if ( img->has_key_color && grid[2].r == img->key_color.r && grid[2].g == img->key_color.g && grid[2].b == img->key_color.b) grid[2]=consoleBack; } else grid[2]=consoleBack; if ( cx < w-1 && cy < h-1 ) { grid[3]=TCOD_image_get_pixel(image,cx+1,cy+1); if ( img->has_key_color && grid[3].r == img->key_color.r && grid[3].g == img->key_color.g && grid[3].b == img->key_color.b) grid[3]=consoleBack; } else grid[3]=consoleBack; // analyse color, posterize, get pattern getPattern(grid,cols,&nbCols,&ascii); if ( nbCols == 1 ) { // single color TCOD_console_set_back(con,conx,cony,cols[0],TCOD_BKGND_SET); TCOD_console_set_char(con,conx,cony,' '); } else { if ( ascii >= 0 ) { TCOD_console_set_background_color(con,cols[0]); TCOD_console_set_foreground_color(con,cols[1]); TCOD_console_put_char(con,conx,cony,ascii,TCOD_BKGND_SET); } else { // negative ascii code means we need to invert back/fore colors TCOD_console_set_background_color(con,cols[1]); TCOD_console_set_foreground_color(con,cols[0]); TCOD_console_put_char(con,conx,cony,-ascii,TCOD_BKGND_SET); } } } } }
void TCODConsole::putChar(int x, int y, int c, TCOD_bkgnd_flag_t flag) { TCOD_console_put_char(data,x,y,c,flag); }