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