libfalltergeist::ProFileType* ResourceManager::proFileType(unsigned int PID) { unsigned int typeId = PID >> 24; std::string listFile; switch (typeId) { case libfalltergeist::ProFileType::TYPE_ITEM: listFile += "proto/items/items.lst"; break; case libfalltergeist::ProFileType::TYPE_CRITTER: listFile += "proto/critters/critters.lst"; break; case libfalltergeist::ProFileType::TYPE_SCENERY: listFile += "proto/scenery/scenery.lst"; break; case libfalltergeist::ProFileType::TYPE_WALL: listFile += "proto/walls/walls.lst"; break; case libfalltergeist::ProFileType::TYPE_TILE: listFile += "proto/tiles/tiles.lst"; break; case libfalltergeist::ProFileType::TYPE_MISC: listFile += "proto/misc/misc.lst"; break; default: debug("ResourceManager::proFileType(unsigned int) - wrong PID: " + std::to_string(PID), DEBUG_ERROR); return 0; } libfalltergeist::LstFileType * lst = lstFileType(listFile); unsigned int index = 0x00000FFF & PID; if (index > lst->strings()->size()) { debug("ResourceManager::proFileType(unsigned int) - LST size < PID: " + std::to_string(PID), DEBUG_ERROR); return 0; } std::string protoName = lst->strings()->at(index-1); switch (typeId) { case libfalltergeist::ProFileType::TYPE_ITEM: return proFileType("proto/items/" + protoName); case libfalltergeist::ProFileType::TYPE_CRITTER: return proFileType("proto/critters/" + protoName); case libfalltergeist::ProFileType::TYPE_SCENERY: return proFileType("proto/scenery/" + protoName); case libfalltergeist::ProFileType::TYPE_WALL: return proFileType("proto/walls/" + protoName); case libfalltergeist::ProFileType::TYPE_TILE: return proFileType("proto/tiles/" + protoName); case libfalltergeist::ProFileType::TYPE_MISC: return proFileType("proto/misc/" + protoName); } return 0; }
libfalltergeist::Pro::File* ResourceManager::proFileType(unsigned int PID) { unsigned int typeId = PID >> 24; std::string listFile; switch ((OBJECT_TYPE)typeId) { case OBJECT_TYPE::ITEM: listFile += "proto/items/items.lst"; break; case OBJECT_TYPE::CRITTER: listFile += "proto/critters/critters.lst"; break; case OBJECT_TYPE::SCENERY: listFile += "proto/scenery/scenery.lst"; break; case OBJECT_TYPE::WALL: listFile += "proto/walls/walls.lst"; break; case OBJECT_TYPE::TILE: listFile += "proto/tiles/tiles.lst"; break; case OBJECT_TYPE::MISC: listFile += "proto/misc/misc.lst"; break; default: Logger::error() << "ResourceManager::proFileType(unsigned int) - wrong PID: " << PID << std::endl; return nullptr; } auto lst = lstFileType(listFile); unsigned int index = 0x00000FFF & PID; if (index > lst->strings()->size()) { Logger::error() << "ResourceManager::proFileType(unsigned int) - LST size < PID: " << PID << std::endl; return nullptr; } std::string protoName = lst->strings()->at(index-1); switch ((OBJECT_TYPE)typeId) { case OBJECT_TYPE::ITEM: return proFileType("proto/items/" + protoName); case OBJECT_TYPE::CRITTER: return proFileType("proto/critters/" + protoName); case OBJECT_TYPE::SCENERY: return proFileType("proto/scenery/" + protoName); case OBJECT_TYPE::WALL: return proFileType("proto/walls/" + protoName); case OBJECT_TYPE::TILE: return proFileType("proto/tiles/" + protoName); case OBJECT_TYPE::MISC: return proFileType("proto/misc/" + protoName); } return nullptr; }
libfalltergeist::IntFileType * ResourceManager::intFileType(unsigned int SID) { auto lst = lstFileType("scripts/scripts.lst"); if (SID >= lst->strings()->size()) { throw Exception("ResourceManager::intFileType() - wrong SID: " + std::to_string(SID)); } return intFileType("scripts/" + lst->strings()->at(SID)); }
Surface * ResourceManager::surface(unsigned int FID, unsigned int direction, unsigned int frame) { std::string prefix; std::string lstFile; switch(FID >> 24) { case libfalltergeist::FrmFileType::TYPE_ITEM: prefix = "art/items/"; lstFile = "items.lst"; break; case libfalltergeist::FrmFileType::TYPE_CRITTER: prefix = "art/critters/"; lstFile = "critters.lst"; break; case libfalltergeist::FrmFileType::TYPE_SCENERY: prefix = "art/scenery/"; lstFile = "scenery.lst"; break; case libfalltergeist::FrmFileType::TYPE_WALL: prefix = "art/walls/"; lstFile = "walls.lst"; break; case libfalltergeist::FrmFileType::TYPE_TILE: prefix = "art/tiles/"; lstFile = "tiles.lst"; break; case libfalltergeist::FrmFileType::TYPE_BACKGROUND: prefix = "art/backgrnd/"; lstFile = "backgrnd.lst"; break; case libfalltergeist::FrmFileType::TYPE_INTERFACE: prefix = "art/intrface/"; lstFile = "intrface.lst"; break; case libfalltergeist::FrmFileType::TYPE_INVENTORY: prefix = "art/inven/"; lstFile = "inven.lst"; break; } libfalltergeist::LstFileType * lst = lstFileType(prefix + lstFile); unsigned int frmId = 0x0000FFFF & FID; if (frmId >= lst->strings()->size()) { debug("ResourceManager::surface(unsigned int, unsigned int, unsigned int) - LST size <= FID: " + std::to_string(FID), DEBUG_ERROR); return 0; } //std::cout << std::hex << FID << std::endl; return surface(prefix + lst->strings()->at(frmId), direction, frame); }
libfalltergeist::FrmFileType * ResourceManager::frmFileType(unsigned int FID) { std::string prefix; std::string lstFile; switch(FID >> 24) { case libfalltergeist::FrmFileType::TYPE_ITEM: prefix = "art/items/"; lstFile = "items.lst"; break; case libfalltergeist::FrmFileType::TYPE_CRITTER: prefix = "art/critters/"; lstFile = "critters.lst"; break; case libfalltergeist::FrmFileType::TYPE_SCENERY: prefix = "art/scenery/"; lstFile = "scenery.lst"; break; case libfalltergeist::FrmFileType::TYPE_WALL: prefix = "art/walls/"; lstFile = "walls.lst"; break; case libfalltergeist::FrmFileType::TYPE_TILE: prefix = "art/tiles/"; lstFile = "tiles.lst"; break; case libfalltergeist::FrmFileType::TYPE_BACKGROUND: prefix = "art/backgrnd/"; lstFile = "backgrnd.lst"; break; case libfalltergeist::FrmFileType::TYPE_INTERFACE: prefix = "art/intrface/"; lstFile = "intrface.lst"; break; case libfalltergeist::FrmFileType::TYPE_INVENTORY: prefix = "art/inven/"; lstFile = "inven.lst"; break; } libfalltergeist::LstFileType * lst = lstFileType(prefix + lstFile); unsigned int frmId = 0x0000FFFF & FID; if (frmId >= lst->strings()->size()) { return 0; } return frmFileType(prefix + lst->strings()->at(frmId)); }
std::string ResourceManager::FIDtoFrmName(unsigned int FID) { std::string prefix; std::string lstFile; auto baseId = FID & 0x00000FFF; auto type = FID >> 24; switch ((FRM_TYPE)type) { case FRM_TYPE::ITEM: prefix = "art/items/"; lstFile = "items.lst"; break; case FRM_TYPE::CRITTER: { unsigned int weaponId = (FID & 0x0000F000) >> 12; unsigned int animId = (FID & 0x00FF0000) >> 16; unsigned int ID3 = (FID & 0xF0000000) >> 28; auto lst = ResourceManager::lstFileType("art/critters/critters.lst"); std::string frmName = lst->strings()->at(baseId); std::string frmBase = frmName.substr(0, 6); if (animId >= 0x26 && animId <= 0x2F) { if (weaponId >= 0x0B || weaponId == 0) throw Exception("Critter weaponId unsupported value"); frmBase += weaponId + 0x63; frmBase += animId + 0x3D; } else if (animId == 0x24) { frmBase += "ch"; } else if (animId == 0x25) { frmBase += "cj"; } else if (animId == 0x40) { frmBase += "na"; } else if (animId >= 0x30) { frmBase += "r"; frmBase += animId + 0x31; } else if (animId >= 0x14) { frmBase += "b"; frmBase += animId + 0x4d; } else if (animId == 0x12) { if (weaponId == 0x01) { frmBase += "dm"; } else if (weaponId == 0x04) { frmBase += "gm"; } else { frmBase += "as"; } } else if (animId == 0x0D) { if (weaponId > 0) { frmBase += weaponId + 0x63; frmBase += "e"; } else { frmBase += "an"; } } else if (animId <= 0x01 && weaponId > 0) { frmBase += weaponId + 0x63; frmBase += animId + 0x61; } else { frmBase += "a"; frmBase += animId + 0x61; } std::string extensions[] = {"frm", "frm0", "frm1", "frm2", "fr3", "frm4", "frm5", "frm6"}; frmBase += "." + extensions[ID3]; return "art/critters/" + frmBase; } case FRM_TYPE::SCENERY: prefix = "art/scenery/"; lstFile = "scenery.lst"; break; case FRM_TYPE::WALL: prefix = "art/walls/"; lstFile = "walls.lst"; break; case FRM_TYPE::TILE: prefix = "art/tiles/"; lstFile = "tiles.lst"; break; case FRM_TYPE::MISC: prefix = "art/misc/"; lstFile = "misc.lst"; // Map scroll blockers if (baseId == 1) return "art/misc/scrblk.frm"; break; case FRM_TYPE::INTERFACE: prefix = "art/intrface/"; lstFile = "intrface.lst"; break; case FRM_TYPE::INVENTORY: prefix = "art/inven/"; lstFile = "inven.lst"; break; default: throw Exception("ResourceManager::FIDtoFrmName - wrong type"); break; } auto lst = lstFileType(prefix + lstFile); if (baseId >= lst->strings()->size()) { Logger::error() << "ResourceManager::FIDtoFrmName(unsigned int) - LST size " << lst->strings()->size() << " <= frmID: " << baseId << " frmType: " << type << std::endl; return ""; } return prefix + lst->strings()->at(baseId); }