[Scummvm-git-logs] scummvm master -> 19fe35216fee5daa488c9766ef2dc603fa1ddca5

yuv422 yuv422 at users.noreply.github.com
Sun Mar 15 03:06:39 UTC 2020


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:
19fe35216f DRAGONS: Add fake loading screen when starting a new game


Commit: 19fe35216fee5daa488c9766ef2dc603fa1ddca5
    https://github.com/scummvm/scummvm/commit/19fe35216fee5daa488c9766ef2dc603fa1ddca5
Author: Eric Fry (yuv422 at users.noreply.github.com)
Date: 2020-03-15T14:03:00+11:00

Commit Message:
DRAGONS: Add fake loading screen when starting a new game

Changed paths:
    engines/dragons/dragons.cpp
    engines/dragons/dragons.h
    engines/dragons/font.cpp
    engines/dragons/scene.cpp
    engines/dragons/screen.cpp
    engines/dragons/screen.h


diff --git a/engines/dragons/dragons.cpp b/engines/dragons/dragons.cpp
index 919520480e..a934ffd3f8 100644
--- a/engines/dragons/dragons.cpp
+++ b/engines/dragons/dragons.cpp
@@ -1546,19 +1546,29 @@ void DragonsEngine::mainMenu() {
 				_fontManager->addAsciiText((i == 0 ? 17 : 16) * 8, (0x12 + i) * 8, &menuItems[i][0],
 										   strlen(menuItems[i]), i == curMenuItem ? 0 : 1);
 			}
