[Scummvm-cvs-logs] scummvm master -> 41725ab7434d9b4dd65074c5e59011dfe277c65a

bluegr bluegr at gmail.com
Fri Jan 11 01:26:48 CET 2013


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

Summary:
13ec242a2c SCI: Disable modification of object NS rects in SCI32
f2464dc474 SCI: Add subop 9 of kPalVary (used in SCI32, e.g. QFG4 when exiting the caves)
182f342a01 SCI: Add 2 workarounds for script bugs in QFG4
566eb5d247 SCI: Add some info on kPalVary(9)/kPalVaryUnknown2
b852090a74 SCI: Add another workaround for a script bug in QFG4
cf3890b79a SCI: Remove obsolete comment and code
81d614e63a SCI: More proper handling of scaling and global scaling in SCI32
41725ab743 SCI: Fix the night time palette in QFG4


Commit: 13ec242a2c5f832e2cfcce47ff1d0085002b2bb6
    https://github.com/scummvm/scummvm/commit/13ec242a2c5f832e2cfcce47ff1d0085002b2bb6
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:17-08:00

Commit Message:
SCI: Disable modification of object NS rects in SCI32

This fixes the sliders in QFG4 without introducing any regressions,
as the objects are still drawn on screen using the per-frame adjusted
coordinates

Changed paths:
    engines/sci/graphics/frameout.cpp



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 8b7fa2c..d33bf4c 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -726,7 +726,12 @@ void GfxFrameout::kernelFrameout() {
 							continue;
 					}
 
-					g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect);
+					// FIXME: We should not update the object's NS rect here.
+					// This breaks the sliders in the control panel screen in
+					// QFG4, but disabling it does not change any functionality,
+					// as the object(s) will be drawn on screen with the
+					// calculated coordinates.
+					//g_sci->_gfxCompare->setNSRect(itemEntry->object, nsRect);
 				}
 
 				// Don't attempt to draw sprites that are outside the visible


Commit: f2464dc474605ba4217a49fe0a5b80084592adfd
    https://github.com/scummvm/scummvm/commit/f2464dc474605ba4217a49fe0a5b80084592adfd
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:17-08:00

Commit Message:
SCI: Add subop 9 of kPalVary (used in SCI32, e.g. QFG4 when exiting the caves)

Changed paths:
    engines/sci/engine/kernel.h
    engines/sci/engine/kgraphics.cpp
    engines/sci/engine/kgraphics32.cpp



diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index f985a69..e3ebce8 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -427,18 +427,23 @@ reg_t kUpdatePlane(EngineState *s, int argc, reg_t *argv);
 reg_t kSetShowStyle(EngineState *s, int argc, reg_t *argv);
 reg_t kGetHighPlanePri(EngineState *s, int argc, reg_t *argv);
 reg_t kFrameOut(EngineState *s, int argc, reg_t *argv);
+
 reg_t kIsOnMe(EngineState *s, int argc, reg_t *argv); // kOnMe for SCI2, kIsOnMe for SCI2.1
+reg_t kInPolygon(EngineState *s, int argc, reg_t *argv);
+reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv);
+
 reg_t kListIndexOf(EngineState *s, int argc, reg_t *argv);
 reg_t kListEachElementDo(EngineState *s, int argc, reg_t *argv);
 reg_t kListFirstTrue(EngineState *s, int argc, reg_t *argv);
 reg_t kListAllTrue(EngineState *s, int argc, reg_t *argv);
-reg_t kInPolygon(EngineState *s, int argc, reg_t *argv);
-reg_t kObjectIntersect(EngineState *s, int argc, reg_t *argv);
+
 reg_t kEditText(EngineState *s, int argc, reg_t *argv);
 reg_t kMakeSaveCatName(EngineState *s, int argc, reg_t *argv);
 reg_t kMakeSaveFileName(EngineState *s, int argc, reg_t *argv);
 reg_t kSetScroll(EngineState *s, int argc, reg_t *argv);
 reg_t kPalCycle(EngineState *s, int argc, reg_t *argv);
+reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv);
+reg_t kPalVaryUnknown2(EngineState *s, int argc, reg_t *argv);
 
 // SCI2.1 Kernel Functions
 reg_t kText(EngineState *s, int argc, reg_t *argv);
