[Scummvm-git-logs] scummvm master -> 280f83242e1e31bd87aeefcaf84cd7f6c6793b81

athrxx athrxx at scummvm.org
Fri Jan 1 15:37:31 UTC 2021


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:
280f83242e KYRA: replace const char * with Common::String around getTableString. (#2603)


Commit: 280f83242e1e31bd87aeefcaf84cd7f6c6793b81
    https://github.com/scummvm/scummvm/commit/280f83242e1e31bd87aeefcaf84cd7f6c6793b81
Author: Vladimir Serbinenko (phcoder at google.com)
Date: 2021-01-01T16:37:27+01:00

Commit Message:
KYRA: replace const char * with Common::String around getTableString. (#2603)

Currently const char * points into some random buffer with unclear
lifetime.

Instead use Common::String which ensures lifetime as long as a reference is
held.

This also removes the need of copying into existing buffers in HoF and MR.

UnkBuf* are gone as well.

Co-authored-by: athrxx <athrxx at scummvm.org>

Changed paths:
    engines/kyra/engine/items_mr.cpp
    engines/kyra/engine/kyra_hof.cpp
    engines/kyra/engine/kyra_hof.h
    engines/kyra/engine/kyra_mr.cpp
    engines/kyra/engine/kyra_mr.h
    engines/kyra/engine/kyra_v2.cpp
    engines/kyra/engine/kyra_v2.h
    engines/kyra/engine/timer_hof.cpp
    engines/kyra/engine/util.cpp
    engines/kyra/engine/util.h
    engines/kyra/gui/gui_hof.cpp
    engines/kyra/gui/gui_hof.h
    engines/kyra/gui/gui_lok.cpp
    engines/kyra/gui/gui_lok.h
    engines/kyra/gui/gui_lol.cpp
    engines/kyra/gui/gui_lol.h
    engines/kyra/gui/gui_mr.cpp
    engines/kyra/gui/gui_mr.h
    engines/kyra/gui/gui_v1.cpp
    engines/kyra/gui/gui_v1.h
    engines/kyra/gui/gui_v2.cpp
    engines/kyra/gui/gui_v2.h
    engines/kyra/script/script_hof.cpp
    engines/kyra/script/script_mr.cpp
    engines/kyra/script/script_v2.cpp
    engines/kyra/sequence/sequences_mr.cpp
    engines/kyra/sequence/sequences_v2.cpp
    engines/kyra/text/text.cpp
    engines/kyra/text/text.h
    engines/kyra/text/text_hof.cpp
    engines/kyra/text/text_mr.cpp
    engines/kyra/text/text_mr.h


diff --git a/engines/kyra/engine/items_mr.cpp b/engines/kyra/engine/items_mr.cpp
index 3963934ffb..a159cec7e8 100644
--- a/engines/kyra/engine/items_mr.cpp
+++ b/engines/kyra/engine/items_mr.cpp
@@ -117,7 +117,7 @@ bool KyraEngine_MR::dropItem(int unk1, Item item, int x, int y, int unk2) {
 			showMessageFromCCode(14, 0xB3, 0);
 	}
 
-	if (!_chatText)
+	if (_chatText.empty())
 		snd_playSoundEffect(13, 200);
 	return false;
 }
diff --git a/engines/kyra/engine/kyra_hof.cpp b/engines/kyra/engine/kyra_hof.cpp
index 2d83d5eccd..fe074220f5 100644
--- a/engines/kyra/engine/kyra_hof.cpp
+++ b/engines/kyra/engine/kyra_hof.cpp
@@ -94,9 +94,7 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn
 	_dbgPass = 0;
 
 	_gamePlayBuffer = 0;
-	_unkBuf500Bytes = 0;
 	_inventorySaved = false;
-	_unkBuf200kByte = 0;
 	memset(&_sceneShapeTable, 0, sizeof(_sceneShapeTable));
 
 	_talkObjectList = 0;
@@ -287,7 +285,6 @@ void KyraEngine_HoF::startup() {
 
 	memset(_sceneShapeTable, 0, sizeof(_sceneShapeTable));
 	_gamePlayBuffer = new uint8[46080];
-	_unkBuf500Bytes = new uint8[500];
 
 	loadMouseShapes();
 	loadItemShapes();
@@ -295,7 +292,6 @@ void KyraEngine_HoF::startup() {
 	_screen->setMouseCursor(0, 0, getShapePtr(0));
 
 	_screenBuffer = new uint8[64000];
-	_unkBuf200kByte = new uint8[200000];
 
 	loadChapterBuffer(_newChapterFile);
 
@@ -313,7 +309,7 @@ void KyraEngine_HoF::startup() {
 		_optionsBuffer = _cCodeBuffer;
 	}
 
-	showMessage(0, 207);
+	clearMessage();
 
 	_screen->setShapePages(5, 3);
 
@@ -621,7 +617,7 @@ void KyraEngine_HoF::updateWithText() {
 	restorePage3();
 	drawAnimObjects();
 
-	if (_chatTextEnabled && _chatText) {
+	if (_chatTextEnabled && !_chatText.empty()) {
 		int pageBackUp = _screen->_curPage;
 		_screen->_curPage = 2;
 		objectChatPrintText(_chatText, _chatObject);
@@ -741,8 +737,6 @@ void KyraEngine_HoF::cleanup() {
 	delete[] _inventoryButtons; _inventoryButtons = 0;
 
 	delete[] _gamePlayBuffer; _gamePlayBuffer = 0;
-	delete[] _unkBuf500Bytes; _unkBuf500Bytes = 0;
-	delete[] _unkBuf200kByte; _unkBuf200kByte = 0;
 
 	freeSceneShapePtrs();
 
@@ -821,19 +815,17 @@ uint8 *KyraEngine_HoF::getTableEntry(uint8 *buffer, int id) {
 	return buffer + READ_LE_UINT16(buffer + (id<<1));
 }
 
-char *KyraEngine_HoF::getTableString(int id, uint8 *buffer, bool decode) {
-	char *string = (char *)getTableEntry(buffer, id);
+Common::String KyraEngine_HoF::getTableString(int id, uint8 *buffer, bool decode) {
+	Common::String string((char *)getTableEntry(buffer, id));
 
 	if (decode && _flags.lang != Common::JA_JPN) {
-		Util::decodeString1(string, _internStringBuf);
-		Util::decodeString2(_internStringBuf, _internStringBuf);
-		string = _internStringBuf;
+		string = Util::decodeString2(Util::decodeString1(string));
 	}
 
 	return string;
 }
 
-const char *KyraEngine_HoF::getChapterString(int id) {
+Common::String KyraEngine_HoF::getChapterString(int id) {
 	if (_currentChapter != _newChapterFile)
 		loadChapterBuffer(_newChapterFile);
 
@@ -843,15 +835,14 @@ const char *KyraEngine_HoF::getChapterString(int id) {
 #pragma mark -
 
 void KyraEngine_HoF::showMessageFromCCode(int id, int16 palIndex, int) {
-	const char *string = getTableString(id, _cCodeBuffer, true);
-	showMessage(string, palIndex);
+	showMessage(getTableString(id, _cCodeBuffer, true), palIndex);
 }
 
-void KyraEngine_HoF::showMessage(const char *string, int16 palIndex) {
+void KyraEngine_HoF::showMessage(const Common::String &string, int16 palIndex) {
 	_shownMessage = string;
 	_screen->fillRect(0, 190, 319, 199, 0xCF);
 
-	if (string) {
+	if (!string.empty()) {
 		if (palIndex != -1 || _fadeMessagePalette) {
 			palIndex *= 3;
 			memcpy(_messagePal, _screen->getPalette(0).getData() + palIndex, 3);
@@ -868,32 +859,34 @@ void KyraEngine_HoF::showMessage(const char *string, int16 palIndex) {
 	_fadeMessagePalette = false;
 }
 
+void KyraEngine_HoF::clearMessage() {
+	_shownMessage = "";
+	_screen->fillRect(0, 190, 319, 199, 0xCF);
+	_fadeMessagePalette = false;
+}
+
 void KyraEngine_HoF::showChapterMessage(int id, int16 palIndex) {
 	showMessage(getChapterString(id), palIndex);
 }
 
 void KyraEngine_HoF::updateCommandLineEx(int str1, int str2, int16 palIndex) {
-	char buffer[0x51];
-	char *src = buffer;
-
-	strcpy(src, getTableString(str1, _cCodeBuffer, true));
-
-	if (_flags.lang != Common::JA_JPN) {
-		while (*src != 0x20)
-			++src;
-		++src;
-		*src = toupper(*src);
-	}
-
-	strcpy((char *)_unkBuf500Bytes, src);
-
-	if (str2 > 0) {
-		if (_flags.lang != Common::JA_JPN)
-			strcat((char *)_unkBuf500Bytes, " ");
-		strcat((char *)_unkBuf500Bytes, getTableString(str2, _cCodeBuffer, true));
-	}
-
-	showMessage((char *)_unkBuf500Bytes, palIndex);
+	Common::String str = getTableString(str1, _cCodeBuffer, true);
+ 
+ 	if (_flags.lang != Common::JA_JPN) {
+		uint i = 0;
+		while (str[i] != ' ')
+			++i;
+		++i;
+		str.setChar(toupper(str[i]), i);
+ 	}
+ 
+ 	if (str2 > 0) {
+ 		if (_flags.lang != Common::JA_JPN)
+			str += " ";
+		str += getTableString(str2, _cCodeBuffer, 1);
+ 	}
+ 
+	showMessage(str, palIndex);
 }
 
 void KyraEngine_HoF::fadeMessagePalette() {
@@ -1771,7 +1764,7 @@ bool KyraEngine_HoF::updateCauldron() {
 		}
 
 		if (cauldronState >= 0) {
-			showMessage(0, 0xCF);
+			clearMessage();
 			setCauldronState(cauldronState, true);
 			if (cauldronState == 7)
 				objectChat(getTableString(0xF2, _cCodeBuffer, true), 0, 0x83, 0xF2);
@@ -1784,7 +1777,7 @@ bool KyraEngine_HoF::updateCauldron() {
 }
 
 void KyraEngine_HoF::cauldronRndPaletteFade() {
-	showMessage(0, 0xCF);
+	clearMessage();
 	int index = _rnd.getRandomNumberRng(0x0F, 0x16);
 	Common::SeekableReadStream *file = _res->createReadStream("_POTIONS.PAL");
 	if (!file)
@@ -1831,30 +1824,21 @@ void KyraEngine_HoF::listItemsInCauldron() {
 	} else {
 		objectChat(getTableString(0xF7, _cCodeBuffer, true), 0, 0x83, 0xF7);
 
-		char buffer[80];
 		for (int i = 0; i < itemsInCauldron-1; ++i) {
-			char *str = buffer;
-			strcpy(str, getTableString(_cauldronTable[i]+54, _cCodeBuffer, true));
+			Common::String str = getTableString(_cauldronTable[i]+54, _cCodeBuffer, true);
 			if (_lang == 1) {
-				if (*str == 37)
-					str += 2;
+			    if (str[0] == 37)
+				str = str.substr(2);
 			}
-			strcpy((char *)_unkBuf500Bytes, "...");
-			strcat((char *)_unkBuf500Bytes, str);
-			strcat((char *)_unkBuf500Bytes, "...");
-			objectChat((const char *)_unkBuf500Bytes, 0, 0x83, _cauldronTable[i]+54);
+			objectChat("..." + str + "...", 0, 0x83, _cauldronTable[i]+54);
 		}
 
-		char *str = buffer;
-		strcpy(str, getTableString(_cauldronTable[itemsInCauldron-1]+54, _cCodeBuffer, true));
+		Common::String str = getTableString(_cauldronTable[itemsInCauldron-1]+54, _cCodeBuffer, true);
 		if (_lang == 1) {
-			if (*str == 37)
-				str += 2;
+			if (str[0] == 37)
+			    str = str.substr(2);
 		}
-		strcpy((char *)_unkBuf500Bytes, "...");
-		strcat((char *)_unkBuf500Bytes, str);
-		strcat((char *)_unkBuf500Bytes, ".");
-		objectChat((const char *)_unkBuf500Bytes, 0, 0x83, _cauldronTable[itemsInCauldron-1]+54);
+		objectChat("..." + str + ".", 0, 0x83, _cauldronTable[itemsInCauldron-1]+54);
 	}
 }
 
@@ -1905,7 +1889,7 @@ void KyraEngine_HoF::playTim(const char *filename) {
 	_tim->resetFinishedFlag();
 	while (!shouldQuit() && !_tim->finished()) {
 		_tim->exec(tim, 0);
-		if (_chatText)
+		if (!_chatText.empty())
 			updateWithText();
 		else
 			update();
diff --git a/engines/kyra/engine/kyra_hof.h b/engines/kyra/engine/kyra_hof.h
index bc5f94c5a2..a39d50d759 100644
--- a/engines/kyra/engine/kyra_hof.h
+++ b/engines/kyra/engine/kyra_hof.h
@@ -333,8 +333,8 @@ protected:
 	int _newChapterFile;
 
 	uint8 *getTableEntry(uint8 *buffer, int id);
-	char *getTableString(int id, uint8 *buffer, bool decode);
-	const char *getChapterString(int id);
+	Common::String getTableString(int id, uint8 *buffer, bool decode);
+	Common::String getChapterString(int id);
 
 	void changeFileExtension(char *buffer);
 
@@ -367,12 +367,13 @@ protected:
 
 	// text
 	void showMessageFromCCode(int id, int16 palIndex, int);
-	void showMessage(const char *string, int16 palIndex);
+	void showMessage(const Common::String &string, int16 palIndex);
+	void clearMessage();
 	void showChapterMessage(int id, int16 palIndex);
 
 	void updateCommandLineEx(int str1, int str2, int16 palIndex);
 
-	const char *_shownMessage;
+	Common::String _shownMessage;
 
 	byte _messagePal[3];
 	bool _fadeMessagePalette;
@@ -382,11 +383,11 @@ protected:
 	bool _chatIsNote;
 
 	int chatGetType(const char *text);
-	int chatCalcDuration(const char *text);
+	int chatCalcDuration(const Common::String &text);
 
-	void objectChat(const char *text, int object, int vocHigh = -1, int vocLow = -1);
-	void objectChatInit(const char *text, int object, int vocHigh = -1, int vocLow = -1);
-	void objectChatPrintText(const char *text, int object);
+	void objectChat(const Common::String &text, int object, int vocHigh = -1, int vocLow = -1);
+	void objectChatInit(const Common::String &text, int object, int vocHigh = -1, int vocLow = -1);
+	void objectChatPrintText(const Common::String &text, int object);
 	void objectChatProcess(const char *script);
 	void objectChatWaitToFinish();
 
@@ -397,7 +398,7 @@ protected:
 	void updateDlgBuffer();
 	void loadDlgHeader(int &csEntry, int &vocH, int &scIndex1, int &scIndex2);
 	void processDialogue(int dlgOffset, int vocH = 0, int csEntry = 0);
-	void npcChatSequence(const char *str, int objectId, int vocHigh = -1, int vocLow = -1);
+	void npcChatSequence(const Common::String &str, int objectId, int vocHigh = -1, int vocLow = -1);
 	void setDlgIndex(int dlgIndex) override;
 
 	int _npcTalkChpIndex;
@@ -615,9 +616,6 @@ protected:
 
 	EMCData _npcScriptData;
 
-	// pathfinder
-	uint8 *_unkBuf500Bytes;
-	uint8 *_unkBuf200kByte;
 	bool _chatAltFlag;
 
 	// sequence player
diff --git a/engines/kyra/engine/kyra_mr.cpp b/engines/kyra/engine/kyra_mr.cpp
index a1c0108bd2..50be26b3bf 100644
--- a/engines/kyra/engine/kyra_mr.cpp
+++ b/engines/kyra/engine/kyra_mr.cpp
@@ -1065,7 +1065,7 @@ void KyraEngine_MR::updateWithText() {
 
 	restorePage3();
 	drawAnimObjects();
-	if (_chatTextEnabled && _chatText) {
+	if (_chatTextEnabled && !_chatText.empty()) {
 		int curPage = _screen->_curPage;
 		_screen->_curPage = 2;
 		objectChatPrintText(_chatText, _chatObject);
diff --git a/engines/kyra/engine/kyra_mr.h b/engines/kyra/engine/kyra_mr.h
index a99b77214e..32c1e06f2f 100644
--- a/engines/kyra/engine/kyra_mr.h
+++ b/engines/kyra/engine/kyra_mr.h
@@ -419,7 +419,7 @@ private:
 
 	void objectChat(const char *text, int object, int vocHigh, int vocLow);
 	void objectChatInit(const char *text, int object, int vocHigh, int vocLow);
-	void objectChatPrintText(const char *text, int object);
+	void objectChatPrintText(const Common::String &text, int object);
 	void objectChatProcess(const char *script);
 	void objectChatWaitToFinish();
 
diff --git a/engines/kyra/engine/kyra_v2.cpp b/engines/kyra/engine/kyra_v2.cpp
index e606a66c15..c9ee314001 100644
--- a/engines/kyra/engine/kyra_v2.cpp
+++ b/engines/kyra/engine/kyra_v2.cpp
@@ -61,7 +61,7 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags, const Engi
 	_vocHigh = -1;
 	_chatVocHigh = -1;
 	_chatVocLow = -1;
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	_chatTextEnabled = false;
 
@@ -150,7 +150,7 @@ void KyraEngine_v2::delay(uint32 amount, bool updateGame, bool isMainLoop) {
 	uint32 start = _system->getMillis();
 	do {
 		if (updateGame) {
-			if (_chatText)
+			if (!_chatText.empty())
 				updateWithText();
 			else
 				update();
diff --git a/engines/kyra/engine/kyra_v2.h b/engines/kyra/engine/kyra_v2.h
index 39acda323d..24f8fec572 100644
--- a/engines/kyra/engine/kyra_v2.h
+++ b/engines/kyra/engine/kyra_v2.h
@@ -343,7 +343,7 @@ protected:
 	// chat
 	int _vocHigh;
 
-	const char *_chatText;
+	Common::String _chatText;
 	int _chatObject;
 	uint32 _chatEndTime;
 	int _chatVocHigh, _chatVocLow;
diff --git a/engines/kyra/engine/timer_hof.cpp b/engines/kyra/engine/timer_hof.cpp
index 1973e2e593..7a1d611e47 100644
--- a/engines/kyra/engine/timer_hof.cpp
+++ b/engines/kyra/engine/timer_hof.cpp
@@ -37,7 +37,7 @@ void KyraEngine_HoF::setupTimers() {
 }
 
 void KyraEngine_HoF::timerFadeOutMessage(int arg) {
-	if (_shownMessage)
+	if (!_shownMessage.empty())
 		_fadeMessagePalette = 1;
 }
 
diff --git a/engines/kyra/engine/util.cpp b/engines/kyra/engine/util.cpp
index ae5b833858..425203c8e9 100644
--- a/engines/kyra/engine/util.cpp
+++ b/engines/kyra/engine/util.cpp
@@ -113,6 +113,28 @@ void Util::convertISOToDOS(char &c) {
 	c = code;
 }
 
+Common::String Util::convertISOToDOS(const Common::String &str) {
+	char *tmp = new char[str.size() + 1];
+
+	memcpy(tmp, str.c_str(), str.size() + 1);
+	convertISOToDOS(tmp);
+	Common::String res = tmp;
+	delete[] tmp;
+	return res;
+}
+
+Common::String Util::decodeString1(const Common::String &src) {
+	char *tmp = new char[src.size() * 2 + 2];
+	Util::decodeString1(src.c_str(), tmp);
+	return tmp;
+}
+
+Common::String Util::decodeString2(const Common::String &src) {
+	char *tmp = new char[src.size() * 2 + 2];
+	Util::decodeString2(src.c_str(), tmp);
+	return tmp;
+}
+
 // CP850 to ISO-8859-1 (borrowed from engines/saga/font_map.cpp)
 const uint8 Util::_charMapDOSToISO[128] = {
 	199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232,
diff --git a/engines/kyra/engine/util.h b/engines/kyra/engine/util.h
index 130768f89d..5858d4d509 100644
--- a/engines/kyra/engine/util.h
+++ b/engines/kyra/engine/util.h
@@ -24,6 +24,7 @@
 #define KYRA_UTIL_H
 
 #include "common/scummsys.h"
+#include "common/str.h"
 
 namespace Kyra {
 
@@ -31,12 +32,16 @@ class Util {
 public:
 	static int decodeString1(const char *src, char *dst);
 	static void decodeString2(const char *src, char *dst);
+	static Common::String decodeString1(const Common::String &src);
+	static Common::String decodeString2(const Common::String &src);
+	
 
 	// Since our current GUI font uses ISO-8859-1, this
 	// conversion functionallty uses that as a base.
 	static void convertDOSToISO(char *str);
 	static void convertISOToDOS(char *str);
 	static void convertISOToDOS(char &c);
+	static Common::String convertISOToDOS(const Common::String &str);
 
 private:
 	static const uint8 _charMapDOSToISO[128];
diff --git a/engines/kyra/gui/gui_hof.cpp b/engines/kyra/gui/gui_hof.cpp
index ebfb133006..ec581a8ab0 100644
--- a/engines/kyra/gui/gui_hof.cpp
+++ b/engines/kyra/gui/gui_hof.cpp
@@ -79,16 +79,19 @@ void KyraEngine_HoF::setupLangButtonShapes() {
 GUI_HoF::GUI_HoF(KyraEngine_HoF *vm) : GUI_v2(vm), _vm(vm), _screen(_vm->_screen) {
 }
 
-const char *GUI_HoF::getMenuTitle(const Menu &menu) {
+Common::String GUI_HoF::getMenuTitle(const Menu &menu) {
 	if (!menu.menuNameId)
-		return 0;
+		return Common::String();
 
 	return _vm->getTableString(menu.menuNameId, _vm->_optionsBuffer, true);
 }
 
-const char *GUI_HoF::getMenuItemTitle(const MenuItem &menuItem) {
+Common::String GUI_HoF::getMenuItemTitle(const MenuItem &menuItem) {
+	if (menuItem.useItemString)
+		return menuItem.itemString;
+
 	if (!menuItem.itemId)
-		return 0;
+		return Common::String();
 
 	// Strings 41-45 are menu labels, those must be handled uncompressed!
 	if (menuItem.itemId >= 41 && menuItem.itemId <= 45)
@@ -97,14 +100,14 @@ const char *GUI_HoF::getMenuItemTitle(const MenuItem &menuItem) {
 		return _vm->getTableString(menuItem.itemId, _vm->_optionsBuffer, true);
 }
 
-const char *GUI_HoF::getMenuItemLabel(const MenuItem &menuItem) {
+Common::String GUI_HoF::getMenuItemLabel(const MenuItem &menuItem) {
 	if (!menuItem.labelId)
-		return 0;
+		return Common::String();
 
 	return _vm->getTableString(menuItem.labelId, _vm->_optionsBuffer, 1);
 }
 
-char *GUI_HoF::getTableString(int id, bool decode) {
+Common::String GUI_HoF::getTableString(int id, bool decode) {
 	return _vm->getTableString(id, _vm->_optionsBuffer, decode);
 }
 
diff --git a/engines/kyra/gui/gui_hof.h b/engines/kyra/gui/gui_hof.h
index 144ea65a5e..658d361f63 100644
--- a/engines/kyra/gui/gui_hof.h
+++ b/engines/kyra/gui/gui_hof.h
@@ -41,9 +41,9 @@ public:
 
 	void createScreenThumbnail(Graphics::Surface &dst) override;
 private:
-	const char *getMenuTitle(const Menu &menu) override;
-	const char *getMenuItemTitle(const MenuItem &menuItem) override;
-	const char *getMenuItemLabel(const MenuItem &menuItem) override;
+	Common::String getMenuTitle(const Menu &menu) override;
+	Common::String getMenuItemTitle(const MenuItem &menuItem) override;
+	Common::String getMenuItemLabel(const MenuItem &menuItem) override;
 
 	uint8 defaultColor1() const override { return 0xCF; }
 	uint8 defaultColor2() const override { return 0xF8; }
@@ -57,7 +57,7 @@ private:
 
 	void resetState(int item);
 
-	char *getTableString(int id, bool decode) override;
+	Common::String getTableString(int id, bool decode) override;
 
 	KyraEngine_HoF *_vm;
 	Screen_HoF *_screen;
diff --git a/engines/kyra/gui/gui_lok.cpp b/engines/kyra/gui/gui_lok.cpp
index 6c0d60dd0d..680e72c75a 100644
--- a/engines/kyra/gui/gui_lok.cpp
+++ b/engines/kyra/gui/gui_lok.cpp
@@ -745,7 +745,7 @@ int GUI_LoK::saveGame(Button *button) {
 	} else {
 		for (int i = 0; i < 5; i++) {
 			if (_menu[2].item[i].saveSlot == _vm->_gameToLoad) {
-				Common::strlcpy(_savegameName, _menu[2].item[i].itemString, 31);
+				Common::strlcpy(_savegameName, _menu[2].item[i].itemString.c_str(), 31);
 				break;
 			}
 		}
diff --git a/engines/kyra/gui/gui_lok.h b/engines/kyra/gui/gui_lok.h
index 3a277b3c5d..56b6206f4f 100644
--- a/engines/kyra/gui/gui_lok.h
+++ b/engines/kyra/gui/gui_lok.h
@@ -72,7 +72,7 @@ namespace Kyra {
 #define GUI_V1_MENU_ITEM(item, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) \
 	do { \
 		item.enabled = a; \
-		item.itemString = d; \
+		item.itemString = ""; \
 		item.x = e; \
 		item.y = g; \
 		item.width = h; \
@@ -153,9 +153,9 @@ private:
 	uint8 defaultColor1() const override { return 12; }
 	uint8 defaultColor2() const override { return 248; }
 
-	const char *getMenuTitle(const Menu &menu) override { return menu.menuNameString; }
-	const char *getMenuItemTitle(const MenuItem &menuItem) override { return menuItem.itemString; }
-	const char *getMenuItemLabel(const MenuItem &menuItem) override { return menuItem.labelString; }
+	Common::String getMenuTitle(const Menu &menu) override { return menu.menuNameString; }
+	Common::String getMenuItemTitle(const MenuItem &menuItem) override { return menuItem.itemString; }
+	Common::String getMenuItemLabel(const MenuItem &menuItem) override { return menuItem.labelString; }
 
 	KyraEngine_LoK *_vm;
 	Screen_LoK *_screen;
diff --git a/engines/kyra/gui/gui_lol.cpp b/engines/kyra/gui/gui_lol.cpp
index 1ef0eeb0e8..42cfaccf33 100644
--- a/engines/kyra/gui/gui_lol.cpp
+++ b/engines/kyra/gui/gui_lol.cpp
@@ -2542,15 +2542,15 @@ void GUI_LoL::sortSaveSlots() {
 	Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
 }
 
-void GUI_LoL::printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags) {
-	_screen->fprintString("%s", x, y, c0, c1, _vm->gameFlags().use16ColorMode ? (flags & 3) : flags , str);
+void GUI_LoL::printMenuText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 flags) {
+	_screen->fprintString("%s", x, y, c0, c1, _vm->gameFlags().use16ColorMode ? (flags & 3) : flags , str.c_str());
 }
 
-int GUI_LoL::getMenuCenterStringX(const char *str, int x1, int x2) {
-	if (!str)
+int GUI_LoL::getMenuCenterStringX(const Common::String &str, int x1, int x2) {
+	if (str.empty())
 		return 0;
 
-	int strWidth = _screen->getTextWidth(str);
+	int strWidth = _screen->getTextWidth(str.c_str());
 	int w = x2 - x1 + 1;
 	return x1 + (w - strWidth) / 2;
 }
@@ -2672,7 +2672,7 @@ int GUI_LoL::clickedSaveMenu(Button *button) {
 	_saveDescription = (char *)_vm->_tempBuffer5120 + 1000;
 	_saveDescription[0] = 0;
 	if (_saveMenu.item[-s - 2].saveSlot != -3) {
-		strcpy(_saveDescription, _saveMenu.item[-s - 2].itemString);
+		strcpy(_saveDescription, _saveMenu.item[-s - 2].itemString.c_str());
 	} else if (_vm->_autoSaveNamesEnabled) {
 		TimeDate td;
 		g_system->getTimeAndDate(td);
@@ -2904,21 +2904,23 @@ int GUI_LoL::scrollDown(Button *button) {
 	return 1;
 }
 
-const char *GUI_LoL::getMenuTitle(const Menu &menu) {
+Common::String GUI_LoL::getMenuTitle(const Menu &menu) {
 	if (!menu.menuNameId)
 		return 0;
 	return _vm->getLangString(menu.menuNameId);
 }
 
-const char *GUI_LoL::getMenuItemTitle(const MenuItem &menuItem) {
-	if (menuItem.itemId & 0x8000 && menuItem.itemString)
+Common::String GUI_LoL::getMenuItemTitle(const MenuItem &menuItem) {
+    	if (menuItem.useItemString)
+		return menuItem.itemString;
+	if (menuItem.itemId & 0x8000 && !menuItem.itemString.empty())
 		return menuItem.itemString;
 	else if (menuItem.itemId & 0x8000 || !menuItem.itemId)
 		return 0;
 	return _vm->getLangString(menuItem.itemId);
 }
 
-const char *GUI_LoL::getMenuItemLabel(const MenuItem &menuItem) {
+Common::String GUI_LoL::getMenuItemLabel(const MenuItem &menuItem) {
 	if (menuItem.labelId & 0x8000 && menuItem.labelString)
 		return menuItem.labelString;
 	else if (menuItem.labelId & 0x8000 || !menuItem.labelId)
diff --git a/engines/kyra/gui/gui_lol.h b/engines/kyra/gui/gui_lol.h
index 86b47a8dae..f550dd079c 100644
--- a/engines/kyra/gui/gui_lol.h
+++ b/engines/kyra/gui/gui_lol.h
@@ -60,7 +60,7 @@ namespace Kyra {
 	do { \
 		item.enabled = 1; \
 		item.itemId = a; \
-		item.itemString = 0; \
+		item.itemString = ""; \
 		item.x = b; \
 		item.y = c; \
 		item.width = d; \
@@ -113,8 +113,8 @@ private:
 
 	void setupSaveMenuSlots(Menu &menu, int num);
 
-	void printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags) override;
-	int getMenuCenterStringX(const char *str, int x1, int x2) override;
+	void printMenuText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 flags) override;
+	int getMenuCenterStringX(const Common::String &str, int x1, int x2) override;
 
 	int getInput();
 
@@ -142,9 +142,9 @@ private:
 	uint8 defaultColor1() const override { return 0xFE; }
 	uint8 defaultColor2() const override { return 0x00; }
 
-	const char *getMenuTitle(const Menu &menu) override;
-	const char *getMenuItemTitle(const MenuItem &menuItem) override;
-	const char *getMenuItemLabel(const MenuItem &menuItem) override;
+	Common::String getMenuTitle(const Menu &menu) override;
+	Common::String getMenuItemTitle(const MenuItem &menuItem) override;
+	Common::String getMenuItemLabel(const MenuItem &menuItem) override;
 
 	Button _menuButtons[10];
 	Button _scrollUpButton;
diff --git a/engines/kyra/gui/gui_mr.cpp b/engines/kyra/gui/gui_mr.cpp
index 7f06941e42..a1ad7b1cdb 100644
--- a/engines/kyra/gui/gui_mr.cpp
+++ b/engines/kyra/gui/gui_mr.cpp
@@ -489,7 +489,7 @@ int KyraEngine_MR::buttonInventory(Button *button) {
 		_itemInHand = slotItem;
 		_mainCharacter.inventory[slot] = kItemNone;
 	} else if (_itemInHand == 27) {
-		if (_chatText)
+		if (!_chatText.empty())
 			return 0;
 		return buttonJesterStaff(&_mainButtonData[3]);
 	} else {
@@ -1062,29 +1062,32 @@ void GUI_MR::flagButtonDisable(Button *button) {
 	}
 }
 
-const char *GUI_MR::getMenuTitle(const Menu &menu) {
+Common::String GUI_MR::getMenuTitle(const Menu &menu) {
 	if (!menu.menuNameId)
-		return 0;
+		return Common::String();
 
 	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menu.menuNameId);
 }
 
-const char *GUI_MR::getMenuItemTitle(const MenuItem &menuItem) {
+Common::String GUI_MR::getMenuItemTitle(const MenuItem &menuItem) {
+	if (menuItem.useItemString)
+		return menuItem.itemString;
+
 	if (!menuItem.itemId)
-		return 0;
+		return Common::String();
 
 	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menuItem.itemId);
 }
 
-const char *GUI_MR::getMenuItemLabel(const MenuItem &menuItem) {
+Common::String GUI_MR::getMenuItemLabel(const MenuItem &menuItem) {
 	if (!menuItem.labelId)
-		return 0;
+		return Common::String();
 
 	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menuItem.labelId);
 }
 
-char *GUI_MR::getTableString(int id, bool) {
-	return (char *)_vm->getTableEntry(_vm->_optionsFile, id);
+Common::String GUI_MR::getTableString(int id, bool) {
+	return Common::String((char *)_vm->getTableEntry(_vm->_optionsFile, id));
 }
 
 int GUI_MR::redrawButtonCallback(Button *button) {
diff --git a/engines/kyra/gui/gui_mr.h b/engines/kyra/gui/gui_mr.h
index 63cfc5d05f..80b31d625f 100644
--- a/engines/kyra/gui/gui_mr.h
+++ b/engines/kyra/gui/gui_mr.h
@@ -47,10 +47,10 @@ public:
 
 	void createScreenThumbnail(Graphics::Surface &dst) override;
 private:
-	const char *getMenuTitle(const Menu &menu) override;
-	const char *getMenuItemTitle(const MenuItem &menuItem) override;
-	const char *getMenuItemLabel(const MenuItem &menuItem) override;
-	char *getTableString(int id, bool) override;
+	Common::String getMenuTitle(const Menu &menu) override;
+	Common::String getMenuItemTitle(const MenuItem &menuItem) override;
+	Common::String getMenuItemLabel(const MenuItem &menuItem) override;
+	Common::String getTableString(int id, bool) override;
 
 	uint8 textFieldColor1() const override { return 0xFF; }
 	uint8 textFieldColor2() const override { return 0xCF; }
diff --git a/engines/kyra/gui/gui_v1.cpp b/engines/kyra/gui/gui_v1.cpp
index d3e4bc565f..f322e30a00 100644
--- a/engines/kyra/gui/gui_v1.cpp
+++ b/engines/kyra/gui/gui_v1.cpp
@@ -123,7 +123,7 @@ void GUI_v1::initMenu(Menu &menu) {
 		_screen->fillRect(x1, y1, x2, y2, menu.item[i].bkgdColor);
 		_screen->drawShadedBox(x1, y1, x2, y2, menu.item[i].color1, menu.item[i].color2);
 
-		if (getMenuItemTitle(menu.item[i])) {
+		if (!getMenuItemTitle(menu.item[i]).empty()) {
 			if (menu.item[i].titleX != -1)
 				textX = x1 + menu.item[i].titleX + 3;
 			else
@@ -155,7 +155,7 @@ void GUI_v1::initMenu(Menu &menu) {
 	}
 
 	for (int i = 0; i < menu.numberOfItems; ++i) {
-		if (getMenuItemLabel(menu.item[i])) {
+		if (!getMenuItemLabel(menu.item[i]).empty()) {
 			if (_vm->game() == GI_LOL) {
 				menu.item[i].labelX = menu.item[i].x - 1;
 				menu.item[i].labelY = menu.item[i].y + 3;
@@ -404,12 +404,12 @@ void GUI_v1::checkTextfieldInput() {
 	_vm->_system->delayMillis(3);
 }
 
-void GUI_v1::printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
-	_text->printText(str, x, y, c0, c1, c2);
+void GUI_v1::printMenuText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
+	_text->printText(str.c_str(), x, y, c0, c1, c2);
 }
 
-int GUI_v1::getMenuCenterStringX(const char *str, int x1, int x2) {
-	return _text->getCenterStringX(str, x1, x2);
+int GUI_v1::getMenuCenterStringX(const Common::String &str, int x1, int x2) {
+	return _text->getCenterStringX(str.c_str(), x1, x2);
 }
 
 #pragma mark -
diff --git a/engines/kyra/gui/gui_v1.h b/engines/kyra/gui/gui_v1.h
index 0ca3175739..8d34bdba26 100644
--- a/engines/kyra/gui/gui_v1.h
+++ b/engines/kyra/gui/gui_v1.h
@@ -30,8 +30,9 @@ namespace Kyra {
 struct MenuItem {
 	bool enabled;
 
-	const char *itemString;
+	Common::String itemString;
 	uint16 itemId;
+	bool useItemString;
 
 	int16 x, y;
 	uint16 width, height;
@@ -110,8 +111,8 @@ protected:
 	bool _displaySubMenu;
 	bool _cancelSubMenu;
 
-	virtual void printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
-	virtual int getMenuCenterStringX(const char *str, int x1, int x2);
+	virtual void printMenuText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
+	virtual int getMenuCenterStringX(const Common::String &str, int x1, int x2);
 
 	Button::Callback _redrawShadedButtonFunctor;
 	Button::Callback _redrawButtonFunctor;
@@ -126,9 +127,9 @@ protected:
 	virtual uint8 defaultColor1() const = 0;
 	virtual uint8 defaultColor2() const = 0;
 
-	virtual const char *getMenuTitle(const Menu &menu) = 0;
-	virtual const char *getMenuItemTitle(const MenuItem &menuItem) = 0;
-	virtual const char *getMenuItemLabel(const MenuItem &menuItem) = 0;
+	virtual Common::String getMenuTitle(const Menu &menu) = 0;
+	virtual Common::String getMenuItemTitle(const MenuItem &menuItem) = 0;
+	virtual Common::String getMenuItemLabel(const MenuItem &menuItem) = 0;
 
 	void updateAllMenuButtons();
 	void updateMenuButton(Button *button);
diff --git a/engines/kyra/gui/gui_v2.cpp b/engines/kyra/gui/gui_v2.cpp
index 59f2b6cf20..608eabf66f 100644
--- a/engines/kyra/gui/gui_v2.cpp
+++ b/engines/kyra/gui/gui_v2.cpp
@@ -430,7 +430,8 @@ void GUI_v2::restorePage1(const uint8 *buffer) {
 
 void GUI_v2::setupSavegameNames(Menu &menu, int num) {
 	for (int i = 0; i < num; ++i) {
-		strcpy(getTableString(menu.item[i].itemId), "");
+		menu.item[i].useItemString = true;
+		menu.item[i].itemString = "";
 		menu.item[i].saveSlot = -1;
 		menu.item[i].enabled = false;
 	}
@@ -443,36 +444,35 @@ void GUI_v2::setupSavegameNames(Menu &menu, int num) {
 	Common::InSaveFile *in;
 	for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); ++i) {
 		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header)) != 0) {
-			char *s = getTableString(menu.item[i].itemId);
-			Common::strlcpy(s, header.description.c_str(), 80);
-			Util::convertISOToDOS(s);
+			Common::String s = header.description;
+			s = Util::convertISOToDOS(s);
 
 			// Trim long GMM save descriptions to fit our save slots
 			_screen->_charSpacing = -2;
-			int fC = _screen->getTextWidth(s);
-			while (s[0] && fC > 240) {
-				s[strlen(s) - 1]  = 0;
-				fC = _screen->getTextWidth(s);
+			int fC = _screen->getTextWidth(s.c_str());
+			while (!s.empty() && fC > 240) {
+				s.deleteLastChar();
+				fC = _screen->getTextWidth(s.c_str());
 			}
 			_screen->_charSpacing = 0;
 
 			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
 			menu.item[i].enabled = true;
+			menu.item[i].useItemString = true;
+			menu.item[i].itemString = s;
 			delete in;
 		}
 	}
 
 	if (_savegameOffset == 0) {
 		if (_isSaveMenu) {
-			char *dst = getTableString(menu.item[0].itemId);
-			const char *src = getTableString(_vm->gameFlags().isTalkie ? 10 : 18);
-			strcpy(dst, src);
 			menu.item[0].saveSlot = -2;
 			menu.item[0].enabled = true;
+			menu.item[0].useItemString = true;
+			menu.item[0].itemString = getTableString(_vm->gameFlags().isTalkie ? 10 : 18);
 		} else {
-			char *dst = getTableString(menu.item[0].itemId);
-			const char *src = getTableString(_vm->gameFlags().isTalkie ? 34 : 42, _vm->gameFlags().lang == Common::RU_RUS);
-			strcpy(dst, src);
+			menu.item[0].useItemString = true;
+			menu.item[0].itemString = getTableString(_vm->gameFlags().isTalkie ? 34 : 42, _vm->gameFlags().lang == Common::RU_RUS);
 		}
 	}
 }
@@ -644,7 +644,7 @@ int GUI_v2::clickSaveSlot(Button *caller) {
 			return 0;
 		} else {
 			_saveSlot = item.saveSlot;
-			strcpy(_saveDescription, getTableString(item.itemId));
+			strcpy(_saveDescription, getTableString(item.itemId).c_str());
 		}
 	} else if (item.saveSlot == -2) {
 		_saveSlot = getNextSavegameSlot();
diff --git a/engines/kyra/gui/gui_v2.h b/engines/kyra/gui/gui_v2.h
index d8b7c823d3..8668599638 100644
--- a/engines/kyra/gui/gui_v2.h
+++ b/engines/kyra/gui/gui_v2.h
@@ -79,6 +79,7 @@ namespace Kyra {
 	do { \
 		item.enabled = a; \
 		item.itemId = b; \
+		item.useItemString = false; \
 		item.x = c; \
 		item.y = d; \
 		item.width = e; \
@@ -125,7 +126,7 @@ protected:
 	virtual void setupPalette() {}
 	virtual void restorePalette() {}
 
-	virtual char *getTableString(int id, bool decode = false) = 0;
+	virtual Common::String getTableString(int id, bool decode = false) = 0;
 
 	virtual uint8 textFieldColor1() const = 0;
 	virtual uint8 textFieldColor2() const = 0;
diff --git a/engines/kyra/script/script_hof.cpp b/engines/kyra/script/script_hof.cpp
index 74c0638dde..51bc962602 100644
--- a/engines/kyra/script/script_hof.cpp
+++ b/engines/kyra/script/script_hof.cpp
@@ -1155,8 +1155,7 @@ int KyraEngine_HoF::o2_mushroomEffect(EMCState *script) {
 
 int KyraEngine_HoF::o2_customChat(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_customChat(%p) ('%s', %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2));
-	strcpy((char *)_unkBuf500Bytes, stackPosString(0));
-	_chatText = (char *)_unkBuf500Bytes;
+	_chatText = stackPosString(0);
 	_chatObject = stackPos(1);
 
 	_chatVocHigh = _chatVocLow = -1;
@@ -1168,7 +1167,7 @@ int KyraEngine_HoF::o2_customChat(EMCState *script) {
 int KyraEngine_HoF::o2_customChatFinish(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_customChatFinish(%p) ()", (const void *)script);
 	_text->restoreScreen();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	return 0;
 }
@@ -1452,7 +1451,7 @@ int KyraEngine_HoF::t2_initChat(const TIM *tim, const uint16 *param) {
 
 	if (_flags.lang == Common::JA_JPN) {
 		for (int i = 0; i < _ingameTimJpStrSize; i += 2) {
-			if (!scumm_stricmp(_chatText, _ingameTimJpStr[i]))
+		    if (!scumm_stricmp(_chatText.c_str(), _ingameTimJpStr[i]))
 				_chatText = _ingameTimJpStr[i + 1];
 		}
 	}
@@ -1470,7 +1469,7 @@ int KyraEngine_HoF::t2_updateSceneAnim(const TIM *tim, const uint16 *param) {
 int KyraEngine_HoF::t2_resetChat(const TIM *tim, const uint16 *param) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::t2_resetChat(%p, %p) ()", (const void *)tim, (const void *)param);
 	_text->restoreScreen();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	return 0;
 }
diff --git a/engines/kyra/script/script_mr.cpp b/engines/kyra/script/script_mr.cpp
index f06b263552..2f5cc81f75 100644
--- a/engines/kyra/script/script_mr.cpp
+++ b/engines/kyra/script/script_mr.cpp
@@ -1055,7 +1055,7 @@ int KyraEngine_MR::o3_customChat(EMCState *script) {
 int KyraEngine_MR::o3_customChatFinish(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_customChatFinish(%p) ()", (const void *)script);
 	_text->restoreScreen();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	return 0;
 }
diff --git a/engines/kyra/script/script_v2.cpp b/engines/kyra/script/script_v2.cpp
index c8168a3353..8177d14f6f 100644
--- a/engines/kyra/script/script_v2.cpp
+++ b/engines/kyra/script/script_v2.cpp
@@ -125,7 +125,7 @@ int KyraEngine_v2::o2_delay(EMCState *script) {
 			if (inputFlag == 198 || inputFlag == 199)
 				return 1;
 
-			if (_chatText)
+			if (!_chatText.empty())
 				updateWithText();
 			else
 				update();
@@ -140,7 +140,7 @@ int KyraEngine_v2::o2_delay(EMCState *script) {
 int KyraEngine_v2::o2_update(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_update(%p) (%d)", (const void *)script, stackPos(0));
 	for (int times = stackPos(0); times != 0; --times) {
-		if (_chatText)
+		if (!_chatText.empty())
 			updateWithText();
 		else
 			update();
diff --git a/engines/kyra/sequence/sequences_mr.cpp b/engines/kyra/sequence/sequences_mr.cpp
index 090610c434..286db2736d 100644
--- a/engines/kyra/sequence/sequences_mr.cpp
+++ b/engines/kyra/sequence/sequences_mr.cpp
@@ -178,7 +178,7 @@ void KyraEngine_MR::hideGoodConscience() {
 }
 
 void KyraEngine_MR::eelScript() {
-	if (_chatText)
+	if (!_chatText.empty())
 		return;
 	_screen->hideMouse();
 
diff --git a/engines/kyra/sequence/sequences_v2.cpp b/engines/kyra/sequence/sequences_v2.cpp
index e9648c08a3..5e08849a22 100644
--- a/engines/kyra/sequence/sequences_v2.cpp
+++ b/engines/kyra/sequence/sequences_v2.cpp
@@ -92,7 +92,7 @@ void KyraEngine_v2::processAnimationScript(int allowSkip, int resetChar) {
 
 		_mainCharacter.animFrame = _animNewFrame + _desc.animScriptFrameAdd;
 		updateCharacterAnim(0);
-		if (_chatText)
+		if (!_chatText.empty())
 			updateWithText();
 		else
 			update();
@@ -114,7 +114,7 @@ void KyraEngine_v2::processAnimationScript(int allowSkip, int resetChar) {
 		if (_animResetFrame >= 0) {
 			_mainCharacter.animFrame = _animResetFrame + _desc.animScriptFrameAdd;
 			updateCharacterAnim(0);
-			if (_chatText)
+			if (!_chatText.empty())
 				updateWithText();
 			else
 				update();
diff --git a/engines/kyra/text/text.cpp b/engines/kyra/text/text.cpp
index 4ffdffe800..6e0f9ccd82 100644
--- a/engines/kyra/text/text.cpp
+++ b/engines/kyra/text/text.cpp
@@ -43,9 +43,9 @@ void TextDisplayer::setTalkCoords(uint16 y) {
 	_talkCoords.y = y;
 }
 
-int TextDisplayer::getCenterStringX(const char *str, int x1, int x2) {
+int TextDisplayer::getCenterStringX(const Common::String &str, int x1, int x2) {
 	_screen->_charSpacing = -2;
-	int strWidth = _screen->getTextWidth(str);
+	int strWidth = _screen->getTextWidth(str.c_str());
 	_screen->_charSpacing = 0;
 	int w = x2 - x1 + 1;
 	return x1 + (w - strWidth) / 2;
@@ -203,21 +203,19 @@ void TextDisplayer::printTalkTextMessage(const char *text, int x, int y, uint8 c
 	_talkMessagePrinted = true;
 }
 
-void TextDisplayer::printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
-	char revBuffer[384];
-	memset(revBuffer, 0, sizeof(revBuffer));
+void TextDisplayer::printText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
+	Common::String revBuffer;
+	const char *tmp = str.c_str();
 	if (_vm->gameFlags().lang == Common::HE_ISR) {
-		int len = strlen(str);
-		for (int i = 0; i < len; i++) {
-			revBuffer[i] = str[len - i - 1];
-		}
-		str = revBuffer;
+		for (int i = str.size() - 1; i >= 0; --i)
+			revBuffer += str[i];
+		tmp = revBuffer.c_str();
 	}
 	uint8 colorMap[] = { 0, 15, 12, 12 };
 	colorMap[3] = c1;
 	_screen->setTextColor(colorMap, 0, 3);
 	_screen->_charSpacing = -2;
-	_screen->printText(str, x, y, c0, c2);
+	_screen->printText(tmp, x, y, c0, c2);
 	_screen->_charSpacing = 0;
 }
 
diff --git a/engines/kyra/text/text.h b/engines/kyra/text/text.h
index 3ea51c389c..27dbfe48ca 100644
--- a/engines/kyra/text/text.h
+++ b/engines/kyra/text/text.h
@@ -38,7 +38,7 @@ public:
 	int maxSubstringLen() const { return TALK_SUBSTRING_LEN; }
 
 	void setTalkCoords(uint16 y);
-	int getCenterStringX(const char *str, int x1, int x2);
+	int getCenterStringX(const Common::String &str, int x1, int x2);
 	int getCharLength(const char *str, int len);
 	int dropCRIntoString(char *str, int offs);
 	virtual char *preprocessString(const char *str);
@@ -47,7 +47,7 @@ public:
 	virtual void calcWidestLineBounds(int &x1, int &x2, int w, int cx);
 	virtual void restoreTalkTextMessageBkgd(int srcPage, int dstPage);
 	void printTalkTextMessage(const char *text, int x, int y, uint8 color, int srcPage, int dstPage);
-	virtual void printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
+	virtual void printText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2);
 	void printCharacterText(const char *text, int8 charNum, int charX);
 
 	uint16 _talkMessageY;
diff --git a/engines/kyra/text/text_hof.cpp b/engines/kyra/text/text_hof.cpp
index cc3f517c63..dad25b7b4d 100644
--- a/engines/kyra/text/text_hof.cpp
+++ b/engines/kyra/text/text_hof.cpp
@@ -150,15 +150,15 @@ int KyraEngine_HoF::chatGetType(const char *str) {
 	}
 }
 
-int KyraEngine_HoF::chatCalcDuration(const char *str) {
+int KyraEngine_HoF::chatCalcDuration(const Common::String &str) {
 	static const uint8 durationMultiplicator[] = { 16, 14, 12, 10, 8, 8, 7, 6, 5, 4 };
 
-	int duration = strlen(str);
+	int duration = str.size();
 	duration *= _flags.isTalkie ? 8 : durationMultiplicator[(_configTextspeed / 10)];
 	return MAX<int>(duration, 120);
 }
 
-void KyraEngine_HoF::objectChat(const char *str, int object, int vocHigh, int vocLow) {
+void KyraEngine_HoF::objectChat(const Common::String &str, int object, int vocHigh, int vocLow) {
 	setNextIdleAnimTimer();
 
 	_chatVocHigh = _chatVocLow = -1;
@@ -166,7 +166,7 @@ void KyraEngine_HoF::objectChat(const char *str, int object, int vocHigh, int vo
 	objectChatInit(str, object, vocHigh, vocLow);
 	_chatText = str;
 	_chatObject = object;
-	int chatType = chatGetType(str);
+	int chatType = chatGetType(str.c_str());
 	if (chatType == -1) {
 		_chatIsNote = true;
 		chatType = 0;
@@ -209,15 +209,15 @@ void KyraEngine_HoF::objectChat(const char *str, int object, int vocHigh, int vo
 	_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
 	updateCharacterAnim(0);
 
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 
 	setNextIdleAnimTimer();
 }
 
-void KyraEngine_HoF::objectChatInit(const char *str, int object, int vocHigh, int vocLow) {
-	str = _text->preprocessString(str);
-	int lineNum = _text->buildMessageSubstrings(str);
+void KyraEngine_HoF::objectChatInit(const Common::String &str0, int object, int vocHigh, int vocLow) {
+	Common::String str = _text->preprocessString(str0.c_str());
+	int lineNum = _text->buildMessageSubstrings(str.c_str());
 
 	int yPos = 0, xPos = 0;
 
@@ -259,17 +259,17 @@ void KyraEngine_HoF::objectChatInit(const char *str, int object, int vocHigh, in
 	}
 }
 
-void KyraEngine_HoF::objectChatPrintText(const char *str, int object) {
+void KyraEngine_HoF::objectChatPrintText(const Common::String &str0, int object) {
 	int c1 = _talkObjectList[object].color;
-	str = _text->preprocessString(str);
-	int lineNum = _text->buildMessageSubstrings(str);
+	Common::String str = _text->preprocessString(str0.c_str());
+	int lineNum = _text->buildMessageSubstrings(str.c_str());
 	int maxWidth = _text->getWidestLineWidth(lineNum);
 	int x = (object == 0) ? _mainCharacter.x1 : _talkObjectList[object].x;
 	int cX1 = 0, cX2 = 0;
 	_text->calcWidestLineBounds(cX1, cX2, maxWidth, x);
 
 	for (int i = 0; i < lineNum; ++i) {
-		str = &_text->_talkSubstrings[i*_text->maxSubstringLen()];
+		str = Common::String(&_text->_talkSubstrings[i*_text->maxSubstringLen()]);
 
 		int y = _text->_talkMessageY + i * 10;
 		x = _text->getCenterStringX(str, cX1, cX2);
@@ -498,6 +498,7 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) {
 			offs += 2;
 
 		} else {
+			Common::String str;
 			if (!_flags.isTalkie || cmd == 11) {
 				int len = READ_LE_UINT16(_dlgBuffer + offs);
 				offs += 2;
@@ -505,8 +506,7 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) {
 					vocLo = READ_LE_UINT16(_dlgBuffer + offs);
 					offs += 2;
 				}
-				memcpy(_unkBuf500Bytes, _dlgBuffer + offs, len);
-				_unkBuf500Bytes[len] = 0;
+				str = Common::String((const char *) _dlgBuffer + offs, len);
 				offs += len;
 				if (_flags.isTalkie)
 					continue;
@@ -518,18 +518,17 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) {
 				vocHi = irnv[vocH - 1] + csEntry;
 				vocLo = READ_LE_UINT16(_dlgBuffer + offs);
 				offs += 2;
-				memcpy(_unkBuf500Bytes, _dlgBuffer + offs, len);
-				_unkBuf500Bytes[len] = 0;
+				str = Common::String((const char *) _dlgBuffer + offs, len);
 				offs += len;
 			}
 
-			if (_unkBuf500Bytes[0]) {
+			if (!str.empty()) {
 				if ((!_flags.isTalkie && cmd == 11) || (_flags.isTalkie && cmd == 12)) {
 					if (activeTimSequence > -1) {
 						deinitTalkObject(activeTimSequence);
 						activeTimSequence = -1;
 					}
-					objectChat((const char *)_unkBuf500Bytes, 0, vocHi, vocLo);
+					objectChat(str, 0, vocHi, vocLo);
 				} else {
 					if (activeTimSequence != nextTimSequence) {
 						if (activeTimSequence > -1) {
@@ -539,7 +538,7 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) {
 						initTalkObject(nextTimSequence);
 						activeTimSequence = nextTimSequence;
 					}
-					npcChatSequence((const char *)_unkBuf500Bytes, nextTimSequence, vocHi, vocLo);
+					npcChatSequence(str, nextTimSequence, vocHi, vocLo);
 				}
 			}
 		}
@@ -578,7 +577,7 @@ void KyraEngine_HoF::initTalkObject(int index) {
 		_tim->resetFinishedFlag();
 		while (!shouldQuit() && !_tim->finished()) {
 			_tim->exec(_currentTalkSections.STATim, false);
-			if (_chatText)
+			if (!_chatText.empty())
 				updateWithText();
 			else
 				update();
@@ -594,7 +593,7 @@ void KyraEngine_HoF::deinitTalkObject(int index) {
 		_tim->resetFinishedFlag();
 		while (!shouldQuit() && !_tim->finished()) {
 			_tim->exec(_currentTalkSections.ENDTim, false);
-			if (_chatText)
+			if (!_chatText.empty())
 				updateWithText();
 			else
 				update();
@@ -610,7 +609,7 @@ void KyraEngine_HoF::deinitTalkObject(int index) {
 	_tim->unload(_currentTalkSections.ENDTim);
 }
 
-void KyraEngine_HoF::npcChatSequence(const char *str, int objectId, int vocHigh, int vocLow) {
+void KyraEngine_HoF::npcChatSequence(const Common::String &str, int objectId, int vocHigh, int vocLow) {
 	_chatText = str;
 	_chatObject = objectId;
 	objectChatInit(str, objectId, vocHigh, vocLow);
@@ -654,7 +653,7 @@ void KyraEngine_HoF::npcChatSequence(const char *str, int objectId, int vocHigh,
 	_tim->unload(_currentTalkSections.TLKTim);
 
 	_text->restoreScreen();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	setNextIdleAnimTimer();
 }
diff --git a/engines/kyra/text/text_mr.cpp b/engines/kyra/text/text_mr.cpp
index 1787cc58c5..941e5f12a6 100644
--- a/engines/kyra/text/text_mr.cpp
+++ b/engines/kyra/text/text_mr.cpp
@@ -127,7 +127,7 @@ int TextDisplayer_MR::dropCRIntoString(char *str, int minOffs, int maxOffs) {
 	return 0;
 }
 
-void TextDisplayer_MR::printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
+void TextDisplayer_MR::printText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2) {
 	if (_vm->_albumChatActive) {
 		c0 = 0xEE;
 		c1 = 0xE3;
@@ -138,7 +138,7 @@ void TextDisplayer_MR::printText(const char *str, int x, int y, uint8 c0, uint8
 	colorMap[3] = c1;
 	_screen->setTextColor(colorMap, 0, 3);
 	_screen->_charSpacing = -2;
-	_screen->printText(str, x, y, c0, c2);
+	_screen->printText(str.c_str(), x, y, c0, c2);
 	_screen->_charSpacing = 0;
 }
 
@@ -228,7 +228,7 @@ void KyraEngine_MR::objectChat(const char *str, int object, int vocHigh, int voc
 	// _mainCharacter.facing can not be 0xFF here, so this is safe.
 	_mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
 	updateCharacterAnim(0);
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 	setNextIdleAnimTimer();
 }
@@ -276,17 +276,17 @@ void KyraEngine_MR::objectChatInit(const char *str, int object, int vocHigh, int
 	}
 }
 
-void KyraEngine_MR::objectChatPrintText(const char *str, int object) {
+void KyraEngine_MR::objectChatPrintText(const Common::String &str0, int object) {
 	int c1 = _talkObjectList[object].color;
-	str = _text->preprocessString(str);
-	int lineNum = _text->buildMessageSubstrings(str);
+	Common::String str = _text->preprocessString(str0.c_str());
+	int lineNum = _text->buildMessageSubstrings(str.c_str());
 	int maxWidth = _text->getWidestLineWidth(lineNum);
 	int x = (object == 0) ? _mainCharacter.x1 : _talkObjectList[object].x;
 	int cX1 = 0, cX2 = 0;
 	_text->calcWidestLineBounds(cX1, cX2, maxWidth, x);
 
 	for (int i = 0; i < lineNum; ++i) {
-		str = &_text->_talkSubstrings[i*_text->maxSubstringLen()];
+		str = Common::String(&_text->_talkSubstrings[i*_text->maxSubstringLen()]);
 
 		int y = _text->_talkMessageY + i * 10;
 		x = _text->getCenterStringX(str, cX1, cX2);
@@ -377,7 +377,7 @@ void KyraEngine_MR::badConscienceChat(const char *str, int vocHigh, int vocLow)
 	updateSceneAnim(0x0E, _badConscienceFrameTable[_badConscienceAnim+16]);
 	_text->restoreScreen();
 	update();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 }
 
@@ -433,7 +433,7 @@ void KyraEngine_MR::goodConscienceChat(const char *str, int vocHigh, int vocLow)
 	updateSceneAnim(0x0F, _goodConscienceFrameTable[_goodConscienceAnim+10]);
 	_text->restoreScreen();
 	update();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 }
 
@@ -491,7 +491,7 @@ void KyraEngine_MR::albumChat(const char *str, int vocHigh, int vocLow) {
 	albumChatWaitToFinish();
 	_screen->showMouse();
 
-	_chatText = 0;
+	_chatText = "";
 	_chatObject = -1;
 }
 
@@ -824,7 +824,7 @@ void KyraEngine_MR::npcChatSequence(const char *str, int object, int vocHigh, in
 		}
 	}
 	_text->restoreScreen();
-	_chatText = 0;
+	_chatText = "";
 	_chatObject= - 1;
 }
 
diff --git a/engines/kyra/text/text_mr.h b/engines/kyra/text/text_mr.h
index 322039fc4d..388a5aea57 100644
--- a/engines/kyra/text/text_mr.h
+++ b/engines/kyra/text/text_mr.h
@@ -37,7 +37,7 @@ public:
 	char *preprocessString(const char *str) override;
 	int dropCRIntoString(char *str, int minOffs, int maxOffs);
 
-	void printText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2) override;
+	void printText(const Common::String &str, int x, int y, uint8 c0, uint8 c1, uint8 c2) override;
 
 	void restoreScreen();
 




More information about the Scummvm-git-logs mailing list