void HiRes4Engine_Atari::init() { _graphics = new Graphics_v2(*_display); _boot = new DiskImage(); if (!_boot->open(atariDisks[0])) error("Failed to open disk image '%s'", atariDisks[0]); insertDisk(1); loadCommonData(); StreamPtr stream(createReadStream(_boot, 0x06, 0x2)); _strings.verbError = readStringAt(*stream, 0x4f); _strings.nounError = readStringAt(*stream, 0x83); _strings.enterCommand = readStringAt(*stream, 0xa6); stream.reset(createReadStream(_boot, 0x05, 0xb, 0xd7)); _strings_v2.time = readString(*stream, 0xff); stream.reset(createReadStream(_boot, 0x06, 0x7, 0x00, 2)); _strings_v2.saveInsert = readStringAt(*stream, 0x62); _strings_v2.saveReplace = readStringAt(*stream, 0xdd); _strings_v2.restoreInsert = readStringAt(*stream, 0x12a); _strings_v2.restoreReplace = readStringAt(*stream, 0x1b8); _strings.playAgain = readStringAt(*stream, 0x21b); // TODO: restart sequence has "insert side a/b" strings _messageIds.cantGoThere = IDI_HR4_MSG_CANT_GO_THERE; _messageIds.dontUnderstand = IDI_HR4_MSG_DONT_UNDERSTAND; _messageIds.itemDoesntMove = IDI_HR4_MSG_ITEM_DOESNT_MOVE; _messageIds.itemNotHere = IDI_HR4_MSG_ITEM_NOT_HERE; _messageIds.thanksForPlaying = IDI_HR4_MSG_THANKS_FOR_PLAYING; stream.reset(createReadStream(_boot, 0x06, 0xd, 0x12, 2)); loadItemDescriptions(*stream, IDI_HR4_NUM_ITEM_DESCS); stream.reset(createReadStream(_boot, 0x07, 0x1, 0xf4)); loadDroppedItemOffsets(*stream, IDI_HR4_NUM_ITEM_OFFSETS); stream.reset(createReadStream(_boot, 0x08, 0xe, 0xa5, 5)); readCommands(*stream, _roomCommands); stream.reset(createReadStream(_boot, 0x0a, 0x9, 0x00, 3)); readCommands(*stream, _globalCommands); stream.reset(createReadStream(_boot, 0x05, 0x4, 0x00, 3)); loadWords(*stream, _verbs, _priVerbs); stream.reset(createReadStream(_boot, 0x03, 0xb, 0x00, 6)); loadWords(*stream, _nouns, _priNouns); }
void AdlEngine_v2::loadRoom(byte roomNr) { Room &room = getRoom(roomNr); StreamPtr stream(room.data->createReadStream()); uint16 descOffset = stream->readUint16LE(); uint16 commandOffset = stream->readUint16LE(); _roomData.pictures.clear(); // There's no picture count. The original engine always checks at most // five pictures. We use the description offset to bound our search. uint16 picCount = (descOffset - 4) / 5; for (uint i = 0; i < picCount; ++i) { byte nr = stream->readByte(); _roomData.pictures[nr] = readDataBlockPtr(*stream); } _roomData.description = readStringAt(*stream, descOffset, 0xff); _roomData.commands.clear(); if (commandOffset != 0) { stream->seek(commandOffset); readCommands(*stream, _roomData.commands); } }
void NetworkRemoteBehavior::pollCommands() { try { while (polling) { vector<string> more = readCommands(socket); lock.acquire(); commands.push_back(more); // lock.signal(); lock.release(); } } catch (const Network::NetworkException & fail) { } }
void HiRes1Engine::init() { if (Common::File::exists("MYSTHOUS.DSK")) { _files = new Files_DOS33(); if (!static_cast<Files_DOS33 *>(_files)->open("MYSTHOUS.DSK")) error("Failed to open MYSTHOUS.DSK"); } else _files = new Files_Plain(); _graphics = new Graphics_v1(*_display); StreamPtr stream(_files->createReadStream(IDS_HR1_EXE_1)); // Some messages have overrides inside the executable _gameStrings.cantGoThere = readStringAt(*stream, IDI_HR1_OFS_STR_CANT_GO_THERE); _gameStrings.dontHaveIt = readStringAt(*stream, IDI_HR1_OFS_STR_DONT_HAVE_IT); _gameStrings.dontUnderstand = readStringAt(*stream, IDI_HR1_OFS_STR_DONT_UNDERSTAND); _gameStrings.gettingDark = readStringAt(*stream, IDI_HR1_OFS_STR_GETTING_DARK); // Load other strings from executable _strings.enterCommand = readStringAt(*stream, IDI_HR1_OFS_STR_ENTER_COMMAND); _strings.verbError = readStringAt(*stream, IDI_HR1_OFS_STR_VERB_ERROR); _strings.nounError = readStringAt(*stream, IDI_HR1_OFS_STR_NOUN_ERROR); _strings.playAgain = readStringAt(*stream, IDI_HR1_OFS_STR_PLAY_AGAIN); _strings.pressReturn = readStringAt(*stream, IDI_HR1_OFS_STR_PRESS_RETURN); _strings.lineFeeds = readStringAt(*stream, IDI_HR1_OFS_STR_LINE_FEEDS); // Set message IDs _messageIds.cantGoThere = IDI_HR1_MSG_CANT_GO_THERE; _messageIds.dontUnderstand = IDI_HR1_MSG_DONT_UNDERSTAND; _messageIds.itemDoesntMove = IDI_HR1_MSG_ITEM_DOESNT_MOVE; _messageIds.itemNotHere = IDI_HR1_MSG_ITEM_NOT_HERE; _messageIds.thanksForPlaying = IDI_HR1_MSG_THANKS_FOR_PLAYING; // Load message offsets stream->seek(IDI_HR1_OFS_MSGS); for (uint i = 0; i < IDI_HR1_NUM_MESSAGES; ++i) _messages.push_back(_files->getDataBlock(IDS_HR1_MESSAGES, stream->readUint16LE())); // Load picture data from executable stream->seek(IDI_HR1_OFS_PICS); for (uint i = 1; i <= IDI_HR1_NUM_PICS; ++i) { byte block = stream->readByte(); Common::String name = Common::String::format("BLOCK%i", block); uint16 offset = stream->readUint16LE(); _pictures[i] = _files->getDataBlock(name, offset); } // Load commands from executable stream->seek(IDI_HR1_OFS_CMDS_1); readCommands(*stream, _roomCommands); stream->seek(IDI_HR1_OFS_CMDS_0); readCommands(*stream, _globalCommands); // Load dropped item offsets stream->seek(IDI_HR1_OFS_ITEM_OFFSETS); loadDroppedItemOffsets(*stream, IDI_HR1_NUM_ITEM_OFFSETS); // Load right-angle line art stream->seek(IDI_HR1_OFS_CORNERS); uint16 cornersCount = stream->readUint16LE(); for (uint i = 0; i < cornersCount; ++i) _corners.push_back(_files->getDataBlock(IDS_HR1_EXE_1, IDI_HR1_OFS_CORNERS + stream->readUint16LE())); if (stream->eos() || stream->err()) error("Failed to read game data from '" IDS_HR1_EXE_1 "'"); stream->seek(IDI_HR1_OFS_VERBS); loadWords(*stream, _verbs, _priVerbs); stream->seek(IDI_HR1_OFS_NOUNS); loadWords(*stream, _nouns, _priNouns); }
void Connector::acceptConnection() { serverSock = server.nextPendingConnection(); status->setText("NETWORK STATUS: Connected as server."); connected = true; connect(serverSock, SIGNAL(readyRead()), this, SLOT(readCommands())); }