aboutsummaryrefslogtreecommitdiff
path: root/kyra
diff options
context:
space:
mode:
authorJohannes Schickel2005-11-13 19:35:01 +0000
committerJohannes Schickel2005-11-13 19:35:01 +0000
commite0aef914fd2ef0eb852ea325028d29991e2f9a62 (patch)
tree6bd811f691d029666f1d0f5880f67ef1b0cd0268 /kyra
parent267fc7e2f652feaf6168d65ccf2916e09fe12edb (diff)
downloadscummvm-rg350-e0aef914fd2ef0eb852ea325028d29991e2f9a62.tar.gz
scummvm-rg350-e0aef914fd2ef0eb852ea325028d29991e2f9a62.tar.bz2
scummvm-rg350-e0aef914fd2ef0eb852ea325028d29991e2f9a62.zip
Fixed a bug with the sprite loader and various things related to
the scene switching code. Now the intro works correctly with a minor graphics glitch. svn-id: r19588
Diffstat (limited to 'kyra')
-rw-r--r--kyra/kyra.cpp144
-rw-r--r--kyra/kyra.h4
-rw-r--r--kyra/screen.cpp2
-rw-r--r--kyra/script.cpp2
-rw-r--r--kyra/script.h2
-rw-r--r--kyra/script_v1.cpp10
-rw-r--r--kyra/sprites.cpp2
-rw-r--r--kyra/staticres.cpp8
8 files changed, 103 insertions, 71 deletions
diff --git a/kyra/kyra.cpp b/kyra/kyra.cpp
index 29a8659638..2f864f9ec2 100644
--- a/kyra/kyra.cpp
+++ b/kyra/kyra.cpp
@@ -1088,6 +1088,7 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
if (_newMusicTheme != _curMusicTheme) {
snd_playTheme(_newMusicTheme);
}
+
switch (_currentCharacter->sceneId) {
case 1:
if (sceneId == 0) {
@@ -1145,7 +1146,7 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
break;
}
- moveCharacterToPos(0, 2, xpos, ypos);
+ moveCharacterToPos(0, facing, xpos, ypos);
}
for (int i = 0; i < 10; ++i) {
@@ -1204,10 +1205,8 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
startSceneScript(brandonAlive);
// XXX setupSceneItems
initSceneData(facing, unk2, brandonAlive);
-
- // XXX setTextFadeTimerCountdown
- _scriptClick->variables[3] = 1;
+ _loopFlag2 = 0;
_screen->showMouse();
if (!brandonAlive) {
// XXX seq_poisionDeathNow
@@ -1217,30 +1216,34 @@ void KyraEngine::enterNewScene(int sceneId, int facing, int unk1, int unk2, int
void KyraEngine::moveCharacterToPos(int character, int facing, int xpos, int ypos) {
debug(9, "moveCharacterToPos(%d, %d, %d, %d)", character, facing, xpos, ypos);
Character *ch = &_characterList[character];
+ ch->facing = facing;
_screen->hideMouse();
xpos &= 0xFFFC;
ypos &= 0xFFFE;
+ disableTimer(19);
+ disableTimer(14);
+ disableTimer(18);
switch (facing) {
case 0:
- if (ypos < ch->y1) {
+ while (ypos < ch->y1) {
setCharacterPositionWithUpdate(character);
}
break;
case 2:
- if (ch->x1 < xpos) {
+ while (ch->x1 < xpos) {
setCharacterPositionWithUpdate(character);
}
break;
case 4:
- if (ypos > ch->y1) {
+ while (ypos > ch->y1) {
setCharacterPositionWithUpdate(character);
}
break;
case 6:
- if (ch->x1 > xpos) {
+ while (ch->x1 > xpos) {
setCharacterPositionWithUpdate(character);
}
break;
@@ -1248,13 +1251,17 @@ void KyraEngine::moveCharacterToPos(int character, int facing, int xpos, int ypo
default:
break;
}
+ enableTimer(19);
+ enableTimer(14);
+ enableTimer(18);
_screen->showMouse();
}
void KyraEngine::setCharacterPositionWithUpdate(int character) {
debug(9, "setCharacterPositionWithUpdate(%d)", character);
- _sprites->updateSceneAnims();
setCharacterPosition(character, 0);
+ _sprites->updateSceneAnims();
+ updateGameTimers();
updateAllObjectShapes();
// XXX processPalette
if (_currentCharacter->sceneId == 210) {
@@ -1337,14 +1344,14 @@ void KyraEngine::setCharacterPositionHelper(int character, int *facingTable) {
};
if (facing == 0) {
- if (maxAnimationFrame[36+character] < ch->currentAnimFrame) {
+ if (maxAnimationFrame[36+character] > ch->currentAnimFrame) {
ch->currentAnimFrame = maxAnimationFrame[36+character];
}
if (maxAnimationFrame[30+character] < ch->currentAnimFrame) {
ch->currentAnimFrame = maxAnimationFrame[36+character];
}
} else if (facing == 4) {
- if (maxAnimationFrame[18+character] < ch->currentAnimFrame) {
+ if (maxAnimationFrame[18+character] > ch->currentAnimFrame) {
ch->currentAnimFrame = maxAnimationFrame[18+character];
}
if (maxAnimationFrame[12+character] < ch->currentAnimFrame) {
@@ -1371,6 +1378,7 @@ void KyraEngine::setCharacterPositionHelper(int character, int *facingTable) {
}
int KyraEngine::getOppositeFacingDirection(int dir) {
+ debug(9, "getOppositeFacingDirection(%d)", dir);
switch (dir) {
case 0:
return 2;
@@ -1413,10 +1421,11 @@ void KyraEngine::loadSceneMSC() {
char fileNameBuffer[32];
strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
strcat(fileNameBuffer, ".MSC");
+ _screen->fillRect(0, 0, 319, 199, 0, 5);
loadBitmap(fileNameBuffer, 3, 5, 0);
}
-// maybe move this two functions to Screen
+// maybe move these two functions to Screen
void KyraEngine::blockInRegion(int x, int y, int width, int height) {
debug(9, "blockInRegion(%d, %d, %d, %d)", x, y, width, height);
assert(_screen->_shapePages[0]);
@@ -1452,13 +1461,13 @@ void KyraEngine::startSceneScript(int brandonAlive) {
strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
strcat(fileNameBuffer, ".CPS");
loadBitmap(fileNameBuffer, 3, 3, 0);
-
_sprites->loadSceneShapes();
+ _exitListPtr = 0;
- _screen->fillRect(4, 4, 312, 136, 0, 0);
- _screen->updateScreen();
+ _screen->fillRect(7, 7, 312, 136, 0, 0);
_screen->setScreenPalette(_screen->_currentPalette);
- _screen->copyRegion(4, 4, 4, 4, 308, 132, 3, 0);
+ _screen->copyRegion(7, 7, 7, 7, 305, 129, 3, 0);
+ _screen->updateScreen();
_scaleMode = 1;
for (int i = 0; i < 145; ++i) {
@@ -1483,13 +1492,13 @@ void KyraEngine::startSceneScript(int brandonAlive) {
void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
debug(9, "initSceneData(%d, %d, %d)", facing, unk1, brandonAlive);
- int xpos2 = 0;
+ int16 xpos2 = 0;
int setFacing = 1;
- int xpos = 0, ypos = 0;
+ int16 xpos = 0, ypos = 0;
if (_brandonPosX == -1 && _brandonPosY == -1) {
- switch (facing) {
+ switch (facing+1) {
case 0:
xpos = ypos = -1;
break;
@@ -1518,13 +1527,13 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
break;
}
- if ((_northExitHeight & 0xFF) >= ypos) {
+ if ((uint8)(_northExitHeight & 0xFF) >= ypos) {
ypos = (_northExitHeight & 0xFF);
}
if (xpos >= 308) {
xpos = 304;
}
- if ((_northExitHeight >> 8) - 2 <= ypos) {
+ if ((uint8)(_northExitHeight >> 8) - 2 <= ypos) {
ypos = (_northExitHeight >> 8) - 4;
}
if (xpos <= 12) {
@@ -1539,7 +1548,7 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
ypos = _brandonPosY;
}
- int ypos2 = 0;
+ int16 ypos2 = 0;
if (_brandonPosX > -1 && _brandonPosY > -1) {
switch (_currentCharacter->sceneId) {
case 1:
@@ -1550,6 +1559,8 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
facing = 4;
xpos2 = 192;
ypos2 = 104;
+ setFacing = 0;
+ unk1 = 1;
break;
case 3:
@@ -1560,6 +1571,8 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
facing = 2;
xpos2 = 204;
ypos2 = 94;
+ setFacing = 0;
+ unk1 = 1;
break;
case 26:
@@ -1570,6 +1583,8 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
facing = 4;
xpos2 = 192;
ypos2 = 128;
+ setFacing = 0;
+ unk1 = 1;
break;
case 44:
@@ -1580,6 +1595,8 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
facing = 6;
xpos2 = 156;
ypos2 = 96;
+ setFacing = 0;
+ unk1 = 1;
break;
case 37:
@@ -1590,19 +1607,19 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
facing = 2;
xpos2 = 148;
ypos2 = 114;
+ setFacing = 0;
+ unk1 = 1;
break;
default:
break;
}
-
- setFacing = 0;
- unk1 = 1;
}
_brandonPosX = _brandonPosY = -1;
- if (unk1 != 0 && setFacing != 0) {
+ if (unk1 && setFacing) {
+ ypos2 = ypos;
xpos2 = xpos;
switch (facing) {
case 0:
@@ -1614,11 +1631,11 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
break;
case 4:
- ypos = (_northExitHeight & 0xFF) - 4;
+ ypos = (uint8)(_northExitHeight & 0xFF) - 4;
break;
case 6:
- xpos = 335;
+ xpos = 336;
break;
default:
@@ -1627,7 +1644,7 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
}
xpos2 &= 0xFFFC;
- ypos2 &= 0xFE;
+ ypos2 &= 0xFFFE;
xpos &= 0xFFFC;
ypos &= 0xFFFE;
_currentCharacter->facing = facing;
@@ -1638,7 +1655,7 @@ void KyraEngine::initSceneData(int facing, int unk1, int brandonAlive) {
initSceneObjectList(brandonAlive);
- if (unk1 != 0 && brandonAlive == 0) {
+ if (unk1 && brandonAlive == 0) {
moveCharacterToPos(0, facing, xpos2, ypos2);
}
@@ -2781,10 +2798,22 @@ void KyraEngine::copyChangedObjectsForward(int refreshFlag) {
int xpos = 0, ypos = 0, width = 0, height = 0;
xpos = curObject->x1 - (curObject->width2+1);
ypos = curObject->y1 - curObject->height2;
- width = curObject->width + curObject->width2*2;
+ width = (curObject->width + curObject->width2*2)<<3;
height = curObject->height + curObject->height2*2;
- _screen->copyRegion(xpos, ypos, xpos, ypos, width<<3, height, 2, 0, Screen::CR_CLIPPED);
+ if (xpos < 8) {
+ xpos = 8;
+ } else if (xpos + width > 312) {
+ width = 312 - xpos;
+ }
+
+ if (ypos < 8) {
+ ypos = 8;
+ } else if (ypos + height > 134) {
+ height = 134 - ypos;
+ }
+
+ _screen->copyRegion(xpos, ypos, xpos, ypos, width, height, 2, 0, Screen::CR_CLIPPED);
curObject->refreshFlag = 0;
changed = true;
}
@@ -2820,7 +2849,6 @@ void KyraEngine::animRefreshNPC(int character) {
animObj->drawY = ch->y1;
animObj->sceneAnimPtr = _shapes[4+ch->currentAnimFrame];
animObj->animFrameNumber = ch->currentAnimFrame;
- // XXX
if (character == 0) {
if (_brandonStatusBit & 10) {
animObj->animFrameNumber = 88;
@@ -3157,7 +3185,7 @@ int KyraEngine::getFacingFromPointToPoint(int x, int y, int toX, int toY) {
}
if (xdiff >= ydiff) {
- int temp = xdiff;
+ int temp = ydiff;
ydiff = xdiff;
xdiff = temp;
@@ -3219,9 +3247,9 @@ bool KyraEngine::lineIsPassable(int x, int y) {
int ypos = 8;
if (_scaleMode) {
- int scaling = (_scaleTable[y] >> 5) + 1;
- if (8 >= scaling)
- ypos = scaling;
+ ypos = (_scaleTable[y] >> 5) + 1;
+ if (8 < ypos)
+ ypos = 8;
}
x -= (ypos >> 1);
@@ -3230,7 +3258,7 @@ bool KyraEngine::lineIsPassable(int x, int y) {
int xpos = x;
int xtemp = xpos + ypos - 1;
- if (xpos < 0)
+ if (x < 0)
xpos = 0;
if (xtemp > 319)
@@ -3333,7 +3361,7 @@ int KyraEngine::getMoveTableSize(int *moveTable) {
int KyraEngine::handleSceneChange(int xpos, int ypos, int unk1, int frameReset) {
debug(9, "handleSceneChange(%d, %d, %d, %d)", xpos, ypos, unk1, frameReset);
- if (!queryGameFlag(0xEF)) {
+ if (queryGameFlag(0xEF)) {
unk1 = 0;
}
int sceneId = _currentCharacter->sceneId;
@@ -3352,16 +3380,16 @@ int KyraEngine::handleSceneChange(int xpos, int ypos, int unk1, int frameReset)
}
}
- if (ypos < _northExitHeight+2) {
+ if (ypos <= (_northExitHeight&0xFF)+2) {
if (_roomTable[sceneId].northExit != 0xFFFF) {
- xpos = _northExitHeight;
- ypos = _sceneExits.northXPos;
+ xpos = _sceneExits.northXPos;
+ ypos = _northExitHeight & 0xFF;
_pathfinderFlag = 14;
}
} else if (ypos >= 136) {
if (_roomTable[sceneId].southExit != 0xFFFF) {
- xpos = 136;
- ypos = _sceneExits.southXPos;
+ xpos = _sceneExits.southXPos;
+ ypos = 136;
_pathfinderFlag = 11;
}
}
@@ -3421,6 +3449,9 @@ int KyraEngine::processSceneChange(int *table, int unk1, int frameReset) {
}
returnValue = (changeScene(_currentCharacter->facing) != 0);
+ if (returnValue) {
+ running = false;
+ }
if (unk1) {
// XXX
@@ -3461,6 +3492,7 @@ int KyraEngine::processSceneChange(int *table, int unk1, int frameReset) {
}
int KyraEngine::changeScene(int facing) {
+ debug(9, "changeScene(%d)", facing);
if (queryGameFlag(0xEF)) {
if (_currentCharacter->sceneId == 5) {
return 0;
@@ -3476,22 +3508,22 @@ int KyraEngine::changeScene(int facing) {
}
if (_exitListPtr) {
- uint16 *ptr = _exitListPtr;
+ int16 *ptr = _exitListPtr;
// this loop should be only entered on time, seems to be some hack in the original
while (true) {
- if (*ptr == 0xFFFF)
+ if (*ptr == -1)
break;
- if (*ptr > _currentCharacter->x1 || _currentCharacter->y1 < *(ptr + 1) || _currentCharacter->x1 > *(ptr + 2) || _currentCharacter->y1 > *(ptr + 3)) {
+ if (*ptr > _currentCharacter->x1 || _currentCharacter->y1 < ptr[1] || _currentCharacter->x1 > ptr[2] || _currentCharacter->y1 > ptr[3]) {
ptr += 10;
break;
}
- _brandonPosX = *(ptr + 6);
- _brandonPosY = *(ptr + 7);
- uint16 sceneId = *(ptr + 5);
- facing = *(ptr + 4);
- int unk1 = *(ptr + 8);
- int unk2 = *(ptr + 9);
+ _brandonPosX = ptr[6];
+ _brandonPosY = ptr[7];
+ uint16 sceneId = ptr[5];
+ facing = ptr[4];
+ int unk1 = ptr[8];
+ int unk2 = ptr[9];
if (sceneId == 0xFFFF) {
switch (facing) {
case 0:
@@ -3537,7 +3569,7 @@ int KyraEngine::changeScene(int facing) {
returnValue = 1;
}
- if (((_northExitHeight >> 8) & 0xFF) - 2 >= ypos || ((_northExitHeight >> 8) & 0xFF) - 2 < _currentCharacter->y1) {
+ if (((_northExitHeight >> 8) & 0xFF) - 2 < ypos || ((_northExitHeight >> 8) & 0xFF) - 2 < _currentCharacter->y1) {
facing = 4;
returnValue = 1;
}
@@ -3550,7 +3582,7 @@ int KyraEngine::changeScene(int facing) {
if (!returnValue)
return 0;
- int sceneId = 0xFFFF;
+ uint16 sceneId = 0xFFFF;
switch (facing) {
case 0:
sceneId = _roomTable[_currentCharacter->sceneId].northExit;
@@ -3571,7 +3603,7 @@ int KyraEngine::changeScene(int facing) {
if (sceneId == 0xFFFF)
return 0;
-
+
enterNewScene(sceneId, facing, 1, 1, 0);
return returnValue;
}
diff --git a/kyra/kyra.h b/kyra/kyra.h
index 01fd768f61..738f13330c 100644
--- a/kyra/kyra.h
+++ b/kyra/kyra.h
@@ -557,8 +557,8 @@ protected:
Item _itemTable[145];
- uint16 *_exitListPtr;
- uint16 _exitList[11];
+ int16 *_exitListPtr;
+ int16 _exitList[11];
SceneExits _sceneExits;
uint16 _currentRoom;
uint8 *_maskBuffer;
diff --git a/kyra/screen.cpp b/kyra/screen.cpp
index 58eab34910..4ed0db1a83 100644
--- a/kyra/screen.cpp
+++ b/kyra/screen.cpp
@@ -1116,7 +1116,7 @@ void Screen::decodeFrame4(const uint8 *src, uint8 *dst, uint32 dstSize) {
while (len--) {
*dst++ = *dstOffs++;
}
- }
+ }
} else if (code != 0x80) {
int len = MIN(count, code & 0x3F);
while (len--) {
diff --git a/kyra/script.cpp b/kyra/script.cpp
index c30e25208b..cf93823992 100644
--- a/kyra/script.cpp
+++ b/kyra/script.cpp
@@ -207,7 +207,7 @@ bool ScriptHelper::runScript(ScriptState *script) {
opcode = 0;
_parameter = code & 0x7FFF;
} else if (code & 0x4000) {
- _parameter = code & 0xFF;
+ _parameter = (int8)(code);
} else if (code & 0x2000) {
_parameter = READ_BE_UINT16(_curScript->ip); _curScript->ip += 2;
} else {
diff --git a/kyra/script.h b/kyra/script.h
index 1469ee6ef6..bbce63aa24 100644
--- a/kyra/script.h
+++ b/kyra/script.h
@@ -70,7 +70,7 @@ protected:
KyraEngine *_vm;
ScriptState *_curScript;
- uint32 _parameter;
+ int16 _parameter;
bool _continue;
typedef void (ScriptHelper::*CommandProc)();
diff --git a/kyra/script_v1.cpp b/kyra/script_v1.cpp
index 90a9d52d3b..65c41eb850 100644
--- a/kyra/script_v1.cpp
+++ b/kyra/script_v1.cpp
@@ -115,10 +115,10 @@ void ScriptHelper::c1_subSP() {
}
void ScriptHelper::c1_execOpcode() {
- assert((int)_parameter < _curScript->dataPtr->opcodeSize);
- if (_curScript->dataPtr->opcodes[_parameter] == &KyraEngine::cmd_dummy)
- debug("calling unimplemented opcode(0x%.02X)", _parameter);
- _curScript->retValue = (_vm->*_curScript->dataPtr->opcodes[_parameter])(_curScript);
+ assert((uint8)_parameter < _curScript->dataPtr->opcodeSize);
+ if (_curScript->dataPtr->opcodes[(uint8)_parameter] == &KyraEngine::cmd_dummy)
+ debug("calling unimplemented opcode(0x%.02X)", (uint8)_parameter);
+ _curScript->retValue = (_vm->*_curScript->dataPtr->opcodes[(uint8)_parameter])(_curScript);
}
void ScriptHelper::c1_ifNotJmp() {
@@ -296,7 +296,7 @@ void ScriptHelper::c1_setRetAndJmp() {
#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)])]
+#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");
diff --git a/kyra/sprites.cpp b/kyra/sprites.cpp
index ec20fd91b6..be5b54ec25 100644
--- a/kyra/sprites.cpp
+++ b/kyra/sprites.cpp
@@ -400,7 +400,7 @@ void Sprites::loadDAT(const char *filename, SceneExits &exits) {
assert(fileSize > 0x6D);
- _engine->_northExitHeight = READ_BE_UINT16(_dat + 0x15);
+ _engine->_northExitHeight = READ_LE_UINT16(_dat + 0x15);
if (_engine->_northExitHeight & 1)
_engine->_northExitHeight += 1;
// XXX
diff --git a/kyra/staticres.cpp b/kyra/staticres.cpp
index ac7bf0189b..3882c74b77 100644
--- a/kyra/staticres.cpp
+++ b/kyra/staticres.cpp
@@ -312,10 +312,10 @@ void KyraEngine::res_loadRoomTable(const byte *src, Room **loadTo, int *size) {
for (uint32 i = 0; i < count; ++i) {
(*loadTo)[i].nameIndex = *src++;
- (*loadTo)[i].northExit = READ_LE_UINT16(src); src += 2;
- (*loadTo)[i].eastExit = READ_LE_UINT16(src); src += 2;
- (*loadTo)[i].southExit = READ_LE_UINT16(src); src += 2;
- (*loadTo)[i].westExit = READ_LE_UINT16(src); src += 2;
+ (*loadTo)[i].northExit = READ_BE_UINT16(src); src += 2;
+ (*loadTo)[i].eastExit = READ_BE_UINT16(src); src += 2;
+ (*loadTo)[i].southExit = READ_BE_UINT16(src); src += 2;
+ (*loadTo)[i].westExit = READ_BE_UINT16(src); src += 2;
memset(&(*loadTo)[i].itemsTable[0], 0xFF, sizeof(byte)*6);
memset(&(*loadTo)[i].itemsTable[6], 0, sizeof(byte)*6);
memset((*loadTo)[i].itemsXPos, 0, sizeof(uint16)*12);