[Scummvm-git-logs] scummvm master -> 362f134af43b52c41534f4d07bd85d55a7502879
neuromancer
noreply at scummvm.org
Wed Dec 21 21:04:30 UTC 2022
This automated email contains information about 7 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
adbaa03aec FREESCAPE: improved support for Driller demo (DOS)
ac263aadf9 FREESCAPE: improved CGA support for Driller release and demo (DOS)
afc8253463 FREESCAPE: increased near clip plane to reduce flickering
943ab0d77c FREESCAPE: avoid crashing when flashing the screen in CGA
85dec32b71 FREESCAPE: refactored code that replaces black by transparent pixels in borders
f81e71a42e FREESCAPE: added driller title screen and regenerated freescape.dat file
362f134af4 FREESCAPE: better handling for title and border drawing when a game starts
Commit: adbaa03aecb141ac0203a298b762626a49fb55c8
https://github.com/scummvm/scummvm/commit/adbaa03aecb141ac0203a298b762626a49fb55c8
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: improved support for Driller demo (DOS)
Changed paths:
engines/freescape/games/driller.cpp
engines/freescape/language/instruction.cpp
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 1eb8aa9ea75..95b00dccaa7 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -40,6 +40,9 @@ static const struct CGAPalettteEntry {
} rawCGAPaletteTable[] {
{1, kDrillerCGAPaletteRedGreen},
{2, kDrillerCGAPalettePinkBlue},
+ {3, kDrillerCGAPaletteRedGreen},
+ {8, kDrillerCGAPalettePinkBlue},
+ {14, kDrillerCGAPalettePinkBlue},
{0, 0} // This marks the end
};
@@ -108,7 +111,11 @@ void DrillerEngine::gotoArea(uint16 areaID, int entranceID) {
if (!_gameStateBits.contains(areaID))
_gameStateBits[areaID] = 0;
- assert(_areaMap.contains(areaID));
+ if (!_areaMap.contains(areaID)) {
+ assert(isDOS() && isDemo());
+ // Not included in the demo, abort area change
+ return;
+ }
_currentArea = _areaMap[areaID];
_currentArea->show();
@@ -302,6 +309,10 @@ void DrillerEngine::loadAssetsDemo() {
loadMessagesFixedSize(&file, 0x636, 14, 20);
load8bitBinary(&file, 0x55b0, 4);
+ // Fixed for a corrupted area names in the demo data
+ _areaMap[2]->_name = "LAPIS LAZULI";
+ _areaMap[3]->_name = "EMERALD";
+ _areaMap[8]->_name = "TOPAZ";
file.close();
} else
error("Unsupported demo for Driller");
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 11cae2147a1..2e3f2768efe 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -258,10 +258,14 @@ bool FreescapeEngine::executeEndIfVisibilityIsEqual(FCLInstruction &instruction)
assert(obj);
debugC(1, kFreescapeDebugCode, "End condition if visibility of obj with id %d is %d!", source, value);
} else {
- assert(_areaMap.contains(source));
- obj = _areaMap[source]->objectWithID(additional);
- assert(obj);
debugC(1, kFreescapeDebugCode, "End condition if visibility of obj with id %d in area %d is %d!", additional, source, value);
+ if (_areaMap.contains(source)) {
+ obj = _areaMap[source]->objectWithID(additional);
+ assert(obj);
+ } else {
+ assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+ return (value == false);
+ }
}
return (obj->isInvisible() == value);
@@ -349,9 +353,14 @@ void FreescapeEngine::executeMakeInvisible(FCLInstruction &instruction) {
}
debugC(1, kFreescapeDebugCode, "Making obj %d invisible in area %d!", objectID, areaID);
- Object *obj = _areaMap[areaID]->objectWithID(objectID);
- assert(obj); // We assume the object was there
- obj->makeInvisible();
+ if (_areaMap.contains(areaID)) {
+ Object *obj = _areaMap[areaID]->objectWithID(objectID);
+ assert(obj); // We assume the object was there
+ obj->makeInvisible();
+ } else {
+ assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+ }
+
}
void FreescapeEngine::executeMakeVisible(FCLInstruction &instruction) {
@@ -366,9 +375,13 @@ void FreescapeEngine::executeMakeVisible(FCLInstruction &instruction) {
}
debugC(1, kFreescapeDebugCode, "Making obj %d visible in area %d!", objectID, areaID);
- Object *obj = _areaMap[areaID]->objectWithID(objectID);
- assert(obj); // We assume an object should be there
- obj->makeVisible();
+ if (_areaMap.contains(areaID)) {
+ Object *obj = _areaMap[areaID]->objectWithID(objectID);
+ assert(obj); // We assume an object should be there
+ obj->makeVisible();
+ } else {
+ assert(isDOS() && isDemo()); // Should only happen in the DOS demo
+ }
}
void FreescapeEngine::executeToggleVisibility(FCLInstruction &instruction) {
Commit: ac263aadf987e172ee29e9c5506a983301edcd5a
https://github.com/scummvm/scummvm/commit/ac263aadf987e172ee29e9c5506a983301edcd5a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: improved CGA support for Driller release and demo (DOS)
Changed paths:
engines/freescape/games/driller.cpp
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 95b00dccaa7..ccbd9f3a515 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -186,6 +186,10 @@ void DrillerEngine::loadGlobalObjects(Common::SeekableReadStream *file, int offs
ObjectMap *globalObjectsByID = new ObjectMap;
file->seek(offset);
for (int i = 0; i < 8; i++) {
+ if (isDOS() && isDemo()) // The DOS demo has a few missing objects
+ if (i == 5)
+ break;
+
Object *gobj = load8bitObject(file);
assert(gobj);
assert(!globalObjectsByID->contains(gobj->getObjectID()));
@@ -308,6 +312,7 @@ void DrillerEngine::loadAssetsDemo() {
loadFonts(&file, 0x4eb0);
loadMessagesFixedSize(&file, 0x636, 14, 20);
load8bitBinary(&file, 0x55b0, 4);
+ loadGlobalObjects(&file, 0x8c);
// Fixed for a corrupted area names in the demo data
_areaMap[2]->_name = "LAPIS LAZULI";
@@ -424,6 +429,7 @@ void DrillerEngine::loadAssetsFullGame() {
loadFonts(&file, 0x07a4a);
loadMessagesFixedSize(&file, 0x2585, 14, 20);
load8bitBinary(&file, 0x7bb0, 4);
+ loadGlobalObjects(&file, 0x1fa2);
} else
error("Invalid or unsupported render mode %s for Driller", Common::getRenderModeDescription(_renderMode));
@@ -693,6 +699,8 @@ Math::Vector3d getProjectionToPlane(const Math::Vector3d &vect, const Math::Vect
void DrillerEngine::pressedKey(const int keycode) {
if (keycode == Common::KEYCODE_d) {
+ if (isDOS() && isDemo()) // No support for drilling here yet
+ return;
clearTemporalMessages();
Common::Point gasPocket = _currentArea->_gasPocketPosition;
uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
@@ -750,6 +758,8 @@ void DrillerEngine::pressedKey(const int keycode) {
} else
_drilledAreas[_currentArea->getAreaID()] = kDrillerRigOutOfPlace;
} else if (keycode == Common::KEYCODE_c) {
+ if (isDOS() && isDemo()) // No support for drilling here yet
+ return;
uint32 gasPocketRadius = _currentArea->_gasPocketRadius;
clearTemporalMessages();
if (gasPocketRadius == 0) {
Commit: afc8253463fb10f6f6e51d6bec1d335092c03eb6
https://github.com/scummvm/scummvm/commit/afc8253463fb10f6f6e51d6bec1d335092c03eb6
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: increased near clip plane to reduce flickering
Changed paths:
engines/freescape/freescape.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 6e8431a00a2..e212188197c 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -110,7 +110,7 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
_lastMousePos = Common::Point(0, 0);
_lastFrame = 0;
- _nearClipPlane = 1;
+ _nearClipPlane = 2;
_farClipPlane = 8192 + 1802; // Added some extra distance to avoid flickering
// These depends on the specific game
Commit: 943ab0d77c94587ba06973a1af2e3101f2e10170
https://github.com/scummvm/scummvm/commit/943ab0d77c94587ba06973a1af2e3101f2e10170
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: avoid crashing when flashing the screen in CGA
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/gfx.cpp
engines/freescape/language/instruction.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index e212188197c..08f252a1f1c 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -290,7 +290,7 @@ void FreescapeEngine::drawFrame() {
_gfx->positionCamera(_position, _position + _cameraFront);
if (_underFireFrames > 0) {
- int underFireColor = isDriller() && (_renderMode == Common::kRenderEGA) ? 1
+ int underFireColor = isDriller() && isDOS() ? 1
: _currentArea->_underFireBackgroundColor;
if (underFireColor < 16) {
_currentArea->remapColor(_currentArea->_usualBackgroundColor, underFireColor);
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index a64b0e885b1..281fbb410b7 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -115,11 +115,14 @@ bool Renderer::getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
bool Renderer::getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
- /*if (_colorRemaps && _colorRemaps->contains(index)) {
+ if (_colorRemaps && _colorRemaps->contains(index)) {
index = (*_colorRemaps)[index];
- readFromPalette(index, r, g, b);
+ readFromPalette(index, r1, g1, b1);
+ r2 = r1;
+ g2 = g1;
+ b2 = b1;
return true;
- }*/
+ }
if (index == _keyColor)
return false;
diff --git a/engines/freescape/language/instruction.cpp b/engines/freescape/language/instruction.cpp
index 2e3f2768efe..1f6146477bb 100644
--- a/engines/freescape/language/instruction.cpp
+++ b/engines/freescape/language/instruction.cpp
@@ -237,7 +237,7 @@ void FreescapeEngine::executeSPFX(FCLInstruction &instruction) {
} else if (isDOS()) {
debugC(1, kFreescapeDebugCode, "Switching palette from position %d to %d", src, dst);
if (src == 0 && dst == 1)
- _currentArea->remapColor(_currentArea->_usualBackgroundColor, _currentArea->_underFireBackgroundColor);
+ _currentArea->remapColor(_currentArea->_usualBackgroundColor, _renderMode == Common::kRenderCGA ? 1 : _currentArea->_underFireBackgroundColor);
else if (src == 0 && dst == 0)
_currentArea->unremapColor(_currentArea->_usualBackgroundColor);
else
@@ -300,7 +300,7 @@ void FreescapeEngine::executeIncrementVariable(FCLInstruction &instruction) {
_gameStateVars[variable] = 0;
if (increment < 0)
- flashScreen(_currentArea->_underFireBackgroundColor);
+ flashScreen(_renderMode == Common::kRenderCGA ? 1 :_currentArea->_underFireBackgroundColor);
debugC(1, kFreescapeDebugCode, "Shield incremented by %d up to %d", increment, _gameStateVars[variable]);
break;
Commit: 85dec32b711a1ec4a0a657da4cd68012433b0143
https://github.com/scummvm/scummvm/commit/85dec32b711a1ec4a0a657da4cd68012433b0143
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: refactored code that replaces black by transparent pixels in borders
Changed paths:
engines/freescape/freescape.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 08f252a1f1c..2c46514606f 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -168,19 +168,7 @@ void FreescapeEngine::drawBorder() {
_gfx->setViewport(_fullscreenViewArea);
- if (!_borderTexture) {
- // Replace black pixel for transparent ones
- uint32 black = _border->format.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
- uint32 transparent = _border->format.ARGBToColor(0x00, 0x00, 0x00, 0x00);
-
- for (int i = 0; i < _border->w; i++) {
- for (int j = 0; j < _border->h; j++) {
- if (_border->getPixel(i, j) == black)
- _border->setPixel(i, j, transparent);
- }
- }
- _borderTexture = _gfx->createTexture(_border);
- }
+ assert(_borderTexture);
_gfx->drawTexturedRect2D(_fullscreenViewArea, _fullscreenViewArea, _borderTexture);
_gfx->setViewport(_viewArea);
}
@@ -556,6 +544,18 @@ void FreescapeEngine::prepareBorder() {
_borderTexture = nullptr;
uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
_border->fillRect(_viewArea, gray);
+
+ // Replace black pixel for transparent ones
+ uint32 black = _border->format.ARGBToColor(0xFF, 0x00, 0x00, 0x00);
+ uint32 transparent = _border->format.ARGBToColor(0x00, 0x00, 0x00, 0x00);
+
+ for (int i = 0; i < _border->w; i++) {
+ for (int j = 0; j < _border->h; j++) {
+ if (_border->getPixel(i, j) == black)
+ _border->setPixel(i, j, transparent);
+ }
+ }
+ _borderTexture = _gfx->createTexture(_border);
}
}
Commit: f81e71a42e0be719105775a2ed3d316d103fa4a2
https://github.com/scummvm/scummvm/commit/f81e71a42e0be719105775a2ed3d316d103fa4a2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: added driller title screen and regenerated freescape.dat file
Changed paths:
A devtools/create_freescape/driller_cga_title.bmp
A devtools/create_freescape/driller_ega_title.bmp
dists/engine-data/freescape.dat
diff --git a/devtools/create_freescape/driller_cga_title.bmp b/devtools/create_freescape/driller_cga_title.bmp
new file mode 100644
index 00000000000..2741613f4a5
Binary files /dev/null and b/devtools/create_freescape/driller_cga_title.bmp differ
diff --git a/devtools/create_freescape/driller_ega_title.bmp b/devtools/create_freescape/driller_ega_title.bmp
new file mode 100644
index 00000000000..b0ad1adc1f8
Binary files /dev/null and b/devtools/create_freescape/driller_ega_title.bmp differ
diff --git a/dists/engine-data/freescape.dat b/dists/engine-data/freescape.dat
index 87eff18683e..f9e2892d9cb 100644
Binary files a/dists/engine-data/freescape.dat and b/dists/engine-data/freescape.dat differ
Commit: 362f134af43b52c41534f4d07bd85d55a7502879
https://github.com/scummvm/scummvm/commit/362f134af43b52c41534f4d07bd85d55a7502879
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-12-21T18:03:27-03:00
Commit Message:
FREESCAPE: better handling for title and border drawing when a game starts
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/freescape.h
engines/freescape/games/driller.cpp
engines/freescape/loaders/8bitBinaryLoader.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 2c46514606f..b98ec4b5e59 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -500,7 +500,17 @@ Common::Error FreescapeEngine::run() {
}
}
- prepareBorder();
+ loadBorder(); // Border is load unmodified
+ if (_border && isDOS()) {
+ if (saveSlot == -1) {
+ drawBorder();
+ _gfx->flipBuffer();
+ g_system->updateScreen();
+ g_system->delayMillis(3000);
+ }
+ }
+ processBorder(); // Border is processed to use during the game
+
if (saveSlot >= 0) { // load the savegame
loadGameState(saveSlot);
} else
@@ -539,9 +549,14 @@ Common::Error FreescapeEngine::run() {
return Common::kNoError;
}
-void FreescapeEngine::prepareBorder() {
+void FreescapeEngine::loadBorder() {
+ _borderTexture = _gfx->createTexture(_border);
+}
+
+void FreescapeEngine::processBorder() {
if (_border) {
- _borderTexture = nullptr;
+ if (_borderTexture)
+ delete _borderTexture;
uint32 gray = _gfx->_texturePixelFormat.ARGBToColor(0x00, 0xA0, 0xA0, 0xA0);
_border->fillRect(_viewArea, gray);
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 0e94bc02952..c2876c7168f 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -104,7 +104,8 @@ public:
Common::Rect _fullscreenViewArea;
void centerCrossair();
- virtual void prepareBorder();
+ virtual void loadBorder();
+ virtual void processBorder();
void drawBorder();
void drawTitle();
void drawBackground();
@@ -359,7 +360,7 @@ public:
void gotoArea(uint16 areaID, int entranceID) override;
- void prepareBorder() override;
+ void processBorder() override;
void loadAssets() override;
void drawUI() override;
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index ccbd9f3a515..58154af2180 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -407,7 +407,6 @@ void DrillerEngine::loadAssetsFullGame() {
loadSoundsFx(&file, 0x30da6, 25);
} else if (_renderMode == Common::kRenderEGA) {
loadBundledImages();
- _title = _border;
file.open("DRILLE.EXE");
if (!file.isOpen())
@@ -420,7 +419,6 @@ void DrillerEngine::loadAssetsFullGame() {
} else if (_renderMode == Common::kRenderCGA) {
loadBundledImages();
- _title = _border;
file.open("DRILLC.EXE");
if (!file.isOpen())
@@ -457,8 +455,8 @@ void DrillerEngine::loadAssetsFullGame() {
_areaMap[18]->_conditionSources.push_back(conditionSource);
}
-void DrillerEngine::prepareBorder() {
- FreescapeEngine::prepareBorder();
+void DrillerEngine::processBorder() {
+ FreescapeEngine::processBorder();
if (isDOS() && _renderMode == Common::kRenderCGA) { // Replace some colors for the CGA borders
uint32 color1 = _border->format.ARGBToColor(0xFF, 0xAA, 0x00, 0xAA);
uint32 color2 = _border->format.ARGBToColor(0xFF, 0xAA, 0x55, 0x00);
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index b32e6000e70..029b03a9dff 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -585,6 +585,15 @@ void FreescapeEngine::loadBundledImages() {
decoder.destroy();
} else
error("Missing border file '%s' in data bundle", borderFilename.c_str());
+
+ Common::String titleFilename = targetName + "_" + Common::getRenderModeDescription(_renderMode) + "_title.bmp";
+ if (_dataBundle->hasFile(titleFilename)) {
+ Common::SeekableReadStream *titleFile = _dataBundle->createReadStreamForMember(titleFilename);
+ decoder.loadStream(*titleFile);
+ _title = new Graphics::Surface();
+ _title->copyFrom(*decoder.getSurface());
+ decoder.destroy();
+ }
}
void FreescapeEngine::loadFonts(Common::SeekableReadStream *file, int offset) {
More information about the Scummvm-git-logs
mailing list