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 "eem/animation.h" 43 #include "eem/mystery.h" 44 #include "eem/resource.h" 52 const uint kPalSize = 768;
54 void fadeCurrentPaletteToBlack(uint delayMs = 8);
55 void fadePaletteFromBlack(
const byte *target, uint delayMs = 8);
82 kScreenInvalid = 0xFFFF,
83 kScreenInitClues = 0x00,
87 kScreenNotebook = 0x04,
88 kScreenGallery = 0x05,
91 kScreenProfile = 0x08,
92 kScreenChoosePartner = 0x09,
93 kScreenChooseMystery = 0x0A,
103 kVariantLondonCD = 2,
114 constexpr
int kScreenWidth = 320;
115 constexpr
int kScreenHeight = 200;
116 constexpr
int kMacScreenWidth = 512;
117 constexpr
int kMacScreenHeight = 384;
130 const char *getGameId()
const;
132 Variant getVariant()
const {
return _variant; }
133 bool isFloppy()
const {
return _variant == kVariantFloppy || isDemo(); }
134 bool isLondon()
const {
return _variant == kVariantLondonCD; }
139 bool isMacintosh()
const {
return getPlatform() == Common::kPlatformMacintosh; }
140 bool isDemo()
const {
143 int screenWidth()
const {
return isMacintosh() ? kMacScreenWidth : kScreenWidth; }
144 int screenHeight()
const {
return isMacintosh() ? kMacScreenHeight : kScreenHeight; }
145 int scaleX(
int x)
const {
146 return isMacintosh() ? scaleCoord(x, kMacScreenWidth, kScreenWidth) : x;
148 int scaleY(
int y)
const {
149 return isMacintosh() ? scaleCoord(y, kMacScreenHeight, kScreenHeight) : y;
151 int unscaleX(
int x)
const {
152 return isMacintosh() ? scaleCoord(x, kScreenWidth, kMacScreenWidth) : x;
154 int unscaleY(
int y)
const {
155 return isMacintosh() ? scaleCoord(y, kScreenHeight, kMacScreenHeight) : y;
162 scaleX(r.
right), scaleY(r.bottom));
172 bool isAutosave =
false)
override;
182 Variant _variant = kVariantCD;
186 bool isSpanish()
const {
return _language == Common::ES_ESP; }
188 DBDArchive &getPics() {
return _picsArchive; }
190 DBDArchive &getSites() {
return _sitesArchive; }
191 DBDArchive &getBalloons() {
return _balloonArchive; }
192 DBDArchive &getButtons() {
return _buttonArchive; }
193 Mystery &getMystery() {
return _mystery; }
194 const EEMFont &getFont()
const {
return _font; }
195 uint8 getPartnerIndex()
const {
return _partner; }
216 void displayFloppyHotspotDialog(uint siteNum, uint hotIdx);
218 bool floppyHotspotSearched(uint siteNum, uint hotspotIdx)
const;
228 bool moreInfo(
const byte *gd, uint suspectIdx,
229 const Picture &galBg,
bool haveBg);
234 void doAccuseFloppy();
273 _hasPartnerIdle = has;
274 _partnerIdleAnimId = animId;
286 uint16 &textW)
const;
287 bool getBalloonIndicatorPos(uint16 bubNum, uint16 &dx,
291 uint16 bubNum,
int ballX,
int ballY,
297 void applyStartupTestOverrides();
298 bool areMysteriesSolved(uint lo, uint hi)
const;
302 bool anyMysterySolved(uint lo, uint hi)
const;
307 uint mysteryTierCount()
const {
return isLondon() ? 2 : 3; }
311 bool mysteryTierRange(uint stage, uint &lo, uint &hi)
const;
313 void advanceChainStageAfterSolve(uint mysteryNum);
314 void applySkipRepeatedCasesOption();
319 void drawNotebookFrame(
int &page);
324 uint16 niCount,
bool floppyNb,
330 struct AccuseNotesCtx {
334 const byte *bufBaseNotes;
336 int rectX, rectY, rectW, rectH;
349 Common::String accuseNoteText(uint clueId,
const AccuseNotesCtx &ctx)
const;
352 void accuseRebuildPagination(
const AccuseNotesCtx &ctx);
355 void accuseDrawScreen(
const AccuseNotesCtx &ctx);
360 void floppyKDHint(uint kdSlot,
const byte *kdIdx,
361 const byte *bufBase, uint32 mysSize);
362 void displayScrapbookExtra(uint mysteryNum);
363 void accuseDrawGallery(
int highlighted,
366 bool haveAccuseBg,
const Picture &accuseBg);
367 void drawGalleryFrame(
const byte *gd, uint8 numSuspects,
371 struct BigMapOverviewState {
377 struct BigMapDetailState {
404 uint32 startTick = 0;
405 uint32 lastDrawTick = 0;
406 uint32 lastCycleTick = 0;
409 bool bigMapRunOverview(BigMapOverviewState &state);
411 uint16 &mapW, uint16 &mapH);
412 void bigMapInitDetailState(BigMapDetailState &state,
414 uint16 mapW, uint16 mapH,
415 const BigMapOverviewState &overview);
416 bool bigMapRunDetail(BigMapDetailState &state);
418 BigMapDetailState &state,
419 bool &returnToOverview,
bool &dirty);
421 BigMapDetailState &state,
bool &dirty);
423 BigMapDetailState &state,
424 bool &returnToOverview,
bool &dirty);
425 bool bigMapTrySelectDetailSite(
int mouseX,
int mouseY,
426 const BigMapDetailState &state);
427 void bigMapCycleOverviewPalette(
bool mac);
428 void bigMapCycleDetailPalette(
bool mac);
429 void drawBigMapOverview(uint32 elapsedMs);
430 void drawBigMapDetail(
int scrollX,
int scrollY,
432 uint16 mapW, uint16 mapH,
434 void drawAccuseGallery(uint8 numSuspects,
const byte *gd,
443 bool loadSitePalettes();
447 void setSitePalette(uint num);
451 bool getSitePalette(uint num, byte *out)
const;
462 void blitAt(
const Picture &pic,
int x,
int y);
468 void blitAtScaled(
const Picture &pic,
int x,
int y,
int scale);
471 void waitForInput(uint32 maxMs);
480 bool holdLastFrame =
false,
bool fadeIn =
false,
481 bool setSkipIntroOnEsc =
true);
488 bool holdLastFrame =
false);
491 void interruptAudio(
bool stopMusicToo =
true);
493 void showEAKidsLogo();
494 void showHighScoreLogo();
495 void showFloppyStormLogo();
497 bool waitIntroDelay(uint32 maxMs);
498 void runMacStartup();
499 void showMacEAKidsLogo();
500 void showMacStillLogo(uint picId, uint palId, uint holdMs,
502 void showMacTitleIntro();
504 void runLondonStartup();
506 bool startLondonTrainingMystery();
507 void showLondonEAKidsLogo();
508 void showLondonLogo(uint picId, uint palId, uint holdMs,
509 bool playThunder =
false);
510 void showLondonCharSelect();
511 void playLondonInitCluesAnim(uint16 caseType,
const Picture &bg,
512 bool haveBriefingBg);
513 void playCdFloppyInitCluesAnim(uint16 caseType,
bool floppy,
514 const Picture &bg,
bool haveBriefingBg);
516 void doProfilePicker();
518 void doChoosePartner();
529 int doShowEnding(uint num,
bool firstPage =
true);
534 void doShowScrapbook(uint stage);
536 void doActionScreen();
537 void doCaseSelection();
542 void setupDrawScreen();
543 Common::KeyCode setupShowFullscreenPic(uint16 picId,
bool transparent);
546 void doSetupLondon();
547 void setupDrawScreenLondon();
550 void setupShowSavedConfirm();
561 void displayFloppyBriefing(
const byte *initBlock);
566 void displayFloppyDialogRecords(
const byte *rec, uint count,
567 uint lastIndicator = 0);
572 bool floppyDialogWaitForClick();
597 static int scaleCoord(
int value,
int target,
int source) {
598 const bool negative = value < 0;
599 const int magnitude = negative ? -value : value;
600 const int scaled = (magnitude * target + source / 2) / source;
601 return negative ? -scaled : scaled;
610 bool _playerFemale =
false;
613 uint8 _mysteriesSolved[55] = {};
614 uint8 _chainStage = 1;
616 bool _voiceOn =
true;
617 bool _musicOn =
true;
621 bool _profileCreatedThisSession =
false;
641 bool _skipIntro =
false;
647 bool _hasPartnerIdle =
false;
648 uint16 _partnerIdleAnimId = 0;
649 int _partnerIdleX = 0;
650 int _partnerIdleY = 0;
652 bool _interactiveMouseCursor =
false;
655 int _siteCursorId = 0;
659 int _lastSiteArrivalAnim = -1;
661 bool _restoredContentDataLoaded =
false;
672 bool shouldPlaySiteArrival(uint siteNum)
const {
673 return _lastSiteArrivalAnim != (int)siteNum;
675 void markSiteArrivalPlayed(uint siteNum) {
676 _lastSiteArrivalAnim = (int)siteNum;
678 void resetSiteArrivalState() {
679 _lastSiteArrivalAnim = -1;
681 void setSiteArrivalState(uint siteNum) {
682 _lastSiteArrivalAnim = (int)siteNum;
Definition: managed_surface.h:51
void waitForMusicDone(uint32 maxMs=60000)
_IsMIDIPlaying spin + _StopMIDI cleanup in _DoSiteLoop.
void stopMusic()
_StopMIDI @ 20a2:0512.
uint16 fitBalloonToText(uint16 bubNum, const Common::String &text)
Pick a shorter balloon sibling when wrapped text leaves empty lines.
void applyClueSideEffects(const byte *entry)
Apply a ClueEntry's side effects (notebook, gallery, site flags).
void setNextScreen(ScreenId s)
_NextScreen @ 2d5d:3f26 writer for site loop / inline screens.
Definition: eem.h:671
EngineFeature
Definition: engine.h:258
void setInteractiveMouseCursor(bool active)
T left
Definition: rect.h:170
void setSiteHotspotCursorId(int cursorId)
Common::Error run() override
int getAutosaveSlot() const override
Definition: eem.h:169
uint getBalloonLineCapacity(uint16 balloonId, int lineH) const
void startLondonTravelMusic(uint8 travelKind)
Definition: advancedDetector.h:164
Definition: resource.h:46
void playAnm(const Common::Path &path, uint frameDelayMs=120, bool holdLastFrame=false, bool fadeIn=false, bool setSkipIntroOnEsc=true)
bool canSaveGameStateCurrently(Common::U32String *msg=nullptr) override
void syncSoundSettings() override
uint32 flags
Definition: advancedDetector.h:207
void setHotspotMouseCursor(bool active)
Interactive cursor over searchable hotspots.
bool doPuzzle(uint puzzleId)
void playFlc(const Common::Path &path, bool fadeIn=false, bool holdLastFrame=false)
bool isSpanish() const
Spanish floppy release.
Definition: eem.h:186
uint16 getKDTextBalloon(byte firstChar) const
_GetKDTextBalloon @ 1df2:0105.
T right
Definition: rect.h:171
Common::Error loadGameStream(Common::SeekableReadStream *stream) override
.DBD + .DBX archive pair (PICS, SITES, ANI, BALLOON, BUTTON).
Definition: resource.h:58
Definition: animation.h:30
void setSitePaletteForSite(uint siteNum)
Public so SiteScreen can switch palettes per site.
Definition: eem.h:459
const Common::String & playerName() const
Active player name (= profile-save description).
Definition: eem.h:221
bool loadKdAnim(uint16 num, Animation &anim, int &px, int &py, uint16 &animId)
void setPartnerIdleAnim(bool has, uint16 animId, int x, int y)
Definition: eem.h:272
Common::String parseString(const Common::String &raw, const Common::String &playerName, uint partner) const
_ParseString @ 1b66:07c3.
bool canLoadGameStateCurrently(Common::U32String *msg=nullptr) override
void doHelp()
_KDHelp @ 1560:010a + _DisplayHint @ 1560:0009.
bool getBalloonInsets(uint16 bubNum, uint16 &xInset, uint16 &yInset, uint16 &textW) const
bool doLondonApproach(uint16 approachId)
bool hasFeature(EngineFeature f) const override
void displayClue(const byte *clueBlock)
_DisplayClue @ 2404:05e6.
Add "-demo" to gameid.
Definition: advancedDetector.h:157
void doInterfaceHelp(uint num=0)
_InterfaceHelp @ 1560:0205. Walks HelpData @ 29be:00c8.
void doAccuse()
Accuse flow. _DoAccuseGallery @ 1df2:0a31 + _DisplayEnding @ 1df2:0548.
Common::Error saveGameStream(Common::WriteStream *stream, bool isAutosave=false) override
Language
Definition: language.h:45