LOL: implemented some opcodes required for yvel city

svn-id: r41041
This commit is contained in:
Florian Kagerer 2009-05-30 19:48:13 +00:00
parent 4ab05f0b38
commit a126a05dc4
6 changed files with 58 additions and 41 deletions

View file

@ -101,7 +101,6 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy
_monsterShapesEx = 0; _monsterShapesEx = 0;
_gameShapeMap = 0; _gameShapeMap = 0;
memset(_monsterAnimType, 0, 3); memset(_monsterAnimType, 0, 3);
_pageSavedFlag = false;
_healOverlay = 0; _healOverlay = 0;
_swarmSpellStatus = 0; _swarmSpellStatus = 0;
@ -833,7 +832,7 @@ void LoLEngine::startupNew() {
_currentLevel = 1; _currentLevel = 1;
giveCredits(41, 0); giveCredits(41, 0);
_inventory[0] = makeItem(132, 0, 0); _inventory[0] = makeItem(216, 0, 0);
_inventory[1] = makeItem(217, 0, 0); _inventory[1] = makeItem(217, 0, 0);
_inventory[2] = makeItem(218, 0, 0); _inventory[2] = makeItem(218, 0, 0);
@ -1635,25 +1634,6 @@ void LoLEngine::updateSequenceBackgroundAnimations() {
_tim->updateBackgroundAnimation(i); _tim->updateBackgroundAnimation(i);
} }
void LoLEngine::savePage5() {
if (_pageSavedFlag)
return;
_screen->copyRegionToBuffer(5, 0, 0, 320, 200, _pageBuffer2);
_pageSavedFlag = true;
}
void LoLEngine::restorePage5() {
if (!_pageSavedFlag)
return;
for (int i = 0; i < 6; i++)
_tim->freeAnimStruct(i);
_screen->copyBlockToPage(5, 0, 0, 320, 200, _pageBuffer2);
_pageSavedFlag = false;
}
void LoLEngine::loadTalkFile(int index) { void LoLEngine::loadTalkFile(int index) {
char file[8]; char file[8];

View file

@ -740,8 +740,10 @@ private:
int olol_getNextActiveCharacter(EMCState *script); int olol_getNextActiveCharacter(EMCState *script);
int olol_paralyzePoisonCharacter(EMCState *script); int olol_paralyzePoisonCharacter(EMCState *script);
int olol_drawCharPortrait(EMCState *script); int olol_drawCharPortrait(EMCState *script);
int olol_getAnimationLastPart(EMCState *script);
int olol_assignSpecialGuiShape(EMCState *script); int olol_assignSpecialGuiShape(EMCState *script);
int olol_findInventoryItem(EMCState *script); int olol_findInventoryItem(EMCState *script);
int olol_restoreFadePalette(EMCState *script);
int olol_changeItemTypeOrFlag(EMCState *script); int olol_changeItemTypeOrFlag(EMCState *script);
int olol_placeInventoryItemInHand(EMCState *script); int olol_placeInventoryItemInHand(EMCState *script);
int olol_castSpell(EMCState *script); int olol_castSpell(EMCState *script);
@ -750,6 +752,8 @@ private:
int olol_disableControls(EMCState *script); int olol_disableControls(EMCState *script);
int olol_enableControls(EMCState *script); int olol_enableControls(EMCState *script);
int olol_gasExplosion(EMCState *script); int olol_gasExplosion(EMCState *script);
int olol_calcNewBlockPosition(EMCState *script);
int olol_updateDrawPage2(EMCState *script);
int olol_characterSays(EMCState *script); int olol_characterSays(EMCState *script);
int olol_queueSpeech(EMCState *script); int olol_queueSpeech(EMCState *script);
int olol_getItemPrice(EMCState *script); int olol_getItemPrice(EMCState *script);
@ -816,8 +820,6 @@ private:
void generateBrightnessPalette(uint8 *src, uint8 *dst, int brightness, int modifier); void generateBrightnessPalette(uint8 *src, uint8 *dst, int brightness, int modifier);
void generateFlashPalette(uint8 *src, uint8 *dst, int colorFlags); void generateFlashPalette(uint8 *src, uint8 *dst, int colorFlags);
void updateSequenceBackgroundAnimations(); void updateSequenceBackgroundAnimations();
void savePage5();
void restorePage5();
bool _dialogueField; bool _dialogueField;
uint8 **_itemIconShapes; uint8 **_itemIconShapes;
@ -836,8 +838,6 @@ private:
uint8 *_characterFaceShapes[40][3]; uint8 *_characterFaceShapes[40][3];
bool _pageSavedFlag;
// characters // characters
bool addCharacter(int id); bool addCharacter(int id);
void setTemporaryFaceFrame(int charNum, int frame, int updateDelay, int redraw); void setTemporaryFaceFrame(int charNum, int frame, int updateDelay, int redraw);

View file

@ -1729,13 +1729,19 @@ int LoLEngine::olol_removeLevelItem(EMCState *script) {
int LoLEngine::olol_savePage5(EMCState *script) { int LoLEngine::olol_savePage5(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_savePage5(%p)", (const void *)script); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_savePage5(%p)", (const void *)script);
savePage5(); // Not implemented: The original code uses this to back up and restore page 5 which is used
// to load WSA files. Since our WSA player provides its own memory buffers we don't
// need to use page 5.
return 1; return 1;
} }
int LoLEngine::olol_restorePage5(EMCState *script) { int LoLEngine::olol_restorePage5(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restorePage5(%p)", (const void *)script); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restorePage5(%p)", (const void *)script);
restorePage5(); // Not implemented: The original code uses this to back up and restore page 5 which is used
// to load WSA files. Since our WSA player provides its own memory buffers we don't
// need to use page 5.
for (int i = 0; i < 6; i++)
_tim->freeAnimStruct(i);
return 1; return 1;
} }
@ -1869,7 +1875,7 @@ int LoLEngine::olol_paralyzePoisonCharacter(EMCState *script) {
} }
int LoLEngine::olol_drawCharPortrait(EMCState *script) { int LoLEngine::olol_drawCharPortrait(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_drawCharPortrait(%p) (%d)", (const void *)script, stackPos(0)); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_drawCharPortrait(%p) (%d)", (const void *)script, stackPos(0));
int charNum = stackPos(0); int charNum = stackPos(0);
if (charNum == -1) if (charNum == -1)
gui_drawAllCharPortraitsWithStats(); gui_drawAllCharPortraitsWithStats();
@ -1878,8 +1884,13 @@ int LoLEngine::olol_drawCharPortrait(EMCState *script) {
return 1; return 1;
} }
int LoLEngine::olol_getAnimationLastPart(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_getAnimationLastPart(%p) (%d)", (const void *)script, stackPos(0));
return _tim->resetAnimationLastPart(stackPos(0));
}
int LoLEngine::olol_assignSpecialGuiShape(EMCState *script) { int LoLEngine::olol_assignSpecialGuiShape(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_assignSpecialGuiShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4)); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_assignSpecialGuiShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
if (stackPos(0)) { if (stackPos(0)) {
_specialGuiShape = _levelShapes[_levelShapeProperties[_wllShapeMap[stackPos(0)]].shapeIndex[stackPos(1)]]; _specialGuiShape = _levelShapes[_levelShapeProperties[_wllShapeMap[stackPos(0)]].shapeIndex[stackPos(1)]];
_specialGuiShapeX = stackPos(2); _specialGuiShapeX = stackPos(2);
@ -1894,7 +1905,7 @@ int LoLEngine::olol_assignSpecialGuiShape(EMCState *script) {
} }
int LoLEngine::olol_findInventoryItem(EMCState *script) { int LoLEngine::olol_findInventoryItem(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_findInventoryItem(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_findInventoryItem(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
if (stackPos(0) == 0) { if (stackPos(0) == 0) {
for (int i = 0; i < 48; i++) { for (int i = 0; i < 48; i++) {
if (!_inventory[i]) if (!_inventory[i])
@ -1922,8 +1933,16 @@ int LoLEngine::olol_findInventoryItem(EMCState *script) {
return -1; return -1;
} }
int LoLEngine::olol_restoreFadePalette(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_restoreFadePalette(%p)", (const void *)script);
memcpy(_screen->_currentPalette, _screen->getPalette(1), 384);
_screen->fadePalette(_screen->_currentPalette, 10);
_screen->_fadeFlag = 0;
return 1;
}
int LoLEngine::olol_changeItemTypeOrFlag(EMCState *script) { int LoLEngine::olol_changeItemTypeOrFlag(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_changeItemTypeOrFlag(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_changeItemTypeOrFlag(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
if (stackPos(0) < 1) if (stackPos(0) < 1)
return 0; return 0;
@ -2050,6 +2069,17 @@ int LoLEngine::olol_gasExplosion(EMCState *script) {
return 1; return 1;
} }
int LoLEngine::olol_calcNewBlockPosition(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_calcNewBlockPosition(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
return calcNewBlockPosition(stackPos(0), stackPos(1));
}
int LoLEngine::olol_updateDrawPage2(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_updateDrawPage2(%p)", (const void *)script);
updateDrawPage2();
return 1;
}
int LoLEngine::olol_characterSays(EMCState *script) { int LoLEngine::olol_characterSays(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterSays(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterSays(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
if (stackPos(0) == -1) { if (stackPos(0) == -1) {
@ -2576,12 +2606,12 @@ void LoLEngine::setupOpcodeTable() {
OpcodeUnImpl(); OpcodeUnImpl();
OpcodeUnImpl(); OpcodeUnImpl();
OpcodeUnImpl(); OpcodeUnImpl();
OpcodeUnImpl(); Opcode(olol_getAnimationLastPart);
// 0xA4 // 0xA4
Opcode(olol_assignSpecialGuiShape); Opcode(olol_assignSpecialGuiShape);
Opcode(olol_findInventoryItem); Opcode(olol_findInventoryItem);
OpcodeUnImpl(); Opcode(olol_restoreFadePalette);
OpcodeUnImpl(); OpcodeUnImpl();
// 0xA8 // 0xA8
@ -2606,11 +2636,11 @@ void LoLEngine::setupOpcodeTable() {
Opcode(olol_enableControls); Opcode(olol_enableControls);
OpcodeUnImpl(); OpcodeUnImpl();
Opcode(olol_gasExplosion); Opcode(olol_gasExplosion);
OpcodeUnImpl(); Opcode(olol_calcNewBlockPosition);
// 0xB8 // 0xB8
OpcodeUnImpl(); OpcodeUnImpl();
OpcodeUnImpl(); Opcode(olol_updateDrawPage2);
OpcodeUnImpl(); OpcodeUnImpl();
Opcode(olol_characterSays); Opcode(olol_characterSays);

View file

@ -1065,6 +1065,13 @@ void TIMInterpreter_LoL::playAnimationPart(int animIndex, int firstFrame, int la
} }
} }
int TIMInterpreter_LoL::resetAnimationLastPart(int animIndex) {
Animation *anim = &_animations[animIndex];
int8 res = -1;
SWAP(res, anim->lastPart);
return res;
}
void TIMInterpreter_LoL::drawDialogueButtons() { void TIMInterpreter_LoL::drawDialogueButtons() {
int cp = _screen->setCurPage(0); int cp = _screen->setCurPage(0);
Screen::FontId of = _screen->setFont(Screen::FID_6_FNT); Screen::FontId of = _screen->setFont(Screen::FID_6_FNT);

View file

@ -144,6 +144,7 @@ public:
virtual void stopBackgroundAnimation(int animIndex) {} virtual void stopBackgroundAnimation(int animIndex) {}
virtual void updateBackgroundAnimation(int animIndex) {} virtual void updateBackgroundAnimation(int animIndex) {}
virtual void playAnimationPart(int animIndex, int firstFrame, int lastFrame, int delay) {} virtual void playAnimationPart(int animIndex, int firstFrame, int lastFrame, int delay) {}
virtual int resetAnimationLastPart(int animIndex) { return -1; }
virtual void resetDialogueState(TIM *tim) {} virtual void resetDialogueState(TIM *tim) {}
@ -238,6 +239,7 @@ public:
void stopBackgroundAnimation(int animIndex); void stopBackgroundAnimation(int animIndex);
void updateBackgroundAnimation(int animIndex); void updateBackgroundAnimation(int animIndex);
void playAnimationPart(int animIndex, int firstFrame, int lastFrame, int delay); void playAnimationPart(int animIndex, int firstFrame, int lastFrame, int delay);
int resetAnimationLastPart(int animIndex);
private: private:
KyraEngine_v1 *vm(); KyraEngine_v1 *vm();

View file

@ -77,11 +77,10 @@ void TextDisplayer_LoL::setupField(bool mode) {
for (int i = 177; i > 141; i--) { for (int i = 177; i > 141; i--) {
uint32 endTime = _vm->_system->getMillis() + _vm->_tickLength; uint32 endTime = _vm->_system->getMillis() + _vm->_tickLength;
_screen->hideMouse();
_screen->copyRegion(83, i, 83, i - 1, 235, 3, 0, 0, Screen::CR_NO_P_CHECK); _screen->copyRegion(83, i, 83, i - 1, 235, 3, 0, 0, Screen::CR_NO_P_CHECK);
_screen->copyRegion(83, i + 1, 83, i + 1, 235, 1, 2, 0, Screen::CR_NO_P_CHECK); _screen->copyRegion(83, i + 1, 83, i + 1, 235, 1, 2, 0, Screen::CR_NO_P_CHECK);
_vm->updateInput();
_screen->updateScreen(); _screen->updateScreen();
_screen->showMouse();
_vm->delayUntil(endTime); _vm->delayUntil(endTime);
} }
@ -98,7 +97,7 @@ void TextDisplayer_LoL::setupField(bool mode) {
} }
void TextDisplayer_LoL::expandField() { void TextDisplayer_LoL::expandField() {
uint8 *tmp = _vm->_pageBuffer1 + 1300; uint8 *tmp = _vm->_pageBuffer1 + 13000;
if (_vm->textEnabled()) { if (_vm->textEnabled()) {
_vm->_fadeText = false; _vm->_fadeText = false;
@ -110,10 +109,9 @@ void TextDisplayer_LoL::expandField() {
for (int i = 140; i < 177; i++) { for (int i = 140; i < 177; i++) {
uint32 endTime = _vm->_system->getMillis() + _vm->_tickLength; uint32 endTime = _vm->_system->getMillis() + _vm->_tickLength;
_screen->hideMouse();
_screen->copyRegion(0, 0, 83, i, 235, 3, 2, 0, Screen::CR_NO_P_CHECK); _screen->copyRegion(0, 0, 83, i, 235, 3, 2, 0, Screen::CR_NO_P_CHECK);
_vm->updateInput();
_screen->updateScreen(); _screen->updateScreen();
_screen->showMouse();
_vm->delayUntil(endTime); _vm->delayUntil(endTime);
} }