[Scummvm-git-logs] scummvm master -> 878675cbd0487b2064abdd452006fdcfb8d6896d

bluegr bluegr at gmail.com
Fri Aug 16 13:18:32 CEST 2019


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:
878675cbd0 STARTREK: Simplify screen name code and add the "actions" debug command


Commit: 878675cbd0487b2064abdd452006fdcfb8d6896d
    https://github.com/scummvm/scummvm/commit/878675cbd0487b2064abdd452006fdcfb8d6896d
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2019-08-16T14:16:43+03:00

Commit Message:
STARTREK: Simplify screen name code and add the "actions" debug command

- The screen name and map name code have been merged and simplified
- Some usage of SharedPtr has been adapted
- Duplicate code for loading the room map has been merged
- The "actions" command has been imported from the tools code
- Cleanup

Changed paths:
    engines/startrek/awaymission.cpp
    engines/startrek/console.cpp
    engines/startrek/console.h
    engines/startrek/menu.cpp
    engines/startrek/room.cpp
    engines/startrek/room.h
    engines/startrek/rooms/demon4.cpp
    engines/startrek/rooms/demon6.cpp
    engines/startrek/saveload.cpp
    engines/startrek/startrek.cpp
    engines/startrek/startrek.h
    engines/startrek/textbox.cpp


diff --git a/engines/startrek/awaymission.cpp b/engines/startrek/awaymission.cpp
index ca1b3f0..84985c3 100644
--- a/engines/startrek/awaymission.cpp
+++ b/engines/startrek/awaymission.cpp
@@ -85,22 +85,18 @@ void StarTrekEngine::loadRoom(const Common::String &missionName, int roomIndex)
 	_gfx->fadeoutScreen();
 	_sound->stopAllVocSounds();
 
-	_screenName = _missionName + (char)(_roomIndex + '0');
-
-	_gfx->setBackgroundImage(_gfx->loadBitmap(_screenName));
-	_gfx->loadPri(_screenName);
+	_gfx->setBackgroundImage(_gfx->loadBitmap(getScreenName()));
+	_gfx->loadPri(getScreenName());
 	_gfx->loadPalette("palette");
 	_gfx->copyBackgroundScreen();
 
-	_room = SharedPtr<Room>(new Room(this, _screenName));
+	_room = new Room(this, getScreenName());
 
 	// Original sets up bytes 0-3 of rdf file as "remote function caller"
 
-	// Load map file
+	_room->loadMapFile(getScreenName());
+
 	_awayMission.activeAction = ACTION_WALK;
-	_mapFilename = _screenName;
-	_mapFile = loadFile(_mapFilename + ".map");
-	_iwFile = SharedPtr<IWFile>(new IWFile(this, _mapFilename + ".iw"));
 
 	actorFunc1();
 	initActors();
