[Scummvm-git-logs] scummvm master -> 3a49ea6248089ece6aa2b611e8b235ce660e65bb

athrxx noreply at scummvm.org
Thu Sep 22 19:01:36 UTC 2022


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:
3a49ea6248 KYRA: reduce unsafe string ops


Commit: 3a49ea6248089ece6aa2b611e8b235ce660e65bb
    https://github.com/scummvm/scummvm/commit/3a49ea6248089ece6aa2b611e8b235ce660e65bb
Author: athrxx (athrxx at scummvm.org)
Date: 2022-09-22T21:01:16+02:00

Commit Message:
KYRA: reduce unsafe string ops

(replace all strcpy calls and similar fixes)

Changed paths:
    engines/kyra/engine/darkmoon.cpp
    engines/kyra/engine/eob.cpp
    engines/kyra/engine/eobcommon.cpp
    engines/kyra/engine/eobcommon.h
    engines/kyra/engine/kyra_hof.cpp
    engines/kyra/engine/kyra_hof.h
    engines/kyra/engine/kyra_mr.cpp
    engines/kyra/engine/kyra_rpg.h
    engines/kyra/engine/lol.cpp
    engines/kyra/engine/lol.h
    engines/kyra/engine/scene_eob.cpp
    engines/kyra/engine/scene_hof.cpp
    engines/kyra/engine/scene_lok.cpp
    engines/kyra/engine/scene_lol.cpp
    engines/kyra/engine/scene_mr.cpp
    engines/kyra/engine/timer_hof.cpp
    engines/kyra/graphics/animator_mr.cpp
    engines/kyra/gui/gui_eob.cpp
    engines/kyra/gui/gui_hof.cpp
    engines/kyra/gui/gui_lol.cpp
    engines/kyra/gui/gui_mr.cpp
    engines/kyra/gui/saveload_lok.cpp
    engines/kyra/resource/staticres.cpp
    engines/kyra/script/script_eob.cpp
    engines/kyra/script/script_hof.cpp
    engines/kyra/script/script_lol.cpp
    engines/kyra/script/script_mr.cpp
    engines/kyra/script/script_tim.cpp
    engines/kyra/script/script_tim.h
    engines/kyra/script/script_v2.cpp
    engines/kyra/sequence/sequences_darkmoon.cpp
    engines/kyra/sequence/sequences_hof.cpp
    engines/kyra/sequence/sequences_lol.cpp
    engines/kyra/text/text.cpp
    engines/kyra/text/text_hof.cpp
    engines/kyra/text/text_lol.cpp
    engines/kyra/text/text_lol.h
    engines/kyra/text/text_mr.cpp
    engines/kyra/text/text_rpg.cpp
    engines/kyra/text/text_rpg.h


