[Scummvm-git-logs] scummvm master -> 583d857a3922bbe0c333b4226b6ab6e13e1f6ecf

dreammaster dreammaster at scummvm.org
Sat Mar 10 03:47:38 CET 2018


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:
583d857a39 XEEN: Properly implement sprite flag SPRFLAG_BOTTOM_CLIPPED


Commit: 583d857a3922bbe0c333b4226b6ab6e13e1f6ecf
    https://github.com/scummvm/scummvm/commit/583d857a3922bbe0c333b4226b6ab6e13e1f6ecf
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2018-03-09T21:47:28-05:00

Commit Message:
XEEN: Properly implement sprite flag SPRFLAG_BOTTOM_CLIPPED

Changed paths:
    engines/xeen/interface_scene.cpp
    engines/xeen/sprites.cpp
    engines/xeen/sprites.h
    engines/xeen/worldofxeen/darkside_cutscenes.cpp
    engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
    engines/xeen/xeen.cpp


diff --git a/engines/xeen/interface_scene.cpp b/engines/xeen/interface_scene.cpp
index 4f03362..51cb6d8 100644
--- a/engines/xeen/interface_scene.cpp
+++ b/engines/xeen/interface_scene.cpp
@@ -145,18 +145,18 @@ OutdoorDrawList::OutdoorDrawList() : _sky1(_data[0]), _sky2(_data[1]),
 	_data[107] = DrawStruct(0, 200, 40, 0, SPRFLAG_HORIZ_FLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[108] = DrawStruct(0, 8, 47);
 	_data[109] = DrawStruct(0, 169, 47, 0, SPRFLAG_HORIZ_FLIPPED);
-	_data[110] = DrawStruct(1, -56, -4, SCALE_ENLARGE, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
-	_data[111] = DrawStruct(0, -5, 2, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
-	_data[112] = DrawStruct(0, -67, 2, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[110] = DrawStruct(1, -56, -4, SCALE_ENLARGE, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
+	_data[111] = DrawStruct(0, -5, 2, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
+	_data[112] = DrawStruct(0, -67, 2, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[113] = DrawStruct(0, 44, 73);
 	_data[114] = DrawStruct(0, 44, 73);
-	_data[115] = DrawStruct(0, 58, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[115] = DrawStruct(0, 58, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[116] = DrawStruct(0, 169, 73);
 	_data[117] = DrawStruct(0, 169, 73);
-	_data[118] = DrawStruct(0, -5, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[118] = DrawStruct(0, -5, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[119] = DrawStruct(0, 110, 73);
 	_data[120] = DrawStruct(0, 110, 73);
-	_data[121] = DrawStruct(0, -5, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[121] = DrawStruct(0, -5, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[122] = DrawStruct(0, 110, 73);
 	_data[123] = DrawStruct(0, 110, 73);
 	_data[124] = DrawStruct(0, 72, 43);
@@ -345,17 +345,17 @@ IndoorDrawList::IndoorDrawList() :
 	_data[146] = DrawStruct(0, 200, 12, 0, SPRFLAG_HORIZ_FLIPPED);
 	_data[147] = DrawStruct(0, 200, 24, 0, SPRFLAG_SCENE_CLIPPED);
 	_data[148] = DrawStruct(0, 32, 24);
-	_data[149] = DrawStruct(0, -5, 2, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
-	_data[150] = DrawStruct(0, -67, 10, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[149] = DrawStruct(0, -5, 2, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
+	_data[150] = DrawStruct(0, -67, 10, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[151] = DrawStruct(0, 44, 73);
 	_data[152] = DrawStruct(0, 44, 73);
-	_data[153] = DrawStruct(0, 58, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[153] = DrawStruct(0, 58, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[154] = DrawStruct(0, 169, 73);
 	_data[155] = DrawStruct(0, 169, 73);
-	_data[156] = DrawStruct(0, -5, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[156] = DrawStruct(0, -5, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[157] = DrawStruct(0, 110, 73);
 	_data[158] = DrawStruct(0, 110, 73);
-	_data[159] = DrawStruct(0, -5, 14, 0, SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED);
+	_data[159] = DrawStruct(0, -5, 14, 0, SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED);
 	_data[160] = DrawStruct(0, 110, 73);
 	_data[161] = DrawStruct(0, 110, 73);
 	_data[162] = DrawStruct(0, 72, 43);
@@ -485,7 +485,7 @@ void InterfaceScene::drawOutdoorsScene() {
 					ds2._y = 73;
 				}
 
-				ds2._flags = SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED;
+				ds2._flags = SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED;
 				ds2._sprites = &_charPowSprites;
 			}
 
@@ -496,7 +496,7 @@ void InterfaceScene::drawOutdoorsScene() {
 
 				if (ds1._scale == SCALE_ENLARGE)
 					ds1._x /= 3;
-				ds1._flags = SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED;
+				ds1._flags = SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED;
 				ds1._sprites = &_charPowSprites;
 			}
 		}
@@ -623,7 +623,7 @@ void InterfaceScene::drawIndoorsScene() {
 					ds1._y = 73;
 				}
 
-				ds1._flags = SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED;
+				ds1._flags = SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED;
 				ds1._sprites = &_charPowSprites;
 			}
 
@@ -633,7 +633,7 @@ void InterfaceScene::drawIndoorsScene() {
 				ds2._scale = combat._pow[idx]._elemScale;
 				if (ds2._scale == SCALE_ENLARGE)
 					ds2._x /= 3;
-				ds2._flags = SPRFLAG_4000 | SPRFLAG_SCENE_CLIPPED;
+				ds2._flags = SPRFLAG_BOTTOM_CLIPPED | SPRFLAG_SCENE_CLIPPED;
 				ds2._sprites = &_charPowSprites;
 			}
 		}
diff --git a/engines/xeen/sprites.cpp b/engines/xeen/sprites.cpp
index e55a69e..4811f10 100644
--- a/engines/xeen/sprites.cpp
+++ b/engines/xeen/sprites.cpp
@@ -33,6 +33,8 @@ namespace Xeen {
 #define SCENE_CLIP_LEFT 8
 #define SCENE_CLIP_RIGHT 223
 
+int SpriteResource::_clippedBottom;
+
 SpriteResource::SpriteResource() {
 	_filesize = 0;
 	_data = nullptr;
@@ -324,11 +326,14 @@ void SpriteResource::draw(int windowIndex, int frame, const Common::Point &destP
 
 void SpriteResource::draw(XSurface &dest, int frame, const Common::Point &destPos,
 		const Common::Rect &bounds, uint flags, int scale) {
+	Common::Rect r = bounds;
+	if (flags & SPRFLAG_BOTTOM_CLIPPED)
+		r.clip(SCREEN_WIDTH, _clippedBottom);
 
 	// Sprites can consist of separate background & foreground
-	drawOffset(dest, _index[frame]._offset1, destPos, bounds, flags, scale);
+	drawOffset(dest, _index[frame]._offset1, destPos, r, flags, scale);
 	if (_index[frame]._offset2)
-		drawOffset(dest, _index[frame]._offset2, destPos, bounds, flags, scale);
+		drawOffset(dest, _index[frame]._offset2, destPos, r, flags, scale);
 }
 
 void SpriteResource::draw(XSurface &dest, int frame) {
diff --git a/engines/xeen/sprites.h b/engines/xeen/sprites.h
index a86f5ab..fe4c45c 100644
--- a/engines/xeen/sprites.h
+++ b/engines/xeen/sprites.h
@@ -40,9 +40,8 @@ enum {
 };
 
 enum SpriteFlags {
-	SPRFLAG_800 = 0x800, SPRFLAG_SCENE_CLIPPED = 0x2000,
-	SPRFLAG_4000 = 0x4000, SPRFLAG_HORIZ_FLIPPED = 0x8000,
-	SPRFLAG_RESIZE = 0x10000
+	SPRFLAG_800 = 0x800, SPRFLAG_SCENE_CLIPPED = 0x2000, SPRFLAG_BOTTOM_CLIPPED = 0x4000,
+	SPRFLAG_HORIZ_FLIPPED = 0x8000, SPRFLAG_RESIZE = 0x10000
 };
 
 class SpriteResource {
@@ -55,6 +54,7 @@ private:
 	byte *_data;
 	int _scaledWidth, _scaledHeight;
 	Common::String _filename;
+	static int _clippedBottom;
 
 	/**
 	 * Load a sprite resource from a stream
@@ -174,6 +174,12 @@ public:
 	 * Returns true if the sprite resource is empty (ie. nothing is loaded)
 	 */
 	bool empty() const { return _index.size() == 0; }
+
+	/**
+	 * Set the bottom Y position where sprites are clipped if SPRFLAG_BOTTOM_CLIPPED
+	 * is applied
+	 */
+	static void setClippedBottom(int y) { _clippedBottom = y; }
 };
 
 } // End of namespace Xeen
diff --git a/engines/xeen/worldofxeen/darkside_cutscenes.cpp b/engines/xeen/worldofxeen/darkside_cutscenes.cpp
index 9b62b5a..1fd01d5 100644
--- a/engines/xeen/worldofxeen/darkside_cutscenes.cpp
+++ b/engines/xeen/worldofxeen/darkside_cutscenes.cpp
@@ -907,7 +907,7 @@ bool DarkSideCutscenes::showDarkSideEnding1() {
 
 	SpriteResource faceEnd("face.end");
 	screen.restoreBackground();
-	faceEnd.draw(0, 0, Common::Point(29, 76), SPRFLAG_4000);
+	faceEnd.draw(0, 0, Common::Point(29, 76), SPRFLAG_BOTTOM_CLIPPED);
 	screen.update();
 
 	screen.fadeIn();
@@ -924,7 +924,7 @@ bool DarkSideCutscenes::showDarkSideEnding1() {
 			sound.stopSong();
 
 		screen.restoreBackground();
-		faceEnd.draw(0, 0, Common::Point(29, idx), SPRFLAG_4000);
+		faceEnd.draw(0, 0, Common::Point(29, idx), SPRFLAG_BOTTOM_CLIPPED);
 		screen.update();
 
 		WAIT(2);
diff --git a/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp b/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
index 4ed7f88..4972266 100644
--- a/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
+++ b/engines/xeen/worldofxeen/worldofxeen_cutscenes.cpp
@@ -42,9 +42,9 @@ void WorldOfXeenCutscenes::showWorldOfXeenEnding(GooberState state, uint score)
 			if (worldEnding3())
 				worldEnding4();
 
-	windows[41].setBounds(Common::Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT));
 	sound.stopAllAudio();
 	screen.fadeOut();
+	screen.freePages();
 }
 
 bool WorldOfXeenCutscenes::worldEnding1() {
@@ -55,6 +55,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 	Window &w0 = windows[0];
 	Graphics::ManagedSurface savedBg(SCREEN_WIDTH, SCREEN_HEIGHT);
 
+	SpriteResource::setClippedBottom(185);
 	sound.playSong("outday3.m");
 	if (!showPharaohEndText(Res.WORLD_END_TEXT[0]))
 		return false;
@@ -84,7 +85,6 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 	// Fade out the screen and the music
 	sound.songCommand(223);
 	windows[41].writeString("\x1\xD");
-	windows[41].setBounds(Common::Rect(0, 0, SCREEN_WIDTH, 185));
 
 	screen.fadeOut();
 	while (!_vm->shouldExit() && sound.isSoundPlaying())
@@ -221,8 +221,8 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 			sound.playSound("cast.voc");
 
 		screen.blitFrom(savedBg);
-		sc17.draw(41, 0, Common::Point(33, idx), SPRFLAG_4000);
-		sc17.draw(41, frame, Common::Point(33, idx), SPRFLAG_4000);
+		sc17.draw(41, 0, Common::Point(33, idx), SPRFLAG_BOTTOM_CLIPPED);
+		sc17.draw(41, frame, Common::Point(33, idx), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[4]);
 
 		w0.update();
@@ -237,8 +237,8 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 			sound.playSound("cast.voc");
 
 		screen.blitFrom(savedBg);
-		sc17.draw(41, 0, Common::Point(33, 68), SPRFLAG_4000);
-		sc17.draw(41, idx, Common::Point(33, 68), SPRFLAG_4000);
+		sc17.draw(41, 0, Common::Point(33, 68), SPRFLAG_BOTTOM_CLIPPED);
+		sc17.draw(41, idx, Common::Point(33, 68), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[4]);
 
 		w0.update();
@@ -246,7 +246,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 	}
 
 	screen.blitFrom(savedBg);
-	sc17.draw(0, 0, Common::Point(33, 68), SPRFLAG_4000);
+	sc17.draw(0, 0, Common::Point(33, 68), SPRFLAG_BOTTOM_CLIPPED);
 	setSubtitle(Res.WORLD_END_TEXT[4]);
 	w0.update();
 	screen.fadeOut();
@@ -284,10 +284,11 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 	screen.blitFrom(savedBg);
 	setSubtitle(Res.WORLD_END_TEXT[5]);
 	w0.update();
+	SpriteResource::setClippedBottom(185);
 
 	for (int yp = 185; yp > 13; yp -= 6) {
 		screen.blitFrom(savedBg);
-		staff.draw(41, 0, Common::Point(196, yp), SPRFLAG_4000);
+		staff.draw(41, 0, Common::Point(196, yp), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[5]);
 
 		w0.update();
@@ -313,12 +314,13 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 	}
 
 	// Together, they placed the Cube of Power...
+	SpriteResource::setClippedBottom(118);
 	screen.loadBackground("tablmain.raw");
 	savedBg.blitFrom(screen);
 	screen.loadPage(1);
 	sc20[0].draw(0, 0, Common::Point(26, 55));
 	hands.draw(0, 0, Common::Point(58, 17));
-	cube.draw(0, 0, Common::Point(101, 11), SPRFLAG_4000);
+	cube.draw(0, 0, Common::Point(101, 11), SPRFLAG_BOTTOM_CLIPPED);
 	w0.update();
 	sound.playSound("cast.voc");
 
@@ -329,7 +331,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 		screen.blitFrom(savedBg);
 		sc20[0].draw(0, 0, Common::Point(26, 55));
 		hands.draw(0, 0, Common::Point(58, 17));
-		cube.draw(0, idx, Common::Point(101, 11), SPRFLAG_4000);
+		cube.draw(0, idx, Common::Point(101, 11), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[6]);
 
 		w0.update();
@@ -344,7 +346,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 		screen.blitFrom(savedBg);
 		sc20[0].draw(0, 0, Common::Point(26, 55));
 		hands.draw(0, idx, Common::Point(58, 17));
-		cube.draw(0, frame, Common::Point(101, 11), SPRFLAG_4000);
+		cube.draw(0, frame, Common::Point(101, 11), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[6]);
 
 		w0.update();
@@ -360,7 +362,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 
 		screen.blitFrom(savedBg);
 		sc20[0].draw(0, 0, Common::Point(26, 55));
-		cube.draw(0, frame, Common::Point(101, yp), SPRFLAG_4000);
+		cube.draw(0, frame, Common::Point(101, yp), SPRFLAG_BOTTOM_CLIPPED);
 		setSubtitle(Res.WORLD_END_TEXT[6]);
 
 		w0.update();
@@ -433,6 +435,7 @@ bool WorldOfXeenCutscenes::worldEnding1() {
 		WAIT(3);
 	}
 
+	screen.fadeOut();
 	return true;
 }
 
@@ -452,7 +455,6 @@ bool WorldOfXeenCutscenes::worldEnding2() {
 	};
 	SpriteResource sc24("sc24.eg2");
 
-	screen.fadeOut();
 	screen.loadBackground("eg23prt2.raw");
 	savedBg.blitFrom(screen);
 	sc23[0].draw(0, 0);
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index c209420..d4c6fa0 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -193,6 +193,7 @@ bool XeenEngine::canSaveGameStateCurrently() {
 void XeenEngine::playGame() {
 	_files->setGameCc(0);
 	_sound->stopAllAudio();
+	SpriteResource::setClippedBottom(140);
 
 	play();
 }





More information about the Scummvm-git-logs mailing list