[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