26 #include "common/array.h" 27 #include "common/events.h" 28 #include "common/keyboard.h" 29 #include "common/language.h" 30 #include "common/platform.h" 31 #include "common/random.h" 32 #include "common/rect.h" 33 #include "common/scummsys.h" 35 #include "common/serializer.h" 37 #include "engines/advancedDetector.h" 38 #include "engines/engine.h" 39 #include "engines/savestate.h" 41 #include "graphics/paletteman.h" 43 #include "eem/animation.h" 45 #include "eem/mystery.h" 46 #include "eem/resource.h" 50 class TravisScrollBar;
56 const uint kPalSize = 768;
62 void setPalette(
const byte *colors, uint start, uint num)
override;
63 void grabPalette(byte *colors, uint start, uint num)
const override;
66 byte _colors[kPalSize] = {};
71 void fadeCurrentPaletteToBlack(uint delayMs = 8);
72 void fadePaletteFromBlack(
const byte *target, uint delayMs = 8);
99 kScreenInvalid = 0xFFFF,
100 kScreenInitClues = 0x00,
102 kScreenMapAlt = 0x02,
104 kScreenNotebook = 0x04,
105 kScreenGallery = 0x05,
107 kScreenAccuse = 0x07,
108 kScreenProfile = 0x08,
109 kScreenChoosePartner = 0x09,
110 kScreenChooseMystery = 0x0A,
120 kVariantLondonCD = 2,
121 kVariantMacFloppy = 3,
132 constexpr
int kScreenWidth = 320;
133 constexpr
int kScreenHeight = 200;
134 constexpr
int kMacScreenWidth = 512;
135 constexpr
int kMacScreenHeight = 384;
151 const char *getGameId()
const;
153 Variant getVariant()
const {
return _variant; }
154 bool isFloppy()
const {
return _variant == kVariantFloppy || isDemo(); }
155 bool isLondon()
const {
return _variant == kVariantLondonCD; }
156 bool isMacCD()
const {
return _variant == kVariantMacCD; }
161 bool isMacintosh()
const {
return getPlatform() == Common::kPlatformMacintosh; }
162 bool isMacTalkie()
const {
return isMacCD() || (isMacintosh() && isLondon()); }
163 bool isDemo()
const {
164 return _gameDescription && (_gameDescription->flags &
ADGF_DEMO);
166 int screenWidth()
const {
return isMacintosh() ? kMacScreenWidth : kScreenWidth; }
167 int screenHeight()
const {
return isMacintosh() ? kMacScreenHeight : kScreenHeight; }
168 int scaleX(
int x)
const {
169 return isMacintosh() ? scaleCoord(x, kMacScreenWidth, kScreenWidth) : x;
171 int scaleY(
int y)
const {
172 return isMacintosh() ? scaleCoord(y, kMacScreenHeight, kScreenHeight) : y;
174 int unscaleX(
int x)
const {
175 return isMacintosh() ? scaleCoord(x, kScreenWidth, kMacScreenWidth) : x;
177 int unscaleY(
int y)
const {
178 return isMacintosh() ? scaleCoord(y, kScreenHeight, kMacScreenHeight) : y;
185 scaleX(r.
right), scaleY(r.bottom));
195 bool isAutosave =
false)
override;
205 Variant _variant = kVariantCD;
209 bool isSpanish()
const {
return _language == Common::ES_ESP; }
211 DBDArchive &getPics() {
return _picsArchive; }
213 DBDArchive &getSites() {
return _sitesArchive; }
214 DBDArchive &getBalloons() {
return _balloonArchive; }
215 DBDArchive &getButtons() {
return _buttonArchive; }
216 Mystery &getMystery() {
return _mystery; }
217 const EEMFont &getFont()
const {
return _font; }
218 uint8 getPartnerIndex()
const {
return _partner; }
221 void setInteractiveMouseCursor(
bool active);
224 void setHotspotMouseCursor(
bool active);
229 void setSiteHotspotCursorId(
int cursorId);
232 void displayClue(
const byte *clueBlock, uint maxEntries = 32);
236 bool doPuzzle(uint puzzleId);
239 void displayFloppyHotspotDialog(uint siteNum, uint hotIdx);
241 bool floppyHotspotSearched(uint siteNum, uint hotspotIdx)
const;
247 void applyClueSideEffects(
const byte *entry);
251 bool moreInfo(
const byte *gd, uint suspectIdx,
252 const Picture &galBg,
bool haveBg);
257 void doAccuseFloppy();
261 bool doAccuseNotes();
269 void doInterfaceHelp(uint num = 0);
272 uint16 getKDTextBalloon(byte firstChar)
const;
275 uint16 fitBalloonToText(uint16 bubNum,
const Common::String &text);
279 uint getBalloonLineCapacity(uint16 balloonId,
int lineH)
const;
288 bool loadKdAnim(uint16 num,
Animation &anim,
int &px,
int &py,
296 _hasPartnerIdle = has;
297 _partnerIdleAnimId = animId;
308 bool getBalloonInsets(uint16 bubNum, uint16 &xInset, uint16 &yInset,
309 uint16 &textW)
const;
310 bool getBalloonIndicatorPos(uint16 bubNum, uint16 &dx,
314 uint16 bubNum,
int ballX,
int ballY,
320 void applyStartupTestOverrides();
321 bool areYouSureMac();
322 bool areMysteriesSolved(uint lo, uint hi)
const;
326 bool anyMysterySolved(uint lo, uint hi)
const;
331 uint mysteryTierCount()
const {
return isLondon() ? 2 : 3; }
335 bool mysteryTierRange(uint stage, uint &lo, uint &hi)
const;
337 void advanceChainStageAfterSolve(uint mysteryNum);
338 void applySkipRepeatedCasesOption();
343 void drawNotebookFrame(
int &page, TravisScrollBar *scrollBar =
nullptr);
348 uint16 niCount,
bool floppyNb,
354 struct AccuseNotesCtx {
358 const byte *bufBaseNotes;
360 int rectX, rectY, rectW, rectH;
370 TravisScrollBar *scrollBar =
nullptr;
374 Common::String accuseNoteText(uint clueId,
const AccuseNotesCtx &ctx)
const;
377 void accuseRebuildPagination(
const AccuseNotesCtx &ctx);
380 void accuseDrawScreen(
const AccuseNotesCtx &ctx);
385 void floppyKDHint(uint kdSlot,
const byte *kdIdx,
386 const byte *bufBase, uint32 mysSize);
387 void displayScrapbookExtra(uint mysteryNum);
388 void displayMacPracticeScrapbook();
389 void accuseDrawGallery(
int highlighted,
392 bool haveAccuseBg,
const Picture &accuseBg);
393 void drawGalleryFrame(
const byte *gd, uint8 numSuspects,
397 struct BigMapOverviewState {
403 struct BigMapDetailState {
430 uint32 startTick = 0;
431 uint32 lastDrawTick = 0;
432 uint32 lastCycleTick = 0;
435 bool bigMapRunOverview(BigMapOverviewState &state);
437 uint16 &mapW, uint16 &mapH);
438 void bigMapInitDetailState(BigMapDetailState &state,
440 uint16 mapW, uint16 mapH,
441 const BigMapOverviewState &overview);
442 bool bigMapRunDetail(BigMapDetailState &state);
444 BigMapDetailState &state,
445 bool &returnToOverview,
bool &dirty);
447 BigMapDetailState &state,
bool &dirty);
449 BigMapDetailState &state,
450 bool &returnToOverview,
bool &dirty);
451 bool bigMapTrySelectDetailSite(
int mouseX,
int mouseY,
452 const BigMapDetailState &state);
453 void bigMapCycleOverviewPalette(
bool mac);
454 void bigMapCycleDetailPalette(
bool mac);
455 void drawBigMapOverview(uint32 elapsedMs);
456 void drawBigMapDetail(
int scrollX,
int scrollY,
458 uint16 mapW, uint16 mapH,
460 void drawAccuseGallery(uint8 numSuspects,
const byte *gd,
469 bool loadSitePalettes();
473 void setSitePalette(uint num);
477 bool getSitePalette(uint num, byte *out)
const;
488 void blitAt(
const Picture &pic,
int x,
int y);
494 void blitAtScaled(
const Picture &pic,
int x,
int y,
int scale);
497 void waitForInput(uint32 maxMs);
507 bool playAnm(
const Common::Path &path, uint frameDelayMs = 120,
508 bool holdLastFrame =
false,
bool fadeIn =
false,
509 bool setSkipIntroOnEsc =
true,
bool showLastFrameOnSkip =
false);
514 void playFlc(
const Common::Path &path,
bool fadeIn =
false,
515 bool holdLastFrame =
false, uint16 backgroundPict = 0);
518 void interruptAudio(
bool stopMusicToo =
true);
520 void showEAKidsLogo();
521 void showHighScoreLogo();
522 void showFloppyStormLogo();
524 bool waitIntroDelay(uint32 maxMs);
525 void runMacStartup();
526 void playMacCDIntro();
527 void showMacEAKidsLogo();
528 void showMacStillLogo(uint picId, uint palId, uint holdMs,
530 void showMacTitleIntro();
532 void runLondonStartup();
533 void showMacLondonTitle();
535 bool startLondonTrainingMystery();
536 void showLondonEAKidsLogo();
537 void showStillPicture(uint picId, uint palId, uint holdMs,
538 bool playThunder =
false,
bool holdLastFrame =
false);
539 void showLondonCharSelect();
540 void playLondonInitCluesAnim(uint16 caseType,
const Picture &bg,
541 bool haveBriefingBg);
542 void playMacLondonInitCluesAnim(uint16 caseType,
const Picture &bg,
543 bool haveBriefingBg);
544 void playCdFloppyInitCluesAnim(uint16 caseType,
bool floppy,
545 const Picture &bg,
bool haveBriefingBg);
547 void doProfilePicker();
549 void doChoosePartner();
560 int doShowEnding(uint num,
bool firstPage =
true);
565 void doShowScrapbook(uint stage);
567 void doActionScreen();
568 void doCaseSelection();
573 void setupDrawScreen();
574 Common::KeyCode setupShowFullscreenPic(uint16 picId,
bool transparent);
577 void doSetupLondon();
578 void setupDrawScreenLondon();
581 void setupShowSavedConfirm();
592 void displayFloppyBriefing(
const byte *initBlock);
597 void displayFloppyDialogRecords(
const byte *rec, uint count,
598 uint lastIndicator = 0);
603 bool floppyDialogWaitForClick();
608 void startTravelMusic();
609 void finishTravelMusic(
bool skipped);
612 void waitForMusicDone(uint32 maxMs = 60000);
619 bool doLondonApproach(uint16 approachId);
623 void syncSoundSettings()
override;
627 void startLondonTravelMusic(uint8 travelKind);
628 bool playMacLondonTravelAnimation(uint8 travelKind);
630 static int scaleCoord(
int value,
int target,
int source) {
631 const bool negative = value < 0;
632 const int magnitude = negative ? -value : value;
633 const int scaled = (magnitude * target + source / 2) / source;
634 return negative ? -scaled : scaled;
643 bool _playerFemale =
false;
646 uint8 _mysteriesSolved[55] = {};
647 uint8 _chainStage = 1;
649 uint8 _pendingBookUnlock = 0;
651 bool _voiceOn =
true;
652 bool _musicOn =
true;
656 bool _profileCreatedThisSession =
false;
678 bool _skipIntro =
false;
684 bool _hasPartnerIdle =
false;
685 uint16 _partnerIdleAnimId = 0;
686 int _partnerIdleX = 0;
687 int _partnerIdleY = 0;
689 bool _interactiveMouseCursor =
false;
692 int _siteCursorId = 0;
696 int _lastSiteArrivalAnim = -1;
698 bool _restoredContentDataLoaded =
false;
709 bool shouldPlaySiteArrival(uint siteNum)
const {
710 return _lastSiteArrivalAnim != (int)siteNum;
712 void markSiteArrivalPlayed(uint siteNum) {
713 _lastSiteArrivalAnim = (int)siteNum;
715 void resetSiteArrivalState() {
716 _lastSiteArrivalAnim = -1;
718 void setSiteArrivalState(uint siteNum) {
719 _lastSiteArrivalAnim = (int)siteNum;
Definition: managed_surface.h:51
void grabPalette(byte *colors, uint start, uint num) const override
void setNextScreen(ScreenId s)
_NextScreen @ 2d5d:3f26 writer for site loop / inline screens.
Definition: eem.h:708
EngineFeature
Definition: engine.h:282
T left
Definition: rect.h:170
int getAutosaveSlot() const override
Definition: eem.h:192
Definition: advancedDetector.h:164
Definition: resource.h:48
bool isSpanish() const
Spanish floppy release.
Definition: eem.h:209
void setPalette(const byte *colors, uint start, uint num) override
T right
Definition: rect.h:171
.DBD + .DBX archive pair (PICS, SITES, ANI, BALLOON, BUTTON).
Definition: resource.h:60
Definition: animation.h:30
void setSitePaletteForSite(uint siteNum)
Public so SiteScreen can switch palettes per site.
Definition: eem.h:485
const Common::String & playerName() const
Active player name (= profile-save description).
Definition: eem.h:244
void setPartnerIdleAnim(bool has, uint16 animId, int x, int y)
Definition: eem.h:295
Add "-demo" to gameid.
Definition: advancedDetector.h:157
Definition: paletteman.h:47
Language
Definition: language.h:45