[Scummvm-git-logs] scummvm master -> 75d647e071ad392dddcc4610a58acd8326efdfa8

criezy criezy at scummvm.org
Sat Apr 3 00:24:46 UTC 2021


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

Summary:
f9292bc97a SUPERNOVA: Fix display of text on intro and outro screen
75d647e071 SUPERNOVA: Fix access to unallocated memory in intro screens


Commit: f9292bc97ac884a5c670507b1e6dcb21c8de5b4e
    https://github.com/scummvm/scummvm/commit/f9292bc97ac884a5c670507b1e6dcb21c8de5b4e
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2021-04-03T01:24:36+01:00

Commit Message:
SUPERNOVA: Fix display of text on intro and outro screen

This was a regression from 54b0b4ac4 that prevents from adding
null characters to a Common::String. For those screens the game
passes multiple strings as a single strings containing a '\0'
to separate the different parts. But that '\0' was no longer
added. I am now using '\1' and updated the parsing in the text
display to handle this.

Changed paths:
    engines/supernova/screen.cpp
    engines/supernova/supernova1/rooms.cpp
    engines/supernova/supernova2/rooms.cpp


diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 6d7071720f..4bfcdf9247 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -175,7 +175,7 @@ bool Marquee::renderCharacter() {
 		} else
 			return false;
 		break;
-	case '\0':
+	case '\1':
 		clearText();
 		_text++;
 		_textWidth = Screen::textWidth(_text);
