bool Resources::loadArchives(const ADGameDescription *gd) { Common::File *dat_file = new Common::File(); Common::String filename = "teenagent.dat"; if (!dat_file->open(filename.c_str())) { delete dat_file; Common::String errorMessage = Common::String::format(_("Unable to locate the '%s' engine data file."), filename.c_str()); warning("%s", errorMessage.c_str()); GUIErrorMessage(errorMessage); return false; } // teenagent.dat used to be compressed with zlib compression. The usage of // zlib here is no longer needed, and it's maintained only for backwards // compatibility. Common::SeekableReadStream *dat = Common::wrapCompressedReadStream(dat_file); #if !defined(USE_ZLIB) uint16 header = dat->readUint16BE(); bool isCompressed = (header == 0x1F8B || ((header & 0x0F00) == 0x0800 && header % 31 == 0)); dat->seek(-2, SEEK_CUR); if (isCompressed) { // teenagent.dat is compressed, but zlib hasn't been compiled in delete dat; Common::String errorMessage = _("The teenagent.dat file is compressed and zlib hasn't been included in this executable. Please decompress it"); warning("%s", errorMessage.c_str()); GUIErrorMessage(errorMessage); return false; } #endif dat->skip(CSEG_SIZE); dseg.read(dat, DSEG_SIZE); eseg.read(dat, ESEG_SIZE); delete dat; precomputeDialogOffsets(); FilePack varia; varia.open("varia.res"); font7.load(varia, 7, 11, 1); font8.load(varia, 8, 31, 0); varia.close(); off.open("off.res"); on.open("on.res"); ons.open("ons.res"); lan000.open("lan_000.res"); lan500.open("lan_500.res"); mmm.open("mmm.res"); sam_mmm.open("sam_mmm.res"); sam_sam.open("sam_sam.res"); voices.open("voices.res"); return true; }
Inventory::Inventory(TeenAgentEngine *engine) { _engine = engine; _active = false; FilePack varia; varia.open("varia.res"); { Common::ScopedPtr<Common::SeekableReadStream> s(varia.getStream(3)); if (!s) error("no inventory background"); debug(0, "loading inventory background..."); _background.load(*s, Surface::kTypeOns); } uint32 items_size = varia.getSize(4); if (items_size == 0) error("invalid inventory items size"); debug(0, "loading items, size: %u", items_size); _items = new byte[items_size]; varia.read(4, _items, items_size); byte offsets = _items[0]; assert(offsets == 92); for (byte i = 0; i < offsets; ++i) { _offset[i] = READ_LE_UINT16(_items + i * 2 + 1); } _offset[92] = items_size; Resources *res = Resources::instance(); for (byte i = 0; i <= 92; ++i) { InventoryObject io; uint16 obj_addr = res->dseg.get_word(0xc4a4 + i * 2); if (obj_addr != 0) io.load(res->dseg.ptr(obj_addr)); _objects.push_back(io); } _inventory = res->dseg.ptr(0xc48d); for (int y = 0; y < 4; ++y) for (int x = 0; x < 6; ++x) { int i = y * 6 + x; _graphics[i]._rect.left = 28 + 45 * x - 1; _graphics[i]._rect.top = 23 + 31 * y - 1; _graphics[i]._rect.right = _graphics[i]._rect.left + 40; _graphics[i]._rect.bottom = _graphics[i]._rect.top + 26; } varia.close(); _hoveredObj = _selectedObj = NULL; }