@@ -513,7 +518,6 @@ reg_t kPalVaryDeinit(EngineState *s, int argc, reg_t *argv);
 reg_t kPalVaryChangeTarget(EngineState *s, int argc, reg_t *argv);
 reg_t kPalVaryChangeTicks(EngineState *s, int argc, reg_t *argv);
 reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv);
-reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv);
 
 reg_t kPaletteSetFromResource(EngineState *s, int argc, reg_t *argv);
 reg_t kPaletteSetFlag(EngineState *s, int argc, reg_t *argv);
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index da37731..a65bcc2 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -722,11 +722,6 @@ reg_t kPalVaryPauseResume(EngineState *s, int argc, reg_t *argv) {
 	return NULL_REG;
 }
 
-reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) {
-	// Unknown (seems to be SCI32 exclusive)
-	return NULL_REG;
-}
-
 reg_t kAssertPalette(EngineState *s, int argc, reg_t *argv) {
 	GuiResourceId paletteId = argv[0].toUint16();
 
diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 1d30f70..7f831fe 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -683,6 +683,16 @@ reg_t kSetScroll(EngineState *s, int argc, reg_t *argv) {
 	return kStub(s, argc, argv);
 }
 
+reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) {
+	// TODO: Unknown (seems to be SCI32 exclusive)
+	return kStub(s, argc, argv);
+}
+
+reg_t kPalVaryUnknown2(EngineState *s, int argc, reg_t *argv) {
+	// TODO: Unknown (seems to be SCI32 exclusive)
+	return kStub(s, argc, argv);
+}
+
 reg_t kPalCycle(EngineState *s, int argc, reg_t *argv) {
 	// Examples: GK1 room 480 (Bayou ritual), LSL6 room 100 (title screen)
 


Commit: 182f342a01e607d001dad9f6ab1484d0d37233ac
    https://github.com/scummvm/scummvm/commit/182f342a01e607d001dad9f6ab1484d0d37233ac
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:17-08:00

Commit Message:
SCI: Add 2 workarounds for script bugs in QFG4

Changed paths:
    engines/sci/engine/kernel_tables.h
    engines/sci/engine/workarounds.cpp



diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h
index d0c9b9b..d785818 100644
--- a/engines/sci/engine/kernel_tables.h
+++ b/engines/sci/engine/kernel_tables.h
@@ -156,7 +156,7 @@ static const SciKernelMapSubEntry kDoSound_subops[] = {
 	//        signature for SCI21 should be "o"
 	{ SIG_SOUNDSCI21,      9, MAP_CALL(DoSoundStop),               NULL,                   NULL },
 	{ SIG_SOUNDSCI21,     10, MAP_CALL(DoSoundPause),              NULL,                   NULL },
-	{ SIG_SOUNDSCI21,     11, MAP_CALL(DoSoundFade),               NULL,                   NULL },
+	{ SIG_SOUNDSCI21,     11, MAP_CALL(DoSoundFade),               NULL,                   kDoSoundFade_workarounds },
 	{ SIG_SOUNDSCI21,     12, MAP_CALL(DoSoundSetHold),            NULL,                   NULL },
 	{ SIG_SOUNDSCI21,     13, MAP_CALL(DoSoundDummy),              NULL,                   NULL },
 	{ SIG_SOUNDSCI21,     14, MAP_CALL(DoSoundSetVolume),          NULL,                   NULL },
@@ -202,7 +202,10 @@ static const SciKernelMapSubEntry kPalVary_subops[] = {
 	{ SIG_SCIALL,          4, MAP_CALL(PalVaryChangeTarget),       "i",                    NULL },
 	{ SIG_SCIALL,          5, MAP_CALL(PalVaryChangeTicks),        "i",                    NULL },
 	{ SIG_SCIALL,          6, MAP_CALL(PalVaryPauseResume),        "i",                    NULL },
+#ifdef ENABLE_SCI32
 	{ SIG_SCI32,           8, MAP_CALL(PalVaryUnknown),            "i",                    NULL },
+	{ SIG_SCI32,           9, MAP_CALL(PalVaryUnknown2),           "i",                    NULL },
+#endif
 	SCI_SUBOPENTRY_TERMINATOR
 };
 
diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index db510c2..212a1cb 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -151,6 +151,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
 	{ GID_QFG4,           -1,    15, -1,     "charInitScreen", "dispatchEvent",  -1,    5, { WORKAROUND_FAKE,   0 } }, // floppy version, when viewing the character screen
 	{ GID_QFG4,           -1, 64917, -1,       "controlPlane", "setBitmap",      -1,    3, { WORKAROUND_FAKE,   0 } }, // floppy version, when entering the game menu
 	{ GID_QFG4,           -1, 64917, -1,              "Plane", "setBitmap",      -1,    3, { WORKAROUND_FAKE,   0 } }, // floppy version, happens sometimes in fight scenes
+	{ GID_QFG4,          800, 64950,  0,               "View", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // CD version, in the room with the spider pillar, when climbing on the pillar
 	{ GID_RAMA,           12, 64950, -1,   "InterfaceFeature", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // Demo, right when it starts
 	{ GID_RAMA,           12, 64950, -1,      "hiliteOptText", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // Demo, right when it starts
 	{ GID_RAMA,           12, 64950, -1,               "View", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // Demo, right when it starts
@@ -246,6 +247,7 @@ const SciWorkaroundEntry kDoSoundFade_workarounds[] = {
 	{ GID_KQ5,           213,   989,  0,       "globalSound3", "fade",           -1,    0, { WORKAROUND_STILLCALL, 0 } }, // english floppy: when bandits leave the secret temple, parameter 4 is an object - bug #3037594
 	{ GID_KQ6,           105,   989,  0,        "globalSound", "fade",           -1,    0, { WORKAROUND_STILLCALL, 0 } }, // floppy: during intro, parameter 4 is an object
 	{ GID_KQ6,           460,   989,  0,       "globalSound2", "fade",           -1,    0, { WORKAROUND_STILLCALL, 0 } }, // after pulling the black widow's web on the isle of wonder, parameter 4 is an object - bug #3034567
+	{ GID_QFG4,           -1, 64989,  0,           "longSong", "fade",           -1,    0, { WORKAROUND_STILLCALL, 0 } }, // CD version: many places, parameter 4 is an object (longSong)
 	SCI_WORKAROUNDENTRY_TERMINATOR
 };
 


Commit: 566eb5d24759eb38f94de0d5ab754689c53526bb
    https://github.com/scummvm/scummvm/commit/566eb5d24759eb38f94de0d5ab754689c53526bb
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:17-08:00

Commit Message:
SCI: Add some info on kPalVary(9)/kPalVaryUnknown2

Changed paths:
    engines/sci/engine/kgraphics32.cpp



diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp
index 7f831fe..cd735d1 100644
--- a/engines/sci/engine/kgraphics32.cpp
+++ b/engines/sci/engine/kgraphics32.cpp
@@ -690,6 +690,12 @@ reg_t kPalVaryUnknown(EngineState *s, int argc, reg_t *argv) {
 
 reg_t kPalVaryUnknown2(EngineState *s, int argc, reg_t *argv) {
 	// TODO: Unknown (seems to be SCI32 exclusive)
+	// It seems to be related to the day/night palette effects in QFG4, and
+	// accepts a palette resource ID. It is triggered right when the night
+	// effect is initially applied (when exiting the caves).
+	// In QFG4, there are two scene palettes: 790 for night, and 791 for day.
+	// Initially, the game starts at night time, but this is called with the
+	// ID of the day time palette (i.e. 791).
 	return kStub(s, argc, argv);
 }
 


Commit: b852090a74ff646ed099de31acdd73a07acc0276
    https://github.com/scummvm/scummvm/commit/b852090a74ff646ed099de31acdd73a07acc0276
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:18-08:00

Commit Message:
SCI: Add another workaround for a script bug in QFG4

Changed paths:
    engines/sci/engine/workarounds.cpp



diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp
index 212a1cb..f5abd5a 100644
--- a/engines/sci/engine/workarounds.cpp
+++ b/engines/sci/engine/workarounds.cpp
@@ -151,6 +151,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = {
 	{ GID_QFG4,           -1,    15, -1,     "charInitScreen", "dispatchEvent",  -1,    5, { WORKAROUND_FAKE,   0 } }, // floppy version, when viewing the character screen
 	{ GID_QFG4,           -1, 64917, -1,       "controlPlane", "setBitmap",      -1,    3, { WORKAROUND_FAKE,   0 } }, // floppy version, when entering the game menu
 	{ GID_QFG4,           -1, 64917, -1,              "Plane", "setBitmap",      -1,    3, { WORKAROUND_FAKE,   0 } }, // floppy version, happens sometimes in fight scenes
+	{ GID_QFG4,          520, 64950,  0,             "fLake2", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // CD version, at the lake, when meeting the Rusalka and attempting to leave
 	{ GID_QFG4,          800, 64950,  0,               "View", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // CD version, in the room with the spider pillar, when climbing on the pillar
 	{ GID_RAMA,           12, 64950, -1,   "InterfaceFeature", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // Demo, right when it starts
 	{ GID_RAMA,           12, 64950, -1,      "hiliteOptText", "handleEvent",    -1,    0, { WORKAROUND_FAKE,   0 } }, // Demo, right when it starts


Commit: cf3890b79ab62855f5edd92d8faea7395b364ff5
    https://github.com/scummvm/scummvm/commit/cf3890b79ab62855f5edd92d8faea7395b364ff5
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:18-08:00

Commit Message:
SCI: Remove obsolete comment and code

Changed paths:
    engines/sci/graphics/palette.cpp



diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index 52d4464..9b6eff6 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -722,11 +722,6 @@ void GfxPalette::kernelRestore(reg_t memoryHandle) {
 }
 
 void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) {
-	// Sometimes invalid viewIds are asked for, ignore those (e.g. qfg1vga)
-	//if (!_resMan->testResource(ResourceId(kResourceTypeView, resourceId)))
-	//	return;
-	// maybe we took the wrong parameter before, if this causes invalid view again, enable to commented out code again
-
 	GfxView *view = g_sci->_gfxCache->getView(resourceId);
 	Palette *viewPalette = view->getPalette();
 	if (viewPalette) {


Commit: 81d614e63ade8fdd1a04368e62a2fc460076b1d1
    https://github.com/scummvm/scummvm/commit/81d614e63ade8fdd1a04368e62a2fc460076b1d1
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:18-08:00

Commit Message:
SCI: More proper handling of scaling and global scaling in SCI32

This fixes several scaling related problems in QFG4 and SQ6

Changed paths:
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index d33bf4c..dca6441 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -349,6 +349,36 @@ void GfxFrameout::deletePlaneLine(reg_t object, reg_t hunkId) {
 	}
 }
 
+// Adapted from GfxAnimate::applyGlobalScaling()
+void GfxFrameout::applyGlobalScaling(FrameoutEntry *itemEntry, Common::Rect planeRect, int16 celHeight) {
+	// Global scaling uses global var 2 and some other stuff to calculate scaleX/scaleY
+	int16 maxScale = readSelectorValue(_segMan, itemEntry->object, SELECTOR(maxScale));
+	int16 maxCelHeight = (maxScale * celHeight) >> 7;
+	reg_t globalVar2 = g_sci->getEngineState()->variables[VAR_GLOBAL][2]; // current room object
+	int16 vanishingY = readSelectorValue(_segMan, globalVar2, SELECTOR(vanishingY));
+
+	int16 fixedPortY = planeRect.bottom - vanishingY;
+	int16 fixedEntryY = itemEntry->y - vanishingY;
+	if (!fixedEntryY)
+		fixedEntryY = 1;
+
+	if ((celHeight == 0) || (fixedPortY == 0))
+		error("global scaling panic");
+
+	itemEntry->scaleY = (maxCelHeight * fixedEntryY) / fixedPortY;
+	itemEntry->scaleY = (itemEntry->scaleY * maxScale) / celHeight;
+
+	// Make sure that the calculated value is sane
+	if (itemEntry->scaleY < 1 /*|| itemEntry->scaleY > 128*/)
+		itemEntry->scaleY = 128;
+
+	itemEntry->scaleX = itemEntry->scaleY;
+
+	// and set objects scale selectors
+	//writeSelectorValue(_segMan, itemEntry->object, SELECTOR(scaleX), itemEntry->scaleX);
+	//writeSelectorValue(_segMan, itemEntry->object, SELECTOR(scaleY), itemEntry->scaleY);
+}
+
 void GfxFrameout::kernelAddScreenItem(reg_t object) {
 	// Ignore invalid items
 	if (!_segMan->isObject(object)) {
@@ -390,8 +420,14 @@ void GfxFrameout::kernelUpdateScreenItem(reg_t object) {
 		itemEntry->priority = itemEntry->y;
 
 	itemEntry->signal = readSelectorValue(_segMan, object, SELECTOR(signal));
-	itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
-	itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
+	itemEntry->scaleSignal = readSelectorValue(_segMan, object, SELECTOR(scaleSignal));
+	if (itemEntry->scaleSignal == 1) {
+		itemEntry->scaleX = readSelectorValue(_segMan, object, SELECTOR(scaleX));
+		itemEntry->scaleY = readSelectorValue(_segMan, object, SELECTOR(scaleY));
+	} else {
+		itemEntry->scaleX = 128;
+		itemEntry->scaleY = 128;
+	}
 	itemEntry->visible = true;
 
 	// Check if the entry can be hidden
@@ -699,6 +735,14 @@ void GfxFrameout::kernelFrameout() {
 					// TODO: maybe we should clip the cels rect with this, i'm not sure
 					//  the only currently known usage is game menu of gk1
 				} else if (view) {
+					// Process global scaling, if needed.
+					// TODO: Seems like SCI32 always processes global scaling for scaled objects
+					if (itemEntry->scaleSignal != 0 && itemEntry->scaleSignal != 1)
+						error("Unknown scale signal: %d", itemEntry->scaleSignal);
+					// TODO: We can only process symmetrical scaling for now (i.e. same value for scaleX/scaleY)
+					if (itemEntry->scaleSignal == 1 && itemEntry->scaleX == itemEntry->scaleY)
+						applyGlobalScaling(itemEntry, it->planeRect, view->getHeight(itemEntry->loopNo, itemEntry->celNo));
+
 					if ((itemEntry->scaleX == 128) && (itemEntry->scaleY == 128))
 						view->getCelRect(itemEntry->loopNo, itemEntry->celNo,
 							itemEntry->x, itemEntry->y, itemEntry->z, itemEntry->celRect);
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 5fd2824..5dadca6 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -113,6 +113,7 @@ public:
 	void kernelAddPlane(reg_t object);
 	void kernelUpdatePlane(reg_t object);
 	void kernelDeletePlane(reg_t object);
+	void applyGlobalScaling(FrameoutEntry *itemEntry, Common::Rect planeRect, int16 celHeight);
 	void kernelAddScreenItem(reg_t object);
 	void kernelUpdateScreenItem(reg_t object);
 	void kernelDeleteScreenItem(reg_t object);


Commit: 41725ab7434d9b4dd65074c5e59011dfe277c65a
    https://github.com/scummvm/scummvm/commit/41725ab7434d9b4dd65074c5e59011dfe277c65a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-01-10T16:24:18-08:00

Commit Message:
SCI: Fix the night time palette in QFG4

Changed paths:
    engines/sci/graphics/frameout.cpp



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index dca6441..220a7ed 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -686,7 +686,13 @@ void GfxFrameout::kernelFrameout() {
 			_paint32->fillRect(it->planeRect, it->planeBack);
 
 		_coordAdjuster->pictureSetDisplayArea(it->planeRect);
-		_palette->drewPicture(it->pictureId);
+		// Invoking drewPicture() with an invalid picture ID in SCI32 results in
+		// invalidating the palVary palette when a palVary effect is active. This
+		// is quite obvious in QFG4, where the day time palette is incorrectly
+		// shown when exiting the caves, and the correct night time palette
+		// flashes briefly each time that kPalVaryInit is called.
+		if (it->pictureId != 0xFFFF)
+			_palette->drewPicture(it->pictureId);
 
 		FrameoutList itemList;
 






More information about the Scummvm-git-logs mailing list