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

neuromancer noreply at scummvm.org
Mon Aug 10 14:06:41 UTC 2026


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

Summary:
b1a746a732 COLONY: fixed missing face in bed rendering
f5174eb33f COLONY: make sure boxes block doorways
bad60aab0a COLONY: added missing dave easter egg


Commit: b1a746a7328741c09d24dae5145aef2218849c73
    https://github.com/scummvm/scummvm/commit/b1a746a7328741c09d24dae5145aef2218849c73
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-08-10T16:06:00+02:00

Commit Message:
COLONY: fixed missing face in bed rendering

Changed paths:
    engines/colony/render_objects.cpp


diff --git a/engines/colony/render_objects.cpp b/engines/colony/render_objects.cpp
index afa5e4458e4..b98af7fcef5 100644
--- a/engines/colony/render_objects.cpp
+++ b/engines/colony/render_objects.cpp
@@ -1692,7 +1692,10 @@ bool ColonyEngine::drawStaticObjectPrisms3D(Thing &obj) {
 		const PrismPartDef *parts = (obj.type == kObjBBed) ? kBBedParts : kBedParts;
 		for (int i = 0; i < 3; i++) {
 			_gfx->setDepthRange((2 - i) * 0.002f, 1.0f);
-			draw3DPrism(obj, parts[i], false, -1, true, false);
+			// MakeBed/MakeBBed draw the headboard (part 0) with DrawPrism(...,1).
+			// It is a single flat quad, so plain back-face culling would drop it
+			// whenever the bed is approached from its non-clockwise side.
+			draw3DPrism(obj, parts[i], false, -1, true, i == 0);
 		}
 		_gfx->setDepthRange(0.0f, 1.0f);
 		break;


Commit: f5174eb33f3d751b0c053e3b7935689b30de199e
    https://github.com/scummvm/scummvm/commit/f5174eb33f3d751b0c053e3b7935689b30de199e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-08-10T16:06:00+02:00

Commit Message:
COLONY: make sure boxes block doorways

Changed paths:
    engines/colony/movement.cpp


diff --git a/engines/colony/movement.cpp b/engines/colony/movement.cpp
index f0c5f85e096..31f1149f83f 100644
--- a/engines/colony/movement.cpp
+++ b/engines/colony/movement.cpp
@@ -158,6 +158,9 @@ struct ObjectFootprint {
 	int halfY;
 };
 
+// Fills fp with the object's collision box in its own rotated space. Returning
+// false means "no footprint" — the caller then blocks the whole cell, the way
+// CHCKWALL.C did for every object.
 bool objectFootprintForType(int type, ObjectFootprint &fp) {
 	fp.centerX = 0;
 	fp.centerY = 0;
@@ -236,9 +239,14 @@ bool objectFootprintForType(int type, ObjectFootprint &fp) {
 		return true;
 	case kObjBox1:
 	case kObjBox2:
-		fp.halfX = 55;
-		fp.halfY = 55;
-		return true;
+		// No footprint on purpose: storage crates keep CHCKWALL.C's full-cell
+		// block. The level design seals doorways with them until the forklift
+		// carries them off (the first door on colony floor 1, MAP.2 (11,1)->(12,1),
+		// is blocked by the crate in (12,1) and must report text 75). Any
+		// footprint smaller than the cell lets the player squeeze past, and
+		// several crates are placed at odd angles, so even a full 128x128 box
+		// would leave a rotated corner open.
+		return false;
 	case kObjForkLift:
 		fp.halfX = 100;
 		fp.halfY = 120;


Commit: bad60aab0ad28da2469960680427803074084945
    https://github.com/scummvm/scummvm/commit/bad60aab0ad28da2469960680427803074084945
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2026-08-10T16:06:00+02:00

Commit Message:
COLONY: added missing dave easter egg

Changed paths:
    engines/colony/colony.h
    engines/colony/interaction.cpp
    engines/colony/intro.cpp
    engines/colony/render.cpp
    engines/colony/render_objects.cpp
    engines/colony/sound.cpp
    engines/colony/sound.h


diff --git a/engines/colony/colony.h b/engines/colony/colony.h
index 5991129bd6a..0aa6661f8e8 100644
--- a/engines/colony/colony.h
+++ b/engines/colony/colony.h
@@ -277,7 +277,10 @@ enum ObjColor {
 	kColorSoldierEye = 110,
 	kColorQueenBody = 111,
 	kColorQueenEye = 112,
-	kColorQueenWingRed = 113
+	kColorQueenWingRed = 113,
+	// The monolith is cBLACK in the DOS table but has its own Mac entry
+	// (c_monolith), so it cannot share the generic kColorBlack mapping.
+	kColorMonolith = 114
 };
 
 enum {
@@ -842,6 +845,7 @@ private:
 	bool loadAnimation(const Common::String &name);
 	void deleteAnimation();
 	void takeOff();
+	void fullOfStars();
 	void gameOver(bool kill);
 	int countSavedCryos() const;
 	void playAnimation();
diff --git a/engines/colony/interaction.cpp b/engines/colony/interaction.cpp
index a1ed60d3366..16752c5d8d3 100644
--- a/engines/colony/interaction.cpp
+++ b/engines/colony/interaction.cpp
@@ -186,9 +186,9 @@ void ColonyEngine::interactWithObject(int objNum) {
 			playAnimation();
 		break;
 	case kObjScreen:
-		// original game shows "Full of stars" effect/text
-		_sound->play(Sound::kStars1);
-		inform("I CAN SEE THROUGH IT...", true);
+		// COMMAND.C/IBM_COMM.C: the monolith calls FullOfStars() in all three
+		// forklift states.
+		fullOfStars();
 		break;
 
 	case kObjToilet:
diff --git a/engines/colony/intro.cpp b/engines/colony/intro.cpp
index 10ad089ce5f..e50c9161447 100644
--- a/engines/colony/intro.cpp
+++ b/engines/colony/intro.cpp
@@ -1404,6 +1404,59 @@ void ColonyEngine::takeOff() {
 	_centerY = savedCenterY;
 }
 
+// Touching the monolith (the SCREEN object) blacks the screen out and runs the
+// star gate. Mac intro.c FullOfStars() plays the digitized "Dave" clip over it;
+// DOS IBM_INTR.C reaches the same effect through Pause(), which is silent and
+// instead leaves the starfield up until the player clicks.
+void ColonyEngine::fullOfStars() {
+	Common::Rect savedScreenR = _screenR;
+	Common::Rect savedClip = _clip;
+	int savedCenterX = _centerX;
+	int savedCenterY = _centerY;
+
+	// Both releases run the effect over the whole screen (Mac rScreen, DOS sR),
+	// not over the 3D viewport.
+	_screenR = Common::Rect(0, 0, _width, _height);
+	_clip = _screenR;
+	_centerX = _width / 2;
+	_centerY = _height / 2;
+
+	debugC(1, kColonyDebugUI, "fullOfStars()");
+
+	const bool isMac = (getPlatform() == Common::kPlatformMacintosh);
+
+	// Pause(): drop queued input so the click that triggered the monolith does
+	// not immediately end the starfield.
+	Common::Event event;
+	while (_system->getEventManager()->pollEvent(event)) {} // ignore events
+
+	_gfx->clear(_gfx->black());
+	_gfx->copyToScreen();
+
+	// DoDaveSound() stops whatever is playing and starts the clip; Pause() on
+	// DOS touches no sound at all, so nothing is cut short there.
+	if (isMac)
+		_sound->play(Sound::kDave);
+
+	// Mac makestars(rScreen, 0) times itself out; DOS makestars(sR, TRUE) keeps
+	// streaking until the player clicks.
+	makeStars(_screenR, isMac ? 0 : 1);
+
+	// EraseRect(&sR) / CloseWindow(). The dashboard and the view come back on
+	// the next frame of the main loop, which is what DOS drewDashBoard=0 forces.
+	_gfx->clear(_gfx->black());
+	_gfx->copyToScreen();
+
+	// No stop() here: KillTSound() waits for the clip to finish before freeing
+	// it, so the tail of "Dave" plays on over the restored view. The mixer does
+	// that for us without blocking.
+
+	_screenR = savedScreenR;
+	_clip = savedClip;
+	_centerX = savedCenterX;
+	_centerY = savedCenterY;
+}
+
 void ColonyEngine::gameOver(bool kill) {
 	Common::Rect savedScreenR = _screenR;
 	Common::Rect savedClip = _clip;
diff --git a/engines/colony/render.cpp b/engines/colony/render.cpp
index 32cf7e59df8..6f23dda727b 100644
--- a/engines/colony/render.cpp
+++ b/engines/colony/render.cpp
@@ -161,6 +161,7 @@ const DOSColorEntry &lookupDOSColor(int colorIdx, int level) {
 	case kColorHCore3: return kHCore3;
 	case kColorHCore4: return kHCore4;
 	case kColorCCore:  return kCCoreEntry;
+	case kColorMonolith: return g_dosColors[kColorBlack]; // SCREEN.C: cBLACK on DOS
 	case kColorEyeball: return g_dosColors[kColorEye];
 	case kColorEyeIris:
 	case kColorMiniEyeIris:
@@ -205,6 +206,7 @@ int mapObjColorToMacColor(int colorIdx, int level) {
 	case kColorConsole:   return 79;  // c_console
 	case kColorTV:        return 76;  // c_tv
 	case kColorTVScreen:  return 77;  // c_tvscreen
+	case kColorMonolith:  return 78;  // c_monolith (solid black, fg and bg)
 	case kColorDrawer:    return 96;  // c_vanity
 	case kColorDesk:      return 58;  // c_desk
 	case kColorDeskTop:   return 59;  // c_desktop
diff --git a/engines/colony/render_objects.cpp b/engines/colony/render_objects.cpp
index b98af7fcef5..1900f9092d4 100644
--- a/engines/colony/render_objects.cpp
+++ b/engines/colony/render_objects.cpp
@@ -226,9 +226,10 @@ const int kScreenPts[8][3] = {
 	{-16, 64, 0}, {16, 64, 0}, {16, -64, 0}, {-16, -64, 0},
 	{-16, 64, 288}, {16, 64, 288}, {16, -64, 288}, {-16, -64, 288}
 };
+// SCREEN.H: the monolith, 32x128x288 = 1:4:9, four sides in c_monolith and no caps.
 const int kScreenSurf[4][8] = {
-	{kColorBlack, 4, 0, 3, 7, 4, 0, 0}, {kColorBlack, 4, 3, 2, 6, 7, 0, 0},
-	{kColorBlack, 4, 1, 0, 4, 5, 0, 0}, {kColorBlack, 4, 2, 1, 5, 6, 0, 0}
+	{kColorMonolith, 4, 0, 3, 7, 4, 0, 0}, {kColorMonolith, 4, 3, 2, 6, 7, 0, 0},
+	{kColorMonolith, 4, 1, 0, 4, 5, 0, 0}, {kColorMonolith, 4, 2, 1, 5, 6, 0, 0}
 };
 const int kTableTopPts[4][3] = {
 	{-128, 128, 100}, {128, 128, 100}, {128, -128, 100}, {-128, -128, 100}
diff --git a/engines/colony/sound.cpp b/engines/colony/sound.cpp
index d72708bbe05..1c79e25bdb2 100644
--- a/engines/colony/sound.cpp
+++ b/engines/colony/sound.cpp
@@ -372,6 +372,7 @@ bool Sound::playMacSound(int soundID, bool loop) {
 	case kBath: resID = 11589; break;
 	case kMars: resID = 23390; break;
 	case kBeamMe: resID = 5342; break;
+	case kDave: resID = 13651; break;   // DAVE (the monolith's "full of stars" clip)
 	default: break;
 	}
 
diff --git a/engines/colony/sound.h b/engines/colony/sound.h
index 78c8fb936ef..e09be141b08 100644
--- a/engines/colony/sound.h
+++ b/engines/colony/sound.h
@@ -79,7 +79,8 @@ public:
 		kToilet,
 		kBath,
 		kMars,
-		kBeamMe
+		kBeamMe,
+		kDave
 	};
 
 private:




More information about the Scummvm-git-logs mailing list