void gameScreen(void) { int ch; setCursorType(); mapDraw(nStage); while (1) { ch = _getch(); if (ch == 0 || ch == 224) { ch = _getch(); switch (ch) { case UP: case DOWN: case LEFT: case RIGHT: Move(ch); break; } } else { switch (ch) { case 'm': case 'M': chooseMenu(); clrscr(); mapDraw(nStage); } } } }
void Move(int dir) { int dx = 0, dy = 0; switch (dir) { case LEFT: dx = -1; break; case RIGHT: dx = 1; break; case UP: dy = -1; break; case DOWN: dy = 1; break; } int nxt = map[nStage][ny + dy][nx + dx]; if (nxt != 1) { if (nxt == 2) { // 이전 맵으로 map[nStage][ny][nx] = 0; if (nStage == 1) nx = 19, ny = 23; else if (nStage == 2) nx = 38, ny = 5; else if (nStage == 3) nx = 38, ny = 3; else if (nStage == 4) nx = 34, ny = 22; else if (nStage == 5) nx = 37, ny = 1; else if (nStage == 6) nx = 19, ny = 1; else if (nStage == 7) nx = 5, ny = 2; nStage--; if (nStage == 6) nStage = 3; map[nStage][ny][nx] = 9; clrscr(); mapDraw(nStage); } else if (nxt == 3) { // 다음 맵으로 map[nStage][ny][nx] = 0; if (nStage == 0) nx = 1, ny = 21; else if (nStage == 1) nx = 1, ny = 9; else if (nStage == 2) nx = 2, ny = 21; else if (nStage == 3) nx = 2, ny = 19; else if (nStage == 4) nx = 19, ny = 22; else if (nStage == 5) nx = 1, ny = 4; nStage++; map[nStage][ny][nx] = 9; clrscr(); mapDraw(nStage); } else if (nxt == 4) { if (nStage == 0) { // 첫 번째 맵의 5번째 줄에 있는 npc if (ny + dy == 5) n1.Dialogue(); else if (ny + dy == 14) n2.Dialogue(); else if (ny + dy == 16) n5.Dialogue(); else if (ny + dy == 6) n6.Dialogue(); } else if (nStage == 1) { n2.Dialogue(); map[1][21][34] = 0; gotoxy(70, 21); std::cout << " "; map[0][14][4] = 4; } else if (nStage == 2) { n3.Dialogue(); } else if (nStage == 3) { if (ny + dy == 2) { // 숨겨진 맵으로 n4.Dialogue(); // 다른 npc로 변경 map[nStage][ny][nx] = 0; map[nStage][2][4] = 0; nx = 38, ny = 3; nStage = 7; map[nStage][ny][nx] = 9; map[nStage][1][38] = 4; clrscr(); mapDraw(nStage); } } else if (nStage == 4) { n5.Dialogue(); map[4][21][21] = 0; gotoxy(44, 21); std::cout << " "; map[0][16][28] = 4; } else if (nStage == 5) { n6.Dialogue(); map[5][13][8] = 0; gotoxy(18, 13); std::cout << " "; map[0][6][12] = 4; } else if (nStage == 6) { n7.Dialogue(); map[6][ny][nx] = 0; nx = 32, ny = 14; map[6][ny][nx] = 9; clrscr(); mapDraw(nStage); } else if (nStage == 7) { n4.Dialogue(); } // npc와 대화 return; } else if (nxt == 5) { // 아이템 습득 if (nStage == 0) p.item_list[0] = 1; else if (nStage == 1) p.item_list[4] += 1; else if (nStage == 2) p.item_list[6] += 1; else if (nStage == 3) p.item_list[5] += 1; else if (nStage == 5) p.item_list[6] += 1; else if (nStage == 6) p.item_list[3] = 1; else if (nStage == 7) { if (ny + dy == 16) p.item_list[1] = 1; else p.item_list[2] = 1; } map[nStage][ny + dy][nx + dx] = 0; gotoxy((ny + dy) * 2 + 2, nx + dx); std::cout << " "; return; } else if (nxt == 6) { // 몬스터 만남 HighMonster m(20, 30, AGGR); Battle b(m); clrscr(); map[nStage][ny + dy][nx + dx] = 0; mapDraw(nStage); return; } else if (nxt == 7) { // 주유소 gotoxy(5, 35); std::cout << "체력과 기력이 회복되었다!"; getKey(); p.HealHP(10000); p.HealAP(1000); gotoxy(5, 35); std::cout << " "; if (!RandInt(20)) { p.sk_list[3] = 1; gotoxy(5, 35); std::cout << "몰아치기Lv1 스킬을 습득하였다!"; getKey(); gotoxy(5, 35); std::cout << " "; } return; } else if (nxt == 8) { gotoxy(5, 35); std::cout << "심상치 않은 기운이 느껴지는 구체다.."; getKey(); gotoxy(5, 36); std::cout << "이것에서 발산되는 기운 때문에 몬스터가 생기는듯 하다."; getKey(); gotoxy(5, 37); std::cout << "내일의 안녕을 위하여!!!"; getKey(); BossMonster boss; Battle b(boss); clrscr(); map[nStage][ny][nx] = 0; nx = 5, ny = 12; map[nStage][ny][nx] = 9; clrscr(); mapDraw(nStage); gotoxy(5, 35); std::cout << "..!! 보스를 잡았지만 갇혔다?!"; getKey(); gotoxy(5, 35); std::cout << " "; // 보스 return; } else if (nxt == 10) { gotoxy(5, 35); std::cout << "..!! 비밀 문을 찾았다!!"; getKey(); map[nStage][ny][nx] = 0; nStage = 0, nx = 1, ny = 1; map[nStage][ny][nx] = 9; char buf[BUF_LEN]; std::ifstream ep(end_file, std::ios::in | std::ios::binary); if (!ep.is_open()) { std::cerr << "파일 오픈 실패." << std::endl << "ASCII 폴더와 텍스트 파일을 확인해 주십시오." << std::endl; exit(1); } bigConsoleSize(); std::memset(buf, 0, BUF_LEN); while (!ep.eof()) { ep.read((char*)buf, BUF_LEN - 1); buf[BUF_LEN - 1] = 0; std::cout << buf; std::memset(buf, 0, BUF_LEN); } ep.close(); std::cin.get(); setConsoleSize(); mapDraw(nStage); } else { gotoxy(nx * 2 + 2, ny); std::cout << " "; map[nStage][ny][nx] = 0; nx += dx; ny += dy; map[nStage][ny][nx] = 9; gotoxy(nx * 2 + 2, ny); std::cout << "P"; if (nStage != 0 && nStage != 7 && !RandInt(30)) // 1/30 확률 { if (nStage >= 1 && nStage <= 3) { int rand_mon = RandInt(3); if (rand_mon == 1) { LowMonster m(nStage * (RandInt(3) + 1), nStage * 10, AGGR); Battle b(m); clrscr(); mapDraw(nStage); } else if (rand_mon == 2) { LowMonster m(nStage * (RandInt(3) + 1), nStage * 5, DEFN); Battle b(m); clrscr(); mapDraw(nStage); } else { LowMonster m(nStage * (RandInt(3) + 1)); Battle b(m); clrscr(); mapDraw(nStage); } if (!RandInt(10)) // 1 / 10 확률로 { p.sk_list[0] = 1; gotoxy(5, 35); std::cout << "강타Lv1 스킬을 얻었다!"; getKey(); gotoxy(5, 35); std::cout << " "; } } else if (nStage >= 4 && nStage <= 6) { int rand_mon = RandInt(3); if (rand_mon == 1) { HighMonster m(nStage * (RandInt(3) + 1), nStage * 20, AGGR); Battle b(m); clrscr(); mapDraw(nStage); } else if (rand_mon == 2) { HighMonster m(nStage * (RandInt(3) + 1), nStage * 15, DEFN); Battle b(m); clrscr(); mapDraw(nStage); } else { HighMonster m(nStage * (RandInt(3) + 1)); Battle b(m); clrscr(); mapDraw(nStage); } if (!RandInt(10)) // 1 / 10 확률로 { p.sk_list[1] = 1; gotoxy(5, 35); std::cout << "강타Lv2 스킬을 얻었다!"; getKey(); gotoxy(5, 35); std::cout << " "; } else if (!RandInt(20)) // 9/200 확률로 { p.sk_list[2] = 1; gotoxy(5, 35); std::cout << "강타Lv3 스킬을 얻었다!"; getKey(); gotoxy(5, 35); std::cout << " "; } } } return; } } }
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; }