[Scummvm-git-logs] scummvm master -> fcbee4f724b5028cd1778aff375031b56b50dc40

mgerhardy martin.gerhardy at gmail.com
Sat Feb 6 17:55:20 UTC 2021


This automated email contains information about 6 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
bc7f12d0da TWINE: clamp angles of holomap locations
c43c95a4a9 TWINE: fixed previous holomap location
7b4cbec07b TWINE: integration some disassembly findings
7c3d226778 TWINE: replaced magic number
986aa94154 TWINE: use delta time to show the credits from original game
fcbee4f724 TWINE: fla disassembly findings


Commit: bc7f12d0da63537b2b711a0c297e28966bb971c0
    https://github.com/scummvm/scummvm/commit/bc7f12d0da63537b2b711a0c297e28966bb971c0
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: clamp angles of holomap locations

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 5cbcb7cbb6..0560ecfeb2 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -61,9 +61,9 @@ bool Holomap::loadLocations() {
 	}
 
 	for (int i = 0; i < _numLocations; i++) {
-		_locations[i].x = stream.readUint16LE();
-		_locations[i].y = stream.readUint16LE();
-		_locations[i].z = stream.readUint16LE();
+		_locations[i].x = ClampAngle(stream.readSint16LE());
+		_locations[i].y = ClampAngle(stream.readSint16LE());
+		_locations[i].z = ClampAngle(stream.readSint16LE());
 		_locations[i].textIndex = stream.readUint16LE();
 	}
 	return true;