-			if (checkForDownKeyRelease() && curMenuItem < 2) {
-				curMenuItem++;
+			if (checkForDownKeyRelease()) {
+				if (curMenuItem < 2) {
+					curMenuItem++;
+				} else {
+					curMenuItem = 0;
+				}
 				playOrStopSound(0x8009);
 			}
 
-			if (checkForUpKeyRelease() && curMenuItem > 0) {
-				curMenuItem--;
+			if (checkForUpKeyRelease()) {
+				if (curMenuItem > 0) {
+					curMenuItem--;
+				} else {
+					curMenuItem = 2;
+				}
 				playOrStopSound(0x8009);
 			}
 			waitForFrames(1);
 		} while (!checkForActionButtonRelease() && !shouldQuit());
 
 		if (curMenuItem == 0) {
+			_screen->clearScreen();
+			loadingScreen();
 			startGame = true;
 		} else if (curMenuItem == 1) {
 			//TODO options menu
@@ -1574,6 +1584,84 @@ bool DragonsEngine::isInMenu() {
 	return _inMenu;
 }
 
+void loadingScreenUpdateFunction() {
+	getEngine()->loadingScreenUpdate();
+}
+
+void DragonsEngine::loadingScreen() {
+	const int flamesActorOffset[4] = {2, 0, 3, 1};
+	_loadingScreenState = new LoadingScreenState;
+	_fontManager->clearText();
+	_actorManager->clearActorFlags(2);
+	_screen->addFlatQuad(0,0,0x13f,0,0x13f,199,0,199,0x34a2,6,0);
+	Actor *actor = _actorManager->loadActor(0,0x82,0,0,6);
+	actor->setFlag(ACTOR_FLAG_100);
+	actor->setFlag(ACTOR_FLAG_200);
+	actor->setFlag(ACTOR_FLAG_80);
+	actor = _actorManager->loadActor(0,0x83,0,0,6);
+	actor->setFlag(ACTOR_FLAG_100);
+	actor->setFlag(ACTOR_FLAG_200);
+	actor->setFlag(ACTOR_FLAG_80);
+
+	for (int i = 0; i < 10; i++) {
+		actor = _actorManager->loadActor(0,flamesActorOffset[(i % 4)] + 0x7e,i * 0x20 + 0x10,0xbe,6);
+		actor->setFlag(ACTOR_FLAG_100);
+		actor->setFlag(ACTOR_FLAG_200);
+		actor->setFlag(ACTOR_FLAG_80);
+		_loadingScreenState->flames[i] = actor;
+		_loadingScreenState->baseYOffset = 0xbe;
+		int x0 = i * 0x20;
+		_loadingScreenState->quads[i] = _screen->addFlatQuad(x0,0,x0 + 0x20,0,x0 + 0x20,199,x0,199,0,7,0);
+	}
+
+	setVsyncUpdateFunction(loadingScreenUpdateFunction);
+	waitForFramesAllowSkip(400);
+	_actorManager->clearActorFlags(2);
+	_screen->clearAllFlatQuads();
+	setVsyncUpdateFunction(nullptr);
+	delete _loadingScreenState;
+	_loadingScreenState = nullptr;
+}
+
+void DragonsEngine::loadingScreenUpdate() {
+	const int16 flameOffsetTbl[26] = {
+			3,      4,      5,      6,
+			7,      5,      4,      3,
+			3,      4,      6,      7,
+			6,      5,      5,      6,
+			7,      6,      4,      3,
+			2,      3,      4,      5,
+			6,      5
+	};
+	FlatQuad *quad;
+	int16 flameYOffset;
+
+	if (_loadingScreenState->loadingFlamesUpdateCounter == 0) {
+		_loadingScreenState->loadingFlamesUpdateCounter = 4;
+		for (int i = 0; i < 10 ; i++) {
+			flameYOffset = _loadingScreenState->baseYOffset - flameOffsetTbl[(i + _loadingScreenState->flameOffsetIdx) % 27];
+			if (_loadingScreenState->flames[i]->_y_pos >= -0xb) {
+				_loadingScreenState->flames[i]->_y_pos = flameYOffset;
+			}
+			quad = _screen->getFlatQuad(_loadingScreenState->quads[i]);
+			if (quad->points[0].y >= -1) {
+				quad->points[0].y = flameYOffset + 2;
+				quad->points[1].y = flameYOffset + 2;
+			}
+		}
+		_loadingScreenState->flameOffsetIdx = (_loadingScreenState->flameOffsetIdx + 1) % 27;
+	} else {
+		_loadingScreenState->loadingFlamesUpdateCounter--;
+	}
+
+	if (_loadingScreenState->loadingFlamesRiseCounter == 0) {
+		_loadingScreenState->loadingFlamesRiseCounter = 1;
+		_loadingScreenState->baseYOffset--;
+	} else {
+		_loadingScreenState->loadingFlamesRiseCounter--;
+	}
+}
+
 void (*DragonsEngine::getSceneUpdateFunction())() {
 	return _sceneUpdateFunction;
 }
diff --git a/engines/dragons/dragons.h b/engines/dragons/dragons.h
index c9ca698bf6..81d40b12d4 100644
--- a/engines/dragons/dragons.h
+++ b/engines/dragons/dragons.h
@@ -117,6 +117,7 @@ class Inventory;
 class Scene;
 class Screen;
 class ActorManager;
+class Actor;
 class SequenceOpcodes;
 class ScriptOpcodes;
 class Talk;
@@ -124,6 +125,21 @@ class SoundManager;
 class StrPlayer;
 struct DragonINI;
 
+struct LoadingScreenState {
+	Actor *flames[10];
+	uint16 quads[10];
+	int16 baseYOffset;
+	int16 flameOffsetIdx;
+	int16 loadingFlamesUpdateCounter;
+	int16 loadingFlamesRiseCounter;
+
+	LoadingScreenState() {
+		baseYOffset = 0;
+		flameOffsetIdx = 0;
+		loadingFlamesUpdateCounter = 0;
+		loadingFlamesRiseCounter = 0;
+	}
+};
 
 class DragonsEngine : public Engine {
 public:
@@ -172,6 +188,8 @@ private:
 
 	uint32 _randomState;
 
+	LoadingScreenState *_loadingScreenState;
+
 	// input
 	bool _leftMouseButtonUp;
 	bool _leftMouseButtonDown;
@@ -286,6 +304,8 @@ public:
 
 	bool isInMenu();
 
+	void loadingScreenUpdate();
+
 	//TODO this logic should probably go in its own class.
 	uint32 getBigFileInfoTblFromDragonEXE();
 	uint32 getFontOffsetFromDragonEXE();
@@ -323,6 +343,8 @@ private:
 
 	void initSubtitleFlag();
 
+	void loadingScreen();
+
 	void mainMenu();
 };
 
diff --git a/engines/dragons/font.cpp b/engines/dragons/font.cpp
index 378e18319f..4f42beca0b 100644
--- a/engines/dragons/font.cpp
+++ b/engines/dragons/font.cpp
@@ -131,7 +131,7 @@ void FontManager::draw() {
 
 void FontManager::clearText() {
 	_numTextEntries = 0;
-	_surface->fillRect(Common::Rect(0, 0, _surface->w - 1, _surface->h - 1), 0);
+	_surface->fillRect(Common::Rect(_surface->w, _surface->h), 0);
 }
 
 Font *FontManager::loadFont(uint16 index, Common::SeekableReadStream &stream) {
diff --git a/engines/dragons/scene.cpp b/engines/dragons/scene.cpp
index 730d396eef..6341d4a61b 100644
--- a/engines/dragons/scene.cpp
+++ b/engines/dragons/scene.cpp
@@ -361,6 +361,8 @@ void Scene::draw() {
 			}
 		}
 
+		_screen->drawFlatQuads(priority);
+
 		for (int16 i = 0; i < DRAGONS_ENGINE_NUM_ACTORS; i++) {
 			Actor *actor = _actorManager->getActorByDisplayOrder(i);
 			if (actor->_x_pos == -100 && actor->_y_pos == 100) {
diff --git a/engines/dragons/screen.cpp b/engines/dragons/screen.cpp
index 8a22c4fe9b..0860c853ec 100644
--- a/engines/dragons/screen.cpp
+++ b/engines/dragons/screen.cpp
@@ -434,4 +434,54 @@ void Screen::copyRectToSurface8bppWrappedX(const Graphics::Surface &srcSurface,
 	}
 }
 
+int16 Screen::addFlatQuad(int16 x0, int16 y0, int16 x1, int16 y1, int16 x3, int16 y3, int16 x2, int16 y2, uint16 colour,
+						 int16 priorityLayer, uint16 flags) {
+
+	assert(x0 == x2 && x1 == x3 && y0 == y1 && y2 == y3); //make sure this is a rectangle
+
+	for (int i = 0; i < DRAGONS_NUM_FLAT_QUADS; i++) {
+		if (!(_flatQuads[i].flags & 1u)) {
+			_flatQuads[i].flags = flags | 1u;
+			_flatQuads[i].points[0].x = x0;
+			_flatQuads[i].points[0].y = y0;
+			_flatQuads[i].points[1].x = x1;
+			_flatQuads[i].points[1].y = y1;
+			_flatQuads[i].points[2].x = x3;
+			_flatQuads[i].points[2].y = y3;
+			_flatQuads[i].points[3].x = x2;
+			_flatQuads[i].points[3].y = y2;
+			_flatQuads[i].colour = colour;
+			_flatQuads[i].priorityLayer = priorityLayer;
+			return i;
+		}
+	}
+
+	return -1;
+}
+
+void Screen::drawFlatQuads(uint16 priorityLayer) {
+	for (int i = 0; i < DRAGONS_NUM_FLAT_QUADS; i++) {
+		if (_flatQuads[i].flags & 1u && _flatQuads[i].priorityLayer == priorityLayer) {
+			//TODO need to support semitrans mode.
+			//TODO check if we need to support non-rectangular quads.
+			fillRect(_flatQuads[i].colour, Common::Rect(_flatQuads[i].points[0].x, _flatQuads[i].points[0].y, _flatQuads[i].points[2].x + 1, _flatQuads[i].points[2].y + 1));
+		}
+	}
+}
+
+void Screen::fillRect(uint16 colour, Common::Rect rect) {
+	_backSurface->fillRect(rect, colour);
+}
+
+void Screen::clearAllFlatQuads() {
+	for (int i = 0; i < DRAGONS_NUM_FLAT_QUADS; i++) {
+		_flatQuads[i].flags = 0;
+	}
+}
+
+FlatQuad *Screen::getFlatQuad(uint16 quadId) {
+	assert(quadId < DRAGONS_NUM_FLAT_QUADS);
+	return &_flatQuads[quadId];
+}
+
 } // End of namespace Dragons
diff --git a/engines/dragons/screen.h b/engines/dragons/screen.h
index 130a542b98..45b3654f61 100644
--- a/engines/dragons/screen.h
+++ b/engines/dragons/screen.h
@@ -33,6 +33,8 @@ namespace Dragons {
 #define DRAGONS_SCREEN_WIDTH 320
 #define DRAGONS_SCREEN_HEIGHT 200
 
+#define DRAGONS_NUM_FLAT_QUADS 0xf
+
 enum AlphaBlendMode {
 	NONE,
 	NORMAL,       // 50% x Back + 50% x Sprite
@@ -41,12 +43,26 @@ enum AlphaBlendMode {
 	SUBTRACTIVE   // 100% x Back - 100% x Sprite
 };
 
+struct FlatQuad {
+	uint16 flags;
+	uint16 priorityLayer;
+	Common::Point points[4];
+	uint16 colour;
+
+	FlatQuad() {
+		flags = 0;
+		priorityLayer = 0;
+		colour = 0;
+	}
+};
+
 class Screen {
 private:
 	Graphics::PixelFormat _pixelFormat;
 	Graphics::Surface *_backSurface;
 	byte _palettes[DRAGONS_NUM_PALETTES][512];
 	Common::Point _screenShakeOffset;
+	FlatQuad _flatQuads[DRAGONS_NUM_FLAT_QUADS];
 public:
 	virtual ~Screen();
 
@@ -64,6 +80,7 @@ public:
 	void updatePaletteTransparency(uint16 paletteNum, uint16 startOffset, uint16 endOffset, bool isTransparent);
 	void clearScreen();
 	void drawRect(uint16 colour, Common::Rect rect, int id);
+	void fillRect(uint16 colour, Common::Rect rect);
 	Common::Rect clipRectToScreen(int destX, int destY, const Common::Rect rect);
 	Common::Rect clipRectToRect(int destX, int destY, const Common::Rect rect, const Common::Rect containerRect);
 
@@ -71,6 +88,11 @@ public:
 
 	void copyRectToSurface8bppWrappedY(const Graphics::Surface &srcSurface, byte *palette, int yOffset);
 
+	int16 addFlatQuad(int16 x0, int16 y0, int16 x1, int16 y1, int16 x3, int16 y3, int16 x2, int16 y2, uint16 colour, int16 priorityLayer, uint16 flags);
+	void drawFlatQuads(uint16 priorityLayer);
+	FlatQuad *getFlatQuad(uint16 quadId);
+	void clearAllFlatQuads();
+
 private:
 	void copyRectToSurface(const void *buffer, int srcPitch, int srcWidth, int srcXOffset, int destX, int destY, int width, int height, bool flipX, AlphaBlendMode alpha);
 	void copyRectToSurface8bpp(const void *buffer, byte* palette, int srcPitch, int srcWidth, int srcXOffset, int destX, int destY, int width, int height, bool flipX, AlphaBlendMode alpha);




More information about the Scummvm-git-logs mailing list