[Scummvm-git-logs] scummvm master -> daf2f07e6bf21e20b7f8d809aadbe2928ad16fcc

bluegr bluegr at gmail.com
Mon May 27 18:42:00 CEST 2019


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

Summary:
81294feb70 STARTREK: Refactor code so that gotos are not used in DEMON6
b0699f703e STARTREK: Fix memory leak
8885508237 STARTREK: Refactor code to remove more gotos
daf2f07e6b STARTREK: Use Common::String for animation strings


Commit: 81294feb709754b72a7d34e49a10cdfa2dad5a11
    https://github.com/scummvm/scummvm/commit/81294feb709754b72a7d34e49a10cdfa2dad5a11
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-05-27T18:25:10+03:00

Commit Message:
STARTREK: Refactor code so that gotos are not used in DEMON6

Changed paths:
    engines/startrek/room.h
    engines/startrek/rooms/demon6.cpp


diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 8e0e3a3..1df3d86 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -594,6 +594,8 @@ public:
 	void demon6TalkToKirk();
 	void demon6TalkToRedshirt();
 	void demon6TalkToStephen();
+	void demon6StephenIsInsulted();
+	void demon6StephenDescribesItemsInCase();
 	void demon6UseBerryOnStephen();
 	void demon6UseBerryOnSynthesizer();
 	void demon6MccoyReachedSynthesizer();
@@ -627,6 +629,8 @@ public:
 	void demon6GetCase();
 	void demon6KirkReachedCase();
 	int demon6ShowCase(int visible);
+	int demon6ShowCaseProcessInput(Sprite *sprites, Sprite *buttonSprite, int visible);
+	int demon6ShowCaseProcessSelection(Sprite *sprites, Sprite *clickedSprite, int visible);
 
 	// TUG0
 	void tug0Tick1();
diff --git a/engines/startrek/rooms/demon6.cpp b/engines/startrek/rooms/demon6.cpp
index c958922..de3b4b4 100644
--- a/engines/startrek/rooms/demon6.cpp
+++ b/engines/startrek/rooms/demon6.cpp
@@ -233,6 +233,44 @@ void Room::demon6UseAnythingOnWorkspace() {
 	showText(TX_DEM6N020);
 }
 
