[Scummvm-git-logs] scummvm master -> 85d148769eeec77ca63fe963d5132b56904a4bc3

aquadran noreply at scummvm.org
Thu Jul 16 20:19:31 UTC 2026


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
85d148769e WINTERMUTE: Implement 'SetVisitedResponseFonts' and 'AddVisitedResponse' method for 'The Last Crown - Midnight Horror' a


Commit: 85d148769eeec77ca63fe963d5132b56904a4bc3
    https://github.com/scummvm/scummvm/commit/85d148769eeec77ca63fe963d5132b56904a4bc3
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2026-07-16T22:19:19+02:00

Commit Message:
WINTERMUTE: Implement 'SetVisitedResponseFonts' and 'AddVisitedResponse' method for 'The Last Crown - Midnight Horror' and bump savegame version

Changed paths:
    engines/wintermute/ad/ad_game.cpp
    engines/wintermute/ad/ad_response.cpp
    engines/wintermute/ad/ad_response.h
    engines/wintermute/ad/ad_response_box.cpp
    engines/wintermute/ad/ad_response_box.h
    engines/wintermute/ad/ad_types.h
    engines/wintermute/dcgf.h


diff --git a/engines/wintermute/ad/ad_game.cpp b/engines/wintermute/ad/ad_game.cpp
index 1486a10ece3..e2a965cdcda 100644
--- a/engines/wintermute/ad/ad_game.cpp
+++ b/engines/wintermute/ad/ad_game.cpp
@@ -54,6 +54,7 @@
 #include "engines/wintermute/base/base_sprite.h"
 #include "engines/wintermute/base/base_viewport.h"
 #include "engines/wintermute/base/base_access_mgr.h"
+#include "engines/wintermute/base/font/base_font_storage.h"
 #include "engines/wintermute/base/particles/part_emitter.h"
 #include "engines/wintermute/base/save_thumb_helper.h"
 #include "engines/wintermute/base/gfx/base_renderer.h"
@@ -558,11 +559,45 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 		return STATUS_OK;
 	}
 
+	//////////////////////////////////////////////////////////////////////////
+	// SetVisitedResponseFonts
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "SetVisitedResponseFonts") == 0) {
+		stack->correctParams(2);
+		ScValue *val1 = stack->pop();
+		ScValue *val2 = stack->pop();
+
+		if (_responseBox) {
+			if (_responseBox->_fontVisited) {
+				_game->_fontStorage->removeFont(_responseBox->_fontVisited);
+			}
+			_responseBox->_fontVisited = _game->_fontStorage->addFont(val1->getString());
+			if (!_responseBox->_fontVisited) {
+				script->runtimeError("Game.SetVisitedResponseFonts: Failed to add visited font");
+				stack->pushNULL();
+				return STATUS_FAILED;
+			}
+
+			if (_responseBox->_fontVisitedHover) {
+				_game->_fontStorage->removeFont(_responseBox->_fontVisitedHover);
+			}
+			_responseBox->_fontVisitedHover = _game->_fontStorage->addFont(val2->getString());
+			if (!_responseBox->_fontVisitedHover) {
+				script->runtimeError("Game.SetVisitedResponseFonts: Failed to add visited hover font");
+				stack->pushNULL();
+				return STATUS_FAILED;
+			}
+		}
+
+		stack->pushNULL();
+
+		return STATUS_OK;
+	}
 
 	//////////////////////////////////////////////////////////////////////////
-	// AddResponse/AddResponseOnce/AddResponseOnceGame
+	// AddResponse/AddVisitedResponse/AddResponseOnce/AddResponseOnceGame
 	//////////////////////////////////////////////////////////////////////////
