[Scummvm-git-logs] scummvm master -> 108f3174f4e486880d1586a526fd621dfe52b8a3

bluegr bluegr at gmail.com
Sun Nov 22 23:25:20 UTC 2020


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

Summary:
c1c4df9991 STARTREK: Add sanity checks when drawing sprites
5c48e50ce6 STARTREK: Enhance the filedump console command to dump multiple files
108f3174f4 STARTREK: Implement basic functionality for the Enterprise's bridge


Commit: c1c4df9991fdce31419afc46f5b1c160f1376d14
    https://github.com/scummvm/scummvm/commit/c1c4df9991fdce31419afc46f5b1c160f1376d14
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-11-23T01:24:50+02:00

Commit Message:
STARTREK: Add sanity checks when drawing sprites

Changed paths:
    engines/startrek/graphics.cpp


diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp
index ce26a29660..a6566492d8 100644
--- a/engines/startrek/graphics.cpp
+++ b/engines/startrek/graphics.cpp
@@ -517,7 +517,7 @@ void Graphics::drawAllSprites(bool updateScreenFlag) {
 
 		for (int i = 0; i < numDirtyRects; i++) {
 			Common::Rect &r = dirtyRects[i];
-			if (r.width() == 0 || r.height() == 0)
+			if (r.width() == 0 || r.height() == 0 || r.left < 0 || r.top < 0)
 				continue;
 
 			int offset = r.top * SCREEN_WIDTH + r.left;
@@ -535,7 +535,7 @@ void Graphics::drawAllSprites(bool updateScreenFlag) {
 				for (int j = 0; j < numDirtyRects; j++) {
 					Common::Rect rect1 = spr->drawRect.findIntersectingRect(dirtyRects[j]);
 
-					if (rect1.width() != 0 && rect1.height() != 0) {
+					if (rect1.width() != 0 && rect1.height() != 0 && rect1.left >= 0 && rect1.top >= 0) {
 						if (mustRedrawSprite)
 							rect2.extend(rect1);
 						else
@@ -556,7 +556,7 @@ void Graphics::drawAllSprites(bool updateScreenFlag) {
 		// Copy dirty rects to screen
 		for (int j = 0; j < numDirtyRects; j++) {
 			Common::Rect &r = dirtyRects[j];
-			if (r.width() == 0 || r.height() == 0)
+			if (r.width() == 0 || r.height() == 0 || r.left < 0 || r.top < 0)
 				continue;
 
 			int offset = r.left + r.top * SCREEN_WIDTH;


Commit: 5c48e50ce619e0e8958354e86c1f1dd15d8fbbd1
    https://github.com/scummvm/scummvm/commit/5c48e50ce619e0e8958354e86c1f1dd15d8fbbd1
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-11-23T01:24:51+02:00

Commit Message:
STARTREK: Enhance the filedump console command to dump multiple files

Changed paths:
    engines/startrek/console.cpp
    engines/startrek/console.h
    engines/startrek/resource.h


diff --git a/engines/startrek/console.cpp b/engines/startrek/console.cpp
index 70eaf2518b..aecf169c4f 100644
--- a/engines/startrek/console.cpp
+++ b/engines/startrek/console.cpp
@@ -127,18 +127,13 @@ bool Console::Cmd_Bg(int argc, const char **argv) {
 	return false;
 }
 
-bool Console::Cmd_DumpFile(int argc, const char **argv) {
-	if (argc < 2) {
-		debugPrintf("Usage: %s <file name>\n", argv[0]);
-		return true;
-	}
+void Console::dumpFile(Common::String fileName) {
+	debugPrintf("Dumping %s...\n", fileName.c_str());
 
-	debugPrintf("Dumping %s...\n", argv[1]);
-
-	Common::MemoryReadStreamEndian *stream = _vm->_resource->loadFile(argv[1], 0, false);
+	Common::MemoryReadStreamEndian *stream = _vm->_resource->loadFile(fileName, 0, false);
 	if (!stream) {
 		debugPrintf("File not found\n");
-		return true;
+		return;
 	}
 
 	uint32 size = stream->size();
@@ -147,11 +142,30 @@ bool Console::Cmd_DumpFile(int argc, const char **argv) {
 	delete stream;
 
 	Common::DumpFile out;
-	out.open(argv[1]);
+	out.open(fileName);
 	out.write(data, size);
 	out.flush();
 	out.close();
 	delete[] data;
+}
+
+bool Console::Cmd_DumpFile(int argc, const char **argv) {
+	if (argc < 2) {
+		debugPrintf("Usage: %s <file name>\n", argv[0]);
+		return true;
+	}
+
+	Common::String fileName = argv[1];
+
+	if (fileName != "*") {
+		dumpFile(fileName);
+	} else {
+		for (Common::List<ResourceIndex>::const_iterator i = _vm->_resource->_resources.begin(), end = _vm->_resource->_resources.end(); i != end; ++i) {
+			if (i->fileName == "S5ROOM3.BMP" || i->fileName == "Z_LIST.TXT")
+				continue;
+			dumpFile(i->fileName);
+		}
+	}
 
 	return true;
 }
diff --git a/engines/startrek/console.h b/engines/startrek/console.h
index e96e83a42d..67e0ce0c3e 100644
--- a/engines/startrek/console.h
+++ b/engines/startrek/console.h
@@ -46,6 +46,7 @@ private:
 
 	Common::String EventToString(uint32 action);
 	Common::String ItemToString(byte index);
+	void dumpFile(Common::String fileName);
 };
 
 } // End of namespace StarTrek
diff --git a/engines/startrek/resource.h b/engines/startrek/resource.h
index c08e018afa..40fd546524 100644
--- a/engines/startrek/resource.h
+++ b/engines/startrek/resource.h
@@ -76,6 +76,8 @@ public:
 		_txtFilename = txtFileName;
 	}
 
+	Common::List<ResourceIndex> _resources;
+
 private:
 	void readIndexFile();
 	ResourceIndex getIndex(Common::String filename);
@@ -88,7 +90,7 @@ private:
 	Common::Platform _platform;
 	bool _isDemo;
 	Common::String _txtFilename;
-	Common::List<ResourceIndex> _resources;
+	//Common::List<ResourceIndex> _resources;
 };
 
 } // End of namespace StarTrek


Commit: 108f3174f4e486880d1586a526fd621dfe52b8a3
    https://github.com/scummvm/scummvm/commit/108f3174f4e486880d1586a526fd621dfe52b8a3
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-11-23T01:24:51+02:00

Commit Message:
STARTREK: Implement basic functionality for the Enterprise's bridge

It's now possible to use the menu system and talk to some crewmates.
The game now starts in bridge mode, and it's possible to beam down
by using Kirk's transporter icon.

Changed paths:
    engines/startrek/actors.cpp
    engines/startrek/bridge.cpp
    engines/startrek/menu.cpp
    engines/startrek/startrek.cpp
    engines/startrek/startrek.h


diff --git a/engines/startrek/actors.cpp b/engines/startrek/actors.cpp
index bf65542af0..1ef78d1e26 100644
--- a/engines/startrek/actors.cpp
+++ b/engines/startrek/actors.cpp
@@ -445,7 +445,7 @@ void StarTrekEngine::actorFunc1() {
 
 void StarTrekEngine::drawActorToScreen(Actor *actor, const Common::String &_animName, int16 x, int16 y, Fixed8 scale, bool addSprite) {
 	Common::String animFilename = _animName;
-	if (_animName.contains("stnd") /* && word_45d20 == -1 */) // TODO
+	if (_animName.hasPrefixIgnoreCase("stnd") /* && word_45d20 == -1 */) // TODO
 		animFilename += 'j';
 
 	actor->animFilename = _animName;
diff --git a/engines/startrek/bridge.cpp b/engines/startrek/bridge.cpp
index 94203b42cd..0d680aed49 100644
--- a/engines/startrek/bridge.cpp
+++ b/engines/startrek/bridge.cpp
@@ -27,6 +27,23 @@
 
 namespace StarTrek {
 
+struct BridgeActorAndMenu {
+	int id;
+	const char *anim;
+	const char *menu;
+	int16 x;
+	int16 y;
+};
+
+BridgeActorAndMenu bridgeActorsAndMenus[] = {
+	{ 0, "bstndki", "command",  60,  100 },	// Kirk
+	{ 1, "bstndsp", "comp",    200,   30 },	// Spock
+	{ 4, "bstndsu", "helm",     60,   70 },	// Sulu
+	{ 5, "bstndch", "nav",      60,   70 },	// Chekov
+	{ 6, "bstnduh", "comm",     30,   30 },	// Uhura
+	{ 7, "bstndsc", "eng",      30,   30 },	// Scotty
+};
+
 void StarTrekEngine::initBridge(bool b) {
 	_gfx->loadPalette("bridge");
 	_sound->loadMusicFile("bridge");
@@ -48,6 +65,11 @@ void StarTrekEngine::loadBridge() {
 	_system->updateScreen();
 
 	loadBridgeActors();
+	_missionName = _missionToLoad;
+	_resource->setTxtFileName(_missionName);
+	_sound->loadMusicFile("bridge");
+	_sound->playMidiMusicTracks(0, -1);
+	//loadBanFile("T0BAN");
 	//sub_1312C();	// TODO
 
 	// TODO
@@ -59,13 +81,37 @@ void StarTrekEngine::loadBridge() {
 }
 
 void StarTrekEngine::loadBridgeActors() {
-	loadActorAnim(0, "bstndki", 0, 0, 4);	// Kirk
-	loadActorAnim(1, "bstndsp", 0, 0, 0);	// Spock
-	loadActorAnim(6, "bstnduh", 0, 0, 0);	// Uhura
-	loadActorAnim(5, "bstndch", 0, 0, 0);	// Chekov
-	loadActorAnim(4, "bstndsu", 0, 0, 0);	// Sulu
-	loadActorAnim(7, "bstndsc", 0, 0, 0);	// Scotty
-	loadActorAnim(2, "xstndmc", 0, 0, 0);	// McCoy
+	for (int i = 0; i < ARRAYSIZE(bridgeActorsAndMenus); ++i) {
+		BridgeActorAndMenu a = bridgeActorsAndMenus[i];
+		loadActorAnim(a.id, a.anim, 0, 0, 1.0);
+	}
+}
+
+void StarTrekEngine::bridgeLeftClick() {
+	Sprite *sprite = _gfx->getSpriteAt(_gfx->getMousePos());
+	int clickedActor = -1;
+
+	if (sprite == nullptr)
+		return;
+
+	for (int i = 0; i < NUM_ACTORS; i++) {
+		Actor *actor = &_actorList[i];
+		if (sprite == &actor->sprite) {
+			clickedActor = i;
+			break;
+		}
+	}
+
+	if (clickedActor == -1)
+		return;
+
+	for (int i = 0; i < ARRAYSIZE(bridgeActorsAndMenus); ++i) {
+		BridgeActorAndMenu a = bridgeActorsAndMenus[i];
+		if (a.id == clickedActor) {
+			showBridgeMenu(a.menu, a.x, a.y);
+			break;
+		}
+	}
 }
 
 void StarTrekEngine::cleanupBridge() {
@@ -109,7 +155,7 @@ void StarTrekEngine::handleBridgeEvents() {
 			break;
 
 		case TREKEVENT_LBUTTONDOWN:
-			// TODO
+			bridgeLeftClick();
 			break;
 
 		case TREKEVENT_MOUSEMOVE:
diff --git a/engines/startrek/menu.cpp b/engines/startrek/menu.cpp
index 04754edc6f..3b3d1480f4 100644
--- a/engines/startrek/menu.cpp
+++ b/engines/startrek/menu.cpp
@@ -254,6 +254,105 @@ void StarTrekEngine::showOptionsMenu(int x, int y) {
 	}
 }
 
+void StarTrekEngine::showBridgeMenu(Common::String menu, int x, int y) {
+	bool tmpMouseControllingShip = _mouseControllingShip;
+	_mouseControllingShip = false;
+
+	Common::Point oldMousePos = _gfx->getMousePos();
+	loadMenuButtons(menu, x, y);
+
+	chooseMousePositionFromSprites(_activeMenu->sprites, _activeMenu->numButtons, -1, 4);
+	int event = handleMenuEvents(0, false);
+
+	unloadMenuButtons();
+	_mouseControllingShip = tmpMouseControllingShip;
+
+	if (event != MENUEVENT_LCLICK_OFFBUTTON && event != MENUEVENT_RCLICK_OFFBUTTON)
+		_gfx->warpMouse(oldMousePos.x, oldMousePos.y);
+
+	switch (event) {
+	case 0:	// Spock, talk
+		// TODO
+		break;
+	case 1:
+		// TODO
+		break;
+	case 2:
+		// TODO
+		break;
+	case 3:
+		// TODO
+		break;
+	case 16:	// Kirk, captain's log
+		// TODO
+		break;
+	case 17:	// Kirk, transporter
+		// TODO: Check if Enterprise is in orbit
+		// TODO: header and text
+		showTextbox("KIRK", "#BRID\\C_060#Spock, come with me. Mr Scott, you have the conn.", 160, 130, 176, 0);
+		runGameMode(GAMEMODE_BEAMDOWN, false);
+		// TODO
+		break;
+	case 18:	// Kirk, options
+		showOptionsMenu(65, 60);
+		break;
+	case 32:
+		// TODO
+		break;
+	case 33: // Spock, consult computer
+		handleBridgeComputer();
+		break;
+	case 48:	// Scotty, damage control
+		// TODO
+		break;
+	case 49:	// Scotty, emergency power
+		// TODO
+		break;
+	case 64:	// Uhura, communications
+		// TODO: header and text
+		showTextbox("LIEUTENANT UHURA", _resource->getLoadedText(16), 298, 150, 161, 0);
+		break;
+	case 80:	// Sulu, orbit
+		// TODO
+		break;
+	case 81:	// Sulu, shields
+		// TODO
+		break;
+	case 96:	// Chekov, navigation
+		// TODO
+		break;
+	case 97:	// Chekov, weapons
+		// TODO
+		break;
+	case 112:
+		// TODO
+		break;
+	case 113:
+		// TODO
+		break;
+	case 114:
+		// TODO
+		break;
+	case 115:
+		// TODO
+		break;
+	case 116:
+		// TODO
+		break;
+	case 117:
+		// TODO
+		break;
+	case 118:
+		// TODO
+		break;
+	case 119:
+		// TODO
+		break;
+	default:
+		break;
+	}
+}
+
 int StarTrekEngine::showActionMenu() {
 	const int actionMappingUp[] = { // Actions to jump to when up is pressed
 		ACTION_TALK,    // <- ACTION_WALK
diff --git a/engines/startrek/startrek.cpp b/engines/startrek/startrek.cpp
index 79e34aadf0..9c5c978fd9 100644
--- a/engines/startrek/startrek.cpp
+++ b/engines/startrek/startrek.cpp
@@ -149,8 +149,7 @@ Common::Error StarTrekEngine::run() {
 		if (!isDemo) {
 			playIntro();
 			_missionToLoad = "DEMON";
-			runGameMode(GAMEMODE_BEAMDOWN, false);
-			//runGameMode(GAMEMODE_BRIDGE, false);
+			runGameMode(GAMEMODE_BRIDGE, false);
 		} else {
 			_missionToLoad = "DEMO";
 			runGameMode(GAMEMODE_AWAYMISSION, false);
diff --git a/engines/startrek/startrek.h b/engines/startrek/startrek.h
index fce8d79dcd..25a983c8b0 100644
--- a/engines/startrek/startrek.h
+++ b/engines/startrek/startrek.h
@@ -547,6 +547,7 @@ public:
 	 */
 	void drawMenuButtonOutline(Bitmap *bitmap, byte color);
 	void showOptionsMenu(int x, int y);
+	void showBridgeMenu(Common::String menu, int x, int y);
 	/**
 	 * Show the "action selection" menu, ie. look, talk, etc.
 	 */
@@ -744,6 +745,7 @@ private:
 	int mouseMoveEvent();
 	int lookupNextAction(const int *lookupArray, int action);
 	void loadBridgeComputerTopics();
+	void bridgeLeftClick();
 
 	Common::RandomSource _randomSource;
 	Common::SineTable _sineTable;




More information about the Scummvm-git-logs mailing list