diff options
author | johndoe123 | 2011-07-01 10:25:55 +0000 |
---|---|---|
committer | Willem Jan Palenstijn | 2013-05-08 20:30:57 +0200 |
commit | f01f9343c831cda618dabd2dcda7be77b2948ecc (patch) | |
tree | 56363ef2aaffe6086daf9cb2893faef348a74e24 /engines/neverhood/resource.cpp | |
parent | 0614b288cfc38180eddd90a41cf726718d823e13 (diff) | |
download | scummvm-rg350-f01f9343c831cda618dabd2dcda7be77b2948ecc.tar.gz scummvm-rg350-f01f9343c831cda618dabd2dcda7be77b2948ecc.tar.bz2 scummvm-rg350-f01f9343c831cda618dabd2dcda7be77b2948ecc.zip |
NEVERHOOD: Start with AnimatedSprite and AnimResource
Diffstat (limited to 'engines/neverhood/resource.cpp')
-rw-r--r-- | engines/neverhood/resource.cpp | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 4dcbd838fe..84eab7fe0e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -25,6 +25,8 @@ namespace Neverhood { +// SpriteResource + SpriteResource::SpriteResource(NeverhoodEngine *vm) : _vm(vm), _resourceHandle(-1), _pixels(NULL) { } @@ -87,6 +89,8 @@ void SpriteResource::unload() { _rle = false; } +// PaletteResource + PaletteResource::PaletteResource(NeverhoodEngine *vm) : _vm(vm), _resourceHandle(-1), _palette(NULL) { } @@ -134,4 +138,153 @@ void PaletteResource::copyPalette(byte *destPalette) { } } +// AnimResource + +AnimResource::AnimResource(NeverhoodEngine *vm) + : _vm(vm), _width(0), _height(0), _currSpriteData(NULL) { + + clear(); + clear2(); +} + +AnimResource::~AnimResource() { + unloadInternal(); +} + +bool AnimResource::load(uint32 fileHash) { + + if (fileHash == _fileHash) + return true; + + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle == -1) + return false; + + byte *resourceData, *animList, *frameList; + uint16 animInfoStartOfs, animListIndex, animListCount; + uint16 frameListStartOfs, frameCount; + uint32 spriteDataOfs, paletteDataOfs; + + if (_vm->_res->getResourceType(_resourceHandle) != 4) { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + resourceData = _vm->_res->loadResource(_resourceHandle); + if (!resourceData) { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + animListCount = READ_LE_UINT16(resourceData); + animInfoStartOfs = READ_LE_UINT16(resourceData + 2); + spriteDataOfs = READ_LE_UINT32(resourceData + 4); + paletteDataOfs = READ_LE_UINT32(resourceData + 8); + + animList = resourceData + 12; + for (animListIndex = 0; animListIndex < animListCount; animListIndex++) { + debug("hash: %08X", READ_LE_UINT32(animList)); + if (READ_LE_UINT32(animList) == fileHash) + break; + animList += 8; + } + + if (animListIndex >= animListCount) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + _spriteData = resourceData + spriteDataOfs; + if (paletteDataOfs > 0) + _paletteData = resourceData + paletteDataOfs; + + frameCount = READ_LE_UINT16(animList + 4); + frameListStartOfs = READ_LE_UINT16(animList + 6); + + debug("frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs); + + frameList = resourceData + animInfoStartOfs + frameListStartOfs; + + _frames.clear(); + _frames.reserve(frameCount); + + for (uint16 frameIndex = 0; frameIndex < frameCount; frameIndex++) { + AnimFrameInfo frameInfo; + frameInfo.frameHash = READ_LE_UINT32(frameList); + frameInfo.counter = READ_LE_UINT16(frameList + 4); + frameInfo.rect.x1 = READ_LE_UINT16(frameList + 6); + frameInfo.rect.y1 = READ_LE_UINT16(frameList + 8); + frameInfo.rect.x2 = READ_LE_UINT16(frameList + 10); + frameInfo.rect.y2 = READ_LE_UINT16(frameList + 12); + frameInfo.deltaX = READ_LE_UINT16(frameList + 14); + frameInfo.deltaY = READ_LE_UINT16(frameList + 16); + frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); + frameInfo.deltaRect.y = READ_LE_UINT16(frameList + 20); + frameInfo.deltaRect.width = READ_LE_UINT16(frameList + 22); + frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24); + frameInfo.field_1A = READ_LE_UINT16(frameList + 26); + frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28); + debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", + frameInfo.frameHash, frameInfo.counter, + frameInfo.rect.x1, frameInfo.rect.y1, frameInfo.rect.x2, frameInfo.rect.y2, + frameInfo.deltaX, frameInfo.deltaY, + frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height, + frameInfo.field_1A, frameInfo.spriteDataOffs); + frameList += 32; + _frames.push_back(frameInfo); + } + + _fileHash = fileHash; + + return true; + +} + +void AnimResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + clear(); + } +} + +void AnimResource::clear() { + _resourceHandle = -1; + // _count = 0; + // _infoStructs = NULL; + _currSpriteData = NULL; + _fileHash = 0; + _paletteData = NULL; + _spriteData = NULL; +} + +void AnimResource::clear2() { + clear(); + _replEnabled = true; + _replOldByte = 0; + _replNewByte = 0; +} + +bool AnimResource::loadInternal(uint32 fileHash) { + unloadInternal(); + return load(fileHash); +} + +void AnimResource::unloadInternal() { + unload(); + clear2(); +} + +int16 AnimResource::getFrameIndex(uint32 frameHash) { + for (uint i = 0; i < _frames.size(); i++) + if (_frames[i].frameHash == frameHash) + return (int16)i; + return -1; +} + } // End of namespace Neverhood |