diff options
| -rw-r--r-- | engines/bladerunner/actor.cpp | 18 | ||||
| -rw-r--r-- | engines/bladerunner/actor.h | 6 | ||||
| -rw-r--r-- | engines/bladerunner/bladerunner.cpp | 127 | ||||
| -rw-r--r-- | engines/bladerunner/bladerunner.h | 4 | ||||
| -rw-r--r-- | engines/bladerunner/light.h | 3 | ||||
| -rw-r--r-- | engines/bladerunner/lights.cpp | 2 | ||||
| -rw-r--r-- | engines/bladerunner/lights.h | 3 | ||||
| -rw-r--r-- | engines/bladerunner/regions.h | 4 | ||||
| -rw-r--r-- | engines/bladerunner/scene_objects.h | 3 | ||||
| -rw-r--r-- | engines/bladerunner/script/rc01.cpp | 4 | ||||
| -rw-r--r-- | engines/bladerunner/script/script.cpp | 55 | ||||
| -rw-r--r-- | engines/bladerunner/set.cpp | 99 | ||||
| -rw-r--r-- | engines/bladerunner/set.h | 20 | ||||
| -rw-r--r-- | engines/bladerunner/view.cpp | 18 | ||||
| -rw-r--r-- | engines/bladerunner/view.h | 1 | 
15 files changed, 325 insertions, 42 deletions
diff --git a/engines/bladerunner/actor.cpp b/engines/bladerunner/actor.cpp index c112c722b6..c0c042e47f 100644 --- a/engines/bladerunner/actor.cpp +++ b/engines/bladerunner/actor.cpp @@ -365,7 +365,7 @@ bool Actor::tick(bool forceDraw) {  				float originalZ = this->_position.z;  				this->_position.x = this->_position.x + positionChange.x * cosx - positionChange.y * sinx; -				this->_position.z = this->_position.z - positionChange.x * sinx - positionChange.y * cosx; //why minus? +				this->_position.z = this->_position.z + positionChange.x * sinx + positionChange.y * cosx;  				this->_position.y = this->_position.y + positionChange.z;  				if (_vm->_sceneObjects->existsOnXZ(this->_id, this->_position.x, this->_position.z, false, false) == 1 && !this->_isImmuneToObstacles) { @@ -494,6 +494,12 @@ void Actor::setBoundingBox(Vector3 position, bool retired) {  	}  } +float Actor::distanceFromView(View *view) { +	float xDist = this->_position.x - view->_cameraPosition.x; +	float zDist = this->_position.z - view->_cameraPosition.z; +	return sqrt(xDist * xDist + zDist * zDist); +} +  bool Actor::isWalking() {  	return _walkInfo->isWalking();  } @@ -803,6 +809,16 @@ void Actor::copyClues(int actorId) {  	}  } +int Actor::soundVolume() { +	float dist = distanceFromView(_vm->_view); +	return 255.0f * MAX(MIN(dist / 1200.0f, 1.0f), 0.0f); +} + +int Actor::soundBalance() { +	Vector2 screenPosition = _vm->_view->calculateScreenPosition(_position); +	return 127.0f * (MAX(MIN(screenPosition.x / 640.0f, 1.0f), 0.0f) * 2.0f - 1.0f); +} +  void Actor::countdownTimerStart(int timerId, int interval) {  	assert(timerId >= 0 && timerId < 7);  	_timersRemain[timerId] = interval; diff --git a/engines/bladerunner/actor.h b/engines/bladerunner/actor.h index e0984113f6..5383adb448 100644 --- a/engines/bladerunner/actor.h +++ b/engines/bladerunner/actor.h @@ -35,6 +35,7 @@ class ActorWalk;  class BladeRunnerEngine;  class BoundingBox;  class MovementTrack; +class View;  class Actor {  	friend class ScriptBase; @@ -138,6 +139,7 @@ public:  	void setSetId(int setId);  	BoundingBox* getBoundingBox() { return _bbox; }  	Common::Rect* getScreenRectangle() { return &_screenRectangle; } +	int getWalkbox() { return _walkboxId; }  	bool isRetired() { return _isRetired; }  	bool isTargetable() { return _isTargetable; }  	void setTargetable(bool targetable); @@ -191,9 +193,13 @@ public:  	void loseClue(int clueId);  	bool hasClue(int clueId);  	void copyClues(int actorId); + +	int soundVolume(); +	int soundBalance();  private:  	void setFacing(int facing, bool halfOrSet = true);  	void setBoundingBox(Vector3 position, bool retired); +	float distanceFromView(View* view);  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index 13889ba687..45ffdd8998 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -500,6 +500,36 @@ void BladeRunnerEngine::gameLoop() {  	} while (_gameIsRunning);  } +#if _DEBUG + +void drawBBox(Vector3 start, Vector3 end, View* view, Graphics::Surface *surface, int color) { +	Vector2 bfl = view->calculateScreenPosition(Vector3(start.x, start.y, start.z)); +	Vector2 bfr = view->calculateScreenPosition(Vector3(start.x, end.y, start.z)); +	Vector2 bbr = view->calculateScreenPosition(Vector3(end.x, end.y, start.z)); +	Vector2 bbl = view->calculateScreenPosition(Vector3(end.x, start.y, start.z)); + +	Vector2 tfl = view->calculateScreenPosition(Vector3(start.x, start.y, end.z)); +	Vector2 tfr = view->calculateScreenPosition(Vector3(start.x, end.y, end.z)); +	Vector2 tbr = view->calculateScreenPosition(Vector3(end.x, end.y, end.z)); +	Vector2 tbl = view->calculateScreenPosition(Vector3(end.x, start.y, end.z)); + +	surface->drawLine(bfl.x, bfl.y, bfr.x, bfr.y, color); +	surface->drawLine(bfr.x, bfr.y, bbr.x, bbr.y, color); +	surface->drawLine(bbr.x, bbr.y, bbl.x, bbl.y, color); +	surface->drawLine(bbl.x, bbl.y, bfl.x, bfl.y, color); + +	surface->drawLine(tfl.x, tfl.y, tfr.x, tfr.y, color); +	surface->drawLine(tfr.x, tfr.y, tbr.x, tbr.y, color); +	surface->drawLine(tbr.x, tbr.y, tbl.x, tbl.y, color); +	surface->drawLine(tbl.x, tbl.y, tfl.x, tfl.y, color); + +	surface->drawLine(bfl.x, bfl.y, tfl.x, tfl.y, color); +	surface->drawLine(bfr.x, bfr.y, tfr.x, tfr.y, color); +	surface->drawLine(bbr.x, bbr.y, tbr.x, tbr.y, color); +	surface->drawLine(bbl.x, bbl.y, tbl.x, tbl.y, color); +} +#endif +  void BladeRunnerEngine::gameTick() {  	handleEvents(); @@ -554,11 +584,10 @@ void BladeRunnerEngine::gameTick() {  		// TODO: Tick Actor AI and Timers  		if (_settings->getNewScene() == -1 || _script->_inScriptCounter /* || in_ai */) { -  			_sliceRenderer->setView(*_view);  			// Tick and draw all actors in current set -			int setId = _scene->_setId; +			//int setId = _scene->_setId;  			for (int i = 0, end = _gameInfo->getActorCount(); i != end; ++i) {  				//if (_actors[i]->getSetId() == setId) {  					if (i == 0 || i == 23){ // Currently limited to McCoy and Officer Leroy @@ -577,6 +606,98 @@ void BladeRunnerEngine::gameTick() {  			// TODO: Process AUD  			// TODO: Footstep sound +			if (_walkSoundId >= 0) +			{ +				const char *name = _gameInfo->getSfxTrack(_walkSoundId); +				_audioPlayer->playAud(name, _walkSoundVolume, _walkSoundBalance, _walkSoundBalance, 50, 0); +				_walkSoundId = -1; +			} + +#if _DEBUG +			//draw scene objects +			int count = _sceneObjects->_count; +			if (count > 0) { +				for (int i = 0; i < count; i++) { +					SceneObject *sceneObject = &_sceneObjects->_sceneObjects[_sceneObjects->_sceneObjectsSortedByDistance[i]]; + +					BoundingBox *bbox = &sceneObject->_boundingBox; +					Vector3 a, b; +					bbox->getXYZ(&a.x, &a.y, &a.z, &b.x, &b.y, &b.z); + +					int color = 0b111111111111111; +					if (sceneObject->_sceneObjectType == SceneObjectTypeActor) { +						color = 0b111110000000000; +					} +					if (sceneObject->_sceneObjectType == SceneObjectTypeObject) { +						color = 0b011110111101111; +						//if (sceneObject->_isObstacle) +						//	color += 0b100000000000000; +						if (sceneObject->_isClickable) +							color = 0b000001111100000; +						//if (sceneObject->_isTarget) +						//	color += 0b000000000010000; +					} + +					sceneObject->_sceneObjectId; +					drawBBox(a, b, _view, &_surface2, color); +				} +			} +			 +			//draw regions +			for (int i = 0; i < 10; i++) { +				Region* region  =  &_scene->_regions->_regions[i]; +				if (!region->_present) continue; +				_surface2.frameRect(region->_rectangle, 0b000000000011111); +			} + +			for (int i = 0; i < 10; i++) { +				Region* region = &_scene->_exits->_regions[i]; +				if (!region->_present) continue; +				_surface2.frameRect(region->_rectangle, 0b111111111111111); +			} + +			for (int i = 0; i < _scene->_set->_walkboxCount; i++) { +				Walkbox *walkbox = &_scene->_set->_walkboxes[i]; +				 +				for(int j = 0; j < walkbox->_vertexCount; j++) { +					Vector2 start = _view->calculateScreenPosition(walkbox->_vertices[j]); +					Vector2 end = _view->calculateScreenPosition(walkbox->_vertices[(j+1) % walkbox->_vertexCount]); +					//debug("walkbox[%i][%i] =  x=%f y=%f x=%f y=%f", i, j, start.x, start.y, end.x, end.y); +					_surface2.drawLine(start.x, start.y, end.x, end.y, 0b111111111100000); +				} +				 +			} + +			for (Light* light = _lights->_lights; light != nullptr; light->_next) { + +				Matrix4x3 matrix = light->_matrix; + +				// this is all wrong + +//					matrix = matrix * rotationMatrixX(float(M_PI) / 2.0f); + +//					Matrix4x3 a( +//						-1.0f, 0.0f, 0.0f, 0.0f, +//						0.0f, -1.0f, 0.0f, 0.0f, +//						0.0f, 0.0f, 1.0f, 0.0f); + +				//matrix = a * matrix; +//					matrix = invertMatrix(matrix); + +				int colorR = (light->_color.r * 31.0f); +				int colorG = (light->_color.g * 31.0f); +				int colorB = (light->_color.b * 31.0f); +				int color = (colorR << 10) + (colorG << 5) + colorB; +				drawBBox( +					Vector3(matrix(0, 3) - 5.0f, matrix(1, 3) - 5.0f, matrix(2, 3) - 5.0f), +					Vector3(matrix(0, 3) + 5.0f, matrix(1, 3) + 5.0f, matrix(2, 3) + 5.0f), +					_view, &_surface2, color +				); +				light = light->_next; + +			} +#endif +  			_system->copyRectToScreen((const byte *)_surface2.getBasePtr(0, 0), _surface2.pitch, 0, 0, 640, 480);  			_system->updateScreen();  			_system->delayMillis(10); @@ -614,7 +735,7 @@ void BladeRunnerEngine::handleMouseClick(int x, int y) {  	int isTarget;  	int sceneObjectId = _sceneObjects->findByXYZ(&isClickable, &isObstacle, &isTarget, mousePosition.x, mousePosition.y, mousePosition.z, 1, 0, 1); -	int exitIndex     = _scene->_exits->getTypeAtXY(x, y); +	int exitIndex     = _scene->_exits->getRegionAtXY(x, y);  	debug("%d %d", sceneObjectId, exitIndex); diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h index 082617e65b..51c68550f7 100644 --- a/engines/bladerunner/bladerunner.h +++ b/engines/bladerunner/bladerunner.h @@ -120,6 +120,10 @@ public:  	bool _gameIsLoading;  	bool _sceneIsLoading; +	int _walkSoundId = -1; +	int _walkSoundVolume = 0; +	int _walkSoundBalance = 0; +  private:  	static const int kArchiveCount = 10;  	MIXArchive _archives[kArchiveCount]; diff --git a/engines/bladerunner/light.h b/engines/bladerunner/light.h index b075c914c2..a6ac21eb8b 100644 --- a/engines/bladerunner/light.h +++ b/engines/bladerunner/light.h @@ -38,6 +38,9 @@ class Lights;  class Light  { +#if _DEBUG +	friend class BladeRunnerEngine; +#endif  	friend class Lights;  	char _name[20]; diff --git a/engines/bladerunner/lights.cpp b/engines/bladerunner/lights.cpp index 7a6be94c6d..eb18958020 100644 --- a/engines/bladerunner/lights.cpp +++ b/engines/bladerunner/lights.cpp @@ -10,7 +10,7 @@ Lights::Lights(BladeRunnerEngine *vm)  	_ambientLightColor.g = 0.0;  	_ambientLightColor.b = 0.0; -	_lights = NULL; +	_lights = nullptr;  	_frame = 0;  } diff --git a/engines/bladerunner/lights.h b/engines/bladerunner/lights.h index 0db7a07fe8..37a7b17452 100644 --- a/engines/bladerunner/lights.h +++ b/engines/bladerunner/lights.h @@ -32,6 +32,9 @@  namespace BladeRunner {  class Lights { +#if _DEBUG +	friend class BladeRunnerEngine; +#endif  	BladeRunnerEngine *_vm;  	Color _ambientLightColor; diff --git a/engines/bladerunner/regions.h b/engines/bladerunner/regions.h index 8a65aed5a4..ebb2ef7fcf 100644 --- a/engines/bladerunner/regions.h +++ b/engines/bladerunner/regions.h @@ -38,6 +38,10 @@ struct Region  class Regions  { +#ifdef _DEBUG +	friend class BladeRunnerEngine; +#endif +  private:  	Region* _regions;  	bool _enabled; diff --git a/engines/bladerunner/scene_objects.h b/engines/bladerunner/scene_objects.h index 6414c5d671..b7342d67ce 100644 --- a/engines/bladerunner/scene_objects.h +++ b/engines/bladerunner/scene_objects.h @@ -62,6 +62,9 @@ struct SceneObject  };  class SceneObjects { +#if _DEBUG +	friend class BladeRunnerEngine; +#endif  	BladeRunnerEngine *_vm;  private: diff --git a/engines/bladerunner/script/rc01.cpp b/engines/bladerunner/script/rc01.cpp index 7b00b5f550..9d88d2dec3 100644 --- a/engines/bladerunner/script/rc01.cpp +++ b/engines/bladerunner/script/rc01.cpp @@ -25,10 +25,14 @@  namespace BladeRunner {  void ScriptRC01::InitializeScene() { +#if _DEBUG  	//TODO: not part of game, remove  	Game_Flag_Set(24); // force skip intro  	// Game_Flag_Set(9); // Force flag 9 so McCoy will be in view +	Footstep_Sound_Override_On(0); +#endif +  	if (!Game_Flag_Query(24)) {  		Ambient_Sounds_Remove_All_Non_Looping_Sounds(1);  		Ambient_Sounds_Remove_All_Looping_Sounds(1); diff --git a/engines/bladerunner/script/script.cpp b/engines/bladerunner/script/script.cpp index 4ecec28753..50d56d566c 100644 --- a/engines/bladerunner/script/script.cpp +++ b/engines/bladerunner/script/script.cpp @@ -52,7 +52,13 @@ namespace BladeRunner {  bool Script::open(const Common::String &name) {  	delete _currentScript; +  	if (name == "RC01") { _currentScript = new ScriptRC01(_vm); return true; } +	if (name == "RC02") { _currentScript = new ScriptRC02(_vm); return true; } +	if (name == "RC03") { _currentScript = new ScriptRC03(_vm); return true; } +	if (name == "RC04") { _currentScript = new ScriptRC04(_vm); return true; } +	if (name == "RC51") { _currentScript = new ScriptRC51(_vm); return true; } +  	return false;  } @@ -792,40 +798,61 @@ void ScriptBase::Sound_Play_Speech_Line(int actorId, int speechId, int a3, int a  }  void ScriptBase::Sound_Left_Footstep_Walk(int actorId) { -	//TODO -	warning("Sound_Left_Footstep_Walk(%d)", actorId); +	int walkboxId = _vm->_actors[actorId]->getWalkbox(); +	if (walkboxId < 0) { +		walkboxId = 0; +	} + +	_vm->_walkSoundId = _vm->_scene->_set->getWalkboxSoundWalkLeft(walkboxId); +	_vm->_walkSoundVolume = _vm->_actors[actorId]->soundVolume(); +	_vm->_walkSoundBalance = _vm->_actors[actorId]->soundBalance();  }  void ScriptBase::Sound_Right_Footstep_Walk(int actorId) { -	//TODO -	warning("Sound_Right_Footstep_Walk(%d)", actorId); +	int walkboxId = _vm->_actors[actorId]->getWalkbox(); +	if (walkboxId < 0) { +		walkboxId = 0; +	} + +	_vm->_walkSoundId = _vm->_scene->_set->getWalkboxSoundWalkRight(walkboxId); +	_vm->_walkSoundVolume = _vm->_actors[actorId]->soundVolume(); +	_vm->_walkSoundBalance = _vm->_actors[actorId]->soundBalance();  }  void ScriptBase::Sound_Left_Footstep_Run(int actorId) { -	//TODO -	warning("Sound_Left_Footstep_Run(%d)", actorId); +	int walkboxId = _vm->_actors[actorId]->getWalkbox(); +	if (walkboxId < 0) { +		walkboxId = 0; +	} + +	_vm->_walkSoundId = _vm->_scene->_set->getWalkboxSoundRunLeft(walkboxId); +	_vm->_walkSoundVolume = _vm->_actors[actorId]->soundVolume(); +	_vm->_walkSoundBalance = _vm->_actors[actorId]->soundBalance();  }  void ScriptBase::Sound_Right_Footstep_Run(int actorId) { -	//TODO -	warning("Sound_Right_Footstep_Run(%d)", actorId); +	int walkboxId = _vm->_actors[actorId]->getWalkbox(); +	if (walkboxId < 0) { +		walkboxId = 0; +	} + +	_vm->_walkSoundId = _vm->_scene->_set->getWalkboxSoundRunRight(walkboxId); +	_vm->_walkSoundVolume = _vm->_actors[actorId]->soundVolume(); +	_vm->_walkSoundBalance = _vm->_actors[actorId]->soundBalance();  }  // ScriptBase::Sound_Walk_Shuffle_Stop  void ScriptBase::Footstep_Sounds_Set(int walkboxId, int stepSound) { -	//TODO -	warning("Footstep_Sounds_Set(%d, %d)", walkboxId, stepSound); +	_vm->_scene->_set->setWalkboxStepSound(walkboxId, stepSound);  }  void ScriptBase::Footstep_Sound_Override_On(int footstepSoundOverride) { -	//TODO -	warning("Footstep_Sound_Override_On(%d)", footstepSoundOverride); +	_vm->_scene->_set->setFoodstepSoundOverride(footstepSoundOverride);  }  void ScriptBase::Footstep_Sound_Override_Off() { -	//TODO -	warning("Footstep_Sound_Override_Off()"); +	_vm->_scene->_set->resetFoodstepSoundOverride();  }  bool ScriptBase::Music_Play(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { diff --git a/engines/bladerunner/set.cpp b/engines/bladerunner/set.cpp index f7db1c2f0c..12db84ae24 100644 --- a/engines/bladerunner/set.cpp +++ b/engines/bladerunner/set.cpp @@ -44,6 +44,7 @@ Set::Set(BladeRunnerEngine *vm) : _vm(vm) {  	_walkboxes = new Walkbox[95];  	_footstepSoundOverride = -1;  	_effects = new SetEffects(vm); +	_loaded = false;  }  Set::~Set() { @@ -64,7 +65,7 @@ bool Set::open(const Common::String &name) {  	_objectCount = s->readUint32LE();  	assert(_objectCount <= 85); -	for (uint32 i = 0; i != _objectCount; ++i) { +	for (int i = 0; i < _objectCount; ++i) {  		s->read(_objects[i]._name, 20);  		float x0, y0, z0, x1, y1, z1; @@ -89,7 +90,7 @@ bool Set::open(const Common::String &name) {  	_walkboxCount = s->readUint32LE();  	assert(_walkboxCount <= 95); -	for (uint32 i = 0; i != _walkboxCount; ++i) { +	for (int i = 0; i < _walkboxCount; ++i) {  		float x, y, z;  		s->read(_walkboxes[i]._name, 20); @@ -98,7 +99,7 @@ bool Set::open(const Common::String &name) {  		assert(_walkboxes[i]._vertexCount <= 8); -		for (uint32 j = 0; j != _walkboxes[i]._vertexCount; ++j) { +		for (int j = 0; j < _walkboxes[i]._vertexCount; ++j) {  			x = s->readFloatLE();  			z = s->readFloatLE(); @@ -115,13 +116,18 @@ bool Set::open(const Common::String &name) {  	_effects->read(s.get(), framesCount);  	_vm->_sliceRenderer->setSetEffects(_effects); +	// _vm->_sliceRenderer->set_setColors(&this->colors); +	_loaded = true; + +	for (int i = 0; i < _walkboxCount; ++i) { +		this->setWalkboxStepSound(i, 0); +	} +  	return true;  } -void Set::addObjectsToScene(SceneObjects* sceneObjects) -{ -	uint32 i; -	for (i = 0; i < _objectCount; i++) { +void Set::addObjectsToScene(SceneObjects *sceneObjects) { +	for (int i = 0; i < _objectCount; i++) {  		sceneObjects->addObject(i + SCENE_OBJECTS_OBJECTS_OFFSET, &_objects[i]._bbox, _objects[i]._isClickable, _objects[i]._isObstacle, _objects[i]._unknown1, _objects[i]._isTarget);  	}  } @@ -146,14 +152,12 @@ bool pointInWalkbox(float x, float z, const Walkbox &w)  }  */ -static -bool isXZInWalkbox(float x, float z, const Walkbox &walkbox) { +static bool isXZInWalkbox(float x, float z, const Walkbox &walkbox) {  	int found = 0; -	int i;  	float lastX = walkbox._vertices[walkbox._vertexCount - 1].x;  	float lastZ = walkbox._vertices[walkbox._vertexCount - 1].z; -	for (i = 0; i < (int)walkbox._vertexCount; i++) { +	for (int i = 0; i < walkbox._vertexCount; i++) {  		float currentX = walkbox._vertices[i].x;  		float currentZ = walkbox._vertices[i].z; @@ -171,7 +175,7 @@ float Set::getAltitudeAtXZ(float x, float z, bool *inWalkbox) {  	float altitude = _walkboxes[0]._altitude;  	*inWalkbox = false; -	for (uint32 i = 0; i != _walkboxCount; ++i) { +	for (int i = 0; i < _walkboxCount; ++i) {  		const Walkbox &w = _walkboxes[i];  		if (isXZInWalkbox(x, z, w)) { @@ -188,7 +192,7 @@ float Set::getAltitudeAtXZ(float x, float z, bool *inWalkbox) {  int Set::findWalkbox(float x, float z) {  	int result = -1; -	for (uint32 i = 0; i != _walkboxCount; ++i) { +	for (int i = 0; i < _walkboxCount; ++i) {  		const Walkbox &w = _walkboxes[i];  		if (isXZInWalkbox(x, z, w)) { @@ -215,7 +219,7 @@ int Set::findObject(const char *objectName) {  }  bool Set::objectSetHotMouse(int objectId) { -	if(!_objects || objectId < 0 || objectId >= (int)_objectCount) { +	if (!_objects || objectId < 0 || objectId >= (int)_objectCount) {  		return false;  	} @@ -254,4 +258,71 @@ const char *Set::objectGetName(int objectId) {  	return _objects[objectId]._name;  } +void Set::setWalkboxStepSound(int walkboxId, int stepSound) { +	this->_walkboxStepSound[walkboxId] = stepSound; +} + +void Set::setFoodstepSoundOverride(int soundId) { +	_footstepSoundOverride = soundId; +} + +void Set::resetFoodstepSoundOverride() { +	_footstepSoundOverride = -1; +} + +int Set::getWalkboxSoundWalkLeft(int walkboxId) { +	int soundId; +	if (this->_footstepSoundOverride >= 0) { +		soundId = this->_footstepSoundOverride; +	} else { +		soundId = this->_walkboxStepSound[walkboxId]; +	} + +	if (soundId == 0) { //stone floor +		return _vm->_rnd.getRandomNumberRng(160, 164); +	} +	if (soundId == 1) { //gravel floor +		return _vm->_rnd.getRandomNumberRng(164, 170); +	} +	if (soundId == 2) { //wooden floor +		return _vm->_rnd.getRandomNumberRng(476, 480); +	} +	if (soundId == 3) { //metal floor +		return _vm->_rnd.getRandomNumberRng(466, 470); +	} + +	return -1; +} + +int Set::getWalkboxSoundWalkRight(int walkboxId) { +	int soundId; +	if (this->_footstepSoundOverride >= 0) { +		soundId = this->_footstepSoundOverride; +	} else { +		soundId = this->_walkboxStepSound[walkboxId]; +	} + +	if (soundId == 0) { //stone floor +		return _vm->_rnd.getRandomNumberRng(165, 169); +	} +	if (soundId == 1) { //gravel floor +		return _vm->_rnd.getRandomNumberRng(169, 175); +	} +	if (soundId == 2) { //wooden floor +		return _vm->_rnd.getRandomNumberRng(481, 485); +	} +	if (soundId == 3) { //metal floor +		return _vm->_rnd.getRandomNumberRng(471, 475); +	} + +	return -1; +} + +int Set::getWalkboxSoundRunLeft(int walkboxId) { +	return getWalkboxSoundWalkLeft(walkboxId); +} + +int Set::getWalkboxSoundRunRight(int walkboxId) { +	return getWalkboxSoundWalkRight(walkboxId); +}  } // End of namespace BladeRunner diff --git a/engines/bladerunner/set.h b/engines/bladerunner/set.h index 18fde76ee3..8d9c97b232 100644 --- a/engines/bladerunner/set.h +++ b/engines/bladerunner/set.h @@ -49,15 +49,20 @@ struct Object {  struct Walkbox {  	char    _name[20];  	float   _altitude; -	uint32  _vertexCount; +	int     _vertexCount;  	Vector3 _vertices[8];  };  class Set { +#if _DEBUG +	friend class BladeRunnerEngine; +#endif +  	BladeRunnerEngine *_vm; -	uint32      _objectCount; -	uint32      _walkboxCount; +	bool        _loaded; +	int         _objectCount; +	int         _walkboxCount;  	Object     *_objects;  	Walkbox    *_walkboxes;  	int         _walkboxStepSound[85]; @@ -86,6 +91,15 @@ public:  	void objectSetIsObstacle(int objectId, bool isObstacle);  	void objectSetIsTarget(int objectId, bool isTarget);  	const char *objectGetName(int objectId); + +	void setWalkboxStepSound(int walkboxId, int soundId); +	void setFoodstepSoundOverride(int soundId); +	void resetFoodstepSoundOverride(); +	int getWalkboxSoundWalkLeft(int walkboxId); +	int getWalkboxSoundWalkRight(int walkboxId); +	int getWalkboxSoundRunLeft(int walkboxId); +	int getWalkboxSoundRunRight(int walkboxId); +	  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/view.cpp b/engines/bladerunner/view.cpp index b3b6ad8ad2..f8acb91400 100644 --- a/engines/bladerunner/view.cpp +++ b/engines/bladerunner/view.cpp @@ -49,7 +49,7 @@ bool View::read(Common::ReadStream *stream) {  void View::setFovX(float fovX) {  	_fovX = fovX; -	_viewportHalfWidth  = 320.0f; +	_viewportHalfWidth = 320.0f;  	_viewportHalfHeight = 240.0f;  	_viewportDistance = 320.0f / tanf(_fovX / 2.0f); @@ -60,17 +60,16 @@ void View::calculateSliceViewMatrix() {  	m = m * rotationMatrixX(float(M_PI) / 2.0f); -	Matrix4x3 a( -1.0f,  0.0f,  0.0f,  0.0f, -	              0.0f, -1.0f,  0.0f,  0.0f, -	              0.0f,  0.0f,  1.0f,  0.0f); +	Matrix4x3 a(-1.0f, 0.0f, 0.0f, 0.0f, +	            0.0f, -1.0f, 0.0f, 0.0f, +	            0.0f, 0.0f, 1.0f, 0.0f);  	m = a * m;  	_sliceViewMatrix = m;  } -void View::calculateCameraPosition() -{ +void View::calculateCameraPosition() {  	Matrix4x3 invertedMatrix = invertMatrix(_sliceViewMatrix);  	_cameraPosition.x = invertedMatrix(0, 3); @@ -78,5 +77,12 @@ void View::calculateCameraPosition()  	_cameraPosition.z = invertedMatrix(2, 3);  } +Vector2 View::calculateScreenPosition(Vector3 worldPosition) { +	Vector3 viewPosition = _frameViewMatrix * worldPosition; +	return Vector2( +		this->_viewportHalfWidth - viewPosition.x / viewPosition.z * _viewportDistance, +		this->_viewportHalfHeight - viewPosition.y / viewPosition.z * _viewportDistance +	); +}  } // End of namespace BladeRunner diff --git a/engines/bladerunner/view.h b/engines/bladerunner/view.h index 511ea66d1b..2ffb4a9648 100644 --- a/engines/bladerunner/view.h +++ b/engines/bladerunner/view.h @@ -45,6 +45,7 @@ public:  	float     _viewportDistance;  	bool read(Common::ReadStream *stream); +	Vector2 calculateScreenPosition(Vector3 worldPosition);  private:  	void setFovX(float fovX);  | 
