LOL: - implemented urbish mines gas explosion

svn-id: r41035
This commit is contained in:
Florian Kagerer 2009-05-30 15:52:09 +00:00
parent 8e2af8ff7c
commit 86d78bbc8b
5 changed files with 76 additions and 18 deletions

View file

@ -749,6 +749,7 @@ private:
int olol_paletteFlash(EMCState *script);
int olol_disableControls(EMCState *script);
int olol_enableControls(EMCState *script);
int olol_gasExplosion(EMCState *script);
int olol_characterSays(EMCState *script);
int olol_queueSpeech(EMCState *script);
int olol_getItemPrice(EMCState *script);
@ -982,7 +983,9 @@ private:
void movePartySmoothScrollTurnRight(int speed);
void pitDropScroll(int numSteps);
void shakeScene(int duration, int width, int height, int restore);
void processGasExplosion(int soundId);
int smoothScrollDrawSpecialGuiShape(int pageNum);

View file

@ -1021,7 +1021,7 @@ void LoLEngine::movePartySmoothScrollUp(int speed) {
_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, 2);
_screen->copyGuiShapeToSurface(14, 2);
_screen->restoreSceneWindow(2, 0);
_screen->updateScreen();
@ -1032,7 +1032,7 @@ void LoLEngine::movePartySmoothScrollUp(int speed) {
}
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, 12);
_screen->copyGuiShapeToSurface(14, 12);
if (_sceneDefaultUpdate != 2) {
_screen->restoreSceneWindow(12, 0);
@ -1056,7 +1056,7 @@ void LoLEngine::movePartySmoothScrollDown(int speed) {
_screen->smoothScrollZoomStepBottom(6, 2, _scrollXBottom[i], _scrollYBottom[i]);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, 2);
_screen->copyGuiShapeToSurface(14, 2);
_screen->restoreSceneWindow(2, 0);
_screen->updateScreen();
@ -1067,7 +1067,7 @@ void LoLEngine::movePartySmoothScrollDown(int speed) {
}
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, 12);
_screen->copyGuiShapeToSurface(14, 12);
if (_sceneDefaultUpdate != 2) {
_screen->restoreSceneWindow(6, 0);
@ -1155,7 +1155,7 @@ void LoLEngine::movePartySmoothScrollTurnLeft(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep1(_sceneDrawPage1, _sceneDrawPage2, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1164,7 +1164,7 @@ void LoLEngine::movePartySmoothScrollTurnLeft(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep2(_sceneDrawPage1, _sceneDrawPage2, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1173,7 +1173,7 @@ void LoLEngine::movePartySmoothScrollTurnLeft(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep3(_sceneDrawPage1, _sceneDrawPage2, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1199,7 +1199,7 @@ void LoLEngine::movePartySmoothScrollTurnRight(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep3(_sceneDrawPage2, _sceneDrawPage1, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1208,7 +1208,7 @@ void LoLEngine::movePartySmoothScrollTurnRight(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep2(_sceneDrawPage2, _sceneDrawPage1, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1217,7 +1217,7 @@ void LoLEngine::movePartySmoothScrollTurnRight(int speed) {
_smoothScrollTimer = _system->getMillis() + speed * _tickLength;
_screen->smoothScrollTurnStep1(_sceneDrawPage2, _sceneDrawPage1, dp);
if (d)
_screen->copyGuiShapeToSurface(_tempBuffer5120, dp);
_screen->copyGuiShapeToSurface(14, dp);
_screen->restoreSceneWindow(dp, 0);
_screen->updateScreen();
fadeText();
@ -1300,13 +1300,62 @@ void LoLEngine::shakeScene(int duration, int width, int height, int restore) {
}
}
void LoLEngine::processGasExplosion(int soundId) {
int cp = _screen->setCurPage(2);
_screen->copyPage(0, 12);
static const uint8 sounds[] = { 0x62, 0xA7, 0xA7, 0xA8 };
snd_playSoundEffect(sounds[soundId], -1);
uint16 targetBlock = 0;
int dist = getSpellTargetBlock(_currentBlock, _currentDirection, 3, targetBlock);
uint8 *p1 = _screen->getPalette(1);
uint8 *p2 = _screen->getPalette(3);
if (dist) {
WSAMovie_v2 *mov = new WSAMovie_v2(this, _screen);
char file[13];
snprintf(file, 13, "gasexp%0d.wsa", dist);
mov->open(file, 1, 0);
if (!mov->opened())
error("Gas: Unable to load gasexp.wsa");
playSpellAnimation(mov, 0, 6, 1, (176 - mov->width()) / 2 + 112, (120 - mov->height()) / 2, 0, 0, 0, 0, false);
mov->close();
delete mov;
} else {
memcpy(p2, p1, 768);
for (int i = 1; i < 128; i++)
p2[i * 3] = 0x3f;
uint32 ctime = _system->getMillis();
while (_screen->fadePaletteStep(_screen->_currentPalette, p2, _system->getMillis() - ctime, 10))
updateInput();
ctime = _system->getMillis();
while (_screen->fadePaletteStep(p2, _screen->_currentPalette, _system->getMillis() - ctime, 50))
updateInput();
}
_screen->copyPage(12, 2);
_screen->setCurPage(cp);
updateDrawPage2();
_sceneUpdateRequired = true;
gui_drawScene(0);
}
int LoLEngine::smoothScrollDrawSpecialGuiShape(int pageNum) {
if(!_specialGuiShape)
return 0;
_screen->clearGuiShapeMemory(pageNum);
_screen->drawShape(pageNum, _specialGuiShape, _specialGuiShapeX, _specialGuiShapeY, 2, 0);
_screen->copyGuiShapeFromSceneBackupBuffer(pageNum, _tempBuffer5120);
_screen->copyGuiShapeFromSceneBackupBuffer(pageNum, 14);
return 1;
}

View file

@ -327,9 +327,9 @@ void Screen_LoL::clearGuiShapeMemory(int pageNum) {
}
}
void Screen_LoL::copyGuiShapeFromSceneBackupBuffer(int srcPageNum, uint8 *dstBuffer) {
void Screen_LoL::copyGuiShapeFromSceneBackupBuffer(int srcPageNum, int dstPageNum) {
uint8 *src = getPagePtr(srcPageNum) + 0x79c3;
uint8 *dst = dstBuffer;
uint8 *dst = getPagePtr(dstPageNum);
for (int i = 0; i < 23; i++) {
uint8 len = 0;
@ -349,8 +349,8 @@ void Screen_LoL::copyGuiShapeFromSceneBackupBuffer(int srcPageNum, uint8 *dstBu
}
}
void Screen_LoL::copyGuiShapeToSurface(uint8 *srcBuffer, int dstPageNum) {
uint8 *src = srcBuffer;
void Screen_LoL::copyGuiShapeToSurface(int srcPageNum, int dstPageNum) {
uint8 *src = getPagePtr(srcPageNum);
uint8 *dst = getPagePtr(dstPageNum) + 0xe7c3;
for (int i = 0; i < 23; i++) {

View file

@ -56,8 +56,8 @@ public:
void backupSceneWindow(int srcPageNum, int dstPageNum);
void restoreSceneWindow(int srcPageNum, int dstPageNum);
void clearGuiShapeMemory(int pageNum);
void copyGuiShapeFromSceneBackupBuffer(int srcPageNum, uint8 *dstBuffer);
void copyGuiShapeToSurface(uint8 *srcBuffer, int dstPageNum);
void copyGuiShapeFromSceneBackupBuffer(int srcPageNum, int dstPageNum);
void copyGuiShapeToSurface(int srcPageNum, int dstPageNum);
void smoothScrollZoomStepTop(int srcPageNum, int dstPageNum, int x, int y);
void smoothScrollZoomStepBottom(int srcPageNum, int dstPageNum, int x, int y);
void smoothScrollHorizontalStep(int pageNum, int x, int u2, int w);

View file

@ -2044,6 +2044,12 @@ int LoLEngine::olol_enableControls(EMCState *script) {
return gui_enableControls();
}
int LoLEngine::olol_gasExplosion(EMCState *script) {
debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_gasExplosion(%p) (%d)", (const void *)script, stackPos(0));
processGasExplosion(stackPos(0));
return 1;
}
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));
if (stackPos(0) == -1) {
@ -2599,7 +2605,7 @@ void LoLEngine::setupOpcodeTable() {
// 0xB4
Opcode(olol_enableControls);
OpcodeUnImpl();
OpcodeUnImpl();
Opcode(olol_gasExplosion);
OpcodeUnImpl();
// 0xB8