diff options
author | Max Horn | 2006-02-11 22:45:04 +0000 |
---|---|---|
committer | Max Horn | 2006-02-11 22:45:04 +0000 |
commit | 26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch) | |
tree | 26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /kyra/sprites.cpp | |
parent | 2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff) | |
download | scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2 scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip |
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'kyra/sprites.cpp')
-rw-r--r-- | kyra/sprites.cpp | 569 |
1 files changed, 0 insertions, 569 deletions
diff --git a/kyra/sprites.cpp b/kyra/sprites.cpp deleted file mode 100644 index d1f9d00fd6..0000000000 --- a/kyra/sprites.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2004-2006 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/stdafx.h" -#include "common/stream.h" -#include "common/util.h" -#include "common/system.h" -#include "kyra/screen.h" -#include "kyra/kyra.h" -#include "kyra/sprites.h" -#include "kyra/resource.h" -#include "kyra/animator.h" - -namespace Kyra { - -Sprites::Sprites(KyraEngine *engine, OSystem *system) { - _engine = engine; - _res = engine->resource(); - _screen = engine->screen(); - _system = system; - _dat = 0; - memset(_anims, 0, sizeof(_anims)); - memset(_sceneShapes, 0, sizeof(_sceneShapes)); - _animDelay = 16; - _spriteDefStart = 0; - memset(_drawLayerTable, 0, sizeof(_drawLayerTable)); - _sceneAnimatorBeaconFlag = 0; -} - -Sprites::~Sprites() { - delete[] _dat; - freeSceneShapes(); - for (int i = 0; i < MAX_NUM_ANIMS; i++) { - if (_anims[i].background) - free(_anims[i].background); - } -} - -void Sprites::setupSceneAnims() { - debug(9, "Sprites::setupSceneAnims()"); - uint8 *data; - - for (int i = 0; i < MAX_NUM_ANIMS; i++) { - if (_anims[i].background) { - free(_anims[i].background); - _anims[i].background = 0; - } - - if (_anims[i].script != 0) { - data = _anims[i].script; - - assert( READ_LE_UINT16(data) == 0xFF86 ); - data += 4; - - _anims[i].disable = READ_LE_UINT16(data) != 0; - data += 4; - _anims[i].unk2 = READ_LE_UINT16(data); - data += 4; - - if (_engine->_northExitHeight > READ_LE_UINT16(data)) - _anims[i].drawY = _engine->_northExitHeight; - else - _anims[i].drawY = READ_LE_UINT16(data); - data += 4; - - //sceneUnk2[i] = READ_LE_UINT16(data); - data += 4; - - _anims[i].x = READ_LE_UINT16(data); - data += 4; - _anims[i].y = READ_LE_UINT16(data); - data += 4; - _anims[i].width = *(data) - 1; - data += 4; - _anims[i].height = *(data); - data += 4; - _anims[i].sprite = READ_LE_UINT16(data); - data += 4; - _anims[i].flipX = READ_LE_UINT16(data) != 0; - data += 4; - _anims[i].width2 = *(data); - data += 4; - _anims[i].height2 = *(data); - data += 4; - _anims[i].unk1 = READ_LE_UINT16(data) != 0; - data += 4; - _anims[i].play = READ_LE_UINT16(data) != 0; - data += 2; - - _anims[i].script = data; - - int bkgdWidth = _anims[i].width << 3; - int bkgdHeight = _anims[i].height; - - if (_anims[i].width2) - bkgdWidth += _anims[i].width2 << 3; - - if (_anims[i].height2) - bkgdHeight += _anims[i].height2; - - _anims[i].background = (uint8 *)malloc(_screen->getRectSize(bkgdWidth + 1, bkgdHeight)); - memset(_anims[i].background, 0, _screen->getRectSize(bkgdWidth + 1, bkgdHeight)); - - assert(_anims[i].background); - } - } -} - -void Sprites::updateSceneAnims() { - debug(9, "Sprites::updateSceneAnims()"); - uint32 currTime = _system->getMillis(); - uint8 *data; - bool endLoop; - uint16 rndNr; - uint16 anim; - uint16 sound; - - for (int i = 0; i < MAX_NUM_ANIMS; i++) { - if (_anims[i].script == 0 || !_anims[i].play || _anims[i].nextRun != 0 && _anims[i].nextRun > currTime) - continue; - - if (_anims[i].reentry == 0) { - data = _anims[i].script; - if (READ_LE_UINT16(data) == 0xFF8B) - continue; - } else { - data = _anims[i].reentry; - _anims[i].reentry = 0; - } - - endLoop = false; - while (READ_LE_UINT16(data) != 0xFF87 && !endLoop) { - assert((data - _anims[i].script) < _anims[i].length); - switch (READ_LE_UINT16(data)) { - case 0xFF88: - data += 2; - debug(6, "func: Set sprite image."); - debug(6, "Sprite index %i", READ_LE_UINT16(data)); - _anims[i].sprite = READ_LE_UINT16(data); - data += 2; - //debug(6, "Unused %i", READ_LE_UINT16(data)); - data += 2; - debug(6, "X %i", READ_LE_UINT16(data)); - _anims[i].x = READ_LE_UINT16(data); - data += 2; - debug(6, "Y %i", READ_LE_UINT16(data)); - _anims[i].y = READ_LE_UINT16(data); - data += 2; - _anims[i].flipX = false; - refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1 != 0); - break; - case 0xFF8D: - data += 2; - debug(6, "func: Set sprite image, flipped."); - debug(6, "Sprite index %i", READ_LE_UINT16(data)); - _anims[i].sprite = READ_LE_UINT16(data); - data += 2; - //debug(9, "Unused %i", READ_LE_UINT16(data)); - data += 2; - debug(6, "X %i", READ_LE_UINT16(data)); - _anims[i].x = READ_LE_UINT16(data); - data += 2; - debug(6, "Y %i", READ_LE_UINT16(data)); - _anims[i].y = READ_LE_UINT16(data); - data += 2; - _anims[i].flipX = true; - refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1 != 0); - break; - case 0xFF8A: - data += 2; - debug(6, "func: Set time to wait"); - debug(6, "Time %i", READ_LE_UINT16(data)); - _anims[i].nextRun = _system->getMillis() + READ_LE_UINT16(data) * _animDelay; - data += 2; - break; - case 0xFFB3: - data += 2; - debug(6, "func: Set time to wait to random value"); - rndNr = READ_LE_UINT16(data) + _rnd.getRandomNumber( READ_LE_UINT16(data) + 2); - debug(6, "Minimum time %i", READ_LE_UINT16(data)); - data += 2; - debug(6, "Maximum time %i", READ_LE_UINT16(data)); - data += 2; - _anims[i].nextRun = _system->getMillis() + rndNr * _animDelay; - break; - case 0xFF8C: - data += 2; - debug(6, "func: Wait until wait time has elapsed"); - _anims[i].reentry = data; - endLoop = true; - //assert( _anims[i].nextRun > _system->getMillis()); - break; - case 0xFF99: - data += 2; - debug(1, "func: Set value of unknown animation property to 1"); - _anims[i].unk1 = 1; - break; - case 0xFF9A: - data += 2; - debug(1, "func: Set value of unknown animation property to 0"); - _anims[i].unk1 = 0; - break; - case 0xFF97: - data += 2; - debug(6, "func: Set default X coordinate of sprite"); - debug(6, "X %i", READ_LE_UINT16(data)); - _anims[i].x = READ_LE_UINT16(data); - data += 2; - break; - case 0xFF98: - data += 2; - debug(6, "func: Set default Y coordinate of sprite"); - debug(6, "Y %i", READ_LE_UINT16(data)); - _anims[i].y = READ_LE_UINT16(data); - data += 2; - break; - case 0xFF8B: - debug(6, "func: Jump to start of script section"); - //data = scriptStart; - _anims[i].nextRun = _system->getMillis(); - endLoop = true; - break; - case 0xFF8E: - data += 2; - debug(6, "func: Begin for () loop"); - debug(6, "Iterations: %i", READ_LE_UINT16(data)); - _anims[i].loopsLeft = READ_LE_UINT16(data); - data += 2; - _anims[i].loopStart = data; - break; - case 0xFF8F: - data += 2; - debug(6, "func: End for () loop"); - if (_anims[i].loopsLeft > 0) { - _anims[i].loopsLeft--; - data = _anims[i].loopStart; - } - break; - case 0xFF90: - data += 2; - debug(6, "func: Set sprite image using default X and Y"); - debug(6, "Sprite index %i", READ_LE_UINT16(data)); - _anims[i].sprite = READ_LE_UINT16(data); - _anims[i].flipX = false; - data += 2; - refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1 != 0); - break; - case 0xFF91: - data += 2; - debug(6, "func: Set sprite image using default X and Y, flipped."); - debug(6, "Sprite index %i", READ_LE_UINT16(data)); - _anims[i].sprite = READ_LE_UINT16(data); - _anims[i].flipX = true; - data += 2; - refreshSceneAnimObject(i, _anims[i].sprite, _anims[i].x, _anims[i].y, _anims[i].flipX, _anims[i].unk1 != 0); - break; - case 0xFF92: - data += 2; - debug(6, "func: Increase value of default X-coordinate"); - debug(6, "Increment %i", READ_LE_UINT16(data)); - _anims[i].x += READ_LE_UINT16(data); - data += 2; - break; - case 0xFF93: - data += 2; - debug(6, "func: Increase value of default Y-coordinate"); - debug(6, "Increment %i", READ_LE_UINT16(data)); - _anims[i].y += READ_LE_UINT16(data); - data += 2; - break; - case 0xFF94: - data += 2; - debug(6, "func: Decrease value of default X-coordinate"); - debug(6, "Decrement %i", READ_LE_UINT16(data)); - _anims[i].x -= READ_LE_UINT16(data); - data += 2; - break; - case 0xFF95: - data += 2; - debug(6, "func: Decrease value of default Y-coordinate"); - debug(6, "Decrement %i", READ_LE_UINT16(data)); - _anims[i].y -= READ_LE_UINT16(data); - data += 2; - break; - case 0xFF96: - data += 2; - debug(9, "func: Stop animation"); - debug(9, "Animation index %i", READ_LE_UINT16(data)); - anim = READ_LE_UINT16(data); - data += 2; - _anims[anim].play = false; - _anims[anim].sprite = -1; - break; -/* case 0xFF97: - data += 2; - debug(1, "func: Set value of animation property 34h to 0"); - break;*/ - case 0xFFAD: - data += 2; - debug(6, "func: Set Brandon's X coordinate"); - debug(6, "X %i", READ_LE_UINT16(data)); - _engine->currentCharacter()->x1 = READ_LE_UINT16(data); - data += 2; - break; - case 0xFFAE: - data += 2; - debug(6, "func: Set Brandon's Y coordinate"); - debug(6, "Y %i", READ_LE_UINT16(data)); - _engine->currentCharacter()->y1 = READ_LE_UINT16(data); - data += 2; - break; - case 0xFFAF: - data += 2; - debug(6, "func: Set Brandon's sprite"); - debug(6, "Sprite %i", READ_LE_UINT16(data)); - _engine->currentCharacter()->currentAnimFrame = READ_LE_UINT16(data); - data += 2; - break; - case 0xFFAA: - data += 2; - debug(1, "TODO func: Reset Brandon's sprite"); - break; - case 0xFFAB: - data += 2; - debug(6, "func: Update Brandon's sprite"); - _engine->animator()->animRefreshNPC(0); - _engine->animator()->flagAllObjectsForRefresh(); - _engine->animator()->updateAllObjectShapes(); - break; - case 0xFFB0: - data += 2; - debug(6, "func: Play sound"); - debug(6, "Sound index %i", READ_LE_UINT16(data)); - _engine->snd_playSoundEffect(READ_LE_UINT16(data)); - data += 2; - break; - case 0xFFB1: - data += 2; - _sceneAnimatorBeaconFlag = 1; - break; - case 0xFFB2: - data += 2; - _sceneAnimatorBeaconFlag = 0; - break; - case 0xFFB4: - data += 2; - debug(6, "func: Play (at random) a certain sound at a certain percentage of time"); - debug(6, "Sound index %i", READ_LE_UINT16(data)); - sound = READ_LE_UINT16(data); - data += 2; - debug(6, "Percentage %i", READ_LE_UINT16(data)); - rndNr = _rnd.getRandomNumber(100); - if (rndNr <= READ_LE_UINT16(data)) - _engine->snd_playSoundEffect(sound); - data += 2; - break; - case 0xFFA7: - data += 2; - _anims[READ_LE_UINT16(data)].play = 1; - data += 2; - break; - default: - debug(1, "Unsupported anim command %X in script %i", READ_LE_UINT16(data), i); - //endLoop = true; - data += 1; - break; - } - } - - if (READ_LE_UINT16(data) == 0xFF87) - _anims[i].play = false; - } -} - -void Sprites::loadDAT(const char *filename, SceneExits &exits) { - debug(9, "Sprites::loadDat('%s')", filename); - uint32 fileSize; - - delete[] _dat; - _spriteDefStart = 0; - - _dat = _res->fileData(filename, &fileSize); - - memset(_anims, 0, sizeof(_anims)); - uint8 nextAnim = 0; - - assert(fileSize > 0x6D); - - memcpy(_drawLayerTable, (_dat + 0x0D), 8); - _engine->_northExitHeight = READ_LE_UINT16(_dat + 0x15); - if (_engine->_northExitHeight & 1) - _engine->_northExitHeight += 1; - // XXX - memcpy(_screen->_currentPalette + 744 - 60, _dat + 0x17, 60); - uint8 *data = _dat + 0x6B; - - uint16 length = READ_LE_UINT16(data); - data += 2; - - if (length > 2) { - assert( length < fileSize); - uint8 *animstart; - uint8 *start = data; - - while (1) { - if (((uint16)(data - _dat) >= fileSize) || (data - start) >= length) - break; - - if (READ_LE_UINT16(data) == 0xFF83) { - //debug(1, "Body section end."); - data += 2; - break; - } - - switch (READ_LE_UINT16(data)) { - case 0xFF81: - data += 2; - //debug(1, "Body section start"); - break; - case 0xFF82: - data += 2; - //debug(1, "Unknown 0xFF82 section"); - break; - case 0xFF84: - data += 2; - _spriteDefStart = data; - while (READ_LE_UINT16(data) != 0xFF85) { - data += 2; - } - data += 2; - break; - case 0xFF86: - assert(nextAnim < MAX_NUM_ANIMS); - _anims[nextAnim].script = data; - _anims[nextAnim].sprite = -1; - _anims[nextAnim].play = true; - animstart = data; - data += 2; - while (READ_LE_UINT16(data) != 0xFF87) { - assert((uint16)(data - _dat) < fileSize); - data += 2; - } - _anims[nextAnim].length = data - animstart; - //debug(1, "Found an anim script of length %i!", _anims[nextAnim].length); - nextAnim++; - data += 2; - break; - default: - debug(1, "Unknown code in DAT file: %x", READ_LE_UINT16(data)); - data += 2; - break; - } - } - } else { - data += 2; - } - - assert(fileSize - (data - _dat) == 0xC); - - exits.northXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2; - exits.northYPos = *data++ & 0xFFFE; - exits.eastXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2; - exits.eastYPos = *data++ & 0xFFFE; - exits.southXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2; - exits.southYPos = *data++ & 0xFFFE; - exits.westXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2; - exits.westYPos = *data++ & 0xFFFE; -} - -void Sprites::freeSceneShapes() { - debug(9, "Sprites::freeSceneShapes()"); - for (int i = 0; i < ARRAYSIZE(_sceneShapes); i++ ) { - free(_sceneShapes[i]); - _sceneShapes[i] = 0; - } -} - -void Sprites::loadSceneShapes() { - debug(9, "Sprites::loadSceneShapes()"); - uint8 *data = _spriteDefStart; - int spriteNum, x, y, width, height; - - freeSceneShapes(); - memset( _sceneShapes, 0, sizeof(_sceneShapes)); - - if (_spriteDefStart == 0) - return; - - int bakPage = _screen->_curPage; - _screen->_curPage = 3; - - while (READ_LE_UINT16(data) != 0xFF85) { - spriteNum = READ_LE_UINT16(data); - assert(spriteNum < ARRAYSIZE(_sceneShapes)); - data += 2; - x = READ_LE_UINT16(data) * 8; - data += 2; - y = READ_LE_UINT16(data); - data += 2; - width = READ_LE_UINT16(data) * 8; - data += 2; - height = READ_LE_UINT16(data); - data += 2; - _sceneShapes[spriteNum] = _screen->encodeShape(x, y, width, height, 2); - debug(9, "Sprite %i is at (%i, %i), width %i, height %i", spriteNum, x, y, width, height); - } - _screen->_curPage = bakPage; -} - -void Sprites::refreshSceneAnimObject(uint8 animNum, uint8 shapeNum, uint16 x, uint16 y, bool flipX, bool unkFlag) { - debug(9, "Sprites::refreshSceneAnimObject(%i, %i, %i, %i, %i, %i", animNum, shapeNum, x, y, flipX, unkFlag); - AnimObject &anim = _engine->animator()->sprites()[animNum]; - anim.refreshFlag = 1; - anim.bkgdChangeFlag = 1; - - if (unkFlag) - anim.flags |= 0x0200; - else - anim.flags &= 0xFD00; - - if (flipX) - anim.flags |= 1; - else - anim.flags &= 0xFE; - - anim.sceneAnimPtr = _sceneShapes[shapeNum]; - anim.animFrameNumber = -1; - anim.x1 = x; - anim.y1 = y; -} - -int Sprites::getDrawLayer(int y) { - debug(9, "getDrawLayer(%d)", y); - uint8 returnValue = 0; - for (int i = 0; i < ARRAYSIZE(_drawLayerTable); ++i) { - uint8 temp = _drawLayerTable[i]; - if (temp) { - if (temp <= y) { - returnValue = i; - } - } - } - if (returnValue <= 0) { - returnValue = 1; - } else if (returnValue >= 7) { - returnValue = 6; - } - return returnValue; -} -} // end of namespace Kyra |