+void Room::demon6StephenIsInsulted() {
+	showText(TX_SPEAKER_STEPHEN, TX_DEM6_030);
+	_roomVar.demon.insultedStephenRecently = true;
+	_awayMission->demon.insultedStephen = true;
+}
+
+void Room::demon6StephenDescribesItemsInCase() {
+	while (true) {
+		showText(TX_SPEAKER_STEPHEN, TX_DEM6_051);
+		TextRef choices2[] = { TX_SPEAKER_STEPHEN, TX_DEM6_045, TX_DEM6_046, TX_DEM6_047, TX_DEM6_048, TX_DEM6_049, TX_DEM6_050, TX_BLANK };
+		TextRef choice = showText(choices2);
+
+		switch (choice) {
+		case 0:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_040);
+			break;
+		case 1:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_033);
+			break;
+		case 2:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_036);
+			break;
+		case 3:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_038);
+			break;
+		case 4:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_039);
+			break;
+		case 5:
+			showText(TX_SPEAKER_STEPHEN, TX_DEM6_041);
+			_roomVar.demon.caseOpened = true;
+			return;
+		default:
+			showText(TX_DIALOG_ERROR);
+		}
+	}
+}
+
 void Room::demon6UseCrewmanOnCase() {
 	if (_roomVar.demon.stephenInRoom) {
 		if (_roomVar.demon.insultedStephenRecently)
@@ -242,55 +280,22 @@ void Room::demon6UseCrewmanOnCase() {
 		TextRef choice = showText(choices1);
 
 		if (choice == 0) {
-insult:
-			showText(TX_SPEAKER_STEPHEN, TX_DEM6_030);
-			_roomVar.demon.insultedStephenRecently = true;
-			_awayMission->demon.insultedStephen = true;
+			demon6StephenIsInsulted();
 		} else if (choice == 1) {
 			showText(TX_SPEAKER_STEPHEN, TX_DEM6_034);
-explain:
-			while (true) {
-				showText(TX_SPEAKER_STEPHEN, TX_DEM6_051);
-				TextRef choices2[] = {TX_SPEAKER_STEPHEN, TX_DEM6_045, TX_DEM6_046, TX_DEM6_047, TX_DEM6_048, TX_DEM6_049, TX_DEM6_050, TX_BLANK};
-				choice = showText(choices2);
-
-				switch (choice) {
-				case 0:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_040);
-					break;
-				case 1:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_033);
-					break;
-				case 2:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_036);
-					break;
-				case 3:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_038);
-					break;
-				case 4:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_039);
-					break;
-				case 5:
-					showText(TX_SPEAKER_STEPHEN, TX_DEM6_041);
-					_roomVar.demon.caseOpened = true;
-					return;
-				default:
-					goto error;
-				}
-			}
+			demon6StephenDescribesItemsInCase();
 		} else if (choice == 2) {
 			showText(TX_SPEAKER_STEPHEN, TX_DEM6_031);
 			TextRef choices3[] = {TX_SPEAKER_KIRK, TX_DEM6_001, TX_DEM6_006, TX_BLANK};
 			choice = showText(choices3);
 
 			if (choice == 0)
-				goto insult;
+				demon6StephenIsInsulted();
 			else if (choice == 1)
-				goto explain;
+				demon6StephenDescribesItemsInCase();
 			else
-				goto error;
+				showText(TX_DIALOG_ERROR);
 		} else {
-error:
 			showText(TX_DIALOG_ERROR);
 		}
 	} else {
@@ -465,7 +470,6 @@ int Room::demon6ShowCase(int visible) {
 	}
 
 	Sprite buttonSprite;
-	_vm->_gfx->addSprite(&buttonSprite);
 
 	// BUGFIX: use draw mode 2 so the entire button is clickable (not just non-transparent parts)
 	buttonSprite.drawMode = 2;
@@ -476,9 +480,23 @@ int Room::demon6ShowCase(int visible) {
 	buttonSprite.bitmapChanged = true;
 	buttonSprite.bitmap = _vm->_gfx->loadBitmap("donebutt");
 
+	_vm->_gfx->addSprite(&buttonSprite);
 	_vm->_gfx->forceDrawAllSprites();
 	_vm->_gfx->fadeinScreen();
 
+	visible = demon6ShowCaseProcessInput(sprites, &buttonSprite, visible);
+
+	_vm->_gfx->fadeoutScreen();
+	_vm->_gfx->popSprites();
+	_vm->_gfx->loadPri(_vm->_screenName);
+	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName));
+	_vm->_gfx->copyBackgroundScreen();
+	_vm->_gfx->forceDrawAllSprites();
+
+	return visible;
+}
+
+int Room::demon6ShowCaseProcessInput(Sprite *sprites, Sprite *buttonSprite, int visible) {
 	bool exitLoop = false;
 
 	while (!exitLoop) {
@@ -492,35 +510,11 @@ int Room::demon6ShowCase(int visible) {
 			break;
 
 		case TREKEVENT_LBUTTONDOWN: {
-lclick:
 			Sprite *clickedSprite = _vm->_gfx->getSpriteAt(_vm->_gfx->getMousePos());
-			if (clickedSprite == &buttonSprite)
+			if (clickedSprite == buttonSprite)
 				exitLoop = true;
-			else if (clickedSprite != nullptr) {
-				while (clickedSprite->pos.y < SCREEN_HEIGHT) { // Move the selected item down and off the screen.
-					clickedSprite->drawPriority = 8;
-					clickedSprite->bitmapChanged = true;
-					_vm->_gfx->drawAllSprites();
-
-					// WORKAROUND: original game had no bound on how fast the items move
-					// off the screen. Here I bind it to the tick event.
-					// (This was probably the intended behaviour since the original game
-					// does check the clock cycle, but doesn't do a proper comparison with
-					// it.)
-					while (event.type != TREKEVENT_TICK) {
-						if (!_vm->popNextEvent(&event))
-							continue;
-					}
-					clickedSprite->pos.y++;
-				}
-
-				clickedSprite->dontDrawNextFrame();
-				_vm->_gfx->drawAllSprites();
-				_vm->_gfx->delSprite(clickedSprite);
-				clickedSprite->bitmap.reset();
-				int i = clickedSprite - sprites;
-				visible ^= (0x10 >> i);
-			}
+			else if (clickedSprite != nullptr)
+				visible = demon6ShowCaseProcessSelection(sprites, clickedSprite, visible);
 			break;
 		}
 
@@ -536,8 +530,14 @@ lclick:
 
 			case Common::KEYCODE_RETURN:
 			case Common::KEYCODE_KP_ENTER:
-			case Common::KEYCODE_F1:
-				goto lclick;
+			case Common::KEYCODE_F1: {
+				Sprite *clickedSprite = _vm->_gfx->getSpriteAt(_vm->_gfx->getMousePos());
+				if (clickedSprite == buttonSprite)
+					exitLoop = true;
+				else if (clickedSprite != nullptr)
+					visible = demon6ShowCaseProcessSelection(sprites, clickedSprite, visible);
+				break;
+			}
 
 			case Common::KEYCODE_F2:
 				exitLoop = true;
@@ -553,13 +553,36 @@ lclick:
 		}
 	}
 
-	_vm->_gfx->fadeoutScreen();
-	_vm->_gfx->popSprites();
-	_vm->_gfx->loadPri(_vm->_screenName);
-	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName));
-	_vm->_gfx->copyBackgroundScreen();
-	_vm->_gfx->forceDrawAllSprites();
+	return visible;
+}
+
+int Room::demon6ShowCaseProcessSelection(Sprite *sprites, Sprite *clickedSprite, int visible) {
+	while (clickedSprite->pos.y < SCREEN_HEIGHT) { // Move the selected item down and off the screen.
+		clickedSprite->drawPriority = 8;
+		clickedSprite->bitmapChanged = true;
+		_vm->_gfx->drawAllSprites();
+
+		// WORKAROUND: original game had no bound on how fast the items move
+		// off the screen. Here I bind it to the tick event.
+		// (This was probably the intended behaviour since the original game
+		// does check the clock cycle, but doesn't do a proper comparison with
+		// it.)
+		TrekEvent event;
+
+		while (event.type != TREKEVENT_TICK) {
+			if (!_vm->popNextEvent(&event))
+				continue;
+		}
+		clickedSprite->pos.y++;
+	}
 
+	clickedSprite->dontDrawNextFrame();
+	_vm->_gfx->drawAllSprites();
+	_vm->_gfx->delSprite(clickedSprite);
+	clickedSprite->bitmap.reset();
+	int i = clickedSprite - sprites;
+	visible ^= (0x10 >> i);
+	
 	return visible;
 }
 


