light *createLight(int x, int y) { light *_c, *_p_c; _c = calloc(1, sizeof(light)); _c->x = x; _c->y = y; _c->prev = NULL; _c->next = NULL; _c->fov = copyLevelMap(); _c->lightMap = TCOD_map_new(WINDOW_WIDTH, WINDOW_HEIGHT); TCOD_map_compute_fov(_c->fov, x, y, 32, 1, FOV_SHADOW); if (LIGHTS == NULL) { LIGHTS = _c; } else { _p_c = LIGHTS; while (_p_c->next) { _p_c = _p_c->next; } _p_c->next = _c; _c->prev = _p_c; } return _c; }
void _initDynamicLight(light *lght) { if (lght->fov) { TCOD_map_delete(lght->fov); } else { printf("Trying to init a light with no existing fov.\n"); } if (lght->lightMap) { TCOD_map_delete(lght->lightMap); } else { printf("Trying to init a light with no existing light map.\n"); } lght->fov = copyLevelMap(); lght->lightMap = copyLevelMap(); TCOD_map_compute_fov(lght->fov, lght->x, lght->y, lght->size, 1, FOV_SHADOW); }
void _lightLogic(light *lght) { int newSize = lght->size; if (lght->fuel < lght->size) { newSize -= lght->size - lght->fuel; } TCOD_map_compute_fov(lght->fov, lght->x, lght->y, newSize, 1, FOV_SHADOW); if (lght->fuel > 0) { lght->fuel --; } if (lght->fuel < 0) { printf("Warning: Light has less than 0 fuel.\n"); lght->fuel = 0; } }
void _resetActorForNewLevel(character *actor) { if (actor->fov) { TCOD_map_delete(actor->fov); } actor->fov = copyLevelMap(); if (actor->path) { TCOD_path_delete(actor->path); } actor->path = TCOD_path_new_using_function(WINDOW_WIDTH, WINDOW_HEIGHT, _actorPathCallback, actor, 1.41f); if (actor->itemLight) { resetLight(actor->itemLight); } TCOD_map_compute_fov(actor->fov, actor->x, actor->y, actor->sightRange, 1, FOV_SHADOW); }
/* Computes the fov */ void map_fov_do(map_t *map, int x, int y) { TCOD_map_compute_fov(map->fov, x, y, player->fov_radius); }
void TCODMap::computeFov(int x, int y, int maxRadius, bool light_walls, TCOD_fov_algorithm_t algo) { TCOD_map_compute_fov(data,x,y,maxRadius,light_walls, algo); }
void resetLight(light *lght) { lght->fov = copyLevelMap(); lght->lightMap = copyLevelMap(); TCOD_map_compute_fov(lght->fov, lght->x, lght->y, lght->size, 1, FOV_SHADOW); }
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 _actorLogic(character *actor) { int moved = 0; if (!actor->hp) { return; } character *player = getPlayer(), *ptr = CHARACTERS; item *weaponPtr = NULL, *actorWeapon = actorGetItemWithFlag(actor, IS_WEAPON); int hitActor = 0; int nx = actor->x + actor->vx; int ny = actor->y + actor->vy; int spawnPosition[2]; if (!actor->turns) { return; } if (actor->delay > 1) { actor->delay --; return; } actor->turns = 0; actor->delay = 0; if (actor->nextStanceFlagsToAdd) { tickSystemsWithMaskForEntity(getWorld(), actor->entityId, EVENT_ADD_STANCE); actor->stanceFlags |= actor->nextStanceFlagsToAdd; actor->nextStanceFlagsToAdd = 0x0; } if (actor->nextStanceFlagsToRemove) { tickSystemsWithMaskForEntity(getWorld(), actor->entityId, EVENT_REMOVE_STANCE); actor->stanceFlags ^= actor->nextStanceFlagsToRemove; if (actor->nextStanceFlagsToRemove & IS_STUNNED) { if (actor == player) { showMessage(5, "You regain composure.", NULL); } else { showMessage(5, "It regains composure.", NULL); } } else if (actor->nextStanceFlagsToRemove & IS_HOLDING_LODGED_WEAPON) { if (actor == player) { showMessage(5, "You dislodge the weapon.", NULL); } else { showMessage(5, "Something dislodges their weapon.", NULL); } } if (actor->nextStanceFlagsToRemove & IS_STUCK_WITH_LODGED_WEAPON) { weaponPtr = getItemLodgedInActor(actor); weaponPtr->itemFlags ^= IS_LODGED; weaponPtr->lodgedInActor = NULL; } actor->nextStanceFlagsToRemove = 0x0; } while (ptr != NULL) { if (ptr == actor || ptr->hp <= 0) { ptr = ptr->next; continue; } if (ptr->x == nx && ptr->y == ny) { hitActor = 1; break; } ptr = ptr->next; } if (_checkForTouchedItemAndHandle(actor, nx, ny)) { actor->vx = 0; actor->vy = 0; return; } if (hitActor) { actor->vx = 0; actor->vy = 0; if (attack(actor, ptr)) { return; } } else if (actor->vx || actor->vy) { if (actor->stanceFlags & IS_STUCK_WITH_LODGED_WEAPON && getItemLodgedInActor(actor)->owner) { printf("Cant move because of stuck weapon.\n"); return; } if (actor->stanceFlags & IS_HOLDING_LODGED_WEAPON) { actor->stanceFlags ^= IS_HOLDING_LODGED_WEAPON; dropItem(actor, actorWeapon); printf("Handle letting go of weapon!\n"); showMessage(10, "You let go of the weapon.", NULL); return; } if (isPositionWalkable(nx, ny)) { moved = 1; if (actor->aiFlags & IS_VOID_WORM && getRandomFloat(0, 1) > .95) { getOpenPositionInRoom(getRandomRoom(), spawnPosition); createVoidWorm(spawnPosition[0], spawnPosition[1]); } if (actor->aiFlags & IS_VOID_WORM) { createVoidWormTail(actor->x, actor->y); } actor->lastX = actor->x; actor->lastY = actor->y; actor->x = nx; actor->y = ny; setStance(actor, IS_MOVING); if (actor->itemLight) { actor->itemLight->fuel -= getLevel(); } if (actor->stanceFlags & IS_STABBING) { actor->statStabCount --; if (!actor->statStabCount) { unsetStance(actor, IS_STABBING); } } TCOD_map_compute_fov(actor->fov, actor->x, actor->y, actor->sightRange, 1, FOV_SHADOW); } else { if (actor->stanceFlags & IS_MOVING) { unsetStance(actor, IS_MOVING); if (actor->stanceFlags & IS_STABBING) { actor->statStabCount = 0; unsetStance(actor, IS_STABBING); } } } } else { if (actor->stanceFlags & IS_MOVING) { unsetStance(actor, IS_MOVING); if (actor->stanceFlags & IS_STABBING) { actor->statStabCount = 0; unsetStance(actor, IS_STABBING); } } } if (moved) { _checkForItemCollisions(actor); } if (!(actor->aiFlags & IS_IMMUNE_TO_DARKNESS) && _checkIfPositionLit(actor)) { return; } if (actor->itemLight) { actor->itemLight->x = actor->x; actor->itemLight->y = actor->y; } actor->vx = 0; actor->vy = 0; }