void ToucheEngine::res_loadMusic(int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadMusic() num=%d", num); uint32 size; const uint32 offs = res_getDataOffset(kResourceTypeMusic, num, &size); _fData.seek(offs); _midiPlayer->play(_fData, size, true); }
void ToucheEngine::res_loadSprite(int num, int index) { debugC(9, kDebugResource, "ToucheEngine::res_loadSprite() num=%d index=%d", num, index); assert(index >= 0 && index < NUM_SEQUENCES); _sequenceEntryTable[index].sprNum = num; SpriteData *spr = &_spritesTable[index]; const uint32 offs = res_getDataOffset(kResourceTypeSpriteImage, num); _fData.seek(offs); _currentImageWidth = _fData.readUint16LE(); _currentImageHeight = _fData.readUint16LE(); const uint32 size = _currentImageWidth * _currentImageHeight; if (size > spr->size) { debug(8, "Reallocating memory for sprite %d (index %d), %d bytes needed", num, index, size - spr->size); spr->size = size; if (spr->ptr) { spr->ptr = (uint8 *)realloc(spr->ptr, size); } else { spr->ptr = (uint8 *)malloc(size); } if (!spr->ptr) { error("Unable to reallocate memory for sprite %d (%d bytes)", num, size); } } for (int i = 0; i < _currentImageHeight; ++i) { res_decodeScanLineImageRLE(spr->ptr + _currentImageWidth * i, _currentImageWidth); } spr->bitmapWidth = _currentImageWidth; spr->bitmapHeight = _currentImageHeight; if (_flagsTable[268] == 0) { res_loadImageHelper(spr->ptr, _currentImageWidth, _currentImageHeight); } spr->w = _currentImageWidth; spr->h = _currentImageHeight; }
void ToucheEngine::res_loadProgram(int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadProgram() num=%d", num); const uint32 offs = res_getDataOffset(kResourceTypeProgram, num, &_programDataSize); _fData.seek(offs); assert(_programDataSize <= kMaxProgramDataSize); _fData.read(_programData, _programDataSize); }
void ToucheEngine::res_loadSequence(int num, int index) { debugC(9, kDebugResource, "ToucheEngine::res_loadSequence() num=%d index=%d", num, index); assert(index < NUM_SEQUENCES); _sequenceEntryTable[index].seqNum = num; const uint32 offs = res_getDataOffset(kResourceTypeSequence, num); _fData.seek(offs); _fData.read(_sequenceDataTable[index], 16000); }
void ToucheEngine::res_loadRoom(int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadRoom() num=%d flag115=%d", num, _flagsTable[115]); debug(0, "Setting up room %d", num); const uint32 offsInfo = res_getDataOffset(kResourceTypeRoomInfo, num); _fData.seek(offsInfo); _fData.skip(2); const int roomImageNum = _fData.readUint16LE(); _fData.skip(2); for (int i = 0; i < 256; ++i) { _fData.read(&_paletteBuffer[i * 4], 3); _paletteBuffer[i * 4 + 3] = 0; } const uint32 offsImage = res_getDataOffset(kResourceTypeRoomImage, roomImageNum); _fData.seek(offsImage); res_loadBackdrop(); bool updateScreenPalette = _flagsTable[115] == 0; // Workaround to what appears to be a scripting bug. Scripts 27 and 100 triggers // a palette fading just after loading a room. Catch this, so that only *one* // palette refresh occurs. if ((_currentEpisodeNum == 27 && _currentRoomNum == 56 && num == 34) || (_currentEpisodeNum == 100 && _currentRoomNum == 2 && num == 1)) { updateScreenPalette = false; } if (updateScreenPalette) { updatePalette(); } else { setPalette(0, 255, 0, 0, 0); } _currentRoomNum = num; _updatedRoomAreasTable[0] = 1; _fullRedrawCounter = 1; _roomNeedRedraw = true; _sequenceEntryTable[5].sprNum = -1; _sequenceEntryTable[5].seqNum = -1; _sequenceEntryTable[6].sprNum = -1; _sequenceEntryTable[6].seqNum = -1; }
void ToucheEngine::res_loadSpriteImage(int num, uint8 *dst) { debugC(9, kDebugResource, "ToucheEngine::res_loadSpriteImage() num=%d", num); const uint32 offs = res_getDataOffset(kResourceTypeSpriteImage, num); _fData.seek(offs); _currentImageWidth = _fData.readUint16LE(); _currentImageHeight = _fData.readUint16LE(); for (int i = 0; i < _currentImageHeight; ++i) { res_decodeScanLineImageRLE(dst + _currentImageWidth * i, _currentImageWidth); } }
void ToucheEngine::res_loadSound(int priority, int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadSound() num=%d", num); if (priority >= 0) { uint32 size; const uint32 offs = res_getDataOffset(kResourceTypeSound, num, &size); _fData.seek(offs); Audio::AudioStream *stream = Audio::makeVOCStream(_fData, Audio::Mixer::FLAG_UNSIGNED); if (stream) { _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_sfxHandle, stream); } } }
void ToucheEngine::res_loadSound(int priority, int num) { debugC(9, kDebugResource, "ToucheEngine::res_loadSound() num=%d", num); if (priority >= 0) { uint32 size; const uint32 offs = res_getDataOffset(kResourceTypeSound, num, &size); Common::SeekableReadStream *datastream = SearchMan.createReadStreamForMember("TOUCHE.DAT"); if (!datastream) { warning("res_loadSound: Could not open TOUCHE.DAT"); return; } datastream->seek(offs); Audio::AudioStream *stream = Audio::makeVOCStream(datastream, Audio::FLAG_UNSIGNED, DisposeAfterUse::YES); if (stream) { _mixer->playStream(Audio::Mixer::kSFXSoundType, &_sfxHandle, stream); } } }