[Scummvm-git-logs] scummvm master -> aaaea78b3bee9ded630258aab24e307c5dd3789f
yuv422
yuv422 at users.noreply.github.com
Thu Mar 19 12:34:07 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
aaaea78b3b DRAGONS: Added map screen transition effects
Commit: aaaea78b3bee9ded630258aab24e307c5dd3789f
https://github.com/scummvm/scummvm/commit/aaaea78b3bee9ded630258aab24e307c5dd3789f
Author: Eric Fry (yuv422 at users.noreply.github.com)
Date: 2020-03-19T23:30:42+11:00
Commit Message:
DRAGONS: Added map screen transition effects
Fixed overrun bug with loading screen flames
Changed paths:
engines/dragons/dragons.cpp
engines/dragons/screen.cpp
engines/dragons/scriptopcodes.cpp
engines/dragons/specialopcodes.cpp
engines/dragons/specialopcodes.h
diff --git a/engines/dragons/dragons.cpp b/engines/dragons/dragons.cpp
index a934ffd3f8..a3eb89d2b6 100644
--- a/engines/dragons/dragons.cpp
+++ b/engines/dragons/dragons.cpp
@@ -1639,7 +1639,7 @@ void DragonsEngine::loadingScreenUpdate() {
if (_loadingScreenState->loadingFlamesUpdateCounter == 0) {
_loadingScreenState->loadingFlamesUpdateCounter = 4;
for (int i = 0; i < 10 ; i++) {
- flameYOffset = _loadingScreenState->baseYOffset - flameOffsetTbl[(i + _loadingScreenState->flameOffsetIdx) % 27];
+ flameYOffset = _loadingScreenState->baseYOffset - flameOffsetTbl[(i + _loadingScreenState->flameOffsetIdx) % 26];
if (_loadingScreenState->flames[i]->_y_pos >= -0xb) {
_loadingScreenState->flames[i]->_y_pos = flameYOffset;
}
@@ -1649,7 +1649,7 @@ void DragonsEngine::loadingScreenUpdate() {
quad->points[1].y = flameYOffset + 2;
}
}
- _loadingScreenState->flameOffsetIdx = (_loadingScreenState->flameOffsetIdx + 1) % 27;
+ _loadingScreenState->flameOffsetIdx = (_loadingScreenState->flameOffsetIdx + 1) % 26;
} else {
_loadingScreenState->loadingFlamesUpdateCounter--;
}
diff --git a/engines/dragons/screen.cpp b/engines/dragons/screen.cpp
index 0860c853ec..56c8465070 100644
--- a/engines/dragons/screen.cpp
+++ b/engines/dragons/screen.cpp
@@ -446,10 +446,10 @@ int16 Screen::addFlatQuad(int16 x0, int16 y0, int16 x1, int16 y1, int16 x3, int1
_flatQuads[i].points[0].y = y0;
_flatQuads[i].points[1].x = x1;
_flatQuads[i].points[1].y = y1;
- _flatQuads[i].points[2].x = x3;
- _flatQuads[i].points[2].y = y3;
- _flatQuads[i].points[3].x = x2;
- _flatQuads[i].points[3].y = y2;
+ _flatQuads[i].points[2].x = x2;
+ _flatQuads[i].points[2].y = y2;
+ _flatQuads[i].points[3].x = x3;
+ _flatQuads[i].points[3].y = y3;
_flatQuads[i].colour = colour;
_flatQuads[i].priorityLayer = priorityLayer;
return i;
@@ -464,7 +464,7 @@ void Screen::drawFlatQuads(uint16 priorityLayer) {
if (_flatQuads[i].flags & 1u && _flatQuads[i].priorityLayer == priorityLayer) {
//TODO need to support semitrans mode.
//TODO check if we need to support non-rectangular quads.
- fillRect(_flatQuads[i].colour, Common::Rect(_flatQuads[i].points[0].x, _flatQuads[i].points[0].y, _flatQuads[i].points[2].x + 1, _flatQuads[i].points[2].y + 1));
+ fillRect(_flatQuads[i].colour, Common::Rect(_flatQuads[i].points[0].x, _flatQuads[i].points[0].y, _flatQuads[i].points[3].x + 1, _flatQuads[i].points[3].y + 1));
}
}
}
diff --git a/engines/dragons/scriptopcodes.cpp b/engines/dragons/scriptopcodes.cpp
index c89d6ebfb7..a8981c76fb 100644
--- a/engines/dragons/scriptopcodes.cpp
+++ b/engines/dragons/scriptopcodes.cpp
@@ -908,7 +908,6 @@ void ScriptOpcodes::opLoadScene(ScriptOpCall &scriptOpCall) {
_vm->_sound->PauseCDMusic();
if (newSceneID != 0) {
- // load scene here.
_vm->_scene->_mapTransitionEffectSceneID = _vm->_scene->getSceneId();
_vm->_scene->setSceneId(newSceneID);
_vm->_flickerInitialSceneDirection = flickerDirection;
diff --git a/engines/dragons/specialopcodes.cpp b/engines/dragons/specialopcodes.cpp
index aa5116a6e3..e36ff57481 100644
--- a/engines/dragons/specialopcodes.cpp
+++ b/engines/dragons/specialopcodes.cpp
@@ -1118,17 +1118,19 @@ void SpecialOpcodes::spcKnightsSavedAgainCutScene() {
}
void SpecialOpcodes::spcTransitionToMap() {
- //TODO map transition
-// DAT_8006a422 = 0;
-// DAT_8006a424 = 0;
-// cursorSequenceId = 0;
-// _vm->waitForFrames();
-// engine_flags_maybe = engine_flags_maybe | 0x20000000;
-// FUN_80023b34(0, 0, 1);
+ _vm->_scene->setMgLayerPriority(0);
+ _vm->_scene->setFgLayerPriority(0);
+ _vm->_cursor->updateSequenceID(0);
+ _vm->waitForFrames(1);
+ _vm->setFlags(ENGINE_FLAG_20000000);
+ mapTransition(1);
}
void SpecialOpcodes::spcTransitionFromMap() {
- //TODO map transition
+ mapTransition(0);
+ _vm->_scene->setMgLayerPriority(2);
+ _vm->_scene->setFgLayerPriority(3);
+ _vm->clearFlags(ENGINE_FLAG_20000000);
}
void SpecialOpcodes::spcCaveOfDilemmaSceneLogic() {
@@ -1308,6 +1310,109 @@ void SpecialOpcodes::setSpecialOpCounter(int16 newValue) {
_specialOpCounter = newValue;
}
+void SpecialOpcodes::mapTransition(uint16 mode) {
+ const uint16 mapLookupTbl[26] = {
+ 160, 100, 45, 100,
+ 105, 170, 14, 87,
+ 83, 33, 86, 100,
+ 25, 180, 161, 156,
+ 195, 47, 287, 35,
+ 292, 80, 202, 182,
+ 127, 78
+ };
+
+ const uint16 mapSceneIdTbl[13] = {
+ 0,
+ 0xa, 0x15, 0x1a,
+ 0x1b, 0x1c, 0x1e,
+ 0x20, 0x23, 0x25,
+ 0x2d, 0x30, 0x31
+ };
+
+ bool hasDoneFade = false;
+ uint16 state = _vm->getINI(0x1e)->objectState;
+ if (state == 0) {
+ state = 0xc;
+ for (int i = 1; i < 0xd; i++) {
+ if (_vm->_scene->_mapTransitionEffectSceneID < mapSceneIdTbl[i]) {
+ state = i - 1;
+ break;
+ }
+ }
+ }
+
+ _vm->_cursor->updatePosition(mapLookupTbl[state * 2], mapLookupTbl[state * 2 + 1]);
+ _vm->setFlags(ENGINE_FLAG_20);
+
+ int32 uVar14 = (_vm->_cursor->_y << 0x10) >> 4;
+ int32 uVar6 = (DRAGONS_SCREEN_HEIGHT - _vm->_cursor->_y) * 0x10000 >> 4;
+ int32 uVar2 = _vm->_cursor->_x;
+ int32 uVar3 = (DRAGONS_SCREEN_WIDTH - uVar2) * 0x10000 >> 4;
+
+ if (mode == 0) { //Close map
+ FlatQuad *topQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,0,0x140,0,0x140,0,0,0,1,4,0));
+ FlatQuad *bottomQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,200,0x140,200,0x140,200,0,200,1,4,0));
+ FlatQuad *leftQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,0,0,0,0,200,0,200,1,4,0));
+ FlatQuad *rightQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0x140,0,0x140,0,0x140,200,0x140,200,1,4,0));
+ int32 iVar10 = topQuad->points[3].y << 0x10;
+ int32 iVar13 = bottomQuad->points[0].y << 0x10;
+ int32 iVar11 = rightQuad->points[0].x << 0x10;
+ int32 iVar12 = leftQuad->points[1].x << 0x10;
+
+
+
+ while (iVar10 < (_vm->_cursor->_y << 0x10)) {
+ iVar10 = iVar10 + uVar14;
+ iVar13 = iVar13 - uVar6;
+ iVar12 = iVar12 + uVar2 * 0x1000;
+ topQuad->points[3].y = iVar10 >> 0x10;
+ topQuad->points[2].y = iVar10 >> 0x10;
+ bottomQuad->points[0].y = iVar13 >> 0x10;
+ bottomQuad->points[1].y = iVar13 >> 0x10;
+ leftQuad->points[1].x = iVar12 >> 0x10;
+ leftQuad->points[3].x = iVar12 >> 0x10;
+ iVar11 = iVar11 - uVar3;
+ rightQuad->points[0].x = iVar11 >> 0x10;
+ rightQuad->points[2].x = iVar11 >> 0x10;
+ _vm->waitForFrames(1);
+ }
+
+ // fade_related_calls_with_1f();
+ } else if (mode == 1) { // Open map
+ int16 cursorX = _vm->_cursor->_x;
+ int16 cursorY = _vm->_cursor->_y;
+ FlatQuad *topQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,0,0x140,0,0x140,cursorY,0,cursorY,1,4,0));
+ FlatQuad *topQuad1 = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,cursorY,0x140,cursorY,0x140,200,0,200,1,4,0));
+ FlatQuad *bottomQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(0,0,cursorX,0,cursorX,200,0,200,1,4,0));
+ FlatQuad *rightQuad = _vm->_screen->getFlatQuad(_vm->_screen->addFlatQuad(cursorX,0,0x140,0,0x140,200,cursorX,200,1,4,0));
+ int32 iVar10 = topQuad->points[3].y << 0x10;
+ int32 iVar11 = topQuad1->points[0].y << 0x10;
+ int32 iVar12 = bottomQuad->points[1].x << 0x10;
+ int32 iVar13 = rightQuad->points[0].x << 0x10;
+ _vm->waitForFrames(2);
+ while (0 < iVar10) {
+ iVar10 = iVar10 - uVar14;
+ iVar11 = iVar11 + uVar6;
+ iVar12 = iVar12 + uVar2 * -0x1000;
+ topQuad->points[3].y = iVar10 >> 0x10;
+ topQuad->points[2].y = iVar10 >> 0x10;
+ topQuad1->points[0].y = iVar11 >> 0x10;
+ topQuad1->points[1].y = iVar11 >> 0x10;
+ bottomQuad->points[1].x = iVar12 >> 0x10;
+ bottomQuad->points[3].x = iVar12 >> 0x10;
+ iVar13 = iVar13 + uVar3;
+ rightQuad->points[0].x = iVar13 >> 0x10;
+ rightQuad->points[2].x = iVar13 >> 0x10;
+ _vm->waitForFrames(1);
+ if (!hasDoneFade) {
+ // call_fade_related_1f();
+ hasDoneFade = true;
+ }
+ }
+ }
+ _vm->_screen->clearAllFlatQuads();
+}
+
void pizzaUpdateFunction() {
static int16 counter = 0;
DragonsEngine *vm = getEngine();
diff --git a/engines/dragons/specialopcodes.h b/engines/dragons/specialopcodes.h
index e879ae18ed..6784ce0cb1 100644
--- a/engines/dragons/specialopcodes.h
+++ b/engines/dragons/specialopcodes.h
@@ -209,6 +209,7 @@ private:
void pizzaMakerStopWorking();
void clearSceneUpdateFunction();
+ void mapTransition(uint16 mode);
};
More information about the Scummvm-git-logs
mailing list