@@ -467,8 +463,10 @@ void StarTrekEngine::unloadRoom() {
 	_gfx->fadeoutScreen();
 	// sub_2394b(); // TODO
 	actorFunc1();
-	_room.reset();
+	delete _room;
+	_room = nullptr;
 	delete _mapFile;
+	_mapFile = nullptr;
 }
 
 int StarTrekEngine::loadActorAnimWithRoomScaling(int actorIndex, const Common::String &animName, int16 x, int16 y) {
@@ -489,7 +487,7 @@ Fixed8 StarTrekEngine::getActorScaleAtPosition(int16 y) {
 	return Fixed8(_playerActorScale * (y - minY)) + minScale;
 }
 
-SharedPtr<Room> StarTrekEngine::getRoom() {
+Room *StarTrekEngine::getRoom() {
 	return _room;
 }
 
diff --git a/engines/startrek/console.cpp b/engines/startrek/console.cpp
index 5e6108e..816b5ce 100644
--- a/engines/startrek/console.cpp
+++ b/engines/startrek/console.cpp
@@ -22,12 +22,14 @@
 
 #include "startrek/console.h"
 #include "gui/debugger.h"
+#include "startrek/room.h"
 #include "startrek/startrek.h"
 
 namespace StarTrek {
 
 Console::Console(StarTrekEngine *vm) : GUI::Debugger(), _vm(vm) {
 	registerCmd("room",			WRAP_METHOD(Console, Cmd_Room));
+	registerCmd("actions",		WRAP_METHOD(Console, Cmd_Actions));
 }
 
 Console::~Console() {
@@ -35,9 +37,9 @@ Console::~Console() {
 
 bool Console::Cmd_Room(int argc, const char **argv) {
 	if (argc < 3) {
-		debugPrintf("Current room: %s%d\n", _vm->_missionToLoad.c_str(), _vm->_roomIndexToLoad);
+		debugPrintf("Current room: %s\n", _vm->getScreenName().c_str());
 		debugPrintf("Use room <mission> <room> to teleport\n");
-		debugPrintf("Valid missions are: DEMON, TUG, LOVE, MUDD, FEATHER, TRIAL, SINS, VENG");
+		debugPrintf("Valid missions are: DEMON, TUG, LOVE, MUDD, FEATHER, TRIAL, SINS, VENG\n");
 		return true;
 	}
 
@@ -48,4 +50,184 @@ bool Console::Cmd_Room(int argc, const char **argv) {
 	return false;
 }
 
+bool Console::Cmd_Actions(int argc, const char **argv) {
+	Common::String screenName = _vm->getScreenName();
+
+	if (argc == 3) {
+		Common::String missionName = argv[1];
+		int roomIndex = atoi(argv[2]);
+
+		screenName = missionName + (char)(roomIndex + '0');
+	}
+
+	Common::MemoryReadStreamEndian *rdfFile = _vm->loadFile(screenName + ".RDF");
+	rdfFile->seek(14);
+
+	uint16 startOffset = rdfFile->readUint16LE();
+	uint16 endOffset = rdfFile->readUint16LE();
+	uint16 offset = startOffset;
+
+	while (offset < endOffset) {
+		rdfFile->seek(offset);
+
+		uint32 action = rdfFile->readUint32LE();
+		uint16 nextOffset = rdfFile->readUint16LE();
+
+		debugPrintf("Offset %d: %s\n", offset, EventToString(action).c_str());
+		offset = nextOffset;
+	}
+
+	delete rdfFile;
+
+	return true;
+}
+
+Common::String Console::EventToString(uint32 action) {
+	const char *actions[] = {
+		"Tick",
+		"Walk",
+		"Use",
+		"Get",
+		"Look",
+		"Talk"
+	};
+
+	byte verb =            action & 0xff;
+	byte subject = (action >>  8) & 0xff;
+	byte b2 =      (action >> 16) & 0xff;
+	byte b3 =      (action >> 24) & 0xff;
+
+	String retString;
+	switch (verb) {
+	case 0:	// Tick
+		retString = Common::String::format("Tick %d", (subject | (b2 << 8)));
+		break;
+	case 2: // Use
+		retString = Common::String(actions[verb]) + " " + ItemToString(subject) + ", " + ItemToString(b2);
+		break;
+	case 1:	// Walk
+	case 3:	// Get
+	case 4:	// Look
+	case 5:	// Talk
+		retString = Common::String(actions[verb]) + " " + ItemToString(subject);
+		break;
+	case 6:	// Warp touched
+		retString = Common::String::format("Touched warp %d", subject);
+		break;
+	case 7:	// Hotspot touched
+		retString = Common::String::format("Touched hotspot %d", subject);
+		break;
+	case 8:	// Timer expired
+		retString = Common::String::format("Timer %d expired", subject);
+		break;
+	case 10: // Animation finished
+		retString = Common::String::format("Finished animation (%d)", subject);
+		break;
+	case 12: // Walking finished
+		retString = Common::String::format("Finished walking (%d)", subject);
+		break;
+	default:
+		retString = Common::String::format("%x%x%x%x", verb, subject, b2, b3);
+		break;
+	}
+
+	// Check for actions using bytes they're not expected to use
+	if (b3 != 0)
+		debugPrintf("WARNING: b3 nonzero in action: %s\n", retString.c_str());
+	if (b2 != 0 && verb != 0 && verb != 2)
+		debugPrintf("WARNING: b2 nonzero in action: %s\n", retString.c_str());
+
+	return retString;
+}
+
+const char *itemNames[] = {
+	"IPHASERS",
+	"IPHASERK",
+	"IHAND",
+	"IROCK",
+	"ISTRICOR",
+	"IMTRICOR",
+	"IDEADGUY",
+	"ICOMM",
+	"IPBC",
+	"IRLG",
+	"IWRENCH",
+	"IINSULAT",
+	"ISAMPLE",
+	"ICURE",
+	"IDISHES",
+	"IRT",
+	"IRTWB",
+	"ICOMBBIT",
+	"IJNKMETL",
+	"IWIRING",
+	"IWIRSCRP",
+	"IPWF",
+	"IPWE",
+	"IDEADPH",
+	"IBOMB",
+	"IMETAL",
+	"ISKULL",
+	"IMINERAL",
+	"IMETEOR",
+	"ISHELLS",
+	"IDEGRIME",
+	"ILENSES",
+	"IDISKS",
+	"IANTIGRA",
+	"IN2GAS",
+	"IO2GAS",
+	"IH2GAS",
+	"IN2O",
+	"INH3",
+	"IH2O",
+	"IWROD",
+	"IIROD",
+	"IREDGEM_A",
+	"IREDGEM_B",
+	"IREDGEM_C",
+	"IGRNGEM_A",
+	"IGRNGEM_B",
+	"IGRNGEM_C",
+	"IBLUGEM_A",
+	"IBLUGEM_B",
+	"IBLUGEM_C",
+	"ICONECT",
+	"IS8ROCKS",
+	"IIDCARD",
+	"ISNAKE",
+	"IFERN",
+	"ICRYSTAL",
+	"IKNIFE",
+	"IDETOXIN",
+	"IBERRY",
+	"IDOOVER",
+	"IALIENDV",
+	"ICAPSULE",
+	"IMEDKIT",
+	"IBEAM",
+	"IDRILL",
+	"IHYPO",
+	"IFUSION",
+	"ICABLE1",
+	"ICABLE2",
+	"ILMD",
+	"IDECK",
+	"ITECH"
+};
+
+Common::String Console::ItemToString(byte index) {
+	if (index == 0)
+		return "KIRK";
+	else if (index == 1)
+		return "SPOCK";
+	else if (index == 2)
+		return "MCCOY";
+	else if (index == 3)
+		return "REDSHIRT";
+	else if (index >= 0x40 && (index - 0x40) < ARRAYSIZE(itemNames))
+		return itemNames[index - 0x40];
+	return Common::String(Common::String::format("0x%02x:", index)); // TODO
+}
+
 } // End of namespace StarTrek
diff --git a/engines/startrek/console.h b/engines/startrek/console.h
index 1d1b6e7..8a920ef 100644
--- a/engines/startrek/console.h
+++ b/engines/startrek/console.h
@@ -38,6 +38,10 @@ private:
 	StarTrekEngine *_vm;
 
 	bool Cmd_Room(int argc, const char **argv);
+	bool Cmd_Actions(int argc, const char **argv);
+
+	Common::String EventToString(uint32 action);
+	Common::String ItemToString(byte index);
 };
 
 } // End of namespace StarTrek
diff --git a/engines/startrek/menu.cpp b/engines/startrek/menu.cpp
index 85503e3..039bddf 100644
--- a/engines/startrek/menu.cpp
+++ b/engines/startrek/menu.cpp
@@ -1167,8 +1167,8 @@ lclick:
 	someSprite.bitmap.reset();
 	_gfx->popSprites();
 
-	_gfx->loadPri(_screenName);
-	_gfx->setBackgroundImage(_gfx->loadBitmap(_screenName));
+	_gfx->loadPri(getScreenName());
+	_gfx->setBackgroundImage(_gfx->loadBitmap(getScreenName()));
 	_gfx->copyBackgroundScreen();
 	_system->updateScreen();
 	_system->delayMillis(10);
diff --git a/engines/startrek/room.cpp b/engines/startrek/room.cpp
index 976d9f4..567cbe5 100644
--- a/engines/startrek/room.cpp
+++ b/engines/startrek/room.cpp
@@ -136,7 +136,8 @@ void Room::loadRoomMessages() {
 		while (*text != '#')
 			text++;
 
-		loadRoomMessage(text);
+		if (text[5] == '\\')
+			loadRoomMessage(text);
 
 		while (*text != '\0')
 			text++;
@@ -509,11 +510,11 @@ void Room::walkCrewmanC(int actorIndex, int16 destX, int16 destY, void (Room::*f
 }
 
 void Room::loadMapFile(const Common::String &name) {
-	_vm->_mapFilename = name;
-	_vm->_iwFile.reset();
 	delete _vm->_mapFile;
-	_vm->_iwFile = SharedPtr<IWFile>(new IWFile(_vm, name + ".iw"));
 	_vm->_mapFile = _vm->loadFile(name + ".map");
+
+	_vm->_iwFile.reset();
+	_vm->_iwFile = SharedPtr<IWFile>(new IWFile(_vm, name + ".iw"));
 }
 
 void Room::showBitmapFor5Ticks(const Common::String &bmpName, int priority) {
diff --git a/engines/startrek/room.h b/engines/startrek/room.h
index 16e994d..54db694 100644
--- a/engines/startrek/room.h
+++ b/engines/startrek/room.h
@@ -212,10 +212,14 @@ private:
 	 */
 	void walkCrewman(int actorIndex, int16 destX, int16 destY, uint16 finishedAnimActionParam = 0);
 	void walkCrewmanC(int actorIndex, int16 destX, int16 destY, void (Room::*funcPtr)());      // Cmd 0x08
+
+public:
 	/**
 	 * Cmd 0x09: Loads a pair of .map and .iw files to change the room's collisions and pathfinding.
 	 */
 	void loadMapFile(const Common::String &name);
+
+private:
 	/**
 	 * Cmd 0x0a
 	 */
diff --git a/engines/startrek/rooms/demon4.cpp b/engines/startrek/rooms/demon4.cpp
index 515946b..848500d 100644
--- a/engines/startrek/rooms/demon4.cpp
+++ b/engines/startrek/rooms/demon4.cpp
@@ -527,8 +527,8 @@ done:
 
 	_vm->_gfx->fadeoutScreen();
 	_vm->_gfx->popSprites();
-	_vm->_gfx->loadPri(_vm->_screenName);
-	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName));
+	_vm->_gfx->loadPri(_vm->getScreenName());
+	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->getScreenName()));
 	_vm->_gfx->copyBackgroundScreen();
 	_vm->_gfx->forceDrawAllSprites();
 
diff --git a/engines/startrek/rooms/demon6.cpp b/engines/startrek/rooms/demon6.cpp
index 1f6cfd6..379c26f 100644
--- a/engines/startrek/rooms/demon6.cpp
+++ b/engines/startrek/rooms/demon6.cpp
@@ -488,8 +488,8 @@ int Room::demon6ShowCase(int visible) {
 
 	_vm->_gfx->fadeoutScreen();
 	_vm->_gfx->popSprites();
-	_vm->_gfx->loadPri(_vm->_screenName);
-	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->_screenName));
+	_vm->_gfx->loadPri(_vm->getScreenName());
+	_vm->_gfx->setBackgroundImage(_vm->_gfx->loadBitmap(_vm->getScreenName()));
 	_vm->_gfx->copyBackgroundScreen();
 	_vm->_gfx->forceDrawAllSprites();
 
diff --git a/engines/startrek/saveload.cpp b/engines/startrek/saveload.cpp
index 7c4516e..126551b 100644
--- a/engines/startrek/saveload.cpp
+++ b/engines/startrek/saveload.cpp
@@ -305,7 +305,8 @@ bool StarTrekEngine::saveOrLoadGameData(Common::SeekableReadStream *in, Common::
 			ser.syncAsUint16LE(a->fielda6);
 		}
 
-		ser.syncString(_mapFilename);
+		Common::String unused = getScreenName();
+		ser.syncString(unused);
 
 		// Away mission struct
 		for (int i = 0; i < 8; i++)
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 123fc74..2e4a5a0 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -70,6 +70,7 @@ StarTrekEngine::StarTrekEngine(OSystem *syst, const StarTrekGameDescription *gam
 	_activeMenu = nullptr;
 	_sound = nullptr;
 	_macResFork = nullptr;
+	_room = nullptr;
 
 	memset(_actionOnWalkCompletionInUse, 0, sizeof(_actionOnWalkCompletionInUse));
 
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index 5f4dc61..3e27e00 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -322,7 +322,7 @@ public:
 	bool isPositionSolid(int16 x, int16 y);
 	void loadRoomIndex(int roomIndex, int spawnIndex);
 
-	SharedPtr<Room> getRoom();
+	Room *getRoom();
 
 	// intro.cpp
 private:
@@ -673,7 +673,11 @@ public:
 	Common::Platform getPlatform() const;
 	uint8 getGameType() const;
 	Common::Language getLanguage() const;
-
+	
+	// _screenName = _missionName + _roomIndex
+	Common::String getScreenName() const {
+		return _missionName + (char)(_roomIndex + '0');
+	}
 
 	// Variables
 public:
@@ -690,8 +694,6 @@ public:
 
 	Common::String _missionName;
 	int _roomIndex;
-	Common::String _screenName; // _screenName = _missionName + _roomIndex
-	Common::String _mapFilename; // Similar to _screenName, but used for .map files?
 	Common::MemoryReadStreamEndian *_mapFile;
 	Fixed16 _playerActorScale;
 
@@ -782,9 +784,8 @@ public:
 private:
 	Common::RandomSource _randomSource;
 	Common::SineTable _sineTable;
-
+	Room *_room;
 	Common::MacResManager *_macResFork;
-	SharedPtr<Room> _room;
 };
 
 // Static function
diff --git a/engines/startrek/textbox.cpp b/engines/startrek/textbox.cpp
index a503c42..33f2f23 100644
--- a/engines/startrek/textbox.cpp
+++ b/engines/startrek/textbox.cpp
@@ -159,7 +159,7 @@ void StarTrekEngine::getTextboxHeader(String *headerTextOutput, String speakerTe
 }
 
 String StarTrekEngine::readTextFromRdf(int choiceIndex, uintptr data, String *headerTextOutput) {
-	SharedPtr<Room> room = getRoom();
+	Room *room = getRoom();
 
 	int rdfVar = (size_t)data;
 





More information about the Scummvm-git-logs mailing list