diff --git a/engines/kyra/engine/darkmoon.cpp b/engines/kyra/engine/darkmoon.cpp
index 3cd7f8fa2aa..a295593c215 100644
--- a/engines/kyra/engine/darkmoon.cpp
+++ b/engines/kyra/engine/darkmoon.cpp
@@ -481,11 +481,11 @@ bool DarkMoonEngine::killMonsterExtra(EoBMonsterInPlay *m) {
 
 void DarkMoonEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
 	if (file)
-		strcpy(_lastBlockDataFile, file);
+		_lastBlockDataFile = file;
 	delete[] _vcnBlocks;
 
 	if (_flags.platform == Common::kPlatformFMTowns) {
-		Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile);
+		Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile.c_str());
 		_vcnBlocks = _res->fileData(fn.c_str(), 0);
 	} else {
 		EoBCoreEngine::loadVcnData(file, cgaMapping);
diff --git a/engines/kyra/engine/eob.cpp b/engines/kyra/engine/eob.cpp
index 5db89d7fd43..e4e47c37cbb 100644
--- a/engines/kyra/engine/eob.cpp
+++ b/engines/kyra/engine/eob.cpp
@@ -694,10 +694,10 @@ void EoBEngine::readLevelFileData(int level) {
 
 void EoBEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
 	if (file)
-		strcpy(_lastBlockDataFile, file);
+		_lastBlockDataFile = file;
 	delete[] _vcnBlocks;
 
-	Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile);
+	Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile.c_str());
 	if (_flags.platform == Common::kPlatformAmiga) {
 		Common::SeekableReadStream *in = _res->createReadStream(fn);
 		uint32 vcnSize = in->readUint16LE() * (_vcnSrcBitsPerPixel << 3);
diff --git a/engines/kyra/engine/eobcommon.cpp b/engines/kyra/engine/eobcommon.cpp
index c96081614bd..8283f02cec5 100644
--- a/engines/kyra/engine/eobcommon.cpp
+++ b/engines/kyra/engine/eobcommon.cpp
@@ -139,7 +139,6 @@ EoBCoreEngine::EoBCoreEngine(OSystem *system, const GameFlags &flags) : KyraRpgE
 	_configHpBarGraphs = true;
 	_configMouseBtSwap = false;
 
-	memset(_dialogueLastBitmap, 0, 13);
 	_npcSequenceSub = 0;
 	_moveCounter = 0;
 	_partyResting = false;
@@ -1565,7 +1564,7 @@ void EoBCoreEngine::initDialogueSequence() {
 	_npcSequenceSub = -1;
 	_txt->setWaitButtonMode(0);
 	_dialogueField = true;
-	_dialogueLastBitmap[0] = 0;
+	_dialogueLastBitmap.clear();
 
 	_txt->resetPageBreakString();
 	gui_updateControls();
@@ -1596,7 +1595,7 @@ void EoBCoreEngine::restoreAfterDialogueSequence() {
 	_txt->allowPageBreak(false);
 	_dialogueField = _dialogueFieldAmiga = false;
 
-	_dialogueLastBitmap[0] = 0;
+	_dialogueLastBitmap.clear();
 
 	gui_restorePlayField();
 	//_allowSkip = false;
@@ -1617,7 +1616,7 @@ void EoBCoreEngine::drawSequenceBitmap(const char *file, int destRect, int x1, i
 	int page = ((flags & 2) || destRect) ? 0 : 6;
 	int amigaPalIndex = (x1 ? 1 : 0) + (y1 ? 2 : 0) + 1;
 
-	if (scumm_stricmp(_dialogueLastBitmap, file)) {
+	if (!_dialogueLastBitmap.equalsIgnoreCase(file)) {
 		_screen->clearPage(2);
 		if (!destRect) {
 			if (!(flags & 1)) {
@@ -1634,7 +1633,7 @@ void EoBCoreEngine::drawSequenceBitmap(const char *file, int destRect, int x1, i
 		}
 
 		_screen->loadEoBBitmap(file, 0, 3, 3, 2);
-		strcpy(_dialogueLastBitmap, file);
+		_dialogueLastBitmap = file;
 	}
 
 	if (_flags.platform == Common::kPlatformAmiga) {
diff --git a/engines/kyra/engine/eobcommon.h b/engines/kyra/engine/eobcommon.h
index 6cd63762bb6..d625a3178cb 100644
--- a/engines/kyra/engine/eobcommon.h
+++ b/engines/kyra/engine/eobcommon.h
@@ -850,7 +850,7 @@ protected:
 	void drawSequenceBitmap(const char *file, int destRect, int x1, int y1, int flags);
 	int runDialogue(int dialogueTextId, int numStr, int loopButtonId, ...);
 
-	char _dialogueLastBitmap[13];
+	Common::String _dialogueLastBitmap;
 	int _moveCounter;
 
 	const char *const *_chargenStatStrings;
diff --git a/engines/kyra/engine/kyra_hof.cpp b/engines/kyra/engine/kyra_hof.cpp
index 8b8728b0dc3..fab81e38fd2 100644
--- a/engines/kyra/engine/kyra_hof.cpp
+++ b/engines/kyra/engine/kyra_hof.cpp
@@ -784,45 +784,39 @@ void KyraEngine_HoF::cleanup() {
 #pragma mark - Localization
 
 void KyraEngine_HoF::loadCCodeBuffer(const char *file) {
-	char tempString[13];
-	strcpy(tempString, file);
+	Common::String tempString = file;
 	changeFileExtension(tempString);
 
 	delete[] _cCodeBuffer;
-	_cCodeBuffer = _res->fileData(tempString, nullptr);
+	_cCodeBuffer = _res->fileData(tempString.c_str(), nullptr);
 }
 
 void KyraEngine_HoF::loadOptionsBuffer(const char *file) {
-	char tempString[13];
-	strcpy(tempString, file);
+	Common::String tempString = file;
 	changeFileExtension(tempString);
 
 	delete[] _optionsBuffer;
-	_optionsBuffer = _res->fileData(tempString, nullptr);
+	_optionsBuffer = _res->fileData(tempString.c_str(), nullptr);
 }
 
 void KyraEngine_HoF::loadChapterBuffer(int chapter) {
-	char tempString[14];
-
 	static const char *const chapterFilenames[] = {
 		"CH1.XXX", "CH2.XXX", "CH3.XXX", "CH4.XXX", "CH5.XXX"
 	};
 
 	assert(chapter >= 1 && chapter <= ARRAYSIZE(chapterFilenames));
-	strcpy(tempString, chapterFilenames[chapter-1]);
+	Common::String tempString = chapterFilenames[chapter-1];
 	changeFileExtension(tempString);
 
 	delete[] _chapterBuffer;
-	_chapterBuffer = _res->fileData(tempString, nullptr);
+	_chapterBuffer = _res->fileData(tempString.c_str(), nullptr);
 	_currentChapter = chapter;
 }
 
-void KyraEngine_HoF::changeFileExtension(char *buffer) {
-	while (*buffer != '.')
-		++buffer;
-
-	++buffer;
-	strcpy(buffer, _languageExtension[_lang]);
+void KyraEngine_HoF::changeFileExtension(Common::String &file) {
+	uint insertAt = file.findFirstOf('.');
+	if (insertAt != Common::String::npos)
+		file = file.substr(0, insertAt + 1) + _languageExtension[_lang];
 }
 
 uint8 *KyraEngine_HoF::getTableEntry(uint8 *buffer, int id) {
@@ -953,13 +947,8 @@ void KyraEngine_HoF::loadItemShapes() {
 }
 
 void KyraEngine_HoF::loadCharacterShapes(int shapes) {
-	char file[10];
-	strcpy(file, "_ZX.SHP");
-
-	_characterShapeFile = shapes;
-	file[2] = '0' + shapes;
-
-	uint8 *data = _res->fileData(file, nullptr);
+	uint8 *data = _res->fileData(Common::String::format("_Z%c.SHP", '0' + (char)shapes).c_str(), nullptr);
+	assert(data);
 	for (int i = 9; i <= 32; ++i)
 		addShapeToPool(data, i, i-9);
 	delete[] data;
@@ -980,16 +969,14 @@ void KyraEngine_HoF::loadInventoryShapes() {
 }
 
 void KyraEngine_HoF::runStartScript(int script, int unk1) {
-	char filename[14];
-	strcpy(filename, "_START0X.EMC");
-	filename[7] = script + '0';
+	Common::String filename = Common::String::format("_START0%c.EMC", '0' + (char)script);
 
 	EMCData scriptData;
 	EMCState scriptState;
 	memset(&scriptData, 0, sizeof(EMCData));
 	memset(&scriptState, 0, sizeof(EMCState));
 
-	_emc->load(filename, &scriptData, &_opcodes);
+	_emc->load(filename.c_str(), &scriptData, &_opcodes);
 	_emc->init(&scriptState, &scriptData);
 	scriptState.regs[6] = unk1;
 	_emc->start(&scriptState, 0);
@@ -1399,24 +1386,21 @@ void KyraEngine_HoF::restoreGfxRect32x32(int x, int y) {
 #pragma mark -
 
 void KyraEngine_HoF::openTalkFile(int newFile) {
-	char talkFilename[16];
+	Common::String talkFilename;
 
 	if (_oldTalkFile > 0) {
-		sprintf(talkFilename, "CH%dVOC.TLK", _oldTalkFile);
+		talkFilename = Common::String::format("CH%dVOC.TLK", _oldTalkFile);
 		_res->unloadPakFile(talkFilename);
 		_oldTalkFile = -1;
 	}
 
-	if (newFile == 0)
-		strcpy(talkFilename, "ANYTALK.TLK");
-	else
-		sprintf(talkFilename, "CH%dVOC.TLK", newFile);
+	talkFilename = newFile ? Common::String::format("CH%dVOC.TLK", newFile) : "ANYTALK.TLK";
 
 	_oldTalkFile = newFile;
 
 	if (!_res->loadPakFile(talkFilename)) {
 		if (speechEnabled()) {
-			warning("Couldn't load voice file '%s', falling back to text only mode", talkFilename);
+			warning("Couldn't load voice file '%s', falling back to text only mode", talkFilename.c_str());
 			_configVoice = 0;
 
 			// Sync the config manager with the new settings
diff --git a/engines/kyra/engine/kyra_hof.h b/engines/kyra/engine/kyra_hof.h
index b111930e5c9..2b4bbec60d2 100644
--- a/engines/kyra/engine/kyra_hof.h
+++ b/engines/kyra/engine/kyra_hof.h
@@ -335,7 +335,7 @@ protected:
 	Common::String getTableString(int id, uint8 *buffer, bool decode);
 	Common::String getChapterString(int id);
 
-	void changeFileExtension(char *buffer);
+	void changeFileExtension(Common::String &file);
 
 	// - Just used in French version
 	int getItemCommandStringDrop(Item item);
@@ -429,7 +429,7 @@ protected:
 	};
 	TalkSections _currentTalkSections;
 
-	char _TLKFilename[13];
+	Common::String _TLKFilename;
 
 	// tim
 	void playTim(const char *filename);
diff --git a/engines/kyra/engine/kyra_mr.cpp b/engines/kyra/engine/kyra_mr.cpp
index 866b90d1177..02473070690 100644
--- a/engines/kyra/engine/kyra_mr.cpp
+++ b/engines/kyra/engine/kyra_mr.cpp
@@ -706,11 +706,9 @@ void KyraEngine_MR::runStartupScript(int script, int unk1) {
 	EMCData data;
 	memset(&state, 0, sizeof(state));
 	memset(&data, 0, sizeof(data));
-	char filename[13];
-	strcpy(filename, "_START0X.EMC");
-	filename[7] = (script % 10) + '0';
+	Common::String filename = Common::String::format("_START0%c.EMC", '0' + (char)(script % 10));
 
-	_emc->load(filename, &data, &_opcodes);
+	_emc->load(filename.c_str(), &data, &_opcodes);
 	_emc->init(&state, &data);
 	_emc->start(&state, 0);
 	state.regs[6] = unk1;
@@ -722,22 +720,22 @@ void KyraEngine_MR::runStartupScript(int script, int unk1) {
 }
 
 void KyraEngine_MR::openTalkFile(int file) {
-	char talkFilename[16];
+	Common::String talkFilename;
 
 	if (file == 0) {
-		strcpy(talkFilename, "ANYTALK.TLK");
+		talkFilename = "ANYTALK.TLK";
 	} else {
 		if (_currentTalkFile > 0) {
-			sprintf(talkFilename, "CH%dTALK.TLK", _currentTalkFile);
+			talkFilename = Common::String::format("CH%dTALK.TLK", _currentTalkFile);
 			_res->unloadPakFile(talkFilename);
 		}
-		sprintf(talkFilename, "CH%dTALK.TLK", file);
+		talkFilename = Common::String::format("CH%dTALK.TLK", file);
 	}
 
 	_currentTalkFile = file;
 	if (!_res->loadPakFile(talkFilename)) {
 		if (speechEnabled()) {
-			warning("Couldn't load voice file '%s', falling back to text only mode", talkFilename);
+			warning("Couldn't load voice file '%s', falling back to text only mode", talkFilename.c_str());
 			_configVoice = 0;
 
 			// Sync the config manager with the new settings
@@ -776,12 +774,11 @@ void KyraEngine_MR::loadCharacterShapes(int newShapes) {
 	const char highNum = (newShapes / 10) + '0';
 
 	for (int i = 0; i < 6; ++i) {
-		char filename[16];
-		strcpy(filename, filenames[i]);
-		filename[numberOffset[i]+0] = highNum;
-		filename[numberOffset[i]+1] = lowNum;
-		_res->exists(filename, true);
-		_res->loadFileToBuf(filename, _screenBuffer, 64000);
+		Common::String filename = filenames[i];
+		filename.setChar(highNum, numberOffset[i]);
+		filename.setChar(lowNum, numberOffset[i] + 1);
+		_res->exists(filename.c_str(), true);
+		_res->loadFileToBuf(filename.c_str(), _screenBuffer, 64000);
 		for (int j = startShape[i]; j <= endShape[i]; ++j) {
 			if (j == 87)
 				continue;
@@ -1328,8 +1325,8 @@ bool KyraEngine_MR::updateScore(int scoreId, int strId) {
 	setNextIdleAnimTimer();
 	_scoreFlagTable[scoreIndex] |= (1 << scoreBit);
 
-	strcpy(_stringBuffer, (const char *)getTableEntry(_scoreFile, strId));
-	strcat(_stringBuffer, ":        ");
+	Common::strlcpy(_stringBuffer, (const char *)getTableEntry(_scoreFile, strId), 500);
+	Common::strlcat(_stringBuffer, ":        ", 500);
 
 	assert(scoreId < _scoreTableSize);
 
diff --git a/engines/kyra/engine/kyra_rpg.h b/engines/kyra/engine/kyra_rpg.h
index 1a1d304b02b..e5482b05b49 100644
--- a/engines/kyra/engine/kyra_rpg.h
+++ b/engines/kyra/engine/kyra_rpg.h
@@ -323,7 +323,7 @@ protected:
 	int16 *_lvlShapeTop;
 	int16 *_lvlShapeBottom;
 
-	char _lastBlockDataFile[13];
+	Common::String _lastBlockDataFile;
 	uint32 _hasTempDataFlags;
 
 	int16 _sceneDrawVarDown;
diff --git a/engines/kyra/engine/lol.cpp b/engines/kyra/engine/lol.cpp
index 880c665ffb3..f9bd690638c 100644
--- a/engines/kyra/engine/lol.cpp
+++ b/engines/kyra/engine/lol.cpp
@@ -1007,7 +1007,7 @@ void LoLEngine::update() {
 
 #pragma mark - Localization
 
-char *LoLEngine::getLangString(uint16 id) {
+const char *LoLEngine::getLangString(uint16 id) {
 	if (id == 0xFFFF)
 		return 0;
 
@@ -1862,7 +1862,7 @@ int LoLEngine::characterSays(int track, int charId, bool redraw) {
 	return r ? (textEnabled() ? 1 : 0) : 1;
 }
 
-int LoLEngine::playCharacterScriptChat(int charId, int mode, int restorePortrait, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
+int LoLEngine::playCharacterScriptChat(int charId, int mode, int restorePortrait, const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
 	int ch = 0;
 	bool skipAnim = false;
 
diff --git a/engines/kyra/engine/lol.h b/engines/kyra/engine/lol.h
index 2d3b4e160c2..d35a00023f7 100644
--- a/engines/kyra/engine/lol.h
+++ b/engines/kyra/engine/lol.h
@@ -357,7 +357,7 @@ private:
 	void processCharacterSelection();
 	void updateSelectionAnims();
 	int selectionCharInfo(int character);
-	void selectionCharInfoIntro(char *file);
+	void selectionCharInfoIntro(Common::String &file);
 
 	int getCharSelection();
 	int selectionCharAccept();
@@ -575,7 +575,7 @@ private:
 
 	// text
 	int characterSays(int track, int charId, bool redraw);
-	int playCharacterScriptChat(int charId, int mode, int restorePortrait, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
+	int playCharacterScriptChat(int charId, int mode, int restorePortrait, const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
 	void setupDialogueButtons(int numStr, const char *s1, const char *s2, const char *s3);
 
 	TextDisplayer_LoL *_txt;
@@ -816,7 +816,7 @@ private:
 	int _lastUsedStringBuffer;
 	char _stringBuffer[5][512]; // TODO: The original used a size of 512, it looks a bit large.
 	                            // Maybe we can someday reduce the size.
-	char *getLangString(uint16 id);
+	const char *getLangString(uint16 id);
 	uint8 *getTableEntry(uint8 *buffer, uint16 id);
 	void decodeSjis(const char *src, char *dst);
 	int decodeCyrillic(const char *src, char *dst);
diff --git a/engines/kyra/engine/scene_eob.cpp b/engines/kyra/engine/scene_eob.cpp
index 14c3e6cbcfe..bd82a424537 100644
--- a/engines/kyra/engine/scene_eob.cpp
+++ b/engines/kyra/engine/scene_eob.cpp
@@ -318,7 +318,7 @@ void EoBCoreEngine::addLevelItems() {
 
 void EoBCoreEngine::loadVcnData(const char *file, const uint8 *cgaMapping) {
 	uint32 vcnSize = 0;
-	Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile);
+	Common::String fn = Common::String::format(_vcnFilePattern.c_str(), _lastBlockDataFile.c_str());
 	_screen->loadBitmap(fn.c_str(), 3, 3, 0, true);
 
 	const uint8 *pos = _screen->getCPagePtr(3);
diff --git a/engines/kyra/engine/scene_hof.cpp b/engines/kyra/engine/scene_hof.cpp
index 906817f4d6d..f0741f919ba 100644
--- a/engines/kyra/engine/scene_hof.cpp
+++ b/engines/kyra/engine/scene_hof.cpp
@@ -389,10 +389,8 @@ void KyraEngine_HoF::loadScenePal() {
 	uint16 sceneId = _mainCharacter.sceneId;
 	_screen->copyPalette(1, 0);
 
-	char filename[14];
-	strcpy(filename, _sceneList[sceneId].filename1);
-	strcat(filename, ".COL");
-	_screen->loadBitmap(filename, 3, 3, nullptr);
+	Common::String filename = Common::String(_sceneList[sceneId].filename1) + ".COL";
+	_screen->loadBitmap(filename.c_str(), 3, 3, nullptr);
 	_screen->getPalette(1).copy(_screen->getCPagePtr(3), 0, 128);
 	_screen->getPalette(1).fill(0, 1, 0);
 	memcpy(_scenePal, _screen->getCPagePtr(3)+336, 432);
@@ -400,22 +398,17 @@ void KyraEngine_HoF::loadScenePal() {
 
 void KyraEngine_HoF::loadSceneMsc() {
 	uint16 sceneId = _mainCharacter.sceneId;
-	char filename[14];
-	strcpy(filename, _sceneList[sceneId].filename1);
-	strcat(filename, ".MSC");
-	_screen->loadBitmap(filename, 3, 5, nullptr);
+	_screen->loadBitmap((Common::String(_sceneList[sceneId].filename1) + ".MSC").c_str(), 3, 5, nullptr);
 }
 
 void KyraEngine_HoF::startSceneScript(int unk1) {
 	uint16 sceneId = _mainCharacter.sceneId;
-	char filename[14];
-
-	strcpy(filename, _sceneList[sceneId].filename1);
+	Common::String filename = _sceneList[sceneId].filename1;
 	if (sceneId == 68 && (queryGameFlag(0x1BC) || queryGameFlag(0x1BD)))
-		strcpy(filename, "DOORX");
-	strcat(filename, ".CPS");
+		filename = "DOORX";
+	filename += ".CPS";
 
-	_screen->loadBitmap(filename, 3, 3, nullptr);
+	_screen->loadBitmap(filename.c_str(), 3, 3, nullptr);
 	resetScaleTable();
 	_useCharPal = false;
 	memset(_charPalTable, 0, sizeof(_charPalTable));
@@ -434,12 +427,9 @@ void KyraEngine_HoF::startSceneScript(int unk1) {
 	_sceneCommentString = "Undefined scene comment string!";
 	_emc->init(&_sceneScriptState, &_sceneScriptData);
 
-	strcpy(filename, _sceneList[sceneId].filename1);
-	strcat(filename, ".");
-	strcat(filename, _scriptLangExt[(_flags.platform == Common::kPlatformDOS && !_flags.isTalkie) ? 0 : _lang]);
-
-	_res->exists(filename, true);
-	_emc->load(filename, &_sceneScriptData, &_opcodes);
+	filename = Common::String(_sceneList[sceneId].filename1) + "." + _scriptLangExt[(_flags.platform == Common::kPlatformDOS && !_flags.isTalkie) ? 0 : _lang];
+	_res->exists(filename.c_str(), true);
+	_emc->load(filename.c_str(), &_sceneScriptData, &_opcodes);
 	runSceneScript7();
 
 	_emc->start(&_sceneScriptState, 0);
diff --git a/engines/kyra/engine/scene_lok.cpp b/engines/kyra/engine/scene_lok.cpp
index 261cbdfceb7..a31451c3470 100644
--- a/engines/kyra/engine/scene_lok.cpp
+++ b/engines/kyra/engine/scene_lok.cpp
@@ -143,10 +143,7 @@ void KyraEngine_LoK::enterNewScene(int sceneId, int facing, int unk1, int unk2,
 	_currentRoom = sceneId;
 
 	int tableId = _roomTable[sceneId].nameIndex;
-	char fileNameBuffer[32];
-	strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
-	strcat(fileNameBuffer, ".DAT");
-	_sprites->loadDat(fileNameBuffer, _sceneExits);
+	_sprites->loadDat((Common::String(_roomFilenameTable[tableId]) + ".DAT").c_str(), _sceneExits);
 	_sprites->setupSceneAnims();
 	_emc->unload(&_scriptClickData);
 	loadSceneMsc();
@@ -188,13 +185,10 @@ void KyraEngine_LoK::transcendScenes(int roomIndex, int roomName) {
 	assert(roomIndex < _roomTableSize);
 
 	if (_flags.isTalkie) {
-		char file[32];
 		assert(roomIndex < _roomTableSize);
 		int tableId = _roomTable[roomIndex].nameIndex;
 		assert(tableId < _roomFilenameTableSize);
-		strcpy(file, _roomFilenameTable[tableId]);
-		strcat(file, ".VRM");
-		_res->unloadPakFile(file);
+		_res->unloadPakFile(Common::String(_roomFilenameTable[tableId]) + ".VRM");
 	}
 
 	_roomTable[roomIndex].nameIndex = roomName;
@@ -378,25 +372,21 @@ void KyraEngine_LoK::loadSceneMsc() {
 	assert(_currentCharacter->sceneId < _roomTableSize);
 	int tableId = _roomTable[_currentCharacter->sceneId].nameIndex;
 	assert(tableId < _roomFilenameTableSize);
-	char fileNameBuffer[32];
-	strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
-	strcat(fileNameBuffer, ".MSC");
+	Common::String fileNameBuffer = Common::String(_roomFilenameTable[tableId]) + ".MSC";
 	_screen->fillRect(0, 0, 319, 199, 0, 5);
-	_res->exists(fileNameBuffer, true);
-	_screen->loadBitmap(fileNameBuffer, 3, 5, nullptr);
+	_res->exists(fileNameBuffer.c_str(), true);
+	_screen->loadBitmap(fileNameBuffer.c_str(), 3, 5, nullptr);
 }
 
 void KyraEngine_LoK::startSceneScript(int brandonAlive) {
 	assert(_currentCharacter->sceneId < _roomTableSize);
 	int tableId = _roomTable[_currentCharacter->sceneId].nameIndex;
 	assert(tableId < _roomFilenameTableSize);
-	char fileNameBuffer[32];
-	strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
-	strcat(fileNameBuffer, ".CPS");
+	Common::String fileNameBuffer = Common::String(_roomFilenameTable[tableId]) + ".CPS";
 	_screen->clearPage(3);
-	_res->exists(fileNameBuffer, true);
+	_res->exists(fileNameBuffer.c_str(), true);
 	// FIXME: check this hack for amiga version
-	_screen->loadBitmap(fileNameBuffer, 3, 3, (_flags.platform == Common::kPlatformAmiga ? &_screen->getPalette(0) : nullptr));
+	_screen->loadBitmap(fileNameBuffer.c_str(), 3, 3, (_flags.platform == Common::kPlatformAmiga ? &_screen->getPalette(0) : nullptr));
 	_sprites->loadSceneShapes();
 	_exitListPtr = nullptr;
 
@@ -406,11 +396,10 @@ void KyraEngine_LoK::startSceneScript(int brandonAlive) {
 
 	clearNoDropRects();
 	_emc->init(&_scriptClick, &_scriptClickData);
-	strcpy(fileNameBuffer, _roomFilenameTable[tableId]);
-	strcat(fileNameBuffer, ".EMC");
-	_res->exists(fileNameBuffer, true);
+	fileNameBuffer = Common::String(_roomFilenameTable[tableId]) + ".EMC";
+	_res->exists(fileNameBuffer.c_str(), true);
 	_emc->unload(&_scriptClickData);
-	_emc->load(fileNameBuffer, &_scriptClickData, &_opcodes);
+	_emc->load(fileNameBuffer.c_str(), &_scriptClickData, &_opcodes);
 	_emc->start(&_scriptClick, 0);
 	_scriptClick.regs[0] = _currentCharacter->sceneId;
 	_scriptClick.regs[7] = brandonAlive;
@@ -1272,24 +1261,18 @@ void KyraEngine_LoK::setupSceneResource(int sceneId) {
 	if (!_flags.isTalkie)
 		return;
 
+	Common::String file;
+
 	if (_currentRoom != 0xFFFF) {
 		assert(_currentRoom < _roomTableSize);
 		int tableId = _roomTable[_currentRoom].nameIndex;
 		assert(tableId < _roomFilenameTableSize);
 
 		// unload our old room
-		char file[64];
-		strcpy(file, _roomFilenameTable[tableId]);
-		strcat(file, ".VRM");
-		_res->unloadPakFile(file);
-
-		strcpy(file, _roomFilenameTable[tableId]);
-		strcat(file, ".PAK");
-		_res->unloadPakFile(file);
-
-		strcpy(file, _roomFilenameTable[tableId]);
-		strcat(file, ".APK");
-		_res->unloadPakFile(file);
+		file = _roomFilenameTable[tableId];
+		_res->unloadPakFile(file + ".VRM");
+		_res->unloadPakFile(file + ".PAK");
+		_res->unloadPakFile(file + ".APK");
 	}
 
 	assert(sceneId < _roomTableSize);
@@ -1297,20 +1280,16 @@ void KyraEngine_LoK::setupSceneResource(int sceneId) {
 	assert(tableId < _roomFilenameTableSize);
 
 	// load our new room
-	char file[64];
-	strcpy(file, _roomFilenameTable[tableId]);
-	strcat(file, ".VRM");
-	if (_res->exists(file))
+	file = Common::String(_roomFilenameTable[tableId]) + ".VRM";
+	if (_res->exists(file.c_str()))
 		_res->loadPakFile(file);
 
-	strcpy(file, _roomFilenameTable[tableId]);
-	strcat(file, ".PAK");
-	if (_res->exists(file))
+	file = Common::String(_roomFilenameTable[tableId]) + ".PAK";
+	if (_res->exists(file.c_str()))
 		_res->loadPakFile(file);
 
-	strcpy(file, _roomFilenameTable[tableId]);
-	strcat(file, ".APK");
-	if (_res->exists(file))
+	file = Common::String(_roomFilenameTable[tableId]) + ".APK";
+	if (_res->exists(file.c_str()))
 		_res->loadPakFile(file);
 }
 
diff --git a/engines/kyra/engine/scene_lol.cpp b/engines/kyra/engine/scene_lol.cpp
index 1eee8566698..c4c547cb5f9 100644
--- a/engines/kyra/engine/scene_lol.cpp
+++ b/engines/kyra/engine/scene_lol.cpp
@@ -301,7 +301,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
 	if (file) {
 		_lastSpecialColor = specialColor;
 		_lastSpecialColorWeight = weight;
-		strcpy(_lastBlockDataFile, file);
+		_lastBlockDataFile = file;
 		if (palFile)
 			_lastOverridePalFile = palFile;
 		else
@@ -312,7 +312,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
 		if (_lastSpecialColor == 1)
 			_lastSpecialColor = 0x44;
 		else if (_lastSpecialColor == 0x66)
-			_lastSpecialColor = scumm_stricmp(_lastBlockDataFile, "YVEL2") ? 0xCC : 0x44;
+			_lastSpecialColor = _lastBlockDataFile.equalsIgnoreCase("YVEL2") ? 0x44 : 0xCC;
 		else if (_lastSpecialColor == 0x6B)
 			_lastSpecialColor = 0xCC;
 		else
@@ -324,7 +324,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
 	int tlen = 0;
 
 	if (_flags.use16ColorMode) {
-		fname = Common::String::format("%s.VCF", _lastBlockDataFile);
+		fname = _lastBlockDataFile + ".VCF";
 		_screen->loadBitmap(fname.c_str(), 3, 3, 0);
 		v = _screen->getCPagePtr(2);
 		tlen = READ_LE_UINT16(v) << 5;
@@ -336,7 +336,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
 		memcpy(_vcfBlocks, v, tlen);
 	}
 
-	fname = Common::String::format("%s.VCN", _lastBlockDataFile);
+	fname = _lastBlockDataFile + ".VCN";
 	_screen->loadBitmap(fname.c_str(), 3, 3, 0);
 	v = _screen->getCPagePtr(2);
 	tlen = READ_LE_UINT16(v);
@@ -387,7 +387,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight
 	memcpy(_vcnBlocks, v, vcnLen);
 	v += vcnLen;
 
-	fname = Common::String::format("%s.VMP", _lastBlockDataFile);
+	fname = _lastBlockDataFile + ".VMP";
 	_screen->loadBitmap(fname.c_str(), 3, 3, 0);
 	v = _screen->getCPagePtr(2);
 
diff --git a/engines/kyra/engine/scene_mr.cpp b/engines/kyra/engine/scene_mr.cpp
index f4daa4bf763..f99d785a968 100644
--- a/engines/kyra/engine/scene_mr.cpp
+++ b/engines/kyra/engine/scene_mr.cpp
@@ -99,25 +99,25 @@ void KyraEngine_MR::enterNewScene(uint16 sceneId, int facing, int unk1, int unk2
 	loadScenePal();
 
 	if (queryGameFlag(0x1D9)) {
-		char filename[20];
+		Common::String filename;
 		if (queryGameFlag(0x20D)) {
 			resetGameFlag(0x20D);
-			strcpy(filename, "COW1_");
+			filename = "COW1_";
 		} else if (queryGameFlag(0x20E)) {
 			resetGameFlag(0x20E);
-			strcpy(filename, "COW2_");
+			filename = "COW2_";
 		} else if (queryGameFlag(0x20F)) {
 			resetGameFlag(0x20F);
-			strcpy(filename, "COW3_");
+			filename ="COW3_";
 		} else if (queryGameFlag(0x20C)) {
 			resetGameFlag(0x20C);
-			strcpy(filename, "BOAT");
+			filename = "BOAT";
 		} else if (queryGameFlag(0x210)) {
 			resetGameFlag(0x210);
-			strcpy(filename, "JUNG");
+			filename = "JUNG";
 		}
 
-		playVQA(filename);
+		playVQA(filename.c_str());
 
 		resetGameFlag(0x1D9);
 	}
@@ -297,12 +297,9 @@ void KyraEngine_MR::freeSceneShapes() {
 }
 
 void KyraEngine_MR::loadScenePal() {
-	char filename[16];
 	_screen->copyPalette(2, 0);
-	strcpy(filename, _sceneList[_mainCharacter.sceneId].filename1);
-	strcat(filename, ".COL");
 
-	_screen->loadBitmap(filename, 3, 3, nullptr);
+	_screen->loadBitmap((Common::String(_sceneList[_mainCharacter.sceneId].filename1) + ".COL").c_str(), 3, 3, nullptr);
 	_screen->getPalette(2).copy(_screen->getCPagePtr(3), 0, 144);
 	_screen->getPalette(2).fill(0, 1, 0);
 
@@ -318,11 +315,9 @@ void KyraEngine_MR::loadScenePal() {
 }
 
 void KyraEngine_MR::loadSceneMsc() {
-	char filename[16];
-	strcpy(filename, _sceneList[_mainCharacter.sceneId].filename1);
-	strcat(filename, ".MSC");
+	Common::String filename = Common::String(_sceneList[_mainCharacter.sceneId].filename1) + ".MSC";
 
-	_res->exists(filename, true);
+	_res->exists(filename.c_str(), true);
 	Common::SeekableReadStream *stream = _res->createReadStream(filename);
 	assert(stream);
 	int16 minY = 0, height = 0;
@@ -335,7 +330,7 @@ void KyraEngine_MR::loadSceneMsc() {
 
 	_screen->setShapePages(5, 3, _maskPageMinY, _maskPageMaxY);
 
-	_screen->loadBitmap(filename, 5, 5, nullptr, true);
+	_screen->loadBitmap(filename.c_str(), 5, 5, nullptr, true);
 
 	// HACK
 	uint8 *data = new uint8[320*200];
@@ -349,11 +344,9 @@ void KyraEngine_MR::loadSceneMsc() {
 void KyraEngine_MR::initSceneScript(int unk1) {
 	const SceneDesc &scene = _sceneList[_mainCharacter.sceneId];
 
-	char filename[16];
-	strcpy(filename, scene.filename1);
-	strcat(filename, ".DAT");
+	Common::String filename = Common::String(scene.filename1) + ".DAT";
 
-	_res->exists(filename, true);
+	_res->exists(filename.c_str(), true);
 	Common::SeekableReadStream *stream = _res->createReadStream(filename);
 	assert(stream);
 	stream->seek(2, SEEK_CUR);
@@ -368,9 +361,8 @@ void KyraEngine_MR::initSceneScript(int unk1) {
 		_scaleTable[i] = (uint16(scaleTable[i]) << 8) / 100;
 
 	if (shapesCount > 0) {
-		strcpy(filename, scene.filename1);
-		strcat(filename, "9.CPS");
-		_screen->loadBitmap(filename, 3, 3, nullptr);
+		filename = Common::String(scene.filename1) + "9.CPS";
+		_screen->loadBitmap(filename.c_str(), 3, 3, nullptr);
 		int pageBackUp = _screen->_curPage;
 		_screen->_curPage = 2;
 		for (int i = 0; i < shapesCount; ++i) {
@@ -388,9 +380,8 @@ void KyraEngine_MR::initSceneScript(int unk1) {
 	delete stream;
 	stream = nullptr;
 
-	strcpy(filename, scene.filename1);
-	strcat(filename, ".CPS");
-	_screen->loadBitmap(filename, 3, 3, nullptr);
+	filename = Common::String(scene.filename1) + ".CPS";
+	_screen->loadBitmap(filename.c_str(), 3, 3, nullptr);
 
 	Common::fill(_specialSceneScriptState, ARRAYEND(_specialSceneScriptState), false);
 	_sceneEnterX1 = 160;
@@ -405,14 +396,12 @@ void KyraEngine_MR::initSceneScript(int unk1) {
 	_sceneMaxX = 319;
 
 	_emc->init(&_sceneScriptState, &_sceneScriptData);
-	strcpy(filename, scene.filename2);
-	strcat(filename, ".EMC");
-	_res->exists(filename, true);
-	_emc->load(filename, &_sceneScriptData, &_opcodes);
-
-	strcpy(filename, scene.filename2);
-	strcat(filename, ".");
-	loadLanguageFile(filename, _sceneStrings);
+	filename = Common::String(scene.filename2) + ".EMC";
+	_res->exists(filename.c_str(), true);
+	_emc->load(filename.c_str(), &_sceneScriptData, &_opcodes);
+
+	filename = Common::String(scene.filename2) + ".";
+	loadLanguageFile(filename.c_str(), _sceneStrings);
 
 	runSceneScript8();
 	_emc->start(&_sceneScriptState, 0);
diff --git a/engines/kyra/engine/timer_hof.cpp b/engines/kyra/engine/timer_hof.cpp
index 5b797ce63ff..50a1849f465 100644
--- a/engines/kyra/engine/timer_hof.cpp
+++ b/engines/kyra/engine/timer_hof.cpp
@@ -52,11 +52,10 @@ void KyraEngine_HoF::timerCauldronAnimation(int arg) {
 		if (animation == -1)
 			animation = _rnd.getRandomNumberRng(1, 6);
 
-		char filename[13];
-		strcpy(filename, "CAULD00.WSA");
-		filename[5] = (animation / 10) + '0';
-		filename[6] = (animation % 10) + '0';
-		loadInvWsa(filename, 0, 8, 0, -1, -1, 1);
+		Common::String filename = "CAULD00.WSA";
+		filename.setChar((animation / 10) + '0', 5);
+		filename.setChar((animation % 10) + '0', 6);
+		loadInvWsa(filename.c_str(), 0, 8, 0, -1, -1, 1);
 	}
 }
 
diff --git a/engines/kyra/graphics/animator_mr.cpp b/engines/kyra/graphics/animator_mr.cpp
index 4b8c03ec9a6..c47290cab14 100644
--- a/engines/kyra/graphics/animator_mr.cpp
+++ b/engines/kyra/graphics/animator_mr.cpp
@@ -325,7 +325,7 @@ void KyraEngine_MR::setupSceneAnimObject(int animId, uint16 flags, int x, int y,
 	anim.specialSize = specialSize;
 	anim.shapeIndex = shape;
 	if (filename)
-		strcpy(anim.filename, filename);
+		Common::strlcpy(anim.filename, filename, sizeof(anim.filename));
 
 	if (flags & 8) {
 		_sceneAnimMovie[animId]->open(filename, 1, nullptr);
diff --git a/engines/kyra/gui/gui_eob.cpp b/engines/kyra/gui/gui_eob.cpp
index 5aff48f6405..a9bc6405432 100644
--- a/engines/kyra/gui/gui_eob.cpp
+++ b/engines/kyra/gui/gui_eob.cpp
@@ -3040,8 +3040,9 @@ Common::String GUI_EoB::transferTargetMenu(Common::Array<Common::String> &target
 
 	Common::StringArray::iterator ii = targets.begin();
 	for (int i = 0; i < _savegameListSize; ++i) {
-		_savegameList[i] = new char[(*ii).size() + 1];
-		strcpy(_savegameList[i], (*ii++).c_str());
+		int slsize = (*ii).size() + 1;
+		_savegameList[i] = new char[slsize];
+		Common::strlcpy(_savegameList[i], (*ii++).c_str(), slsize);
 	}
 
 	const ScreenDim *dm = _screen->getScreenDim(11);
diff --git a/engines/kyra/gui/gui_hof.cpp b/engines/kyra/gui/gui_hof.cpp
index b9c693f6d39..74c7eaa9e17 100644
--- a/engines/kyra/gui/gui_hof.cpp
+++ b/engines/kyra/gui/gui_hof.cpp
@@ -404,46 +404,46 @@ int KyraEngine_HoF::bookButton(Button *button) {
 }
 
 void KyraEngine_HoF::loadBookBkgd() {
-	char filename[16];
+	Common::String filename;
 
 	if (_flags.isTalkie)
-		strcpy(filename, (_bookBkgd == 0) ? "_XBOOKD.CPS" : "_XBOOKC.CPS");
+		filename = (_bookBkgd == 0) ? "_XBOOKD.CPS" : "_XBOOKC.CPS";
 	else
-		strcpy(filename, (_bookBkgd == 0) ? "_BOOKD.CPS" : "_BOOKC.CPS");
+		filename = (_bookBkgd == 0) ? "_BOOKD.CPS" : "_BOOKC.CPS";
 
 	_bookBkgd ^= 1;
 
 	if (_flags.isTalkie) {
 		if (!_bookCurPage)
-			strcpy(filename, "_XBOOKB.CPS");
+			filename = "_XBOOKB.CPS";
 		if (_bookCurPage == _bookMaxPage)
-			strcpy(filename, "_XBOOKA.CPS");
+			filename = "_XBOOKA.CPS";
 
 		switch (_lang) {
 		case 0:
-			filename[1] = 'E';
+			filename.setChar('E', 1);
 			break;
 
 		case 1:
-			filename[1] = 'F';
+			filename.setChar('F', 1);
 			break;
 
 		case 2:
-			filename[1] = 'G';
+			filename.setChar('G', 1);
 			break;
 
 		default:
 			warning("loadBookBkgd unsupported language");
-			filename[1] = 'E';
+			filename.setChar('E', 1);
 		}
 	} else {
 		if (!_bookCurPage)
-			strcpy(filename, "_BOOKB.CPS");
+			filename = "_BOOKB.CPS";
 		if (_bookCurPage == _bookMaxPage)
-			strcpy(filename, "_BOOKA.CPS");
+			filename = "_BOOKA.CPS";
 	}
 
-	_screen->loadBitmap(filename, 3, 3, nullptr);
+	_screen->loadBitmap(filename.c_str(), 3, 3, nullptr);
 }
 
 void KyraEngine_HoF::showBookPage() {
diff --git a/engines/kyra/gui/gui_lol.cpp b/engines/kyra/gui/gui_lol.cpp
index ab7694140bc..8f68970232c 100644
--- a/engines/kyra/gui/gui_lol.cpp
+++ b/engines/kyra/gui/gui_lol.cpp
@@ -2518,15 +2518,16 @@ void GUI_LoL::setupSaveMenuSlots(Menu &menu, int num) {
 	}
 
 	int saveSlotMaxLen = ((_screen->getScreenDim(8))->w << 3)  - _screen->getCharWidth('W');
+	int buffLeft = 5120 - 1;
 
 	for (int i = startSlot; i < num && _savegameOffset + i - slotOffs < _savegameListSize; ++i) {
 		if (_savegameList[i + _savegameOffset - slotOffs]) {
-			Common::strlcpy(s, _savegameList[i + _savegameOffset - slotOffs], 80);
+			Common::strlcpy(s, _savegameList[i + _savegameOffset - slotOffs], buffLeft);
 
 			// Trim long GMM save descriptions to fit our save slots
 			int fC = _screen->getTextWidth(s);
 			while (s[0] && fC >= saveSlotMaxLen) {
-				s[strlen(s) - 1]  = 0;
+				s[Common::strnlen(s, buffLeft) - 1]  = 0;
 				fC = _screen->getTextWidth(s);
 			}
 
@@ -2539,7 +2540,9 @@ void GUI_LoL::setupSaveMenuSlots(Menu &menu, int num) {
 			}
 
 			menu.item[i].itemString = s;
-			s += (strlen(s) + 1);
+			int slotLen = Common::strnlen(s, buffLeft) + 1;
+			s += slotLen;
+			buffLeft -= slotLen;
 			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset - slotOffs];
 			menu.item[i].enabled = true;
 		}
@@ -2547,7 +2550,7 @@ void GUI_LoL::setupSaveMenuSlots(Menu &menu, int num) {
 
 	if (_savegameOffset == 0) {
 		if (&menu == &_saveMenu) {
-			strcpy(s, _vm->getLangString(0x4010));
+			Common::strlcpy(s, _vm->getLangString(0x4010), buffLeft);
 			menu.item[0].itemString = s;
 			menu.item[0].saveSlot = -3;
 			menu.item[0].enabled = true;
@@ -2682,19 +2685,19 @@ 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.c_str());
+		Common::strlcpy(_saveDescription, _saveMenu.item[-s - 2].itemString.c_str(), 80);
 	} else if (_vm->_autoSaveNamesEnabled) {
 		TimeDate td;
 		g_system->getTimeAndDate(td);
 		// Skip character name for Japanese to prevent garbage rendering (the save description is rendered in the non-SJIS default font).
 		Common::String ts = (_vm->gameFlags().lang != Common::JA_JPN) ? Common::String::format("%s / ", _vm->_characters[0].name) : "";
-		Common::String lvl1 = Common::String(_vm->_lastBlockDataFile).substr(0, 1);
-		Common::String lvl2 = Common::String(_vm->_lastBlockDataFile).substr(1);
+		Common::String lvl1 = _vm->_lastBlockDataFile.substr(0, 1);
+		Common::String lvl2 = _vm->_lastBlockDataFile.substr(1);
 		lvl1.toUppercase();
 		lvl2.toLowercase();
 		ts = ts + lvl1 + lvl2;
 		ts += Common::String::format(" / %02d-%02d-%02d - %02d:%02d:%02d", td.tm_year + 1900, td.tm_mon + 1, td.tm_mday, td.tm_hour, td.tm_min, td.tm_sec);
-		strcpy(_saveDescription, ts.c_str());
+		Common::strlcpy(_saveDescription, ts.c_str(), 80);
 	}
 
 	return 1;
diff --git a/engines/kyra/gui/gui_mr.cpp b/engines/kyra/gui/gui_mr.cpp
index dcb0c8407ec..304e4cd5200 100644
--- a/engines/kyra/gui/gui_mr.cpp
+++ b/engines/kyra/gui/gui_mr.cpp
@@ -137,7 +137,7 @@ void KyraEngine_MR::showMessageFromCCode(int string, uint8 c0, int) {
 }
 
 void KyraEngine_MR::updateItemCommand(Item item, int str, uint8 c0) {
-	char buffer[100];
+	Common::String buffer;
 	char *src = (char *)getTableEntry(_itemFile, item);
 
 	if (_flags.lang != Common::HE_ISR) {
@@ -148,20 +148,18 @@ void KyraEngine_MR::updateItemCommand(Item item, int str, uint8 c0) {
 			*src = toupper(*src);
 		}
 
-		strcpy(buffer, src);
+		buffer = src;
 
 		if (_lang != 3)
-			strcat(buffer, " ");
+			buffer += " ";
 
-		strcat(buffer, (const char *)getTableEntry(_cCodeFile, str));
+		buffer += (const char *)getTableEntry(_cCodeFile, str);
 	} else {
-		strcpy(buffer, (const char *)getTableEntry(_cCodeFile, str));
-		strcat(buffer, " ");
-		strcat(buffer, src);
-		strcat(buffer, ".");
+		buffer = (const char *)getTableEntry(_cCodeFile, str);
+		buffer = buffer + " " + src + ".";
 	}
 
-	showMessage(buffer, c0, 0xF0);
+	showMessage(buffer.c_str(), c0, 0xF0);
 }
 
 void KyraEngine_MR::updateCommandLine() {
@@ -620,7 +618,7 @@ int KyraEngine_MR::buttonMoodChange(Button *button) {
 }
 
 int KyraEngine_MR::buttonShowScore(Button *button) {
-	strcpy(_stringBuffer, (const char *)getTableEntry(_cCodeFile, 18));
+	Common::strlcpy(_stringBuffer, (const char *)getTableEntry(_cCodeFile, 18), 500);
 
 	char *buffer = _stringBuffer;
 
diff --git a/engines/kyra/gui/saveload_lok.cpp b/engines/kyra/gui/saveload_lok.cpp
index 307a40f21b2..81d17386c0a 100644
--- a/engines/kyra/gui/saveload_lok.cpp
+++ b/engines/kyra/gui/saveload_lok.cpp
@@ -48,13 +48,10 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) {
 
 	// unloading the current voice file should fix some problems with voices
 	if (_currentRoom != 0xFFFF && _flags.isTalkie) {
-		char file[32];
 		assert(_currentRoom < _roomTableSize);
 		int tableId = _roomTable[_currentRoom].nameIndex;
 		assert(tableId < _roomFilenameTableSize);
-		strcpy(file, _roomFilenameTable[tableId]);
-		strcat(file, ".VRM");
-		_res->unloadPakFile(file);
+		_res->unloadPakFile(Common::String(_roomFilenameTable[tableId]) + ".VRM");
 	}
 
 	for (int i = 0; i < 11; i++) {
diff --git a/engines/kyra/resource/staticres.cpp b/engines/kyra/resource/staticres.cpp
index fceb05f19eb..b20ac11f364 100644
--- a/engines/kyra/resource/staticres.cpp
+++ b/engines/kyra/resource/staticres.cpp
@@ -459,7 +459,7 @@ bool StaticResource::loadStringTable(Common::SeekableReadStream &stream, void *&
 			string += c;
 
 		output[i] = new char[string.size() + 1];
-		strcpy(output[i], string.c_str());
+		Common::strlcpy(output[i], string.c_str(), string.size() + 1);
 	}
 
 	ptr = output;
diff --git a/engines/kyra/script/script_eob.cpp b/engines/kyra/script/script_eob.cpp
index b83d7aee09e..ef050a5fc39 100644
--- a/engines/kyra/script/script_eob.cpp
+++ b/engines/kyra/script/script_eob.cpp
@@ -520,7 +520,7 @@ int EoBInfProcessor::oeob_printMessage_v1(int8 *data) {
 	char col[5];
 	int8 *pos = data;
 
-	strcpy(col, colorConfig);
+	Common::strlcpy(col, colorConfig, sizeof(col));
 	const char *str = (const char *)pos;
 	pos += (strlen(str) + 1);
 	bool lineBreak = true;
diff --git a/engines/kyra/script/script_hof.cpp b/engines/kyra/script/script_hof.cpp
index 77ab2df2167..023a8e8de60 100644
--- a/engines/kyra/script/script_hof.cpp
+++ b/engines/kyra/script/script_hof.cpp
@@ -59,7 +59,7 @@ int KyraEngine_HoF::o2_defineObject(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_defineObject(%p) (%d, '%s', %d, %d, %d, %d)", (const void *)script,
 			stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
 	TalkObject *object = &_talkObjectList[stackPos(0)];
-	strcpy(object->filename, stackPosString(1));
+	Common::strlcpy(object->filename, stackPosString(1), sizeof(object->filename));
 	object->scriptId = stackPos(2);
 	object->x = stackPos(3);
 	object->y = stackPos(4);
@@ -872,7 +872,7 @@ int KyraEngine_HoF::o2_defineSceneAnim(EMCState *script) {
 	anim.height = stackPos(7);
 	anim.specialSize = stackPos(9);
 	anim.shapeIndex = stackPos(11);
-	strcpy(anim.filename, stackPosString(12));
+	Common::strlcpy(anim.filename, stackPosString(12), sizeof(anim.filename));
 
 	if (anim.flags & 0x40) {
 		if (!_sceneAnimMovie[animId]->open(anim.filename, 1, nullptr))
@@ -1197,7 +1197,7 @@ int KyraEngine_HoF::o2_setupSceneAnimation(EMCState *script) {
 	anim.specialSize = stackPos(9);
 	anim.shapeIndex = stackPos(11);
 	if (stackPosString(12))
-		strcpy(anim.filename, stackPosString(12));
+		Common::strlcpy(anim.filename, stackPosString(12), sizeof(anim.filename));
 
 	if (flags & 0x40) {
 		_sceneAnimMovie[index]->open(stackPosString(12), 0, nullptr);
diff --git a/engines/kyra/script/script_lol.cpp b/engines/kyra/script/script_lol.cpp
index 5ac917ca86e..ca0ec061eb6 100644
--- a/engines/kyra/script/script_lol.cpp
+++ b/engines/kyra/script/script_lol.cpp
@@ -1313,7 +1313,7 @@ int LoLEngine::olol_drawExitButton(EMCState *script) {
 	int y = printPara[3 * stackPos(0) + 1];
 	int offs = printPara[3 * stackPos(0) + 2];
 
-	char *str = getLangString(0x4033);
+	const char *str = getLangString(0x4033);
 	int w = _screen->getTextWidth(str);
 
 	if (_flags.use16ColorMode) {
@@ -1592,7 +1592,7 @@ int LoLEngine::olol_playDialogueTalkText(EMCState *script) {
 	int track = stackPos(0);
 
 	if (!snd_playCharacterSpeech(track, 0, 0) || textEnabled()) {
-		char *s = getLangString(track);
+		const char *s = getLangString(track);
 		_txt->printDialogueText2(4, s, script, 0, 1);
 	}
 
@@ -2579,23 +2579,18 @@ int LoLEngine::tlol_fadeInScene(const TIM *tim, const uint16 *param) {
 
 	_screen->copyRegion(0, 0, 0, 0, 320, 200, 0, 2, Screen::CR_NO_P_CHECK);
 
-	char filename[32];
-	strcpy(filename, sceneFile);
-	strcat(filename, ".CPS");
-
-	_screen->loadBitmap(filename, 7, 5, &_screen->getPalette(0));
+	Common::String filename = Common::String(sceneFile) + ".CPS";
+	_screen->loadBitmap(filename.c_str(), 7, 5, &_screen->getPalette(0));
 
 	uint8 *overlay = 0;
 	if (!_flags.use16ColorMode) {
-		filename[0] = 0;
+		filename.clear();
 
-		if (_flags.isTalkie) {
-			strcpy(filename, _languageExt[_lang]);
-			strcat(filename, "/");
-		}
+		if (_flags.isTalkie)
+			filename = Common::String(_languageExt[_lang]) + "/";
 
-		strcat(filename, overlayFile);
-		overlay = _res->fileData(filename, 0);
+		filename += overlayFile;
+		overlay = _res->fileData(filename.c_str(), 0);
 
 		for (int i = 0; i < 3; ++i) {
 			uint32 endTime = _system->getMillis() + 10 * _tickLength;
diff --git a/engines/kyra/script/script_mr.cpp b/engines/kyra/script/script_mr.cpp
index 2e0c1a66c87..440f8b67359 100644
--- a/engines/kyra/script/script_mr.cpp
+++ b/engines/kyra/script/script_mr.cpp
@@ -52,7 +52,7 @@ int KyraEngine_MR::o3_defineObject(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_defineObject(%p) (%d, '%s', %d, %d, %d, %d, %d, %d)", (const void *)script,
 			stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
 	TalkObject &obj = _talkObjectList[stackPos(0)];
-	strcpy(obj.filename, stackPosString(1));
+	Common::strlcpy(obj.filename, stackPosString(1), sizeof(obj.filename));
 	obj.sceneAnim = stackPos(2);
 	obj.sceneScript = stackPos(3);
 	obj.x = stackPos(4);
@@ -289,7 +289,7 @@ int KyraEngine_MR::o3_makeSecondChanceSave(EMCState *script) {
 
 int KyraEngine_MR::o3_setSceneFilename(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_MR::o3_setSceneFilename(%p) (%d, '%s')", (const void *)script, stackPos(0), stackPosString(1));
-	strcpy(_sceneList[stackPos(0)].filename1, stackPosString(1));
+	Common::strlcpy(_sceneList[stackPos(0)].filename1, stackPosString(1), sizeof(_sceneList[stackPos(0)].filename1));
 	_sceneList[stackPos(0)].filename1[9] = 0;
 	return 0;
 }
@@ -882,7 +882,7 @@ int KyraEngine_MR::o3_defineSceneAnim(EMCState *script) {
 	const char *filename = stackPosString(12);
 
 	if (filename)
-		strcpy(anim.filename, filename);
+		Common::strlcpy(anim.filename, filename, sizeof(anim.filename));
 
 	if (flags & 8) {
 		_sceneAnimMovie[animId]->open(filename, 1, nullptr);
@@ -1067,7 +1067,7 @@ int KyraEngine_MR::o3_customChat(EMCState *script) {
 	if (!str)
 		return 0;
 
-	strcpy(_stringBuffer, str);
+	Common::strlcpy(_stringBuffer, str, 500);
 	_chatText = _stringBuffer;
 	_chatObject = object;
 	_chatVocHigh = _chatVocLow = -1;
diff --git a/engines/kyra/script/script_tim.cpp b/engines/kyra/script/script_tim.cpp
index 913c45ea1df..5d7f34cd692 100644
--- a/engines/kyra/script/script_tim.cpp
+++ b/engines/kyra/script/script_tim.cpp
@@ -994,7 +994,7 @@ void TIMInterpreter_LoL::checkSpeechProgress() {
 	}
 }
 
-char *TIMInterpreter_LoL::getTableString(int id) {
+const char *TIMInterpreter_LoL::getTableString(int id) {
 	return _vm->getLangString(id);
 }
 
diff --git a/engines/kyra/script/script_tim.h b/engines/kyra/script/script_tim.h
index 3ade0f50ea9..f5ddbd6d4d1 100644
--- a/engines/kyra/script/script_tim.h
+++ b/engines/kyra/script/script_tim.h
@@ -275,7 +275,7 @@ private:
 	void update() override;
 	void checkSpeechProgress() override;
 
-	char *getTableString(int id);
+	const char *getTableString(int id);
 	void advanceToOpcode(int opcode);
 
 	LoLEngine *_vm;
diff --git a/engines/kyra/script/script_v2.cpp b/engines/kyra/script/script_v2.cpp
index b1809cc5267..3ed38959c3b 100644
--- a/engines/kyra/script/script_v2.cpp
+++ b/engines/kyra/script/script_v2.cpp
@@ -242,8 +242,8 @@ int KyraEngine_v2::o2_defineScene(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2_defineScene(%p) (%d, '%s', %d, %d, %d, %d, %d, %d)",
 	       (const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
 	const int scene = stackPos(0);
-	strcpy(_sceneList[scene].filename1, stackPosString(1));
-	strcpy(_sceneList[scene].filename2, stackPosString(1));
+	Common::strlcpy(_sceneList[scene].filename1, stackPosString(1), sizeof(_sceneList[scene].filename1));
+	Common::strlcpy(_sceneList[scene].filename2, stackPosString(1), sizeof(_sceneList[scene].filename2));
 
 	_sceneList[scene].exit1 = stackPos(2);
 	_sceneList[scene].exit2 = stackPos(3);
@@ -323,7 +323,7 @@ int KyraEngine_v2::o2_getVocHigh(EMCState *script) {
 int KyraEngine_v2::o2a_setAnimationShapes(EMCState *script) {
 	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v2::o2a_setAnimationShapes(%p) ('%s', %d, %d, %d, %d, %d)", (const void *)script,
 	       stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
-	strcpy(_animShapeFilename, stackPosString(0));
+	Common::strlcpy(_animShapeFilename, stackPosString(0), sizeof(_animShapeFilename));
 	_animShapeLastEntry = stackPos(1);
 	_animShapeWidth = stackPos(2);
 	_animShapeHeight = stackPos(3);
diff --git a/engines/kyra/sequence/sequences_darkmoon.cpp b/engines/kyra/sequence/sequences_darkmoon.cpp
index b10824b406d..1eb5893dba5 100644
--- a/engines/kyra/sequence/sequences_darkmoon.cpp
+++ b/engines/kyra/sequence/sequences_darkmoon.cpp
@@ -1421,32 +1421,18 @@ void DarkmoonSequenceHelper::printText(int index, int color) {
 		color = 255;
 	}
 
-	char *temp = new char[strlen(_config->strings[index]) + 1];
-	char *str = temp;
-	strcpy(str, _config->strings[index]);
-
+	Common::String str = _config->strings[index];
 	const ScreenDim *dm = _screen->_curDim;
-	int fontHeight = _screen->getFontHeight() + 1;
-
-	for (int yOffs = 0; *str; yOffs += fontHeight) {
-		char *cr = strchr(str, 13);
-
-		if (cr)
-			*cr = 0;
-
-		uint32 len = strlen(str);
-		_screen->printText(str, (dm->sx + ((dm->w - len) >> 1)) << 3, dm->sy + yOffs, color, dm->unkA);
-
-		if (cr) {
-			*cr = 13;
-			str = cr + 1;
-		} else {
-			str += len;
-		}
+	int fontHeight = (_vm->gameFlags().platform == Common::kPlatformPC98) ? (_screen->getFontHeight() << 1) : (_screen->getFontHeight() + 1);
+	int xAlignFactor = (_vm->gameFlags().platform == Common::kPlatformPC98) ? 2 : 1;
+
+	for (int yOffs = 0; !str.empty(); yOffs += fontHeight) {
+		uint linebrk = str.findFirstOf('\r');
+		Common::String str2 = (linebrk != Common::String::npos) ? str.substr(0, linebrk) : str;
+		_screen->printText(str2.c_str(), (dm->sx * xAlignFactor + ((dm->w * xAlignFactor - str2.size()) >> 1)) << (4 - xAlignFactor), dm->sy + yOffs, color, dm->unkA);
+		str = (linebrk != Common::String::npos) ? str.substr(linebrk + 1) : "";
 	}
 
-	delete[] temp;
-
 	if (_vm->gameFlags().platform == Common::kPlatformAmiga)
 		_screen->fadePalette(*_palettes[0], 20);
 	else
diff --git a/engines/kyra/sequence/sequences_hof.cpp b/engines/kyra/sequence/sequences_hof.cpp
index 821b218a6ee..952e8030c5f 100644
--- a/engines/kyra/sequence/sequences_hof.cpp
+++ b/engines/kyra/sequence/sequences_hof.cpp
@@ -420,20 +420,20 @@ SeqPlayer_HOF::SeqPlayer_HOF(KyraEngine_v1 *vm, Screen_v2 *screen, OSystem *syst
 	char **tmpSndLst = new char *[_sequenceSoundListSize];
 
 	for (int i = 0; i < _sequenceSoundListSize; i++) {
-		const int len = strlen(seqSoundList[i]);
+		const int len = Common::strnlen(seqSoundList[i], 8);
 
 		tmpSndLst[i] = new char[len + 1];
 		tmpSndLst[i][0] = 0;
 
 		if (tlkfiles && len > 1) {
 			for (int ii = 0; ii < tempSize; ii++) {
-				if (strlen(tlkfiles[ii]) > 1 && !scumm_stricmp(&seqSoundList[i][1], &tlkfiles[ii][1]))
-					strcpy(tmpSndLst[i], tlkfiles[ii]);
+				if (Common::strnlen(tlkfiles[ii], 8) > 1 && !scumm_stricmp(&seqSoundList[i][1], &tlkfiles[ii][1]))
+					Common::strlcpy(tmpSndLst[i], tlkfiles[ii], len + 1);
 			}
 		}
 
 		if (tmpSndLst[i][0] == 0)
-			strcpy(tmpSndLst[i], seqSoundList[i]);
+			Common::strlcpy(tmpSndLst[i], seqSoundList[i],  len + 1);
 	}
 
 	tlkfiles = seqSoundList = nullptr;
diff --git a/engines/kyra/sequence/sequences_lol.cpp b/engines/kyra/sequence/sequences_lol.cpp
index 09b010beb38..77248eba583 100644
--- a/engines/kyra/sequence/sequences_lol.cpp
+++ b/engines/kyra/sequence/sequences_lol.cpp
@@ -171,20 +171,18 @@ void LoLEngine::setupPrologueData(bool load) {
 
 	const char *const *fileList = _flags.isTalkie ? (_flags.isDemo ? fileListCDDemo : fileListCD) : (_flags.platform == Common::kPlatformFMTowns ? fileListTowns : fileListFloppy);
 
-	char filename[32];
+	Common::String filename;
 	for (uint i = 0; fileList[i]; ++i) {
-		filename[0] = '\0';
+		filename.clear();
 
-		if (_flags.isTalkie && !_flags.isDemo) {
-			strcpy(filename, _languageExt[_lang]);
-			strcat(filename, "/");
-		}
+		if (_flags.isTalkie && !_flags.isDemo)
+			filename = Common::String(_languageExt[_lang]) + "/";
 
-		strcat(filename, fileList[i]);
+		filename += fileList[i];
 
 		if (load) {
 			if (!_res->loadPakFile(filename))
-				error("Couldn't load file: '%s'", filename);
+				error("Couldn't load file: '%s'", filename.c_str());
 		} else {
 			_res->unloadPakFile(filename);
 		}
@@ -575,36 +573,35 @@ int LoLEngine::selectionCharInfo(int character) {
 	if (character < 0)
 		return -1;
 
-	char filename[16];
-	char vocFilename[6];
-	strcpy(vocFilename, "000X0");
+	Common::String filename;
+	Common::String vocFilename = "000X0";
 
 	switch (character) {
 	case 0:
-		strcpy(filename, "FACE09.SHP");
-		vocFilename[3] = 'A';
+		filename = "FACE09.SHP";
+		vocFilename.setChar('A', 3);
 		break;
 
 	case 1:
-		strcpy(filename, "FACE01.SHP");
-		vocFilename[3] = 'M';
+		filename = "FACE01.SHP";
+		vocFilename.setChar('M', 3);
 		break;
 
 	case 2:
-		strcpy(filename, "FACE08.SHP");
-		vocFilename[3] = 'K';
+		filename = "FACE08.SHP";
+		vocFilename.setChar('K', 3);
 		break;
 
 	case 3:
-		strcpy(filename, "FACE05.SHP");
-		vocFilename[3] = 'C';
+		filename = "FACE05.SHP";
+		vocFilename.setChar('C', 3);
 		break;
 
 	default:
 		break;
 	}
 
-	_screen->loadBitmap(filename, 9, 9, 0);
+	_screen->loadBitmap(filename.c_str(), 9, 9, 0);
 	_screen->copyRegion(0, 122, 0, 122, 320, 78, 4, 0, Screen::CR_NO_P_CHECK);
 	_screen->copyRegion(_charPreviews[character].x - 3, _charPreviews[character].y - 3, 8, 127, 38, 38, 2, 0);
 
@@ -656,17 +653,17 @@ int LoLEngine::selectionCharInfo(int character) {
 	return character;
 }
 
-void LoLEngine::selectionCharInfoIntro(char *file) {
-	int index = 0;
-	file[4] = '0';
+void LoLEngine::selectionCharInfoIntro(Common::String &file) {
+	char index = '\0';
+	file.setChar('0', 4);
 	bool processAnim = true;
 
 	while (_charSelectionInfoResult == -1 && !shouldQuit()) {
-		if (speechEnabled() && !_sound->isVoicePresent(file))
+		if (speechEnabled() && !_sound->isVoicePresent(file.c_str()))
 			break;
 
 		if (_flags.isTalkie)
-			_sound->voicePlay(file, &_speechHandle);
+			_sound->voicePlay(file.c_str(), &_speechHandle);
 
 		int i = 0;
 		while ((!speechEnabled() || (speechEnabled() && _sound->voiceIsPlaying(&_speechHandle))) && _charSelectionInfoResult == -1 && !shouldQuit()) {
@@ -686,7 +683,7 @@ void LoLEngine::selectionCharInfoIntro(char *file) {
 		}
 
 		_sound->voiceStop(&_speechHandle);
-		file[4] = ++index + '0';
+		file.setChar(++index + '0', 4);
 	}
 
 	_screen->drawShape(0, _screen->getPtrToShape(_screen->getCPagePtr(9), 0), 11, 130, 0, 0);
@@ -811,7 +808,7 @@ void HistoryPlayer::play() {
 	char tempWsaFilename[16];
 	char voiceFilename[13];
 	// the 'a' *has* to be lowercase
-	strcpy(voiceFilename, "PS_1a");
+	Common::strlcpy(voiceFilename, "PS_1a", sizeof(voiceFilename));
 
 	int part = 0;
 	Sound *sound = _vm->sound();
@@ -870,7 +867,7 @@ void HistoryPlayer::play() {
 					sound->voicePlay(voiceFilename);
 					playWsa(true);
 
-					strcpy(tempWsaFilename, &data[part * 15]);
+					Common::strlcpy(tempWsaFilename, &data[part * 15], sizeof(tempWsaFilename));
 
 					for (int i = 1; i < 4 && !_vm->shouldQuit(); ++i) {
 						uint32 nextTime = _system->getMillis() + 30 * _vm->tickLength();
@@ -1046,20 +1043,18 @@ void LoLEngine::setupEpilogueData(bool load) {
 	const char *const *fileList = _flags.isTalkie ? fileListCD : (_flags.platform == Common::kPlatformFMTowns ? fileListTowns : fileListFloppy);
 	assert(fileList);
 
-	char filename[32];
+	Common::String filename;
 	for (uint i = 0; fileList[i]; ++i) {
-		filename[0] = '\0';
+		filename.clear();
 
-		if (_flags.isTalkie) {
-			strcpy(filename, _languageExt[_lang]);
-			strcat(filename, "/");
-		}
+		if (_flags.isTalkie)
+			filename = Common::String(_languageExt[_lang]) + "/";
 
-		strcat(filename, fileList[i]);
+		filename += fileList[i];
 
 		if (load) {
 			if (!_res->loadPakFile(filename))
-				error("Couldn't load file: '%s'", filename);
+				error("Couldn't load file: '%s'", filename.c_str());
 		} else {
 			_res->unloadPakFile(filename);
 		}
diff --git a/engines/kyra/text/text.cpp b/engines/kyra/text/text.cpp
index 28b62e211d3..d6e9c10468f 100644
--- a/engines/kyra/text/text.cpp
+++ b/engines/kyra/text/text.cpp
@@ -90,7 +90,7 @@ int TextDisplayer::dropCRIntoString(char *str, int offs) {
 char *TextDisplayer::preprocessString(const char *str) {
 	if (str != _talkBuffer) {
 		assert(strlen(str) < sizeof(_talkBuffer) - 1);
-		strcpy(_talkBuffer, str);
+		Common::strlcpy(_talkBuffer, str, sizeof(_talkBuffer));
 	}
 
 	if (_vm->gameFlags().lang == Common::ZH_TWN)
diff --git a/engines/kyra/text/text_hof.cpp b/engines/kyra/text/text_hof.cpp
index ea4dd6ab4b1..f4e87d0793f 100644
--- a/engines/kyra/text/text_hof.cpp
+++ b/engines/kyra/text/text_hof.cpp
@@ -80,7 +80,7 @@ void TextDisplayer_HoF::printCustomCharacterText(const char *text, int x, int y,
 char *TextDisplayer_HoF::preprocessString(const char *str) {
 	if (str != _talkBuffer) {
 		assert(strlen(str) < sizeof(_talkBuffer) - 1);
-		strcpy(_talkBuffer, str);
+		Common::strlcpy(_talkBuffer, str, sizeof(_talkBuffer));
 	}
 
 	if (_vm->gameFlags().lang == Common::ZH_TWN)
@@ -558,20 +558,13 @@ void KyraEngine_HoF::processDialogue(int dlgOffset, int vocH, int csEntry) {
 void KyraEngine_HoF::initTalkObject(int index) {
 	TalkObject &object = _talkObjectList[index];
 
-	char STAFilename[13];
-	char ENDFilename[13];
+	Common::String STAFilename = Common::String(object.filename) + "_STA.TIM";
+	_TLKFilename = Common::String(object.filename) + "_TLK.TIM";
+	Common::String ENDFilename = Common::String(object.filename) + "_END.TIM";
 
-	strcpy(STAFilename, object.filename);
-	strcpy(_TLKFilename, object.filename);
-	strcpy(ENDFilename, object.filename);
-
-	strcat(STAFilename + 4, "_STA.TIM");
-	strcat(_TLKFilename + 4, "_TLK.TIM");
-	strcat(ENDFilename + 4, "_END.TIM");
-
-	_currentTalkSections.STATim = _tim->load(STAFilename, &_timOpcodes);
-	_currentTalkSections.TLKTim = _tim->load(_TLKFilename, &_timOpcodes);
-	_currentTalkSections.ENDTim = _tim->load(ENDFilename, &_timOpcodes);
+	_currentTalkSections.STATim = _tim->load(STAFilename.c_str(), &_timOpcodes);
+	_currentTalkSections.TLKTim = _tim->load(_TLKFilename.c_str(), &_timOpcodes);
+	_currentTalkSections.ENDTim = _tim->load(ENDFilename.c_str(), &_timOpcodes);
 
 	if (object.scriptId != -1) {
 		_specialSceneScriptStateBackup[object.scriptId] = _specialSceneScriptState[object.scriptId];
@@ -620,7 +613,7 @@ void KyraEngine_HoF::npcChatSequence(const Common::String &str, int objectId, in
 	objectChatInit(str, objectId, vocHigh, vocLow);
 
 	if (!_currentTalkSections.TLKTim)
-		_currentTalkSections.TLKTim = _tim->load(_TLKFilename, &_timOpcodes);
+		_currentTalkSections.TLKTim = _tim->load(_TLKFilename.c_str(), &_timOpcodes);
 
 	setNextIdleAnimTimer();
 
diff --git a/engines/kyra/text/text_lol.cpp b/engines/kyra/text/text_lol.cpp
index 320289cb5b8..3aebaa23a20 100644
--- a/engines/kyra/text/text_lol.cpp
+++ b/engines/kyra/text/text_lol.cpp
@@ -133,7 +133,7 @@ void TextDisplayer_LoL::expandField() {
 	}
 }
 
-void TextDisplayer_LoL::printDialogueText2(int dim, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
+void TextDisplayer_LoL::printDialogueText2(int dim, const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
 	int oldDim = 0;
 
 	if (dim == 3) {
@@ -163,7 +163,7 @@ void TextDisplayer_LoL::printDialogueText2(int dim, char *str, EMCState *script,
 	Screen::FontId of = _screen->setFont(_pc98TextMode ? Screen::FID_SJIS_TEXTMODE_FNT : Screen::FID_9_FNT);
 
 	preprocessString(str, script, paramList, paramIndex);
-	_numCharsTotal = strlen(_dialogueBuffer);
+	_numCharsTotal = Common::strnlen(_dialogueBuffer, 2559);
 	displayText(_dialogueBuffer);
 
 	_screen->setScreenDim(oldDim);
@@ -224,10 +224,10 @@ void TextDisplayer_LoL::printMessage(uint16 type, const char *str, ...) {
 	_vm->_fadeText = false;
 }
 
-void TextDisplayer_LoL::preprocessString(char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
+void TextDisplayer_LoL::preprocessString(const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex) {
 	char *dst = _dialogueBuffer;
 
-	for (char *s = str; *s;) {
+	for (const char *s = str; *s;) {
 		if (_vm->gameFlags().lang == Common::JA_JPN) {
 			uint8 c = *s;
 			if (c >= 0xE0 || (c > 0x80 && c < 0xA0)) {
@@ -300,26 +300,26 @@ void TextDisplayer_LoL::preprocessString(char *str, EMCState *script, const uint
 
 		switch (para) {
 		case 'a':
-			strcpy(dst, Common::String::format("%d", _scriptTextParameter).c_str());
-			dst += strlen(dst);
+			Common::strlcpy(dst, Common::String::format("%d", _scriptTextParameter).c_str(), 2560 - (dst - _dialogueBuffer));
+			dst += Common::strnlen(dst, 2559 - (dst - _dialogueBuffer));
 			break;
 
 		case 'n':
-			strcpy(dst, _vm->_characters[script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]].name);
-			dst += strlen(dst);
+			Common::strlcpy(dst, _vm->_characters[script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]].name, 2560 - (dst - _dialogueBuffer));
+			dst += Common::strnlen(dst, 2559 - (dst - _dialogueBuffer));
 			break;
 
 		case 's':
-			strcpy(dst, _vm->getLangString(script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]));
-			dst += strlen(dst);
+			Common::strlcpy(dst, _vm->getLangString(script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]), 2560 - (dst - _dialogueBuffer));
+			dst += Common::strnlen(dst, 2559 - (dst - _dialogueBuffer));
 			break;
 
 		case 'X':
 		case 'd':
 		case 'u':
 		case 'x':
-			strcpy(dst, Common::String::format("%d", script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]).c_str());
-			dst += strlen(dst);
+			Common::strlcpy(dst, Common::String::format("%d", script ? script->stack[script->sp + paramIndex] : paramList[paramIndex]).c_str(), 2560 - (dst - _dialogueBuffer));
+			dst += Common::strnlen(dst, 2559 - (dst - _dialogueBuffer));
 			break;
 
 		case '\0':
@@ -339,7 +339,7 @@ Screen *TextDisplayer_LoL::screen() {
 }
 
 void TextDisplayer_LoL::textPageBreak() {
-	strcpy(_pageBreakString, _vm->getLangString(0x4073));
+	_pageBreakString = _vm->getLangString(0x4073);
 	TextDisplayer_rpg::textPageBreak();
 }
 
diff --git a/engines/kyra/text/text_lol.h b/engines/kyra/text/text_lol.h
index faf5b8c38a2..9a23671be6f 100644
--- a/engines/kyra/text/text_lol.h
+++ b/engines/kyra/text/text_lol.h
@@ -43,7 +43,7 @@ public:
 	void setupField(bool mode);
 	void expandField();
 
-	void printDialogueText2(int dim, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
+	void printDialogueText2(int dim, const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
 	void printMessage(uint16 type, const char *str, ...) GCC_PRINTF(3, 4);
 
 	int16 _scriptTextParameter;
@@ -52,7 +52,7 @@ private:
 	KyraRpgEngine *vm() override;
 	Screen *screen() override;
 
-	void preprocessString(char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
+	void preprocessString(const char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
 	void textPageBreak() override;
 
 	char *_stringParameters[15];
diff --git a/engines/kyra/text/text_mr.cpp b/engines/kyra/text/text_mr.cpp
index 47974deadb2..b3e90d8349b 100644
--- a/engines/kyra/text/text_mr.cpp
+++ b/engines/kyra/text/text_mr.cpp
@@ -33,7 +33,7 @@ TextDisplayer_MR::TextDisplayer_MR(KyraEngine_MR *vm, Screen_MR *screen)
 char *TextDisplayer_MR::preprocessString(const char *str) {
 	if (_talkBuffer != str) {
 		assert(strlen(str) < sizeof(_talkBuffer) - 1);
-		strcpy(_talkBuffer, str);
+		Common::strlcpy(_talkBuffer, str, sizeof(_talkBuffer));
 	}
 
 	char *p = _talkBuffer;
diff --git a/engines/kyra/text/text_rpg.cpp b/engines/kyra/text/text_rpg.cpp
index 940a959d0d8..f05fb510a5c 100644
--- a/engines/kyra/text/text_rpg.cpp
+++ b/engines/kyra/text/text_rpg.cpp
@@ -111,7 +111,7 @@ void TextDisplayer_rpg::resetDimTextPositions(int dim) {
 
 void TextDisplayer_rpg::resetPageBreakString() {
 	if (_vm->_moreStrings)
-		strcpy(_pageBreakString, _vm->_moreStrings[0]);
+		_pageBreakString = _vm->_moreStrings[0];
 }
 
 void TextDisplayer_rpg::setPageBreakFlag() {
@@ -157,10 +157,10 @@ void TextDisplayer_rpg::displayText(char *str, ...) {
 
 		if (!_tempString2 && c == '%') {
 			if (a == 'd') {
-				strcpy(_scriptParaString, Common::String::format("%d", va_arg(args, int)).c_str());
-				_tempString2 = _scriptParaString;
+				_scriptParaString = Common::String::format("%d", va_arg(args, int));
+				_tempString2 = _scriptParaString.c_str();
 			} else if (a == 's') {
-				_tempString2 = va_arg(args, char*);
+				_tempString2 = va_arg(args, const char*);
 			} else {
 				break;
 			}
@@ -547,7 +547,7 @@ void TextDisplayer_rpg::printDialogueText(int stringId, const char *pageBreakStr
 
 	if (pageBreakString) {
 		if (pageBreakString[0]) {
-			strcpy(_pageBreakString, pageBreakString);
+			_pageBreakString = pageBreakString;
 			displayWaitButton();
 			resetPageBreakString();
 		}
@@ -557,10 +557,9 @@ void TextDisplayer_rpg::printDialogueText(int stringId, const char *pageBreakStr
 }
 
 void TextDisplayer_rpg::printDialogueText(const char *str, bool wait) {
-	assert(strlen(str) < kEoBTextBufferSize);
+	assert(Common::strnlen(str, kEoBTextBufferSize) < kEoBTextBufferSize);
 	Common::strlcpy(_dialogueBuffer, str, kEoBTextBufferSize);
 
-	strcpy(_dialogueBuffer, str);
 	displayText(_dialogueBuffer);
 	if (wait)
 		displayWaitButton();
@@ -658,12 +657,12 @@ void TextDisplayer_rpg::textPageBreak() {
 
 	if (_vm->game() == GI_LOL && _vm->gameFlags().use16ColorMode) {
 		_vm->gui_drawBox(x + 8, (y & ~7) - 1, 66, 10, 0xEE, 0xCC, -1);
-		_screen->printText(_pageBreakString, (x + 37 - (strlen(_pageBreakString) << 1) + 4) & ~3, (y + 2) & ~7, 0xC1, 0);
+		_screen->printText(_pageBreakString.c_str(), (x + 37 - (_pageBreakString.size() << 1) + 4) & ~3, (y + 2) & ~7, 0xC1, 0);
 	} else {
 		_screen->set16bitShadingLevel(4);
 		_vm->gui_drawBox(x, y, w, _vm->guiSettings()->buttons.height, _vm->guiSettings()->colors.frame1, _vm->guiSettings()->colors.frame2, _vm->guiSettings()->colors.fill);
 		_screen->set16bitShadingLevel(0);
-		_screen->printText(_pageBreakString, x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString) >> 1), y + _vm->guiSettings()->buttons.txtOffsY, _vm->_dialogueButtonLabelColor1, 0);
+		_screen->printText(_pageBreakString.c_str(), x + (w >> 1) - (_vm->screen()->getTextWidth(_pageBreakString.c_str()) >> 1), y + _vm->guiSettings()->buttons.txtOffsY, _vm->_dialogueButtonLabelColor1, 0);
 	}
 
 	_vm->removeInputTop();
@@ -741,7 +740,7 @@ void TextDisplayer_rpg::textPageBreak() {
 
 void TextDisplayer_rpg::displayWaitButton() {
 	_vm->_dialogueNumButtons = 1;
-	_vm->_dialogueButtonString[0] = _pageBreakString;
+	_vm->_dialogueButtonString[0] = _pageBreakString.c_str();
 	_vm->_dialogueButtonString[1] = 0;
 	_vm->_dialogueButtonString[2] = 0;
 	_vm->_dialogueHighlightedButton = 0;
diff --git a/engines/kyra/text/text_rpg.h b/engines/kyra/text/text_rpg.h
index 7e941963d6f..c6a8a9e7212 100644
--- a/engines/kyra/text/text_rpg.h
+++ b/engines/kyra/text/text_rpg.h
@@ -71,8 +71,8 @@ protected:
 
 	char *_dialogueBuffer;
 
-	char *_tempString1;
-	char *_tempString2;
+	const char *_tempString1;
+	const char *_tempString2;
 	char *_currentLine;
 	char _ctrl[3];
 
@@ -85,8 +85,8 @@ protected:
 	bool _sjisTextModeLineBreak;
 	const bool _pc98TextMode;
 
-	char _pageBreakString[20];
-	char _scriptParaString[11];
+	Common::String _pageBreakString;
+	Common::String _scriptParaString;
 	int _lineCount;
 
 	bool _allowPageBreak;




More information about the Scummvm-git-logs mailing list