[Scummvm-git-logs] scummvm master -> 0c930b06ed7030686c7774f18126b3d37a678d60

peterkohaut peterkohaut at users.noreply.github.com
Mon Jan 29 18:33:07 CET 2018


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

Summary:
0c930b06ed BLADERUNNER: Added KIA interfaces


Commit: 0c930b06ed7030686c7774f18126b3d37a678d60
    https://github.com/scummvm/scummvm/commit/0c930b06ed7030686c7774f18126b3d37a678d60
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2018-01-29T18:32:09+01:00

Commit Message:
BLADERUNNER: Added KIA interfaces

Crimes interface done
Suspects interface done
Added some game constants
Fixed font rendering for other languages
Fixed anoying clang warning

Changed paths:
  A engines/bladerunner/ui/kia_section_suspects.cpp
    engines/bladerunner/actor_clues.cpp
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/font.cpp
    engines/bladerunner/font.h
    engines/bladerunner/game_constants.h
    engines/bladerunner/module.mk
    engines/bladerunner/script/init.cpp
    engines/bladerunner/script/scene/rc01.cpp
    engines/bladerunner/suspects_database.cpp
    engines/bladerunner/suspects_database.h
    engines/bladerunner/ui/kia.cpp
    engines/bladerunner/ui/kia_section_base.cpp
    engines/bladerunner/ui/kia_section_base.h
    engines/bladerunner/ui/kia_section_clues.cpp
    engines/bladerunner/ui/kia_section_clues.h
    engines/bladerunner/ui/kia_section_crimes.cpp
    engines/bladerunner/ui/kia_section_crimes.h
    engines/bladerunner/ui/kia_section_suspects.h
    engines/bladerunner/ui/spinner.cpp
    engines/bladerunner/ui/spinner.h
    engines/bladerunner/vqa_decoder.h
    engines/bladerunner/vqa_player.h


diff --git a/engines/bladerunner/actor_clues.cpp b/engines/bladerunner/actor_clues.cpp
index 4e4c5d0..39fbc77 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 db2d3e8..27b7704 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 01636e8..06d5f7b 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 3af8fc2..5ae1c8e 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 e51a3de..9302520 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 043a07f..9915bc9 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 6aadb97..e74c836 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 ed11405..76ade87 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 79bf104..dd793ad 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 c0e8469..d7e9c1f 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 71db4db..c4ed089 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 09c5918..7e08a14 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 96571e5..95f025e 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 176e30d..ea69d89 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 9c8da60..25ff27b 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 74f7b55..3f6a13d 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 4cfaaed..b0b3d7c 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 befe5e5..1ca60eb 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 0000000..ce13243
--- /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 94cf1bf..0cc957f 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 9018de1..cc913e3 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 ec0f8db..b1785a5 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 34a8ee3..5ba50a8 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 d1a212a..297f717 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),





More information about the Scummvm-git-logs mailing list