[Scummvm-git-logs] scummvm master -> 3e9b986e3d462d9f330d8e1ffa0630e2ae3991b3

a-yyg 76591232+a-yyg at users.noreply.github.com
Mon Jul 19 12:53:10 UTC 2021


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:
016d69e418 SAGA2: Fix null target access in task.cpp
d3c4bdbf15 SAGA2: Add debug commands
6f14ea793e SAGA2: Implement show position debug command
3e9b986e3d SAGA2: Implement goto map features


Commit: 016d69e4182c660287c36438e894782e724c7b43
    https://github.com/scummvm/scummvm/commit/016d69e4182c660287c36438e894782e724c7b43
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-19T21:51:20+09:00

Commit Message:
SAGA2: Fix null target access in task.cpp

Changed paths:
    engines/saga2/task.cpp


diff --git a/engines/saga2/task.cpp b/engines/saga2/task.cpp
index 2f95a3855c..40c462fefd 100644
--- a/engines/saga2/task.cpp
+++ b/engines/saga2/task.cpp
@@ -3034,7 +3034,7 @@ void HuntToKillTask::evaluateTarget(void) {
 	Actor               *a = stack->getActor();
 
 	if (flags & evalWeapon
-	        &&  a->isInterruptable()) {
+	        &&  a->isInterruptable() && currentTarget != NULL) {
 		evaluateWeapon();
 		flags &= ~evalWeapon;
 	}


Commit: d3c4bdbf15c5426355a758f74272f94f16f2e65a
    https://github.com/scummvm/scummvm/commit/d3c4bdbf15c5426355a758f74272f94f16f2e65a
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-19T21:51:20+09:00

Commit Message:
SAGA2: Add debug commands

Changed paths:
    engines/saga2/console.cpp
    engines/saga2/console.h
    engines/saga2/objects.cpp
    engines/saga2/objects.h
    engines/saga2/sagafunc.cpp


diff --git a/engines/saga2/console.cpp b/engines/saga2/console.cpp
index 33a1a70f0c..26eddc199d 100644
--- a/engines/saga2/console.cpp
+++ b/engines/saga2/console.cpp
@@ -31,7 +31,15 @@ namespace Saga2 {
 Console::Console(Saga2Engine *vm) : GUI::Debugger() {
 	_vm = vm;
 
-	registerCmd("killprotag", WRAP_METHOD(Console, cmdKillProtag));
+	registerCmd("kill_protag", WRAP_METHOD(Console, cmdKillProtag));
+
+	registerCmd("kill", WRAP_METHOD(Console, cmdKill));
+
+	registerCmd("godmode", WRAP_METHOD(Console, cmdGodmode));
+
+	registerCmd("obj_name", WRAP_METHOD(Console, cmdObjName));
+
+	registerCmd("name2id", WRAP_METHOD(Console, cmdObjNameToID));
 }
 
 Console::~Console() {
@@ -46,4 +54,55 @@ bool Console::cmdKillProtag(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::cmdKill(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s <Actor id>\n", argv[0]);
+	else {
+		Actor *a = (Actor *)GameObject::objectAddress(atoi(argv[1]));
+		if (a)
+			a->getStats()->vitality = 0;
+	}
+
+	return true;
+}
+
+bool Console::cmdGodmode(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s\n <1/0>\n", argv[0]);
+	else {
+		for (ObjectID id = ActorBaseID; id < ActorBaseID + kPlayerActors; ++id) {
+			Actor *a = (Actor *)GameObject::objectAddress(id);
+			a->_godmode = atoi(argv[1]);
+		}
+	}
+
+	return true;
+}
+
+bool Console::cmdObjName(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s <Object id>\n", argv[0]);
+	else {
+		GameObject *obj = GameObject::objectAddress(atoi(argv[1]));
+		if (obj)
+			debugPrintf("%s\n", obj->objName());
+	}
+
+	return true;
+}
+
+bool Console::cmdObjNameToID(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s <Name index>", argv[0]);
+	else {
+		int32 id = GameObject::nameIndexToID(atoi(argv[1]));
+		if (id == -1)
+			debugPrintf("Invalid name index!\n");
+		else
+			debugPrintf("%d\n", id);
+	}
+
+	return true;
+}
+
 }
diff --git a/engines/saga2/console.h b/engines/saga2/console.h
index 5bc5004498..e45db20138 100644
--- a/engines/saga2/console.h
+++ b/engines/saga2/console.h
@@ -39,6 +39,13 @@ private:
 
 	bool cmdKillProtag(int argc, const char **argv);
 
+	bool cmdKill(int argc, const char **argv);
+
+	bool cmdObjName(int argc, const char **argv);
+
+	bool cmdObjNameToID(int argc, const char **argv);
+
+	bool cmdGodmode(int argc, const char **argv);
 };
 
 }
diff --git a/engines/saga2/objects.cpp b/engines/saga2/objects.cpp
index 5fca782a89..3d58fa3796 100644
--- a/engines/saga2/objects.cpp
+++ b/engines/saga2/objects.cpp
@@ -202,6 +202,8 @@ GameObject::GameObject(void) {
 
 	_data.obj = this;
 	_index = 0;
+
+	_godmode = false;
 }
 
 //-----------------------------------------------------------------------
@@ -227,6 +229,8 @@ GameObject::GameObject(const ResourceGameObject &res) {
 
 	_data.obj = this;
 	_index = 0;
+
+	_godmode = false;
 }
 
 GameObject::GameObject(Common::InSaveFile *in) {
@@ -234,6 +238,7 @@ GameObject::GameObject(Common::InSaveFile *in) {
 
 	read(in, false);
 	_index = 0;
+	_godmode = false;
 }
 
 void GameObject::read(Common::InSaveFile *in, bool expandProto) {
@@ -390,6 +395,34 @@ ProtoObj *GameObject::protoAddress(ObjectID id) {
 	return obj ? obj->prototype : nullptr ;
 }
 
+int32 GameObject::nameIndexToID(uint16 ind) {
+	for (int i = 0; i < objectCount; ++i) {
+		if (objectList[i]._data.nameIndex == ind)
+			return objectList[i].thisID();
+
+		if (objectList[i].prototype && objectList[i].prototype->nameIndex == ind)
+			return objectList[i].thisID();
+	}
+
+	for (int i = 0; i < kActorCount; ++i) {
+		if (actorList[i]._data.nameIndex == ind)
+			return actorList[i].thisID();
+
+		if (actorList[i].prototype && actorList[i].prototype->nameIndex == ind)
+			return actorList[i].thisID();
+	}
+
+	for (int i = 0; i < worldCount; ++i) {
+		if (worldList[i]._data.nameIndex == ind)
+			return worldList[i].thisID();
+
+		if (worldList[i].prototype && worldList[i].prototype->nameIndex == ind)
+			return worldList[i].thisID();
+	}
+
+	return -1;
+}
+
 
 uint16 GameObject::containmentSet(void) {
 	return  prototype->containmentSet();
diff --git a/engines/saga2/objects.h b/engines/saga2/objects.h
index 0b6526faf6..1415275a93 100644
--- a/engines/saga2/objects.h
+++ b/engines/saga2/objects.h
@@ -174,6 +174,7 @@ protected:
 public:
 	ObjectData _data;
 	uint _index;
+	bool _godmode;
 	//  Default constructor
 	GameObject(void);
 
@@ -197,6 +198,8 @@ public:
 	//  Converts object ID into prototype address...
 	static ProtoObj *protoAddress(ObjectID id);
 
+	static int32 nameIndexToID(uint16 ind);
+
 	//  object creation and deletion
 	static GameObject *newObject(void);      // get a newly created object
 	void deleteObject(void);                 // delete this object and remove
@@ -400,6 +403,9 @@ public:
 	    int8                dice = 0,
 	    uint8               sides = 1,
 	    int8                perDieMod = 0) {
+		if (_godmode)
+			return false;
+
 		return  prototype->acceptDamage(
 		            thisID(),
 		            enactor,
diff --git a/engines/saga2/sagafunc.cpp b/engines/saga2/sagafunc.cpp
index ba5e1d6778..e4f518ec27 100644
--- a/engines/saga2/sagafunc.cpp
+++ b/engines/saga2/sagafunc.cpp
@@ -1271,6 +1271,10 @@ int16 scriptActorSetVitality(int16 *args) {
 	OBJLOG(SetVitality);
 	if (isActor((GameObject *)thisThread->thisObject)) {
 		Actor       *a = (Actor *)thisThread->thisObject;
+
+		if (a->_godmode)
+			return 0;
+
 		int16       &vitalityRef = a->getStats()->vitality;
 		int16       oldVal = vitalityRef;
 		PlayerActorID   pID;


Commit: 6f14ea793ed75832a474d236a3cbd8f7f82f4a8b
    https://github.com/scummvm/scummvm/commit/6f14ea793ed75832a474d236a3cbd8f7f82f4a8b
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-19T21:51:20+09:00

Commit Message:
SAGA2: Implement show position debug command

Changed paths:
    engines/saga2/console.cpp
    engines/saga2/console.h
    engines/saga2/main.cpp
    engines/saga2/saga2.cpp
    engines/saga2/saga2.h


diff --git a/engines/saga2/console.cpp b/engines/saga2/console.cpp
index 26eddc199d..4ac50ca2fc 100644
--- a/engines/saga2/console.cpp
+++ b/engines/saga2/console.cpp
@@ -40,6 +40,8 @@ Console::Console(Saga2Engine *vm) : GUI::Debugger() {
 	registerCmd("obj_name", WRAP_METHOD(Console, cmdObjName));
 
 	registerCmd("name2id", WRAP_METHOD(Console, cmdObjNameToID));
+
+	registerCmd("position", WRAP_METHOD(Console, cmdPosition));
 }
 
 Console::~Console() {
@@ -105,4 +107,15 @@ bool Console::cmdObjNameToID(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::cmdPosition(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s <1/0>\n", argv[0]);
+	else {
+		bool show = atoi(argv[1]);
+		_vm->_showPosition = show;
+	}
+
+	return true;
+}
+
 }
diff --git a/engines/saga2/console.h b/engines/saga2/console.h
index e45db20138..6c7011b70a 100644
--- a/engines/saga2/console.h
+++ b/engines/saga2/console.h
@@ -46,6 +46,8 @@ private:
 	bool cmdObjNameToID(int argc, const char **argv);
 
 	bool cmdGodmode(int argc, const char **argv);
+
+	bool cmdPosition(int argc, const char **argv);
 };
 
 }
diff --git a/engines/saga2/main.cpp b/engines/saga2/main.cpp
index e5f40a0a0c..4370c318c6 100644
--- a/engines/saga2/main.cpp
+++ b/engines/saga2/main.cpp
@@ -159,6 +159,7 @@ int16 OptionsDialog(bool disableSaveResume = false);
 
 static void mainLoop(bool &cleanExit, int argc, char *argv[]);
 void displayUpdate(void);
+void showDebugMessages();
 
 bool initResourceHandles();
 bool initDisplayPort();
@@ -352,6 +353,15 @@ void displayUpdate(void) {
 		//  Call the asynchronous path finder
 		debugC(1, kDebugEventLoop, "EventLoop: pathfinder update");
 		runPathFinder();
+
+		showDebugMessages();
+	}
+}
+
+void showDebugMessages() {
+	if (g_vm->_showPosition) {
+		TilePoint p = centerActorCoords();
+		WriteStatusF2(0, "Position: %d, %d, %d", p.u, p.v, p.z);
 	}
 }
 
@@ -707,7 +717,7 @@ bool initGUIMessagers(void) {
 		if (Status[i] == NULL)
 			return false;
 		sprintf(debItem, "Status%2.2d", i + 10);
-		Status2[i] = new StatusLineMessager(debItem, i, &g_vm->_mainPort, 468, 21 + (11 * i));
+		Status2[i] = new StatusLineMessager(debItem, i, &g_vm->_mainPort, 20, 21 + (11 * i));
 	}
 	for (int j = 0; j < 3; j++)
 		ratemess[j] = new StatusLineMessager("FrameRates", j, &g_vm->_mainPort, 5, 450 + (11 * j), 500);
diff --git a/engines/saga2/saga2.cpp b/engines/saga2/saga2.cpp
index d6c0c1bbd7..81aa222c59 100644
--- a/engines/saga2/saga2.cpp
+++ b/engines/saga2/saga2.cpp
@@ -72,6 +72,7 @@ Saga2Engine::Saga2Engine(OSystem *syst)
 	_autoWeapon = true;
 	_showNight = true;
 	_speechText = true;
+	_showPosition = false;
 
 	SearchMan.addSubDirectoryMatching(gameDataDir, "res");
 	SearchMan.addSubDirectoryMatching(gameDataDir, "dos/drivers"); // For Miles Sound files
diff --git a/engines/saga2/saga2.h b/engines/saga2/saga2.h
index 0f427fb940..b4002ceec6 100644
--- a/engines/saga2/saga2.h
+++ b/engines/saga2/saga2.h
@@ -176,6 +176,8 @@ public:
 	bool _showNight;
 	bool _speechText;
 
+	bool _showPosition;
+
 private:
 	Video::SmackerDecoder *_smkDecoder;
 	int _videoX, _videoY;


Commit: 3e9b986e3d462d9f330d8e1ffa0630e2ae3991b3
    https://github.com/scummvm/scummvm/commit/3e9b986e3d462d9f330d8e1ffa0630e2ae3991b3
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-19T21:51:20+09:00

Commit Message:
SAGA2: Implement goto map features

Changed paths:
    engines/saga2/console.cpp
    engines/saga2/console.h


diff --git a/engines/saga2/console.cpp b/engines/saga2/console.cpp
index 4ac50ca2fc..5d486acf61 100644
--- a/engines/saga2/console.cpp
+++ b/engines/saga2/console.cpp
@@ -23,11 +23,14 @@
 #include "saga2/saga2.h"
 #include "saga2/objects.h"
 #include "saga2/player.h"
+#include "saga2/mapfeatr.h"
 
 #include "saga2/console.h"
 
 namespace Saga2 {
 
+extern pCMapFeature mapFeatures[];
+
 Console::Console(Saga2Engine *vm) : GUI::Debugger() {
 	_vm = vm;
 
@@ -42,6 +45,10 @@ Console::Console(Saga2Engine *vm) : GUI::Debugger() {
 	registerCmd("name2id", WRAP_METHOD(Console, cmdObjNameToID));
 
 	registerCmd("position", WRAP_METHOD(Console, cmdPosition));
+
+	registerCmd("teleport", WRAP_METHOD(Console, cmdTeleport));
+
+	registerCmd("goto_place", WRAP_METHOD(Console, cmdGotoPlace));
 }
 
 Console::~Console() {
@@ -118,4 +125,42 @@ bool Console::cmdPosition(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::cmdTeleport(int argc, const char **argv) {
+	if (argc != 4)
+		debugPrintf("Usage: %s <u> <v> <z>\n", argv[0]);
+	else {
+		int u = atoi(argv[1]);
+		int v = atoi(argv[2]);
+		int z = atoi(argv[3]);
+
+		Actor *a = getCenterActor();
+		a->setLocation(TilePoint(u, v, z));
+	}
+
+	return true;
+}
+
+bool Console::cmdGotoPlace(int argc, const char **argv) {
+	if (argc != 2)
+		debugPrintf("Usage: %s <place id>\n", argv[0]);
+	else {
+		int placeID = atoi(argv[1]);
+		int u = mapFeatures[placeID]->getU();
+		int v = mapFeatures[placeID]->getV();
+
+		Actor *a = getCenterActor();
+
+		int du = u - a->getLocation().u;
+		int dv = v - a->getLocation().v;
+
+		for (ObjectID id = ActorBaseID; id < ActorBaseID + kPlayerActors; ++id) {
+			Actor *p = (Actor *)GameObject::objectAddress(id);
+			TilePoint curLoc = p->getLocation();
+			p->setLocation(TilePoint(curLoc.u + du, curLoc.v + dv, 8));
+		}
+	}
+
+	return true;
+}
+
 }
diff --git a/engines/saga2/console.h b/engines/saga2/console.h
index 6c7011b70a..3f5635021f 100644
--- a/engines/saga2/console.h
+++ b/engines/saga2/console.h
@@ -48,6 +48,10 @@ private:
 	bool cmdGodmode(int argc, const char **argv);
 
 	bool cmdPosition(int argc, const char **argv);
+
+	bool cmdTeleport(int argc, const char **argv);
+
+	bool cmdGotoPlace(int argc, const char **argv);
 };
 
 }




More information about the Scummvm-git-logs mailing list