[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