[Scummvm-git-logs] scummvm master -> 8eadac5eeda901f5a81766b86c4a87b86a143ebf

bluegr noreply at scummvm.org
Sat Apr 16 02:31:12 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:
8eadac5eed CHEWY: Refactor handling of scene text


Commit: 8eadac5eeda901f5a81766b86c4a87b86a143ebf
    https://github.com/scummvm/scummvm/commit/8eadac5eeda901f5a81766b86c4a87b86a143ebf
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2022-04-16T05:30:46+03:00

Commit Message:
CHEWY: Refactor handling of scene text

Changed paths:
    engines/chewy/atds.cpp
    engines/chewy/atds.h
    engines/chewy/text.cpp
    engines/chewy/text.h


diff --git a/engines/chewy/atds.cpp b/engines/chewy/atds.cpp
index 44813040d72..c35d1c5e062 100644
--- a/engines/chewy/atds.cpp
+++ b/engines/chewy/atds.cpp
@@ -92,12 +92,9 @@ Atdsys::Atdsys() {
 	_atdsv.aad_str = nullptr;
 	_atdsv._vocNr = -1;
 	_atdsv._eventsEnabled = true;
-	_ssret._next = false;
-	_ssr = &_ssret;
 	for (int16 i = 0; i < AAD_MAX_PERSON; i++)
 		_ssi[i] = init_ssi;
 	_invBlockNr = -1;
-	_invUseMem = nullptr;
 
 	_dialogResource = new DialogResource(ADS_TXT_STEUER);
 	_text = new Text();
@@ -120,9 +117,6 @@ Atdsys::~Atdsys() {
 		_atdsMem[i] = nullptr;	
 	}
 
-	if (_invUseMem)
-		free(_invUseMem);
-
 	delete _dialogResource;
 }
 
@@ -191,16 +185,16 @@ int16 Atdsys::get_delay(int16 txt_len) {
 	return ret;
 }
 