@@ -502,8 +502,8 @@ void Holomap::processHolomap() {
 
 		if (rotate) {
 			const int32 dt = _engine->lbaTime - time;
-			xRot = _engine->_collision->getAverageValue(xRot, _locations[currentLocation].x, 75, dt);
-			yRot = _engine->_collision->getAverageValue(yRot, _locations[currentLocation].y, 75, dt);
+			xRot = _engine->_collision->getAverageValue(ClampAngle(xRot), _locations[currentLocation].x, 75, dt);
+			yRot = _engine->_collision->getAverageValue(ClampAngle(yRot), _locations[currentLocation].y, 75, dt);
 			redraw = true;
 		}
 


Commit: c43c95a4a943244d3d11dd67bf853d844bd780a2
    https://github.com/scummvm/scummvm/commit/c43c95a4a943244d3d11dd67bf853d844bd780a2
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: fixed previous holomap location

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 0560ecfeb2..22ca249790 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -343,9 +343,15 @@ void Holomap::drawHolomapTrajectory(int32 trajectoryIndex) {
 }
 
 int32 Holomap::getNextHolomapLocation(int32 currentLocation, int32 dir) const {
-	const uint32 idx = currentLocation;
-	for (uint32 i = currentLocation + dir; i != idx; i = (i + dir) % NUM_LOCATIONS) {
-		if (_engine->_gameState->holomapFlags[i % NUM_LOCATIONS] & 0x81) {
+	const int32 idx = currentLocation;
+	int32 i = currentLocation + dir;
+	if (i < 0) {
+		i = NUM_LOCATIONS - 1;
+	} else {
+		i %= NUM_LOCATIONS;
+	}
+	for (; i != idx; i = (i + dir) % NUM_LOCATIONS) {
+		if (_engine->_gameState->holomapFlags[i] & 0x81) {
 			return i;
 		}
 	}


Commit: 7b4cbec07b742bb1e5254f80093b47ed73ea2696
    https://github.com/scummvm/scummvm/commit/7b4cbec07b742bb1e5254f80093b47ed73ea2696
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: integration some disassembly findings

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/renderer/redraw.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index 22ca249790..d913aed69a 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -377,24 +377,24 @@ void Holomap::renderLocations(int xRot, int yRot, int zRot, bool lower) {
 			int32 ypos2 = _engine->_renderer->destY;
 			int32 zpos2 = _engine->_renderer->destZ;
 			_engine->_renderer->setBaseRotation(xRot, yRot, zRot, true);
+			int32 zpos1_copy = zpos1;
 			_engine->_renderer->baseRotPosX = 0;
 			_engine->_renderer->baseRotPosY = 0;
 			_engine->_renderer->baseRotPosZ = 9500;
 			_engine->_renderer->getBaseRotationPosition(xpos1, ypos1, zpos1);
-			int zpos1_copy = _engine->_renderer->destZ;
+			int zpos1_copy2 = _engine->_renderer->destZ;
 			_engine->_renderer->getBaseRotationPosition(xpos2, ypos2, zpos2);
 			if (lower) {
-				if (zpos1_copy > _engine->_renderer->destY) {
+				if (zpos1_copy2 <= _engine->_renderer->destZ) {
 					continue;
 				}
 			} else {
-				if (zpos1_copy < _engine->_renderer->destY) {
+				if (_engine->_renderer->destZ <= zpos1_copy2) {
 					continue;
 				}
 			}
-
 			DrawListStruct &drawList = _engine->_redraw->drawList[n];
-			drawList.posValue = zpos1_copy;
+			drawList.posValue = zpos1_copy2;
 			drawList.actorIdx = locationIdx;
 			drawList.type = 0;
 			drawList.x = xpos1;
@@ -518,10 +518,13 @@ void Holomap::processHolomap() {
 			const Common::Rect rect(170, 0, 470, 330);
 			_engine->_interface->drawFilledRect(rect, COLOR_BLACK);
 			drawHolomapText(_engine->width() / 2, 25, "HoloMap");
-			_engine->_renderer->setBaseRotation(xRot, yRot, 0);
+			_engine->_renderer->setBaseRotation(xRot, yRot, 0, true);
 			_engine->_renderer->setLightVector(xRot, yRot, 0);
 			renderLocations(xRot, yRot, 0, false);
-			_engine->_renderer->setBaseRotation(xRot, yRot, 0);
+			_engine->_renderer->setBaseRotation(xRot, yRot, 0, true);
+			_engine->_renderer->baseRotPosX = 0;
+			_engine->_renderer->baseRotPosY = 0;
+			_engine->_renderer->baseRotPosZ = 9500;
 			renderHolomapSurfacePolygons();
 			renderLocations(xRot, yRot, 0, true);
 			if (rotate) {
diff --git a/engines/twine/renderer/redraw.h b/engines/twine/renderer/redraw.h
index cbfed13346..e5707c74ba 100644
--- a/engines/twine/renderer/redraw.h
+++ b/engines/twine/renderer/redraw.h
@@ -55,7 +55,7 @@ struct OverlayListStruct {
 };
 
 struct DrawListStruct {
-	int16 posValue = 0;
+	int16 posValue = 0; // sorting value
 	uint32 type = 0;
 	uint16 actorIdx = 0;
 	uint16 x = 0;


Commit: 7c3d2267782b3be302b703e7470469dd70e84a93
    https://github.com/scummvm/scummvm/commit/7c3d2267782b3be302b703e7470469dd70e84a93
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: replaced magic number

Changed paths:
    engines/twine/holomap.cpp


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index d913aed69a..5fc1753ad2 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -132,7 +132,7 @@ void Holomap::prepareHolomapSurface() {
 			} else {
 				_projectedSurfacePositions[projectedIndex].unk2 = (int16)(((angle + ANGLE_90) * ANGLE_90) / 2);
 			}
-			rotation = rotation + ANGLE_11_25;
+			rotation += ANGLE_11_25;
 			++projectedIndex;
 		}
 		const int32 destX = stream.readSint16LE();
@@ -487,7 +487,7 @@ void Holomap::processHolomap() {
 		}
 
 		if (_engine->_input->isActionActive(TwinEActionType::HolomapLeft)) {
-			xRot += 8;
+			xRot += ANGLE_1;
 			rotate = true;
 			time = _engine->lbaTime;
 		} else if (_engine->_input->isActionActive(TwinEActionType::HolomapRight)) {


Commit: 986aa94154e7f651ecd4ded1e8ec0a4cd97a0b42
    https://github.com/scummvm/scummvm/commit/986aa94154e7f651ecd4ded1e8ec0a4cd97a0b42
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: use delta time to show the credits from original game

also added the other actions found in the disassembly that the original game
did during the waiting loop

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/resources/resources.h


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 177f1966a1..96dddce15c 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -558,8 +558,17 @@ int32 Menu::processMenu(MenuSettings *menuSettings, bool showCredits) {
 			}
 			startMillis = loopMillis;
 		}
-		if (showCredits && loopMillis - startMillis > 15000) {
+		if (showCredits && loopMillis - startMillis > 11650) {
 			_engine->_menuOptions->showCredits();
+			// TODO the original game also performs these actions:
+			// play FLA_DRAGON3 fla
+			// display RESSHQR_INTROSCREEN1IMG
+			// display RESSHQR_INTROSCREEN2IMG
+			// display RESSHQR_INTROSCREEN3IMG
+			// play FLA_BATEAU fla
+			// if version == EUROPE_VERSION display RESSHQR_LBAIMG else display RESSHQR_RELLENTIMG
+			// display adeline logo
+			// pressing any key during these actions will abort everything and return to the menu
 			startMillis = _engine->_system->getMillis();
 			_engine->_screens->loadMenuImage(false);
 		}
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 2453e48f52..93fe88c597 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -75,6 +75,7 @@ namespace TwinE {
 #define FLA_DRAGON3 "dragon3"
 #define FLA_INTROD "introd"
 #define FLA_THEEND "the_end"
+#define FLA_BATEAU "bateau"
 
 #define FILE3DHQR_HERONORMAL 0
 #define FILE3DHQR_HEROATHLETIC 1


Commit: fcbee4f724b5028cd1778aff375031b56b50dc40
    https://github.com/scummvm/scummvm/commit/fcbee4f724b5028cd1778aff375031b56b50dc40
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-06T18:55:09+01:00

Commit Message:
TWINE: fla disassembly findings

looks like they are unused in the fla movies that i've tried so far...

Changed paths:
    engines/twine/flamovies.cpp
    engines/twine/flamovies.h


diff --git a/engines/twine/flamovies.cpp b/engines/twine/flamovies.cpp
index 3b3b50584b..4645f7b63c 100644
--- a/engines/twine/flamovies.cpp
+++ b/engines/twine/flamovies.cpp
@@ -36,12 +36,16 @@ namespace TwinE {
 
 /** FLA Frame Opcode types */
 enum FlaFrameOpcode {
-	kLoadPalette = 0,
-	kFade = 1,
-	kPlaySample = 2,
-	kStopSample = 4,
-	kDeltaFrame = 5,
-	kKeyFrame = 7
+	kLoadPalette = 1,
+	kFade = 2,
+	kPlaySample = 3,
+	kFlaUnknown4 = 4,
+	kStopSample = 5,
+	kDeltaFrame = 6,
+	kFlaUnknown7 = 7,
+	kKeyFrame = 8,
+	kFlaUnknown9 = 9,
+	kFlaUnknown16SameAs9 = 16
 };
 
 /** FLA movie sample structure */
@@ -172,12 +176,11 @@ void FlaMovies::processFrame() {
 
 	Common::MemoryReadStream stream(outBuf, frameData.frameVar0);
 	for (int32 frame = 0; frame < frameData.videoSize; ++frame) {
-		const uint8 opcode = stream.readByte();
-		stream.skip(1);
-		const uint32 opcodeBlockSize = stream.readUint16LE();
+		const uint16 opcode = stream.readUint16LE();
+		const uint16 opcodeBlockSize = stream.readUint16LE();
 		const int32 pos = stream.pos();
 
-		switch (opcode - 1) {
+		switch (opcode) {
 		case kLoadPalette: {
 			int16 numOfColor = stream.readSint16LE();
 			int16 startColor = stream.readSint16LE();
@@ -186,12 +189,25 @@ void FlaMovies::processFrame() {
 			break;
 		}
 		case kFade: {
-			// FLA movies don't use cross fade
-			// fade out tricky
-			if (_fadeOut != 1) {
-				_engine->_screens->convertPalToRGBA(_engine->_screens->palette, _engine->_screens->paletteRGBACustom);
-				_engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom);
-				_fadeOut = 1;
+			int16 innerOpcpde = stream.readSint16LE();
+			switch (innerOpcpde) {
+			case 1:
+				_engine->_music->playMidiMusic(26);
+				break;
+			case 2:
+				// FLA movies don't use cross fade
+				// fade out tricky
+				if (_fadeOut != 1) {
+					_engine->_screens->convertPalToRGBA(_engine->_screens->palette, _engine->_screens->paletteRGBACustom);
+					_engine->_screens->fadeToBlack(_engine->_screens->paletteRGBACustom);
+					_fadeOut = 1;
+				}
+				break;
+			case 3:
+				_flaPaletteVar = true;
+				break;
+			case 4:
+				_engine->_music->stopMidiMusic();
 			}
 			break;
 		}
@@ -220,6 +236,28 @@ void FlaMovies::processFrame() {
 			drawKeyFrame(stream, FLASCREEN_WIDTH, FLASCREEN_HEIGHT);
 			break;
 		}
+		case kFlaUnknown7: {
+			byte *ptr = (byte *)_engine->frontVideoBuffer.getPixels();
+			for (int y = 0; y < 200; ++y) {
+				for (int x = 0; x < 80; ++x) {
+					*ptr++ = 0;
+				}
+				ptr = ptr + 80;
+			}
+			break;
+		}
+		case kFlaUnknown9:
+		case kFlaUnknown16SameAs9: {
+			byte *ptr = (byte *)_engine->frontVideoBuffer.getPixels();
+			for (int y = 0; y < 200; ++y) {
+				for (int x = 0; x < 80; ++x) {
+					*ptr++ = stream.readByte();
+				}
+				ptr = ptr + 80;
+			}
+			break;
+		}
+		case kFlaUnknown4:
 		default: {
 			break;
 		}
@@ -348,6 +386,7 @@ void FlaMovies::playFlaMovie(const char *flaName) {
 
 		ScopedKeyMap scopedKeyMap(_engine, cutsceneKeyMapId);
 
+		_flaPaletteVar = true;
 		do {
 			FrameMarker frame;
 			ScopedFPS scopedFps(flaHeaderData.speed);
diff --git a/engines/twine/flamovies.h b/engines/twine/flamovies.h
index c3cdf56e9d..be76a8f27d 100644
--- a/engines/twine/flamovies.h
+++ b/engines/twine/flamovies.h
@@ -72,6 +72,7 @@ private:
 	int32 _fadeOut = 0;
 	/** Auxiliar FLA fade out variable to count frames between the fade */
 	int32 fadeOutFrames = 0;
+	bool _flaPaletteVar = false;
 
 	/** FLA movie file buffer */
 	uint8 flaBuffer[FLASCREEN_WIDTH * FLASCREEN_HEIGHT] {0};




More information about the Scummvm-git-logs mailing list