@@ -494,7 +494,7 @@ int Screen::textWidth(const uint16 key) {
 
 int Screen::textWidth(const char *text) {
 	int charWidth = 0;
-	while (*text != '\0') {
+	while (*text != '\0' && *text != '\1') {
 		byte c = *text++;
 		if (c < 32) {
 			continue;
diff --git a/engines/supernova/supernova1/rooms.cpp b/engines/supernova/supernova1/rooms.cpp
index 4981f40903..2ea13b6914 100644
--- a/engines/supernova/supernova1/rooms.cpp
+++ b/engines/supernova/supernova1/rooms.cpp
@@ -64,19 +64,19 @@ Intro::Intro(SupernovaEngine *vm, GameManager1 *gm) {
 	_shouldExit = false;
 
 	_introText =
-		_vm->getGameString(kStringIntro1) + '\0' +
-		_vm->getGameString(kStringIntro2) + '\0' +
-		_vm->getGameString(kStringIntro3) + '\0' +
-		_vm->getGameString(kStringIntro4) + '\0' +
-		_vm->getGameString(kStringIntro5) + '\0' +
-		_vm->getGameString(kStringIntro6) + '\0' +
-		_vm->getGameString(kStringIntro7) + '\0' +
-		_vm->getGameString(kStringIntro8) + '\0' +
-		_vm->getGameString(kStringIntro9) + '\0' +
-		_vm->getGameString(kStringIntro10) + '\0' +
-		_vm->getGameString(kStringIntro11) + '\0' +
-		_vm->getGameString(kStringIntro12) + '\0' +
-		_vm->getGameString(kStringIntro13) + '\0';
+		_vm->getGameString(kStringIntro1) + '\1' +
+		_vm->getGameString(kStringIntro2) + '\1' +
+		_vm->getGameString(kStringIntro3) + '\1' +
+		_vm->getGameString(kStringIntro4) + '\1' +
+		_vm->getGameString(kStringIntro5) + '\1' +
+		_vm->getGameString(kStringIntro6) + '\1' +
+		_vm->getGameString(kStringIntro7) + '\1' +
+		_vm->getGameString(kStringIntro8) + '\1' +
+		_vm->getGameString(kStringIntro9) + '\1' +
+		_vm->getGameString(kStringIntro10) + '\1' +
+		_vm->getGameString(kStringIntro11) + '\1' +
+		_vm->getGameString(kStringIntro12) + '\1' +
+		_vm->getGameString(kStringIntro13) + '\1';
 }
 
 void Intro::onEntrance() {
@@ -4092,20 +4092,20 @@ Outro::Outro(SupernovaEngine *vm, GameManager1 *gm) {
 	_shown[0] = kShownFalse;
 
 	_outroText =
-		_vm->getGameString(kStringOutro1) + '\0' +
-		_vm->getGameString(kStringOutro2) + '\0' +
-		_vm->getGameString(kStringOutro3) + '\0' +
-		_vm->getGameString(kStringOutro4) + '\0' +
-		_vm->getGameString(kStringOutro5) + '\0' +
-		_vm->getGameString(kStringOutro6) + '\0' +
-		_vm->getGameString(kStringOutro7) + '\0' +
-		_vm->getGameString(kStringOutro8) + '\0' +
-		_vm->getGameString(kStringOutro9) + '\0' +
-		_vm->getGameString(kStringOutro10) + '\0' +
-		_vm->getGameString(kStringOutro11) + '\0' +
-		_vm->getGameString(kStringOutro12) + '\0' +
-		_vm->getGameString(kStringOutro13) + '\0' +
-		_vm->getGameString(kStringOutro14) + '\0';
+		_vm->getGameString(kStringOutro1) + '\1' +
+		_vm->getGameString(kStringOutro2) + '\1' +
+		_vm->getGameString(kStringOutro3) + '\1' +
+		_vm->getGameString(kStringOutro4) + '\1' +
+		_vm->getGameString(kStringOutro5) + '\1' +
+		_vm->getGameString(kStringOutro6) + '\1' +
+		_vm->getGameString(kStringOutro7) + '\1' +
+		_vm->getGameString(kStringOutro8) + '\1' +
+		_vm->getGameString(kStringOutro9) + '\1' +
+		_vm->getGameString(kStringOutro10) + '\1' +
+		_vm->getGameString(kStringOutro11) + '\1' +
+		_vm->getGameString(kStringOutro12) + '\1' +
+		_vm->getGameString(kStringOutro13) + '\1' +
+		_vm->getGameString(kStringOutro14) + '\1';
 }
 
 void Outro::onEntrance() {
diff --git a/engines/supernova/supernova2/rooms.cpp b/engines/supernova/supernova2/rooms.cpp
index 096855a105..bbbc5f9f8f 100644
--- a/engines/supernova/supernova2/rooms.cpp
+++ b/engines/supernova/supernova2/rooms.cpp
@@ -52,19 +52,19 @@ Intro2::Intro2(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[8] = Object(_id, kStringKeycard, kStringDefaultDescription, MUSCARD, TAKE, 255, 255, 0);
 
 	_introText =
-		_vm->getGameString(kStringIntro1) + '\0' +
-		_vm->getGameString(kStringIntro2) + '\0' +
-		_vm->getGameString(kStringIntro3) + '\0' +
-		_vm->getGameString(kStringIntro4) + '\0' +
-		_vm->getGameString(kStringIntro5) + '\0' +
-		"^Matthias Neef#" + '\0' +
-		"^Sascha Otterbach#" + '\0' +
-		"^Thomas Mazzoni#" + '\0' +
-		"^Matthias Klein#" + '\0' +
-		"^Gerrit Rothmaier#" + '\0' +
-		"^Thomas Hassler#" + '\0' +
-		"^Rene Kach#" + '\0' +
-		'\233' + '\0';
+		_vm->getGameString(kStringIntro1) + '\1' +
+		_vm->getGameString(kStringIntro2) + '\1' +
+		_vm->getGameString(kStringIntro3) + '\1' +
+		_vm->getGameString(kStringIntro4) + '\1' +
+		_vm->getGameString(kStringIntro5) + '\1' +
+		"^Matthias Neef#" + '\1' +
+		"^Sascha Otterbach#" + '\1' +
+		"^Thomas Mazzoni#" + '\1' +
+		"^Matthias Klein#" + '\1' +
+		"^Gerrit Rothmaier#" + '\1' +
+		"^Thomas Hassler#" + '\1' +
+		"^Rene Kach#" + '\1' +
+		'\233' + '\1';
 }
 
 void Intro2::onEntrance() {
@@ -1906,28 +1906,28 @@ Ship::Ship(SupernovaEngine *vm, GameManager2 *gm) {
 	_objectState[6] = Object(_id, kStringCable, kStringCableDescription2, CABLE, TAKE | COMBINABLE, 255, 255, 8 + kSectionInvert);
 
 	_outroText =
-		_vm->getGameString(kStringIntro1) + '\0' +
-		_vm->getGameString(kStringIntro2) + '\0' +
-		_vm->getGameString(kStringIntro3) + '\0' +
-		_vm->getGameString(kStringIntro4) + '\0' +
-		_vm->getGameString(kStringIntro5) + '\0' +
-		"^Matthias Neef#" + '\0' +
-		"^Sascha Otterbach#" + '\0' +
-		"^Thomas Mazzoni#" + '\0' +
-		"^Matthias Klein#" + '\0' +
-		"^Gerrit Rothmaier#" + '\0' +
-		"^Thomas Hassler#" + '\0' +
-		"^Rene Kach#" + '\0' +
-		'\233' + '\0';
+		_vm->getGameString(kStringIntro1) + '\1' +
+		_vm->getGameString(kStringIntro2) + '\1' +
+		_vm->getGameString(kStringIntro3) + '\1' +
+		_vm->getGameString(kStringIntro4) + '\1' +
+		_vm->getGameString(kStringIntro5) + '\1' +
+		"^Matthias Neef#" + '\1' +
+		"^Sascha Otterbach#" + '\1' +
+		"^Thomas Mazzoni#" + '\1' +
+		"^Matthias Klein#" + '\1' +
+		"^Gerrit Rothmaier#" + '\1' +
+		"^Thomas Hassler#" + '\1' +
+		"^Rene Kach#" + '\1' +
+		'\233' + '\1';
 	Common::String waitString = "##################";
 	_outroText2 =
-		waitString + '\0' +
-		_vm->getGameString(kStringOutro1) + '\0' +
-		_vm->getGameString(kStringOutro2) + '\0' +
-		_vm->getGameString(kStringOutro3) + '\0' +
-		_vm->getGameString(kStringOutro4) + '\0' +
-		_vm->getGameString(kStringOutro5) + '\0' +
-		'\233' + '\0';
+		waitString + '\1' +
+		_vm->getGameString(kStringOutro1) + '\1' +
+		_vm->getGameString(kStringOutro2) + '\1' +
+		_vm->getGameString(kStringOutro3) + '\1' +
+		_vm->getGameString(kStringOutro4) + '\1' +
+		_vm->getGameString(kStringOutro5) + '\1' +
+		'\233' + '\1';
 }
 
 void Ship::onEntrance() {


Commit: 75d647e071ad392dddcc4610a58acd8326efdfa8
    https://github.com/scummvm/scummvm/commit/75d647e071ad392dddcc4610a58acd8326efdfa8
Author: Thierry Crozat (criezy at scummvm.org)
Date: 2021-04-03T01:24:36+01:00

Commit Message:
SUPERNOVA: Fix access to unallocated memory in intro screens

Changed paths:
    engines/supernova/screen.cpp


diff --git a/engines/supernova/screen.cpp b/engines/supernova/screen.cpp
index 4bfcdf9247..83694addb2 100644
--- a/engines/supernova/screen.cpp
+++ b/engines/supernova/screen.cpp
@@ -496,7 +496,9 @@ int Screen::textWidth(const char *text) {
 	int charWidth = 0;
 	while (*text != '\0' && *text != '\1') {
 		byte c = *text++;
-		if (c < 32) {
+		if (c < 32 || c == 155) {
+			// 155 is used for looping in Marquee text and is not used otherwise
+			// (it is beyond the end of the font).
 			continue;
 		} else if (c == 225) {
 			c = 35;




More information about the Scummvm-git-logs mailing list