[Scummvm-cvs-logs] CVS: scummvm/kyra kyra.cpp,1.66,1.67 kyra.h,1.32,1.33 screen.cpp,1.22,1.23 screen.h,1.14,1.15 script_v1.cpp,1.18,1.19 sprites.cpp,1.6,1.7 sprites.h,1.4,1.5
Johannes Schickel
lordhoto at users.sourceforge.net
Thu Nov 10 06:10:03 CET 2005
Update of /cvsroot/scummvm/scummvm/kyra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9949
Modified Files:
kyra.cpp kyra.h screen.cpp screen.h script_v1.cpp sprites.cpp
sprites.h
Log Message:
Commited patch #1350510 with some little changes. Thanks to vinterstum.
Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -d -r1.66 -r1.67
--- kyra.cpp 9 Nov 2005 22:26:10 -0000 1.66
+++ kyra.cpp 10 Nov 2005 14:08:50 -0000 1.67
@@ -285,7 +285,7 @@
_animStates = new AnimObject[31];
assert(_animStates);
_charactersAnimState = &_animStates[0];
- _animObjects = &_animStates[5];
+ _sprites->_animObjects = &_animStates[5];
_animItems = &_animStates[16];
_scriptInterpreter = new ScriptHelper(this);
@@ -308,6 +308,8 @@
memset(_shapes, 0, sizeof(_shapes));
memset(_wsaObjects, 0, sizeof(_wsaObjects));
[...1001 lines suppressed...]
if (cur == rem) {
@@ -2424,7 +2820,7 @@
cur->nextAnimObject = add;
add->nextAnimObject = 0;
}
- return 0;
+ return queue;
}
#pragma mark -
@@ -2937,7 +3333,8 @@
if (!temp)
continue;
++table;
- // XXX updateAnimFlags
+ _sprites->updateSceneAnims();
+ waitTicks(10);
// XXX updateMousePointer
// XXX updateGameTimers
updateAllObjectShapes();
Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -d -r1.32 -r1.33
--- kyra.h 9 Nov 2005 22:26:11 -0000 1.32
+++ kyra.h 10 Nov 2005 14:08:50 -0000 1.33
@@ -87,7 +87,7 @@
uint32 flags;
int16 drawY;
uint8 *sceneAnimPtr;
- uint16 animFrameNumber;
+ int16 animFrameNumber;
uint8 *background;
uint16 rectSize;
int16 x1, y1;
@@ -167,13 +167,12 @@
uint8 game() const { return _game; }
uint32 features() const { return _features; }
- SceneExits sceneExits() const { return _sceneExits; }
- // ugly hack used by the dat loader
- SceneExits &sceneExits() { return _sceneExits; }
Common::RandomSource _rnd;
int16 _northExitHeight;
+ Character *_currentCharacter;
+
typedef void (KyraEngine::*IntroProc)();
typedef int (KyraEngine::*OpcodeProc)(ScriptState *script);
@@ -183,16 +182,18 @@
const char **seqTextsTable() { return (const char **)_seq_textsTable; }
bool seq_skipSequence() const;
-
+ void quitGame();
void loadBitmap(const char *filename, int tempPage, int dstPage, uint8 *palData);
void snd_playTheme(int file, int track = 0);
void snd_playTrack(int track);
void snd_playVoiceFile(int id);
bool snd_voicePlaying();
+ void snd_playSoundEffect(int track);
void printTalkTextMessage(const char *text, int x, int y, uint8 color, int srcPage, int dstPage);
void restoreTalkTextMessageBkgd(int srcPage, int dstPage);
+ void drawSentenceCommand(char *sentence, int unk1);
WSAMovieV1 *wsa_open(const char *filename, int offscreenDecode, uint8 *palBuf);
void wsa_close(WSAMovieV1 *wsa);
@@ -200,6 +201,11 @@
void wsa_play(WSAMovieV1 *wsa, int frameNum, int x, int y, int pageNum);
void waitTicks(int ticks);
+ void updateAllObjectShapes();
+ void flagAllObjectsForRefresh();
+ void animRefreshNPC(int character);
+ int16 fetchAnimWidth(const uint8 *shape, int16 mult);
+ int8 fetchAnimHeight(const uint8 *shape, int8 mult);
int mouseX() { return _mouseX; }
int mouseY() { return _mouseY; }
@@ -377,6 +383,15 @@
int getWidestLineWidth(int linesCount);
void calcWidestLineBounds(int &x1, int &x2, int w, int cx);
void printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
+ void characterSays(char *msg, int8 charNum, int8 chatDuration);
+ int initCharacterChat(int8 charNum);
+ int8 getChatPartnerNum();
+ void backupChatPartnerAnimFrame(int8 charNum);
+ void restoreChatPartnerAnimFrame(int8 charNum);
+ void endCharacterChat(int8 charNum, int16 arg_4);
+ void waitForChatToFinish(int16 chatDuration, char *str, uint8 charNum);
+ void printCharacterText(char *text, int8 charNum);
+
void setCharacterDefaultFrame(int character);
void setCharactersPositions(int character);
void setCharactersHeight();
@@ -401,16 +416,15 @@
byte findItemAtPos(int x, int y);
void placeItemInGenericMapScene(int item, int index);
void initSceneObjectList(int brandonAlive);
+ void initSceneScreen(int brandonAlive);
+ void preserveAllBackgrounds();
+ void flagAllObjectsForBkgdChange();
void restoreAllObjectBackgrounds();
void preserveAnyChangedBackgrounds();
void preserveOrRestoreBackground(AnimObject *obj, bool restore);
void prepDrawAllObjects();
void copyChangedObjectsForward(int refreshFlag);
- void updateAllObjectShapes();
- void animRefreshNPC(int character);
int findDuplicateItemShape(int shape);
- int16 fetchAnimWidth(const uint8 *shape, int16 mult);
- int8 fetchAnimHeight(const uint8 *shape, int8 mult);
int findWay(int x, int y, int toX, int toY, int *moveTable, int moveTableSize);
int findSubPath(int x, int y, int toX, int toY, int *moveTable, int start, int end);
int getFacingFromPointToPoint(int x, int y, int toX, int toY);
@@ -424,7 +438,7 @@
AnimObject *objectRemoveQueue(AnimObject *queue, AnimObject *rem);
AnimObject *objectAddHead(AnimObject *queue, AnimObject *head);
AnimObject *objectQueue(AnimObject *queue, AnimObject *add);
-
+ AnimObject *_animStates;
void seq_demo();
void seq_intro();
void seq_introLogos();
@@ -438,7 +452,7 @@
void snd_startTrack();
void snd_haltTrack();
void snd_setSoundEffectFile(int file);
- void snd_playSoundEffect(int track);
+
static OpcodeProc _opcodeTable[];
static const int _opcodeTableSize;
@@ -509,6 +523,9 @@
int16 _brandonScaleX;
int16 _brandonScaleY;
int _brandonDrawFrame;
+
+ uint16 _currentChatPartnerBackupFrame;
+ uint16 _currentCharAnimFrame;
int8 *_sceneAnimTable[50];
@@ -528,10 +545,14 @@
int _lastFindWayRet;
int *_movFacingTable;
+ int8 _charSayUnk1; // this is byte_2EE24
+ int8 _charSayUnk2;
+ int8 _charSayUnk3; // this is byte_2EE25
+ int8 _charSayUnk4; // this is byte_2EE26
+
+ uint8 _configTalkspeed;
AnimObject *_objectQueue;
- AnimObject *_animStates;
AnimObject *_charactersAnimState;
- AnimObject *_animObjects;
AnimObject *_animItems;
int _curMusicTheme;
@@ -553,7 +574,6 @@
ScriptData *_scriptClickData;
Character *_characterList;
- Character *_currentCharacter;
uint8 *_seq_Forest;
uint8 *_seq_KallakWriting;
Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- screen.cpp 9 Nov 2005 22:26:11 -0000 1.22
+++ screen.cpp 10 Nov 2005 14:08:50 -0000 1.23
@@ -62,11 +62,6 @@
_decodeShapeBufferSize = 0;
_animBlockPtr = NULL;
_animBlockSize = 0;
- _mouseShape = NULL;
- _mouseShapeSize = 0;
- _mouseRect = NULL;
- _mouseRectSize = 0;
- _mouseDrawWidth = 0;
}
Screen::~Screen() {
@@ -75,15 +70,13 @@
_pagePtrs[pageNum] = _pagePtrs[pageNum + 1] = 0;
}
for (int f = 0; f < ARRAYSIZE(_fonts); ++f) {
- free(_fonts[f].fontData);
+ delete[] _fonts[f].fontData;
_fonts[f].fontData = NULL;
}
free(_currentPalette);
free(_screenPalette);
free(_decodeShapeBuffer);
free(_animBlockPtr);
- free(_mouseShape);
- free(_mouseRect);
for (int i = 0; i < 3; ++i) {
free(_palettes[i]);
}
@@ -305,6 +298,7 @@
void Screen::copyCurPageBlock(int x, int y, int h, int w, uint8 *dst) {
debug(9, "Screen::copyCurPageBlock(%d, %d, %d, %d, 0x%X)", x, y, w, h, dst);
+ assert(dst);
if (x < 0) {
x = 0;
} else if (x >= 40) {
@@ -389,6 +383,8 @@
debug(9, "Screen::setAnimBlockPtr(%d)", size);
free(_animBlockPtr);
_animBlockPtr = (uint8 *)malloc(size);
+ assert(_animBlockPtr);
+ memset(_animBlockPtr, 0, size);
_animBlockSize = size;
}
@@ -1590,14 +1586,14 @@
debug(9, "hideMouse()");
// if mouseDisabled
// return
- restoreMouseRect();
+ _system->showMouse(false);
}
void Screen::showMouse() {
debug(9, "showMouse()");
// if mouseDisabled
// return
- copyMouseToScreen();
+ _system->showMouse(true);
}
void Screen::setShapePages(int page1, int page2) {
@@ -1606,140 +1602,30 @@
_shapePages[1] = _pagePtrs[page2];
}
-byte *Screen::setMouseCursor(int x, int y, byte *shape) {
+void Screen::setMouseCursor(int x, int y, byte *shape) {
debug(9, "setMouseCursor(%d, %d, 0x%X)", x, y, shape);
if (!shape)
- return _mouseShape;
+ return;
// if mouseDisabled
// return _mouseShape
-
- restoreMouseRect();
-
+
if (_vm->features() & GF_TALKIE)
shape += 2;
-
- int mouseRectSize = getRectSize((READ_LE_UINT16(shape + 3) >> 3) + 2, shape[5]);
- if (_mouseRectSize < mouseRectSize) {
- free(_mouseRect);
- _mouseRect = (uint8*)malloc(mouseRectSize << 3);
- assert(_mouseRect);
- _mouseRectSize = mouseRectSize;
- }
-
- int shapeSize = READ_LE_UINT16(shape + 8) + 10;
- if (_vm->features() & GF_TALKIE)
- shapeSize += 2;
- if (READ_LE_UINT16(shape) & 1)
- shapeSize += 16;
-
- if (_mouseShapeSize < shapeSize) {
- free(_mouseShape);
- _mouseShape = (uint8*)malloc(shapeSize);
- assert(_mouseShape);
- _mouseShapeSize = shapeSize;
- }
-
- byte *dst = _mouseShape;
- byte *src = shape;
- if (_vm->features() & GF_TALKIE)
- dst += 2;
-
- if (!(READ_LE_UINT16(shape) & 2)) {
- uint16 newFlags = 0;
- newFlags = READ_LE_UINT16(src) | 2; src += 2;
- WRITE_LE_UINT16(dst, newFlags); dst += 2;
- memcpy(dst, src, 6);
- dst += 6;
- src += 6;
- int size = READ_LE_UINT16(src); src += 2;
- WRITE_LE_UINT16(dst, size); dst += 2;
- if (newFlags & 1) {
- memcpy(dst, src, 8);
- dst += 16;
- src += 16;
- }
- decodeFrame4(src, _animBlockPtr, size);
- memcpy(dst, _animBlockPtr, size);
- } else {
- int size = READ_LE_UINT16(shape + 6);
- memcpy(dst, src, size);
- }
-
- _mouseXOffset = x; _mouseYOffset = y;
- if (_vm->features() & GF_TALKIE) {
- _mouseHeight = _mouseShape[7];
- _mouseWidth = (READ_LE_UINT16(_mouseShape + 5) >> 3) + 2;
- } else {
- _mouseHeight = _mouseShape[5];
- _mouseWidth = (READ_LE_UINT16(_mouseShape + 3) >> 3) + 2;
- }
-
- copyMouseToScreen();
-
- return _mouseShape;
-}
-void Screen::restoreMouseRect() {
- debug(9, "restoreMouseRect()");
- // if disableMouse
- // return
+ int mouseHeight = *(shape+2);
+ int mouseWidth = (READ_LE_UINT16(shape + 3)) + 2;
- if (_mouseDrawWidth && _mouseRect) {
- copyScreenFromRect(_mouseDrawX, _mouseDrawY, _mouseDrawWidth, _mouseDrawHeight, _mouseRect);
- }
- _mouseDrawWidth = 0;
-}
+ uint8 *cursor = (uint8 *)malloc(mouseHeight * mouseWidth);
+ fillRect(0, 0, mouseWidth, mouseHeight, 0, 3);
+ drawShape(3, shape, 0, 0, 0, 0);
+
+ copyRegionToBuffer(3, 0, 0, mouseWidth, mouseHeight, cursor);
+ _system->setMouseCursor(cursor, mouseWidth, mouseHeight, 0, 0, 0);
+ _system->showMouse(true);
+ free(cursor);
+
+ return;
-void Screen::copyMouseToScreen() {
- debug(9, "copyMouseToScreen()");
- // if disableMouse
- // return
-
- restoreMouseRect();
-
- int width = _mouseWidth;
- int height = _mouseHeight;
- int xpos = _vm->mouseX() - _mouseXOffset;
- int ypos = _vm->mouseY() - _mouseYOffset;
- if (xpos < -1 || ypos < -1) {
- return;
- }
-
- int xposTemp = xpos;
- int yposTemp = ypos;
-
- if (xposTemp < 0) {
- xposTemp = 0;
- }
- if (yposTemp < 0) {
- height += ypos;
- yposTemp = 0;
- }
-
- xposTemp >>= 3;
- _mouseDrawX = xposTemp;
- _mouseDrawY = yposTemp;
-
- xposTemp += width;
- xposTemp -= 40;
- if (xposTemp >= 0) {
- width -= xposTemp;
- }
-
- yposTemp += height;
- yposTemp -= 200;
- if (yposTemp >= 0) {
- height -= yposTemp;
- }
-
- _mouseDrawWidth = width;
- _mouseDrawHeight = height;
-
- if (_mouseRect) {
- copyScreenToRect(_mouseDrawX, _mouseDrawY, width, height, _mouseRect);
- }
-
- drawShape(0, _mouseShape, xpos, ypos, 0, 0, 0);
}
void Screen::copyScreenFromRect(int x, int y, int w, int h, uint8 *ptr) {
Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/screen.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- screen.h 1 Nov 2005 14:19:50 -0000 1.14
+++ screen.h 10 Nov 2005 14:08:50 -0000 1.15
@@ -123,7 +123,7 @@
void hideMouse();
void showMouse();
void setShapePages(int page1, int page2);
- byte *setMouseCursor(int x, int y, byte *shape);
+ void setMouseCursor(int x, int y, byte *shape);
uint8 *getPalette(int num);
byte getShapeFlag1(int x, int y);
@@ -152,15 +152,6 @@
int _decodeShapeBufferSize;
uint8 *_animBlockPtr;
int _animBlockSize;
-
- uint8 *_mouseShape;
- uint8 *_mouseRect;
- int _mouseShapeSize;
- int _mouseRectSize;
- int _mouseDrawX, _mouseDrawY;
- int _mouseDrawWidth, _mouseDrawHeight;
- int _mouseWidth, _mouseHeight;
- int _mouseXOffset, _mouseYOffset;
OSystem *_system;
KyraEngine *_vm;
Index: script_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/script_v1.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- script_v1.cpp 9 Nov 2005 22:26:12 -0000 1.18
+++ script_v1.cpp 10 Nov 2005 14:08:50 -0000 1.19
@@ -122,7 +122,7 @@
}
void ScriptHelper::c1_ifNotJmp() {
- if (_curScript->stack[++_curScript->sp-1] != 0) {
+ if (!_curScript->stack[_curScript->sp++]) {
_parameter &= 0x7FFF;
_curScript->ip = _curScript->dataPtr->data + (_parameter << 1);
}
@@ -296,6 +296,7 @@
#pragma mark -
#define stackPos(x) script->stack[script->sp+x]
+#define stackPosString(x) (char *)&script->dataPtr->text[READ_BE_UINT16( &((uint16 *)script->dataPtr->text)[stackPos(x)])]
int KyraEngine::cmd_magicInMouseItem(ScriptState *script) {
warning("STUB: cmd_magicInMouseItem");
@@ -303,7 +304,16 @@
}
int KyraEngine::cmd_characterSays(ScriptState *script) {
- warning("STUB: cmd_characterSays");
+ debug(9, "cmd_characterSays(0x%X)", script);
+ // Japanese version?
+ /*const char *str1 = "âuâëâôââôüAé?é¢ùêé¢é+é®üH";
+ const char *str2 = "âuâëâôâ\\âôüAé?é¢ùêé¢é+é®üH";
+
+ if (strcmp(stackPosString(0), str1) == 0)
+ characterSays((char *)str2, stackPos(1), stackPos(2));
+ else*/
+ characterSays(stackPosString(0), stackPos(1), stackPos(2));
+
return 0;
}
@@ -314,7 +324,7 @@
int KyraEngine::cmd_drawSceneAnimShape(ScriptState *script) {
debug(9, "cmd_drawSceneAnimShape(0x%X)", script);
- _screen->drawShape(stackPos(4), _sprites->getSceneShape(stackPos(0)), stackPos(1), stackPos(2), 0, stackPos(3));
+ _screen->drawShape(stackPos(4), _sprites->_sceneShapes[stackPos(0)], stackPos(1), stackPos(2), 0, stackPos(3));
return 0;
}
@@ -417,13 +427,13 @@
int KyraEngine::cmd_sceneAnimOn(ScriptState *script) {
debug(9, "cmd_sceneAnimOn(0x%X)", script);
- _sprites->enableAnim(stackPos(0));
+ _sprites->_anims[stackPos(0)].play = true;
return 0;
}
int KyraEngine::cmd_sceneAnimOff(ScriptState *script) {
debug(9, "cmd_sceneAnimOff(0x%X)", script);
- _sprites->disableAnim(stackPos(0));
+ _sprites->_anims[stackPos(0)].play = false;
return 0;
}
@@ -530,7 +540,8 @@
}
int KyraEngine::cmd_internalAnimOn(ScriptState *script) {
- warning("STUB: cmd_internalAnimOn");
+ debug(9, "cmd_internalAnimOn(0x%X)", script);
+ _sprites->_animObjects[stackPos(0)].active = 1;
return 0;
}
@@ -552,11 +563,8 @@
int KyraEngine::cmd_openWSAFile(ScriptState *script) {
debug(9, "cmd_openWSAFile(0x%X)", script);
- int wsaIndex = stackPos(0);
- uint16 offset = READ_BE_UINT16(&script->dataPtr->text[wsaIndex]);
- char *filename = (char*)&script->dataPtr->text[offset];
-
- wsaIndex = stackPos(1);
+ char *filename = stackPosString(0);
+ int wsaIndex = stackPos(1);
// stackPos(2) is NOT used whyever
int offscreenDecode = 0;
if (!stackPos(3)) {
@@ -646,7 +654,8 @@
}
int KyraEngine::cmd_restoreAllObjectBackgrounds(ScriptState *script) {
- warning("STUB: cmd_restoreAllObjectBackgrounds");
+ debug(9, "cmd_restoreAllObjectBackgrounds(0x%X)", script);
+ restoreAllObjectBackgrounds();
return 0;
}
@@ -747,7 +756,8 @@
}
int KyraEngine::cmd_internalAnimOff(ScriptState *script) {
- warning("STUB: cmd_internalAnimOff");
+ debug(9, "cmd_internalAnimOff(0x%X)", script);
+ _sprites->_animObjects[stackPos(0)].active = 0;
return 0;
}
@@ -916,7 +926,7 @@
++curPos;
// XXX
waitTicks(10);
- // XXX updateAnimFlags();
+ _sprites->updateSceneAnims();
// XXX updateMouseCursor();
// XXX updateGameTimers();
updateAllObjectShapes();
@@ -951,13 +961,17 @@
}
int KyraEngine::cmd_updateSceneAnimations(ScriptState *script) {
- warning("STUB: cmd_updateSceneAnimations");
+ debug(9, "cmd_updateSceneAnimations(0x%X)", script);
+ if (stackPos(0)) {
+ _sprites->updateSceneAnims();
+ updateAllObjectShapes();
+ }
return 0;
}
int KyraEngine::cmd_sceneAnimationActive(ScriptState *script) {
- warning("STUB: cmd_sceneAnimationActive");
- return 0;
+ debug(9, "cmd_sceneAnimationActive(0x%X)", script);
+ return _sprites->_anims[stackPos(0)].play;
}
int KyraEngine::cmd_setCharactersMovementDelay(ScriptState *script) {
@@ -1062,7 +1076,9 @@
}
int KyraEngine::cmd_setSceneAnimCurrXY(ScriptState *script) {
- warning("STUB: cmd_setSceneAnimCurrXY");
+ debug(9, "cmd_setSceneAnimCurrXY(0x%X)", script);
+ _sprites->_anims[stackPos(0)].x = stackPos(1);
+ _sprites->_anims[stackPos(0)].y = stackPos(2);
return 0;
}
@@ -1218,7 +1234,8 @@
}
int KyraEngine::cmd_message(ScriptState *script) {
- warning("STUB: cmd_message");
+ debug(9, "cmd_message(0x%X)", script);
+ drawSentenceCommand(stackPosString(0), stackPos(1));
return 0;
}
Index: sprites.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/sprites.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- sprites.cpp 9 Nov 2005 22:26:12 -0000 1.6
+++ sprites.cpp 10 Nov 2005 14:08:50 -0000 1.7
@@ -46,82 +46,99 @@
Sprites::~Sprites() {
delete[] _dat;
freeSceneShapes();
-}
-
-uint8 *Sprites::getSceneShape(uint8 sceneShapeID) {
- assert( sceneShapeID < ARRAYSIZE(_sceneShapes));
- return _sceneShapes[sceneShapeID];
-}
-
-void Sprites::drawSprites(uint8 srcPage, uint8 dstPage) {
- int flags;
-
for (int i = 0; i < MAX_NUM_ANIMS; i++) {
- if (_anims[i].script == 0 || !_anims[i].play)
- break;
- if (_anims[i].sprite >= 0) {
- assert( _anims[i].sprite < ARRAYSIZE(_sceneShapes));
- uint8 *sprite = _sceneShapes[_anims[i].sprite];
-
- //debug(1, "Drawing from X %i, Y %i, to X %i, Y %i, width %i, height %i, srcPage %i, dstPage %i",
- // sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage);
- flags = Screen::CR_CLIPPED;
- if (_anims[i].flipX)
- flags |= Screen::CR_X_FLIPPED;
-
- //_screen->copyRegion(sprite.x, sprite.y, _anims[i].x, _anims[i].y, sprite.width, sprite.height, srcPage, dstPage, flags);
- _screen->drawShape(0, sprite, _anims[i].x, _anims[i].y, 0, 0, 0);
- }
+ if (_anims[i].background)
+ free(_anims[i].background);
}
}
-void Sprites::doAnims() {
- debug(9, "Sprites::doAnims()");
- uint32 currTime = _system->getMillis();
- 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;
+void Sprites::setupSceneAnims() {
+ debug(9, "Sprites::setupSceneAnims()");
+ uint8 *data;
- 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].reentry == 0) {
+ if (_anims[i].script != 0) {
data = _anims[i].script;
- //debug(1, "---Start of anim script---");
assert( READ_LE_UINT16(data) == 0xFF86 );
+ data += 4;
+
+ //sceneUnk16[i] = READ_LE_UINT16(data);
+ 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);
+ data += 4;
+ _anims[i].height = *(data);
+ data += 4;
+ _anims[i].sprite = READ_LE_UINT16(data);
+ data += 4;
+ _anims[i].flipX = READ_LE_UINT16(data);
+ data += 4;
+ _anims[i].width2 = *(data);
+ data += 4;
+ _anims[i].height2 = *(data);
+ data += 4;
+ _anims[i].unk1 = READ_LE_UINT16(data);
+ data += 4;
+ _anims[i].play = READ_LE_UINT16(data);
data += 2;
- //debug(1, "Default X of sprite: %i", READ_LE_UINT16(data + 0x12) );
- _anims[i].x = READ_LE_UINT16(data + 0x12);
- //debug(1, "Default Y of sprite: %i", READ_LE_UINT16(data + 0x16) );
- _anims[i].y = READ_LE_UINT16(data + 0x16);
+ _anims[i].script = data;
- //debug(1, "Anim %i flags: 22h: %i, 1ah: %i", i, READ_LE_UINT16(data + 0x22), READ_LE_UINT16(data + 0x1a));
+ int bkgdWidth = _anims[i].width;
+ int bkgdHeight = _anims[i].height;
- /*
- debug(1, "Anim %i data: 0h: %i, 2h: %i,4h: %i,6h: %i,8h: %i,ah: %i,ch: %i", i, READ_LE_UINT16(data + 0x0),
- READ_LE_UINT16(data + 0x2), READ_LE_UINT16(data + 0x4),READ_LE_UINT16(data + 0x6),READ_LE_UINT16(data + 0x8),
- READ_LE_UINT16(data + 0xa),READ_LE_UINT16(data + 0xc));
+ if (_anims[i].width2)
+ bkgdWidth += (_anims[i].width2 >> 3) + 1;
- debug(1, "Anim %i data: eh: %i, 10h: %i,12h: %i,14h: %i,16h: %i,18h: %i,1ah: %i", i, READ_LE_UINT16(data + 0xe),
- READ_LE_UINT16(data + 0x10), READ_LE_UINT16(data + 0x12),READ_LE_UINT16(data + 0x14),READ_LE_UINT16(data + 0x16),
- READ_LE_UINT16(data + 0x18),READ_LE_UINT16(data + 0x1a));
+ if (_anims[i].height2)
+ bkgdHeight += _anims[i].height2;
- debug(1, "Anim %i data: 1ch: %i, 1fh: %i,22h: %i,24h: %i,26h: %i,28h: %i,2ah: %i", i, READ_LE_UINT16(data + 0x1c),
- READ_LE_UINT16(data + 0x1f), READ_LE_UINT16(data + 0x22),READ_LE_UINT16(data + 0x24),READ_LE_UINT16(data + 0x26),
- READ_LE_UINT16(data + 0x28),READ_LE_UINT16(data + 0x2a));
- */
+ _anims[i].background = (uint8 *)malloc(_screen->getRectSize(bkgdWidth + 1, bkgdHeight));
+ //_anims[i].background = (uint8 *)malloc(100*100);
+ assert(_anims[i].background);
+ }
+ }
+}
+void Sprites::updateSceneAnims() {
+ debug(9, "Sprites::updateSceneAnims()");
+ uint32 currTime = _system->getMillis();
+ uint8 *data;
+ bool endLoop;
- // TODO: Find out what the rest of this data (next 38h bytes) does.
- data += 0x38;
+ 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;
} else {
data = _anims[i].reentry;
_anims[i].reentry = 0;
}
- bool endLoop = false;
-
+ endLoop = false;
while (READ_LE_UINT16(data) != 0xFF87 && !endLoop) {
uint16 rndNr;
uint16 anim;
@@ -142,6 +159,7 @@
_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);
break;
case 0xFF8D:
data += 2;
@@ -158,6 +176,7 @@
_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);
break;
case 0xFF8A:
data += 2;
@@ -174,7 +193,7 @@
data += 2;
debug(5, "Maximum time %i", READ_LE_UINT16(data));
data += 2;
- _anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;
+ _anims[i].nextRun = _system->getMillis() + rndNr * _animDelay;
break;
case 0xFF8C:
data += 2;
@@ -185,11 +204,13 @@
break;
case 0xFF99:
data += 2;
- debug(1, "TODO func: Set value of animation property 32h to 1");
+ debug(1, "func: Set value of unknown animation property to 1");
+ _anims[i].unk1 = 1;
break;
case 0xFF9A:
data += 2;
- debug(1, "TODO func: Set value of animation property 32h to 0");
+ debug(1, "func: Set value of unknown animation property to 0");
+ _anims[i].unk1 = 0;
break;
case 0xFF97:
data += 2;
@@ -234,6 +255,7 @@
_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);
break;
case 0xFF91:
data += 2;
@@ -242,6 +264,7 @@
_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);
break;
case 0xFF92:
data += 2;
@@ -279,8 +302,6 @@
data += 2;
_anims[anim].play = false;
_anims[anim].sprite = -1;
- //debug(1, "Arg2 %i", READ_LE_UINT16(data));
- //data += 2;
break;
/* case 0xFF97:
data += 2;
@@ -288,20 +309,23 @@
break;*/
case 0xFFAD:
data += 2;
- debug(1, "TODO func: Set Brandon's X coordinate");
- debug(1, "X %i", READ_LE_UINT16(data));
+ debug(5, "func: Set Brandon's X coordinate");
+ debug(5, "X %i", READ_LE_UINT16(data));
+ _engine->_currentCharacter->x1 = READ_LE_UINT16(data);
data += 2;
break;
case 0xFFAE:
data += 2;
- debug(1, "TODO func: Set Brandon's Y coordinate");
- debug(1, "Y %i", READ_LE_UINT16(data));
+ debug(5, "func: Set Brandon's Y coordinate");
+ debug(5, "Y %i", READ_LE_UINT16(data));
+ _engine->_currentCharacter->y1 = READ_LE_UINT16(data);
data += 2;
break;
case 0xFFAF:
data += 2;
- debug(1, "TODO func: Set Brandon's X sprite");
- debug(1, "Sprite %i", READ_LE_UINT16(data));
+ debug(5, "func: Set Brandon's sprite");
+ debug(5, "Sprite %i", READ_LE_UINT16(data));
+ _engine->_currentCharacter->currentAnimFrame = READ_LE_UINT16(data);
data += 2;
break;
case 0xFFAA:
@@ -310,28 +334,36 @@
break;
case 0xFFAB:
data += 2;
- debug(1, "TODO func: Update Brandon's sprite");
+ debug(5, "func: Update Brandon's sprite");
+ _engine->animRefreshNPC(0);
+ _engine->flagAllObjectsForRefresh();
+ _engine->updateAllObjectShapes();
break;
case 0xFFB0:
data += 2;
- debug(1, "TODO func: Play sound");
- debug(1, "Sound index %i", READ_LE_UINT16(data));
+ debug(5, "func: Play sound");
+ debug(5, "Sound index %i", READ_LE_UINT16(data));
+ _engine->snd_playSoundEffect(READ_LE_UINT16(data));
data += 2;
break;
case 0xFFB1:
data += 2;
- debug(1, "TODO func: Set unknown global bit");
+ debug(1, "TODO func: Set animator beacon flag");
break;
case 0xFFB2:
data += 2;
- debug(1, "TODO func: Reset unknown global bit");
+ debug(1, "TODO func: Reset animator beacon flag");
break;
case 0xFFB4:
data += 2;
- debug(1, "TODO func: Play (at random) a certain sound at a certain percentage of time");
- debug(1, "Sound index %i", READ_LE_UINT16(data));
+ debug(5, "func: Play (at random) a certain sound at a certain percentage of time");
+ debug(5, "Sound index %i", READ_LE_UINT16(data));
+ int sound = READ_LE_UINT16(data);
data += 2;
- debug(1, "Percentage %i", READ_LE_UINT16(data));
+ debug(5, "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:
@@ -341,7 +373,7 @@
data += 2;
break;
default:
- debug(1, "Unsupported anim command %X", READ_LE_UINT16(data));
+ debug(1, "Unsupported anim command %X in script %i", READ_LE_UINT16(data), i);
//endLoop = true;
data += 1;
break;
@@ -350,21 +382,19 @@
if (READ_LE_UINT16(data) == 0xFF87)
_anims[i].play = false;
-
- //debug(1, "---End of anim script---");
}
}
-void Sprites::loadDAT(const char *filename) {
+void Sprites::loadDAT(const char *filename, SceneExits &exits) {
debug(9, "Sprites::loadDat('%s')", filename);
uint32 fileSize;
- uint8 spritesLoaded = 0;
delete[] _dat;
+ _spriteDefStart = 0;
_dat = _res->fileData(filename, &fileSize);
- memset(_anims, 0, sizeof(Anim) * MAX_NUM_ANIMS);
+ memset(_anims, 0, sizeof(_anims));
uint8 nextAnim = 0;
assert(fileSize > 0x6D);
@@ -380,8 +410,6 @@
uint16 length = READ_LE_UINT16(data);
data += 2;
- //debug(1, "DAT body length: %i, filesize %i, current spot %i", length, fileSize, data - _dat);
-
if (length > 2) {
assert( length < fileSize);
uint8 *animstart;
@@ -440,14 +468,8 @@
data += 2;
}
- debug(1, "Room DAT file loaded. Found %i sprite and %i animation scripts.", spritesLoaded, nextAnim);
-
- //debug(1, "Remainder after script: %i", fileSize - (data - _dat));
assert(fileSize - (data - _dat) == 0xC);
- //TODO: Read in character entry coords here
- SceneExits &exits = _engine->sceneExits();
-
exits.northXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2;
exits.northYPos = *data++ & 0xFFFE;
exits.eastXPos = READ_LE_UINT16(data) & 0xFFFC; data += 2;
@@ -459,9 +481,11 @@
}
void Sprites::freeSceneShapes() {
- for (int i = 0; i < ARRAYSIZE(_sceneShapes); i++ )
+ debug(9, "Sprites::freeSceneShapes()");
+ for (int i = 0; i < ARRAYSIZE(_sceneShapes); i++ ) {
free(_sceneShapes[i]);
-
+ _sceneShapes[i] = 0;
+ }
}
void Sprites::loadSceneShapes() {
@@ -469,11 +493,15 @@
uint8 *data = _spriteDefStart;
int spriteNum, x, y, width, height;
- assert(_spriteDefStart);
-
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));
@@ -486,8 +514,31 @@
data += 2;
height = READ_LE_UINT16(data);
data += 2;
- _sceneShapes[spriteNum] = _screen->encodeShape(x, y, width, height, 0);
+ _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);
+ _animObjects[animNum].refreshFlag = 1;
+ _animObjects[animNum].bkgdChangeFlag = 1;
+
+ if (unkFlag)
+ _animObjects[animNum].flags |= 0x0200;
+ else
+ _animObjects[animNum].flags &= 0xFD00;
+
+ if (flipX)
+ _animObjects[animNum].flags |= 1;
+ else
+ _animObjects[animNum].flags &= 0xFE;
+
+ _animObjects[animNum].sceneAnimPtr = _sceneShapes[shapeNum];
+ _animObjects[animNum].animFrameNumber = -1;
+ _animObjects[animNum].x1 = x;
+ _animObjects[animNum].y1 = y;
}
} // end of namespace Kyra
Index: sprites.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/sprites.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- sprites.h 29 Oct 2005 18:37:40 -0000 1.4
+++ sprites.h 10 Nov 2005 14:08:50 -0000 1.5
@@ -45,6 +45,14 @@
uint8 *reentry;
uint32 nextRun;
bool play;
+ uint16 width;
+ uint16 height;
+ uint16 width2;
+ uint16 height2;
+ uint16 unk1;
+ uint16 drawY;
+ uint16 unk2;
+ uint8 *background;
};
class Sprites {
@@ -53,14 +61,16 @@
Sprites(KyraEngine *engine, OSystem *system);
~Sprites();
- void doAnims();
- void loadDAT(const char *filename);
- uint8 *getSceneShape(uint8 sceneShapeID);
- void drawSprites(uint8 srcPage, uint8 dstPage);
+ void updateSceneAnims();
+ void setupSceneAnims();
+ void loadDAT(const char *filename, SceneExits &exits);
void loadSceneShapes();
- void enableAnim(uint8 anim) { _anims[anim].play = true; }
- void disableAnim(uint8 anim) { _anims[anim].play = false; }
+ Anim _anims[MAX_NUM_ANIMS];
+ AnimObject *_animObjects;
+ uint8 *_sceneShapes[50];
+
+ void refreshSceneAnimObject(uint8 animNum, uint8 shapeNum, uint16 x, uint16 y, bool flipX, bool unkFlag);
protected:
void freeSceneShapes();
@@ -69,9 +79,7 @@
Resource *_res;
OSystem *_system;
Screen *_screen;
- uint8 *_sceneShapes[50];
uint8 *_dat;
- Anim _anims[MAX_NUM_ANIMS];
Common::RandomSource _rnd;
uint8 _animDelay;
uint8 *_spriteDefStart;
More information about the Scummvm-git-logs
mailing list