diff options
24 files changed, 1701 insertions, 519 deletions
diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp index 4e4c5d04bf..39fbc77d4e 100644 --- a/engines/bladerunner/actor_clues.cpp +++ b/engines/bladerunner/actor_clues.cpp @@ -80,7 +80,11 @@ bool ActorClues::isAcquired(int clueId) const {  	if (clueIndex == -1) {  		return false;  	} +#if BLADERUNNER_DEBUG_GAME +	return true; +#else  	return _clues[clueIndex].flags & 0x01; +#endif  }  int ActorClues::getFromActorId(int clueId) const { diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp index db2d3e8057..27b770463b 100644 --- a/engines/bladerunner/bladerunner.cpp +++ b/engines/bladerunner/bladerunner.cpp @@ -143,7 +143,11 @@ Common::Error BladeRunnerEngine::run() {  		return Common::Error(Common::kUnknownError, "Failed to initialize resources");  	} +#if BLADERUNNER_DEBUG_GAME +	{ +#else  	if (warnUserAboutUnsupportedGame()) { +#endif  		init2();  		/* TODO: Check for save games and enter KIA */ diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h index 01636e8949..06d5f7b194 100644 --- a/engines/bladerunner/bladerunner.h +++ b/engines/bladerunner/bladerunner.h @@ -33,8 +33,10 @@  #include "graphics/surface.h" +// remove these when game is playable  #define BLADERUNNER_DEBUG_RENDERING 0  #define BLADERUNNER_DEBUG_CONSOLE 0 +#define BLADERUNNER_DEBUG_GAME 0  namespace Common {  struct Event; diff --git a/engines/bladerunner/font.cpp b/engines/bladerunner/font.cpp index 3af8fc2f7f..5ae1c8eedc 100644 --- a/engines/bladerunner/font.cpp +++ b/engines/bladerunner/font.cpp @@ -104,7 +104,7 @@ void Font::draw(const Common::String &text, Graphics::Surface &surface, int x, i  	x = CLIP(x, 0, _screenWidth - getTextWidth(text) + 1);  	y = CLIP(y, 0, _screenHeight - _maxHeight); -	const char *character = text.c_str(); +	const uint8 *character = (const uint8 *)text.c_str();  	while (*character != 0) {  		drawCharacter(*character, surface, x, y);  		x += _spacing1 + _characters[*character + 1].width; @@ -121,7 +121,7 @@ void Font::drawColor(const Common::String &text, Graphics::Surface &surface, int  }  int Font::getTextWidth(const Common::String &text) const { -	const char *character = text.c_str(); +	const uint8 *character = (const uint8 *)text.c_str();  	if (!_data) {  		return 0; @@ -168,8 +168,8 @@ void Font::replaceColor(uint16 oldColor, uint16 newColor) {  	}  } -void Font::drawCharacter(const char character, Graphics::Surface &surface, int x, int y) const { -	uint8 characterIndex = (uint8)character + 1; +void Font::drawCharacter(const uint8 character, Graphics::Surface &surface, int x, int y) const { +	uint8 characterIndex = character + 1;  	if (x < 0 || x >= _screenWidth || y < 0 || y >= _screenHeight || !_data || characterIndex >= _characterCount) {  		return;  	} diff --git a/engines/bladerunner/font.h b/engines/bladerunner/font.h index e51a3deb2d..9302520153 100644 --- a/engines/bladerunner/font.h +++ b/engines/bladerunner/font.h @@ -77,7 +77,7 @@ private:  	void reset();  	void replaceColor(uint16 oldColor, uint16 newColor); -	void drawCharacter(const char character, Graphics::Surface &surface, int x, int y) const; +	void drawCharacter(const uint8 character, Graphics::Surface &surface, int x, int y) const;  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/game_constants.h b/engines/bladerunner/game_constants.h index 043a07ff91..9915bc9e1d 100644 --- a/engines/bladerunner/game_constants.h +++ b/engines/bladerunner/game_constants.h @@ -394,12 +394,25 @@ enum Clues {  };  enum ClueTypes { -	kClueTypePhotograph  = 0, +	kClueTypeIntangible = -1, +	kClueTypePhotograph = 0,  	kClueTypeVideoClip = 1,  	kClueTypeAudioRecording = 2,  	kClueTypeObject = 3  }; +enum Suspects { +	kSuspectSadik = 0, +	kSuspectClovis = 1, +	kSuspectZuben = 2, +	kSuspectLucy = 3, +	kSuspectDekora = 4, +	kSuspectGordo = 5, +	kSuspectIzo = 6, +	kSuspectMcCoy = 7, +	kSuspectGuzza = 8 +}; +  enum Crimes {  	kCrimeAnimalMurder = 0,  	kCrimeEisendullerMurder = 1, diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk index 6aadb972db..e74c836108 100644 --- a/engines/bladerunner/module.mk +++ b/engines/bladerunner/module.mk @@ -183,6 +183,7 @@ MODULE_OBJS = \  	ui/kia_section_crimes.o \  	ui/kia_section_help.o \  	ui/kia_section_settings.o \ +	ui/kia_section_suspects.o \  	ui/kia_shapes.o \  	ui/spinner.o \  	ui/ui_check_box.o \ diff --git a/engines/bladerunner/script/init.cpp b/engines/bladerunner/script/init.cpp index ed1140582d..76ade879ad 100644 --- a/engines/bladerunner/script/init.cpp +++ b/engines/bladerunner/script/init.cpp @@ -72,8 +72,9 @@ void ScriptInit::Init_Globals() {  }  void ScriptInit::Init_Game_Flags() { -	for (int i = 0; i != 730; ++i) +	for (int i = 0; i != 730; ++i) {  		Game_Flag_Reset(i); +	}  	if (Random_Query(1, 2) == 1) {  		Game_Flag_Set(44); @@ -2186,176 +2187,184 @@ void ScriptInit::Init_World_Waypoints() {  }  void ScriptInit::Init_SDB() { -	SDB_Set_Actor(0, kActorSadik); -	SDB_Set_Sex(0, 1); -	SDB_Add_MO_Clue(0, kClueCrystalsCase); -	SDB_Add_MO_Clue(0, kClueDetonatorWire); -	SDB_Add_MO_Clue(0, kClueSadiksGun); -	SDB_Add_MO_Clue(0, kCluePlasticExplosive); -	SDB_Add_Whereabouts_Clue(0, kClueTyrellSecurity); -	SDB_Add_Whereabouts_Clue(0, kClueKingstonKitchenBox1); -	SDB_Add_Whereabouts_Clue(0, kClueDragonflyEarring); -	SDB_Add_Whereabouts_Clue(0, kClueChewInterview); -	SDB_Add_Whereabouts_Clue(0, kClueHomelessManInterview1); -	SDB_Add_Replicant_Clue(0, kClueDetonatorWire); -	SDB_Add_Replicant_Clue(0, kClueCrystalsCase); -	SDB_Add_Replicant_Clue(0, kClueMorajiInterview); -	SDB_Add_Replicant_Clue(0, kClueAttemptedFileAccess); -	SDB_Add_Replicant_Clue(0, kClueExpertBomber); -	SDB_Add_Replicant_Clue(0, kClueRachaelInterview); -	SDB_Add_Replicant_Clue(0, kClueCrystalsCase); -	SDB_Add_Non_Replicant_Clue(0, kClueStaggeredbyPunches); -	SDB_Add_Non_Replicant_Clue(0, kClueIzosWarning); -	SDB_Add_Non_Replicant_Clue(0, kClueAmateurBomber); -	SDB_Add_Other_Clue(0, kClueGrigorianInterviewB1); -	SDB_Add_Other_Clue(0, kClueGrigorianInterviewB2); -	SDB_Add_Other_Clue(0, kClueAct2Ended); -	SDB_Add_Other_Clue(0, kClueBombingSuspect); -	SDB_Add_Other_Clue(0, kClueSadikAtMoonbus); -	SDB_Add_Identity_Clue(0, kClueAct2Ended); -	SDB_Add_Photo_Clue(0, kClueBombingSuspect, 31); -	SDB_Add_Photo_Clue(0, kClueSadikAtMoonbus, 38); -	SDB_Set_Actor(1, kActorClovis); -	SDB_Set_Sex(1, 1); -	SDB_Add_MO_Clue(1, kClueShellCasings); -	SDB_Add_MO_Clue(1, kClueLabShellCasings); -	SDB_Add_Whereabouts_Clue(1, kClueDispatchHitAndRun); -	SDB_Add_Whereabouts_Clue(1, kClueRuncitersViewB); -	SDB_Add_Whereabouts_Clue(1, kClueChewInterview); -	SDB_Add_Replicant_Clue(1, kClueOfficersStatement); -	SDB_Add_Replicant_Clue(1, kClueDoorForced2); -	SDB_Add_Replicant_Clue(1, kClueMorajiInterview); -	SDB_Add_Replicant_Clue(1, kClueZubenTalksAboutLucy1); -	SDB_Add_Replicant_Clue(1, kClueZubenTalksAboutLucy2); -	SDB_Add_Replicant_Clue(1, kClueDektoraInterview4); -	SDB_Add_Other_Clue(1, kClueAnimalMurderSuspect); -	SDB_Add_Other_Clue(1, kClueGracefulFootprints); -	SDB_Add_Other_Clue(1, kClueIzosWarning); -	SDB_Add_Other_Clue(1, kClueAct2Ended); -	SDB_Add_Other_Clue(1, kClueClovisAtMoonbus); -	SDB_Add_Other_Clue(1, kClueAnimalMurderSuspect); -	SDB_Add_Other_Clue(1, kClueIzosFriend); -	SDB_Add_Other_Clue(1, kClueMilitaryBoots); -	SDB_Add_Identity_Clue(1, kClueIzosWarning); -	SDB_Add_Identity_Clue(1, kClueAct2Ended); -	SDB_Add_Identity_Clue(1, kClueDektoraInterview4); -	SDB_Add_Photo_Clue(1, kClueClovisAtMoonbus, 37); -	SDB_Add_Photo_Clue(1, kClueAnimalMurderSuspect, 7); -	SDB_Add_Photo_Clue(1, kClueIzosFriend, 25); -	SDB_Add_Photo_Clue(1, kClueMilitaryBoots, 8); -	SDB_Set_Actor(2, kActorZuben); -	SDB_Set_Sex(2, 1); -	SDB_Add_MO_Clue(2, kClueOfficersStatement); -	SDB_Add_MO_Clue(2, kClueLabCorpses); -	SDB_Add_Whereabouts_Clue(2, kClueDispatchHitAndRun); -	SDB_Add_Whereabouts_Clue(2, kClueRuncitersViewB); -	SDB_Add_Replicant_Clue(2, kClueOfficersStatement); -	SDB_Add_Replicant_Clue(2, kClueDoorForced2); -	SDB_Add_Replicant_Clue(2, kClueHowieLeeInterview); -	SDB_Add_Replicant_Clue(2, kClueZubenRunsAway); -	SDB_Add_Replicant_Clue(2, kClueZuben); -	SDB_Add_Replicant_Clue(2, kClueZubenTalksAboutLucy1); -	SDB_Add_Replicant_Clue(2, kClueZubenTalksAboutLucy2); -	SDB_Add_Non_Replicant_Clue(2, kClueLimpingFootprints); -	SDB_Add_Non_Replicant_Clue(2, kClueBigManLimping); -	SDB_Add_Non_Replicant_Clue(2, kClueZubensMotive); -	SDB_Add_Other_Clue(2, kClueCrowdInterviewA); -	SDB_Add_Other_Clue(2, kClueZubenInterview); -	SDB_Add_Other_Clue(2, kClueLucyInterview); -	SDB_Add_Identity_Clue(2, kClueHowieLeeInterview); -	SDB_Add_Identity_Clue(2, kClueZubenRunsAway); -	SDB_Add_Identity_Clue(2, kClueZubenInterview); -	SDB_Add_Identity_Clue(2, kClueLucyInterview); -	SDB_Add_Photo_Clue(2, kClueZuben, 33); -	SDB_Set_Actor(3, kActorLucy); -	SDB_Set_Sex(3, 0); -	SDB_Add_Whereabouts_Clue(3, kClueChopstickWrapper); -	SDB_Add_Whereabouts_Clue(3, kClueSushiMenu); -	SDB_Add_Whereabouts_Clue(3, kClueReferenceLetter); -	SDB_Add_Whereabouts_Clue(3, kClueRuncitersViewA); -	SDB_Add_Whereabouts_Clue(3, kClueHysteriaToken); -	SDB_Add_Whereabouts_Clue(3, kClueZubenInterview); -	SDB_Add_Replicant_Clue(3, kClueRunciterInterviewA); -	SDB_Add_Replicant_Clue(3, kClueRunciterInterviewB1); -	SDB_Add_Replicant_Clue(3, kClueVKLucyReplicant); -	SDB_Add_Replicant_Clue(3, kClueZubenTalksAboutLucy1); -	SDB_Add_Replicant_Clue(3, kClueDektoraInterview4); -	SDB_Add_Replicant_Clue(3, kClueRuncitersConfession1); -	SDB_Add_Non_Replicant_Clue(3, kClueToyDog); -	SDB_Add_Non_Replicant_Clue(3, kClueRagDoll); -	SDB_Add_Non_Replicant_Clue(3, kClueCandy); -	SDB_Add_Non_Replicant_Clue(3, kClueVKLucyHuman); -	SDB_Add_Non_Replicant_Clue(3, kClueZubenTalksAboutLucy2); -	SDB_Add_Other_Clue(3, kClueLucy); -	SDB_Add_Other_Clue(3, kClueCrowdInterviewA); -	SDB_Add_Identity_Clue(3, kClueRunciterInterviewA); -	SDB_Add_Identity_Clue(3, kClueDektoraInterview4); -	SDB_Add_Photo_Clue(3, kClueLucy, 5); -	SDB_Set_Actor(4, kActorDektora); -	SDB_Add_MO_Clue(4, kClueScorpions); -	SDB_Add_Replicant_Clue(4, kClueVKDektoraReplicant); -	SDB_Add_Replicant_Clue(4, kClueEarlyQInterview); -	SDB_Add_Replicant_Clue(4, kClueDragonflyBelt); -	SDB_Add_Replicant_Clue(4, kClueDektoraInterview4); -	SDB_Add_Non_Replicant_Clue(4, kClueVKDektoraHuman); -	SDB_Add_Non_Replicant_Clue(4, kClueDektoraInterview2); -	SDB_Add_Non_Replicant_Clue(4, kClueDektoraInterview3); -	SDB_Add_Non_Replicant_Clue(4, kClueDektorasCard); -	SDB_Add_Non_Replicant_Clue(4, kClueDektoraInterview1); -	SDB_Add_Other_Clue(4, kClueDragonflyBelt); -	SDB_Add_Other_Clue(4, kClueWomanInAnimoidRow); -	SDB_Add_Other_Clue(4, kClueChinaBar); -	SDB_Add_Other_Clue(4, kClueCarRegistration1); -	SDB_Add_Identity_Clue(4, kClueDektoraInterview2); -	SDB_Add_Identity_Clue(4, kClueDektoraInterview3); -	SDB_Add_Identity_Clue(4, kClueEarlyQInterview); -	SDB_Add_Photo_Clue(4, kClueWomanInAnimoidRow, 21); -	SDB_Add_Photo_Clue(4, kClueChinaBar, 19); -	SDB_Set_Actor(5, kActorGordo); -	SDB_Set_Sex(5, 1); -	SDB_Add_Whereabouts_Clue(5, kClueStolenCheese); -	SDB_Add_Identity_Clue(5, kClueGordoInterview1); -	SDB_Add_Identity_Clue(5, kClueGordoInterview2); -	SDB_Set_Actor(6, kActorIzo); -	SDB_Set_Sex(6, 1); -	SDB_Add_Whereabouts_Clue(6, kClueBobInterview1); -	SDB_Add_Whereabouts_Clue(6, kClueBobInterview2); -	SDB_Add_Whereabouts_Clue(6, kClueGrigorianInterviewB2); -	SDB_Add_Whereabouts_Clue(6, kClueHomelessManInterview1); -	SDB_Add_Replicant_Clue(6, kClueGogglesReplicantIssue); -	SDB_Add_Other_Clue(6, kClueGrigorianInterviewB1); -	SDB_Add_Other_Clue(6, kClueWeaponsCache); -	SDB_Add_Other_Clue(6, kClueFolder); -	SDB_Add_Other_Clue(6, kClueIzosStashRaided); -	SDB_Add_Other_Clue(6, kClueIzo); -	SDB_Add_Other_Clue(6, kCluePhotoOfMcCoy1); -	SDB_Add_Other_Clue(6, kCluePhotoOfMcCoy2); -	SDB_Add_Other_Clue(6, kClueRadiationGoggles); -	SDB_Add_Other_Clue(6, kClueIzoInterview); -	SDB_Add_Identity_Clue(6, kClueGrigorianInterviewB2); -	SDB_Add_Identity_Clue(6, kClueBobInterview1); -	SDB_Add_Identity_Clue(6, kClueBobInterview2); -	SDB_Add_Identity_Clue(6, kCluePhotoOfMcCoy1); -	SDB_Add_Identity_Clue(6, kCluePhotoOfMcCoy2); -	SDB_Add_Identity_Clue(6, kClueRadiationGoggles); -	SDB_Add_Identity_Clue(6, kClueIzoInterview); -	SDB_Add_Photo_Clue(6, kClueIzo, 26); -	SDB_Set_Actor(7, kActorMcCoy); -	SDB_Add_Replicant_Clue(7, kClueMcCoyAtMoonbus); -	SDB_Add_Other_Clue(7, kCluePhotoOfMcCoy1); -	SDB_Add_Other_Clue(7, kCluePhotoOfMcCoy2); -	SDB_Add_Identity_Clue(7, kClueMcCoyAtMoonbus); -	SDB_Add_Photo_Clue(7, kClueMcCoyAtMoonbus, 36); -	SDB_Add_Photo_Clue(7, kCluePhotoOfMcCoy1, 17); -	SDB_Add_Photo_Clue(7, kCluePhotoOfMcCoy2, 18); -	SDB_Set_Actor(8, kActorGuzza); -	SDB_Add_Other_Clue(8, kClueGuzza); -	SDB_Add_Other_Clue(8, kClueFolder); -	SDB_Add_Other_Clue(8, kClueGuzzaFramedMcCoy); -	SDB_Add_Identity_Clue(8, kClueGuzza); -	SDB_Add_Identity_Clue(8, kClueGuzzaFramedMcCoy); -	SDB_Add_Identity_Clue(8, kClueFolder); -	SDB_Add_Photo_Clue(8, kClueGuzza, 27); +	SDB_Set_Actor(kSuspectSadik, kActorSadik); +	SDB_Set_Sex(kSuspectSadik, 1); +	SDB_Add_MO_Clue(kSuspectSadik, kClueCrystalsCase); +	SDB_Add_MO_Clue(kSuspectSadik, kClueDetonatorWire); +	SDB_Add_MO_Clue(kSuspectSadik, kClueSadiksGun); +	SDB_Add_MO_Clue(kSuspectSadik, kCluePlasticExplosive); +	SDB_Add_Whereabouts_Clue(kSuspectSadik, kClueTyrellSecurity); +	SDB_Add_Whereabouts_Clue(kSuspectSadik, kClueKingstonKitchenBox1); +	SDB_Add_Whereabouts_Clue(kSuspectSadik, kClueDragonflyEarring); +	SDB_Add_Whereabouts_Clue(kSuspectSadik, kClueChewInterview); +	SDB_Add_Whereabouts_Clue(kSuspectSadik, kClueHomelessManInterview1); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueDetonatorWire); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueCrystalsCase); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueMorajiInterview); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueAttemptedFileAccess); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueExpertBomber); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueRachaelInterview); +	SDB_Add_Replicant_Clue(kSuspectSadik, kClueCrystalsCase); +	SDB_Add_Non_Replicant_Clue(kSuspectSadik, kClueStaggeredbyPunches); +	SDB_Add_Non_Replicant_Clue(kSuspectSadik, kClueIzosWarning); +	SDB_Add_Non_Replicant_Clue(kSuspectSadik, kClueAmateurBomber); +	SDB_Add_Other_Clue(kSuspectSadik, kClueGrigorianInterviewB1); +	SDB_Add_Other_Clue(kSuspectSadik, kClueGrigorianInterviewB2); +	SDB_Add_Other_Clue(kSuspectSadik, kClueAct2Ended); +	SDB_Add_Other_Clue(kSuspectSadik, kClueBombingSuspect); +	SDB_Add_Other_Clue(kSuspectSadik, kClueSadikAtMoonbus); +	SDB_Add_Identity_Clue(kSuspectSadik, kClueAct2Ended); +	SDB_Add_Photo_Clue(kSuspectSadik, kClueBombingSuspect, 31); +	SDB_Add_Photo_Clue(kSuspectSadik, kClueSadikAtMoonbus, 38); + +	SDB_Set_Actor(kSuspectClovis, kActorClovis); +	SDB_Set_Sex(kSuspectClovis, 1); +	SDB_Add_MO_Clue(kSuspectClovis, kClueShellCasings); +	SDB_Add_MO_Clue(kSuspectClovis, kClueLabShellCasings); +	SDB_Add_Whereabouts_Clue(kSuspectClovis, kClueDispatchHitAndRun); +	SDB_Add_Whereabouts_Clue(kSuspectClovis, kClueRuncitersViewB); +	SDB_Add_Whereabouts_Clue(kSuspectClovis, kClueChewInterview); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueOfficersStatement); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueDoorForced2); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueMorajiInterview); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueZubenTalksAboutLucy1); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueZubenTalksAboutLucy2); +	SDB_Add_Replicant_Clue(kSuspectClovis, kClueDektoraInterview4); +	SDB_Add_Other_Clue(kSuspectClovis, kClueAnimalMurderSuspect); +	SDB_Add_Other_Clue(kSuspectClovis, kClueGracefulFootprints); +	SDB_Add_Other_Clue(kSuspectClovis, kClueIzosWarning); +	SDB_Add_Other_Clue(kSuspectClovis, kClueAct2Ended); +	SDB_Add_Other_Clue(kSuspectClovis, kClueClovisAtMoonbus); +	SDB_Add_Other_Clue(kSuspectClovis, kClueAnimalMurderSuspect); +	SDB_Add_Other_Clue(kSuspectClovis, kClueIzosFriend); +	SDB_Add_Other_Clue(kSuspectClovis, kClueMilitaryBoots); +	SDB_Add_Identity_Clue(kSuspectClovis, kClueIzosWarning); +	SDB_Add_Identity_Clue(kSuspectClovis, kClueAct2Ended); +	SDB_Add_Identity_Clue(kSuspectClovis, kClueDektoraInterview4); +	SDB_Add_Photo_Clue(kSuspectClovis, kClueClovisAtMoonbus, 37); +	SDB_Add_Photo_Clue(kSuspectClovis, kClueAnimalMurderSuspect, 7); +	SDB_Add_Photo_Clue(kSuspectClovis, kClueIzosFriend, 25); +	SDB_Add_Photo_Clue(kSuspectClovis, kClueMilitaryBoots, 8); + +	SDB_Set_Actor(kSuspectZuben, kActorZuben); +	SDB_Set_Sex(kSuspectZuben, 1); +	SDB_Add_MO_Clue(kSuspectZuben, kClueOfficersStatement); +	SDB_Add_MO_Clue(kSuspectZuben, kClueLabCorpses); +	SDB_Add_Whereabouts_Clue(kSuspectZuben, kClueDispatchHitAndRun); +	SDB_Add_Whereabouts_Clue(kSuspectZuben, kClueRuncitersViewB); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueOfficersStatement); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueDoorForced2); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueHowieLeeInterview); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueZubenRunsAway); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueZuben); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueZubenTalksAboutLucy1); +	SDB_Add_Replicant_Clue(kSuspectZuben, kClueZubenTalksAboutLucy2); +	SDB_Add_Non_Replicant_Clue(kSuspectZuben, kClueLimpingFootprints); +	SDB_Add_Non_Replicant_Clue(kSuspectZuben, kClueBigManLimping); +	SDB_Add_Non_Replicant_Clue(kSuspectZuben, kClueZubensMotive); +	SDB_Add_Other_Clue(kSuspectZuben, kClueCrowdInterviewA); +	SDB_Add_Other_Clue(kSuspectZuben, kClueZubenInterview); +	SDB_Add_Other_Clue(kSuspectZuben, kClueLucyInterview); +	SDB_Add_Identity_Clue(kSuspectZuben, kClueHowieLeeInterview); +	SDB_Add_Identity_Clue(kSuspectZuben, kClueZubenRunsAway); +	SDB_Add_Identity_Clue(kSuspectZuben, kClueZubenInterview); +	SDB_Add_Identity_Clue(kSuspectZuben, kClueLucyInterview); +	SDB_Add_Photo_Clue(kSuspectZuben, kClueZuben, 33); + +	SDB_Set_Actor(kSuspectLucy, kActorLucy); +	SDB_Set_Sex(kSuspectLucy, 0); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueChopstickWrapper); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueSushiMenu); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueReferenceLetter); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueRuncitersViewA); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueHysteriaToken); +	SDB_Add_Whereabouts_Clue(kSuspectLucy, kClueZubenInterview); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueRunciterInterviewA); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueRunciterInterviewB1); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueVKLucyReplicant); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueZubenTalksAboutLucy1); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueDektoraInterview4); +	SDB_Add_Replicant_Clue(kSuspectLucy, kClueRuncitersConfession1); +	SDB_Add_Non_Replicant_Clue(kSuspectLucy, kClueToyDog); +	SDB_Add_Non_Replicant_Clue(kSuspectLucy, kClueRagDoll); +	SDB_Add_Non_Replicant_Clue(kSuspectLucy, kClueCandy); +	SDB_Add_Non_Replicant_Clue(kSuspectLucy, kClueVKLucyHuman); +	SDB_Add_Non_Replicant_Clue(kSuspectLucy, kClueZubenTalksAboutLucy2); +	SDB_Add_Other_Clue(kSuspectLucy, kClueLucy); +	SDB_Add_Other_Clue(kSuspectLucy, kClueCrowdInterviewA); +	SDB_Add_Identity_Clue(kSuspectLucy, kClueRunciterInterviewA); +	SDB_Add_Identity_Clue(kSuspectLucy, kClueDektoraInterview4); +	SDB_Add_Photo_Clue(kSuspectLucy, kClueLucy, 5); + +	SDB_Set_Actor(kSuspectDekora, kActorDektora); +	SDB_Add_MO_Clue(kSuspectDekora, kClueScorpions); +	SDB_Add_Replicant_Clue(kSuspectDekora, kClueVKDektoraReplicant); +	SDB_Add_Replicant_Clue(kSuspectDekora, kClueEarlyQInterview); +	SDB_Add_Replicant_Clue(kSuspectDekora, kClueDragonflyBelt); +	SDB_Add_Replicant_Clue(kSuspectDekora, kClueDektoraInterview4); +	SDB_Add_Non_Replicant_Clue(kSuspectDekora, kClueVKDektoraHuman); +	SDB_Add_Non_Replicant_Clue(kSuspectDekora, kClueDektoraInterview2); +	SDB_Add_Non_Replicant_Clue(kSuspectDekora, kClueDektoraInterview3); +	SDB_Add_Non_Replicant_Clue(kSuspectDekora, kClueDektorasCard); +	SDB_Add_Non_Replicant_Clue(kSuspectDekora, kClueDektoraInterview1); +	SDB_Add_Other_Clue(kSuspectDekora, kClueDragonflyBelt); +	SDB_Add_Other_Clue(kSuspectDekora, kClueWomanInAnimoidRow); +	SDB_Add_Other_Clue(kSuspectDekora, kClueChinaBar); +	SDB_Add_Other_Clue(kSuspectDekora, kClueCarRegistration1); +	SDB_Add_Identity_Clue(kSuspectDekora, kClueDektoraInterview2); +	SDB_Add_Identity_Clue(kSuspectDekora, kClueDektoraInterview3); +	SDB_Add_Identity_Clue(kSuspectDekora, kClueEarlyQInterview); +	SDB_Add_Photo_Clue(kSuspectDekora, kClueWomanInAnimoidRow, 21); +	SDB_Add_Photo_Clue(kSuspectDekora, kClueChinaBar, 19); + +	SDB_Set_Actor(kSuspectGordo, kActorGordo); +	SDB_Set_Sex(kSuspectGordo, 1); +	SDB_Add_Whereabouts_Clue(kSuspectGordo, kClueStolenCheese); +	SDB_Add_Identity_Clue(kSuspectGordo, kClueGordoInterview1); +	SDB_Add_Identity_Clue(kSuspectGordo, kClueGordoInterview2); + +	SDB_Set_Actor(kSuspectIzo, kActorIzo); +	SDB_Set_Sex(kSuspectIzo, 1); +	SDB_Add_Whereabouts_Clue(kSuspectIzo, kClueBobInterview1); +	SDB_Add_Whereabouts_Clue(kSuspectIzo, kClueBobInterview2); +	SDB_Add_Whereabouts_Clue(kSuspectIzo, kClueGrigorianInterviewB2); +	SDB_Add_Whereabouts_Clue(kSuspectIzo, kClueHomelessManInterview1); +	SDB_Add_Replicant_Clue(kSuspectIzo, kClueGogglesReplicantIssue); +	SDB_Add_Other_Clue(kSuspectIzo, kClueGrigorianInterviewB1); +	SDB_Add_Other_Clue(kSuspectIzo, kClueWeaponsCache); +	SDB_Add_Other_Clue(kSuspectIzo, kClueFolder); +	SDB_Add_Other_Clue(kSuspectIzo, kClueIzosStashRaided); +	SDB_Add_Other_Clue(kSuspectIzo, kClueIzo); +	SDB_Add_Other_Clue(kSuspectIzo, kCluePhotoOfMcCoy1); +	SDB_Add_Other_Clue(kSuspectIzo, kCluePhotoOfMcCoy2); +	SDB_Add_Other_Clue(kSuspectIzo, kClueRadiationGoggles); +	SDB_Add_Other_Clue(kSuspectIzo, kClueIzoInterview); +	SDB_Add_Identity_Clue(kSuspectIzo, kClueGrigorianInterviewB2); +	SDB_Add_Identity_Clue(kSuspectIzo, kClueBobInterview1); +	SDB_Add_Identity_Clue(kSuspectIzo, kClueBobInterview2); +	SDB_Add_Identity_Clue(kSuspectIzo, kCluePhotoOfMcCoy1); +	SDB_Add_Identity_Clue(kSuspectIzo, kCluePhotoOfMcCoy2); +	SDB_Add_Identity_Clue(kSuspectIzo, kClueRadiationGoggles); +	SDB_Add_Identity_Clue(kSuspectIzo, kClueIzoInterview); +	SDB_Add_Photo_Clue(kSuspectIzo, kClueIzo, 26); + +	SDB_Set_Actor(kSuspectMcCoy, kActorMcCoy); +	SDB_Add_Replicant_Clue(kSuspectMcCoy, kClueMcCoyAtMoonbus); +	SDB_Add_Other_Clue(kSuspectMcCoy, kCluePhotoOfMcCoy1); +	SDB_Add_Other_Clue(kSuspectMcCoy, kCluePhotoOfMcCoy2); +	SDB_Add_Identity_Clue(kSuspectMcCoy, kClueMcCoyAtMoonbus); +	SDB_Add_Photo_Clue(kSuspectMcCoy, kClueMcCoyAtMoonbus, 36); +	SDB_Add_Photo_Clue(kSuspectMcCoy, kCluePhotoOfMcCoy1, 17); +	SDB_Add_Photo_Clue(kSuspectMcCoy, kCluePhotoOfMcCoy2, 18); + +	SDB_Set_Actor(kSuspectGuzza, kActorGuzza); +	SDB_Add_Other_Clue(kSuspectGuzza, kClueGuzza); +	SDB_Add_Other_Clue(kSuspectGuzza, kClueFolder); +	SDB_Add_Other_Clue(kSuspectGuzza, kClueGuzzaFramedMcCoy); +	SDB_Add_Identity_Clue(kSuspectGuzza, kClueGuzza); +	SDB_Add_Identity_Clue(kSuspectGuzza, kClueGuzzaFramedMcCoy); +	SDB_Add_Identity_Clue(kSuspectGuzza, kClueFolder); +	SDB_Add_Photo_Clue(kSuspectGuzza, kClueGuzza, 27);  }  void ScriptInit::Init_CDB() { @@ -2396,6 +2405,7 @@ void ScriptInit::Init_CDB() {  	CDB_Set_Crime(kClueLucy, kCrimeAnimalMurder);  	CDB_Set_Crime(kClueDragonflyAnklet, kCrimeAnimalMurder);  	CDB_Set_Crime(kClueZuben, kCrimeAnimalMurder); +  	CDB_Set_Crime(kCluePhoneCallGuzza, kCrimeEisendullerMurder);  	CDB_Set_Crime(kClueDragonflyEarring, kCrimeEisendullerMurder);  	CDB_Set_Crime(kClueTyrellSecurity, kCrimeEisendullerMurder); @@ -2414,6 +2424,7 @@ void ScriptInit::Init_CDB() {  	CDB_Set_Crime(kClueKingstonKitchenBox2, kCrimeEisendullerMurder);  	CDB_Set_Crime(kCluePlasticExplosive, kCrimeEisendullerMurder);  	CDB_Set_Crime(kClueTyrellSecurityPhoto, kCrimeEisendullerMurder); +  	CDB_Set_Crime(kClueGaffsInformation, kCrimeMoonbusHijacking);  	CDB_Set_Crime(kClueMoonbus1, kCrimeMoonbusHijacking);  	CDB_Set_Crime(kClueMcCoyAtMoonbus, kCrimeMoonbusHijacking); @@ -2422,13 +2433,16 @@ void ScriptInit::Init_CDB() {  	CDB_Set_Crime(kClueVKLucyReplicant, kCrimeMoonbusHijacking);  	CDB_Set_Crime(kClueCrystalsCase, kCrimeMoonbusHijacking);  	CDB_Set_Crime(kCluePhoneCallCrystal, kCrimeMoonbusHijacking); +  	CDB_Set_Crime(kClueCrimeSceneNotes, kCrimeFactoryBombing);  	CDB_Set_Crime(kClueGrigorianInterviewA, kCrimeFactoryBombing);  	CDB_Set_Crime(kClueGrigorianInterviewB1, kCrimeFactoryBombing);  	CDB_Set_Crime(kClueGrigorianInterviewB2, kCrimeFactoryBombing); +  	CDB_Set_Crime(kClueMorajiInterview, kCrimeMorajiMurder);  	CDB_Set_Crime(kClueExpertBomber, kCrimeMorajiMurder);  	CDB_Set_Crime(kClueAmateurBomber, kCrimeMorajiMurder); +  	CDB_Set_Crime(kClueWeaponsCache, kCrimeArmsDealing);  	CDB_Set_Crime(kClueFolder, kCrimeArmsDealing);  	CDB_Set_Crime(kClueIzosStashRaided, kCrimeArmsDealing); @@ -2439,206 +2453,208 @@ void ScriptInit::Init_CDB() {  	CDB_Set_Crime(kCluePoliceIssueWeapons, kCrimeArmsDealing);  	CDB_Set_Crime(kClueFolder, kCrimeArmsDealing);  	CDB_Set_Crime(kClueGuzzaFramedMcCoy, kCrimeArmsDealing); +  	CDB_Set_Crime(kClueStaggeredbyPunches, kCrimeBradburyAssault);  	CDB_Set_Crime(kClueAct2Ended, kCrimeBradburyAssault); -	int i = 0; -	do { -		CDB_Set_Clue_Asset_Type(i++, -1); -	} while (i < 288); -	CDB_Set_Clue_Asset_Type(kClueOfficersStatement, 2); -	CDB_Set_Clue_Asset_Type(kClueDoorForced2, 2); -	CDB_Set_Clue_Asset_Type(kClueLimpingFootprints, 2); -	CDB_Set_Clue_Asset_Type(kClueGracefulFootprints, 2); -	CDB_Set_Clue_Asset_Type(kClueShellCasings, 3); -	CDB_Set_Clue_Asset_Type(kClueCandy, 3); -	CDB_Set_Clue_Asset_Type(kClueToyDog, 3); -	CDB_Set_Clue_Asset_Type(kClueChopstickWrapper, 3); -	CDB_Set_Clue_Asset_Type(kClueSushiMenu, 0); -	CDB_Set_Clue_Asset_Type(kClueLabCorpses, 2); -	CDB_Set_Clue_Asset_Type(kClueLabShellCasings, 2); -	CDB_Set_Clue_Asset_Type(kClueRuncitersVideo, 1); -	CDB_Set_Clue_Asset_Type(kClueLucy, 0); -	CDB_Set_Clue_Asset_Type(kClueDragonflyAnklet, 0); -	CDB_Set_Clue_Asset_Type(kClueReferenceLetter, 3); -	CDB_Set_Clue_Asset_Type(kClueCrowdInterviewA, 2); -	CDB_Set_Clue_Asset_Type(kClueCrowdInterviewB, 2); -	CDB_Set_Clue_Asset_Type(kClueZubenInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueZuben, 0); -	CDB_Set_Clue_Asset_Type(kClueBigManLimping, 2); -	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewA, 2); -	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewB1, 2); -	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewB2, 2); -	CDB_Set_Clue_Asset_Type(kClueHowieLeeInterview, 2); -	CDB_Set_Clue_Asset_Type(kCluePaintTransfer, 2); -	CDB_Set_Clue_Asset_Type(kClueChromeDebris, 3); -	CDB_Set_Clue_Asset_Type(kClueRuncitersViewA, 0); -	CDB_Set_Clue_Asset_Type(kClueRuncitersViewB, 0); -	CDB_Set_Clue_Asset_Type(kClueCarColorAndMake, 0); -	CDB_Set_Clue_Asset_Type(kCluePartialLicenseNumber, 0); -	CDB_Set_Clue_Asset_Type(kClueBriefcase, 3); -	CDB_Set_Clue_Asset_Type(kClueGaffsInformation, 2); -	CDB_Set_Clue_Asset_Type(kClueCrystalVisitedRunciters, -1); -	CDB_Set_Clue_Asset_Type(kClueCrystalVisitedChinatown, -1); -	CDB_Set_Clue_Asset_Type(kClueWantedPoster, 0); -	CDB_Set_Clue_Asset_Type(kClueLicensePlate, 3); -	CDB_Set_Clue_Asset_Type(kClueLabPaintTransfer, 2); -	CDB_Set_Clue_Asset_Type(kClueDispatchHitAndRun, 2); -	CDB_Set_Clue_Asset_Type(kClueInceptShotRoy, 0); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallGuzza, 2); -	CDB_Set_Clue_Asset_Type(kClueDragonflyEarring, 3); -	CDB_Set_Clue_Asset_Type(kClueTyrellSecurity, 1); -	CDB_Set_Clue_Asset_Type(kClueTyrellGuardInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueBombingSuspect, 0); -	CDB_Set_Clue_Asset_Type(kClueSadiksGun, 0); -	CDB_Set_Clue_Asset_Type(kClueDetonatorWire, 3); -	CDB_Set_Clue_Asset_Type(kClueVictimInformation, 2); -	CDB_Set_Clue_Asset_Type(kClueAttemptedFileAccess, 2); -	CDB_Set_Clue_Asset_Type(kClueCrystalsCase, 2); -	CDB_Set_Clue_Asset_Type(kClueKingstonKitchenBox1, 3); -	CDB_Set_Clue_Asset_Type(kClueTyrellSalesPamphlet1, 3); -	CDB_Set_Clue_Asset_Type(kClueTyrellSalesPamphlet2, 3); -	CDB_Set_Clue_Asset_Type(kCluePeruvianLadyInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueHasanInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueBobInterview1, 2); -	CDB_Set_Clue_Asset_Type(kClueBobInterview2, 2); -	CDB_Set_Clue_Asset_Type(kClueIzoInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueIzosWarning, 2); -	CDB_Set_Clue_Asset_Type(kClueRadiationGoggles, 3); -	CDB_Set_Clue_Asset_Type(kClueGogglesReplicantIssue, 2); -	CDB_Set_Clue_Asset_Type(kClueFishLadyInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueDogCollar1, 3); -	CDB_Set_Clue_Asset_Type(kClueWeaponsCache, 2); -	CDB_Set_Clue_Asset_Type(kClueChewInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueMorajiInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueGordoInterview1, 2); -	CDB_Set_Clue_Asset_Type(kClueGordoInterview2, 2); -	CDB_Set_Clue_Asset_Type(kClueAnsweringMachineMessage, 2); -	CDB_Set_Clue_Asset_Type(kClueChessTable, 2); -	CDB_Set_Clue_Asset_Type(kClueStaggeredbyPunches, 2); -	CDB_Set_Clue_Asset_Type(kClueMaggieBracelet, 3); -	CDB_Set_Clue_Asset_Type(kClueEnvelope, 3); -	CDB_Set_Clue_Asset_Type(kClueIzosFriend, 0); -	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityPhoto, 0); -	CDB_Set_Clue_Asset_Type(kCluePurchasedScorpions, 2); -	CDB_Set_Clue_Asset_Type(kClueWeaponsOrderForm, 3); -	CDB_Set_Clue_Asset_Type(kClueShippingForm, 3); -	CDB_Set_Clue_Asset_Type(kClueHysteriaToken, 3); -	CDB_Set_Clue_Asset_Type(kClueRagDoll, 3); -	CDB_Set_Clue_Asset_Type(kClueMoonbus1, 0); -	CDB_Set_Clue_Asset_Type(kClueCheese, 3); -	CDB_Set_Clue_Asset_Type(kClueDektorasDressingRoom, 0); -	CDB_Set_Clue_Asset_Type(kClueEarlyQsClub, 1); -	CDB_Set_Clue_Asset_Type(kClueStrangeScale1, 3); -	CDB_Set_Clue_Asset_Type(kClueDektoraInterview1, 2); -	CDB_Set_Clue_Asset_Type(kClueDektoraInterview2, 2); -	CDB_Set_Clue_Asset_Type(kClueDektoraInterview3, 2); -	CDB_Set_Clue_Asset_Type(kClueDektorasCard, 3); -	CDB_Set_Clue_Asset_Type(kClueGrigoriansNote, 3); -	CDB_Set_Clue_Asset_Type(kClueCollectionReceipt, 3); -	CDB_Set_Clue_Asset_Type(kClueSpecialIngredient, 2); -	CDB_Set_Clue_Asset_Type(kClueStolenCheese, 2); -	CDB_Set_Clue_Asset_Type(kClueGordoInterview3, 2); -	CDB_Set_Clue_Asset_Type(kClueGordoConfession, 2); -	CDB_Set_Clue_Asset_Type(kClueGordosLighter1, 3); -	CDB_Set_Clue_Asset_Type(kClueGordosLighter2, 3); -	CDB_Set_Clue_Asset_Type(kClueDektoraInterview4, 2); -	CDB_Set_Clue_Asset_Type(kClueHollowayInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueBakersBadge, 3); -	CDB_Set_Clue_Asset_Type(kClueHoldensBadge, 3); -	CDB_Set_Clue_Asset_Type(kClueCarIdentified, 2); -	CDB_Set_Clue_Asset_Type(kClueCarRegistration1, 2); -	CDB_Set_Clue_Asset_Type(kClueCarRegistration2, 2); -	CDB_Set_Clue_Asset_Type(kClueCarRegistration3, 2); -	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview1, 2); -	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview2, 2); -	CDB_Set_Clue_Asset_Type(kClueLichenDogWrapper, 3); -	CDB_Set_Clue_Asset_Type(kClueRequisitionForm, 3); -	CDB_Set_Clue_Asset_Type(kClueScaryChair, 2); -	CDB_Set_Clue_Asset_Type(kClueIzosStashRaided, 2); -	CDB_Set_Clue_Asset_Type(kClueHomelessManInterview1, 2); -	CDB_Set_Clue_Asset_Type(kClueHomelessManInterview2, 2); -	CDB_Set_Clue_Asset_Type(kClueHomelessManKid, 2); -	CDB_Set_Clue_Asset_Type(kClueGuzzaFramedMcCoy, 2); -	CDB_Set_Clue_Asset_Type(kClueOriginalShippingForm, 3); -	CDB_Set_Clue_Asset_Type(kClueOriginalRequisitionForm, 3); -	CDB_Set_Clue_Asset_Type(kClueCandyWrapper, 3); -	CDB_Set_Clue_Asset_Type(kClueFlaskOfAbsinthe, 3); -	CDB_Set_Clue_Asset_Type(kClueDektoraConfession, 2); -	CDB_Set_Clue_Asset_Type(kClueRunciterConfession1, 2); -	CDB_Set_Clue_Asset_Type(kClueRunciterConfession2, 2); -	CDB_Set_Clue_Asset_Type(kClueLutherLanceInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueMoonbus2, 0); -	CDB_Set_Clue_Asset_Type(kClueMoonbusCloseup, 0); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallDektora1, 2); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallDektora2, 2); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallLucy1, 2); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallLucy2, 2); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallClovis, 2); -	CDB_Set_Clue_Asset_Type(kCluePhoneCallCrystal, 2); -	CDB_Set_Clue_Asset_Type(kCluePowerSource, 3); -	CDB_Set_Clue_Asset_Type(kClueBomb, 3); -	CDB_Set_Clue_Asset_Type(kClueCrimeSceneNotes, 2); -	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewA, 2); -	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewB1, 2); -	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewB2, 2); -	CDB_Set_Clue_Asset_Type(kClueDNATyrell, 3); -	CDB_Set_Clue_Asset_Type(kClueDNASebastian, 3); -	CDB_Set_Clue_Asset_Type(kClueDNAChew, 3); -	CDB_Set_Clue_Asset_Type(kClueDNAMoraji, 3); -	CDB_Set_Clue_Asset_Type(kClueDNALutherLance, 3); -	CDB_Set_Clue_Asset_Type(kClueDNAMarcus, 3); -	CDB_Set_Clue_Asset_Type(kClueAnimalMurderSuspect, 0); -	CDB_Set_Clue_Asset_Type(kClueMilitaryBoots, 0); -	CDB_Set_Clue_Asset_Type(kClueOuterDressingRoom, 0); -	CDB_Set_Clue_Asset_Type(kCluePhotoOfMcCoy1, 0); -	CDB_Set_Clue_Asset_Type(kCluePhotoOfMcCoy2, 0); -	CDB_Set_Clue_Asset_Type(kClueEarlyQAndLucy, 0); -	CDB_Set_Clue_Asset_Type(kClueClovisflowers, 0); -	CDB_Set_Clue_Asset_Type(kClueLucyWithDektora, 0); -	CDB_Set_Clue_Asset_Type(kClueWomanInAnimoidRow, 0); -	CDB_Set_Clue_Asset_Type(kClueScorpions, 0); -	CDB_Set_Clue_Asset_Type(kClueStrangeScale2, 0); -	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityCamera, 0); -	CDB_Set_Clue_Asset_Type(kClueIzo, 0); -	CDB_Set_Clue_Asset_Type(kClueGuzza, 0); -	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityDisc, 1); -	CDB_Set_Clue_Asset_Type(kClueScorpionbox, 0); -	CDB_Set_Clue_Asset_Type(kClueTyrellSecurityPhoto, 0); -	CDB_Set_Clue_Asset_Type(kClueChinaBar, 0); -	CDB_Set_Clue_Asset_Type(kCluePlasticExplosive, 0); -	CDB_Set_Clue_Asset_Type(kClueDogCollar2, 0); -	CDB_Set_Clue_Asset_Type(kClueKingstonKitchenBox2, 0); -	CDB_Set_Clue_Asset_Type(kClueCrystalsCigarette, 3); -	CDB_Set_Clue_Asset_Type(kClueSpinnerKeys, 3); -	CDB_Set_Clue_Asset_Type(kClueExpertBomber, 2); -	CDB_Set_Clue_Asset_Type(kClueAmateurBomber, 2); -	CDB_Set_Clue_Asset_Type(kClueVKLucyReplicant, 2); -	CDB_Set_Clue_Asset_Type(kClueVKLucyHuman, 2); -	CDB_Set_Clue_Asset_Type(kClueVKDektoraReplicant, 2); -	CDB_Set_Clue_Asset_Type(kClueVKDektoraHuman, 2); -	CDB_Set_Clue_Asset_Type(kClueVKBobGorskyReplicant, 2); -	CDB_Set_Clue_Asset_Type(kClueVKBobGorskyHuman, 2); -	CDB_Set_Clue_Asset_Type(kClueVKGrigorianReplicant, 2); -	CDB_Set_Clue_Asset_Type(kClueVKGrigorianHuman, 2); -	CDB_Set_Clue_Asset_Type(kClueVKRunciterReplicant, 2); -	CDB_Set_Clue_Asset_Type(kClueVKRunciterHuman, 2); -	CDB_Set_Clue_Asset_Type(kClueLucyInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueMoonbusReflection, 0); -	CDB_Set_Clue_Asset_Type(kClueMcCoyAtMoonbus, 0); -	CDB_Set_Clue_Asset_Type(kClueClovisAtMoonbus, 0); -	CDB_Set_Clue_Asset_Type(kClueSadikAtMoonbus, 0); -	CDB_Set_Clue_Asset_Type(kClueZubenTalksAboutLucy1, 2); -	CDB_Set_Clue_Asset_Type(kClueZubenTalksAboutLucy2, 2); -	CDB_Set_Clue_Asset_Type(kClueZubensMotive, 2); -	CDB_Set_Clue_Asset_Type(kClueRachaelInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueTyrellInterview, 2); -	CDB_Set_Clue_Asset_Type(kClueRuncitersConfession1, 2); -	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewA, 2); -	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewB1, 2); -	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewB2, 2); -	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview3, 2); -	CDB_Set_Clue_Asset_Type(kClueCrazylegGgrovels, 2); -	CDB_Set_Clue_Asset_Type(kClueFolder, 3); + +	for(int i = 0; i != 288; ++i) { +		CDB_Set_Clue_Asset_Type(i, kClueTypeIntangible); +	} + +	CDB_Set_Clue_Asset_Type(kClueOfficersStatement, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDoorForced2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueLimpingFootprints, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGracefulFootprints, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueShellCasings, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCandy, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueToyDog, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueChopstickWrapper, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueSushiMenu, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueLabCorpses, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueLabShellCasings, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRuncitersVideo, kClueTypeVideoClip); +	CDB_Set_Clue_Asset_Type(kClueLucy, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueDragonflyAnklet, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueReferenceLetter, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCrowdInterviewA, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrowdInterviewB, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueZubenInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueZuben, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueBigManLimping, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewA, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewB1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRunciterInterviewB2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHowieLeeInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePaintTransfer, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueChromeDebris, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueRuncitersViewA, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueRuncitersViewB, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueCarColorAndMake, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePartialLicenseNumber, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueBriefcase, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueGaffsInformation, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrystalVisitedRunciters, kClueTypeIntangible); +	CDB_Set_Clue_Asset_Type(kClueCrystalVisitedChinatown, kClueTypeIntangible); +	CDB_Set_Clue_Asset_Type(kClueWantedPoster, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueLicensePlate, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueLabPaintTransfer, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDispatchHitAndRun, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueInceptShotRoy, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallGuzza, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDragonflyEarring, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueTyrellSecurity, kClueTypeVideoClip); +	CDB_Set_Clue_Asset_Type(kClueTyrellGuardInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueBombingSuspect, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueSadiksGun, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueDetonatorWire, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueVictimInformation, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueAttemptedFileAccess, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrystalsCase, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueKingstonKitchenBox1, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueTyrellSalesPamphlet1, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueTyrellSalesPamphlet2, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kCluePeruvianLadyInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHasanInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueBobInterview1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueBobInterview2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueIzoInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueIzosWarning, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRadiationGoggles, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueGogglesReplicantIssue, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueFishLadyInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDogCollar1, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueWeaponsCache, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueChewInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueMorajiInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGordoInterview1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGordoInterview2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueAnsweringMachineMessage, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueChessTable, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueStaggeredbyPunches, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueMaggieBracelet, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueEnvelope, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueIzosFriend, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityPhoto, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePurchasedScorpions, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueWeaponsOrderForm, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueShippingForm, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueHysteriaToken, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueRagDoll, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueMoonbus1, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueCheese, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDektorasDressingRoom, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueEarlyQsClub, kClueTypeVideoClip); +	CDB_Set_Clue_Asset_Type(kClueStrangeScale1, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDektoraInterview1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDektoraInterview2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDektoraInterview3, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDektorasCard, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueGrigoriansNote, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCollectionReceipt, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueSpecialIngredient, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueStolenCheese, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGordoInterview3, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGordoConfession, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGordosLighter1, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueGordosLighter2, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDektoraInterview4, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHollowayInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueBakersBadge, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueHoldensBadge, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCarIdentified, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCarRegistration1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCarRegistration2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCarRegistration3, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueLichenDogWrapper, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueRequisitionForm, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueScaryChair, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueIzosStashRaided, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHomelessManInterview1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHomelessManInterview2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueHomelessManKid, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGuzzaFramedMcCoy, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueOriginalShippingForm, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueOriginalRequisitionForm, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCandyWrapper, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueFlaskOfAbsinthe, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDektoraConfession, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRunciterConfession1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRunciterConfession2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueLutherLanceInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueMoonbus2, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueMoonbusCloseup, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallDektora1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallDektora2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallLucy1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallLucy2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallClovis, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePhoneCallCrystal, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kCluePowerSource, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueBomb, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueCrimeSceneNotes, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewA, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewB1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueGrigorianInterviewB2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueDNATyrell, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDNASebastian, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDNAChew, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDNAMoraji, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDNALutherLance, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueDNAMarcus, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueAnimalMurderSuspect, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueMilitaryBoots, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueOuterDressingRoom, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePhotoOfMcCoy1, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePhotoOfMcCoy2, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueEarlyQAndLucy, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueClovisflowers, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueLucyWithDektora, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueWomanInAnimoidRow, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueScorpions, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueStrangeScale2, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityCamera, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueIzo, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueGuzza, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueChinaBarSecurityDisc, kClueTypeVideoClip); +	CDB_Set_Clue_Asset_Type(kClueScorpionbox, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueTyrellSecurityPhoto, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueChinaBar, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kCluePlasticExplosive, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueDogCollar2, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueKingstonKitchenBox2, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueCrystalsCigarette, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueSpinnerKeys, kClueTypeObject); +	CDB_Set_Clue_Asset_Type(kClueExpertBomber, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueAmateurBomber, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKLucyReplicant, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKLucyHuman, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKDektoraReplicant, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKDektoraHuman, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKBobGorskyReplicant, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKBobGorskyHuman, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKGrigorianReplicant, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKGrigorianHuman, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKRunciterReplicant, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueVKRunciterHuman, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueLucyInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueMoonbusReflection, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueMcCoyAtMoonbus, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueClovisAtMoonbus, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueSadikAtMoonbus, kClueTypePhotograph); +	CDB_Set_Clue_Asset_Type(kClueZubenTalksAboutLucy1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueZubenTalksAboutLucy2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueZubensMotive, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRachaelInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueTyrellInterview, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueRuncitersConfession1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewA, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewB1, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueEarlyInterviewB2, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrazylegsInterview3, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueCrazylegGgrovels, kClueTypeAudioRecording); +	CDB_Set_Clue_Asset_Type(kClueFolder, kClueTypeObject);  }  void ScriptInit::Init_Spinner() { diff --git a/engines/bladerunner/script/scene/rc01.cpp b/engines/bladerunner/script/scene/rc01.cpp index 79bf1045ce..dd793ad440 100644 --- a/engines/bladerunner/script/scene/rc01.cpp +++ b/engines/bladerunner/script/scene/rc01.cpp @@ -25,13 +25,13 @@  namespace BladeRunner {  void SceneScriptRC01::InitializeScene() { -#if _DEBUG +#if BLADERUNNER_DEBUG_GAME  	//TODO: not part of game, remove -	// Game_Flag_Set(kFlagIntroPlayed); // force skip intro -	// Game_Flag_Set(kFlagRC02toRC01); // no landing +	Game_Flag_Set(kFlagIntroPlayed); // force skip intro +	Game_Flag_Set(kFlagRC02toRC01); // no landing  	// Game_Flag_Set(kFlagRC01PoliceDone);  	// Game_Flag_Set(249); -	// Game_Flag_Set(kFlagKIAPrivacyAddon); +	Game_Flag_Set(kFlagKIAPrivacyAddon);  #endif  	if (!Game_Flag_Query(kFlagIntroPlayed)) { diff --git a/engines/bladerunner/suspects_database.cpp b/engines/bladerunner/suspects_database.cpp index c0e8469852..d7e9c1f999 100644 --- a/engines/bladerunner/suspects_database.cpp +++ b/engines/bladerunner/suspects_database.cpp @@ -96,19 +96,23 @@ bool SuspectDatabaseEntry::addPhotoClue(int shapeId, int clueId) {  	if (_photoClueCount >= kPhotoClueCount) {  		return false;  	} -	_photoClues[_photoClueCount][0] = clueId; -	_photoClues[_photoClueCount][1] = shapeId; -	_photoClues[_photoClueCount][2] = -1; +	_photoClues[_photoClueCount].clueId = clueId; +	_photoClues[_photoClueCount].shapeId = shapeId; +	_photoClues[_photoClueCount].notUsed = -1;  	_photoClueCount++;  	return true;  } -const char *SuspectDatabaseEntry::getName() { +const char *SuspectDatabaseEntry::getName() const {  	return _vm->_textActorNames->getText(_actorId);  } -bool SuspectDatabaseEntry::hasMOClue(int clueId) { +int SuspectDatabaseEntry::getSex() const { +	return _sex; +} + +bool SuspectDatabaseEntry::hasMOClue(int clueId) const {  	for (int i = 0; i < _moClueCount; i++) {  		if (_moClues[i] == clueId) {  			return true; @@ -117,7 +121,7 @@ bool SuspectDatabaseEntry::hasMOClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasWhereaboutsClue(int clueId) { +bool SuspectDatabaseEntry::hasWhereaboutsClue(int clueId) const {  	for (int i = 0; i < _whereaboutsClueCount; i++) {  		if (_whereaboutsClues[i] == clueId) {  			return true; @@ -126,7 +130,7 @@ bool SuspectDatabaseEntry::hasWhereaboutsClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasReplicantClue(int clueId) { +bool SuspectDatabaseEntry::hasReplicantClue(int clueId) const {  	for (int i = 0; i < _replicantClueCount; i++) {  		if (_replicantClues[i] == clueId) {  			return true; @@ -135,7 +139,7 @@ bool SuspectDatabaseEntry::hasReplicantClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasNonReplicantClue(int clueId) { +bool SuspectDatabaseEntry::hasNonReplicantClue(int clueId) const {  	for (int i = 0; i < _nonReplicantClueCount; i++) {  		if (_nonReplicantClues[i] == clueId) {  			return true; @@ -144,7 +148,7 @@ bool SuspectDatabaseEntry::hasNonReplicantClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasOtherClue(int clueId) { +bool SuspectDatabaseEntry::hasOtherClue(int clueId) const {  	for (int i = 0; i < _otherClueCount; i++) {  		if (_otherClues[i] == clueId) {  			return true; @@ -153,7 +157,7 @@ bool SuspectDatabaseEntry::hasOtherClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasIdentityClue(int clueId) { +bool SuspectDatabaseEntry::hasIdentityClue(int clueId) const {  	for (int i = 0; i < _identityClueCount; i++) {  		if (_identityClues[i] == clueId) {  			return true; @@ -162,7 +166,7 @@ bool SuspectDatabaseEntry::hasIdentityClue(int clueId) {  	return false;  } -bool SuspectDatabaseEntry::hasClue(int clueId) { +bool SuspectDatabaseEntry::hasClue(int clueId) const {  	return hasMOClue(clueId)  		|| hasWhereaboutsClue(clueId)  		|| hasReplicantClue(clueId) @@ -170,16 +174,20 @@ bool SuspectDatabaseEntry::hasClue(int clueId) {  		|| hasOtherClue(clueId);  } -int SuspectDatabaseEntry::getPhotoClue1(int photoId) { -	return _photoClues[photoId][0]; +int SuspectDatabaseEntry::getPhotoCount() const { +	return _photoClueCount; +} + +int SuspectDatabaseEntry::getPhotoClueId(int photoId) const { +	return _photoClues[photoId].clueId;  } -int SuspectDatabaseEntry::getPhotoClue2(int photoId) { -	return _photoClues[photoId][1]; +int SuspectDatabaseEntry::getPhotoShapeId(int photoId) const { +	return _photoClues[photoId].shapeId;  } -int SuspectDatabaseEntry::getPhotoClue3(int photoId) { -	return _photoClues[photoId][2]; +int SuspectDatabaseEntry::getPhotoNotUsed(int photoId) const { +	return _photoClues[photoId].notUsed;  }  void SuspectDatabaseEntry::reset() { diff --git a/engines/bladerunner/suspects_database.h b/engines/bladerunner/suspects_database.h index 71db4dba68..c4ed08998e 100644 --- a/engines/bladerunner/suspects_database.h +++ b/engines/bladerunner/suspects_database.h @@ -30,7 +30,6 @@ class BladeRunnerEngine;  class TextResource;  class SuspectDatabaseEntry { -private:  	static const int kMOClueCount = 10;  	static const int kWhereaboutsClueCount = 10;  	static const int kReplicantClueCount = 20; @@ -39,18 +38,24 @@ private:  	static const int kIdentityClueCount = 10;  	static const int kPhotoClueCount = 6; +	struct Photo { +		int clueId; +		int shapeId; +		int notUsed; +	}; +  	BladeRunnerEngine *_vm;  	int _actorId;  	int _sex; -	int _moClues[kMOClueCount]; -	int _whereaboutsClues[kWhereaboutsClueCount]; -	int _replicantClues[kReplicantClueCount]; -	int _nonReplicantClues[kNonReplicantClueCount]; -	int _otherClues[kOtherClueCount]; -	int _identityClues[kIdentityClueCount]; -	int _photoClues[kPhotoClueCount][3]; +	int   _moClues[kMOClueCount]; +	int   _whereaboutsClues[kWhereaboutsClueCount]; +	int   _replicantClues[kReplicantClueCount]; +	int   _nonReplicantClues[kNonReplicantClueCount]; +	int   _otherClues[kOtherClueCount]; +	int   _identityClues[kIdentityClueCount]; +	Photo _photoClues[kPhotoClueCount];  	int _moClueCount;  	int _whereaboutsClueCount; @@ -66,25 +71,30 @@ public:  	void setActor(int actorId);  	void setSex(int sex); +  	bool addMOClue(int clueId);  	bool addWhereaboutsClue(int clueId);  	bool addReplicantClue(int clueId);  	bool addNonReplicantClue(int clueId);  	bool addOtherClue(int clueId);  	bool addIdentityClue(int clueId); -	bool addPhotoClue(int shapeId, int clueIndex); - -	const char *getName(); -	bool hasMOClue(int clueId); -	bool hasWhereaboutsClue(int clueId); -	bool hasReplicantClue(int clueId); -	bool hasNonReplicantClue(int clueId); -	bool hasOtherClue(int clueId); -	bool hasIdentityClue(int clueId); -	bool hasClue(int clueId); -	int getPhotoClue1(int photoId); -	int getPhotoClue2(int photoId); -	int getPhotoClue3(int photoId); +	bool addPhotoClue(int shapeId, int clueId); + +	const char *getName() const; +	int getSex() const; + +	bool hasMOClue(int clueId) const; +	bool hasWhereaboutsClue(int clueId) const; +	bool hasReplicantClue(int clueId) const; +	bool hasNonReplicantClue(int clueId) const; +	bool hasOtherClue(int clueId) const; +	bool hasIdentityClue(int clueId) const; +	bool hasClue(int clueId) const; + +	int getPhotoCount() const; +	int getPhotoClueId(int photoId) const; +	int getPhotoShapeId(int photoId) const; +	int getPhotoNotUsed(int photoId) const;  private:  	void reset(); @@ -93,7 +103,7 @@ private:  class SuspectsDatabase {  	BladeRunnerEngine *_vm; -	Common::Array<SuspectDatabaseEntry*> _suspects; +	Common::Array<SuspectDatabaseEntry *> _suspects;  public:  	SuspectsDatabase(BladeRunnerEngine *_vm, int size); diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp index 09c5918872..7e08a148fb 100644 --- a/engines/bladerunner/ui/kia.cpp +++ b/engines/bladerunner/ui/kia.cpp @@ -107,8 +107,8 @@ KIA::KIA(BladeRunnerEngine *vm) {  	_buttons = new UIImagePicker(_vm, 22); -	_crimesSection     = new KIASectionCrimes(_vm); // PlayerActor->_clues -	_suspectsSection   = new KIASectionSuspects(_vm); // PlayerActor->_clues +	_crimesSection     = new KIASectionCrimes(_vm, _vm->_playerActor->_clues); +	_suspectsSection   = new KIASectionSuspects(_vm, _vm->_playerActor->_clues);  	_cluesSection      = new KIASectionClues(_vm, _vm->_playerActor->_clues);  	_settingsSection   = new KIASectionSettings(_vm);  	_helpSection       = new KIASectionHelp(_vm); @@ -318,15 +318,15 @@ void KIA::handleMouseUp(int mouseX, int mouseY, bool mainButton) {  	if (_currentSection) {  		_currentSection->handleMouseUp(mainButton);  	} -	if (_currentSection && _currentSection->_field0) { +	if (_currentSection && _currentSection->_scheduledSwitch) {  		if (_currentSectionId == kKIASectionCrimes) {  			open(kKIASectionSuspects); -			// kiaSuspects::sub_45290C(_suspectsMenu, _crimesMenu->selectedSuspectId); +			_suspectsSection->selectSuspect(_crimesSection->_suspectSelected);  			_log->next();  			_log->clearFuture();  		} else if (_currentSectionId == kKIASectionSuspects) {  			open(kKIASectionCrimes); -			// kiaCrimes::updateCrime(_crimesMenu, *&_suspectsMenu->data[8052]); +			_crimesSection->selectCrime(_suspectsSection->_crimeSelected);  			_log->next();  			_log->clearFuture();  		} else { @@ -361,7 +361,7 @@ void KIA::handleKeyUp(const Common::KeyState &kbd) {  			_currentSection->handleKeyUp(kbd);  		}  	} -	if (_currentSection && _currentSection->_field0) { +	if (_currentSection && _currentSection->_scheduledSwitch) {  		open(kKIASectionNone);  	}  } @@ -418,7 +418,7 @@ void KIA::handleKeyDown(const Common::KeyState &kbd) {  			}  			break;  	} -	if (_currentSection && _currentSection->_field0) { +	if (_currentSection && _currentSection->_scheduledSwitch) {  		open(kKIASectionNone);  	}  } diff --git a/engines/bladerunner/ui/kia_section_base.cpp b/engines/bladerunner/ui/kia_section_base.cpp index 96571e5a48..95f025e336 100644 --- a/engines/bladerunner/ui/kia_section_base.cpp +++ b/engines/bladerunner/ui/kia_section_base.cpp @@ -26,7 +26,7 @@ namespace BladeRunner {  KIASectionBase::KIASectionBase(BladeRunnerEngine *vm) {      _vm = vm; -    _field0 = false; +    _scheduledSwitch = false;  }  KIASectionBase::~KIASectionBase() { diff --git a/engines/bladerunner/ui/kia_section_base.h b/engines/bladerunner/ui/kia_section_base.h index 176e30d4b7..ea69d89768 100644 --- a/engines/bladerunner/ui/kia_section_base.h +++ b/engines/bladerunner/ui/kia_section_base.h @@ -41,7 +41,7 @@ protected:  	BladeRunnerEngine *_vm;  public: -	bool _field0; +	bool _scheduledSwitch;  	KIASectionBase(BladeRunnerEngine *vm);  	virtual ~KIASectionBase(); diff --git a/engines/bladerunner/ui/kia_section_clues.cpp b/engines/bladerunner/ui/kia_section_clues.cpp index 9c8da60ff9..25ff27ba8d 100644 --- a/engines/bladerunner/ui/kia_section_clues.cpp +++ b/engines/bladerunner/ui/kia_section_clues.cpp @@ -46,7 +46,7 @@ namespace BladeRunner {  KIASectionClues::KIASectionClues(BladeRunnerEngine *vm, ActorClues *clues) : KIASectionBase(vm) {  	_uiContainer = new UIContainer(_vm); -	_isVisible = false; +	_isOpen = false;  	_debugIntangible = false;  	_debugNop = 0; @@ -81,13 +81,13 @@ KIASectionClues::~KIASectionClues() {  }  void KIASectionClues::open() { -	_isVisible = true; +	_isOpen = true;  	_buttons->resetImages();  	_buttons->defineImage(0, Common::Rect(142, 380, 191, 395), _vm->_kia->_shapes->get(79), _vm->_kia->_shapes->get(80), _vm->_kia->_shapes->get(81), _vm->_textKIA->getText(30));  	_buttons->defineImage(1, Common::Rect(193, 380, 242, 395), _vm->_kia->_shapes->get(76), _vm->_kia->_shapes->get(77), _vm->_kia->_shapes->get(78), _vm->_textKIA->getText(31)); -  	_buttons->activate(nullptr, nullptr, nullptr, mouseUpCallback, this); +  	_cluesScrollBox->show();  	_filterScrollBox->show(); @@ -96,8 +96,8 @@ void KIASectionClues::open() {  }  void KIASectionClues::close() { -	if (_isVisible) { -		_isVisible = false; +	if (_isOpen) { +		_isOpen = false;  		_buttons->deactivate();  		_cluesScrollBox->hide(); @@ -385,22 +385,22 @@ void KIASectionClues::populateClues() {  	_cluesScrollBox->sortLines();  } -int KIASectionClues::getClueFilterTypeTextId(int i) { -	if (i) { -		return i - 1; +int KIASectionClues::getClueFilterTypeTextId(int filterId) { +	if (filterId) { +		return filterId - 1;  	}  	return -1;  }  int KIASectionClues::getClueFilterCrimeId(int filterId) { -	if (filterId == _assetTypeFilterCount) { -		return -1; +	if (filterId != _assetTypeFilterCount) { +		return filterId - (_assetTypeFilterCount + 1);  	} -	return filterId - (_assetTypeFilterCount + 1); +	return -1;  }  int KIASectionClues::getLineIdForAssetType(int assetType) { -	if (assetType == -1) { +	if (assetType == kClueTypeIntangible) {  		return 0;  	}  	return assetType + 1; diff --git a/engines/bladerunner/ui/kia_section_clues.h b/engines/bladerunner/ui/kia_section_clues.h index 74f7b55f65..3f6a13d135 100644 --- a/engines/bladerunner/ui/kia_section_clues.h +++ b/engines/bladerunner/ui/kia_section_clues.h @@ -36,6 +36,7 @@ class UIImagePicker;  class UIScrollBox;  class KIASectionClues : public KIASectionBase { +	//TODO: use gameInfo->getClueCount(), not in original game  	static const int kClueCount = 288;  	struct Line { @@ -49,7 +50,7 @@ class KIASectionClues : public KIASectionBase {  	UIScrollBox         *_cluesScrollBox;  	UIScrollBox         *_filterScrollBox; -	bool                _isVisible; +	bool                _isOpen;  	bool                _debugIntangible;  	int                 _debugNop;  	ActorClues         *_clues; diff --git a/engines/bladerunner/ui/kia_section_crimes.cpp b/engines/bladerunner/ui/kia_section_crimes.cpp index 4cfaaedbad..b0b3d7c234 100644 --- a/engines/bladerunner/ui/kia_section_crimes.cpp +++ b/engines/bladerunner/ui/kia_section_crimes.cpp @@ -22,16 +22,459 @@  #include "bladerunner/ui/kia_section_crimes.h" +#include "bladerunner/actor_clues.h" +#include "bladerunner/audio_player.h"  #include "bladerunner/bladerunner.h" +#include "bladerunner/crimes_database.h" +#include "bladerunner/font.h" +#include "bladerunner/game_constants.h" +#include "bladerunner/game_flags.h" +#include "bladerunner/game_info.h" +#include "bladerunner/shape.h" +#include "bladerunner/script/kia.h" +#include "bladerunner/suspects_database.h" +#include "bladerunner/text_resource.h" +#include "bladerunner/ui/kia.h" +#include "bladerunner/ui/kia_log.h" +#include "bladerunner/ui/kia_section_suspects.h" +#include "bladerunner/ui/kia_shapes.h" +#include "bladerunner/ui/ui_container.h" +#include "bladerunner/ui/ui_image_picker.h" +#include "bladerunner/ui/ui_scroll_box.h" + + +#include "graphics/surface.h"  namespace BladeRunner { -KIASectionCrimes::KIASectionCrimes(BladeRunnerEngine *vm) -    : KIASectionBase(vm) -    , _shape(vm) { +KIASectionCrimes::KIASectionCrimes(BladeRunnerEngine *vm, ActorClues *clues) : KIASectionBase(vm) { +	_uiContainer = new UIContainer(_vm); +	_isOpen = false; +	_clues = clues; + +	_mouseX = 0; +	_mouseY = 0; + +	_buttons = new UIImagePicker(_vm, 5); + +	_cluesScrollBox = new UIScrollBox(_vm, scrollBoxCallback, this, 50, 1, false, Common::Rect(312, 172, 500, 376), Common::Rect(506, 160, 506, 394)); +	_uiContainer->add(_cluesScrollBox); + +	_acquiredClueCount = 0; + +	_crimeSelected = -1; +	_crimesFoundCount = 0; +	_crimesFound.resize(_vm->_gameInfo->getCrimeCount()); + +	_suspectSelected = -1; +	_suspectPhotoShapeId = -1; +	_suspectPhotoShape = nullptr; +	_suspectsFoundCount = 0; +	_suspectsFound.resize(_vm->_gameInfo->getSuspectCount()); +	_suspectsWithIdentity.resize(_vm->_gameInfo->getSuspectCount());  }  KIASectionCrimes::~KIASectionCrimes() { +	delete _suspectPhotoShape; + +	_uiContainer->clear(); + +	delete _cluesScrollBox; +	delete _buttons; +	delete _uiContainer; +} + +void KIASectionCrimes::open() { +	_scheduledSwitch = false; + +	_buttons->resetImages(); +	_buttons->defineImage(0, Common::Rect(136, 326, 185, 342), nullptr, _vm->_kia->_shapes->get(32), _vm->_kia->_shapes->get(36), _vm->_textKIA->getText(32)); +	_buttons->defineImage(1, Common::Rect(218, 326, 269, 342), nullptr, _vm->_kia->_shapes->get(33), _vm->_kia->_shapes->get(37), _vm->_textKIA->getText(33)); +	_buttons->defineImage(2, Common::Rect(354, 128, 404, 144), nullptr, _vm->_kia->_shapes->get(30), _vm->_kia->_shapes->get(34), _vm->_textKIA->getText(34)); +	_buttons->defineImage(3, Common::Rect(425, 128, 474, 144), nullptr, _vm->_kia->_shapes->get(31), _vm->_kia->_shapes->get(35), _vm->_textKIA->getText(35)); +	_buttons->defineImage(4, Common::Rect(142, 150, 260, 297), nullptr, nullptr, nullptr, _vm->_textKIA->getText(36)); +	_buttons->activate(nullptr, nullptr, nullptr, mouseUpCallback, this); + +	_cluesScrollBox->show(); + +	populateAcquiredClues(); +	populateCrimes(); +	populateSuspects(); +	populateVisibleClues(); +	updateSuspectPhoto(); + +	_isOpen = true; +} + +void KIASectionCrimes::close() { +	if (!_isOpen) { +		return; +	} +	_isOpen = false; +	_buttons->deactivate(); +	_cluesScrollBox->hide(); +	if (_suspectPhotoShapeId != -1) { +		delete _suspectPhotoShape; +		_suspectPhotoShape = nullptr; +		_suspectPhotoShapeId = -1; +	} +} + +void KIASectionCrimes::draw(Graphics::Surface &surface) { +	const char *text = nullptr; +	if (_suspectPhotoShapeId != -1) { +		_suspectPhotoShape->draw(surface, 201 - _suspectPhotoShape->getWidth() / 2, 223 - _suspectPhotoShape->getHeight() / 2); +	} +	if (_suspectPhotoShapeId == 14 || _suspectPhotoShapeId == 13) { +		text = _vm->_textKIA->getText(49); +		_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 218, 0x7FFF); +	} + +	surface.fillRect(Common::Rect(120, 134, 250, 145), 0); +	surface.hLine(120, 133, 250, 0x18A5); +	surface.hLine(120, 146, 250, 0x2D4C); +	surface.vLine(119, 134, 145, 0x18A5); +	surface.vLine(251, 134, 145, 0x2D4C); +	surface.hLine(251, 146, 251, 0x2509); + +	if (_crimeSelected == -1) { +		text = _vm->_textKIA->getText(49); +	} else { +		text = _vm->_textCrimes->getText(_crimeSelected); +	} + +	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, 0x46BF); + +	surface.fillRect(Common::Rect(136, 304, 266, 315), 0); +	surface.hLine(136, 303, 266, 0x18A5); +	surface.hLine(136, 316, 266, 0x2D4C); +	surface.vLine(135, 304, 315, 0x18A5); +	surface.vLine(267, 304, 315, 0x2D4C); +	surface.hLine(267, 316, 267, 0x2509); + +	char generatedText[64]; +	if (_suspectSelected == -1) { +		text = _vm->_textKIA->getText(22); +	} else { +		const char *suspectName = _vm->_suspectsDatabase->get(_suspectSelected)->getName(); +		if (_suspectsWithIdentity[_suspectSelected]) { +			text = suspectName; +		} else if (_vm->_suspectsDatabase->get(_suspectSelected)->getSex()) { +			sprintf(generatedText, "%s %s", _vm->_textKIA->getText(20), KIASectionSuspects::scrambleSuspectsName(suspectName)); +			text = generatedText; +		} else { +			sprintf(generatedText, "%s %s", _vm->_textKIA->getText(21), KIASectionSuspects::scrambleSuspectsName(suspectName)); +			text = generatedText; +		} +	} +	_vm->_mainFont->drawColor(text, surface, 201 - _vm->_mainFont->getTextWidth(text) / 2, 306, 0x46BF); + +	_uiContainer->draw(surface); +	_buttons->draw(surface); +	_buttons->drawTooltip(surface, _mouseX, _mouseY); +} + +void KIASectionCrimes::handleMouseMove(int mouseX, int mouseY) { +	_mouseX = mouseX; +	_mouseY = mouseY; +	_buttons->handleMouseAction(mouseX, mouseY, false, false, false); +	_uiContainer->handleMouseMove(mouseX, mouseY); +} + +void KIASectionCrimes::handleMouseDown(bool mainButton) { +	if (mainButton) { +		_buttons->handleMouseAction(_mouseX, _mouseY, true, false, false); +	} +	_uiContainer->handleMouseDown(!mainButton); +} + +void KIASectionCrimes::handleMouseUp(bool mainButton) { +	if (mainButton) { +		_buttons->handleMouseAction(_mouseX, _mouseY, false, true, false); +	} +	_uiContainer->handleMouseUp(!mainButton); +} + +void KIASectionCrimes::saveToLog() { +	int data[] = { _crimeSelected, _suspectSelected }; +	_vm->_kia->_log->add(2, sizeof(data), &data); +} + +void KIASectionCrimes::loadFromLog() { +	const int *data = (const int*)_vm->_kia->_log->getCurrentData(); +	_crimeSelected = data[0]; +	_suspectSelected = data[1]; +	populateSuspects(); +	populateVisibleClues(); +} + +void KIASectionCrimes::selectCrime(int crimeId) { +	_crimeSelected = crimeId; +	populateSuspects(); +	populateVisibleClues(); +	updateSuspectPhoto(); +} + +void KIASectionCrimes::scrollBoxCallback(void *callbackData, void *source, int lineData, int mouseButton) { +	KIASectionCrimes *self = (KIASectionCrimes *)callbackData; + +	if (source == self->_cluesScrollBox && lineData >= 0) { +		if (mouseButton) { +			if (self->_vm->_gameFlags->query(kFlagKIAPrivacyAddon)) { +				self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(511), 70, 0, 0, 50, 0); + +				if (self->_clues->isPrivate(lineData)) { +					self->_clues->setPrivate(lineData, false); +					self->_cluesScrollBox->resetFlags(lineData, 0x08); +				} else { +					self->_clues->setPrivate(lineData, true); +					self->_cluesScrollBox->setFlags(lineData, 0x08); +				} +			} +		} else { +			self->_clues->setViewed(lineData, true); +			self->_cluesScrollBox->resetHighlight(lineData); +			self->_vm->_kia->_script->playClueAssetScript(0, lineData); +		} +	} +} + +void KIASectionCrimes::mouseUpCallback(int buttonId, void *callbackData) { +	((KIASectionCrimes *)callbackData)->onButtonPressed(buttonId); +} + +void KIASectionCrimes::onButtonPressed(int buttonId) { +	switch (buttonId) { +		case 0: +			prevSuspect(); +			break; +		case 1: +			nextSuspect(); +			break; +		case 2: +			prevCrime(); +			break; +		case 3: +			nextCrime(); +			break; +		case 4: +			if (_suspectSelected != -1) { +				_scheduledSwitch = true; +			} +			break; +	} +} + +void KIASectionCrimes::populateAcquiredClues() { +	_acquiredClueCount = 0; +	for (int i = 0; i < kClueCount; ++i) { +		if (_clues->isAcquired(i)) { +			_acquiredClues[_acquiredClueCount].clueId = i; +			_acquiredClues[_acquiredClueCount].actorId = _clues->getFromActorId(i); +			++_acquiredClueCount; +		} +	} +	// sort clues by name, is it necessary +} + +void KIASectionCrimes::populateCrimes() { +	int firstCrime = -1; +	int crimeCount = _vm->_gameInfo->getCrimeCount(); +	for (int i = 0; i < crimeCount; ++i) { +		_crimesFound[i] = false; +	} + +	_crimesFoundCount = 0; + +	if (!_acquiredClueCount) { +		return; +	} + +	for (int i = 0; i < crimeCount; ++i) { +		for (int j = 0; j < _acquiredClueCount; ++j) { +			if (_vm->_crimesDatabase->getCrime(_acquiredClues[j].clueId) == i) { +				if (firstCrime == -1) { +					firstCrime = i; +				} +				_crimesFound[i] = true; +				++_crimesFoundCount; +			} +		} +	} + +	if (_crimesFoundCount > 0 && _crimeSelected == -1) { +		_crimeSelected = firstCrime; +	} +} + +void KIASectionCrimes::populateSuspects() { +	int firstSuspect = -1; +	int suspectCount = _vm->_gameInfo->getSuspectCount(); + +	for (int i = 0; i < suspectCount; ++i) { +		_suspectsFound[i] = false; +		_suspectsWithIdentity[i] = false; +	} + +	_suspectsFoundCount = 0; + +	if (!_acquiredClueCount || _crimeSelected == -1) { +		return; +	} + +	for (int i = 0; i < suspectCount; ++i) { +		for (int j = 0; j < _acquiredClueCount; ++j) { +			if (_vm->_crimesDatabase->getCrime(_acquiredClues[j].clueId) == _crimeSelected +			 && _vm->_suspectsDatabase->get(i)->hasClue(_acquiredClues[j].clueId) +			) { +				if (firstSuspect == -1) { +					firstSuspect = i; +				} +				_suspectsFound[i] = true; +				++_suspectsFoundCount; +			} +		} + +		if (_suspectsFound[i]) { +			for (int j = 0; j < _acquiredClueCount; ++j) { +				if (_vm->_suspectsDatabase->get(i)->hasIdentityClue(_acquiredClues[j].clueId)) { +					_suspectsWithIdentity[i] = true; +				} +			} +		} +	} + +	if (_suspectsFoundCount) { +		if (_suspectSelected == -1 || !_suspectsFound[_suspectSelected]) { +			_suspectSelected = firstSuspect; +		} +	} else { +		_suspectSelected = -1; +	} +} + +void KIASectionCrimes::populateVisibleClues() { +	_cluesScrollBox->clearLines(); +	if (_crimeSelected != -1) { +		for (uint i = 0; i < _vm->_gameInfo->getClueCount(); ++i) { +			if (_vm->_crimesDatabase->getAssetType(i) != -1 +			 && _vm->_crimesDatabase->getCrime(i) == _crimeSelected +			 && _clues->isAcquired(i) +			) { +				int flags = 0x30; +				if (_clues->isPrivate(i)) { +					flags = 0x08; +				} else if (_clues->isViewed(i)) { +					flags = 0x10; +				} +				_cluesScrollBox->addLine(_vm->_crimesDatabase->getClueText(i), i, flags); +			} +		} +		_cluesScrollBox->sortLines(); +	} +} + +void KIASectionCrimes::updateSuspectPhoto() { +	if (_suspectPhotoShapeId != -1) { +		delete _suspectPhotoShape; +		_suspectPhotoShape = nullptr; +	} + +	if (_suspectSelected == -1) { +		_suspectPhotoShapeId = -1; +		return; +	} + +	SuspectDatabaseEntry *suspect = _vm->_suspectsDatabase->get(_suspectSelected); + +	_suspectPhotoShapeId = -1; +	int photoCluesCount = suspect->getPhotoCount(); +	if (photoCluesCount > 0) { +		for (int i = 0 ; i < photoCluesCount; i++) { +			//TODO: weird stuff going on here... it's using index instead id, also some field is used but its always -1 +			if (_clues->isAcquired(suspect->getPhotoClueId(i))) { +				_suspectPhotoShapeId = suspect->getPhotoShapeId(i); +				break; +			} +		} +	} + +	if (_suspectPhotoShapeId == -1) { +		if (suspect->getSex()) { +			_suspectPhotoShapeId = 14; +		} else { +			_suspectPhotoShapeId = 13; +		} +	} + +	if (_suspectPhotoShapeId != -1) { +		_suspectPhotoShape = new Shape(_vm); +		_suspectPhotoShape->readFromContainer("photos.shp", _suspectPhotoShapeId); +	} +} + +void KIASectionCrimes::nextCrime() { +	if (_crimesFoundCount >= 2) { +		while (true) { +			++_crimeSelected; +			if (_crimeSelected >= (int)_vm->_gameInfo->getCrimeCount()){ +				_crimeSelected = 0; +			} + +			if (_crimesFound[_crimeSelected]) { +				selectCrime(_crimeSelected); +				break; +			} +		} +	} +} + +void KIASectionCrimes::prevCrime() { +	if (_crimesFoundCount >= 2) { +		while (true) { +			--_crimeSelected; +			if (_crimeSelected < 0) { +				_crimeSelected = _vm->_gameInfo->getCrimeCount() - 1; +			} + +			if (_crimesFound[_crimeSelected]) { +				selectCrime(_crimeSelected); +				break; +			} +		} +	} +} + +void KIASectionCrimes::nextSuspect() { +	if (_suspectsFoundCount >= 2) { +		while (true) { +			++_suspectSelected; +			if (_suspectSelected >= (int)_vm->_gameInfo->getSuspectCount()){ +				_suspectSelected = 0; +			} + +			if (_suspectsFound[_suspectSelected]) { +				updateSuspectPhoto(); +				break; +			} +		} +	} +} + +void KIASectionCrimes::prevSuspect() { +	if (_suspectsFoundCount >= 2) { +		while (true) { +			--_suspectSelected; +			if (_suspectSelected < 0){ +				_suspectSelected = _vm->_gameInfo->getSuspectCount() - 1; +			} + +			if (_suspectsFound[_suspectSelected]) { +				updateSuspectPhoto(); +				break; +			} +		} +	}  }  } // End of namespace BladeRunner diff --git a/engines/bladerunner/ui/kia_section_crimes.h b/engines/bladerunner/ui/kia_section_crimes.h index befe5e528c..1ca60eb02b 100644 --- a/engines/bladerunner/ui/kia_section_crimes.h +++ b/engines/bladerunner/ui/kia_section_crimes.h @@ -26,6 +26,8 @@  #include "bladerunner/shape.h"  #include "bladerunner/ui/kia_section_base.h" +#include "common/array.h" +  namespace BladeRunner {  class ActorClues; @@ -35,46 +37,78 @@ class UIImagePicker;  class UIScrollBox;  class KIASectionCrimes : public KIASectionBase { -	struct Clue -	{ +	// _vm->_gameInfo->getClueCount() +	static const int kClueCount = 288; + +	struct AcquiredClue {  		int clueId;  		int actorId;  	}; -protected: +	bool  _isOpen; -	UIContainer *_uiContainer; -	// void (__cdecl **scrollboxCallback)(int, UIScrollBoxStruc *, int, int); -	int _isOpen; -	int *_list; -	UIImagePicker *_uiImagePicker; +	UIContainer   *_uiContainer; +	UIImagePicker *_buttons; +	UIScrollBox   *_cluesScrollBox; -	UIScrollBox *_cluesScrollbox;  	ActorClues *_clues; -	int _clueInfoCount; -	Clue _clueInfo[1000]; -	int _selectedCrimeId; -	int _crimesFoundCount; -	int *_crimeIsKnown; -	int _selectedSuspectId; -	int _suspectsFoundCount; -	int *_suspectIsKnown; -	int *_suspectHasIdentity; -	int _mouseX; -	int _mouseY; -	int _suspectPhotoShapeId; -	int _field_15; -	Shape _shape; + +	int          _acquiredClueCount; +	AcquiredClue _acquiredClues[kClueCount]; + +	int                 _crimeSelected; + +	int                 _crimesFoundCount; +	Common::Array<bool> _crimesFound; + +	int                 _suspectsFoundCount; +	Common::Array<bool> _suspectsFound; +	Common::Array<bool> _suspectsWithIdentity; + +	int   _mouseX; +	int   _mouseY; + +	int    _suspectPhotoShapeId; +	Shape *_suspectPhotoShape;  public: -	KIASectionCrimes(BladeRunnerEngine *vm); +	int                 _suspectSelected; + +public: +	KIASectionCrimes(BladeRunnerEngine *vm, ActorClues *clues);  	~KIASectionCrimes(); -	void saveToLog() {} -	void loadFromLog() {} +	void open(); +	void close(); + +	void draw(Graphics::Surface &surface); + +	void handleMouseMove(int mouseX, int mouseY); +	void handleMouseDown(bool mainButton); +	void handleMouseUp(bool mainButton); + +	void saveToLog(); +	void loadFromLog(); + +	void selectCrime(int crimeId); + +private: +	static void scrollBoxCallback(void *callbackData, void *source, int lineData, int mouseButton); +	static void mouseUpCallback(int buttonId, void *callbackData); + +	void onButtonPressed(int buttonId); + +	void populateAcquiredClues(); +	void populateCrimes(); +	void populateSuspects(); +	void populateVisibleClues(); +	void updateSuspectPhoto(); -protected: +	void nextCrime(); +	void prevCrime(); +	void nextSuspect(); +	void prevSuspect();  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/ui/kia_section_suspects.cpp b/engines/bladerunner/ui/kia_section_suspects.cpp new file mode 100644 index 0000000000..ce13243f76 --- /dev/null +++ b/engines/bladerunner/ui/kia_section_suspects.cpp @@ -0,0 +1,555 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "bladerunner/ui/kia_section_suspects.h" + +#include "bladerunner/actor_clues.h" +#include "bladerunner/audio_player.h" +#include "bladerunner/bladerunner.h" +#include "bladerunner/crimes_database.h" +#include "bladerunner/font.h" +#include "bladerunner/game_constants.h" +#include "bladerunner/game_flags.h" +#include "bladerunner/game_info.h" +#include "bladerunner/shape.h" +#include "bladerunner/script/kia.h" +#include "bladerunner/suspects_database.h" +#include "bladerunner/text_resource.h" +#include "bladerunner/ui/kia.h" +#include "bladerunner/ui/kia_log.h" +#include "bladerunner/ui/kia_shapes.h" +#include "bladerunner/ui/ui_check_box.h" +#include "bladerunner/ui/ui_container.h" +#include "bladerunner/ui/ui_image_picker.h" +#include "bladerunner/ui/ui_scroll_box.h" + + +#include "graphics/surface.h" + +namespace BladeRunner { + +KIASectionSuspects::KIASectionSuspects(BladeRunnerEngine *vm, ActorClues *clues) : KIASectionBase(vm) { +	_uiContainer = new UIContainer(_vm); +	_isOpen = false; +	_clues = clues; + +	_mouseX = 0; +	_mouseY = 0; + +	_whereaboutsFilter  = true; +	_MOFilter           = true; +	_replicantFilter    = true; +	_nonReplicantFilter = true; +	_othersFilter       = true; + +	_buttons = new UIImagePicker(_vm, 4); + +	_whereaboutsCheckBox  = new UICheckBox(_vm, checkBoxCallback, this, Common::Rect(142, 318, 275, 328), 1, _whereaboutsFilter); +	_MOCheckBox           = new UICheckBox(_vm, checkBoxCallback, this, Common::Rect(142, 328, 275, 338), 1, _MOFilter); +	_replicantCheckBox    = new UICheckBox(_vm, checkBoxCallback, this, Common::Rect(142, 338, 275, 348), 1, _replicantFilter); +	_nonReplicantCheckBox = new UICheckBox(_vm, checkBoxCallback, this, Common::Rect(142, 348, 275, 358), 1, _nonReplicantFilter); +	_othersCheckBox       = new UICheckBox(_vm, checkBoxCallback, this, Common::Rect(142, 358, 275, 368), 1, _othersFilter); +	_cluesScrollBox       = new UIScrollBox(_vm, scrollBoxCallback, this,_vm->_gameInfo->getClueCount(), 1, false, Common::Rect(312, 172, 500, 376), Common::Rect(506, 160, 506, 394)); +	_crimesScrollBox      = new UIScrollBox(_vm, scrollBoxCallback, this, 50, 1, false, Common::Rect(154, 258, 291, 298), Common::Rect(120, 249, 120, 297)); +	_uiContainer->add(_whereaboutsCheckBox); +	_uiContainer->add(_MOCheckBox); +	_uiContainer->add(_replicantCheckBox); +	_uiContainer->add(_nonReplicantCheckBox); +	_uiContainer->add(_othersCheckBox); +	_uiContainer->add(_cluesScrollBox); +	_uiContainer->add(_crimesScrollBox); + +	_acquiredClueCount = 0; + +	_suspectSelected = -1; +	_suspectPhotoShapeId = -1; +	_suspectPhotoShape = nullptr; +	_suspectsFoundCount = 0; +	_suspectsFound.resize(_vm->_gameInfo->getSuspectCount()); +	_suspectsWithIdentity.resize(_vm->_gameInfo->getSuspectCount()); + +	_crimeSelected = -1; +} + +KIASectionSuspects::~KIASectionSuspects() { +	delete _suspectPhotoShape; + +	_uiContainer->clear(); + +	delete _crimesScrollBox; +	delete _cluesScrollBox; +	delete _othersCheckBox; +	delete _nonReplicantCheckBox; +	delete _replicantCheckBox; +	delete _MOCheckBox; +	delete _whereaboutsCheckBox; +	delete _buttons; +	delete _uiContainer; +} + +void KIASectionSuspects::open() { +	_scheduledSwitch = false; + +	_buttons->resetImages(); +	_buttons->defineImage(0, Common::Rect(142, 380, 191, 395), _vm->_kia->_shapes->get(79), _vm->_kia->_shapes->get(80), _vm->_kia->_shapes->get(81), _vm->_textKIA->getText(30)); +	_buttons->defineImage(1, Common::Rect(193, 380, 242, 395), _vm->_kia->_shapes->get(76), _vm->_kia->_shapes->get(77), _vm->_kia->_shapes->get(77), _vm->_textKIA->getText(31)); +	_buttons->defineImage(2, Common::Rect(354, 128, 404, 144), nullptr, _vm->_kia->_shapes->get(30), _vm->_kia->_shapes->get(34), _vm->_textKIA->getText(32)); +	_buttons->defineImage(3, Common::Rect(424, 128, 474, 144), nullptr, _vm->_kia->_shapes->get(31), _vm->_kia->_shapes->get(35), _vm->_textKIA->getText(33)); +	_buttons->activate(nullptr, nullptr, nullptr, mouseUpCallback, this); + +	_cluesScrollBox->show(); +	_crimesScrollBox->show(); +	_whereaboutsCheckBox->enable(); +	_MOCheckBox->enable(); +	_replicantCheckBox->enable(); +	_nonReplicantCheckBox->enable(); +	_othersCheckBox->enable(); +	_cluesScrollBox->show(); +	_crimesScrollBox->show(); + +	populateAcquiredClues(); +	populateSuspects(); +	populateCrimes(); +	populateVisibleClues(); +	updateSuspectPhoto(); + +	_isOpen = true; +} + +void KIASectionSuspects::close() { +	if (!_isOpen) { +		return; +	} +	_isOpen = false; +	_buttons->deactivate(); +	_cluesScrollBox->hide(); +	if (_suspectPhotoShapeId != -1) { +		delete _suspectPhotoShape; +		_suspectPhotoShape = nullptr; +		_suspectPhotoShapeId = -1; +	} +} + +void KIASectionSuspects::draw(Graphics::Surface &surface) { +	const char *text = nullptr; +	if (_suspectPhotoShapeId != -1) { +		_suspectPhotoShape->draw(surface, 142, 150); +	} +	if (_suspectPhotoShapeId == 14 || _suspectPhotoShapeId == 13) { +		text = _vm->_textKIA->getText(49); +		_vm->_mainFont->drawColor(text, surface, 190 - _vm->_mainFont->getTextWidth(text) / 2, 201, 0x7FFF); +	} + +	_whereaboutsCheckBox->setChecked(_whereaboutsFilter); +	_MOCheckBox->setChecked(_MOFilter); +	_replicantCheckBox->setChecked(_replicantFilter); +	_nonReplicantCheckBox->setChecked(_nonReplicantFilter); +	_othersCheckBox->setChecked(_othersFilter); + +	_uiContainer->draw(surface); + + +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(0),  surface, 300, 162, 0x77DF); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(46), surface, 142, 248, 0x77DF); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(47), surface, 142, 308, 0x77DF); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(14), surface, 154, 319, 0x25B3); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(15), surface, 154, 329, 0x31F7); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(16), surface, 154, 339, 0x3A5B); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(17), surface, 154, 349, 0x31F7); +	_vm->_mainFont->drawColor(_vm->_textKIA->getText(48), surface, 154, 359, 0x25B3); + + +	surface.fillRect(Common::Rect(120, 134, 250, 145), 0); +	surface.hLine(120, 133, 250, 0x18A5); +	surface.hLine(120, 146, 250, 0x2D4C); +	surface.vLine(119, 134, 145, 0x18A5); +	surface.vLine(251, 134, 145, 0x2D4C); +	surface.hLine(251, 146, 251, 0x2509); + +	char generatedText[64]; +	if (_suspectSelected == -1) { +		text = _vm->_textKIA->getText(22); +	} else { +		const char *suspectName = _vm->_suspectsDatabase->get(_suspectSelected)->getName(); +		if (_suspectsWithIdentity[_suspectSelected]) { +			text = suspectName; +		} else if (_vm->_suspectsDatabase->get(_suspectSelected)->getSex()) { +			sprintf(generatedText, "%s %s", _vm->_textKIA->getText(20), scrambleSuspectsName(suspectName)); +			text = generatedText; +		} else { +			sprintf(generatedText, "%s %s", _vm->_textKIA->getText(21), scrambleSuspectsName(suspectName)); +			text = generatedText; +		} +	} + +	_vm->_mainFont->drawColor(text, surface, 185 - _vm->_mainFont->getTextWidth(text) / 2, 136, 0x46BF); + +	_buttons->draw(surface); +	_buttons->drawTooltip(surface, _mouseX, _mouseY); +} + +void KIASectionSuspects::handleMouseMove(int mouseX, int mouseY) { +	_mouseX = mouseX; +	_mouseY = mouseY; +	_buttons->handleMouseAction(mouseX, mouseY, false, false, false); +	_uiContainer->handleMouseMove(mouseX, mouseY); +} + +void KIASectionSuspects::handleMouseDown(bool mainButton) { +	if (mainButton) { +		_buttons->handleMouseAction(_mouseX, _mouseY, true, false, false); +	} +	_uiContainer->handleMouseDown(!mainButton); +} + +void KIASectionSuspects::handleMouseUp(bool mainButton) { +	if (mainButton) { +		_buttons->handleMouseAction(_mouseX, _mouseY, false, true, false); +	} +	_uiContainer->handleMouseUp(!mainButton); +} + +void KIASectionSuspects::saveToLog() { +	int data[] = { +		_crimeSelected, +		_suspectSelected, +		_whereaboutsFilter, +		_MOFilter, +		_replicantFilter, +		_nonReplicantFilter, +		_othersFilter +	}; +	_vm->_kia->_log->add(1, sizeof(data), &data); +} + +void KIASectionSuspects::loadFromLog() { +	const int *data = (const int*)_vm->_kia->_log->getCurrentData(); +	_crimeSelected = data[0]; +	_suspectSelected = data[1]; +	_whereaboutsFilter = data[2]; +	_MOFilter = data[3]; +	_replicantFilter = data[4]; +	_nonReplicantFilter = data[5]; +	_othersFilter = data[6]; +	populateCrimes(); +	populateVisibleClues(); +} + +void KIASectionSuspects::selectSuspect(int suspectId) { +	_suspectSelected = suspectId; +	populateCrimes(); +	populateVisibleClues(); +	updateSuspectPhoto(); +} + +const char *KIASectionSuspects::scrambleSuspectsName(const char *name) { +	static char buffer[32]; + +	char *bufferPtr = buffer; +	const char *namePtr = name; + +	for (int i = 0 ; i < 6; ++i) { +		if (Common::isAlpha(*namePtr)) { +			char upper = toupper(*namePtr); +			if ( upper < 'J' ){ +				*bufferPtr++ = upper - 16; +			} else { +				*bufferPtr++ = upper - 9; +			} +		} else { +			*bufferPtr++ = '0'; +		} +		if (*namePtr) { +			++namePtr; +		} +		if (i == 1) { +			*bufferPtr++ = '-'; +		} +	} +	*bufferPtr = 0; +	return buffer; +} + +void KIASectionSuspects::scrollBoxCallback(void *callbackData, void *source, int lineData, int mouseButton) { +	KIASectionSuspects *self = (KIASectionSuspects *)callbackData; + +	if (source == self->_cluesScrollBox && lineData >= 0) { +		if (mouseButton) { +			if (self->_vm->_gameFlags->query(kFlagKIAPrivacyAddon)) { +				self->_vm->_audioPlayer->playAud(self->_vm->_gameInfo->getSfxTrack(511), 70, 0, 0, 50, 0); + +				if (self->_clues->isPrivate(lineData)) { +					self->_clues->setPrivate(lineData, false); +					self->_cluesScrollBox->resetFlags(lineData, 0x08); +				} else { +					self->_clues->setPrivate(lineData, true); +					self->_cluesScrollBox->setFlags(lineData, 0x08); +				} +			} +		} else { +			self->_clues->setViewed(lineData, true); +			self->_cluesScrollBox->resetHighlight(lineData); +			self->_vm->_kia->_script->playClueAssetScript(0, lineData); +		} +	} else if (source == self->_crimesScrollBox && lineData >= 0 && !mouseButton) { +		self->_crimeSelected = lineData - 5; +		self->_scheduledSwitch = true; +	} +} + +void KIASectionSuspects::checkBoxCallback(void *callbackData, void *source) { +	KIASectionSuspects *self = (KIASectionSuspects *)callbackData; +	UICheckBox *checkBox = (UICheckBox *)source; + +	if (checkBox == self->_whereaboutsCheckBox) { +		self->_whereaboutsFilter = checkBox->_isChecked; +	} else if (checkBox == self->_MOCheckBox) { +		self->_MOFilter = checkBox->_isChecked; +	} else if (checkBox == self->_replicantCheckBox) { +		self->_replicantFilter = checkBox->_isChecked; +	} else if (checkBox == self->_nonReplicantCheckBox) { +		self->_nonReplicantFilter = checkBox->_isChecked; +	} else if (checkBox == self->_othersCheckBox) { +		self->_othersFilter = checkBox->_isChecked; +	} +	self->populateVisibleClues(); +} + +void KIASectionSuspects::mouseUpCallback(int buttonId, void *callbackData) { +	((KIASectionSuspects *)callbackData)->onButtonPressed(buttonId); +} + +void KIASectionSuspects::onButtonPressed(int buttonId) { +	switch (buttonId) { +		case 0: +			enableAllFilters(); +			break; +		case 1: +			disableAllFilters(); +			break; +		case 2: +			prevSuspect(); +			break; +		case 3: +			nextSuspect(); +			break; +	} +} + +void KIASectionSuspects::populateAcquiredClues() { +	_acquiredClueCount = 0; +	for (int i = 0; i < kClueCount; ++i) { +		if (_clues->isAcquired(i)) { +			_acquiredClues[_acquiredClueCount].clueId = i; +			_acquiredClues[_acquiredClueCount].actorId = _clues->getFromActorId(i); +			++_acquiredClueCount; +		} +	} +	// sort clues by name, is it necessary +} + +void KIASectionSuspects::populateSuspects() { +	int firstSuspect = -1; +	int suspectCount = _vm->_gameInfo->getSuspectCount(); + +	for (int i = 0; i < suspectCount; ++i) { +		_suspectsFound[i] = false; +		_suspectsWithIdentity[i] = false; +	} + +	_suspectsFoundCount = 0; + +	if (!_acquiredClueCount) { +		return; +	} + +	for (int i = 0; i < suspectCount; ++i) { +		for (int j = 0; j < _acquiredClueCount; ++j) { +			if (_vm->_crimesDatabase->getCrime(_acquiredClues[j].clueId) != -1 +			 && _vm->_suspectsDatabase->get(i)->hasClue(_acquiredClues[j].clueId) +			) { +				if (firstSuspect == -1) { +					firstSuspect = i; +				} +				_suspectsFound[i] = true; +				++_suspectsFoundCount; +			} +		} + +		if (_suspectsFound[i]) { +			for (int j = 0; j < _acquiredClueCount; ++j) { +				if (_vm->_suspectsDatabase->get(i)->hasIdentityClue(_acquiredClues[j].clueId)) { +					_suspectsWithIdentity[i] = true; +				} +			} +		} +	} + +	if (_suspectsFoundCount && _suspectSelected == -1) { +		_suspectSelected = firstSuspect; +	} +} + +void KIASectionSuspects::populateCrimes() { +	_crimesScrollBox->clearLines(); +	if (_suspectsFoundCount > 0 && _suspectSelected != -1) { +		for (int i = 0; i < (int)_vm->_gameInfo->getCrimeCount(); ++i) { +			for (int j = 0; j < _acquiredClueCount; ++j) { +				if (_vm->_crimesDatabase->getCrime(_acquiredClues[j].clueId) == i +				 && _vm->_suspectsDatabase->get(_suspectSelected)->hasClue(_acquiredClues[j].clueId)) { +					_crimesScrollBox->addLine(_vm->_textCrimes->getText(i), i + 5, 0); +					break; +				} +			} +		} +		_crimesScrollBox->sortLines(); +	} +} + +void KIASectionSuspects::populateVisibleClues() { +	_cluesScrollBox->clearLines(); +	if (_suspectsFoundCount > 0 && _suspectSelected != -1) { +		for (int i = 0; i < _acquiredClueCount; ++i) { +			int clueId = _acquiredClues[i].clueId; + +			if (_vm->_crimesDatabase->getAssetType(i) != -1) { +				SuspectDatabaseEntry *suspect = _vm->_suspectsDatabase->get(_suspectSelected); + +				bool showClue = false; + +				if (_whereaboutsFilter && suspect->hasWhereaboutsClue(clueId)) { +					showClue = true; +				} else if (_MOFilter && suspect->hasMOClue(clueId)) { +					showClue = true; +				} else if (_replicantFilter && suspect->hasReplicantClue(clueId)) { +					showClue = true; +				} else if (_nonReplicantFilter && suspect->hasNonReplicantClue(clueId)) { +					showClue = true; +				} else if (_othersFilter && suspect->hasOtherClue(clueId)) { +					showClue = true; +				} + +				if (showClue) { +					int flags = 0x30; +					if (_clues->isPrivate(clueId)) { +						flags = 0x08; +					} else if (_clues->isViewed(clueId)) { +						flags = 0x10; +					} +					_cluesScrollBox->addLine(_vm->_crimesDatabase->getClueText(clueId), clueId, flags); +				} +			} +		} +		_cluesScrollBox->sortLines(); +	} +} + +void KIASectionSuspects::updateSuspectPhoto() { +	if (_suspectPhotoShapeId != -1) { +		delete _suspectPhotoShape; +		_suspectPhotoShape = nullptr; +	} + +	if (_suspectSelected == -1) { +		_suspectPhotoShapeId = -1; +		return; +	} + +	SuspectDatabaseEntry *suspect = _vm->_suspectsDatabase->get(_suspectSelected); + +	_suspectPhotoShapeId = -1; +	int photoCluesCount = suspect->getPhotoCount(); +	if (photoCluesCount > 0) { +		for (int i = 0 ; i < photoCluesCount; i++) { +			//TODO: weird stuff going on here... it's using index instead id, also some field is used but its always -1 +			if (_clues->isAcquired(suspect->getPhotoClueId(i))) { +				_suspectPhotoShapeId = suspect->getPhotoShapeId(i); +				break; +			} +		} +	} + +	if (_suspectPhotoShapeId == -1) { +		if (suspect->getSex()) { +			_suspectPhotoShapeId = 14; +		} else { +			_suspectPhotoShapeId = 13; +		} +	} + +	if (_suspectPhotoShapeId != -1) { +		_suspectPhotoShape = new Shape(_vm); +		_suspectPhotoShape->readFromContainer("photos.shp", _suspectPhotoShapeId); +	} +} + +void KIASectionSuspects::nextSuspect() { +	if (_suspectsFoundCount >= 2) { +		while (true) { +			++_suspectSelected; +			if (_suspectSelected >= (int)_vm->_gameInfo->getSuspectCount()){ +				_suspectSelected = 0; +			} + +			if (_suspectsFound[_suspectSelected]) { +				selectSuspect(_suspectSelected); +				break; +			} +		} +	} +} + +void KIASectionSuspects::prevSuspect() { +	if (_suspectsFoundCount >= 2) { +		while (true) { +			--_suspectSelected; +			if (_suspectSelected < 0){ +				_suspectSelected = _vm->_gameInfo->getSuspectCount() - 1; +			} + +			if (_suspectsFound[_suspectSelected]) { +				selectSuspect(_suspectSelected); +				break; +			} +		} +	} +} + +void KIASectionSuspects::enableAllFilters() { +	_whereaboutsFilter = true; +	_MOFilter = true; +	_replicantFilter = true; +	_nonReplicantFilter = true; +	_othersFilter = true; +	populateVisibleClues(); +} + +void KIASectionSuspects::disableAllFilters() { +	_whereaboutsFilter = false; +	_MOFilter = false; +	_replicantFilter = false; +	_nonReplicantFilter = false; +	_othersFilter = false; +	populateVisibleClues(); +} + +} // End of namespace BladeRunner diff --git a/engines/bladerunner/ui/kia_section_suspects.h b/engines/bladerunner/ui/kia_section_suspects.h index 94cf1bfc06..0cc957f609 100644 --- a/engines/bladerunner/ui/kia_section_suspects.h +++ b/engines/bladerunner/ui/kia_section_suspects.h @@ -25,15 +25,102 @@  #include "bladerunner/ui/kia_section_base.h" +#include "common/array.h" +  namespace BladeRunner { +class ActorClues; +class BladeRunnerEngine; +class Shape; +class UICheckBox; +class UIContainer; +class UIImagePicker; +class UIScrollBox; +  class KIASectionSuspects : public KIASectionBase { +	// _vm->_gameInfo->getClueCount() +	static const int kClueCount = 288; + +	struct AcquiredClue { +		int clueId; +		int actorId; +	}; + +	bool           _isOpen; + +	UIContainer     *_uiContainer; +	UIImagePicker   *_buttons; +	UIScrollBox     *_cluesScrollBox; +	UIScrollBox     *_crimesScrollBox; +	UICheckBox      *_whereaboutsCheckBox; +	UICheckBox      *_MOCheckBox; +	UICheckBox      *_replicantCheckBox; +	UICheckBox      *_nonReplicantCheckBox; +	UICheckBox      *_othersCheckBox; + +	bool _whereaboutsFilter; +	bool _MOFilter; +	bool _replicantFilter; +	bool _nonReplicantFilter; +	bool _othersFilter; + +	ActorClues    *_clues; + +	int            _acquiredClueCount; +	AcquiredClue   _acquiredClues[kClueCount]; + +	int                 _suspectSelected; +	int                 _suspectsFoundCount; +	Common::Array<bool> _suspectsFound; +	Common::Array<bool> _suspectsWithIdentity; + +	int   _mouseX; +	int   _mouseY; + +	int    _suspectPhotoShapeId; +	Shape *_suspectPhotoShape;  public: -	KIASectionSuspects(BladeRunnerEngine *vm): KIASectionBase(vm) {} +	int                 _crimeSelected; + +public: +	KIASectionSuspects(BladeRunnerEngine *vm, ActorClues *clues); +	~KIASectionSuspects(); + +	void open(); +	void close(); + +	void draw(Graphics::Surface &surface); + +	void handleMouseMove(int mouseX, int mouseY); +	void handleMouseDown(bool mainButton); +	void handleMouseUp(bool mainButton); + +	void saveToLog(); +	void loadFromLog(); + +	void selectSuspect(int suspectId); + +	static const char *scrambleSuspectsName(const char *name); + +private: +	static void scrollBoxCallback(void *callbackData, void *source, int lineData, int mouseButton); +	static void checkBoxCallback(void *callbackData, void *source); +	static void mouseUpCallback(int buttonId, void *callbackData); + +	void onButtonPressed(int buttonId); + +	void populateAcquiredClues(); +	void populateSuspects(); +	void populateCrimes(); +	void populateVisibleClues(); +	void updateSuspectPhoto(); + +	void nextSuspect(); +	void prevSuspect(); -	void saveToLog() {} -	void loadFromLog() {} +	void enableAllFilters(); +	void disableAllFilters();  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/ui/spinner.cpp b/engines/bladerunner/ui/spinner.cpp index 9018de15e6..cc913e3a9c 100644 --- a/engines/bladerunner/ui/spinner.cpp +++ b/engines/bladerunner/ui/spinner.cpp @@ -61,41 +61,6 @@ bool Spinner::querySelectableDestinationFlag(int destination) const {  	return _isDestinationSelectable[destination];  } -const Spinner::Destination Spinner::kSpinnerDestinationsNear[] = { -	{  0, Common::Rect(210, 263, 263, 332) }, -	{  1, Common::Rect(307, 330, 361, 381) }, -	{  2, Common::Rect(338, 137, 362, 169) }, -	{  3, Common::Rect(248, 135, 289, 168) }, -	{  4, Common::Rect(352, 222, 379, 238) }, -	{ -1, Common::Rect(-1,-1,-1,-1) } -}; - -const Spinner::Destination Spinner::kSpinnerDestinationsMedium[] = { -	{  0, Common::Rect(252, 242, 279, 283) }, -	{  1, Common::Rect(301, 273, 328, 304) }, -	{  2, Common::Rect(319, 182, 336, 200) }, -	{  3, Common::Rect(269, 181, 293, 200) }, -	{  4, Common::Rect(325, 227, 345, 240) }, -	{  5, Common::Rect(259,  74, 380, 119) }, -	{  6, Common::Rect(203, 124, 224, 136) }, -	{  7, Common::Rect(200, 147, 222, 170) }, -	{ -1, Common::Rect(-1,-1,-1,-1) } -}; - -const Spinner::Destination Spinner::kSpinnerDestinationsFar[] = { -	{  0, Common::Rect(220, 227, 246, 262) }, -	{  1, Common::Rect(260, 252, 286, 279) }, -	{  2, Common::Rect(286, 178, 302, 196) }, -	{  3, Common::Rect(244, 178, 263, 195) }, -	{  4, Common::Rect(288, 216, 306, 228) }, -	{  5, Common::Rect(249,  77, 353, 124) }, -	{  6, Common::Rect(190, 127, 208, 138) }, -	{  7, Common::Rect(185, 149, 206, 170) }, -	{  8, Common::Rect(398, 249, 419, 268) }, -	{  9, Common::Rect(390, 218, 419, 236) }, -	{ -1, Common::Rect(-1, -1, -1, -1) } -}; -  int Spinner::chooseDestination(int loopId, bool immediately) {  	_selectedDestination = 0;  	if (!_vm->openArchive("MODE.MIX")) { @@ -137,17 +102,17 @@ int Spinner::chooseDestination(int loopId, bool immediately) {  	mapmask = 1;  	if (mapmask & 4) { -		_destinations = kSpinnerDestinationsFar; +		_destinations = getDestinationsFar();  		firstShapeId = 26;  		shapeCount = 20;  		spinnerLoopId = 4;  	} else if (mapmask & 2) { -		_destinations = kSpinnerDestinationsMedium; +		_destinations = getDestinationsMedium();  		firstShapeId = 10;  		shapeCount = 16;  		spinnerLoopId = 2;  	} else if (mapmask & 1) { -		_destinations = kSpinnerDestinationsNear; +		_destinations = getDestinationsNear();  		firstShapeId = 0;  		shapeCount = 10;  		spinnerLoopId = 0; @@ -300,4 +265,48 @@ void Spinner::resume() {  	_vqaPlayer->setLoop(1, -1, kLoopSetModeJustStart, nullptr, nullptr);  } +const Spinner::Destination *Spinner::getDestinationsFar() { +	static const Destination destinations[] = { +		{  0, Common::Rect(220, 227, 246, 262) }, +		{  1, Common::Rect(260, 252, 286, 279) }, +		{  2, Common::Rect(286, 178, 302, 196) }, +		{  3, Common::Rect(244, 178, 263, 195) }, +		{  4, Common::Rect(288, 216, 306, 228) }, +		{  5, Common::Rect(249,  77, 353, 124) }, +		{  6, Common::Rect(190, 127, 208, 138) }, +		{  7, Common::Rect(185, 149, 206, 170) }, +		{  8, Common::Rect(398, 249, 419, 268) }, +		{  9, Common::Rect(390, 218, 419, 236) }, +		{ -1, Common::Rect(-1, -1, -1, -1) } +	}; +	return destinations; +} + +const Spinner::Destination *Spinner::getDestinationsMedium() { +	static const Destination destinations[] = { +		{  0, Common::Rect(252, 242, 279, 283) }, +		{  1, Common::Rect(301, 273, 328, 304) }, +		{  2, Common::Rect(319, 182, 336, 200) }, +		{  3, Common::Rect(269, 181, 293, 200) }, +		{  4, Common::Rect(325, 227, 345, 240) }, +		{  5, Common::Rect(259,  74, 380, 119) }, +		{  6, Common::Rect(203, 124, 224, 136) }, +		{  7, Common::Rect(200, 147, 222, 170) }, +		{ -1, Common::Rect(-1,-1,-1,-1) } +	}; +	return destinations; +} + +const Spinner::Destination *Spinner::getDestinationsNear() { +	static const Destination destinations[] = { +		{  0, Common::Rect(210, 263, 263, 332) }, +		{  1, Common::Rect(307, 330, 361, 381) }, +		{  2, Common::Rect(338, 137, 362, 169) }, +		{  3, Common::Rect(248, 135, 289, 168) }, +		{  4, Common::Rect(352, 222, 379, 238) }, +		{ -1, Common::Rect(-1,-1,-1,-1) } +	}; +	return destinations; +} +  } // End of namespace BladeRunner diff --git a/engines/bladerunner/ui/spinner.h b/engines/bladerunner/ui/spinner.h index ec0f8dbe33..b1785a57eb 100644 --- a/engines/bladerunner/ui/spinner.h +++ b/engines/bladerunner/ui/spinner.h @@ -33,7 +33,6 @@ class Shape;  class VQAPlayer;  class UIImagePicker; -  class Spinner {  	static const int kSpinnerDestinations = 10; @@ -42,10 +41,6 @@ class Spinner {  		Common::Rect rect;  	}; -	static const Destination kSpinnerDestinationsNear[]; -	static const Destination kSpinnerDestinationsMedium[]; -	static const Destination kSpinnerDestinationsFar[]; -  	BladeRunnerEngine      *_vm;  	bool                    _isDestinationSelectable[kSpinnerDestinations];  	bool                    _isOpen; @@ -77,6 +72,9 @@ public:  private:  	static void mouseUpCallback(int, void *); +	static const Destination *getDestinationsFar(); +	static const Destination *getDestinationsMedium(); +	static const Destination *getDestinationsNear();  };  } // End of namespace BladeRunner diff --git a/engines/bladerunner/vqa_decoder.h b/engines/bladerunner/vqa_decoder.h index 34a8ee3efc..5ba50a8c8a 100644 --- a/engines/bladerunner/vqa_decoder.h +++ b/engines/bladerunner/vqa_decoder.h @@ -218,7 +218,6 @@ private:  		uint8   *_codebook;  		uint8   *_cbfz; -		bool     _zbufChunkComplete;  		uint32   _zbufChunkSize;  		uint8   *_zbufChunk; diff --git a/engines/bladerunner/vqa_player.h b/engines/bladerunner/vqa_player.h index d1a212ae32..297f717450 100644 --- a/engines/bladerunner/vqa_player.h +++ b/engines/bladerunner/vqa_player.h @@ -49,7 +49,6 @@ class VQAPlayer {  	BladeRunnerEngine           *_vm;  	Common::SeekableReadStream  *_s;  	VQADecoder                   _decoder; -	const uint16                *_zBuffer;  	Audio::QueuingAudioStream   *_audioStream;  	int _frame; @@ -79,7 +78,6 @@ public:  		: _vm(vm),  		  _s(nullptr),  		  _decoder(surface), -		  _zBuffer(nullptr),  		  _audioStream(nullptr),  		  _frameNext(-1),  		  _frameBegin(-1),  | 