-	else if (strcmp(name, "AddResponse") == 0 || strcmp(name, "AddResponseOnce") == 0 || strcmp(name, "AddResponseOnceGame") == 0) {
+	else if (strcmp(name, "AddResponse") == 0 || strcmp(name, "AddVisitedResponse") == 0 || strcmp(name, "AddResponseOnce") == 0 || strcmp(name, "AddResponseOnceGame") == 0) {
 		stack->correctParams(6);
 		int id = stack->pop()->getInt();
 		const char *text = stack->pop()->getString();
@@ -591,7 +626,9 @@ bool AdGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 					res->setFont(val4->getString());
 				}
 
-				if (strcmp(name, "AddResponseOnce") == 0) {
+				if (strcmp(name, "AddVisitedResponse") == 0) {
+					res->_responseVisitedType = RESPONSE_VISITED_ONCE;
+				} else if (strcmp(name, "AddResponseOnce") == 0) {
 					res->_responseType = RESPONSE_ONCE;
 				} else if (strcmp(name, "AddResponseOnceGame") == 0) {
 					res->_responseType = RESPONSE_ONCE_GAME;
diff --git a/engines/wintermute/ad/ad_response.cpp b/engines/wintermute/ad/ad_response.cpp
index 505bc83aab5..206f0da96e4 100644
--- a/engines/wintermute/ad/ad_response.cpp
+++ b/engines/wintermute/ad/ad_response.cpp
@@ -44,6 +44,7 @@ AdResponse::AdResponse(BaseGame *inGame) : BaseObject(inGame) {
 	_font = nullptr;
 	_id = 0;
 	_responseType = RESPONSE_ALWAYS;
+	_responseVisitedType = RESPONSE_VISITED_NONE;
 }
 
 
@@ -131,6 +132,13 @@ bool AdResponse::persist(BasePersistenceManager *persistMgr) {
 	persistMgr->transferCharPtr(TMEMBER(_textOrig));
 	persistMgr->transferSint32(TMEMBER_INT(_responseType));
 	persistMgr->transferPtr(TMEMBER_PTR(_font));
+	if (persistMgr->checkVersion(1, 11, 1)) {
+		persistMgr->transferSint32(TMEMBER_INT(_responseVisitedType));
+	} else {
+		if (!persistMgr->getIsSaving()) {
+			_responseVisitedType = RESPONSE_VISITED_NONE;
+		}
+	}
 
 	return STATUS_OK;
 }
diff --git a/engines/wintermute/ad/ad_response.h b/engines/wintermute/ad/ad_response.h
index 9df4c0913e4..eb6dff9d4c6 100644
--- a/engines/wintermute/ad/ad_response.h
+++ b/engines/wintermute/ad/ad_response.h
@@ -52,6 +52,7 @@ public:
 	AdResponse(BaseGame *inGame);
 	~AdResponse() override;
 	TResponseType _responseType;
+	TResponseVisitedType _responseVisitedType;
 };
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/ad/ad_response_box.cpp b/engines/wintermute/ad/ad_response_box.cpp
index ffa772afe6a..42cfd8b9791 100644
--- a/engines/wintermute/ad/ad_response_box.cpp
+++ b/engines/wintermute/ad/ad_response_box.cpp
@@ -54,7 +54,7 @@ IMPLEMENT_PERSISTENT(AdResponseBox, false)
 
 //////////////////////////////////////////////////////////////////////////
 AdResponseBox::AdResponseBox(BaseGame *inGame) : BaseObject(inGame) {
-	_font = _fontHover = nullptr;
+	_font = _fontHover = _fontVisited = _fontVisitedHover =  nullptr;
 
 	_window = nullptr;
 	_shieldWindow = new UIWindow(_game);
@@ -86,6 +86,12 @@ AdResponseBox::~AdResponseBox() {
 	if (_fontHover) {
 		_game->_fontStorage->removeFont(_fontHover);
 	}
+	if (_fontVisited) {
+		_game->_fontStorage->removeFont(_fontVisited);
+	}
+	if (_fontVisitedHover) {
+		_game->_fontStorage->removeFont(_fontVisitedHover);
+	}
 
 	clearResponses();
 	clearButtons();
@@ -158,6 +164,10 @@ bool AdResponseBox::createButtons() {
 				btn->setText(_responses[i]->_text);
 				btn->_font = (_font == nullptr) ? _game->_systemFont : _font;
 				btn->_fontHover = (_fontHover == nullptr) ? _game->_systemFont : _fontHover;
+				if (_responses[i]->_responseVisitedType == RESPONSE_VISITED_ONCE) {
+					btn->_font = (_fontVisited == nullptr) ? btn->_font : _fontVisited;
+					btn->_fontHover = (_fontVisitedHover == nullptr) ? btn->_fontHover : _fontVisitedHover;
+				}
 				btn->_fontPress = btn->_fontHover;
 				btn->_align = _align;
 
@@ -612,6 +622,16 @@ bool AdResponseBox::persist(BasePersistenceManager *persistMgr) {
 	persistMgr->transferSint32(TMEMBER_INT(_verticalAlign));
 	persistMgr->transferSint32(TMEMBER_INT(_align));
 
+	if (persistMgr->checkVersion(1, 11, 1)) {
+		persistMgr->transferPtr(TMEMBER_PTR(_fontVisited));
+		persistMgr->transferPtr(TMEMBER_PTR(_fontVisitedHover));
+	} else {
+		if (!persistMgr->getIsSaving()) {
+			_fontVisited = nullptr;
+			_fontVisitedHover = nullptr;
+		}
+	}
+
 	return STATUS_OK;
 }
 
diff --git a/engines/wintermute/ad/ad_response_box.h b/engines/wintermute/ad/ad_response_box.h
index cb8ed9090fa..d140a19a881 100644
--- a/engines/wintermute/ad/ad_response_box.h
+++ b/engines/wintermute/ad/ad_response_box.h
@@ -62,6 +62,8 @@ public:
 	int32 _scrollOffset;
 	BaseFont *_fontHover;
 	BaseFont *_font;
+	BaseFont *_fontVisitedHover;
+	BaseFont *_fontVisited;
 	bool createButtons();
 	bool invalidateButtons();
 	void clearButtons();
diff --git a/engines/wintermute/ad/ad_types.h b/engines/wintermute/ad/ad_types.h
index 0ae40b34198..2f164bc2f90 100644
--- a/engines/wintermute/ad/ad_types.h
+++ b/engines/wintermute/ad/ad_types.h
@@ -86,6 +86,11 @@ typedef enum {
 	RESPONSE_ONCE_GAME
 } TResponseType;
 
+typedef enum {
+	RESPONSE_VISITED_NONE,
+	RESPONSE_VISITED_ONCE
+} TResponseVisitedType;
+
 typedef enum {
 	TALK_SKIP_LEFT = 0,
 	TALK_SKIP_RIGHT = 1,
diff --git a/engines/wintermute/dcgf.h b/engines/wintermute/dcgf.h
index e1d3f7f2b17..161f838ed1f 100644
--- a/engines/wintermute/dcgf.h
+++ b/engines/wintermute/dcgf.h
@@ -31,7 +31,7 @@
 
 //////////////////////////////////////////////////////////////////////////
 #define DCGF_VER_MAJOR 1
-#define DCGF_VER_MINOR 10
+#define DCGF_VER_MINOR 11
 #define DCGF_VER_BUILD 1
 #define DCGF_VER_SUFFIX "ScummVM"
 #define DCGF_VER_BETA true




More information about the Scummvm-git-logs mailing list