Commit: b0699f703eeaa02d0df172380bcdad2f207e330a
    https://github.com/scummvm/scummvm/commit/b0699f703eeaa02d0df172380bcdad2f207e330a
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-05-27T18:25:57+03:00

Commit Message:
STARTREK: Fix memory leak

Changed paths:
    engines/startrek/startrek.cpp


diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 968bc3c..55aea6f 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -553,9 +553,13 @@ SharedPtr<FileStream> StarTrekEngine::loadFile(Common::String filename, int file
 
 	delete dataFile;
 	delete dataRunFile;
-	byte *data = (byte *)malloc(stream->size());
-	stream->read(data, stream->size());
-	return SharedPtr<FileStream>(new FileStream(data, stream->size(), bigEndian));
+
+	int32 size = stream->size();
+	byte *data = (byte *)malloc(size);
+	stream->read(data, size);
+	delete stream;
+
+	return SharedPtr<FileStream>(new FileStream(data, size, bigEndian));
 }
 
 SharedPtr<FileStream> StarTrekEngine::loadFileWithParams(Common::String filename, bool unk1, bool unk2, bool unk3) {


Commit: 88855082373113a4fad3745006a9efc261051a26
    https://github.com/scummvm/scummvm/commit/88855082373113a4fad3745006a9efc261051a26
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-05-27T19:11:10+03:00

Commit Message:
STARTREK: Refactor code to remove more gotos

Changed paths:
    engines/startrek/menu.cpp
    engines/startrek/textbox.cpp


diff --git a/engines/startrek/menu.cpp b/engines/startrek/menu.cpp
index a4a3739..72b72d9 100644
--- a/engines/startrek/menu.cpp
+++ b/engines/startrek/menu.cpp
@@ -337,7 +337,6 @@ int StarTrekEngine::showActionMenu() {
 			break;
 
 		case TREKEVENT_LBUTTONDOWN:
-selectAndExit:
 			displayMenu = false;
 			addEventBack = true;
 			break;
@@ -404,7 +403,9 @@ exitMenu:
 			case Common::KEYCODE_RETURN:
 			case Common::KEYCODE_KP_ENTER:
 			case Common::KEYCODE_F1: // Exit menu with whatever is selected
-				goto selectAndExit;
+				displayMenu = false;
+				addEventBack = true;
+				break;
 
 			case Common::KEYCODE_PAGEUP:
 			case Common::KEYCODE_KP9:
diff --git a/engines/startrek/textbox.cpp b/engines/startrek/textbox.cpp
index 15be61f..a6fc0d0 100644
--- a/engines/startrek/textbox.cpp
+++ b/engines/startrek/textbox.cpp
@@ -358,38 +358,24 @@ int StarTrekEngine::showText(TextGetterFunc textGetter, uintptr var, int xoffset
 				break;
 
 			case TEXTBUTTON_SCROLLUP:
-				scrollOffset -= numTextboxLines;
-				goto readjustScrollUp;
-
-			case TEXTBUTTON_SCROLLDOWN:
-				scrollOffset += numTextboxLines;
-				goto readjustScrollDown;
-
 			case TEXTBUTTON_SCROLLUP_ONELINE:
-				scrollOffset--;
-				goto readjustScrollUp;
-
-			case TEXTBUTTON_SCROLLDOWN_ONELINE:
-				scrollOffset++;
-				goto readjustScrollDown;
-
-			case TEXTBUTTON_GOTO_TOP:
-				scrollOffset = 0;
-				goto readjustScrollUp;
-
-			case TEXTBUTTON_GOTO_BOTTOM:
-				scrollOffset = numTextLines - numTextboxLines;
-				goto readjustScrollDown;
-
-readjustScrollUp:
-				enableMenuButtons(1 << TEXTBUTTON_SCROLLDOWN);
+				scrollOffset -= (textboxReturnCode == TEXTBUTTON_SCROLLUP ? numTextboxLines : 1);
 				if (scrollOffset < 0)
 					scrollOffset = 0;
 				if (scrollOffset == 0)
 					disableMenuButtons(1 << TEXTBUTTON_SCROLLUP);
+				enableMenuButtons(1 << TEXTBUTTON_SCROLLDOWN);
+				goto readjustScroll;
+
+			case TEXTBUTTON_GOTO_TOP:
+				scrollOffset = 0;
+				disableMenuButtons(1 << TEXTBUTTON_SCROLLUP);
+				enableMenuButtons(1 << TEXTBUTTON_SCROLLDOWN);
 				goto readjustScroll;
 
-readjustScrollDown:
+			case TEXTBUTTON_SCROLLDOWN:
+			case TEXTBUTTON_SCROLLDOWN_ONELINE:
+				scrollOffset += (textboxReturnCode == TEXTBUTTON_SCROLLDOWN ? numTextboxLines : 1);
 				enableMenuButtons(1 << TEXTBUTTON_SCROLLUP);
 				if (scrollOffset >= numTextLines)
 					scrollOffset -= numTextboxLines;
@@ -399,6 +385,12 @@ readjustScrollDown:
 					disableMenuButtons(1 << TEXTBUTTON_SCROLLDOWN);
 				goto readjustScroll;
 
+			case TEXTBUTTON_GOTO_BOTTOM:
+				scrollOffset = numTextLines - numTextboxLines;
+				enableMenuButtons(1 << TEXTBUTTON_SCROLLUP);
+				disableMenuButtons(1 << TEXTBUTTON_SCROLLDOWN);
+				goto readjustScroll;
+
 readjustScroll:
 				textboxSprite.bitmapChanged = true;
 				drawMainText(
@@ -410,27 +402,28 @@ readjustScroll:
 				break;
 
 			case TEXTBUTTON_PREVCHOICE:
-				choiceIndex--;
-				if (!loopChoices && choiceIndex == 0) {
-					disableMenuButtons(1 << TEXTBUTTON_PREVCHOICE);
-				} else {
-					if (choiceIndex < 0)
-						choiceIndex = numChoices - 1;
-				}
-				enableMenuButtons(1 << TEXTBUTTON_NEXTCHOICE);
-				goto reloadText;
-
 			case TEXTBUTTON_NEXTCHOICE:
-				enableMenuButtons(1 << TEXTBUTTON_PREVCHOICE);
-				choiceIndex++;
-				if (!loopChoices && choiceIndex == numChoices - 1) {
-					disableMenuButtons(1 << TEXTBUTTON_NEXTCHOICE);
+				if (textboxReturnCode == TEXTBUTTON_PREVCHOICE) {
+					choiceIndex--;
+					if (!loopChoices && choiceIndex == 0) {
+						disableMenuButtons(1 << TEXTBUTTON_PREVCHOICE);
+					}
+					else {
+						if (choiceIndex < 0)
+							choiceIndex = numChoices - 1;
+					}
+					enableMenuButtons(1 << TEXTBUTTON_NEXTCHOICE);
 				} else {
-					choiceIndex %= numChoices;
+					enableMenuButtons(1 << TEXTBUTTON_PREVCHOICE);
+					choiceIndex++;
+					if (!loopChoices && choiceIndex == numChoices - 1) {
+						disableMenuButtons(1 << TEXTBUTTON_NEXTCHOICE);
+					}
+					else {
+						choiceIndex %= numChoices;
+					}
 				}
-				goto reloadText;
 
-reloadText:
 				scrollOffset = 0;
 				lineFormattedText = readLineFormattedText(textGetter, var, choiceIndex, textBitmap, numTextboxLines, &numTextLines);
 				if (numTextLines <= numTextboxLines) {


Commit: daf2f07e6bf21e20b7f8d809aadbe2928ad16fcc
    https://github.com/scummvm/scummvm/commit/daf2f07e6bf21e20b7f8d809aadbe2928ad16fcc
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-05-27T19:39:29+03:00

Commit Message:
STARTREK: Use Common::String for animation strings

Changed paths:
    engines/startrek/actors.cpp
    engines/startrek/object.h
    engines/startrek/room.cpp
    engines/startrek/saveload.cpp
    engines/startrek/startrek.cpp


diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp
index 239818e..876499c 100644
--- a/engines/startrek/actors.cpp
+++ b/engines/startrek/actors.cpp
@@ -32,10 +32,10 @@ void StarTrekEngine::initActors() {
 	for (int i = 0; i < MAX_BAN_FILES; i++)
 		_banFiles[i].reset();
 
-	strcpy(_kirkActor->animationString, "kstnd");
-	strcpy(_spockActor->animationString, "sstnd");
-	strcpy(_mccoyActor->animationString, "mstnd");
-	strcpy(_redshirtActor->animationString, "rstnd");
+	_kirkActor->animationString = "kstnd";
+	_spockActor->animationString = "sstnd";
+	_mccoyActor->animationString = "mstnd";
+	_redshirtActor->animationString = "rstnd";
 }
 
 int StarTrekEngine::loadActorAnim(int actorIndex, const Common::String &animName, int16 x, int16 y, Fixed8 scale) {
@@ -91,7 +91,7 @@ bool StarTrekEngine::actorWalkToPosition(int actorIndex, const Common::String &a
 	actor->spriteDrawn = true;
 	actor->animType = 1;
 	actor->frameToStartNextAnim = _frameIndex + 1;
-	strcpy(actor->animationString2, animFile.c_str());
+	actor->animationString2 = animFile;
 
 	actor->dest.x = destX;
 	actor->dest.y = destY;
@@ -111,7 +111,7 @@ bool StarTrekEngine::actorWalkToPosition(int actorIndex, const Common::String &a
 
 		if (actor->iwSrcPosition == -1 || actor->iwDestPosition == -1) {
 			// No path exists; face south by default.
-			strcat(actor->animationString2, "S");
+			actor->animationString2 += "S";
 			actor->direction = 'S';
 
 			updateActorPositionWhileWalking(actor, srcX, srcY);
@@ -152,7 +152,7 @@ void StarTrekEngine::updateActorAnimations() {
 
 				actor->animFrame = nextAnimFrame;
 				if (actor->animFrame >= actor->numAnimFrames) {
-					if (actor->animationString[0] == '\0')
+					if (actor->animationString.empty())
 						removeActorFromScreen(i);
 					else
 						initStandAnim(i);
@@ -222,7 +222,7 @@ void StarTrekEngine::updateActorAnimations() {
 					initStandAnim(i);
 				} else { // actor->iwSrcPosition != -1
 					if (actor->iwSrcPosition == actor->iwDestPosition) {
-						actor->animationString2[strlen(actor->animationString2) - 1] = '\0';
+						actor->animationString2.deleteLastChar();
 						actor->iwDestPosition = -1;
 						actor->iwSrcPosition = -1;
 						chooseActorDirectionForWalking(actor, actor->pos.x, actor->pos.y, actor->dest.x, actor->dest.y);
@@ -230,7 +230,7 @@ void StarTrekEngine::updateActorAnimations() {
 						int index = _iwFile->_iwEntries[actor->iwSrcPosition][actor->iwDestPosition];
 						actor->iwSrcPosition = index;
 						Common::Point dest = _iwFile->_keyPositions[actor->iwSrcPosition];
-						actor->animationString2[strlen(actor->animationString2) - 1] = '\0';
+						actor->animationString2.deleteLastChar();
 						chooseActorDirectionForWalking(actor, actor->pos.x, actor->pos.y, dest.x, dest.y);
 					}
 				}
@@ -512,9 +512,9 @@ void StarTrekEngine::initStandAnim(int actorIndex) {
 
 	Common::String animName;
 	if (actor->direction != 0)
-		animName = Common::String(actor->animationString) + (char)actor->direction;
+		animName = actor->animationString + (char)actor->direction;
 	else // Default to facing south
-		animName = Common::String(actor->animationString) + 's';
+		animName = actor->animationString + 's';
 
 	Fixed8 scale = getActorScaleAtPosition(actor->pos.y);
 	loadActorAnim(actorIndex, animName, actor->pos.x, actor->pos.y, scale);
@@ -523,7 +523,7 @@ void StarTrekEngine::initStandAnim(int actorIndex) {
 
 void StarTrekEngine::updateActorPositionWhileWalking(Actor *actor, int16 x, int16 y) {
 	actor->scale = getActorScaleAtPosition(y);
-	Common::String animName = Common::String::format("%s%02d", actor->animationString2, actor->field92 & 7);
+	Common::String animName = Common::String::format("%s%02d", actor->animationString2.c_str(), actor->field92 & 7);
 	actor->sprite.setBitmap(loadAnimationFrame(animName, actor->scale));
 
 	memset(actor->bitmapFilename, 0, 10);
@@ -557,8 +557,7 @@ void StarTrekEngine::chooseActorDirectionForWalking(Actor *actor, int16 srcX, in
 			d = 'W';
 
 		// Append direction to animation string
-		actor->animationString2[strlen(actor->animationString2) + 1] = '\0';
-		actor->animationString2[strlen(actor->animationString2)] = d;
+		actor->animationString2 += d;
 
 		actor->direction = d;
 		actor->field90 = absDistX;
@@ -579,8 +578,7 @@ void StarTrekEngine::chooseActorDirectionForWalking(Actor *actor, int16 srcX, in
 			d = 'N';
 
 		// Append direction to animation string
-		actor->animationString2[strlen(actor->animationString2) + 1] = '\0';
-		actor->animationString2[strlen(actor->animationString2)] = d;
+		actor->animationString2 += d;
 
 		actor->direction = d;
 		actor->field90 = absDistY;
diff --git a/engines/startrek/object.h b/engines/startrek/object.h
index 9c2bf0d..19d9b4b 100644
--- a/engines/startrek/object.h
+++ b/engines/startrek/object.h
@@ -97,7 +97,7 @@ struct Actor {
 	bool triggerActionWhenAnimFinished;
 	uint16 finishedAnimActionParam;
 
-	char animationString2[8];
+	Common::String animationString2;
 	uint16 field70;
 	uint16 field72;
 	uint16 field74;
@@ -124,7 +124,7 @@ struct Actor {
 	uint16 field94;
 	uint16 field96;
 
-	char animationString[10];
+	Common::String animationString;
 
 	// These might be part of "animationString"?
 	uint16 fielda2;
@@ -174,8 +174,6 @@ public:
 		fielda6(0) {
 		memset(animFilename, 0, sizeof(animFilename));
 		memset(bitmapFilename, 0, sizeof(bitmapFilename));
-		memset(animationString2, 0, sizeof(animationString2));
-		memset(animationString, 0, sizeof(animationString));
 	}
 
 };
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index dcb873e..667b3b4 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -259,7 +259,7 @@ void Room::loadActorStandAnim(int actorIndex) {
 		_vm->removeActorFromScreen(actorIndex);
 	else {
 		Actor *actor = &_vm->_actorList[actorIndex];
-		if (actor->animationString[0] == '\0')
+		if (actor->animationString.empty())
 			_vm->removeActorFromScreen(actorIndex);
 		else
 			_vm->initStandAnim(actorIndex);
@@ -447,10 +447,10 @@ void Room::endMission(int16 score, int16 arg1, int16 arg2) {
 		_vm->loadActorAnimWithRoomScaling(i, anim, actor->sprite.pos.x, actor->sprite.pos.y);
 	}
 
-	_vm->_kirkActor->animationString[0] = '\0';
-	_vm->_spockActor->animationString[0] = '\0';
-	_vm->_mccoyActor->animationString[0] = '\0';
-	_vm->_redshirtActor->animationString[0] = '\0';
+	_vm->_kirkActor->animationString.clear();
+	_vm->_spockActor->animationString.clear();
+	_vm->_mccoyActor->animationString.clear();
+	_vm->_redshirtActor->animationString.clear();
 
 	playSoundEffectIndex(8);
 
diff --git a/engines/startrek/saveload.cpp b/engines/startrek/saveload.cpp
index 52bb7cb..7966537 100644
--- a/engines/startrek/saveload.cpp
+++ b/engines/startrek/saveload.cpp
@@ -237,6 +237,8 @@ bool StarTrekEngine::saveOrLoadGameData(Common::SeekableReadStream *in, Common::
 		ser.syncAsUint32LE(_roomFrameCounter);
 		ser.syncAsUint32LE(_frameIndex); // FIXME: redundant
 
+		byte filler = 0;
+
 		// Serialize the "actor" class
 		for (int i = 0; i < NUM_ACTORS; i++) {
 			Actor *a = &_actorList[i];
@@ -258,7 +260,10 @@ bool StarTrekEngine::saveOrLoadGameData(Common::SeekableReadStream *in, Common::
 			ser.syncAsUint16LE(a->field62);
 			ser.syncAsUint16LE(a->triggerActionWhenAnimFinished);
 			ser.syncAsUint16LE(a->finishedAnimActionParam);
-			ser.syncBytes((byte *)a->animationString2, 8);
+			ser.syncString(a->animationString2);
+			filler = 0;
+			for (uint i = 0; i < 8 - a->animationString2.size() - 1; ++i)
+				ser.syncAsByte(filler);	// make sure that exactly 8 bytes are synced
 			ser.syncAsUint16LE(a->field70);
 			ser.syncAsUint16LE(a->field72);
 			ser.syncAsUint16LE(a->field74);
@@ -276,7 +281,10 @@ bool StarTrekEngine::saveOrLoadGameData(Common::SeekableReadStream *in, Common::
 			ser.syncAsByte(a->direction);
 			ser.syncAsUint16LE(a->field94);
 			ser.syncAsUint16LE(a->field96);
-			ser.syncBytes((byte *)a->animationString, 10);
+			ser.syncString(a->animationString);
+			filler = 0;
+			for (uint i = 0; i < 10 - a->animationString.size() - 1; ++i)
+				ser.syncAsByte(filler);	// make sure that exactly 10 bytes are synced
 			ser.syncAsUint16LE(a->fielda2);
 			ser.syncAsUint16LE(a->fielda4);
 			ser.syncAsUint16LE(a->fielda6);
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 55aea6f..d347055 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -268,7 +268,7 @@ void StarTrekEngine::runTransportSequence(const Common::String &name) {
 		int x = crewmanTransportPositions[i][0];
 		int y = crewmanTransportPositions[i][1];
 		loadActorAnim(i, filename, x, y, 1.0);
-		_actorList[i].animationString[0] = '\0';
+		_actorList[i].animationString.clear();
 	}
 
 	if (_missionToLoad.equalsIgnoreCase("feather") && name[4] == 'b') {





More information about the Scummvm-git-logs mailing list