[Scummvm-git-logs] scummvm master -> dc324cdd143dd82315650c12f65870e4f5cd0df3
mduggan
noreply at scummvm.org
Thu May 4 02:53:56 UTC 2023
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:
dc324cdd14 TETRAEDGE: Enable load/save support for Amerzone
Commit: dc324cdd143dd82315650c12f65870e4f5cd0df3
https://github.com/scummvm/scummvm/commit/dc324cdd143dd82315650c12f65870e4f5cd0df3
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2023-05-04T11:53:47+09:00
Commit Message:
TETRAEDGE: Enable load/save support for Amerzone
Changed paths:
engines/tetraedge/game/amerzone_game.cpp
engines/tetraedge/game/game.cpp
engines/tetraedge/te/te_font2.cpp
engines/tetraedge/te/te_font2.h
engines/tetraedge/te/te_i_font.cpp
engines/tetraedge/te/te_i_font.h
engines/tetraedge/te/te_text_base2.cpp
engines/tetraedge/te/te_warp.cpp
engines/tetraedge/tetraedge.cpp
diff --git a/engines/tetraedge/game/amerzone_game.cpp b/engines/tetraedge/game/amerzone_game.cpp
index b29ba0c947f..aa83bc4c29b 100644
--- a/engines/tetraedge/game/amerzone_game.cpp
+++ b/engines/tetraedge/game/amerzone_game.cpp
@@ -20,6 +20,7 @@
*/
#include "common/math.h"
+#include "common/savefile.h"
#include "tetraedge/tetraedge.h"
#include "tetraedge/game/application.h"
@@ -132,6 +133,9 @@ bool AmerzoneGame::changeWarp(const Common::String &rawZone, const Common::Strin
} else {
onChangeWarpAnimFinished();
}
+
+ _currentZone = rawZone;
+
return true;
}
@@ -227,9 +231,17 @@ void AmerzoneGame::initLoadedBackupData() {
_luaContext.addBindings(LuaBinds::LuaOpenBinds);
Application *app = g_engine->getApplication();
if (!_loadName.empty()) {
- error("TODO: finish AmerzoneGame::initLoadedBackupData for direct load");
+ Common::InSaveFile *saveFile = g_engine->getSaveFileManager()->openForLoading(_loadName);
+ Common::Error result = g_engine->loadGameStream(saveFile);
+ if (result.getCode() == Common::kNoError) {
+ ExtendedSavegameHeader header;
+ if (MetaEngine::readSavegameHeader(saveFile, &header))
+ g_engine->setTotalPlayTime(header.playtime);
+ }
+ changeWarp(_currentZone, "", false);
+ } else {
+ changeWarp(app->firstWarpPath(), app->firstScene(), true);
}
- changeWarp(app->firstWarpPath(), app->firstScene(), true);
}
void AmerzoneGame::isInDrag(bool inDrag) {
diff --git a/engines/tetraedge/game/game.cpp b/engines/tetraedge/game/game.cpp
index 64820bc1007..32c7aab85df 100644
--- a/engines/tetraedge/game/game.cpp
+++ b/engines/tetraedge/game/game.cpp
@@ -482,7 +482,12 @@ Common::Error Game::syncGame(Common::Serializer &s) {
inventory().syncState(s);
}
- inventory().cellphone()->syncState(s);
+ if (!g_engine->gameIsAmerzone())
+ inventory().cellphone()->syncState(s);
+
+ // Some of these other values are not needed for Amerzone, but we can safely
+ // save/load them as they're just empty.
+
// dialog2().syncState(s); // game saves this here, but doesn't actually save anything
_luaContext.syncState(s);
s.syncString(_currentZone);
@@ -501,7 +506,10 @@ Common::Error Game::syncGame(Common::Serializer &s) {
s.syncString(mpath);
if (s.isLoading())
_videoMusic.load(mpath);
- s.syncString(_scene._character->walkModeStr());
+ if (!g_engine->gameIsAmerzone()) {
+ assert(_scene._character);
+ s.syncString(_scene._character->walkModeStr());
+ }
s.syncAsByte(_firstInventory);
s.syncAsByte(app->tutoActivated());
diff --git a/engines/tetraedge/te/te_font2.cpp b/engines/tetraedge/te/te_font2.cpp
index c390c836ba3..17320b3282c 100644
--- a/engines/tetraedge/te/te_font2.cpp
+++ b/engines/tetraedge/te/te_font2.cpp
@@ -180,7 +180,7 @@ TeVector3f32 TeFont2::kerning(uint pxSize, uint isocode1, uint isocode2) {
return TeVector3f32();
}
-Common::Rect TeFont2::getBoundingBox(const Common::String &str, int fontSize) {
+Common::Rect TeFont2::getBBox(const Common::String &str, int fontSize) {
Common::Rect rect;
for (uint i = 0; i < str.size(); i++) {
uint c = str[i];
@@ -190,10 +190,25 @@ Common::Rect TeFont2::getBoundingBox(const Common::String &str, int fontSize) {
rect.top = MIN(rect.top, (int16)-g._yOff);
rect.bottom = MAX(rect.bottom, (int16)(-g._yOff + g._ySz));
rect.right += g._xAdvance;
+ if (i < str.size() - 1) {
+ rect.right += kerning(fontSize, c, str[i+1]).x();
+ }
}
return rect;
}
+Common::Rect TeFont2::getBoundingBox(uint32 chr) const {
+ if (chr > _glyphs.size())
+ return Common::Rect();
+
+ Common::Rect rect;
+ rect.left = (int)_glyphs[chr]._xOff;
+ rect.right = rect.left + (int)_glyphs[chr]._xAdvance;
+ rect.top = _maxHeight - _glyphs[chr]._yOff;
+ rect.bottom = _maxHeight;
+ return rect;
+}
+
float TeFont2::height(uint pxSize) {
return _maxHeight;
}
diff --git a/engines/tetraedge/te/te_font2.h b/engines/tetraedge/te/te_font2.h
index 4b9147806d6..aa798f60fe4 100644
--- a/engines/tetraedge/te/te_font2.h
+++ b/engines/tetraedge/te/te_font2.h
@@ -81,7 +81,8 @@ public:
virtual int getCharWidth(uint32 chr) const override;
virtual void drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 color) const override;
virtual int getKerningOffset(uint32 left, uint32 right) const override;
- virtual Common::Rect getBoundingBox(const Common::String &str, int fontSize) override;
+ virtual Common::Rect getBBox(const Common::String &str, int fontSize) override;
+ virtual Common::Rect getBoundingBox(uint32 chr) const override;
virtual TeVector3f32 kerning(uint pxSize, uint isocode1, uint isocode2) override;
virtual float height(uint pxSize) override;
diff --git a/engines/tetraedge/te/te_i_font.cpp b/engines/tetraedge/te/te_i_font.cpp
index 11927e908d5..1360d0e2edc 100644
--- a/engines/tetraedge/te/te_i_font.cpp
+++ b/engines/tetraedge/te/te_i_font.cpp
@@ -72,7 +72,7 @@ int TeIFont::wordWrapText(const Common::String &str, int fontSize, int maxWidth,
return retval;
}
-Common::Rect TeIFont::getBoundingBox(const Common::String &str, int fontSize) {
+Common::Rect TeIFont::getBBox(const Common::String &str, int fontSize) {
Graphics::Font *font = getAtSize(fontSize);
return font->getBoundingBox(str.decode(_codePage));
}
diff --git a/engines/tetraedge/te/te_i_font.h b/engines/tetraedge/te/te_i_font.h
index 05f62ca7bd0..e624373f74e 100644
--- a/engines/tetraedge/te/te_i_font.h
+++ b/engines/tetraedge/te/te_i_font.h
@@ -59,7 +59,7 @@ public:
virtual TeVector3f32 kerning(uint pxSize, uint isocode1, uint isocode2);
virtual void draw(TeImage &destImage, const Common::String &str, int fontSize, int yoff, const TeColor &col, AlignStyle alignMode);
- virtual Common::Rect getBoundingBox(const Common::String &str, int fontSize);
+ virtual Common::Rect getBBox(const Common::String &str, int fontSize);
virtual int getHeight(int fontSize);
virtual int wordWrapText(const Common::String &str, int fontSize, int maxWidth, Common::Array<Common::String> &lines);
diff --git a/engines/tetraedge/te/te_text_base2.cpp b/engines/tetraedge/te/te_text_base2.cpp
index c33b3660086..5945a1f2369 100644
--- a/engines/tetraedge/te/te_text_base2.cpp
+++ b/engines/tetraedge/te/te_text_base2.cpp
@@ -82,7 +82,7 @@ void TeTextBase2::build() {
warning("TODO: Implement TeTextBase2::computeNbSpaces for Justify");
//computeNbSpaces(&line, offset, line.endOffset);
}
- Common::Rect lineSize = font->getBoundingBox(line, _fontSize);
+ Common::Rect lineSize = font->getBBox(line, _fontSize);
if (lineSize.right > _size._x)
_size._x = lineSize.right;
diff --git a/engines/tetraedge/te/te_warp.cpp b/engines/tetraedge/te/te_warp.cpp
index 6fbdf3887d5..74610c46c20 100644
--- a/engines/tetraedge/te/te_warp.cpp
+++ b/engines/tetraedge/te/te_warp.cpp
@@ -240,6 +240,9 @@ void TeWarp::load(const Common::String &path, bool flag) {
return;
_warpPath = path;
+ if (path.empty())
+ error("Empty TeWarp path!");
+
TeCore *core = g_engine->getCore();
Common::FSNode node = core->findFile(_warpPath);
if (!node.isReadable()) {
diff --git a/engines/tetraedge/tetraedge.cpp b/engines/tetraedge/tetraedge.cpp
index 060e29b84ce..5762e13c6c3 100644
--- a/engines/tetraedge/tetraedge.cpp
+++ b/engines/tetraedge/tetraedge.cpp
@@ -160,8 +160,20 @@ bool TetraedgeEngine::canSaveGameStateCurrently() {
}
bool TetraedgeEngine::canSaveAutosaveCurrently() {
- return _game && _application && _game->running()
- && !_game->currentScene().empty() && !_game->currentZone().empty();
+ if (!_game || !_application)
+ return false;
+
+ bool sceneLoaded;
+
+ if (gameIsAmerzone()) {
+ AmerzoneGame *game = dynamic_cast<AmerzoneGame *>(_game);
+ assert(game);
+ sceneLoaded = (game->warpY() != nullptr);
+ } else {
+ sceneLoaded = !_game->currentScene().empty() && !_game->currentZone().empty();
+ }
+
+ return _game->running() && sceneLoaded;
}
Common::Error TetraedgeEngine::loadGameState(int slot) {
More information about the Scummvm-git-logs
mailing list