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