-SplitStringRet *Atdsys::split_string(SplitStringInit *ssi_) {
+void Atdsys::split_string(SplitStringInit *ssi_, SplitStringRet *ret) {
 	const int16 w = _G(fontMgr)->getFont()->getDataWidth();
 	const int16 h = _G(fontMgr)->getFont()->getDataHeight();
 	const int16 width = 220;
 	const int16 lines = 4;
 
-	_ssret._nr = 0;
-	_ssret._next = false;
-	_ssret._strPtr = _splitPtr;
-	_ssret._x = _splitX;
+	ret->_nr = 0;
+	ret->_next = false;
+	ret->_strPtr = _splitPtr;
+	ret->_x = _splitX;
 	int16 zeichen_anz = (width / w) + 1;
 	memset(_splitPtr, 0, sizeof(char *) * MAX_STR_SPLIT);
 	calc_txt_win(ssi_);
@@ -228,11 +222,11 @@ SplitStringRet *Atdsys::split_string(SplitStringInit *ssi_) {
 				++str_adr;
 				++count;
 			} else {
-				_splitPtr[_ssret._nr] = start_adr;
+				_splitPtr[ret->_nr] = start_adr;
 				start_adr[tmp_count] = 0;
-				_splitX[_ssret._nr] = ssi_->_x + ((width - (strlen(start_adr) * w)) >> 1);
-				++_ssret._nr;
-				if (_ssret._nr == lines) {
+				_splitX[ret->_nr] = ssi_->_x + ((width - (strlen(start_adr) * w)) >> 1);
+				++ret->_nr;
+				if (ret->_nr == lines) {
 					endLoop = true;
 					bool endInnerLoop = false;
 					while (!endInnerLoop) {
@@ -240,7 +234,7 @@ SplitStringRet *Atdsys::split_string(SplitStringInit *ssi_) {
 							endInnerLoop = true;
 						else if (*str_adr != ' ' && *str_adr != 0) {
 							endInnerLoop = true;
-							_ssret._next = true;
+							ret->_next = true;
 						}
 						++str_adr;
 					}
@@ -267,22 +261,22 @@ SplitStringRet *Atdsys::split_string(SplitStringInit *ssi_) {
 					test_zeilen = 2;
 				++count;
 				++str_adr;
-				if ((_ssret._nr + test_zeilen) >= lines) {
+				if (ret->_nr + test_zeilen >= lines) {
 					if (count < zeichen_anz) {
 						tmp_count = count;
 						endLoop = true;
 					}
-					_splitPtr[_ssret._nr] = start_adr;
+					_splitPtr[ret->_nr] = start_adr;
 					start_adr[tmp_count] = 0;
-					_splitX[_ssret._nr] = ssi_->_x + ((width - (strlen(start_adr) * w)) >> 1);
-					++_ssret._nr;
+					_splitX[ret->_nr] = ssi_->_x + ((width - (strlen(start_adr) * w)) >> 1);
+					++ret->_nr;
 					bool ende1 = false;
 					while (!ende1) {
 						if (*str_adr == ATDS_END_TEXT)
 							ende1 = true;
 						else if (*str_adr != ' ' && *str_adr != 0) {
 							ende1 = true;
-							_ssret._next = true;
+							ret->_next = true;
 						}
 						++str_adr;
 					}
@@ -306,12 +300,10 @@ SplitStringRet *Atdsys::split_string(SplitStringInit *ssi_) {
 
 		}
 	}
-	if (_ssret._nr <= lines)
-		_ssret._y = ssi_->_y + (lines - _ssret._nr) * h;
+	if (ret->_nr <= lines)
+		ret->_y = ssi_->_y + (lines - ret->_nr) * h;
 	else
-		_ssret._y = ssi_->_y;
-
-	return &_ssret;
+		ret->_y = ssi_->_y;
 }
 
 void Atdsys::str_null2leer(char *strStart, char *strEnd) {
@@ -356,20 +348,6 @@ void Atdsys::set_handle(const char *fname, int16 mode, int16 chunkStart, int16 c
 		free(_atdsMem[mode]);
 	_atdsMem[mode] = tmp_adr;
 	_atdsPoolOff[mode] = chunkStart;
-
-	if (mode == INV_USE_DATA) {
-		const uint32 chunkSize = _text->getChunk(chunkStart)->size;
-		const uint8 *chunkData = _text->getChunkData(chunkStart);
-
-		free(_invUseMem);
-		_invUseMem = (char *)MALLOC(chunkSize + 3l);
-		memcpy(_invUseMem, chunkData, chunkSize);
-		delete[] chunkData;
-
-		_invUseMem[chunkSize] = (char)BLOCKENDE;
-		_invUseMem[chunkSize + 1] = (char)BLOCKENDE;
-		_invUseMem[chunkSize + 2] = (char)BLOCKENDE;
-	}
 }
 
 void Atdsys::load_atds(int16 chunkNr, int16 mode) {
@@ -399,9 +377,7 @@ void Atdsys::set_ats_mem(int16 mode) {
 		break;
 
 	case INV_USE_DEF:
-		_ats_sheader = _G(gameState).InvUseDef;
-		_atsMem = _invUseMem;
-		break;
+		error("set_ats_mem() called with mode INV_USE_DEF");
 
 	case INV_ATS_DATA:
 		_ats_sheader = _G(gameState).InvAts;
@@ -417,40 +393,37 @@ bool Atdsys::start_ats(int16 txtNr, int16 txtMode, int16 color, int16 mode, int1
 	assert(mode == ATS_DATA || mode == INV_USE_DATA || mode == INV_USE_DEF);
 
 	*vocNr = -1;
-	set_ats_mem(mode);
 
-	_atsv.shown = false;
-
-	if (_atsMem) {
-		//const uint8 roomNum = _G(room)->_roomInfo->_roomNr;
-		int16 txt_anz;
-		_atsv._ptr = ats_get_txt(txtNr, txtMode, &txt_anz, mode);
-		//Common::StringArray tmp = getTextArray(roomNum, txtNr, mode, txtMode);
+	if (mode != INV_USE_DEF)
+		set_ats_mem(mode);
 
-		if (_atsv._ptr) {
-			_atsv.shown = g_engine->_sound->subtitlesEnabled();
-			char *ptr = _atsv._ptr;
-			_atsv._txtLen = 0;
-
-			while (*ptr++ != ATDS_END_TEXT)
-				++_atsv._txtLen;
+	_atsv.shown = false;
 
-			*vocNr = _atsv.vocNum - ATDS_VOC_OFFSET;
+	Common::StringArray textArray;
 
-			if ((byte)*_atsv._ptr == 248) {
-				// Special code for no message to display
-				_atsv.shown = false;
+	if (mode != INV_USE_DEF) {
+		const uint8 roomNum = _G(room)->_roomInfo->_roomNr;
+		textArray = getTextArray(roomNum, txtNr, mode, txtMode);
+	} else {
+		textArray = getTextArray(0, txtNr, mode, -1);
+	}
 
-			} else {
-				_atsv._delayCount = get_delay(_atsv._txtLen);
-				_printDelayCount1 = _atsv._delayCount / 10;
-				_atsv._color = color;
-				_mousePush = true;
+	_atsv.text.clear();
+	for (int i = 0; i < textArray.size(); i++)
+		_atsv.text += textArray[i] + " ";
+	_atsv.text.deleteLastChar();
+
+	if (_atsv.text.size() > 0) {
+		*vocNr = txtMode != TXT_MARK_NAME ? _text->getLastSpeechId() : -1;
+		_atsv.shown = g_engine->_sound->subtitlesEnabled();
+		_atsv._txtMode = txtMode;
+		_atsv._delayCount = get_delay(_atsv.text.size());
+		_atsv._color = color;
+		_printDelayCount1 = _atsv._delayCount / 10;
+		_mousePush = true;
 
-				if (*vocNr == -1) {
-					_atsv.shown = g_engine->_sound->subtitlesEnabled();
-				}
-			}
+		if (*vocNr == -1) {
+			_atsv.shown = g_engine->_sound->subtitlesEnabled();
 		}
 	}
 
@@ -468,7 +441,7 @@ void Atdsys::print_ats(int16 x, int16 y, int16 scrX, int16 scrY) {
 			case Common::KEYCODE_ESCAPE:
 			case Common::KEYCODE_RETURN:
 			case MOUSE_LEFT:
-				if (_mousePush == false) {
+				if (!_mousePush) {
 					if (_atsv._silentCount <= 0 && _atsv._delayCount > _printDelayCount1) {
 						_mousePush = true;
 						_atsv._delayCount = 0;
@@ -487,46 +460,48 @@ void Atdsys::print_ats(int16 x, int16 y, int16 scrX, int16 scrY) {
 		}
 
 		if (_atsv._silentCount <= 0) {
-			char *tmp_ptr = _atsv._ptr;
-			SplitStringInit *_atsSsi = &_ssi[0];
-			_atsSsi->_str = tmp_ptr;
-			_atsSsi->_x = x - scrX;
-			_atsSsi->_y = y - scrY;
-			char *start_ptr = tmp_ptr;
-			str_null2leer(start_ptr, start_ptr + _atsv._txtLen - 1);
-			_ssr = split_string(_atsSsi);
+			// TODO: Rewrite this
+			SplitStringInit *atsSsi = &_ssi[0];
+			char *txt = new char[_atsv.text.size() + 2];
 			const int16 h = _G(fontMgr)->getFont()->getDataHeight();
-
-			for (int16 i = 0; i < _ssr->_nr; i++) {
-				_G(out)->printxy(_ssr->_x[i],
-				              _ssr->_y + (i * h) + 1,
-				              0, 300, 0, _ssr->_strPtr[i]);
-				_G(out)->printxy(_ssr->_x[i],
-				              _ssr->_y + (i * h) - 1,
-				              0, 300, 0, _ssr->_strPtr[i]);
-				_G(out)->printxy(_ssr->_x[i] + 1,
-				              _ssr->_y + (i * h),
-				              0, 300, 0, _ssr->_strPtr[i]);
-				_G(out)->printxy(_ssr->_x[i] - 1,
-				              _ssr->_y + (i * h),
-				              0, 300, 0, _ssr->_strPtr[i]);
-				_G(out)->printxy(_ssr->_x[i],
-				              _ssr->_y + (i * h),
+			uint shownLen = 0;
+			SplitStringRet splitString;
+
+			Common::strlcpy(txt, _atsv.text.c_str(), _atsv.text.size() + 1);
+			txt[_atsv.text.size() + 1] = ATDS_END_TEXT;
+			atsSsi->_str = txt;
+			atsSsi->_x = x - scrX;
+			atsSsi->_y = y - scrY;
+			split_string(atsSsi, &splitString);
+
+			for (int16 i = 0; i < splitString._nr; i++) {
+				_G(out)->printxy(splitString._x[i],
+								 splitString._y + (i * h) + 1,
+								 0, 300, 0, splitString._strPtr[i]);
+				_G(out)->printxy(splitString._x[i],
+								 splitString._y + (i * h) - 1,
+								 0, 300, 0, splitString._strPtr[i]);
+				_G(out)->printxy(splitString._x[i] + 1,
+				              splitString._y + (i * h),
+				              0, 300, 0, splitString._strPtr[i]);
+				_G(out)->printxy(splitString._x[i] - 1,
+				              splitString._y + (i * h),
+				              0, 300, 0, splitString._strPtr[i]);
+				_G(out)->printxy(splitString._x[i],
+				              splitString._y + (i * h),
 				              _atsv._color,
-				              300, 0, _ssr->_strPtr[i]);
-				tmp_ptr += strlen(_ssr->_strPtr[i]) + 1;
+				              300, 0, splitString._strPtr[i]);
+
+				shownLen += strlen(splitString._strPtr[i]) + 1;
 			}
 
-			str_null2leer(start_ptr, start_ptr + _atsv._txtLen - 1);
+			delete[] txt;
+
 			if (_atsv._delayCount <= 0) {
-				if (_ssr->_next == false) {
+				if (!splitString._next) {
 					_atsv.shown = false;
 				} else {
-					_atsv._ptr = tmp_ptr;
-					_atsv._txtLen = 0;
-					while (*tmp_ptr++ != ATDS_END_TEXT)
-						++_atsv._txtLen;
-					_atsv._delayCount = get_delay(_atsv._txtLen);
+					_atsv._delayCount = get_delay(_atsv.text.size() - shownLen);
 					_printDelayCount1 = _atsv._delayCount / 10;
 					_atsv._silentCount = _atdsv._silent;
 				}
@@ -539,67 +514,6 @@ void Atdsys::print_ats(int16 x, int16 y, int16 scrX, int16 scrY) {
 	}
 }
 
-char *Atdsys::ats_get_txt(int16 txtNr, int16 txtMode, int16 *retNr, int16 mode) {
-	char *str_ = nullptr;
-
-	assert(mode == ATS_DATA || mode == INV_USE_DATA || mode == INV_USE_DEF);
-	set_ats_mem(mode);
-
-	_atsv._txtMode = txtMode;
-
-	if (!getControlBit(txtNr, ATS_ACTIVE_BIT)) {
-		uint8 status = _ats_sheader[(txtNr * MAX_ATS_STATUS) + (_atsv._txtMode + 1) / 2];
-		int16 ak_nybble = (_atsv._txtMode + 1) % 2;
-
-		uint8 lo_hi[2];
-		lo_hi[1] = status >> 4;
-		lo_hi[0] = status &= 15;
-		str_ = ats_search_block(_atsv._txtMode, _atsMem);
-		if (str_ != nullptr) {
-			ats_search_nr(txtNr, &str_);
-			if (str_ != nullptr) {
-				ats_search_str(retNr, &lo_hi[ak_nybble], (uint8)_ats_sheader[txtNr * MAX_ATS_STATUS], &str_);
-
-				if (str_ != nullptr) {
-					status = 0;
-					lo_hi[1] <<= 4;
-					status |= lo_hi[0];
-					status |= lo_hi[1];
-					_ats_sheader[(txtNr * MAX_ATS_STATUS) + (_atsv._txtMode + 1) / 2] = status;
-				}
-			}
-		}
-	}
-
-	// WORKAROUND: Proper word wrapping some inventory items' look desc
-	if (txtMode == TXT_MARK_LOOK && str_ != nullptr) {
-		switch (txtNr) {
-		case CYB_KRONE_INV:
-			if (str_[37] == ' ' && str_[56] == '\0') {
-				str_[37] = '\0';
-				str_[56] = ' ';
-			}
-			break;
-		case YEL_CARD_INV:
-			if (str_[39] == ' ' && str_[46] == '\0') {
-				str_[39] = '\0';
-				str_[46] = ' ';
-			}
-			break;
-		case PAPIER_INV:
-			if (str_[32] == ' ') {
-				str_[32] = '\0';
-				*retNr = 2;
-			}
-			break;
-		default:
-			break;
-		}
-	}
-
-	return str_;
-}
-
 void Atdsys::set_ats_str(int16 txtNr, int16 txtMode, int16 strNr, int16 mode) {
 	set_ats_mem(mode);
 	uint8 status = _ats_sheader[(txtNr * MAX_ATS_STATUS) + (txtMode + 1) / 2];
@@ -648,131 +562,6 @@ void Atdsys::delControlBit(int16 txtNr, int16 bitIdx) {
 	_ats_sheader[txtNr * MAX_ATS_STATUS] &= ~bitIdx;
 }
 
-char *Atdsys::ats_search_block(int16 txtMode, char *txtAdr) {
-	char *strP = txtAdr;
-	int ende = 0;
-
-	for (; !ende; ++strP) {
-		if (strP[0] == (char)BLOCKENDE &&
-		        strP[1] == (char)BLOCKENDE &&
-		        strP[2] == (char)BLOCKENDE) {
-			ende = 2;
-		} else if (strP[0] == (char)0xf2 && strP[1] == (char)0xfe) {
-			if (strP[2] == (char)txtMode)
-				ende = 1;
-			strP += 2;
-		}
-	}
-
-	if (ende == 2)
-		strP = nullptr;
-
-	return strP;
-}
-
-void Atdsys::ats_search_nr(int16 txtNr, char **str) {
-	char *start_str = *str;
-
-	bool done1 = false;
-	while (!done1) {
-		Common::MemoryReadStream rs1((const byte *)start_str + 2, AtsTxtHeader::SIZE());
-		_atsv._txtHeader.load(&rs1);
-
-		if (READ_LE_UINT16(start_str) == 0xFEF0 &&
-				_atsv._txtHeader._txtNr == txtNr) {
-			// Found match
-			*str = start_str + 2 + AtsTxtHeader::SIZE();
-
-			if (_atsv._txtMode) {
-				_atsv.vocNum = READ_LE_UINT16(str);
-			}
-
-			*str += 2;	// voc number
-			break;
-		}
-
-		start_str += 2 + AtsTxtHeader::SIZE() + 2;	// txt header + voc number
-
-		// Need to iterate over the following string to next entry
-		bool done2 = false;
-		for (; !done2; start_str++) {
-			if (*start_str == 13) {
-				// Reached end of line
-				if (READ_LE_UINT16(start_str + 1) == 0xFEF1)
-					start_str += 4;
-				else if (start_str[1] == 0xe) {
-					++start_str;
-					if (start_str[1] == 0xf && start_str[2] == 0xf && start_str[3] == 0xf) {
-						done1 = done2 = true;
-						*str = nullptr;
-					} else {
-						done2 = true;
-					}
-				}
-			}
-		}
-	}
-}
-
-void Atdsys::ats_search_str(int16 *nr, uint8 *status, uint8 controlByte, char **str) {
-	char *tmp_str = *str;
-	char *start_str = *str;
-	*nr = 0;
-	bool endLoop = false;
-	int16 count = 0;
-
-	while (!endLoop) {
-		if (count == *status) {
-			if (!*tmp_str) {
-				++*nr;
-			} else if (*tmp_str == ATDS_END_TEXT) {
-				endLoop = true;
-				*str = start_str;
-				start_str -= 2;	// voc number
-
-				if (_atsv._txtMode != TXT_MARK_NAME) {
-					_atsv.vocNum = READ_LE_UINT16(start_str);
-				}
-
-				if (tmp_str[1] != ATDS_END) {
-					if (!(controlByte & ATS_COUNT_BIT))
-						++*status;
-				} else {
-					if (controlByte & ATS_RESET_BIT)
-						*status = 0;
-				}
-			}
-		} else {
-			if (*tmp_str == ATDS_END_TEXT) {
-				if (tmp_str[1] == ATDS_END) {
-					endLoop = false;
-					*nr = 0;
-					*status = count;
-					*str = start_str;
-					start_str -= 2; // voc number
-
-					if (_atsv._txtMode != TXT_MARK_NAME) {
-						_atsv.vocNum = READ_LE_UINT16(start_str);
-					}
-				} else {
-					++count;
-					tmp_str += 2 + 2;	// voc number + 2
-					start_str = tmp_str + 1;
-				}
-			} else if (*tmp_str == ATDS_END ||
-			           (tmp_str[0] == (char)BLOCKENDE &&
-			            tmp_str[1] == (char)BLOCKENDE &&
-			            tmp_str[2] == (char)BLOCKENDE)) {
-				endLoop = false;
-				*nr = 0;
-				*str = nullptr;
-			}
-		}
-
-		++tmp_str;
-	}
-}
-
 int16 Atdsys::start_aad(int16 diaNr) {
 	if (_aadv._dialog)
 		stopAad();
@@ -823,7 +612,7 @@ void Atdsys::print_aad(int16 scrX, int16 scrY) {
 			case MOUSE_LEFT:
 				EVENTS_CLEAR;
 
-				if (_mousePush == false) {
+				if (!_mousePush) {
 					if (_aadv._silentCount <= 0 && _aadv._delayCount > _printDelayCount1) {
 						_mousePush = true;
 						_aadv._delayCount = 0;
@@ -856,29 +645,30 @@ void Atdsys::print_aad(int16 scrX, int16 scrY) {
 			aad_get_zeilen(start_ptr, &txt_len);
 			str_null2leer(start_ptr, start_ptr + txt_len - 1);
 			SplitStringInit tmp_ssi = _ssi[personId];
-			_ssr = split_string(&tmp_ssi);
+			SplitStringRet splitString;
+			split_string(&tmp_ssi, &splitString);
 
 			if (g_engine->_sound->subtitlesEnabled() ||
 			        (_aadv._strHeader->_vocNr - ATDS_VOC_OFFSET) == -1) {
 				const int16 h = _G(fontMgr)->getFont()->getDataHeight();
-				for (int16 i = 0; i < _ssr->_nr; i++) {
-					_G(out)->printxy(_ssr->_x[i] + 1,
-					              _ssr->_y + (i * h),
-					              0, 300, 0, _ssr->_strPtr[i]);
-					_G(out)->printxy(_ssr->_x[i] - 1,
-					              _ssr->_y + (i * h),
-					              0, 300, 0, _ssr->_strPtr[i]);
-					_G(out)->printxy(_ssr->_x[i],
-					              _ssr->_y + (i * h) + 1,
-					              0, 300, 0, _ssr->_strPtr[i]);
-					_G(out)->printxy(_ssr->_x[i],
-					              _ssr->_y + (i * h) - 1,
-					              0, 300, 0, _ssr->_strPtr[i]);
-					_G(out)->printxy(_ssr->_x[i],
-					              _ssr->_y + (i * h),
+				for (int16 i = 0; i < splitString._nr; i++) {
+					_G(out)->printxy(splitString._x[i] + 1,
+									 splitString._y + (i * h),
+									 0, 300, 0, splitString._strPtr[i]);
+					_G(out)->printxy(splitString._x[i] - 1,
+									 splitString._y + (i * h),
+									 0, 300, 0, splitString._strPtr[i]);
+					_G(out)->printxy(splitString._x[i],
+									 splitString._y + (i * h) + 1,
+									 0, 300, 0, splitString._strPtr[i]);
+					_G(out)->printxy(splitString._x[i],
+									 splitString._y + (i * h) - 1,
+									 0, 300, 0, splitString._strPtr[i]);
+					_G(out)->printxy(splitString._x[i],
+									 splitString._y + (i * h),
 					              _aadv._person[personId]._color,
-					              300, 0, _ssr->_strPtr[i]);
-					tmp_ptr += strlen(_ssr->_strPtr[i]) + 1;
+									 300, 0, splitString._strPtr[i]);
+					tmp_ptr += strlen(splitString._strPtr[i]) + 1;
 				}
 				str_null2leer(start_ptr, start_ptr + txt_len - 1);
 
@@ -904,8 +694,8 @@ void Atdsys::print_aad(int16 scrX, int16 scrY) {
 				// used when either speech or subtitles (but not
 				// both) were selected, but its logic is broken.
 				// Check if it should be removed altogether.
-				/*for (int16 i = 0; i < _ssr->_nr; i++) {
-					tmp_ptr += strlen(_ssr->_strPtr[i]) + 1;
+				/*for (int16 i = 0; i < splitString._nr; i++) {
+					tmp_ptr += strlen(splitString._strPtr[i]) + 1;
 				}
 				str_null2leer(start_ptr, start_ptr + txt_len - 1);*/
 			}
@@ -921,9 +711,9 @@ void Atdsys::print_aad(int16 scrX, int16 scrY) {
 					_aadv._dialog = false;
 					_adsv._autoDia = false;
 					_aadv._strNr = -1;
-					_ssret._next = false;
+					splitString._next = false;
 				} else {
-					if (_ssr->_next == false) {
+					if (!splitString._next) {
 						++_aadv._strNr;
 						while (*_aadv._ptr++ != ATDS_END_TEXT) {}
 
@@ -1047,7 +837,6 @@ bool  Atdsys::ads_start(int16 diaNr) {
 void Atdsys::stop_ads() {
 	_adsv._dialog = -1;
 	_adsv._autoDia = false;
-
 }
 
 int16 Atdsys::ads_get_status() {
diff --git a/engines/chewy/atds.h b/engines/chewy/atds.h
index 19b2c169f8b..89fdba35c60 100644
--- a/engines/chewy/atds.h
+++ b/engines/chewy/atds.h
@@ -188,10 +188,9 @@ struct AtsTxtHeader {
 struct AtsVar {
 	AtsTxtHeader _txtHeader;
 	uint16 vocNum;
-	char *_ptr;
+	Common::String text;
 	int16 _delayCount;
 	int16 _silentCount;
-	int16 _txtLen;
 	int16 _color;
 	int16 _txtMode;
 	bool shown;
@@ -227,7 +226,7 @@ public:
 
 	void set_delay(int16 *delay, int16 silent);
 	void set_split_win(int16 nr, int16 x, int16 y);
-	SplitStringRet *split_string(SplitStringInit *ssi);
+	void split_string(SplitStringInit *ssi, SplitStringRet *ret);
 	void calc_txt_win(SplitStringInit *ssi);
 	void str_null2leer(char *strStart, char *strEnd);
 	void load_atds(int16 chunkNr, int16 mode);
@@ -243,10 +242,6 @@ public:
 	void set_ats_str(int16 txtNr, int16 txtMode, int16 strNr, int16 mode);
 	void set_ats_str(int16 txtNr, int16 strNr, int16 mode);
 	int16 get_ats_str(int16 txtNr, int16 txtMode, int16 mode);
-	char *ats_get_txt(int16 txtNr, int16 txtMode, int16 *retNr, int16 mode);
-	char *ats_search_block(int16 txtMode, char *txtAdr);
-	void ats_search_nr(int16 txtNr, char **str);
-	void ats_search_str(int16 *nr, uint8 *status, uint8 controlByte, char **str);
 	void set_ats_mem(int16 mode);
 	int16 start_aad(int16 diaNr);
 	void stopAad();
@@ -299,8 +294,6 @@ private:
 	AdsNextBlk _adsnb;
 	uint8 _adsStack[ADS_STACK_SIZE] = { 0 };
 	int16 _adsStackPtr;
-	SplitStringRet _ssret;
-	SplitStringRet *_ssr = nullptr;
 
 	SplitStringInit _ssi[AAD_MAX_PERSON] = {
 		{ 0, 100, 0 },
@@ -318,7 +311,6 @@ private:
 	char *_splitPtr[MAX_STR_SPLIT] = { nullptr };
 	int16 _splitX[MAX_STR_SPLIT] = { 0 };
 	int16 _invBlockNr;
-	char *_invUseMem = nullptr;
 	int16 _tmpDelay;
 	int16 _mousePush = 0;
 	int _printDelayCount1 = 0;
diff --git a/engines/chewy/text.cpp b/engines/chewy/text.cpp
index 6ffb0438050..3fd81352c3b 100644
--- a/engines/chewy/text.cpp
+++ b/engines/chewy/text.cpp
@@ -162,11 +162,9 @@ TextEntry *Text::getText(uint chunk, uint entry, int type, int subEntry) {
 		// FIXME: Skip other embedded strings for now
 		if (*(ptr + 1) == kEndText && *(ptr + 2) == 0xf1 && *(ptr + 3) == 0xfe) {
 			ptr += 5;
-			do {
+			while (!(!*ptr && *(ptr + 1) == kEndText && *(ptr + 2) == kEndChunk)) {
 				ptr++;
-				if (*ptr == 0 && *(ptr + 1) != kEndText)
-					ptr++;
-			} while (*ptr);
+			}
 		}
 
 		if (*(ptr + 1) != kEndText || *(ptr + 2) != kEndChunk) {
@@ -210,6 +208,8 @@ Common::StringArray Text::getTextArray(uint chunk, uint entry, int type, int sub
 		line = strtok(nullptr, "|");
 	}
 
+	_lastSpeechId = textData ? textData->_speechId : -1;
+
 	delete[] text;
 	delete textData;
 
diff --git a/engines/chewy/text.h b/engines/chewy/text.h
index 54416d095b2..bff7056e272 100644
--- a/engines/chewy/text.h
+++ b/engines/chewy/text.h
@@ -89,8 +89,12 @@ public:
 	TextEntry *getText(uint chunk, uint entry, int type, int subEntry = -1);
 	Common::StringArray getTextArray(uint chunk, uint entry, int type, int subEntry = -1);
 	Common::String getTextEntry(uint chunk, uint entry, int type, int subEntry = -1);
+	const int16 getLastSpeechId() { return _lastSpeechId; }
 
 	const char *strPos(const char *txtAdr, int16 pos);
+
+private:
+	int16 _lastSpeechId = -1;
 };
 
 } // namespace Chewy




More information about the Scummvm-git-logs mailing list