diff options
| author | Thanasis Antoniou | 2019-04-20 17:16:09 +0300 | 
|---|---|---|
| committer | Thanasis Antoniou | 2019-04-20 17:33:39 +0300 | 
| commit | 63b8ddb50e03a535c4f61a2424914a3c09579197 (patch) | |
| tree | df7c8ca3e01fc6670e1a7332b214a16898539a34 | |
| parent | 5d7cd526e84d903f34e5ef73f9f33f6a7c5c4736 (diff) | |
| download | scummvm-rg350-63b8ddb50e03a535c4f61a2424914a3c09579197.tar.gz scummvm-rg350-63b8ddb50e03a535c4f61a2424914a3c09579197.tar.bz2 scummvm-rg350-63b8ddb50e03a535c4f61a2424914a3c09579197.zip | |
BLADERUNNER: Add list debugger command
Similar to draw (reuses code) but lists objects in the debugger view
| -rw-r--r-- | engines/bladerunner/debugger.cpp | 184 | ||||
| -rw-r--r-- | engines/bladerunner/debugger.h | 1 | 
2 files changed, 184 insertions, 1 deletions
| diff --git a/engines/bladerunner/debugger.cpp b/engines/bladerunner/debugger.cpp index 9d31e5ea27..03bdd4dee0 100644 --- a/engines/bladerunner/debugger.cpp +++ b/engines/bladerunner/debugger.cpp @@ -86,6 +86,7 @@ Debugger::Debugger(BladeRunnerEngine *vm) : GUI::Debugger() {  	registerCmd("anim", WRAP_METHOD(Debugger, cmdAnimation));  	registerCmd("draw", WRAP_METHOD(Debugger, cmdDraw)); +	registerCmd("list", WRAP_METHOD(Debugger, cmdList));  	registerCmd("flag", WRAP_METHOD(Debugger, cmdFlag));  	registerCmd("goal", WRAP_METHOD(Debugger, cmdGoal));  	registerCmd("loop", WRAP_METHOD(Debugger, cmdLoop)); @@ -1071,6 +1072,187 @@ bool Debugger::cmdSubtitle(int argc, const char **argv) {  } +/** +* +* Similar to draw but only list items instead of drawing +* Maybe keep this separate from the draw command, even though some code gets repeated here +* DONE: Provide more info (bbox or position) +* DONE: For actors show current goal too. +* TODO: For items provide friendly name (enum in constants!) +* DONE: Split items in items, actors and objects? +*/ +bool Debugger::cmdList(int argc, const char **argv) { +	if (argc != 2) { +		debugPrintf("Enables debug listing of actors, scene objects, items, waypoints, regions, lights, fogs and walk-boxes.\n"); +		debugPrintf("Usage: %s (act | obj | items | way | reg | lit | fog | walk )\n", argv[0]); +		return true; +	} + +	Common::String arg = argv[1]; +	if (arg == "act") { +		debugPrintf("Listing scene actors: \n"); +		int count = 0; +		for (int i = 0; i < _vm->_sceneObjects->_count; i++) { +			SceneObjects::SceneObject *sceneObject = &_vm->_sceneObjects->_sceneObjects[_vm->_sceneObjects->_sceneObjectsSortedByDistance[i]]; + +			if (sceneObject->type == kSceneObjectTypeActor) { +				debugPrintf("%02d. %s (CLK: %s, TRG: %s, PRS: %s, OBS: %s, MVG: %s), Goal: %d, Pos(%02.2f,%02.2f,%02.2f)\n", +				             count, _vm->_textActorNames->getText(sceneObject->id - kSceneObjectOffsetActors), +				             sceneObject->isClickable? "T" : "F", +				             sceneObject->isTarget?    "T" : "F", +				             sceneObject->isPresent?   "T" : "F", +				             sceneObject->isObstacle?  "T" : "F", +				             sceneObject->isMoving?    "T" : "F", +				             _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getGoal(), +				             _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().x, +				             _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().y, +				             _vm->_actors[sceneObject->id - kSceneObjectOffsetActors]->getPosition().z); +				++count; +			} +		} +		debugPrintf("%d actors were found in scene.\n", count); +	} else if (arg == "obj") { +		debugPrintf("Listing scene objects: \n"); +		int count = 0; +		for (int i = 0; i < _vm->_sceneObjects->_count; i++) { +			SceneObjects::SceneObject *sceneObject = &_vm->_sceneObjects->_sceneObjects[_vm->_sceneObjects->_sceneObjectsSortedByDistance[i]]; +			const BoundingBox &bbox = sceneObject->boundingBox; +			Vector3 a, b; +			bbox.getXYZ(&a.x, &a.y, &a.z, &b.x, &b.y, &b.z); +			Vector3 pos = _vm->_view->calculateScreenPosition(0.5 * (a + b)); + +			if (sceneObject->type == kSceneObjectTypeUnknown) { +				debugPrintf("%02d. Unknown object type\n", count); +				++count; +			} else if (sceneObject->type == kSceneObjectTypeObject) { +				debugPrintf("%02d. %s (CLK: %s, TRG: %s, PRS: %s, OBS: %s, MVG: %s), Pos(%02.2f,%02.2f,%02.2f), Bbox:(%02.2f,%02.2f,%02.2f)~(%02.2f,%02.2f,%02.2f)\n", +				             count, _vm->_scene->objectGetName(sceneObject->id - kSceneObjectOffsetObjects).c_str(), +				             sceneObject->isClickable? "T" : "F", +				             sceneObject->isTarget?    "T" : "F", +				             sceneObject->isPresent?   "T" : "F", +				             sceneObject->isObstacle?  "T" : "F", +				             sceneObject->isMoving?    "T" : "F", +				             pos.x, pos.y, pos.z, +				             a.x, a.y, a.z, b.x, b.y, b.z); +				++count; +			} +		} +		debugPrintf("%d objects were found in scene.\n", count); +	} else if (arg == "items") { +		debugPrintf("Listing scene items: \n"); +		int count = 0; +		for (int i = 0; i < _vm->_sceneObjects->_count; i++) { +			SceneObjects::SceneObject *sceneObject = &_vm->_sceneObjects->_sceneObjects[_vm->_sceneObjects->_sceneObjectsSortedByDistance[i]]; + +			if (sceneObject->type == kSceneObjectTypeItem) { +				const BoundingBox &bbox = sceneObject->boundingBox; +				Vector3 a, b; +				bbox.getXYZ(&a.x, &a.y, &a.z, &b.x, &b.y, &b.z); +				Vector3 pos = _vm->_view->calculateScreenPosition(0.5 * (a + b)); +				char itemText[40]; +				sprintf(itemText, "item %i", sceneObject->id - kSceneObjectOffsetItems); +				debugPrintf("%02d. %s (CLK: %s, TRG: %s, PRS: %s, OBS: %s, MVG: %s), Pos(%02.2f,%02.2f,%02.2f), Bbox:(%02.2f,%02.2f,%02.2f)~(%02.2f,%02.2f,%02.2f)\n", +				             count, itemText, +				             sceneObject->isClickable? "T" : "F", +				             sceneObject->isTarget?    "T" : "F", +				             sceneObject->isPresent?   "T" : "F", +				             sceneObject->isObstacle?  "T" : "F", +				             sceneObject->isMoving?    "T" : "F", +				             pos.x, pos.y, pos.z, +				             a.x, a.y, a.z, b.x, b.y, b.z); +				++count; +			} +		} +		debugPrintf("%d items were found in scene.\n", count); +	} else if (arg == "reg") { +		debugPrintf("Listing regions: \n"); +		int count = 0; +		//list regions +		for (int i = 0; i < 10; i++) { +			Regions::Region *region = &_vm->_scene->_regions->_regions[i]; +			if (!region->present) continue; +			debugPrintf("%02d. Region slot: %d\n", count, i); +			++count; +		} + +		//list exits +		for (int i = 0; i < 10; i++) { +			Regions::Region *region = &_vm->_scene->_exits->_regions[i]; +			if (!region->present) continue; +			debugPrintf("%02d. Exit slot: %d\n", count, i); +			++count; +		} +		debugPrintf("%d regions were found in scene.\n", count); +	} else if (arg == "way") { +		debugPrintf("Listing waypoints: \n"); +		int count = 0; +		for (int i = 0; i < _vm->_waypoints->_count; i++) { +			Waypoints::Waypoint *waypoint = &_vm->_waypoints->_waypoints[i]; +			if(waypoint->setId != _vm->_scene->getSetId()) { +				continue; +			} +			char waypointText[40]; +			sprintf(waypointText, "waypoint %i", i); +			debugPrintf("%02d. %s\n", count, waypointText); +			++count; +		} + +		// list combat cover waypoints +		for (int i = 0; i < (int)_vm->_combat->_coverWaypoints.size(); i++) { +			Combat::CoverWaypoint *cover = &_vm->_combat->_coverWaypoints[i]; +			if (cover->setId != _vm->_scene->getSetId()) { +				continue; +			} +			char coverText[40]; +			sprintf(coverText, "cover %i", i); +			debugPrintf("%02d. %s\n", count, coverText); +			++count; +		} + +		// list combat flee waypoints +		for (int i = 0; i < (int)_vm->_combat->_fleeWaypoints.size(); i++) { +			Combat::FleeWaypoint *flee = &_vm->_combat->_fleeWaypoints[i]; +			if (flee->setId != _vm->_scene->getSetId()) { +				continue; +			} +			char fleeText[40]; +			sprintf(fleeText, "flee %i", i); +			debugPrintf("%02d. %s\n", count, fleeText); +			++count; +		} +		debugPrintf("%d waypoints were found in scene.\n", count); +	} else if (arg == "walk") { +		debugPrintf("Listing walkboxes: \n"); +		// list walkboxes +		for (int i = 0; i < _vm->_scene->_set->_walkboxCount; i++) { +			Set::Walkbox *walkbox = &_vm->_scene->_set->_walkboxes[i]; + +			debugPrintf("%02d. Walkbox %s, vertices: %d\n", i, walkbox->name.c_str(), walkbox->vertexCount); +		} +		debugPrintf("%d walkboxes were found in scene.\n", _vm->_scene->_set->_walkboxCount); +	} else if (arg == "fog") { +		debugPrintf("Listing fogs: \n"); +		int count = 0; +		for (Fog *fog = _vm->_scene->_set->_effects->_fogs; fog != nullptr; fog = fog->_next) { +			debugPrintf("%02d. Fog %s\n", count, fog->_name.c_str()); +			++count; +		} +		debugPrintf("%d fogs were found in scene.\n", count); +	} else if (arg == "lit") { +		debugPrintf("Listing lights: \n"); +		// list lights +		for (int i = 0; i < (int)_vm->_lights->_lights.size(); i++) { +			Light *light = _vm->_lights->_lights[i]; +			debugPrintf("%02d. Light %s\n", i, light->_name.c_str()); +		} +		debugPrintf("%d lights were found in scene.\n", (int)_vm->_lights->_lights.size()); +	} else { +		debugPrintf("Invalid item type was specified.\n"); +	} + +	return true; +} +  void Debugger::drawDebuggerOverlay() {  	if (_viewSceneObjects) drawSceneObjects(); @@ -1135,7 +1317,7 @@ void Debugger::drawSceneObjects() {  				_vm->_mainFont->drawColor(_vm->_textActorNames->getText(sceneObject->id - kSceneObjectOffsetActors), _vm->_surfaceFront, pos.x, pos.y, color);  				break;  			case kSceneObjectTypeItem: -			color = _vm->_surfaceFront.format.RGBToColor(0, 255, 0); +				color = _vm->_surfaceFront.format.RGBToColor(0, 255, 0);  				char itemText[40];  				drawBBox(a, b, _vm->_view, &_vm->_surfaceFront, color);  				sprintf(itemText, "item %i", sceneObject->id - kSceneObjectOffsetItems); diff --git a/engines/bladerunner/debugger.h b/engines/bladerunner/debugger.h index 5770ad71d9..2349af9d8c 100644 --- a/engines/bladerunner/debugger.h +++ b/engines/bladerunner/debugger.h @@ -75,6 +75,7 @@ public:  	bool cmdSave(int argc, const char **argv);  	bool cmdOverlay(int argc, const char **argv);  	bool cmdSubtitle(int argc, const char **argv); +	bool cmdList(int argc, const char **argv);  	void drawDebuggerOverlay(); | 
