[Scummvm-git-logs] scummvm master -> 9429b3892d86023735567a6f2aca1901ecf564d1
sev-
noreply at scummvm.org
Sun Jun 7 22:09:28 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
9429b3892d BOLT: Split out game code into their own folders
Commit: 9429b3892d86023735567a6f2aca1901ecf564d1
https://github.com/scummvm/scummvm/commit/9429b3892d86023735567a6f2aca1901ecf564d1
Author: N.E.C. (beholdnec at gmail.com)
Date: 2026-06-08T00:09:23+02:00
Commit Message:
BOLT: Split out game code into their own folders
Changed paths:
A engines/bolt/carnival/barker.cpp
A engines/bolt/carnival/booth.cpp
A engines/bolt/carnival/booths/fred.cpp
A engines/bolt/carnival/booths/george.cpp
A engines/bolt/carnival/booths/huck.cpp
A engines/bolt/carnival/booths/scooby.cpp
A engines/bolt/carnival/booths/topcat.cpp
A engines/bolt/carnival/booths/yogi.cpp
A engines/bolt/carnival/carnival.cpp
A engines/bolt/carnival/carnival.h
A engines/bolt/carnival/resource.cpp
A engines/bolt/crete/crete.cpp
A engines/bolt/crete/crete.h
A engines/bolt/merlin/merlin.cpp
A engines/bolt/merlin/merlin.h
R engines/bolt/barker.cpp
R engines/bolt/booth.cpp
R engines/bolt/booths/fred.cpp
R engines/bolt/booths/george.cpp
R engines/bolt/booths/huck.cpp
R engines/bolt/booths/scooby.cpp
R engines/bolt/booths/topcat.cpp
R engines/bolt/booths/yogi.cpp
engines/bolt/bolt.cpp
engines/bolt/bolt.h
engines/bolt/metaengine.cpp
engines/bolt/module.mk
engines/bolt/resource.cpp
diff --git a/engines/bolt/bolt.cpp b/engines/bolt/bolt.cpp
index 70b53368b7f..49c2e5e630d 100644
--- a/engines/bolt/bolt.cpp
+++ b/engines/bolt/bolt.cpp
@@ -39,8 +39,6 @@ BoltEngine::BoltEngine(OSystem *syst, const ADGameDescription *gameDesc) : Engin
_gameDescription(gameDesc), _randomSource("Bolt") {
g_engine = this;
_xp = new XpLib(this);
-
- initCallbacks();
}
BoltEngine::~BoltEngine() {
@@ -81,120 +79,6 @@ Common::Error BoltEngine::run() {
return Common::kNoError;
}
-void BoltEngine::boltMain() {
- byte *testAlloc;
- BarkerTable *barkerTable;
- byte *boothSprite;
-
- testAlloc = (byte *)_xp->allocMem(0x100000);
- if (!testAlloc)
- return;
-
- _xp->freeMem(testAlloc);
-
- _xp->randomize();
-
- if (allocResourceIndex()) {
- _boothsBoltLib = nullptr;
-
- if (openBOLTLib(&_boothsBoltLib, &_boothsBoltCallbacks, assetPath("booths.blt"))) {
- int16 chosenSpecId = _extendedViewport ? 0 : 1;
-
- if (_xp->setDisplaySpec(&_displayMode, &_displaySpecs[chosenSpecId])) {
- assert(_displayMode >= 0);
- _displayWidth = _displaySpecs[_displayMode].width;
- _displayHeight = _displaySpecs[_displayMode].height;
-
- // Center within 384x240 virtual coordinate space...
- _displayX = (EXTENDED_SCREEN_WIDTH - _displayWidth) / 2;
- _displayY = (EXTENDED_SCREEN_HEIGHT - _displayHeight) / 2;
-
- _xp->setCoordSpec(_displayX, _displayY, _displayWidth, _displayHeight);
-
- if (_displayMode == 0) {
- _rtfHandle = openRTF(assetPath("cc_og.av"));
- } else {
- _rtfHandle = openRTF(assetPath("cc_cr.av"));
- }
-
- if (_rtfHandle) {
- int16 boothGroupBase = _isDemo ? 0x0E00 : 0x1700;
-
- if (!_isDemo) {
- playAV(_rtfHandle, 0, _displayWidth, _displayHeight, _displayX, _displayY);
- }
-
- boothSprite = getBOLTMember(_boothsBoltLib, (_displayMode != 0) ? (boothGroupBase + 1) : (boothGroupBase + 2));
-
- _xp->setTransparency(false);
-
- displayColors(getBOLTMember(_boothsBoltLib, boothGroupBase), stFront, 0);
- displayPic(boothSprite, _displayX, _displayY, stFront);
-
- _xp->updateDisplay();
-
- displayColors(getBOLTMember(_boothsBoltLib, boothGroupBase), stBack, 0);
- displayPic(boothSprite, _displayX, _displayY, stBack);
-
- playAV(_rtfHandle, _isDemo ? 0 : 2, _displayWidth, _displayHeight, _displayX, _displayY);
-
- freeBOLTGroup(_boothsBoltLib, boothGroupBase, 1);
-
- if (getBOLTGroup(_boothsBoltLib, 0, 1)) {
- setCursorPict(memberAddr(_boothsBoltLib, 0));
-
- if (initVRam(1500)) {
- barkerTable = createBarker(2, _isDemo ? 19 : 17);
- if (barkerTable) {
- // Register booth handlers...
- registerSideShow(barkerTable, &BoltEngine::hucksBooth, 3);
- registerSideShow(barkerTable, &BoltEngine::fredsBooth, 4);
- registerSideShow(barkerTable, &BoltEngine::scoobysBooth, 5);
- registerSideShow(barkerTable, &BoltEngine::yogisBooth, 6);
- registerSideShow(barkerTable, &BoltEngine::georgesBooth, 7);
- registerSideShow(barkerTable, &BoltEngine::topCatsBooth, 8);
- registerSideShow(barkerTable, &BoltEngine::mainEntrance, 9);
- registerSideShow(barkerTable, &BoltEngine::huckGame, 10);
- registerSideShow(barkerTable, &BoltEngine::fredGame, 11);
- registerSideShow(barkerTable, &BoltEngine::scoobyGame, 12);
- registerSideShow(barkerTable, &BoltEngine::yogiGame, 13);
- registerSideShow(barkerTable, &BoltEngine::georgeGame, 14);
- registerSideShow(barkerTable, &BoltEngine::topCatGame, 15);
- registerSideShow(barkerTable, &BoltEngine::winALetter, 16);
-
- if (_isDemo) {
- registerSideShow(barkerTable, &BoltEngine::displayDemoPict, 17);
- registerSideShow(barkerTable, &BoltEngine::endDemo, 18);
- }
-
- _lettersWon = 0;
- _xp->setScreenSaverTimer(1800);
-
- // The barker function runs the main loop, starting at mainEntrance()...
- if (!checkError())
- barker(barkerTable, 9);
-
- freeBarker(barkerTable);
- }
- }
- }
- }
- }
- }
- }
-
- freeBOLTGroup(_boothsBoltLib, 0, 1);
-
- if (_boothsBoltLib != 0)
- closeBOLTLib(&_boothsBoltLib);
-
- if (_rtfHandle != nullptr)
- closeRTF(_rtfHandle);
-
- freeVRam();
- freeResourceIndex();
-}
-
void BoltEngine::setCursorPict(byte *sprite) {
byte cursorBitmap[32]; // 16x16
byte *srcPtr = getResolvedPtr(sprite, 0x12);
@@ -214,25 +98,4 @@ void BoltEngine::setCursorPict(byte *sprite) {
_xp->setCursorImage(cursorBitmap, 7, 7);
}
-int16 BoltEngine::displayDemoPict(int16 prevBooth) {
- uint32 eventData;
-
- while (_xp->getEvent(etMouseDown, &eventData) == etMouseDown);
-
- while (_xp->getEvent(etTimer, &eventData) != etTimer);
-
- _xp->stopCycle();
- _xp->setTransparency(false);
-
- int16 memberId = (_displayMode != 0) ? 0x1002 : 0x1001;
- displayPic(getBOLTMember(_boothsBoltLib, memberId), _displayX, _displayY, stFront);
- displayColors(getBOLTMember(_boothsBoltLib, 0x1000), stFront, 0);
-
- _xp->updateDisplay();
-
- while (_xp->getEvent(etMouseDown, &eventData) != etMouseDown);
-
- return prevBooth;
-}
-
} // End of namespace Bolt
diff --git a/engines/bolt/bolt.h b/engines/bolt/bolt.h
index 2a2a1b9a5f7..146f916cb40 100644
--- a/engines/bolt/bolt.h
+++ b/engines/bolt/bolt.h
@@ -53,15 +53,6 @@ typedef struct DisplaySpecs {
int16 height;
} DisplaySpecs;
-typedef int16 (BoltEngine::*SideShowHandler)(int16 prevBooth);
-
-struct BarkerTable {
- SideShowHandler *handlers;
- int16 count;
- int16 minIndex;
- int16 maxIndex;
-};
-
typedef struct BOLTHeader {
byte header[11];
byte groupCount;
@@ -312,240 +303,6 @@ typedef struct SoundInfo {
}
} SoundInfo;
-
-typedef struct FredEntityState {
- uint16 flags;
- int16 frameCountdown;
- int16 animMode;
- int16 frameIndex;
- byte *animTable;
- int16 direction;
- int32 xPos;
- int32 yPos;
- int32 prevXPos;
- int32 prevYPos;
- int16 speed;
- byte *pathTable;
- int16 pathIndex;
-
- FredEntityState() {
- flags = 0;
- frameCountdown = 0;
- animMode = 0;
- frameIndex = 0;
- animTable = nullptr;
- direction = 0;
- xPos = 0;
- yPos = 0;
- prevXPos = 0;
- prevYPos = 0;
- speed = 0;
- pathTable = nullptr;
- pathIndex = 0;
- }
-} FredEntityState;
-
-// HUCK GAME
-
-typedef struct HuckState {
- int16 levelNumber;
- int16 slotIndex[10];
- int16 levelComplete;
- int16 drawTable1[24];
- int16 drawTable2[24];
- int16 giftCount;
- int16 hasCycle;
- int16 selectionPending;
- int16 selected1Slot;
- int16 selected2Slot;
- int16 selected1SpriteId;
- int16 selected2SpriteId;
-
- HuckState() {
- levelNumber = 0;
- memset(slotIndex, 0, sizeof(slotIndex));
- levelComplete = 0;
- memset(drawTable1, 0, sizeof(drawTable1));
- memset(drawTable2, 0, sizeof(drawTable2));
- giftCount = 0;
- hasCycle = 0;
- selectionPending = 0;
- selected1Slot = 0;
- selected2Slot = 0;
- selected1SpriteId = 0;
- selected2SpriteId = 0;
- }
-} HuckState;
-
-// GEORGE GAME
-
-typedef struct GeorgeEntityState {
- uint16 flags;
- int16 frameCountdown;
- int16 animMode;
- int16 variant;
- int16 frameIndex;
- byte *animTable;
- int32 joyInput;
- int32 x;
- int32 y;
- int32 prevX;
- int32 prevY;
- int32 velX;
- int32 velY;
- int32 accelX;
- int32 accelY;
- byte *pathTable;
- int16 pathIndex;
-
- GeorgeEntityState() {
- flags = 0;
- frameCountdown = 0;
- animMode = 0;
- variant = 0;
- frameIndex = 0;
- animTable = nullptr;
- joyInput = 0;
- x = 0;
- y = 0;
- prevX = 0;
- prevY = 0;
- velX = 0;
- velY = 0;
- accelX = 0;
- accelY = 0;
- pathTable = nullptr;
- pathIndex = 0;
- }
-} GeorgeEntityState;
-
-// SCOOBY GAME
-
-typedef struct ScoobyState {
- int16 levelNumber;
- int16 slotIndex[10];
- int16 levelComplete;
- int16 wallStates[25][4];
- int16 scoobyCell;
- int16 scoobySavedCell;
- int16 leftNeighbor;
- int16 rightNeighbor;
- int16 upNeighbor;
- int16 downNeighbor;
- int16 activeLevel;
- int16 scoobyX;
- int16 scoobyY;
- int16 velocityX;
- int16 velocityY;
- int16 targetVelocityX;
- int16 targetVelocityY;
- int16 transitionTarget;
- int16 currentAnim;
- int16 direction;
- int16 spriteFrameCount;
- byte *frameData[6];
-
- ScoobyState() {
- levelNumber = 0;
-
- for (int i = 0; i < 10; i++)
- slotIndex[i] = 0;
-
- levelComplete = 0;
-
- for (int i = 0; i < 25; i++)
- for (int j = 0; j < 4; j++)
- wallStates[i][j] = 0;
-
- scoobyCell = 0;
- scoobySavedCell = 0;
- leftNeighbor = 0;
- rightNeighbor = 0;
- upNeighbor = 0;
- downNeighbor = 0;
- activeLevel = 0;
- scoobyX = 0;
- scoobyY = 0;
- velocityX = 0;
- velocityY = 0;
- targetVelocityX = 0;
- targetVelocityY = 0;
- transitionTarget = 0;
- currentAnim = 0;
- direction = 0;
- spriteFrameCount = 0;
-
- for (int i = 0; i < 6; i++)
- frameData[i] = nullptr;
- }
-} ScoobyState;
-
-typedef struct ScoobyRect {
- int16 left;
- int16 right;
- int16 top;
- int16 bottom;
-
- ScoobyRect() {
- left = 0;
- right = 0;
- top = 0;
- bottom = 0;
- }
-} ScoobyRect;
-
-// TOPCAT GAME
-
-typedef struct TopCatAnim {
- int16 animType;
- int16 animIndex;
- int16 transitionToNextQuestionFlag;
- int16 *seqPtr;
-
- TopCatAnim() {
- animType = 0;
- animIndex = 0;
- transitionToNextQuestionFlag = 0;
- seqPtr = nullptr;
- }
-} TopCatAnim;
-
-// YOGI GAME
-
-typedef struct YogiState {
- int16 levelNumber;
- int16 currentSlot;
- int16 levelIndex[10];
- int16 slotIndex[10];
- int16 levelComplete;
- int16 basketSound[24];
- int16 basketState[24];
- int16 basketCount;
- int16 matchCount;
- int16 selectionPending;
- int16 selected1Slot;
- int16 selected2Slot;
- int16 sound1;
- int16 sound2;
-
- YogiState() {
- levelNumber = 0;
- currentSlot = 0;
- memset(levelIndex, 0, sizeof(levelIndex));
- memset(slotIndex, 0, sizeof(slotIndex));
- levelComplete = 0;
- memset(basketSound, 0, sizeof(basketSound));
- memset(basketState, 0, sizeof(basketState));
- basketCount = 0;
- matchCount = 0;
- selectionPending = 0;
- selected1Slot = 0;
- selected2Slot = 0;
- sound1 = 0;
- sound2 = 0;
- }
-} YogiState;
-
class BoltEngine : public Engine {
friend class XpLib;
@@ -553,11 +310,13 @@ private:
const ADGameDescription *_gameDescription;
Common::RandomSource _randomSource;
protected:
+ // BoltEngine can only be constructed by one of the Carnival, Merlin or Crete engines.
+ BoltEngine(OSystem *syst, const ADGameDescription *gameDesc);
+
// Engine APIs
Common::Error run() override;
public:
- BoltEngine(OSystem *syst, const ADGameDescription *gameDesc);
~BoltEngine() override;
uint32 getFeatures() const;
@@ -590,106 +349,8 @@ protected:
bool _isDemo = false;
// xpMain
- void boltMain();
+ virtual void boltMain() = 0;
void setCursorPict(byte *sprite);
- int16 displayDemoPict(int16 prevBooth);
-
- // Booth
- void startCycle(byte *cycleResource);
- void displayBooth(int16 page);
- void playAVOverBooth(int16 animIndex);
- int16 hucksBooth(int16 prevBooth);
- int16 fredsBooth(int16 prevBooth);
- int16 scoobysBooth(int16 prevBooth);
- int16 yogisBooth(int16 prevBooth);
- int16 georgesBooth(int16 prevBooth);
- int16 topCatsBooth(int16 prevBooth);
- int16 mainEntrance(int16 prevBooth);
- bool loadBooth(int16 boothId);
- void unloadBooth();
- int16 openBooth(int16 boothId);
- void closeBooth();
- void playTour();
- void finishPlayingHelp(int16 activeHotspot);
- int16 hotSpotActive(int16 hotspot);
- void hoverHotSpot();
- int16 boothEventLoop();
- void resetInactivityState();
- bool handleButtonPress(int16 hotspot);
- void blastColors(byte **paletteTable, int16 index, int16 mode);
- void setColors(int16 index);
- void restoreColors(int16 index);
- void loadColors();
- void shiftColorMap(byte *colorMap, int16 delta);
- void playBoothAV();
- void mainEntranceHelpBlink();
- void boothHelpBlink();
- void tourPaletteCycleStep();
- void fadeToBlack(int16 steps);
- void flushInput();
- int16 winALetter(int16 prevBooth);
- int16 endDemo(int16 prevBooth);
-
- int16 _lettersWon = 0;
- bool _allLettersWonFlag = false;
- int _displayMode = 0;
- int32 _displayX = 0;
- int32 _displayY = 0;
- int32 _displayWidth = 0;
- int32 _displayHeight = 0;
-
- int16 _boothLoadedMask = 0;
- int16 _currentBoothScene = 0;
- int16 _boothNumHotspots = 0;
- int16 _boothNumAnimations = 0;
- byte *_boothSceneDesc = nullptr;
- byte *_boothHotPalDescs[4];
- Common::Rect _boothHotspotDescs[8];
- byte *_boothAnimDescs[7];
- byte *_boothAnimPalDescs[4];
- byte _savedPalettes[7][30];
- byte _savedHotPalettes[4][9];
- byte *_boothPalCycleData = nullptr;
- XPPicDesc _boothLetterSprite;
- bool _needInitCursorPos = true;
- byte *_boothVisitSignOn = nullptr;
- byte *_boothVisitSignOff = nullptr;
- byte _leftDoorNavTable[3] = { 3, 2, 4 };
- byte _rightDoorNavTable[3] = { 1, 0, 5 };
-
- int16 _cursorX = 0;
- int16 _cursorY = 0;
- int16 _hoveredHotspot = 0;
- uint32 _helpTimer = 0;
- int16 _keyReleased = 0;
- int16 _keyLeft = 0;
- int16 _keyRight = 0;
- int16 _keyUp = 0;
- int16 _keyDown = 0;
- int16 _helpFlag = 0;
- int16 _keyEnter = 0;
-
- int16 _tourStep = 0;
- int16 _helpPlaying = 0;
- int16 _helpIsIdle = 0;
- int16 _idleHelpAudioAvailable = 1;
-
- int16 _huckWins = 0;
- int16 _fredWins = 0;
- int16 _scoobyWins = 0;
- int16 _yogiWins = 0;
- int16 _georgeWins = 0;
- int16 _topCatWins = 0;
-
- // Barker
- BarkerTable *createBarker(int16 minIndex, int16 maxIndex);
- void freeBarker(BarkerTable *table);
- bool registerSideShow(BarkerTable *table, SideShowHandler handler, int16 boothId);
- int16 barker(BarkerTable *table, int16 startBooth);
- bool checkError();
-
- int32 _curErrorCode = 0;
- int16 _currentBoothId = 0;
// Utils
void displayColors(byte *palette, int16 page, int16 flags);
@@ -759,7 +420,7 @@ protected:
static void swapSpriteHeaderCb();
static void freeSpriteCleanUpCb();
- void initCallbacks();
+ virtual void initCallbacks() = 0;
int16 _resourceIndexCount = 1000;
uint32 **_resourceIndex = nullptr;
@@ -788,6 +449,7 @@ protected:
int32 _vramUsedBytes = 0;
byte *_allocatedMemPool = nullptr;
uint32 _allocatedMemPoolSize = 0;
+ int32 _curErrorCode = 0;
// RTF
RTFResource *openRTF(const char *fileName);
@@ -913,477 +575,6 @@ protected:
int16 _spriteScreenAY = 0;
int16 _spriteScreenBX = 0;
int16 _spriteScreenBY = 0;
-
- // --- MINIGAMES ---
-
- // --- FRED ---
- int16 fredGame(int16 prevBooth);
- bool initFred();
- void cleanUpFred();
- bool initFredLevel(int16 levelGroup, int16 palGroup);
- void termFredLevel(int16 levelGroup, int16 palGroup);
- void swapFredAnimEntry();
- void swapFredAnimDesc();
- void swapFredLevelDesc();
- int16 playFred();
- int16 helpFred();
- void hiliteFredHelpObject(byte *entry, int16 highlight);
- void helpAnimStep();
- bool spawnBalloon();
- int16 calcBalloonSpawnDelay();
- int16 selectBalloonRow();
- void setFredAnimMode(FredEntityState *state, int16 mode);
- void renderFredScene();
- void getFredSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo);
- void playFredSound(SoundInfo *oneShot, SoundInfo *loop);
- void updateFredSound();
-
- static void resolveAllRefsCb();
- static void swapFredAnimEntryCb();
- static void swapFredAnimDescCb();
- static void swapFredLevelDescCb();
-
- BOLTLib *_fredBoltLib = nullptr;
- BOLTCallbacks _fredBoltCallbacks;
-
- static BOLTCallback _fredTypeLoadCallbacks[28];
- static BOLTCallback _fredTypeFreeCallbacks[28];
-
- byte *_fredLevelPtr = nullptr;
- byte *_fredBackground = nullptr;
- byte *_fredBalloonString = nullptr;
- byte *_fredPalette = nullptr;
- byte *_fredFacingLeftRect = nullptr;
- byte *_fredFacingRightRect = nullptr;
- byte *_fredTurningRect = nullptr;
- byte *_fredBalloonRect = nullptr;
- byte *_fredHelpEntries = nullptr;
- byte *_fredPlayButton = nullptr;
- byte *_fredSprites[10] = { nullptr };
- FredEntityState **_fredEntitiesTable = nullptr;
-
- byte *_fredRowBounds = nullptr;
- byte *_fredShuffleTable = nullptr;
- byte *_fredCycleRaw = nullptr;
- byte *_fredBalloonSprite = nullptr;
- byte *_fredPathMatrix = nullptr;
- byte *_fredCurrentHelpObject = nullptr;
- byte *_fredHoveredEntry = nullptr;
-
- SoundInfo _fredSounds[4];
-
- SoundInfo *_fredCurrentSound = nullptr;
- SoundInfo *_fredLoopSound = nullptr;
- SoundInfo *_fredPendingOneShot = nullptr;
- SoundInfo *_fredPendingLoop = nullptr;
-
- FredEntityState _fredSprite;
-
- int16 _fredSaveData[3] = { 0, 0, 0 };
- int16 _fredLevelIndex = 0;
-
- int16 _fredBalloonSpawnDelay = 0;
- int16 _fredBalloonSearchIdx = 0;
- uint32 _fredTimer = 0;
- int16 _fredHelpStep = -1;
- int16 _fredShowHelp = 1;
-
- XPCycleState _fredCycleSpecs[4];
-
- // --- GEORGE ---
- int16 georgeGame(int16 prevBooth);
- bool initGeorge();
- void cleanUpGeorge();
- bool initGeorgeLevel(int16 level, int16 variant);
- void termGeorgeLevel(int16 level, int16 variant);
- void swapGeorgeFrameArray();
- void swapGeorgeHelpEntry();
- void swapGeorgeThresholds();
- int16 playGeorge();
- int16 helpGeorge();
- void hiliteGeorgeHelpObject(byte *entry, int16 highlight);
- void advanceHelpAnimation();
- bool spawnSatellite();
- int16 getRandomSatelliteWait();
- int16 getRandomAsteroidRow();
- bool confirmAsteroidHitTest();
- bool spawnAsteroid();
- int16 getRandomAsteroidWait();
- int16 getAsteroidRow();
- void setGeorgeAnimMode(GeorgeEntityState *sat, int16 mode);
- void setSatelliteAnimMode(GeorgeEntityState *sat, int16 mode, int16 variant);
- void setAsteroidAnimMode(GeorgeEntityState *sat, int16 mode, int16 variant);
- void drawFlyingObjects();
- void getGeorgeSoundInfo(BOLTLib *boltLib, int16 member, SoundInfo *outInfo, byte priority);
- void playGeorgeSound(SoundInfo *newSound, SoundInfo *nextSound);
- void updateGeorgeSound();
-
- static void swapGeorgeFrameArrayCb();
- static void swapGeorgeHelpEntryCb();
- static void swapGeorgeThresholdsCb();
-
- BOLTLib *_georgeBoltLib = nullptr;
- BOLTCallbacks _georgeBoltCallbacks;
-
- static BOLTCallback _georgeTypeLoadCallbacks[28];
- static BOLTCallback _georgeTypeFreeCallbacks[28];
-
- byte *_georgePrevActiveHelpObject = nullptr;
- byte *_georgeActiveHelpObject = nullptr;
- int16 _georgeHelpStep = -1;
- int16 _georgeHelpActive = 1;
-
- GeorgeEntityState **_georgeEntityList = nullptr;
- int16 _georgeCarIdx = 0;
- int16 _georgeNumSatellites = 0;
- int16 _georgeFirstAsteroidIdx = 0;
- int16 _georgeTotalSatellites = 0;
- byte *_georgeCarPics[3] = { nullptr };
- byte *_georgeHelpObjects = nullptr;
- byte *_georgeHelpSequence = nullptr;
- uint32 _georgeHelpTimer = 0;
- byte *_georgeSatelliteShuffleTable = nullptr;
- byte *_georgeAsteroidShuffleTable = nullptr;
- int16 *_georgeSatelliteThresholds = nullptr;
- int16 *_georgeAsteroidThresholds = nullptr;
- byte *_georgeSatellitePaths = nullptr;
- byte *_georgeAsteroidPaths = nullptr;
- byte *_georgeCollisionRect = nullptr;
- byte *_georgeSatelliteCollisionRects = nullptr;
- byte *_georgeAsteroidCollisionRects = nullptr;
- byte *_georgeSatelliteGfx = nullptr;
- byte *_georgeAsteroidGfx = nullptr;
- int16 _georgeSatelliteWait = 0;
- int16 _georgeAsteroidWait = 0;
- int16 _georgeSatelliteSearchIdx = 0;
- int16 _georgeAsteroidSearchIdx = 0;
- int16 _georgeHitSearchIdx = 0;
- byte *_georgeBgPic = nullptr;
- byte *_georgePalette = nullptr;
- byte *_georgePalCycleRawData = nullptr;
- XPCycleState _georgePalCycleSpecs[4];
- int16 _georgeCollectedSatellitesNum = 0;
- SoundInfo _georgeSoundCarStartUp;
- SoundInfo _georgeSoundCarGoesAway;
- SoundInfo _georgeSoundCarLoopHi;
- SoundInfo _georgeSoundCarLoopLo;
- SoundInfo _georgeSoundCarTumble;
- SoundInfo **_georgeSatelliteSoundList = nullptr;
- byte _georgeSoundChannelCounter = 0;
- SoundInfo *_georgeSoundToPlay = nullptr;
- SoundInfo *_georgeSoundCurrent = nullptr;
- SoundInfo *_georgeSoundQueued = nullptr;
- SoundInfo *_georgeSoundNext = nullptr;
- int16 _georgeSaveData[3] = { 0 };
- int16 *_georgeThresholds = nullptr;
-
- // --- HUCK ---
- void playSoundMapHuck(int16 memberId);
- void waitSoundMapHuck();
- void setHuckColors(int16 which);
- void restoreHuckColors(int16 which);
- void startHuckShuffleTimer();
- void drawGift(int16 slot);
- void drawHuckGifts();
- void checkHuckLevelComplete();
- bool initHuckDisplay();
- bool loadHuckResources();
- void unloadHuckResources();
- bool initHuckLevel();
- bool resumeHuckLevel();
- bool initHuck();
- void huckToggleBlinking(int16 *state, int16 which);
- void huckUpdateHotSpots(int16 x, int16 y);
- int16 findGift(int16 x, int16 y);
- bool handleGiftSelect(int16 x, int16 y);
- void huckHandleActionButton(int16 x, int16 y);
- void giftSwap();
- void resolveHuckSelection();
- void handleEvent(int16 eventType, uint32 eventData);
- void playHuck();
- void cleanUpHuck();
- int16 huckGame(int16 prevBooth);
- void swapHuckWordArray();
- void swapHuckWords();
-
- static void swapHuckWordArrayCb();
- static void swapHuckWordsCb();
-
- BOLTLib *_huckBoltLib = nullptr;
- BOLTCallbacks _huckBoltCallbacks;
-
- static BOLTCallback _huckTypeLoadCallbacks[27];
- static BOLTCallback _huckTypeFreeCallbacks[27];
-
- int16 _huckSoundPlaying = 0;
- int16 _huckHotSpotCount = 0;
- int16 _huckActionState = 0;
- uint32 _huckScreensaverTimer = 0;
- uint32 _huckBlinkTimer = 0;
- int16 _huckScreensaverFlag = 0;
- int16 _huckBlinkFlag = 0;
- uint32 _huckShuffleTimer = 0;
- int16 _huckGlobal[30] = { 0 };
- HuckState _huckState;
- byte *_huckGiftPic = nullptr;
- byte *_huckBgPic = nullptr;
- int16 _huckGiftGroupId = 0;
- int16 _huckVariantGroupId = 0;
- byte *_huckBgDisplayPic = nullptr;
- int16 _huckScrollOffset = 0;
- int16 _huckPalRange[8] = { 0 };
- int16 _huckReturnBooth = 0;
- int16 _huckExitFlag = 0;
- int16 _huckCursorX = 0;
- int16 _huckCursorY = 0;
- byte _huckPalSave0[15] = { 0 };
- byte _huckPalHighlight0[15] = { 0 };
- byte _huckPalSave1[15] = { 0 };
- byte _huckPalHighlight1[15] = { 0 };
- XPPicDesc _huckScratchPic;
-
- // --- SCOOBY ---
- bool loadScoobyBaseAssets();
- void cleanUpScoobyBaseAssets();
- void displayPicClipHack(byte *pic, int16 offsetX, int16 offsetY, int16 *clipRect, int16 displayMode);
- void drawMovingWalls(int16 cellIdx, int16 direction, int16 picFrame, int16 bgFrame);
- void drawAllMovingWalls();
- void animateTransition(int16 memberIdx);
- void clearPictMSb(byte *pic);
- void initScoobyLevelGraphics();
- bool initScoobyLevelAssets();
- void cleanUpScoobyLevelGraphics();
- void setScoobySpriteDirection(int16 startMember);
- void playSoundMapScooby(int16 memberIdx);
- void playWallSound();
- void animateWalls();
- void decideDirection();
- void updateScoobySound();
- void setScoobySound(int16 mode);
- void updateScoobyLocation();
- void updateScoobyWalls();
- void updateScoobyDirection(int16 inputDir);
- void updateScoobyTransition();
- bool initScoobyLevel();
- bool resumeScoobyLevel();
- bool initScooby();
- void cleanUpScooby();
- int16 helpScooby();
- void hiliteScoobyHelpObject(byte *entry, int16 highlight);
- int16 xpDirToBOLTDir(uint32 xpDir);
- int16 playScooby();
- int16 scoobyGame(int16 prevBooth);
- void swapScoobyHelpEntry();
- void swapScoobyWordArray();
-
- static void swapScoobyHelpEntryCb();
- static void swapScoobyWordArrayCb();
-
- BOLTLib *_scoobyBoltLib = nullptr;
- BOLTCallbacks _scoobyBoltCallbacks;
-
- static BOLTCallback _scoobyTypeLoadCallbacks[28];
- static BOLTCallback _scoobyTypeFreeCallbacks[28];
-
- int16 _scoobySoundMode = 0;
- int16 _scoobySoundPlaying = 0;
- int16 _scoobyShowHelp = 1;
-
- int16 _scoobyLastInputDir = 0;
- int16 _scoobyTransitionFrom = 0;
- int16 _scoobyTransitionTarget = 0;
- int16 _scoobyTransitionVelX = 0;
- int16 _scoobyTransitionVelY = 0;
- XPPicDesc _scoobyTempPic;
- byte _scoobyGlobalSaveData[0x3C] = { 0 };
- ScoobyState _scoobyGameState;
- SSprite _scoobySprite;
- byte *_scoobyBaseData = nullptr;
- byte *_scoobyBgPic = nullptr;
- byte *_scoobyWallPicsA[4] = { nullptr };
- byte *_scoobyWallPicsB[5] = { nullptr };
- ScoobyRect _scoobyCellBounds[25];
- Common::Point _scoobyLevelStartXY[25];
- byte *_scoobyLevelData = nullptr;
- int16 _scoobySelectedGraphicsGroup = 0;
- int16 _scoobyDifficulty = 0;
- int16 _scoobyLevelCount = 0;
- int16 _scoobyMoveRequested = 0;
- int16 _scoobyTransitioning = 0;
- int16 _scoobyDesiredDir = 0;
- int16 _scoobyInputHoldCount = 0;
- int16 _scoobyWallAnimating = 0;
- int16 _scoobyWallAnimStep = 0;
- int16 _scoobyWallsToOpen = 0;
- int16 _scoobyWallsToClose = 0;
-
- // --- TOPCAT ---
- int16 topCatGame(int16 prevBooth);
- bool initTopCat();
- void cleanUpTopCat();
- int16 playTopCat();
- int16 handleActionButton(int16 *result);
- void queueAnim(int16 animType, int16 param);
- bool maintainAnim(int16 soundEvent);
- void maintainIdleSound(int16 decrement);
- bool startNextAnim(int16 *playAnswerAnim);
- void setAnimType(int16 newType);
- void highlightObject(byte *entry, int16 highlight);
- bool setupNextQuestion();
- void adjustColors(byte *pic, int8 shift);
- void shuffleTopCatQuestions();
- void shuffleTopCatPermutations();
- void getTopCatSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo);
- void setScoreLights(int16 litMask);
- void swapTopCatHelpEntry();
-
- static void swapTopCatHelpEntryCb();
-
- RTFResource *_topCatRtfHandle = nullptr;
- RTFResource *_topCatAvHandle = nullptr;
- BOLTLib *_topCatBoltLib = nullptr;
- BOLTCallbacks _topCatBoltCallbacks;
-
- static BOLTCallback _topCatTypeLoadCallbacks[26];
- static BOLTCallback _topCatTypeFreeCallbacks[26];
-
- byte *_topCatBackgroundPalette = nullptr;
- byte *_topCatBackground = nullptr;
- byte *_topCatBackgroundAnimationPalette = nullptr;
- byte *_topCatGraphicsAssets = nullptr;
-
- int16 _topCatBackgroundAnimFrame = 0;
- int16 _topCatMaxBackgroundAnimFrames = 0;
- int16 _topCatCurrentAnimType = 0;
- int16 _topCatAnimStateMachineStep = 0;
- int16 _topCatAnimQueueSize = 0;
- int16 _topCatQueuedSoundFrames = 0;
- byte *_topCatButtonsPalette = nullptr;
- byte *_topCatBlinkEntries = nullptr;
- byte *_topCatLightsPalette = nullptr;
- int16 *_topCatBlinkSeqPtr = nullptr;
- byte *_topCatSelectedChoiceOverlayGfx = nullptr;
- byte *_topCatCycleData = nullptr;
- XPCycleState _topCatCycleSpecs[4];
- byte *_topCatShuffledQuestions = nullptr;
- byte *_topCatShuffledAnswers = nullptr;
- byte *_topCatAnswersPermutations = nullptr;
- byte *_topCatAnswers = nullptr;
- byte *_topCatAnswersScreenPositions = nullptr;
- int16 _topCatSavedScore = 0;
- int16 _topCatSaveHistory = 0;
- int16 _topCatScore = 0;
- int16 _topCatShuffledQuestionsArrayIdx = 0;
- uint32 _topCatBlinkTimer = 0;
- SoundInfo _topCatSoundInfo;
- byte _topCatSavedShuffledQuestions[60] = { 0 };
- byte _topCatSavedShuffledAnswers[60] = { 0 };
- byte _topCatSavedAnswersPermutations[60 * 3] = { 0 };
- byte _topCatSaveBuffer[302] = { 0 };
- byte *_topCatHoveredEntry = nullptr;
- byte *_topCatHelpButton = nullptr;
- byte *_topCatBackButton = nullptr;
- byte *_topCatBlinkEntry = nullptr;
- int16 _topCatCycleStep = 0;
- int16 _topCatDrawnQuestionId = 0;
- int16 _topCatCurrentAnswerIdx = 0;
- XPCycleState _topCatChoiceCycleState[4];
- TopCatAnim _topCatAnimQueue[3];
- int16 _topCatCorrectAnimIdx = 0;
- int16 _topCatWrongAnimIdx = 0;
- int16 _topCatShouldPlayAnswerAnim = 0;
- int16 _topCatMaintainSoundFlag = 0;
- int16 _topCatPermTableA[3] = { 0, 1, 2 };
- int16 _topCatPermTableB[3] = { 0, 1, 2 };
- int16 _topCatBlinkSeq0[5] = { 0x01, 0x00, 0x01, 0x00, 0x01 };
- int16 _topCatBlinkSeq1[5] = { 0x03, 0x01, 0x03, 0x01, 0x03 };
- int16 _topCatBlinkSeq2[5] = { 0x07, 0x03, 0x07, 0x03, 0x07 };
- int16 _topCatBlinkSeq3[5] = { 0x0F, 0x07, 0x0F, 0x07, 0x0F };
- int16 _topCatBlinkSeq4[5] = { 0x1F, 0x0F, 0x1F, 0x0F, 0x1F };
- int16 _topCatBlinkSeq5[5] = { 0x3F, 0x1F, 0x3F, 0x1F, 0x3F };
- int16 _topCatBlinkSeq6[25] = {
- 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
- 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
- 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
- 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
- 0x3F
- };
-
- int16 *_topCatBlinkSeqTable[7] = {
- _topCatBlinkSeq0, _topCatBlinkSeq1, _topCatBlinkSeq2,
- _topCatBlinkSeq3, _topCatBlinkSeq4, _topCatBlinkSeq5,
- _topCatBlinkSeq6
- };
-
- // --- YOGI ---
- void playSoundMapYogi(int16 memberId);
- void waitSoundMapYogi();
- void stopSoundYogi();
- void setYogiColors(int16 which);
- void restoreYogiColors(int16 which);
- void drawBasket(int16 slot, byte *basketSprite);
- void drawAllBaskets();
- void handleYogiMatch();
- bool loadYogiBgPic();
- void unloadYogiBgPic();
- void drawYogiLevel();
- bool loadYogiLevel();
- void unloadYogiResources();
- bool initYogiLevel();
- bool resumeYogiLevel();
- bool initYogi();
- void yogiToggleBlinking(int16 which, int16 *state);
- void yogiUpdateHotSpots(int16 x, int16 y);
- int16 findBasket(int16 x, int16 y);
- void resolveYogiSelection();
- bool handleBasketSelect(int16 x, int16 y);
- void yogiHandleActionButton(int16 x, int16 y);
- void handleYogiEvent(int16 eventType, uint32 eventData);
- void playYogi();
- void cleanUpYogi();
- int16 yogiGame(int16 prevBooth);
-
- void swapYogiAllWords();
- void swapYogiFirstWord();
-
- static void swapYogiAllWordsCb();
- static void swapYogiFirstWordCb();
-
- BOLTLib *_yogiBoltLib = nullptr;
- BOLTCallbacks _yogiBoltCallbacks;
-
- static BOLTCallback _yogiTypeLoadCallbacks[27];
- static BOLTCallback _yogiTypeFreeCallbacks[27];
-
- int16 _yogiSoundPlaying = 0;
- int16 _yogiSoundActive = 0;
- int16 _yogiHotSpotCount = 0;
- int16 _yogiAnimActive = 0;
- uint32 _yogiBlinkTimer1 = 0;
- uint32 _yogiBlinkTimer2 = 0;
- int16 _yogiBlinkState1 = 0;
- int16 _yogiBlinkState2 = 0;
- int16 _yogiGlobal[0xA0] = { 0 };
- YogiState _yogiState;
- byte *_yogiBasketPic = nullptr;
- int16 _yogiLevelGroupId = 0;
- byte *_yogiBgPic = nullptr;
- byte *_yogiNormalSprite = nullptr;
- byte *_yogiHlSprite = nullptr;
- byte *_yogiAnimSprite = nullptr;
- int16 _yogiSpriteStride = 0;
- int16 _yogiSpriteHeight = 0;
- int16 _yogiPalRange[8] = { 0 };
- int16 _yogiReturnBooth = 0;
- int16 _yogiExitFlag = 0;
- int16 _yogiLevelId = 0;
- int16 _yogiCursorX = 0;
- int16 _yogiCursorY = 0;
- byte _yogiPalSave0[15] = { 0 };
- byte _yogiPalHighlight0[15] = { 0 };
- byte _yogiPalSave1[15] = { 0 };
- byte _yogiPalHighlight1[15] = { 0 };
- XPPicDesc _yogiScratchBuf;
};
extern BoltEngine *g_engine;
diff --git a/engines/bolt/barker.cpp b/engines/bolt/carnival/barker.cpp
similarity index 83%
rename from engines/bolt/barker.cpp
rename to engines/bolt/carnival/barker.cpp
index f9d355c70a6..ec02102346e 100644
--- a/engines/bolt/barker.cpp
+++ b/engines/bolt/carnival/barker.cpp
@@ -19,11 +19,13 @@
*
*/
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-BarkerTable *BoltEngine::createBarker(int16 minIndex, int16 maxIndex) {
+namespace Carnival {
+
+BarkerTable *CarnivalEngine::createBarker(int16 minIndex, int16 maxIndex) {
bool success = false;
BarkerTable *table = new BarkerTable();
@@ -52,7 +54,7 @@ BarkerTable *BoltEngine::createBarker(int16 minIndex, int16 maxIndex) {
}
}
-void BoltEngine::freeBarker(BarkerTable *table) {
+void CarnivalEngine::freeBarker(BarkerTable *table) {
if (!table)
return;
@@ -62,7 +64,7 @@ void BoltEngine::freeBarker(BarkerTable *table) {
delete table;
}
-bool BoltEngine::registerSideShow(BarkerTable *table, SideShowHandler handler, int16 boothId) {
+bool CarnivalEngine::registerSideShow(BarkerTable *table, SideShowHandler handler, int16 boothId) {
if (table->minIndex > boothId || table->maxIndex < boothId) {
_curErrorCode = 5;
return false;
@@ -74,7 +76,7 @@ bool BoltEngine::registerSideShow(BarkerTable *table, SideShowHandler handler, i
return true;
}
-int16 BoltEngine::barker(BarkerTable *table, int16 startBooth) {
+int16 CarnivalEngine::barker(BarkerTable *table, int16 startBooth) {
int16 prevBooth = 0;
int16 currentBooth = startBooth;
@@ -93,8 +95,10 @@ int16 BoltEngine::barker(BarkerTable *table, int16 startBooth) {
return _currentBoothId;
}
-bool BoltEngine::checkError() {
+bool CarnivalEngine::checkError() {
return _curErrorCode != 0;
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booth.cpp b/engines/bolt/carnival/booth.cpp
similarity index 93%
rename from engines/bolt/booth.cpp
rename to engines/bolt/carnival/booth.cpp
index 95d072bf756..94463c0b732 100644
--- a/engines/bolt/booth.cpp
+++ b/engines/bolt/carnival/booth.cpp
@@ -19,11 +19,13 @@
*
*/
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-void BoltEngine::startCycle(byte *cycleResource) {
+namespace Carnival {
+
+void CarnivalEngine::startCycle(byte *cycleResource) {
if (!cycleResource)
return;
@@ -32,7 +34,7 @@ void BoltEngine::startCycle(byte *cycleResource) {
_xp->startCycle(specs);
}
-void BoltEngine::displayBooth(int16 page) {
+void CarnivalEngine::displayBooth(int16 page) {
_xp->setTransparency(page);
_xp->displayPic(&_boothLetterSprite, _displayX, _displayY, page);
displayColors(_boothPalCycleData, page, 0);
@@ -43,7 +45,7 @@ void BoltEngine::displayBooth(int16 page) {
_xp->updateDisplay();
}
-void BoltEngine::playAVOverBooth(int16 animIndex) {
+void CarnivalEngine::playAVOverBooth(int16 animIndex) {
_xp->hideCursor();
displayBooth(stBack);
playAV(_rtfHandle, animIndex, _displayWidth, _displayHeight, _displayX, _displayY);
@@ -51,7 +53,7 @@ void BoltEngine::playAVOverBooth(int16 animIndex) {
_xp->showCursor();
}
-int16 BoltEngine::hucksBooth(int16 prevBooth) {
+int16 CarnivalEngine::hucksBooth(int16 prevBooth) {
int16 result = openBooth(3);
closeBooth();
@@ -71,7 +73,7 @@ int16 BoltEngine::hucksBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::fredsBooth(int16 prevBooth) {
+int16 CarnivalEngine::fredsBooth(int16 prevBooth) {
int16 result = openBooth(4);
closeBooth();
@@ -91,7 +93,7 @@ int16 BoltEngine::fredsBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::scoobysBooth(int16 prevBooth) {
+int16 CarnivalEngine::scoobysBooth(int16 prevBooth) {
int16 result = openBooth(5);
closeBooth();
@@ -114,7 +116,7 @@ int16 BoltEngine::scoobysBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::yogisBooth(int16 prevBooth) {
+int16 CarnivalEngine::yogisBooth(int16 prevBooth) {
int16 result = openBooth(6);
closeBooth();
@@ -137,7 +139,7 @@ int16 BoltEngine::yogisBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::georgesBooth(int16 prevBooth) {
+int16 CarnivalEngine::georgesBooth(int16 prevBooth) {
int16 result = openBooth(7);
closeBooth();
@@ -160,7 +162,7 @@ int16 BoltEngine::georgesBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::topCatsBooth(int16 prevBooth) {
+int16 CarnivalEngine::topCatsBooth(int16 prevBooth) {
int16 result = openBooth(8);
closeBooth();
@@ -180,7 +182,7 @@ int16 BoltEngine::topCatsBooth(int16 prevBooth) {
}
}
-int16 BoltEngine::mainEntrance(int16 prevBooth) {
+int16 CarnivalEngine::mainEntrance(int16 prevBooth) {
int16 result = openBooth(9);
closeBooth();
@@ -206,7 +208,7 @@ int16 BoltEngine::mainEntrance(int16 prevBooth) {
}
}
-bool BoltEngine::loadBooth(int16 boothId) {
+bool CarnivalEngine::loadBooth(int16 boothId) {
switch (boothId) {
case 3:
if (_boothLoadedMask & 0x01)
@@ -270,7 +272,7 @@ bool BoltEngine::loadBooth(int16 boothId) {
return true;
}
-void BoltEngine::unloadBooth() {
+void CarnivalEngine::unloadBooth() {
if (_boothLoadedMask & 0x01)
freeBOLTGroup(_boothsBoltLib, 0x100, 1);
@@ -297,7 +299,7 @@ void BoltEngine::unloadBooth() {
_boothLoadedMask = 0;
}
-int16 BoltEngine::openBooth(int16 boothId) {
+int16 CarnivalEngine::openBooth(int16 boothId) {
int16 baseResId;
int16 resId;
@@ -392,7 +394,7 @@ int16 BoltEngine::openBooth(int16 boothId) {
return boothEventLoop();
}
-void BoltEngine::closeBooth() {
+void CarnivalEngine::closeBooth() {
uint16 buttonState;
_xp->readCursor(&buttonState, &_cursorY, &_cursorX);
@@ -401,7 +403,7 @@ void BoltEngine::closeBooth() {
unloadBooth();
}
-void BoltEngine::playTour() {
+void CarnivalEngine::playTour() {
int16 playing = 1;
_xp->hideCursor();
@@ -442,7 +444,7 @@ void BoltEngine::playTour() {
_xp->showCursor();
}
-void BoltEngine::finishPlayingHelp(int16 activeHotspot) {
+void CarnivalEngine::finishPlayingHelp(int16 activeHotspot) {
_helpPlaying = 0;
if (_helpIsIdle != 0) {
@@ -483,7 +485,7 @@ void BoltEngine::finishPlayingHelp(int16 activeHotspot) {
}
}
-int16 BoltEngine::hotSpotActive(int16 hotspot) {
+int16 CarnivalEngine::hotSpotActive(int16 hotspot) {
switch (hotspot) {
case 0:
case 1:
@@ -512,7 +514,7 @@ int16 BoltEngine::hotSpotActive(int16 hotspot) {
}
}
-void BoltEngine::hoverHotSpot() {
+void CarnivalEngine::hoverHotSpot() {
int16 i = 0;
while (i < _boothNumHotspots) {
@@ -538,7 +540,7 @@ void BoltEngine::hoverHotSpot() {
}
}
-int16 BoltEngine::boothEventLoop() {
+int16 CarnivalEngine::boothEventLoop() {
uint32 eventData;
int16 exitCode = 0;
@@ -699,7 +701,7 @@ int16 BoltEngine::boothEventLoop() {
return _hoveredHotspot;
}
-void BoltEngine::resetInactivityState() {
+void CarnivalEngine::resetInactivityState() {
if (_helpTimer != 0) {
_xp->killTimer(_helpTimer);
_helpTimer = 0;
@@ -717,7 +719,7 @@ void BoltEngine::resetInactivityState() {
_helpFlag = 0;
}
-bool BoltEngine::handleButtonPress(int16 hotspot) {
+bool CarnivalEngine::handleButtonPress(int16 hotspot) {
byte savedLeftDoor[3];
byte savedRightDoor[3];
@@ -879,7 +881,7 @@ bool BoltEngine::handleButtonPress(int16 hotspot) {
}
}
-void BoltEngine::blastColors(byte **paletteTable, int16 index, int16 mode) {
+void CarnivalEngine::blastColors(byte **paletteTable, int16 index, int16 mode) {
byte localPalette[384];
int16 si = 0;
@@ -900,7 +902,7 @@ void BoltEngine::blastColors(byte **paletteTable, int16 index, int16 mode) {
}
}
-void BoltEngine::setColors(int16 index) {
+void CarnivalEngine::setColors(int16 index) {
if (_currentBoothScene == 9) {
switch (index) {
case 0:
@@ -948,7 +950,7 @@ void BoltEngine::setColors(int16 index) {
}
}
-void BoltEngine::restoreColors(int16 index) {
+void CarnivalEngine::restoreColors(int16 index) {
if (_currentBoothScene == 9) {
switch (index) {
case 0:
@@ -1008,7 +1010,7 @@ void BoltEngine::restoreColors(int16 index) {
}
}
-void BoltEngine::loadColors() {
+void CarnivalEngine::loadColors() {
for (int16 i = 0; i < _boothNumAnimations; i++) {
byte *animDesc = _boothAnimDescs[i];
_xp->getPalette((int16)READ_UINT16(animDesc), (int16)READ_UINT16(animDesc + 2), _savedPalettes[i]);
@@ -1026,12 +1028,12 @@ void BoltEngine::loadColors() {
}
}
-void BoltEngine::shiftColorMap(byte *colorMap, int16 delta) {
+void CarnivalEngine::shiftColorMap(byte *colorMap, int16 delta) {
WRITE_BE_INT16(colorMap + 2, READ_BE_INT16(colorMap + 2) + delta);
WRITE_BE_INT16(colorMap + 4, READ_BE_INT16(colorMap + 4) + delta);
}
-void BoltEngine::playBoothAV() {
+void CarnivalEngine::playBoothAV() {
switch (_currentBoothScene) {
case 3:
playAVOverBooth(6 - (_isDemo ? 3 : 0));
@@ -1054,7 +1056,7 @@ void BoltEngine::playBoothAV() {
}
}
-void BoltEngine::mainEntranceHelpBlink() {
+void CarnivalEngine::mainEntranceHelpBlink() {
_tourStep++;
switch (_tourStep) {
@@ -1126,7 +1128,7 @@ void BoltEngine::mainEntranceHelpBlink() {
}
}
-void BoltEngine::boothHelpBlink() {
+void CarnivalEngine::boothHelpBlink() {
_tourStep++;
switch (_tourStep) {
@@ -1169,7 +1171,7 @@ void BoltEngine::boothHelpBlink() {
}
}
-void BoltEngine::tourPaletteCycleStep() {
+void CarnivalEngine::tourPaletteCycleStep() {
static const int16 cycleResIds[] = {
0x700, 0x719, 0x71E, 0x720, 0x725, 0x72A, 0x72F, 0x731,
-1, 0x736, 0x73B, 0x73F, 0x743, -1
@@ -1193,7 +1195,7 @@ void BoltEngine::tourPaletteCycleStep() {
startCycle(memberAddr(_boothsBoltLib, resId));
}
-void BoltEngine::fadeToBlack(int16 steps) {
+void CarnivalEngine::fadeToBlack(int16 steps) {
byte palette[768];
XPPicDesc desc;
@@ -1229,7 +1231,7 @@ void BoltEngine::fadeToBlack(int16 steps) {
_xp->setFrameRate(0);
}
-void BoltEngine::flushInput() {
+void CarnivalEngine::flushInput() {
uint32 eventBuf;
// Drain all mouse-down events
@@ -1239,7 +1241,7 @@ void BoltEngine::flushInput() {
while (_xp->getEvent(etMouseUp, &eventBuf) == etMouseUp);
}
-int16 BoltEngine::winALetter(int16 prevBooth) {
+int16 CarnivalEngine::winALetter(int16 prevBooth) {
_lettersWon++;
if (_isDemo && _lettersWon == 6)
@@ -1303,7 +1305,7 @@ int16 BoltEngine::winALetter(int16 prevBooth) {
}
}
-int16 BoltEngine::endDemo(int16 prevBooth) {
+int16 CarnivalEngine::endDemo(int16 prevBooth) {
_xp->hideCursor();
_xp->setTransparency(false);
@@ -1319,4 +1321,6 @@ int16 BoltEngine::endDemo(int16 prevBooth) {
return 0;
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/fred.cpp b/engines/bolt/carnival/booths/fred.cpp
similarity index 96%
rename from engines/bolt/booths/fred.cpp
rename to engines/bolt/carnival/booths/fred.cpp
index 0bba92b44ce..ef10f64e82b 100644
--- a/engines/bolt/booths/fred.cpp
+++ b/engines/bolt/carnival/booths/fred.cpp
@@ -19,11 +19,13 @@
*
*/
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-int16 BoltEngine::fredGame(int16 prevBooth) {
+namespace Carnival {
+
+int16 CarnivalEngine::fredGame(int16 prevBooth) {
int16 savedTimer = _xp->setInactivityTimer(30);
if (!initFred()) {
@@ -38,7 +40,7 @@ int16 BoltEngine::fredGame(int16 prevBooth) {
return result;
}
-bool BoltEngine::initFred() {
+bool CarnivalEngine::initFred() {
const char *path = assetPath("fred.blt");
if (!openBOLTLib(&_fredBoltLib, &_fredBoltCallbacks, path))
@@ -127,7 +129,7 @@ bool BoltEngine::initFred() {
return true;
}
-void BoltEngine::cleanUpFred() {
+void CarnivalEngine::cleanUpFred() {
int16 savedLevel = _fredSaveData[1]; // Level data group index
int16 savedPalette = _fredSaveData[2]; // Palette group index
@@ -159,7 +161,7 @@ void BoltEngine::cleanUpFred() {
_xp->updateDisplay();
}
-bool BoltEngine::initFredLevel(int16 levelGroup, int16 palGroup) {
+bool CarnivalEngine::initFredLevel(int16 levelGroup, int16 palGroup) {
// Load level data group...
if (!getBOLTGroup(_fredBoltLib, levelGroup * 0x200 + 0x100, 1))
return false;
@@ -283,7 +285,7 @@ bool BoltEngine::initFredLevel(int16 levelGroup, int16 palGroup) {
return true;
}
-void BoltEngine::termFredLevel(int16 levelGroup, int16 palGroup) {
+void CarnivalEngine::termFredLevel(int16 levelGroup, int16 palGroup) {
// Free balloon state structs...
if (_fredEntitiesTable) {
uint16 numBalloons = READ_UINT16(_fredLevelPtr + 0x0A);
@@ -310,7 +312,7 @@ void BoltEngine::termFredLevel(int16 levelGroup, int16 palGroup) {
freeBOLTGroup(_fredBoltLib, levelGroup * 0x200 + 0x100, 1);
}
-void BoltEngine::swapFredAnimEntry() {
+void CarnivalEngine::swapFredAnimEntry() {
byte *data = _boltCurrentMemberEntry->dataPtr;
uint32 decompSize = _boltCurrentMemberEntry->decompSize;
uint32 offset = 0;
@@ -322,7 +324,7 @@ void BoltEngine::swapFredAnimEntry() {
}
}
-void BoltEngine::swapFredAnimDesc() {
+void CarnivalEngine::swapFredAnimDesc() {
byte *data = _boltCurrentMemberEntry->dataPtr;
uint32 decompSize = _boltCurrentMemberEntry->decompSize;
uint32 offset = 0;
@@ -347,7 +349,7 @@ void BoltEngine::swapFredAnimDesc() {
}
}
-void BoltEngine::swapFredLevelDesc() {
+void CarnivalEngine::swapFredLevelDesc() {
byte *data = _boltCurrentMemberEntry->dataPtr;
WRITE_UINT16(data + 0x00, READ_BE_INT16(data + 0x00));
@@ -359,7 +361,7 @@ void BoltEngine::swapFredLevelDesc() {
WRITE_UINT16(data + 0x0C, READ_BE_INT16(data + 0x0C));
}
-int16 BoltEngine::playFred() {
+int16 CarnivalEngine::playFred() {
int16 result = 0;
int16 allCaught = 0;
int16 exitLoop = 0;
@@ -713,7 +715,7 @@ int16 BoltEngine::playFred() {
return result;
}
-int16 BoltEngine::helpFred() {
+int16 CarnivalEngine::helpFred() {
byte *firstEntry = getResolvedPtr(_fredHelpEntries, 0);
byte *picDesc = getResolvedPtr(firstEntry, 4);
@@ -949,7 +951,7 @@ int16 BoltEngine::helpFred() {
return exitResult;
}
-void BoltEngine::hiliteFredHelpObject(byte *entry, int16 highlight) {
+void CarnivalEngine::hiliteFredHelpObject(byte *entry, int16 highlight) {
if (!entry)
return;
@@ -966,7 +968,7 @@ void BoltEngine::hiliteFredHelpObject(byte *entry, int16 highlight) {
}
}
-void BoltEngine::helpAnimStep() {
+void CarnivalEngine::helpAnimStep() {
if (_fredHelpStep < 0 || _fredHelpStep >= 4)
return;
@@ -1000,7 +1002,7 @@ void BoltEngine::helpAnimStep() {
_fredHelpStep++;
}
-bool BoltEngine::spawnBalloon() {
+bool CarnivalEngine::spawnBalloon() {
// Count active balloons...
int16 activeCount = 0;
int16 i = 0;
@@ -1087,13 +1089,13 @@ bool BoltEngine::spawnBalloon() {
return true;
}
-int16 BoltEngine::calcBalloonSpawnDelay() {
+int16 CarnivalEngine::calcBalloonSpawnDelay() {
int16 range = READ_UINT16(_fredLevelPtr + 2);
int16 base = READ_UINT16(_fredLevelPtr + 0);
return _xp->getRandom(range) + base;
}
-int16 BoltEngine::selectBalloonRow() {
+int16 CarnivalEngine::selectBalloonRow() {
// Get Fred's center X position...
int32 fredX = _fredSprite.xPos >> 8;
@@ -1124,7 +1126,7 @@ int16 BoltEngine::selectBalloonRow() {
return randomRow;
}
-void BoltEngine::setFredAnimMode(FredEntityState *state, int16 mode) {
+void CarnivalEngine::setFredAnimMode(FredEntityState *state, int16 mode) {
if (mode >= 0x0B && mode < 0x0B + (_fredLevelPtr ? READ_UINT16(_fredLevelPtr + 0x0C) : 0)) {
state->animMode = 0x0B;
@@ -1175,7 +1177,7 @@ void BoltEngine::setFredAnimMode(FredEntityState *state, int16 mode) {
}
}
-void BoltEngine::renderFredScene() {
+void CarnivalEngine::renderFredScene() {
_xp->fillDisplay(0, stFront);
int16 idx = 0;
@@ -1204,12 +1206,12 @@ void BoltEngine::renderFredScene() {
}
}
-void BoltEngine::getFredSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo) {
+void CarnivalEngine::getFredSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo) {
soundInfo->data = memberAddr(lib, memberId);
soundInfo->size = memberSize(lib, memberId);
}
-void BoltEngine::playFredSound(SoundInfo *oneShot, SoundInfo *loop) {
+void CarnivalEngine::playFredSound(SoundInfo *oneShot, SoundInfo *loop) {
_fredPendingOneShot = oneShot;
_fredPendingLoop = loop;
@@ -1231,7 +1233,7 @@ void BoltEngine::playFredSound(SoundInfo *oneShot, SoundInfo *loop) {
}
}
-void BoltEngine::updateFredSound() {
+void CarnivalEngine::updateFredSound() {
bool startLoop = false;
if (_fredLoopSound != nullptr) {
@@ -1263,4 +1265,6 @@ void BoltEngine::updateFredSound() {
}
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/george.cpp b/engines/bolt/carnival/booths/george.cpp
similarity index 95%
rename from engines/bolt/booths/george.cpp
rename to engines/bolt/carnival/booths/george.cpp
index 05c4ce2899e..4be74a19ff0 100644
--- a/engines/bolt/booths/george.cpp
+++ b/engines/bolt/carnival/booths/george.cpp
@@ -19,11 +19,13 @@
*
*/
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-int16 BoltEngine::georgeGame(int16 prevBooth) {
+namespace Carnival {
+
+int16 CarnivalEngine::georgeGame(int16 prevBooth) {
int16 result;
int16 prevInactivity = _xp->setInactivityTimer(30);
@@ -38,7 +40,7 @@ int16 BoltEngine::georgeGame(int16 prevBooth) {
return result;
}
-bool BoltEngine::initGeorge() {
+bool CarnivalEngine::initGeorge() {
if (!openBOLTLib(&_georgeBoltLib, &_georgeBoltCallbacks, assetPath("george.blt")))
return false;
@@ -115,7 +117,7 @@ bool BoltEngine::initGeorge() {
return true;
}
-void BoltEngine::cleanUpGeorge() {
+void CarnivalEngine::cleanUpGeorge() {
// Save current progress...
int16 savedLevel = _georgeSaveData[1];
int16 savedVariant = _georgeSaveData[2];
@@ -152,7 +154,7 @@ void BoltEngine::cleanUpGeorge() {
_xp->updateDisplay();
}
-bool BoltEngine::initGeorgeLevel(int16 level, int16 variant) {
+bool CarnivalEngine::initGeorgeLevel(int16 level, int16 variant) {
int16 levelGroup = (level * 2) << 8 | 0x100;
int16 variantGroup = (variant * 2) << 8 | 0x200;
@@ -360,7 +362,7 @@ bool BoltEngine::initGeorgeLevel(int16 level, int16 variant) {
return true;
}
-void BoltEngine::termGeorgeLevel(int16 level, int16 variant) {
+void CarnivalEngine::termGeorgeLevel(int16 level, int16 variant) {
if (_georgeEntityList) {
for (int16 i = 0; i < _georgeTotalSatellites; i++) {
GeorgeEntityState *sat = _georgeEntityList[i];
@@ -402,7 +404,7 @@ void BoltEngine::termGeorgeLevel(int16 level, int16 variant) {
freeBOLTGroup(_georgeBoltLib, (level * 2) << 8 | 0x100, 1);
}
-void BoltEngine::swapGeorgeFrameArray() {
+void CarnivalEngine::swapGeorgeFrameArray() {
byte *data = _boltCurrentMemberEntry->dataPtr;
uint32 size = _boltCurrentMemberEntry->decompSize;
uint32 off = 0;
@@ -414,7 +416,7 @@ void BoltEngine::swapGeorgeFrameArray() {
}
}
-void BoltEngine::swapGeorgeHelpEntry() {
+void CarnivalEngine::swapGeorgeHelpEntry() {
byte *data = _boltCurrentMemberEntry->dataPtr;
uint32 size = _boltCurrentMemberEntry->decompSize;
uint32 off = 0;
@@ -435,13 +437,13 @@ void BoltEngine::swapGeorgeHelpEntry() {
}
}
-void BoltEngine::swapGeorgeThresholds() {
+void CarnivalEngine::swapGeorgeThresholds() {
byte *data = _boltCurrentMemberEntry->dataPtr;
for (int16 i = 0; i < 12; i++)
WRITE_UINT16(data + i * 2, READ_BE_UINT16(data + i * 2));
}
-int16 BoltEngine::playGeorge() {
+int16 CarnivalEngine::playGeorge() {
int16 returnCode = 0;
int16 flyActive = 1;
int16 winSeq = 0;
@@ -779,7 +781,7 @@ int16 BoltEngine::playGeorge() {
return returnCode;
}
-int16 BoltEngine::helpGeorge() {
+int16 CarnivalEngine::helpGeorge() {
byte *firstObj = getResolvedPtr(_georgeHelpObjects, 0);
byte *firstInfo = getResolvedPtr(firstObj, 0x04);
int16 curX = READ_UINT16(firstInfo + 0x06) + READ_UINT16(firstInfo + 0x0A) - 10;
@@ -1005,7 +1007,7 @@ int16 BoltEngine::helpGeorge() {
return exitCode;
}
-void BoltEngine::hiliteGeorgeHelpObject(byte *entry, int16 highlight) {
+void CarnivalEngine::hiliteGeorgeHelpObject(byte *entry, int16 highlight) {
if (!entry)
return;
@@ -1018,7 +1020,7 @@ void BoltEngine::hiliteGeorgeHelpObject(byte *entry, int16 highlight) {
}
}
-void BoltEngine::advanceHelpAnimation() {
+void CarnivalEngine::advanceHelpAnimation() {
if (_georgeHelpStep < 0 || _georgeHelpStep >= 4)
return;
@@ -1048,7 +1050,7 @@ void BoltEngine::advanceHelpAnimation() {
_georgeHelpStep++;
}
-bool BoltEngine::spawnSatellite() {
+bool CarnivalEngine::spawnSatellite() {
// Count active satellites (type 3)...
int16 activeCount = 0;
for (int16 i = 0;; i++) {
@@ -1115,13 +1117,13 @@ bool BoltEngine::spawnSatellite() {
return true;
}
-int16 BoltEngine::getRandomSatelliteWait() {
+int16 CarnivalEngine::getRandomSatelliteWait() {
int16 range = _georgeThresholds[2];
int16 topY = _georgeThresholds[1];
return _xp->getRandom(range) + topY;
}
-int16 BoltEngine::getRandomAsteroidRow() {
+int16 CarnivalEngine::getRandomAsteroidRow() {
GeorgeEntityState *carSat = _georgeEntityList[_georgeCarIdx];
int16 carY = carSat->y >> 8;
@@ -1147,7 +1149,7 @@ int16 BoltEngine::getRandomAsteroidRow() {
return randRow;
}
-bool BoltEngine::confirmAsteroidHitTest() {
+bool CarnivalEngine::confirmAsteroidHitTest() {
GeorgeEntityState *candidate = nullptr;
int16 startIdx = _georgeHitSearchIdx;
int16 idx = startIdx;
@@ -1175,7 +1177,7 @@ bool BoltEngine::confirmAsteroidHitTest() {
return true;
}
-bool BoltEngine::spawnAsteroid() {
+bool CarnivalEngine::spawnAsteroid() {
// Count active asteroids (type 5)...
int16 activeCount = 0;
for (int16 i = 0;; i++) {
@@ -1241,13 +1243,13 @@ bool BoltEngine::spawnAsteroid() {
return true;
}
-int16 BoltEngine::getRandomAsteroidWait() {
+int16 CarnivalEngine::getRandomAsteroidWait() {
int16 base = _georgeThresholds[7];
int16 range = _georgeThresholds[8];
return _xp->getRandom(range) + base;
}
-int16 BoltEngine::getAsteroidRow() {
+int16 CarnivalEngine::getAsteroidRow() {
GeorgeEntityState *carSat = _georgeEntityList[_georgeCarIdx];
int16 carY = carSat->y >> 8;
@@ -1266,7 +1268,7 @@ int16 BoltEngine::getAsteroidRow() {
return row;
}
-void BoltEngine::setGeorgeAnimMode(GeorgeEntityState *entity, int16 mode) {
+void CarnivalEngine::setGeorgeAnimMode(GeorgeEntityState *entity, int16 mode) {
entity->animMode = mode;
entity->variant = 0;
entity->animTable = _georgeCarPics[mode];
@@ -1274,7 +1276,7 @@ void BoltEngine::setGeorgeAnimMode(GeorgeEntityState *entity, int16 mode) {
entity->frameCountdown = READ_UINT16(entity->animTable + 0x04);
}
-void BoltEngine::setSatelliteAnimMode(GeorgeEntityState *entity, int16 mode, int16 variant) {
+void CarnivalEngine::setSatelliteAnimMode(GeorgeEntityState *entity, int16 mode, int16 variant) {
if (mode == 4) {
// Deactivate...
entity->animMode = mode;
@@ -1289,7 +1291,7 @@ void BoltEngine::setSatelliteAnimMode(GeorgeEntityState *entity, int16 mode, int
entity->frameCountdown = READ_UINT16(entity->animTable + 0x04);
}
-void BoltEngine::setAsteroidAnimMode(GeorgeEntityState *entity, int16 mode, int16 variant) {
+void CarnivalEngine::setAsteroidAnimMode(GeorgeEntityState *entity, int16 mode, int16 variant) {
entity->animMode = mode;
entity->variant = variant;
entity->animTable = getResolvedPtr(_georgeAsteroidGfx, variant * 4);
@@ -1297,7 +1299,7 @@ void BoltEngine::setAsteroidAnimMode(GeorgeEntityState *entity, int16 mode, int1
entity->frameCountdown = READ_UINT16(entity->animTable + 0x04);
}
-void BoltEngine::drawFlyingObjects() {
+void CarnivalEngine::drawFlyingObjects() {
_xp->fillDisplay(0, stFront);
for (int16 i = 0;; i++) {
@@ -1317,14 +1319,14 @@ void BoltEngine::drawFlyingObjects() {
}
}
-void BoltEngine::getGeorgeSoundInfo(BOLTLib *boltLib, int16 member, SoundInfo *outInfo, byte priority) {
+void CarnivalEngine::getGeorgeSoundInfo(BOLTLib *boltLib, int16 member, SoundInfo *outInfo, byte priority) {
outInfo->data = memberAddr(boltLib, member);
outInfo->size = memberSize(boltLib, member);
outInfo->priority = priority;
outInfo->channel = _georgeSoundChannelCounter++;
}
-void BoltEngine::playGeorgeSound(SoundInfo *newSound, SoundInfo *nextSound) {
+void CarnivalEngine::playGeorgeSound(SoundInfo *newSound, SoundInfo *nextSound) {
// If a queued sound exists and has higher priority than new sound, don't replace it...
if (newSound && _georgeSoundQueued) {
if (_georgeSoundQueued->priority > newSound->priority)
@@ -1356,7 +1358,7 @@ void BoltEngine::playGeorgeSound(SoundInfo *newSound, SoundInfo *nextSound) {
updateGeorgeSound();
}
-void BoltEngine::updateGeorgeSound() {
+void CarnivalEngine::updateGeorgeSound() {
int16 playBoth = 0;
if (_georgeSoundCurrent != nullptr) {
@@ -1390,4 +1392,6 @@ void BoltEngine::updateGeorgeSound() {
_xp->playSound(_georgeSoundCurrent->data, _georgeSoundCurrent->size, 22050);
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/huck.cpp b/engines/bolt/carnival/booths/huck.cpp
similarity index 94%
rename from engines/bolt/booths/huck.cpp
rename to engines/bolt/carnival/booths/huck.cpp
index 4c94e0f5bb1..635ee141524 100644
--- a/engines/bolt/booths/huck.cpp
+++ b/engines/bolt/carnival/booths/huck.cpp
@@ -21,11 +21,13 @@
#include "common/memstream.h"
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-void BoltEngine::playSoundMapHuck(int16 memberId) {
+namespace Carnival {
+
+void CarnivalEngine::playSoundMapHuck(int16 memberId) {
byte *soundData = getBOLTMember(_huckBoltLib, memberId);
uint32 soundSize = memberSize(_huckBoltLib, memberId);
if (soundData) {
@@ -34,7 +36,7 @@ void BoltEngine::playSoundMapHuck(int16 memberId) {
}
}
-void BoltEngine::waitSoundMapHuck() {
+void CarnivalEngine::waitSoundMapHuck() {
if (!_huckSoundPlaying)
return;
@@ -43,7 +45,7 @@ void BoltEngine::waitSoundMapHuck() {
_huckSoundPlaying--;
}
-void BoltEngine::setHuckColors(int16 which) {
+void CarnivalEngine::setHuckColors(int16 which) {
if (which == 0) {
int16 count = _huckPalRange[1] - _huckPalRange[0] + 1;
_xp->setPalette(count, _huckPalRange[0], _huckPalHighlight0);
@@ -53,7 +55,7 @@ void BoltEngine::setHuckColors(int16 which) {
}
}
-void BoltEngine::restoreHuckColors(int16 which) {
+void CarnivalEngine::restoreHuckColors(int16 which) {
if (which == 0) {
int16 count = _huckPalRange[1] - _huckPalRange[0] + 1;
_xp->setPalette(count, _huckPalRange[0], _huckPalSave0);
@@ -63,7 +65,7 @@ void BoltEngine::restoreHuckColors(int16 which) {
}
}
-void BoltEngine::startHuckShuffleTimer() {
+void CarnivalEngine::startHuckShuffleTimer() {
if (_huckShuffleTimer) {
_xp->killTimer(_huckShuffleTimer);
_huckShuffleTimer = 0;
@@ -76,7 +78,7 @@ void BoltEngine::startHuckShuffleTimer() {
}
}
-void BoltEngine::drawGift(int16 slot) {
+void CarnivalEngine::drawGift(int16 slot) {
byte *giftSprite = memberAddr(_huckBoltLib, _huckState.drawTable1[slot]);
int16 sprStride = READ_UINT16(giftSprite + 0x0A);
int16 sprHeight = READ_UINT16(giftSprite + 0x0C);
@@ -134,7 +136,7 @@ void BoltEngine::drawGift(int16 slot) {
_xp->displayPic(&_huckScratchPic, slotY, slotX, stFront);
}
-void BoltEngine::drawHuckGifts() {
+void CarnivalEngine::drawHuckGifts() {
_xp->fillDisplay(0, stFront);
int16 giftCount = READ_UINT16(_huckGiftPic);
@@ -166,7 +168,7 @@ void BoltEngine::drawHuckGifts() {
}
}
-void BoltEngine::checkHuckLevelComplete() {
+void CarnivalEngine::checkHuckLevelComplete() {
if (_huckState.giftCount == 2) {
// Last pair matched, level complete!
_huckExitFlag = 1;
@@ -194,7 +196,7 @@ void BoltEngine::checkHuckLevelComplete() {
startHuckShuffleTimer();
}
-bool BoltEngine::initHuckDisplay() {
+bool CarnivalEngine::initHuckDisplay() {
byte *palPtr = memberAddr(_huckBoltLib, READ_UINT16(_huckBgPic));
_huckHotSpotCount = 0;
@@ -266,7 +268,7 @@ bool BoltEngine::initHuckDisplay() {
return true;
}
-bool BoltEngine::loadHuckResources() {
+bool CarnivalEngine::loadHuckResources() {
int16 stateIdx = _huckState.levelNumber - 1;
int16 giftGroupId = (stateIdx << 10) + 0x100;
_huckGiftGroupId = giftGroupId;
@@ -300,14 +302,14 @@ bool BoltEngine::loadHuckResources() {
return true;
}
-void BoltEngine::unloadHuckResources() {
+void CarnivalEngine::unloadHuckResources() {
_xp->stopCycle();
_xp->hideCursor();
freeBOLTGroup(_huckBoltLib, _huckVariantGroupId, 1);
freeBOLTGroup(_huckBoltLib, _huckGiftGroupId, 1);
}
-bool BoltEngine::initHuckLevel() {
+bool CarnivalEngine::initHuckLevel() {
// Advance slot variant (wraps 0..2)
int16 stateIdx = _huckState.levelNumber - 1;
_huckState.slotIndex[stateIdx]++;
@@ -355,7 +357,7 @@ bool BoltEngine::initHuckLevel() {
return true;
}
-bool BoltEngine::resumeHuckLevel() {
+bool CarnivalEngine::resumeHuckLevel() {
if (!loadHuckResources())
return false;
@@ -370,7 +372,7 @@ bool BoltEngine::resumeHuckLevel() {
return true;
}
-bool BoltEngine::initHuck() {
+bool CarnivalEngine::initHuck() {
_xp->randomize();
_huckSoundPlaying = 0;
@@ -436,7 +438,7 @@ bool BoltEngine::initHuck() {
return resumeHuckLevel();
}
-void BoltEngine::huckToggleBlinking(int16 *state, int16 which) {
+void CarnivalEngine::huckToggleBlinking(int16 *state, int16 which) {
*state = (*state == 0) ? 1 : 0;
if (*state)
setHuckColors(which);
@@ -444,7 +446,7 @@ void BoltEngine::huckToggleBlinking(int16 *state, int16 which) {
restoreHuckColors(which);
}
-void BoltEngine::huckUpdateHotSpots(int16 x, int16 y) {
+void CarnivalEngine::huckUpdateHotSpots(int16 x, int16 y) {
Common::Rect helpRect(
READ_UINT16(_huckGiftPic + 0x84), READ_UINT16(_huckGiftPic + 0x88),
READ_UINT16(_huckGiftPic + 0x86), READ_UINT16(_huckGiftPic + 0x8A));
@@ -472,7 +474,7 @@ void BoltEngine::huckUpdateHotSpots(int16 x, int16 y) {
}
}
-int16 BoltEngine::findGift(int16 x, int16 y) {
+int16 CarnivalEngine::findGift(int16 x, int16 y) {
byte *sprite0 = memberAddr(_huckBoltLib, _huckState.drawTable1[0]);
int16 sprH = READ_UINT16(sprite0 + 0x0A);
int16 sprW = READ_UINT16(sprite0 + 0x0C);
@@ -505,7 +507,7 @@ int16 BoltEngine::findGift(int16 x, int16 y) {
return -1;
}
-bool BoltEngine::handleGiftSelect(int16 x, int16 y) {
+bool CarnivalEngine::handleGiftSelect(int16 x, int16 y) {
int16 slot = findGift(x, y);
if (slot == -1)
return false;
@@ -552,7 +554,7 @@ bool BoltEngine::handleGiftSelect(int16 x, int16 y) {
return true;
}
-void BoltEngine::huckHandleActionButton(int16 x, int16 y) {
+void CarnivalEngine::huckHandleActionButton(int16 x, int16 y) {
bool var_6 = false;
bool var_4 = false;
@@ -612,7 +614,7 @@ void BoltEngine::huckHandleActionButton(int16 x, int16 y) {
}
}
-void BoltEngine::giftSwap() {
+void CarnivalEngine::giftSwap() {
if (_huckState.giftCount <= 2)
return;
@@ -690,7 +692,7 @@ void BoltEngine::giftSwap() {
drawGift(slotB);
}
-void BoltEngine::resolveHuckSelection() {
+void CarnivalEngine::resolveHuckSelection() {
if (!_huckState.selectionPending)
return;
@@ -717,7 +719,7 @@ void BoltEngine::resolveHuckSelection() {
}
}
-void BoltEngine::handleEvent(int16 eventType, uint32 eventData) {
+void CarnivalEngine::handleEvent(int16 eventType, uint32 eventData) {
switch (eventType) {
case etMouseDown:
huckHandleActionButton(_huckCursorX, _huckCursorY);
@@ -825,7 +827,7 @@ void BoltEngine::handleEvent(int16 eventType, uint32 eventData) {
}
}
-void BoltEngine::playHuck() {
+void CarnivalEngine::playHuck() {
_huckReturnBooth = 0x10;
while (!shouldQuit()) {
@@ -849,7 +851,7 @@ void BoltEngine::playHuck() {
_huckReturnBooth = 0;
}
-void BoltEngine::cleanUpHuck() {
+void CarnivalEngine::cleanUpHuck() {
unloadHuckResources();
if (_huckScratchPic.pixelData) {
@@ -894,7 +896,7 @@ void BoltEngine::cleanUpHuck() {
_xp->updateDisplay();
}
-int16 BoltEngine::huckGame(int16 prevBooth) {
+int16 CarnivalEngine::huckGame(int16 prevBooth) {
if (!openBOLTLib(&_huckBoltLib, &_huckBoltCallbacks, assetPath("huck.blt")))
return _huckReturnBooth;
@@ -911,7 +913,7 @@ int16 BoltEngine::huckGame(int16 prevBooth) {
return _huckReturnBooth;
}
-void BoltEngine::swapHuckWordArray() {
+void CarnivalEngine::swapHuckWordArray() {
byte *ptr = _boltCurrentMemberEntry->dataPtr;
if (!ptr)
return;
@@ -921,7 +923,7 @@ void BoltEngine::swapHuckWordArray() {
WRITE_UINT16(ptr, READ_BE_UINT16(ptr));
}
-void BoltEngine::swapHuckWords() {
+void CarnivalEngine::swapHuckWords() {
byte *ptr = _boltCurrentMemberEntry->dataPtr;
if (!ptr)
return;
@@ -930,4 +932,6 @@ void BoltEngine::swapHuckWords() {
WRITE_UINT16(ptr + 2, READ_BE_UINT16(ptr + 2));
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/scooby.cpp b/engines/bolt/carnival/booths/scooby.cpp
similarity index 96%
rename from engines/bolt/booths/scooby.cpp
rename to engines/bolt/carnival/booths/scooby.cpp
index 262754d2a89..8dd1d0c5071 100644
--- a/engines/bolt/booths/scooby.cpp
+++ b/engines/bolt/carnival/booths/scooby.cpp
@@ -21,11 +21,13 @@
#include "common/memstream.h"
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-bool BoltEngine::loadScoobyBaseAssets() {
+namespace Carnival {
+
+bool CarnivalEngine::loadScoobyBaseAssets() {
if (!getBOLTGroup(_scoobyBoltLib, 0, 1))
return false;
@@ -33,11 +35,11 @@ bool BoltEngine::loadScoobyBaseAssets() {
return true;
}
-void BoltEngine::cleanUpScoobyBaseAssets() {
+void CarnivalEngine::cleanUpScoobyBaseAssets() {
freeBOLTGroup(_scoobyBoltLib, 0, 1);
}
-void BoltEngine::displayPicClipHack(byte *pic, int16 offsetX, int16 offsetY, int16 *clipRect, int16 displayMode) {
+void CarnivalEngine::displayPicClipHack(byte *pic, int16 offsetX, int16 offsetY, int16 *clipRect, int16 displayMode) {
int16 clipW = clipRect[2];
int16 clipH = clipRect[3];
@@ -64,7 +66,7 @@ void BoltEngine::displayPicClipHack(byte *pic, int16 offsetX, int16 offsetY, int
displayMode);
}
-void BoltEngine::drawMovingWalls(int16 cellIdx, int16 direction, int16 picFrame, int16 bgFrame) {
+void CarnivalEngine::drawMovingWalls(int16 cellIdx, int16 direction, int16 picFrame, int16 bgFrame) {
// Clamp frames to valid range
if (picFrame > 5)
picFrame = 5;
@@ -156,7 +158,7 @@ void BoltEngine::drawMovingWalls(int16 cellIdx, int16 direction, int16 picFrame,
}
}
-void BoltEngine::drawAllMovingWalls() {
+void CarnivalEngine::drawAllMovingWalls() {
ScoobyState *state = &_scoobyGameState;
// Phase 1: Draw open passages between adjacent cells (both sides state 2)
@@ -235,7 +237,7 @@ void BoltEngine::drawAllMovingWalls() {
}
}
-void BoltEngine::animateTransition(int16 memberIdx) {
+void CarnivalEngine::animateTransition(int16 memberIdx) {
_scoobyGameState.spriteFrameCount = 1;
_scoobyGameState.frameData[0] = memberAddr(_scoobyBoltLib, memberIdx - 1);
@@ -246,7 +248,7 @@ void BoltEngine::animateTransition(int16 memberIdx) {
_scoobyGameState.velocityY = 0;
}
-void BoltEngine::clearPictMSb(byte *pic) {
+void CarnivalEngine::clearPictMSb(byte *pic) {
// Check if bit 8 of flags word at pic+0 is set (byte at pic+1, bit 0)
if (READ_UINT16(pic) & 0x100)
return;
@@ -259,7 +261,7 @@ void BoltEngine::clearPictMSb(byte *pic) {
}
}
-void BoltEngine::initScoobyLevelGraphics() {
+void CarnivalEngine::initScoobyLevelGraphics() {
// Get palette from level data
byte *palette = memberAddr(_scoobyBoltLib, READ_UINT16(_scoobyLevelData));
@@ -326,7 +328,7 @@ void BoltEngine::initScoobyLevelGraphics() {
_xp->updateDisplay();
}
-bool BoltEngine::initScoobyLevelAssets() {
+bool CarnivalEngine::initScoobyLevelAssets() {
uint32 maxPicSize = 0;
// Compute graphics group index from level number
@@ -430,12 +432,12 @@ bool BoltEngine::initScoobyLevelAssets() {
return true;
}
-void BoltEngine::cleanUpScoobyLevelGraphics() {
+void CarnivalEngine::cleanUpScoobyLevelGraphics() {
_xp->stopCycle();
freeBOLTGroup(_scoobyBoltLib, _scoobySelectedGraphicsGroup, 1);
}
-void BoltEngine::setScoobySpriteDirection(int16 startMember) {
+void CarnivalEngine::setScoobySpriteDirection(int16 startMember) {
_scoobyGameState.spriteFrameCount = 6;
int16 memberIdx = startMember;
@@ -446,7 +448,7 @@ void BoltEngine::setScoobySpriteDirection(int16 startMember) {
setSSpriteFrames(&_scoobySprite, _scoobyGameState.spriteFrameCount, _scoobyGameState.frameData, 1);
}
-void BoltEngine::playSoundMapScooby(int16 memberIdx) {
+void CarnivalEngine::playSoundMapScooby(int16 memberIdx) {
byte *soundData = getBOLTMember(_scoobyBoltLib, memberIdx);
uint32 soundSize = memberSize(_scoobyBoltLib, memberIdx);
@@ -455,7 +457,7 @@ void BoltEngine::playSoundMapScooby(int16 memberIdx) {
}
}
-void BoltEngine::playWallSound() {
+void CarnivalEngine::playWallSound() {
if (_scoobySoundPlaying == 0)
return;
@@ -500,7 +502,7 @@ void BoltEngine::playWallSound() {
playSoundMapScooby(soundMember);
}
-void BoltEngine::animateWalls() {
+void CarnivalEngine::animateWalls() {
// Phase 1: Animate current cell's walls
int16 curCell = _scoobyGameState.scoobyCell;
@@ -645,7 +647,7 @@ void BoltEngine::animateWalls() {
}
}
-void BoltEngine::decideDirection() {
+void CarnivalEngine::decideDirection() {
int16 cell = _scoobyGameState.scoobyCell;
int16 targetDir = _scoobyGameState.transitionTarget;
@@ -752,7 +754,7 @@ void BoltEngine::decideDirection() {
}
}
-void BoltEngine::updateScoobySound() {
+void CarnivalEngine::updateScoobySound() {
switch (_scoobySoundMode) {
case 0:
if (_scoobySoundPlaying == 0) {
@@ -771,14 +773,14 @@ void BoltEngine::updateScoobySound() {
}
}
-void BoltEngine::setScoobySound(int16 mode) {
+void CarnivalEngine::setScoobySound(int16 mode) {
if (mode != _scoobySoundMode) {
_scoobySoundMode = mode;
updateScoobySound();
}
}
-void BoltEngine::updateScoobyLocation() {
+void CarnivalEngine::updateScoobyLocation() {
Common::Point loc;
getSSpriteLoc(&_scoobySprite, &loc);
_scoobyGameState.scoobyX = loc.x;
@@ -878,7 +880,7 @@ void BoltEngine::updateScoobyLocation() {
_scoobyGameState.slotIndex[slotIdx] = 0;
}
-void BoltEngine::updateScoobyWalls() {
+void CarnivalEngine::updateScoobyWalls() {
if (_scoobyWallAnimating != 0) {
_scoobyWallAnimStep++;
if (_scoobyWallAnimStep > 5) {
@@ -1021,7 +1023,7 @@ void BoltEngine::updateScoobyWalls() {
}
}
-void BoltEngine::updateScoobyDirection(int16 inputDir) {
+void CarnivalEngine::updateScoobyDirection(int16 inputDir) {
int16 cell = _scoobyGameState.scoobyCell;
// If at cell center, wall passable, and no transition active then accept immediately
@@ -1113,7 +1115,7 @@ void BoltEngine::updateScoobyDirection(int16 inputDir) {
}
}
-void BoltEngine::updateScoobyTransition() {
+void CarnivalEngine::updateScoobyTransition() {
if (_scoobyTransitioning != 0) {
// Active transition in progress
switch (_scoobyTransitionTarget) {
@@ -1337,7 +1339,7 @@ epilogue:
setScoobySound(soundMode);
}
-bool BoltEngine::initScoobyLevel() {
+bool CarnivalEngine::initScoobyLevel() {
if (!initScoobyLevelAssets())
return false;
@@ -1389,7 +1391,7 @@ skipLevelSet:
return true;
}
-bool BoltEngine::resumeScoobyLevel() {
+bool CarnivalEngine::resumeScoobyLevel() {
if (!initScoobyLevelAssets())
return false;
@@ -1412,7 +1414,7 @@ bool BoltEngine::resumeScoobyLevel() {
return true;
}
-bool BoltEngine::initScooby() {
+bool CarnivalEngine::initScooby() {
_xp->randomize();
_scoobyMoveRequested = 0;
@@ -1508,7 +1510,7 @@ bool BoltEngine::initScooby() {
return true;
}
-void BoltEngine::cleanUpScooby() {
+void CarnivalEngine::cleanUpScooby() {
vSave(&_scoobyGlobalSaveData, 0x3C, "ScoobyGlobal");
// Serialize the game state into a flat 0x11A-byte BE buffer
@@ -1567,7 +1569,7 @@ void BoltEngine::cleanUpScooby() {
_xp->updateDisplay();
}
-int16 BoltEngine::helpScooby() {
+int16 CarnivalEngine::helpScooby() {
int16 selection = 2;
int16 isPlaying = 0;
int16 soundParam = 0;
@@ -1829,7 +1831,7 @@ int16 BoltEngine::helpScooby() {
return selection;
}
-void BoltEngine::hiliteScoobyHelpObject(byte *entry, int16 highlight) {
+void CarnivalEngine::hiliteScoobyHelpObject(byte *entry, int16 highlight) {
if (!entry)
return;
@@ -1844,7 +1846,7 @@ void BoltEngine::hiliteScoobyHelpObject(byte *entry, int16 highlight) {
}
}
-int16 BoltEngine::xpDirToBOLTDir(uint32 xpDir) {
+int16 CarnivalEngine::xpDirToBOLTDir(uint32 xpDir) {
// xpDir packs (X << 16 | Y & 0xFFFF) where X,Y are -1/0/1
// Returns BOLT direction:
// 0=up, 1=up-right, 2=right, 3=down-right,
@@ -1872,7 +1874,7 @@ int16 BoltEngine::xpDirToBOLTDir(uint32 xpDir) {
return 0;
}
-int16 BoltEngine::playScooby() {
+int16 CarnivalEngine::playScooby() {
int16 inputDir = -1;
// Check if help screen should show on startup
@@ -1930,7 +1932,7 @@ int16 BoltEngine::playScooby() {
return 0;
}
-int16 BoltEngine::scoobyGame(int16 prevBooth) {
+int16 CarnivalEngine::scoobyGame(int16 prevBooth) {
int16 result = 5;
if (!openBOLTLib(&_scoobyBoltLib, &_scoobyBoltCallbacks, assetPath("scooby.blt")))
@@ -1949,7 +1951,7 @@ int16 BoltEngine::scoobyGame(int16 prevBooth) {
return result;
}
-void BoltEngine::swapScoobyHelpEntry() {
+void CarnivalEngine::swapScoobyHelpEntry() {
byte *data = _boltCurrentMemberEntry->dataPtr;
if (data == nullptr)
return;
@@ -1962,7 +1964,7 @@ void BoltEngine::swapScoobyHelpEntry() {
unpackColors(13, data + 0x0E);
}
-void BoltEngine::swapScoobyWordArray() {
+void CarnivalEngine::swapScoobyWordArray() {
byte *data = _boltCurrentMemberEntry->dataPtr;
if (data == nullptr)
return;
@@ -1975,4 +1977,6 @@ void BoltEngine::swapScoobyWordArray() {
}
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/topcat.cpp b/engines/bolt/carnival/booths/topcat.cpp
similarity index 96%
rename from engines/bolt/booths/topcat.cpp
rename to engines/bolt/carnival/booths/topcat.cpp
index 5690af46d6d..398194ce931 100644
--- a/engines/bolt/booths/topcat.cpp
+++ b/engines/bolt/carnival/booths/topcat.cpp
@@ -19,11 +19,13 @@
*
*/
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-int16 Bolt::BoltEngine::topCatGame(int16 prevBooth) {
+namespace Carnival {
+
+int16 CarnivalEngine::topCatGame(int16 prevBooth) {
int16 savedTimer = _xp->setInactivityTimer(30);
if (!initTopCat()) {
@@ -38,7 +40,7 @@ int16 Bolt::BoltEngine::topCatGame(int16 prevBooth) {
return result;
}
-bool BoltEngine::initTopCat() {
+bool CarnivalEngine::initTopCat() {
_topCatRtfHandle = openRTF(assetPath(_displayMode != 0 ? "topcatcr.av" : "topcatog.av"));
if (!_topCatRtfHandle)
return false;
@@ -210,7 +212,7 @@ bool BoltEngine::initTopCat() {
return true;
}
-void BoltEngine::cleanUpTopCat() {
+void CarnivalEngine::cleanUpTopCat() {
_xp->stopSound();
_xp->stopCycle();
@@ -281,7 +283,7 @@ void BoltEngine::cleanUpTopCat() {
#endif
}
-int16 BoltEngine::playTopCat() {
+int16 CarnivalEngine::playTopCat() {
int16 result = 0;
int16 exitFlag = 0;
@@ -521,7 +523,7 @@ int16 BoltEngine::playTopCat() {
}
}
-int16 BoltEngine::handleActionButton(int16 *result) {
+int16 CarnivalEngine::handleActionButton(int16 *result) {
int16 prevState = _topCatCurrentAnimType;
switch (_topCatCurrentAnimType) {
@@ -644,7 +646,7 @@ int16 BoltEngine::handleActionButton(int16 *result) {
return 0;
}
-void BoltEngine::queueAnim(int16 animType, int16 param) {
+void CarnivalEngine::queueAnim(int16 animType, int16 param) {
int16 slot = _topCatAnimQueueSize;
_topCatAnimQueueSize++;
@@ -690,7 +692,7 @@ void BoltEngine::queueAnim(int16 animType, int16 param) {
}
}
-bool BoltEngine::maintainAnim(int16 soundEvent) {
+bool CarnivalEngine::maintainAnim(int16 soundEvent) {
int16 animDone = 0;
switch (_topCatAnimStateMachineStep) {
@@ -790,7 +792,7 @@ bool BoltEngine::maintainAnim(int16 soundEvent) {
return true;
}
-void BoltEngine::maintainIdleSound(int16 decrement) {
+void CarnivalEngine::maintainIdleSound(int16 decrement) {
byte *soundData = _topCatSoundInfo.data;
int16 chunkSize = (int16)(_topCatSoundInfo.size / _topCatMaxBackgroundAnimFrames);
@@ -810,7 +812,7 @@ void BoltEngine::maintainIdleSound(int16 decrement) {
}
}
-bool BoltEngine::startNextAnim(int16 *playAnswerAnim) {
+bool CarnivalEngine::startNextAnim(int16 *playAnswerAnim) {
TopCatAnim *entry = &_topCatAnimQueue[0];
bool startResult = false;
@@ -876,7 +878,7 @@ bool BoltEngine::startNextAnim(int16 *playAnswerAnim) {
return true;
}
-void BoltEngine::setAnimType(int16 newType) {
+void CarnivalEngine::setAnimType(int16 newType) {
if (_topCatCurrentAnimType == newType)
return;
@@ -952,7 +954,7 @@ void BoltEngine::setAnimType(int16 newType) {
_topCatAnimStateMachineStep = 0;
}
-void BoltEngine::highlightObject(byte *entry, int16 highlight) {
+void CarnivalEngine::highlightObject(byte *entry, int16 highlight) {
if (!entry)
return;
@@ -967,7 +969,7 @@ void BoltEngine::highlightObject(byte *entry, int16 highlight) {
_system->updateScreen();
}
-bool BoltEngine::setupNextQuestion() {
+bool CarnivalEngine::setupNextQuestion() {
_xp->stopCycle();
int16 attempts = 0;
@@ -1035,7 +1037,7 @@ bool BoltEngine::setupNextQuestion() {
return true;
}
-void BoltEngine::adjustColors(byte *pic, int8 shift) {
+void CarnivalEngine::adjustColors(byte *pic, int8 shift) {
int16 count = READ_UINT16(pic + 0x0C);
byte *data = getResolvedPtr(pic, 0x12);
@@ -1056,7 +1058,7 @@ void BoltEngine::adjustColors(byte *pic, int8 shift) {
}
}
-void BoltEngine::shuffleTopCatQuestions() {
+void CarnivalEngine::shuffleTopCatQuestions() {
int16 answerOff = 0;
for (int16 i = 0; i < 60; i++) {
@@ -1078,7 +1080,7 @@ void BoltEngine::shuffleTopCatQuestions() {
}
}
-void BoltEngine::shuffleTopCatPermutations() {
+void CarnivalEngine::shuffleTopCatPermutations() {
// Shuffle first permutation table...
for (int16 i = 0; i < 3; i++) {
int16 randIdx = _xp->getRandom(3);
@@ -1098,12 +1100,12 @@ void BoltEngine::shuffleTopCatPermutations() {
}
}
-void BoltEngine::getTopCatSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo) {
+void CarnivalEngine::getTopCatSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo) {
soundInfo->data = memberAddr(lib, memberId);
soundInfo->size = memberSize(lib, memberId);
}
-void BoltEngine::setScoreLights(int16 litMask) {
+void CarnivalEngine::setScoreLights(int16 litMask) {
int16 lightIdx = 0;
int16 tableOff = 0;
@@ -1130,7 +1132,7 @@ void BoltEngine::setScoreLights(int16 litMask) {
_system->updateScreen();
}
-void BoltEngine::swapTopCatHelpEntry() {
+void CarnivalEngine::swapTopCatHelpEntry() {
byte *data = _boltCurrentMemberEntry->dataPtr;
uint32 decompSize = _boltCurrentMemberEntry->decompSize;
int16 offset = 0;
@@ -1149,4 +1151,6 @@ void BoltEngine::swapTopCatHelpEntry() {
}
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/booths/yogi.cpp b/engines/bolt/carnival/booths/yogi.cpp
similarity index 93%
rename from engines/bolt/booths/yogi.cpp
rename to engines/bolt/carnival/booths/yogi.cpp
index d77c33aa42f..ebbcbae0006 100644
--- a/engines/bolt/booths/yogi.cpp
+++ b/engines/bolt/carnival/booths/yogi.cpp
@@ -21,11 +21,13 @@
#include "common/memstream.h"
-#include "bolt/bolt.h"
+#include "bolt/carnival/carnival.h"
namespace Bolt {
-void BoltEngine::playSoundMapYogi(int16 memberId) {
+namespace Carnival {
+
+void CarnivalEngine::playSoundMapYogi(int16 memberId) {
byte *soundData = getBOLTMember(_yogiBoltLib, memberId);
int32 soundSize = memberSize(_yogiBoltLib, memberId);
if (soundData) {
@@ -35,7 +37,7 @@ void BoltEngine::playSoundMapYogi(int16 memberId) {
}
}
-void BoltEngine::waitSoundMapYogi() {
+void CarnivalEngine::waitSoundMapYogi() {
if (!_yogiSoundPlaying)
return;
@@ -46,28 +48,28 @@ void BoltEngine::waitSoundMapYogi() {
_yogiSoundPlaying--;
}
-void BoltEngine::stopSoundYogi() {
+void CarnivalEngine::stopSoundYogi() {
if (_yogiSoundActive) {
_xp->stopSound();
_yogiSoundActive = 0;
}
}
-void BoltEngine::setYogiColors(int16 which) {
+void CarnivalEngine::setYogiColors(int16 which) {
if (which == 0)
_xp->setPalette(_yogiPalRange[1] - _yogiPalRange[0] + 1, _yogiPalRange[0], _yogiPalHighlight0);
else if (which == 1)
_xp->setPalette(_yogiPalRange[5] - _yogiPalRange[4] + 1, _yogiPalRange[4], _yogiPalHighlight1);
}
-void BoltEngine::restoreYogiColors(int16 which) {
+void CarnivalEngine::restoreYogiColors(int16 which) {
if (which == 0)
_xp->setPalette(_yogiPalRange[1] - _yogiPalRange[0] + 1, _yogiPalRange[0], _yogiPalSave0);
else if (which == 1)
_xp->setPalette(_yogiPalRange[5] - _yogiPalRange[4] + 1, _yogiPalRange[4], _yogiPalSave1);
}
-void BoltEngine::drawBasket(int16 slot, byte *basketSprite) {
+void CarnivalEngine::drawBasket(int16 slot, byte *basketSprite) {
int16 sprStride = READ_UINT16(basketSprite + 0x0A);
int16 sprHeight = READ_UINT16(basketSprite + 0x0C);
@@ -115,7 +117,7 @@ void BoltEngine::drawBasket(int16 slot, byte *basketSprite) {
_xp->displayPic(&_yogiScratchBuf, slotX, slotY, stFront);
}
-void BoltEngine::drawAllBaskets() {
+void CarnivalEngine::drawAllBaskets() {
_xp->fillDisplay(0, stFront);
int16 basketCount = READ_UINT16(_yogiBasketPic);
@@ -133,7 +135,7 @@ void BoltEngine::drawAllBaskets() {
}
}
-void BoltEngine::handleYogiMatch() {
+void CarnivalEngine::handleYogiMatch() {
playSoundMapYogi((int16)READ_UINT16(_yogiBasketPic + 0x9E));
if (_yogiState.basketCount == 2) {
@@ -155,7 +157,7 @@ void BoltEngine::handleYogiMatch() {
waitSoundMapYogi();
}
-bool BoltEngine::loadYogiBgPic() {
+bool CarnivalEngine::loadYogiBgPic() {
int16 groupId;
if (_displayMode == 0) {
@@ -173,11 +175,11 @@ bool BoltEngine::loadYogiBgPic() {
return true;
}
-void BoltEngine::unloadYogiBgPic() {
+void CarnivalEngine::unloadYogiBgPic() {
freeBOLTGroup(_yogiBoltLib, 0x100, 1);
}
-void BoltEngine::drawYogiLevel() {
+void CarnivalEngine::drawYogiLevel() {
byte *palSprite = memberAddr(_yogiBoltLib, READ_UINT16(_yogiBasketPic + 0x72));
_yogiSoundActive = 0;
@@ -224,7 +226,7 @@ void BoltEngine::drawYogiLevel() {
_xp->getPalette(_yogiPalRange[6], _yogiPalRange[7] - _yogiPalRange[6] + 1, _yogiPalHighlight1);
}
-bool BoltEngine::loadYogiLevel() {
+bool CarnivalEngine::loadYogiLevel() {
int32 maxSize = 0;
_yogiLevelGroupId = (_yogiState.levelNumber - 1) * 0x100 + 0x300;
@@ -260,14 +262,14 @@ bool BoltEngine::loadYogiLevel() {
return true;
}
-void BoltEngine::unloadYogiResources() {
+void CarnivalEngine::unloadYogiResources() {
_xp->hideCursor();
int16 basketGroupId = (_yogiLevelId << 8) + 0xD00;
freeBOLTGroup(_yogiBoltLib, basketGroupId, 1);
freeBOLTGroup(_yogiBoltLib, _yogiLevelGroupId, 1);
}
-bool BoltEngine::initYogiLevel() {
+bool CarnivalEngine::initYogiLevel() {
_yogiState.currentSlot++;
if (_yogiState.currentSlot >= 10)
_yogiState.currentSlot = 0;
@@ -319,7 +321,7 @@ bool BoltEngine::initYogiLevel() {
return true;
}
-bool BoltEngine::resumeYogiLevel() {
+bool CarnivalEngine::resumeYogiLevel() {
_yogiLevelId = _yogiState.slotIndex[_yogiState.currentSlot];
if (!loadYogiLevel())
@@ -329,7 +331,7 @@ bool BoltEngine::resumeYogiLevel() {
return true;
}
-bool BoltEngine::initYogi() {
+bool CarnivalEngine::initYogi() {
_yogiSoundPlaying = 0;
if (!loadYogiBgPic())
@@ -408,7 +410,7 @@ bool BoltEngine::initYogi() {
return resumeYogiLevel();
}
-void BoltEngine::yogiToggleBlinking(int16 which, int16 *state) {
+void CarnivalEngine::yogiToggleBlinking(int16 which, int16 *state) {
*state = (*state == 0) ? 1 : 0;
if (*state)
setYogiColors(which);
@@ -416,7 +418,7 @@ void BoltEngine::yogiToggleBlinking(int16 which, int16 *state) {
restoreYogiColors(which);
}
-void BoltEngine::yogiUpdateHotSpots(int16 x, int16 y) {
+void CarnivalEngine::yogiUpdateHotSpots(int16 x, int16 y) {
Common::Rect helpRect(
READ_UINT16(_yogiBasketPic + 0x74), READ_UINT16(_yogiBasketPic + 0x78),
READ_UINT16(_yogiBasketPic + 0x76), READ_UINT16(_yogiBasketPic + 0x7A));
@@ -443,7 +445,7 @@ void BoltEngine::yogiUpdateHotSpots(int16 x, int16 y) {
}
}
-int16 BoltEngine::findBasket(int16 x, int16 y) {
+int16 CarnivalEngine::findBasket(int16 x, int16 y) {
int16 basketCount = READ_UINT16(_yogiBasketPic);
for (int16 i = basketCount - 1; i >= 0; i--) {
if (_yogiState.basketState[i] != 0)
@@ -470,7 +472,7 @@ int16 BoltEngine::findBasket(int16 x, int16 y) {
return -1;
}
-void BoltEngine::resolveYogiSelection() {
+void CarnivalEngine::resolveYogiSelection() {
if (_yogiState.sound1 == _yogiState.sound2) {
_yogiState.basketState[_yogiState.selected1Slot] = 1;
_yogiState.basketState[_yogiState.selected2Slot] = 1;
@@ -496,7 +498,7 @@ void BoltEngine::resolveYogiSelection() {
}
}
-bool BoltEngine::handleBasketSelect(int16 x, int16 y) {
+bool CarnivalEngine::handleBasketSelect(int16 x, int16 y) {
int16 slot = findBasket(x, y);
if (slot == -1)
return false;
@@ -558,7 +560,7 @@ bool BoltEngine::handleBasketSelect(int16 x, int16 y) {
return true;
}
-void BoltEngine::yogiHandleActionButton(int16 x, int16 y) {
+void CarnivalEngine::yogiHandleActionButton(int16 x, int16 y) {
bool didAction = false;
bool stoppedAnim = false;
@@ -617,7 +619,7 @@ void BoltEngine::yogiHandleActionButton(int16 x, int16 y) {
}
}
-void BoltEngine::handleYogiEvent(int16 eventType, uint32 eventData) {
+void CarnivalEngine::handleYogiEvent(int16 eventType, uint32 eventData) {
switch (eventType) {
case etMouseDown:
yogiHandleActionButton(_yogiCursorX, _yogiCursorY);
@@ -688,7 +690,7 @@ void BoltEngine::handleYogiEvent(int16 eventType, uint32 eventData) {
}
}
-void BoltEngine::playYogi() {
+void CarnivalEngine::playYogi() {
_yogiReturnBooth = 16;
while (!shouldQuit()) {
@@ -712,7 +714,7 @@ void BoltEngine::playYogi() {
_yogiReturnBooth = 0;
}
-void BoltEngine::cleanUpYogi() {
+void CarnivalEngine::cleanUpYogi() {
if (_yogiScratchBuf.pixelData) {
_xp->freeMem(_yogiScratchBuf.pixelData);
_yogiScratchBuf.pixelData = nullptr;
@@ -764,7 +766,7 @@ void BoltEngine::cleanUpYogi() {
_xp->updateDisplay();
}
-int16 BoltEngine::yogiGame(int16 prevBooth) {
+int16 CarnivalEngine::yogiGame(int16 prevBooth) {
if (!openBOLTLib(&_yogiBoltLib, &_yogiBoltCallbacks, assetPath("yogi.blt")))
return _yogiReturnBooth;
@@ -780,7 +782,7 @@ int16 BoltEngine::yogiGame(int16 prevBooth) {
return _yogiReturnBooth;
}
-void BoltEngine::swapYogiAllWords() {
+void CarnivalEngine::swapYogiAllWords() {
byte *ptr = _boltCurrentMemberEntry->dataPtr;
if (!ptr)
return;
@@ -792,7 +794,7 @@ void BoltEngine::swapYogiAllWords() {
}
}
-void BoltEngine::swapYogiFirstWord() {
+void CarnivalEngine::swapYogiFirstWord() {
byte *ptr = (byte *)_boltCurrentMemberEntry->dataPtr;
if (!ptr)
return;
@@ -800,4 +802,6 @@ void BoltEngine::swapYogiFirstWord() {
WRITE_UINT16(ptr, READ_BE_UINT16(ptr));
}
+} // End of namespace Carnival
+
} // End of namespace Bolt
diff --git a/engines/bolt/carnival/carnival.cpp b/engines/bolt/carnival/carnival.cpp
new file mode 100644
index 00000000000..e88a43d4947
--- /dev/null
+++ b/engines/bolt/carnival/carnival.cpp
@@ -0,0 +1,171 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "bolt/carnival/carnival.h"
+
+namespace Bolt {
+
+namespace Carnival {
+
+CarnivalEngine::CarnivalEngine(OSystem *syst, const ADGameDescription *gameDesc)
+ : BoltEngine(syst, gameDesc) {
+ initCallbacks();
+}
+
+void CarnivalEngine::boltMain() {
+ byte *testAlloc;
+ BarkerTable *barkerTable;
+ byte *boothSprite;
+
+ testAlloc = (byte *)_xp->allocMem(0x100000);
+ if (!testAlloc)
+ return;
+
+ _xp->freeMem(testAlloc);
+
+ _xp->randomize();
+
+ if (allocResourceIndex()) {
+ _boothsBoltLib = nullptr;
+
+ if (openBOLTLib(&_boothsBoltLib, &_boothsBoltCallbacks, assetPath("booths.blt"))) {
+ int16 chosenSpecId = _extendedViewport ? 0 : 1;
+
+ if (_xp->setDisplaySpec(&_displayMode, &_displaySpecs[chosenSpecId])) {
+ assert(_displayMode >= 0);
+ _displayWidth = _displaySpecs[_displayMode].width;
+ _displayHeight = _displaySpecs[_displayMode].height;
+
+ // Center within 384x240 virtual coordinate space...
+ _displayX = (EXTENDED_SCREEN_WIDTH - _displayWidth) / 2;
+ _displayY = (EXTENDED_SCREEN_HEIGHT - _displayHeight) / 2;
+
+ _xp->setCoordSpec(_displayX, _displayY, _displayWidth, _displayHeight);
+
+ if (_displayMode == 0) {
+ _rtfHandle = openRTF(assetPath("cc_og.av"));
+ } else {
+ _rtfHandle = openRTF(assetPath("cc_cr.av"));
+ }
+
+ if (_rtfHandle) {
+ int16 boothGroupBase = _isDemo ? 0x0E00 : 0x1700;
+
+ if (!_isDemo) {
+ playAV(_rtfHandle, 0, _displayWidth, _displayHeight, _displayX, _displayY);
+ }
+
+ boothSprite = getBOLTMember(_boothsBoltLib, (_displayMode != 0) ? (boothGroupBase + 1) : (boothGroupBase + 2));
+
+ _xp->setTransparency(false);
+
+ displayColors(getBOLTMember(_boothsBoltLib, boothGroupBase), stFront, 0);
+ displayPic(boothSprite, _displayX, _displayY, stFront);
+
+ _xp->updateDisplay();
+
+ displayColors(getBOLTMember(_boothsBoltLib, boothGroupBase), stBack, 0);
+ displayPic(boothSprite, _displayX, _displayY, stBack);
+
+ playAV(_rtfHandle, _isDemo ? 0 : 2, _displayWidth, _displayHeight, _displayX, _displayY);
+
+ freeBOLTGroup(_boothsBoltLib, boothGroupBase, 1);
+
+ if (getBOLTGroup(_boothsBoltLib, 0, 1)) {
+ setCursorPict(memberAddr(_boothsBoltLib, 0));
+
+ if (initVRam(1500)) {
+ barkerTable = createBarker(2, _isDemo ? 19 : 17);
+ if (barkerTable) {
+ // Register booth handlers...
+ registerSideShow(barkerTable, &CarnivalEngine::hucksBooth, 3);
+ registerSideShow(barkerTable, &CarnivalEngine::fredsBooth, 4);
+ registerSideShow(barkerTable, &CarnivalEngine::scoobysBooth, 5);
+ registerSideShow(barkerTable, &CarnivalEngine::yogisBooth, 6);
+ registerSideShow(barkerTable, &CarnivalEngine::georgesBooth, 7);
+ registerSideShow(barkerTable, &CarnivalEngine::topCatsBooth, 8);
+ registerSideShow(barkerTable, &CarnivalEngine::mainEntrance, 9);
+ registerSideShow(barkerTable, &CarnivalEngine::huckGame, 10);
+ registerSideShow(barkerTable, &CarnivalEngine::fredGame, 11);
+ registerSideShow(barkerTable, &CarnivalEngine::scoobyGame, 12);
+ registerSideShow(barkerTable, &CarnivalEngine::yogiGame, 13);
+ registerSideShow(barkerTable, &CarnivalEngine::georgeGame, 14);
+ registerSideShow(barkerTable, &CarnivalEngine::topCatGame, 15);
+ registerSideShow(barkerTable, &CarnivalEngine::winALetter, 16);
+
+ if (_isDemo) {
+ registerSideShow(barkerTable, &CarnivalEngine::displayDemoPict, 17);
+ registerSideShow(barkerTable, &CarnivalEngine::endDemo, 18);
+ }
+
+ _lettersWon = 0;
+ _xp->setScreenSaverTimer(1800);
+
+ // The barker function runs the main loop, starting at mainEntrance()...
+ if (!checkError())
+ barker(barkerTable, 9);
+
+ freeBarker(barkerTable);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ freeBOLTGroup(_boothsBoltLib, 0, 1);
+
+ if (_boothsBoltLib != 0)
+ closeBOLTLib(&_boothsBoltLib);
+
+ if (_rtfHandle != nullptr)
+ closeRTF(_rtfHandle);
+
+ freeVRam();
+ freeResourceIndex();
+}
+
+
+int16 CarnivalEngine::displayDemoPict(int16 prevBooth) {
+ uint32 eventData;
+
+ while (_xp->getEvent(etMouseDown, &eventData) == etMouseDown);
+
+ while (_xp->getEvent(etTimer, &eventData) != etTimer);
+
+ _xp->stopCycle();
+ _xp->setTransparency(false);
+
+ int16 memberId = (_displayMode != 0) ? 0x1002 : 0x1001;
+ displayPic(getBOLTMember(_boothsBoltLib, memberId), _displayX, _displayY, stFront);
+ displayColors(getBOLTMember(_boothsBoltLib, 0x1000), stFront, 0);
+
+ _xp->updateDisplay();
+
+ while (_xp->getEvent(etMouseDown, &eventData) != etMouseDown);
+
+ return prevBooth;
+}
+
+} // End of namespace Carnival
+
+} // End of namespace Bolt
diff --git a/engines/bolt/carnival/carnival.h b/engines/bolt/carnival/carnival.h
new file mode 100644
index 00000000000..8bf4c0124ef
--- /dev/null
+++ b/engines/bolt/carnival/carnival.h
@@ -0,0 +1,857 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef CARNIVAL_CARNIVAL_H
+#define CARNIVAL_CARNIVAL_H
+
+#include "bolt/bolt.h"
+
+namespace Bolt {
+
+namespace Carnival {
+
+class CarnivalEngine;
+typedef int16 (CarnivalEngine::*SideShowHandler)(int16 prevBooth);
+
+struct BarkerTable {
+ SideShowHandler *handlers;
+ int16 count;
+ int16 minIndex;
+ int16 maxIndex;
+};
+
+typedef struct FredEntityState {
+ uint16 flags;
+ int16 frameCountdown;
+ int16 animMode;
+ int16 frameIndex;
+ byte *animTable;
+ int16 direction;
+ int32 xPos;
+ int32 yPos;
+ int32 prevXPos;
+ int32 prevYPos;
+ int16 speed;
+ byte *pathTable;
+ int16 pathIndex;
+
+ FredEntityState() {
+ flags = 0;
+ frameCountdown = 0;
+ animMode = 0;
+ frameIndex = 0;
+ animTable = nullptr;
+ direction = 0;
+ xPos = 0;
+ yPos = 0;
+ prevXPos = 0;
+ prevYPos = 0;
+ speed = 0;
+ pathTable = nullptr;
+ pathIndex = 0;
+ }
+} FredEntityState;
+
+// HUCK GAME
+
+typedef struct HuckState {
+ int16 levelNumber;
+ int16 slotIndex[10];
+ int16 levelComplete;
+ int16 drawTable1[24];
+ int16 drawTable2[24];
+ int16 giftCount;
+ int16 hasCycle;
+ int16 selectionPending;
+ int16 selected1Slot;
+ int16 selected2Slot;
+ int16 selected1SpriteId;
+ int16 selected2SpriteId;
+
+ HuckState() {
+ levelNumber = 0;
+ memset(slotIndex, 0, sizeof(slotIndex));
+ levelComplete = 0;
+ memset(drawTable1, 0, sizeof(drawTable1));
+ memset(drawTable2, 0, sizeof(drawTable2));
+ giftCount = 0;
+ hasCycle = 0;
+ selectionPending = 0;
+ selected1Slot = 0;
+ selected2Slot = 0;
+ selected1SpriteId = 0;
+ selected2SpriteId = 0;
+ }
+} HuckState;
+
+// GEORGE GAME
+
+typedef struct GeorgeEntityState {
+ uint16 flags;
+ int16 frameCountdown;
+ int16 animMode;
+ int16 variant;
+ int16 frameIndex;
+ byte *animTable;
+ int32 joyInput;
+ int32 x;
+ int32 y;
+ int32 prevX;
+ int32 prevY;
+ int32 velX;
+ int32 velY;
+ int32 accelX;
+ int32 accelY;
+ byte *pathTable;
+ int16 pathIndex;
+
+ GeorgeEntityState() {
+ flags = 0;
+ frameCountdown = 0;
+ animMode = 0;
+ variant = 0;
+ frameIndex = 0;
+ animTable = nullptr;
+ joyInput = 0;
+ x = 0;
+ y = 0;
+ prevX = 0;
+ prevY = 0;
+ velX = 0;
+ velY = 0;
+ accelX = 0;
+ accelY = 0;
+ pathTable = nullptr;
+ pathIndex = 0;
+ }
+} GeorgeEntityState;
+
+// SCOOBY GAME
+
+typedef struct ScoobyState {
+ int16 levelNumber;
+ int16 slotIndex[10];
+ int16 levelComplete;
+ int16 wallStates[25][4];
+ int16 scoobyCell;
+ int16 scoobySavedCell;
+ int16 leftNeighbor;
+ int16 rightNeighbor;
+ int16 upNeighbor;
+ int16 downNeighbor;
+ int16 activeLevel;
+ int16 scoobyX;
+ int16 scoobyY;
+ int16 velocityX;
+ int16 velocityY;
+ int16 targetVelocityX;
+ int16 targetVelocityY;
+ int16 transitionTarget;
+ int16 currentAnim;
+ int16 direction;
+ int16 spriteFrameCount;
+ byte *frameData[6];
+
+ ScoobyState() {
+ levelNumber = 0;
+
+ for (int i = 0; i < 10; i++)
+ slotIndex[i] = 0;
+
+ levelComplete = 0;
+
+ for (int i = 0; i < 25; i++)
+ for (int j = 0; j < 4; j++)
+ wallStates[i][j] = 0;
+
+ scoobyCell = 0;
+ scoobySavedCell = 0;
+ leftNeighbor = 0;
+ rightNeighbor = 0;
+ upNeighbor = 0;
+ downNeighbor = 0;
+ activeLevel = 0;
+ scoobyX = 0;
+ scoobyY = 0;
+ velocityX = 0;
+ velocityY = 0;
+ targetVelocityX = 0;
+ targetVelocityY = 0;
+ transitionTarget = 0;
+ currentAnim = 0;
+ direction = 0;
+ spriteFrameCount = 0;
+
+ for (int i = 0; i < 6; i++)
+ frameData[i] = nullptr;
+ }
+} ScoobyState;
+
+typedef struct ScoobyRect {
+ int16 left;
+ int16 right;
+ int16 top;
+ int16 bottom;
+
+ ScoobyRect() {
+ left = 0;
+ right = 0;
+ top = 0;
+ bottom = 0;
+ }
+} ScoobyRect;
+
+// TOPCAT GAME
+
+typedef struct TopCatAnim {
+ int16 animType;
+ int16 animIndex;
+ int16 transitionToNextQuestionFlag;
+ int16 *seqPtr;
+
+ TopCatAnim() {
+ animType = 0;
+ animIndex = 0;
+ transitionToNextQuestionFlag = 0;
+ seqPtr = nullptr;
+ }
+} TopCatAnim;
+
+// YOGI GAME
+
+typedef struct YogiState {
+ int16 levelNumber;
+ int16 currentSlot;
+ int16 levelIndex[10];
+ int16 slotIndex[10];
+ int16 levelComplete;
+ int16 basketSound[24];
+ int16 basketState[24];
+ int16 basketCount;
+ int16 matchCount;
+ int16 selectionPending;
+ int16 selected1Slot;
+ int16 selected2Slot;
+ int16 sound1;
+ int16 sound2;
+
+ YogiState() {
+ levelNumber = 0;
+ currentSlot = 0;
+ memset(levelIndex, 0, sizeof(levelIndex));
+ memset(slotIndex, 0, sizeof(slotIndex));
+ levelComplete = 0;
+ memset(basketSound, 0, sizeof(basketSound));
+ memset(basketState, 0, sizeof(basketState));
+ basketCount = 0;
+ matchCount = 0;
+ selectionPending = 0;
+ selected1Slot = 0;
+ selected2Slot = 0;
+ sound1 = 0;
+ sound2 = 0;
+ }
+} YogiState;
+
+class CarnivalEngine : public BoltEngine {
+public:
+ CarnivalEngine(OSystem *syst, const ADGameDescription *gameDesc);
+
+protected:
+ // xpMain
+ void boltMain() override;
+ int16 displayDemoPict(int16 prevBooth);
+
+ void initCallbacks() override;
+
+ // Booth
+ void startCycle(byte *cycleResource);
+ void displayBooth(int16 page);
+ void playAVOverBooth(int16 animIndex);
+ int16 hucksBooth(int16 prevBooth);
+ int16 fredsBooth(int16 prevBooth);
+ int16 scoobysBooth(int16 prevBooth);
+ int16 yogisBooth(int16 prevBooth);
+ int16 georgesBooth(int16 prevBooth);
+ int16 topCatsBooth(int16 prevBooth);
+ int16 mainEntrance(int16 prevBooth);
+ bool loadBooth(int16 boothId);
+ void unloadBooth();
+ int16 openBooth(int16 boothId);
+ void closeBooth();
+ void playTour();
+ void finishPlayingHelp(int16 activeHotspot);
+ int16 hotSpotActive(int16 hotspot);
+ void hoverHotSpot();
+ int16 boothEventLoop();
+ void resetInactivityState();
+ bool handleButtonPress(int16 hotspot);
+ void blastColors(byte **paletteTable, int16 index, int16 mode);
+ void setColors(int16 index);
+ void restoreColors(int16 index);
+ void loadColors();
+ void shiftColorMap(byte *colorMap, int16 delta);
+ void playBoothAV();
+ void mainEntranceHelpBlink();
+ void boothHelpBlink();
+ void tourPaletteCycleStep();
+ void fadeToBlack(int16 steps);
+ void flushInput();
+ int16 winALetter(int16 prevBooth);
+ int16 endDemo(int16 prevBooth);
+
+ int16 _lettersWon = 0;
+ bool _allLettersWonFlag = false;
+ int _displayMode = 0;
+ int32 _displayX = 0;
+ int32 _displayY = 0;
+ int32 _displayWidth = 0;
+ int32 _displayHeight = 0;
+
+ int16 _boothLoadedMask = 0;
+ int16 _currentBoothScene = 0;
+ int16 _boothNumHotspots = 0;
+ int16 _boothNumAnimations = 0;
+ byte *_boothSceneDesc = nullptr;
+ byte *_boothHotPalDescs[4];
+ Common::Rect _boothHotspotDescs[8];
+ byte *_boothAnimDescs[7];
+ byte *_boothAnimPalDescs[4];
+ byte _savedPalettes[7][30];
+ byte _savedHotPalettes[4][9];
+ byte *_boothPalCycleData = nullptr;
+ XPPicDesc _boothLetterSprite;
+ bool _needInitCursorPos = true;
+ byte *_boothVisitSignOn = nullptr;
+ byte *_boothVisitSignOff = nullptr;
+ byte _leftDoorNavTable[3] = { 3, 2, 4 };
+ byte _rightDoorNavTable[3] = { 1, 0, 5 };
+
+ int16 _cursorX = 0;
+ int16 _cursorY = 0;
+ int16 _hoveredHotspot = 0;
+ uint32 _helpTimer = 0;
+ int16 _keyReleased = 0;
+ int16 _keyLeft = 0;
+ int16 _keyRight = 0;
+ int16 _keyUp = 0;
+ int16 _keyDown = 0;
+ int16 _helpFlag = 0;
+ int16 _keyEnter = 0;
+
+ int16 _tourStep = 0;
+ int16 _helpPlaying = 0;
+ int16 _helpIsIdle = 0;
+ int16 _idleHelpAudioAvailable = 1;
+
+ int16 _huckWins = 0;
+ int16 _fredWins = 0;
+ int16 _scoobyWins = 0;
+ int16 _yogiWins = 0;
+ int16 _georgeWins = 0;
+ int16 _topCatWins = 0;
+
+ // Barker
+ BarkerTable *createBarker(int16 minIndex, int16 maxIndex);
+ void freeBarker(BarkerTable *table);
+ bool registerSideShow(BarkerTable *table, SideShowHandler handler, int16 boothId);
+ int16 barker(BarkerTable *table, int16 startBooth);
+ bool checkError();
+
+ int16 _currentBoothId = 0;
+
+ // --- MINIGAMES ---
+
+ // --- FRED ---
+ int16 fredGame(int16 prevBooth);
+ bool initFred();
+ void cleanUpFred();
+ bool initFredLevel(int16 levelGroup, int16 palGroup);
+ void termFredLevel(int16 levelGroup, int16 palGroup);
+ void swapFredAnimEntry();
+ void swapFredAnimDesc();
+ void swapFredLevelDesc();
+ int16 playFred();
+ int16 helpFred();
+ void hiliteFredHelpObject(byte *entry, int16 highlight);
+ void helpAnimStep();
+ bool spawnBalloon();
+ int16 calcBalloonSpawnDelay();
+ int16 selectBalloonRow();
+ void setFredAnimMode(FredEntityState *state, int16 mode);
+ void renderFredScene();
+ void getFredSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo);
+ void playFredSound(SoundInfo *oneShot, SoundInfo *loop);
+ void updateFredSound();
+
+ static void resolveAllRefsCb();
+ static void swapFredAnimEntryCb();
+ static void swapFredAnimDescCb();
+ static void swapFredLevelDescCb();
+
+ BOLTLib *_fredBoltLib = nullptr;
+ BOLTCallbacks _fredBoltCallbacks;
+
+ static BOLTCallback _fredTypeLoadCallbacks[28];
+ static BOLTCallback _fredTypeFreeCallbacks[28];
+
+ byte *_fredLevelPtr = nullptr;
+ byte *_fredBackground = nullptr;
+ byte *_fredBalloonString = nullptr;
+ byte *_fredPalette = nullptr;
+ byte *_fredFacingLeftRect = nullptr;
+ byte *_fredFacingRightRect = nullptr;
+ byte *_fredTurningRect = nullptr;
+ byte *_fredBalloonRect = nullptr;
+ byte *_fredHelpEntries = nullptr;
+ byte *_fredPlayButton = nullptr;
+ byte *_fredSprites[10] = { nullptr };
+ FredEntityState **_fredEntitiesTable = nullptr;
+
+ byte *_fredRowBounds = nullptr;
+ byte *_fredShuffleTable = nullptr;
+ byte *_fredCycleRaw = nullptr;
+ byte *_fredBalloonSprite = nullptr;
+ byte *_fredPathMatrix = nullptr;
+ byte *_fredCurrentHelpObject = nullptr;
+ byte *_fredHoveredEntry = nullptr;
+
+ SoundInfo _fredSounds[4];
+
+ SoundInfo *_fredCurrentSound = nullptr;
+ SoundInfo *_fredLoopSound = nullptr;
+ SoundInfo *_fredPendingOneShot = nullptr;
+ SoundInfo *_fredPendingLoop = nullptr;
+
+ FredEntityState _fredSprite;
+
+ int16 _fredSaveData[3] = { 0, 0, 0 };
+ int16 _fredLevelIndex = 0;
+
+ int16 _fredBalloonSpawnDelay = 0;
+ int16 _fredBalloonSearchIdx = 0;
+ uint32 _fredTimer = 0;
+ int16 _fredHelpStep = -1;
+ int16 _fredShowHelp = 1;
+
+ XPCycleState _fredCycleSpecs[4];
+
+ // --- GEORGE ---
+ int16 georgeGame(int16 prevBooth);
+ bool initGeorge();
+ void cleanUpGeorge();
+ bool initGeorgeLevel(int16 level, int16 variant);
+ void termGeorgeLevel(int16 level, int16 variant);
+ void swapGeorgeFrameArray();
+ void swapGeorgeHelpEntry();
+ void swapGeorgeThresholds();
+ int16 playGeorge();
+ int16 helpGeorge();
+ void hiliteGeorgeHelpObject(byte *entry, int16 highlight);
+ void advanceHelpAnimation();
+ bool spawnSatellite();
+ int16 getRandomSatelliteWait();
+ int16 getRandomAsteroidRow();
+ bool confirmAsteroidHitTest();
+ bool spawnAsteroid();
+ int16 getRandomAsteroidWait();
+ int16 getAsteroidRow();
+ void setGeorgeAnimMode(GeorgeEntityState *sat, int16 mode);
+ void setSatelliteAnimMode(GeorgeEntityState *sat, int16 mode, int16 variant);
+ void setAsteroidAnimMode(GeorgeEntityState *sat, int16 mode, int16 variant);
+ void drawFlyingObjects();
+ void getGeorgeSoundInfo(BOLTLib *boltLib, int16 member, SoundInfo *outInfo, byte priority);
+ void playGeorgeSound(SoundInfo *newSound, SoundInfo *nextSound);
+ void updateGeorgeSound();
+
+ static void swapGeorgeFrameArrayCb();
+ static void swapGeorgeHelpEntryCb();
+ static void swapGeorgeThresholdsCb();
+
+ BOLTLib *_georgeBoltLib = nullptr;
+ BOLTCallbacks _georgeBoltCallbacks;
+
+ static BOLTCallback _georgeTypeLoadCallbacks[28];
+ static BOLTCallback _georgeTypeFreeCallbacks[28];
+
+ byte *_georgePrevActiveHelpObject = nullptr;
+ byte *_georgeActiveHelpObject = nullptr;
+ int16 _georgeHelpStep = -1;
+ int16 _georgeHelpActive = 1;
+
+ GeorgeEntityState **_georgeEntityList = nullptr;
+ int16 _georgeCarIdx = 0;
+ int16 _georgeNumSatellites = 0;
+ int16 _georgeFirstAsteroidIdx = 0;
+ int16 _georgeTotalSatellites = 0;
+ byte *_georgeCarPics[3] = { nullptr };
+ byte *_georgeHelpObjects = nullptr;
+ byte *_georgeHelpSequence = nullptr;
+ uint32 _georgeHelpTimer = 0;
+ byte *_georgeSatelliteShuffleTable = nullptr;
+ byte *_georgeAsteroidShuffleTable = nullptr;
+ int16 *_georgeSatelliteThresholds = nullptr;
+ int16 *_georgeAsteroidThresholds = nullptr;
+ byte *_georgeSatellitePaths = nullptr;
+ byte *_georgeAsteroidPaths = nullptr;
+ byte *_georgeCollisionRect = nullptr;
+ byte *_georgeSatelliteCollisionRects = nullptr;
+ byte *_georgeAsteroidCollisionRects = nullptr;
+ byte *_georgeSatelliteGfx = nullptr;
+ byte *_georgeAsteroidGfx = nullptr;
+ int16 _georgeSatelliteWait = 0;
+ int16 _georgeAsteroidWait = 0;
+ int16 _georgeSatelliteSearchIdx = 0;
+ int16 _georgeAsteroidSearchIdx = 0;
+ int16 _georgeHitSearchIdx = 0;
+ byte *_georgeBgPic = nullptr;
+ byte *_georgePalette = nullptr;
+ byte *_georgePalCycleRawData = nullptr;
+ XPCycleState _georgePalCycleSpecs[4];
+ int16 _georgeCollectedSatellitesNum = 0;
+ SoundInfo _georgeSoundCarStartUp;
+ SoundInfo _georgeSoundCarGoesAway;
+ SoundInfo _georgeSoundCarLoopHi;
+ SoundInfo _georgeSoundCarLoopLo;
+ SoundInfo _georgeSoundCarTumble;
+ SoundInfo **_georgeSatelliteSoundList = nullptr;
+ byte _georgeSoundChannelCounter = 0;
+ SoundInfo *_georgeSoundToPlay = nullptr;
+ SoundInfo *_georgeSoundCurrent = nullptr;
+ SoundInfo *_georgeSoundQueued = nullptr;
+ SoundInfo *_georgeSoundNext = nullptr;
+ int16 _georgeSaveData[3] = { 0 };
+ int16 *_georgeThresholds = nullptr;
+
+ // --- HUCK ---
+ void playSoundMapHuck(int16 memberId);
+ void waitSoundMapHuck();
+ void setHuckColors(int16 which);
+ void restoreHuckColors(int16 which);
+ void startHuckShuffleTimer();
+ void drawGift(int16 slot);
+ void drawHuckGifts();
+ void checkHuckLevelComplete();
+ bool initHuckDisplay();
+ bool loadHuckResources();
+ void unloadHuckResources();
+ bool initHuckLevel();
+ bool resumeHuckLevel();
+ bool initHuck();
+ void huckToggleBlinking(int16 *state, int16 which);
+ void huckUpdateHotSpots(int16 x, int16 y);
+ int16 findGift(int16 x, int16 y);
+ bool handleGiftSelect(int16 x, int16 y);
+ void huckHandleActionButton(int16 x, int16 y);
+ void giftSwap();
+ void resolveHuckSelection();
+ void handleEvent(int16 eventType, uint32 eventData);
+ void playHuck();
+ void cleanUpHuck();
+ int16 huckGame(int16 prevBooth);
+ void swapHuckWordArray();
+ void swapHuckWords();
+
+ static void swapHuckWordArrayCb();
+ static void swapHuckWordsCb();
+
+ BOLTLib *_huckBoltLib = nullptr;
+ BOLTCallbacks _huckBoltCallbacks;
+
+ static BOLTCallback _huckTypeLoadCallbacks[27];
+ static BOLTCallback _huckTypeFreeCallbacks[27];
+
+ int16 _huckSoundPlaying = 0;
+ int16 _huckHotSpotCount = 0;
+ int16 _huckActionState = 0;
+ uint32 _huckScreensaverTimer = 0;
+ uint32 _huckBlinkTimer = 0;
+ int16 _huckScreensaverFlag = 0;
+ int16 _huckBlinkFlag = 0;
+ uint32 _huckShuffleTimer = 0;
+ int16 _huckGlobal[30] = { 0 };
+ HuckState _huckState;
+ byte *_huckGiftPic = nullptr;
+ byte *_huckBgPic = nullptr;
+ int16 _huckGiftGroupId = 0;
+ int16 _huckVariantGroupId = 0;
+ byte *_huckBgDisplayPic = nullptr;
+ int16 _huckScrollOffset = 0;
+ int16 _huckPalRange[8] = { 0 };
+ int16 _huckReturnBooth = 0;
+ int16 _huckExitFlag = 0;
+ int16 _huckCursorX = 0;
+ int16 _huckCursorY = 0;
+ byte _huckPalSave0[15] = { 0 };
+ byte _huckPalHighlight0[15] = { 0 };
+ byte _huckPalSave1[15] = { 0 };
+ byte _huckPalHighlight1[15] = { 0 };
+ XPPicDesc _huckScratchPic;
+
+ // --- SCOOBY ---
+ bool loadScoobyBaseAssets();
+ void cleanUpScoobyBaseAssets();
+ void displayPicClipHack(byte *pic, int16 offsetX, int16 offsetY, int16 *clipRect, int16 displayMode);
+ void drawMovingWalls(int16 cellIdx, int16 direction, int16 picFrame, int16 bgFrame);
+ void drawAllMovingWalls();
+ void animateTransition(int16 memberIdx);
+ void clearPictMSb(byte *pic);
+ void initScoobyLevelGraphics();
+ bool initScoobyLevelAssets();
+ void cleanUpScoobyLevelGraphics();
+ void setScoobySpriteDirection(int16 startMember);
+ void playSoundMapScooby(int16 memberIdx);
+ void playWallSound();
+ void animateWalls();
+ void decideDirection();
+ void updateScoobySound();
+ void setScoobySound(int16 mode);
+ void updateScoobyLocation();
+ void updateScoobyWalls();
+ void updateScoobyDirection(int16 inputDir);
+ void updateScoobyTransition();
+ bool initScoobyLevel();
+ bool resumeScoobyLevel();
+ bool initScooby();
+ void cleanUpScooby();
+ int16 helpScooby();
+ void hiliteScoobyHelpObject(byte *entry, int16 highlight);
+ int16 xpDirToBOLTDir(uint32 xpDir);
+ int16 playScooby();
+ int16 scoobyGame(int16 prevBooth);
+ void swapScoobyHelpEntry();
+ void swapScoobyWordArray();
+
+ static void swapScoobyHelpEntryCb();
+ static void swapScoobyWordArrayCb();
+
+ BOLTLib *_scoobyBoltLib = nullptr;
+ BOLTCallbacks _scoobyBoltCallbacks;
+
+ static BOLTCallback _scoobyTypeLoadCallbacks[28];
+ static BOLTCallback _scoobyTypeFreeCallbacks[28];
+
+ int16 _scoobySoundMode = 0;
+ int16 _scoobySoundPlaying = 0;
+ int16 _scoobyShowHelp = 1;
+
+ int16 _scoobyLastInputDir = 0;
+ int16 _scoobyTransitionFrom = 0;
+ int16 _scoobyTransitionTarget = 0;
+ int16 _scoobyTransitionVelX = 0;
+ int16 _scoobyTransitionVelY = 0;
+ XPPicDesc _scoobyTempPic;
+ byte _scoobyGlobalSaveData[0x3C] = { 0 };
+ ScoobyState _scoobyGameState;
+ SSprite _scoobySprite;
+ byte *_scoobyBaseData = nullptr;
+ byte *_scoobyBgPic = nullptr;
+ byte *_scoobyWallPicsA[4] = { nullptr };
+ byte *_scoobyWallPicsB[5] = { nullptr };
+ ScoobyRect _scoobyCellBounds[25];
+ Common::Point _scoobyLevelStartXY[25];
+ byte *_scoobyLevelData = nullptr;
+ int16 _scoobySelectedGraphicsGroup = 0;
+ int16 _scoobyDifficulty = 0;
+ int16 _scoobyLevelCount = 0;
+ int16 _scoobyMoveRequested = 0;
+ int16 _scoobyTransitioning = 0;
+ int16 _scoobyDesiredDir = 0;
+ int16 _scoobyInputHoldCount = 0;
+ int16 _scoobyWallAnimating = 0;
+ int16 _scoobyWallAnimStep = 0;
+ int16 _scoobyWallsToOpen = 0;
+ int16 _scoobyWallsToClose = 0;
+
+ // --- TOPCAT ---
+ int16 topCatGame(int16 prevBooth);
+ bool initTopCat();
+ void cleanUpTopCat();
+ int16 playTopCat();
+ int16 handleActionButton(int16 *result);
+ void queueAnim(int16 animType, int16 param);
+ bool maintainAnim(int16 soundEvent);
+ void maintainIdleSound(int16 decrement);
+ bool startNextAnim(int16 *playAnswerAnim);
+ void setAnimType(int16 newType);
+ void highlightObject(byte *entry, int16 highlight);
+ bool setupNextQuestion();
+ void adjustColors(byte *pic, int8 shift);
+ void shuffleTopCatQuestions();
+ void shuffleTopCatPermutations();
+ void getTopCatSoundInfo(BOLTLib *lib, int16 memberId, SoundInfo *soundInfo);
+ void setScoreLights(int16 litMask);
+ void swapTopCatHelpEntry();
+
+ static void swapTopCatHelpEntryCb();
+
+ RTFResource *_topCatRtfHandle = nullptr;
+ RTFResource *_topCatAvHandle = nullptr;
+ BOLTLib *_topCatBoltLib = nullptr;
+ BOLTCallbacks _topCatBoltCallbacks;
+
+ static BOLTCallback _topCatTypeLoadCallbacks[26];
+ static BOLTCallback _topCatTypeFreeCallbacks[26];
+
+ byte *_topCatBackgroundPalette = nullptr;
+ byte *_topCatBackground = nullptr;
+ byte *_topCatBackgroundAnimationPalette = nullptr;
+ byte *_topCatGraphicsAssets = nullptr;
+
+ int16 _topCatBackgroundAnimFrame = 0;
+ int16 _topCatMaxBackgroundAnimFrames = 0;
+ int16 _topCatCurrentAnimType = 0;
+ int16 _topCatAnimStateMachineStep = 0;
+ int16 _topCatAnimQueueSize = 0;
+ int16 _topCatQueuedSoundFrames = 0;
+ byte *_topCatButtonsPalette = nullptr;
+ byte *_topCatBlinkEntries = nullptr;
+ byte *_topCatLightsPalette = nullptr;
+ int16 *_topCatBlinkSeqPtr = nullptr;
+ byte *_topCatSelectedChoiceOverlayGfx = nullptr;
+ byte *_topCatCycleData = nullptr;
+ XPCycleState _topCatCycleSpecs[4];
+ byte *_topCatShuffledQuestions = nullptr;
+ byte *_topCatShuffledAnswers = nullptr;
+ byte *_topCatAnswersPermutations = nullptr;
+ byte *_topCatAnswers = nullptr;
+ byte *_topCatAnswersScreenPositions = nullptr;
+ int16 _topCatSavedScore = 0;
+ int16 _topCatSaveHistory = 0;
+ int16 _topCatScore = 0;
+ int16 _topCatShuffledQuestionsArrayIdx = 0;
+ uint32 _topCatBlinkTimer = 0;
+ SoundInfo _topCatSoundInfo;
+ byte _topCatSavedShuffledQuestions[60] = { 0 };
+ byte _topCatSavedShuffledAnswers[60] = { 0 };
+ byte _topCatSavedAnswersPermutations[60 * 3] = { 0 };
+ byte _topCatSaveBuffer[302] = { 0 };
+ byte *_topCatHoveredEntry = nullptr;
+ byte *_topCatHelpButton = nullptr;
+ byte *_topCatBackButton = nullptr;
+ byte *_topCatBlinkEntry = nullptr;
+ int16 _topCatCycleStep = 0;
+ int16 _topCatDrawnQuestionId = 0;
+ int16 _topCatCurrentAnswerIdx = 0;
+ XPCycleState _topCatChoiceCycleState[4];
+ TopCatAnim _topCatAnimQueue[3];
+ int16 _topCatCorrectAnimIdx = 0;
+ int16 _topCatWrongAnimIdx = 0;
+ int16 _topCatShouldPlayAnswerAnim = 0;
+ int16 _topCatMaintainSoundFlag = 0;
+ int16 _topCatPermTableA[3] = { 0, 1, 2 };
+ int16 _topCatPermTableB[3] = { 0, 1, 2 };
+ int16 _topCatBlinkSeq0[5] = { 0x01, 0x00, 0x01, 0x00, 0x01 };
+ int16 _topCatBlinkSeq1[5] = { 0x03, 0x01, 0x03, 0x01, 0x03 };
+ int16 _topCatBlinkSeq2[5] = { 0x07, 0x03, 0x07, 0x03, 0x07 };
+ int16 _topCatBlinkSeq3[5] = { 0x0F, 0x07, 0x0F, 0x07, 0x0F };
+ int16 _topCatBlinkSeq4[5] = { 0x1F, 0x0F, 0x1F, 0x0F, 0x1F };
+ int16 _topCatBlinkSeq5[5] = { 0x3F, 0x1F, 0x3F, 0x1F, 0x3F };
+ int16 _topCatBlinkSeq6[25] = {
+ 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
+ 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
+ 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
+ 0x09, 0x12, 0x24, 0x09, 0x12, 0x24,
+ 0x3F
+ };
+
+ int16 *_topCatBlinkSeqTable[7] = {
+ _topCatBlinkSeq0, _topCatBlinkSeq1, _topCatBlinkSeq2,
+ _topCatBlinkSeq3, _topCatBlinkSeq4, _topCatBlinkSeq5,
+ _topCatBlinkSeq6
+ };
+
+ // --- YOGI ---
+ void playSoundMapYogi(int16 memberId);
+ void waitSoundMapYogi();
+ void stopSoundYogi();
+ void setYogiColors(int16 which);
+ void restoreYogiColors(int16 which);
+ void drawBasket(int16 slot, byte *basketSprite);
+ void drawAllBaskets();
+ void handleYogiMatch();
+ bool loadYogiBgPic();
+ void unloadYogiBgPic();
+ void drawYogiLevel();
+ bool loadYogiLevel();
+ void unloadYogiResources();
+ bool initYogiLevel();
+ bool resumeYogiLevel();
+ bool initYogi();
+ void yogiToggleBlinking(int16 which, int16 *state);
+ void yogiUpdateHotSpots(int16 x, int16 y);
+ int16 findBasket(int16 x, int16 y);
+ void resolveYogiSelection();
+ bool handleBasketSelect(int16 x, int16 y);
+ void yogiHandleActionButton(int16 x, int16 y);
+ void handleYogiEvent(int16 eventType, uint32 eventData);
+ void playYogi();
+ void cleanUpYogi();
+ int16 yogiGame(int16 prevBooth);
+
+ void swapYogiAllWords();
+ void swapYogiFirstWord();
+
+ static void swapYogiAllWordsCb();
+ static void swapYogiFirstWordCb();
+
+ BOLTLib *_yogiBoltLib = nullptr;
+ BOLTCallbacks _yogiBoltCallbacks;
+
+ static BOLTCallback _yogiTypeLoadCallbacks[27];
+ static BOLTCallback _yogiTypeFreeCallbacks[27];
+
+ int16 _yogiSoundPlaying = 0;
+ int16 _yogiSoundActive = 0;
+ int16 _yogiHotSpotCount = 0;
+ int16 _yogiAnimActive = 0;
+ uint32 _yogiBlinkTimer1 = 0;
+ uint32 _yogiBlinkTimer2 = 0;
+ int16 _yogiBlinkState1 = 0;
+ int16 _yogiBlinkState2 = 0;
+ int16 _yogiGlobal[0xA0] = { 0 };
+ YogiState _yogiState;
+ byte *_yogiBasketPic = nullptr;
+ int16 _yogiLevelGroupId = 0;
+ byte *_yogiBgPic = nullptr;
+ byte *_yogiNormalSprite = nullptr;
+ byte *_yogiHlSprite = nullptr;
+ byte *_yogiAnimSprite = nullptr;
+ int16 _yogiSpriteStride = 0;
+ int16 _yogiSpriteHeight = 0;
+ int16 _yogiPalRange[8] = { 0 };
+ int16 _yogiReturnBooth = 0;
+ int16 _yogiExitFlag = 0;
+ int16 _yogiLevelId = 0;
+ int16 _yogiCursorX = 0;
+ int16 _yogiCursorY = 0;
+ byte _yogiPalSave0[15] = { 0 };
+ byte _yogiPalHighlight0[15] = { 0 };
+ byte _yogiPalSave1[15] = { 0 };
+ byte _yogiPalHighlight1[15] = { 0 };
+ XPPicDesc _yogiScratchBuf;
+};
+
+} // End of namespace Carnival
+
+} // End of namespace Bolt
+
+#endif // CARNIVAL_CARNIVAL_H
diff --git a/engines/bolt/carnival/resource.cpp b/engines/bolt/carnival/resource.cpp
new file mode 100644
index 00000000000..bb848f9f857
--- /dev/null
+++ b/engines/bolt/carnival/resource.cpp
@@ -0,0 +1,274 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "bolt/carnival/carnival.h"
+
+namespace Bolt {
+
+namespace Carnival {
+
+void CarnivalEngine::resolveAllRefsCb() { ((CarnivalEngine *)g_engine)->resolveAllRefs(); }
+void CarnivalEngine::swapFredAnimEntryCb() { ((CarnivalEngine *)g_engine)->swapFredAnimEntry(); }
+void CarnivalEngine::swapFredAnimDescCb() { ((CarnivalEngine *)g_engine)->swapFredAnimDesc(); }
+void CarnivalEngine::swapFredLevelDescCb() { ((CarnivalEngine *)g_engine)->swapFredLevelDesc(); }
+
+void CarnivalEngine::swapGeorgeFrameArrayCb() { ((CarnivalEngine *)g_engine)->swapGeorgeFrameArray(); }
+void CarnivalEngine::swapGeorgeHelpEntryCb() { ((CarnivalEngine *)g_engine)->swapGeorgeHelpEntry(); }
+void CarnivalEngine::swapGeorgeThresholdsCb() { ((CarnivalEngine *)g_engine)->swapGeorgeThresholds(); }
+
+void CarnivalEngine::swapHuckWordArrayCb() { ((CarnivalEngine *)g_engine)->swapHuckWordArray(); }
+void CarnivalEngine::swapHuckWordsCb() { ((CarnivalEngine *)g_engine)->swapHuckWords(); }
+
+void CarnivalEngine::swapScoobyHelpEntryCb() { ((CarnivalEngine *)g_engine)->swapScoobyHelpEntry(); }
+void CarnivalEngine::swapScoobyWordArrayCb() { ((CarnivalEngine *)g_engine)->swapScoobyWordArray(); }
+
+void CarnivalEngine::swapTopCatHelpEntryCb() { ((CarnivalEngine *)g_engine)->swapTopCatHelpEntry(); }
+
+void CarnivalEngine::swapYogiAllWordsCb() { ((CarnivalEngine *)g_engine)->swapYogiAllWords(); }
+void CarnivalEngine::swapYogiFirstWordCb() { ((CarnivalEngine *)g_engine)->swapYogiFirstWord(); }
+
+BOLTCallback CarnivalEngine::_fredTypeLoadCallbacks[28];
+BOLTCallback CarnivalEngine::_fredTypeFreeCallbacks[28];
+
+BOLTCallback CarnivalEngine::_georgeTypeLoadCallbacks[28];
+BOLTCallback CarnivalEngine::_georgeTypeFreeCallbacks[28];
+
+BOLTCallback CarnivalEngine::_huckTypeLoadCallbacks[27];
+BOLTCallback CarnivalEngine::_huckTypeFreeCallbacks[27];
+
+BOLTCallback CarnivalEngine::_scoobyTypeLoadCallbacks[28];
+BOLTCallback CarnivalEngine::_scoobyTypeFreeCallbacks[28];
+
+BOLTCallback CarnivalEngine::_topCatTypeLoadCallbacks[26];
+BOLTCallback CarnivalEngine::_topCatTypeFreeCallbacks[26];
+
+BOLTCallback CarnivalEngine::_yogiTypeLoadCallbacks[27];
+BOLTCallback CarnivalEngine::_yogiTypeFreeCallbacks[27];
+
+void CarnivalEngine::initCallbacks() {
+ // --- BOOTHS ---
+ for (int i = 0; i < ARRAYSIZE(_defaultTypeLoadCallbacks); i++) {
+ _defaultTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _defaultTypeLoadCallbacks[2] = swapAllWordsCb;
+ _defaultTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _defaultTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _defaultTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _defaultTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _defaultTypeLoadCallbacks[14] = swapFirstFourWordsCb;
+
+ for (int i = 0; i < ARRAYSIZE(_defaultTypeFreeCallbacks); i++) {
+ _defaultTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _defaultTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ for (int i = 0; i < ARRAYSIZE(_defaultMemberLoadCallbacks); i++) {
+ _defaultMemberLoadCallbacks[i] = noOpCb;
+ }
+
+ for (int i = 0; i < ARRAYSIZE(_defaultMemberFreeCallbacks); i++) {
+ _defaultMemberFreeCallbacks[i] = noOpCb;
+ }
+
+ for (int i = 0; i < ARRAYSIZE(_defaultGroupLoadCallbacks); i++) {
+ _defaultGroupLoadCallbacks[i] = noOpCb;
+ }
+
+ for (int i = 0; i < ARRAYSIZE(_defaultGroupFreeCallbacks); i++) {
+ _defaultGroupFreeCallbacks[i] = noOpCb;
+ }
+
+ _boothsBoltCallbacks.typeLoadCallbacks = _defaultTypeLoadCallbacks;
+ _boothsBoltCallbacks.typeFreeCallbacks = _defaultTypeFreeCallbacks;
+ _boothsBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _boothsBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _boothsBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _boothsBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- FRED ---
+ for (int i = 0; i < ARRAYSIZE(_fredTypeLoadCallbacks); i++) {
+ _fredTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _fredTypeLoadCallbacks[2] = swapAllWordsCb;
+ _fredTypeLoadCallbacks[6] = resolveAllRefsCb;
+ _fredTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _fredTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _fredTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _fredTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _fredTypeLoadCallbacks[14] = swapFirstFourWordsCb;
+ _fredTypeLoadCallbacks[25] = swapFredAnimEntryCb;
+ _fredTypeLoadCallbacks[26] = swapFredAnimDescCb;
+ _fredTypeLoadCallbacks[27] = swapFredLevelDescCb;
+
+ for (int i = 0; i < ARRAYSIZE(_fredTypeFreeCallbacks); i++) {
+ _fredTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _fredTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _fredBoltCallbacks.typeLoadCallbacks = _fredTypeLoadCallbacks;
+ _fredBoltCallbacks.typeFreeCallbacks = _fredTypeFreeCallbacks;
+ _fredBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _fredBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _fredBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _fredBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- GEORGE ---
+ for (int i = 0; i < ARRAYSIZE(_georgeTypeLoadCallbacks); i++) {
+ _georgeTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _georgeTypeLoadCallbacks[2] = swapAllWordsCb;
+ _georgeTypeLoadCallbacks[6] = resolveAllRefsCb;
+ _georgeTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _georgeTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _georgeTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _georgeTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _georgeTypeLoadCallbacks[14] = swapFirstFourWordsCb;
+ _georgeTypeLoadCallbacks[25] = swapGeorgeFrameArrayCb;
+ _georgeTypeLoadCallbacks[26] = swapGeorgeHelpEntryCb;
+ _georgeTypeLoadCallbacks[27] = swapGeorgeThresholdsCb;
+
+ for (int i = 0; i < ARRAYSIZE(_georgeTypeFreeCallbacks); i++) {
+ _georgeTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _georgeTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _georgeBoltCallbacks.typeLoadCallbacks = _georgeTypeLoadCallbacks;
+ _georgeBoltCallbacks.typeFreeCallbacks = _georgeTypeFreeCallbacks;
+ _georgeBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _georgeBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _georgeBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _georgeBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- HUCK ---
+ for (int i = 0; i < ARRAYSIZE(_huckTypeLoadCallbacks); i++) {
+ _huckTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _huckTypeLoadCallbacks[2] = swapAllWordsCb;
+ _huckTypeLoadCallbacks[6] = resolveAllRefsCb;
+ _huckTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _huckTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _huckTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _huckTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _huckTypeLoadCallbacks[14] = swapFirstFourWordsCb;
+ _huckTypeLoadCallbacks[25] = swapHuckWordArrayCb;
+ _huckTypeLoadCallbacks[26] = swapHuckWordsCb;
+
+ for (int i = 0; i < ARRAYSIZE(_huckTypeFreeCallbacks); i++) {
+ _huckTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _huckTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _huckBoltCallbacks.typeLoadCallbacks = _huckTypeLoadCallbacks;
+ _huckBoltCallbacks.typeFreeCallbacks = _huckTypeFreeCallbacks;
+ _huckBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _huckBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _huckBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _huckBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- SCOOBY ---
+ for (int i = 0; i < ARRAYSIZE(_scoobyTypeLoadCallbacks); i++) {
+ _scoobyTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _scoobyTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _scoobyTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _scoobyTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _scoobyTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _scoobyTypeLoadCallbacks[26] = swapScoobyHelpEntryCb;
+ _scoobyTypeLoadCallbacks[27] = swapScoobyWordArrayCb;
+
+ for (int i = 0; i < ARRAYSIZE(_scoobyTypeFreeCallbacks); i++) {
+ _scoobyTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _scoobyTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _scoobyBoltCallbacks.typeLoadCallbacks = _scoobyTypeLoadCallbacks;
+ _scoobyBoltCallbacks.typeFreeCallbacks = _scoobyTypeFreeCallbacks;
+ _scoobyBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _scoobyBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _scoobyBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _scoobyBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- TOPCAT ---
+ for (int i = 0; i < ARRAYSIZE(_topCatTypeLoadCallbacks); i++) {
+ _topCatTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _topCatTypeLoadCallbacks[2] = swapAllWordsCb;
+ _topCatTypeLoadCallbacks[4] = swapAllLongsCb;
+ _topCatTypeLoadCallbacks[6] = resolveAllRefsCb;
+ _topCatTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _topCatTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _topCatTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
+ _topCatTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
+ _topCatTypeLoadCallbacks[25] = swapTopCatHelpEntryCb;
+
+ for (int i = 0; i < ARRAYSIZE(_topCatTypeFreeCallbacks); i++) {
+ _topCatTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _topCatTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _topCatBoltCallbacks.typeLoadCallbacks = _topCatTypeLoadCallbacks;
+ _topCatBoltCallbacks.typeFreeCallbacks = _topCatTypeFreeCallbacks;
+ _topCatBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _topCatBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _topCatBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _topCatBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+
+ // --- YOGI ---
+ for (int i = 0; i < ARRAYSIZE(_yogiTypeLoadCallbacks); i++) {
+ _yogiTypeLoadCallbacks[i] = noOpCb;
+ }
+
+ _yogiTypeLoadCallbacks[2] = swapAllWordsCb;
+ _yogiTypeLoadCallbacks[8] = swapSpriteHeaderCb;
+ _yogiTypeLoadCallbacks[10] = swapPicHeaderCb;
+ _yogiTypeLoadCallbacks[14] = swapFirstFourWordsCb;
+ _yogiTypeLoadCallbacks[25] = swapYogiFirstWordCb;
+ _yogiTypeLoadCallbacks[26] = swapYogiAllWordsCb;
+
+ for (int i = 0; i < ARRAYSIZE(_yogiTypeFreeCallbacks); i++) {
+ _yogiTypeFreeCallbacks[i] = noOpCb;
+ }
+
+ _yogiTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
+
+ _yogiBoltCallbacks.typeLoadCallbacks = _yogiTypeLoadCallbacks;
+ _yogiBoltCallbacks.typeFreeCallbacks = _yogiTypeFreeCallbacks;
+ _yogiBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
+ _yogiBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
+ _yogiBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
+ _yogiBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
+}
+
+} // End of namespace Carnival
+
+} // End of namespace Bolt
diff --git a/engines/bolt/crete/crete.cpp b/engines/bolt/crete/crete.cpp
new file mode 100644
index 00000000000..c005575d7b8
--- /dev/null
+++ b/engines/bolt/crete/crete.cpp
@@ -0,0 +1,44 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "bolt/crete/crete.h"
+
+namespace Bolt {
+
+namespace Crete {
+
+CreteEngine::CreteEngine(OSystem *syst, const ADGameDescription *gameDesc)
+ : BoltEngine(syst, gameDesc) {
+ initCallbacks();
+}
+
+void CreteEngine::boltMain() {
+ // TODO
+ errorUnsupportedGame("Not implemented yet");
+}
+
+void CreteEngine::initCallbacks() {
+ // TODO
+}
+
+} // End of namespace Crete
+
+} // End of namespace Bolt
diff --git a/engines/bolt/crete/crete.h b/engines/bolt/crete/crete.h
new file mode 100644
index 00000000000..32879459f31
--- /dev/null
+++ b/engines/bolt/crete/crete.h
@@ -0,0 +1,46 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef CRETE_CRETE_H
+#define CRETE_CRETE_H
+
+#include "bolt/bolt.h"
+
+namespace Bolt {
+
+namespace Crete {
+
+class CreteEngine : public BoltEngine {
+public:
+ CreteEngine(OSystem *syst, const ADGameDescription *gameDesc);
+
+protected:
+ // xpMain
+ void boltMain() override;
+
+ void initCallbacks() override;
+};
+
+} // End of namespace Crete
+
+} // End of namespace Bolt
+
+#endif // CRETE_CRETE_H
diff --git a/engines/bolt/merlin/merlin.cpp b/engines/bolt/merlin/merlin.cpp
new file mode 100644
index 00000000000..9b49d1b00db
--- /dev/null
+++ b/engines/bolt/merlin/merlin.cpp
@@ -0,0 +1,44 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "bolt/merlin/merlin.h"
+
+namespace Bolt {
+
+namespace Merlin {
+
+MerlinEngine::MerlinEngine(OSystem *syst, const ADGameDescription *gameDesc)
+ : BoltEngine(syst, gameDesc) {
+ initCallbacks();
+}
+
+void MerlinEngine::boltMain() {
+ // TODO
+ errorUnsupportedGame("Not implemented yet");
+}
+
+void MerlinEngine::initCallbacks() {
+ // TODO
+}
+
+} // End of namespace Merlin
+
+} // End of namespace Bolt
diff --git a/engines/bolt/merlin/merlin.h b/engines/bolt/merlin/merlin.h
new file mode 100644
index 00000000000..c335d8996e5
--- /dev/null
+++ b/engines/bolt/merlin/merlin.h
@@ -0,0 +1,46 @@
+/* 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef MERLIN_MERLIN_H
+#define MERLIN_MERLIN_H
+
+#include "bolt/bolt.h"
+
+namespace Bolt {
+
+namespace Merlin {
+
+class MerlinEngine : public BoltEngine {
+public:
+ MerlinEngine(OSystem *syst, const ADGameDescription *gameDesc);
+
+protected:
+ // xpMain
+ void boltMain() override;
+
+ void initCallbacks() override;
+};
+
+} // End of namespace Merlin
+
+} // End of namespace Bolt
+
+#endif // MERLIN_MERLIN_H
diff --git a/engines/bolt/metaengine.cpp b/engines/bolt/metaengine.cpp
index ef801c093fc..8c4938cdff6 100644
--- a/engines/bolt/metaengine.cpp
+++ b/engines/bolt/metaengine.cpp
@@ -24,6 +24,9 @@
#include "bolt/bolt.h"
#include "bolt/metaengine.h"
#include "bolt/detection.h"
+#include "bolt/carnival/carnival.h"
+#include "bolt/crete/crete.h"
+#include "bolt/merlin/merlin.h"
namespace Bolt {
@@ -53,7 +56,16 @@ const ADExtraGuiOptionsMap *BoltMetaEngine::getAdvancedExtraGuiOptions() const {
}
Common::Error BoltMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
- *engine = new Bolt::BoltEngine(syst, desc);
+ if (strcmp(desc->gameId, "carnival") == 0) {
+ *engine = new Bolt::Carnival::CarnivalEngine(syst, desc);
+ } else if (strcmp(desc->gameId, "crete") == 0) {
+ *engine = new Bolt::Crete::CreteEngine(syst, desc);
+ } else if (strcmp(desc->gameId, "merlin") == 0) {
+ *engine = new Bolt::Merlin::MerlinEngine(syst, desc);
+ } else {
+ return Common::kUnsupportedGameidError;
+ }
+
return Common::kNoError;
}
diff --git a/engines/bolt/module.mk b/engines/bolt/module.mk
index fe2ff69f77b..8c904d6c540 100644
--- a/engines/bolt/module.mk
+++ b/engines/bolt/module.mk
@@ -3,15 +3,19 @@ MODULE := engines/bolt
MODULE_OBJS = \
anim.o \
av.o \
- barker.o \
+ carnival/barker.o \
bolt.o \
- booth.o \
- booths/fred.o \
- booths/george.o \
- booths/huck.o \
- booths/scooby.o \
- booths/topcat.o \
- booths/yogi.o \
+ carnival/booth.o \
+ carnival/booths/fred.o \
+ carnival/booths/george.o \
+ carnival/booths/huck.o \
+ carnival/booths/scooby.o \
+ carnival/booths/topcat.o \
+ carnival/booths/yogi.o \
+ carnival/carnival.o \
+ carnival/resource.o \
+ crete/crete.o \
+ merlin/merlin.o \
metaengine.o \
resource.o \
rtf.o \
diff --git a/engines/bolt/resource.cpp b/engines/bolt/resource.cpp
index 7fe4d40bc70..58b772810df 100644
--- a/engines/bolt/resource.cpp
+++ b/engines/bolt/resource.cpp
@@ -640,24 +640,6 @@ BOLTCallback BoltEngine::_defaultMemberFreeCallbacks[25];
BOLTCallback BoltEngine::_defaultGroupLoadCallbacks[25];
BOLTCallback BoltEngine::_defaultGroupFreeCallbacks[25];
-BOLTCallback BoltEngine::_fredTypeLoadCallbacks[28];
-BOLTCallback BoltEngine::_fredTypeFreeCallbacks[28];
-
-BOLTCallback BoltEngine::_georgeTypeLoadCallbacks[28];
-BOLTCallback BoltEngine::_georgeTypeFreeCallbacks[28];
-
-BOLTCallback BoltEngine::_huckTypeLoadCallbacks[27];
-BOLTCallback BoltEngine::_huckTypeFreeCallbacks[27];
-
-BOLTCallback BoltEngine::_scoobyTypeLoadCallbacks[28];
-BOLTCallback BoltEngine::_scoobyTypeFreeCallbacks[28];
-
-BOLTCallback BoltEngine::_topCatTypeLoadCallbacks[26];
-BOLTCallback BoltEngine::_topCatTypeFreeCallbacks[26];
-
-BOLTCallback BoltEngine::_yogiTypeLoadCallbacks[27];
-BOLTCallback BoltEngine::_yogiTypeFreeCallbacks[27];
-
void BoltEngine::noOpCb() {}
void BoltEngine::swapAllWordsCb() { ((BoltEngine *)g_engine)->swapAllWords(); }
void BoltEngine::swapAllLongsCb() { ((BoltEngine *)g_engine)->swapAllLongs(); }
@@ -669,230 +651,4 @@ void BoltEngine::swapFirstFourWordsCb() { ((BoltEngine *)g_engine)->swapFirstFou
void BoltEngine::swapSpriteHeaderCb() { ((BoltEngine *)g_engine)->swapSpriteHeader(); }
void BoltEngine::freeSpriteCleanUpCb() { ((BoltEngine *)g_engine)->freeSpriteCleanUp(); }
-void BoltEngine::resolveAllRefsCb() { ((BoltEngine *)g_engine)->resolveAllRefs(); }
-void BoltEngine::swapFredAnimEntryCb() { ((BoltEngine *)g_engine)->swapFredAnimEntry(); }
-void BoltEngine::swapFredAnimDescCb() { ((BoltEngine *)g_engine)->swapFredAnimDesc(); }
-void BoltEngine::swapFredLevelDescCb() { ((BoltEngine *)g_engine)->swapFredLevelDesc(); }
-
-void BoltEngine::swapGeorgeFrameArrayCb() { ((BoltEngine *)g_engine)->swapGeorgeFrameArray(); }
-void BoltEngine::swapGeorgeHelpEntryCb() { ((BoltEngine *)g_engine)->swapGeorgeHelpEntry(); }
-void BoltEngine::swapGeorgeThresholdsCb() { ((BoltEngine *)g_engine)->swapGeorgeThresholds(); }
-
-void BoltEngine::swapHuckWordArrayCb() { ((BoltEngine *)g_engine)->swapHuckWordArray(); }
-void BoltEngine::swapHuckWordsCb() { ((BoltEngine *)g_engine)->swapHuckWords(); }
-
-void BoltEngine::swapScoobyHelpEntryCb() { ((BoltEngine *)g_engine)->swapScoobyHelpEntry(); }
-void BoltEngine::swapScoobyWordArrayCb() { ((BoltEngine *)g_engine)->swapScoobyWordArray(); }
-
-void BoltEngine::swapTopCatHelpEntryCb() { ((BoltEngine *)g_engine)->swapTopCatHelpEntry(); }
-
-void BoltEngine::swapYogiAllWordsCb() { ((BoltEngine *)g_engine)->swapYogiAllWords(); }
-void BoltEngine::swapYogiFirstWordCb() { ((BoltEngine *)g_engine)->swapYogiFirstWord(); }
-
-void BoltEngine::initCallbacks() {
- // --- BOOTHS ---
- for (int i = 0; i < ARRAYSIZE(_defaultTypeLoadCallbacks); i++) {
- _defaultTypeLoadCallbacks[i] = noOpCb;
- }
-
- _defaultTypeLoadCallbacks[2] = swapAllWordsCb;
- _defaultTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _defaultTypeLoadCallbacks[10] = swapPicHeaderCb;
- _defaultTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _defaultTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _defaultTypeLoadCallbacks[14] = swapFirstFourWordsCb;
-
- for (int i = 0; i < ARRAYSIZE(_defaultTypeFreeCallbacks); i++) {
- _defaultTypeFreeCallbacks[i] = noOpCb;
- }
-
- _defaultTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- for (int i = 0; i < ARRAYSIZE(_defaultMemberLoadCallbacks); i++) {
- _defaultMemberLoadCallbacks[i] = noOpCb;
- }
-
- for (int i = 0; i < ARRAYSIZE(_defaultMemberFreeCallbacks); i++) {
- _defaultMemberFreeCallbacks[i] = noOpCb;
- }
-
- for (int i = 0; i < ARRAYSIZE(_defaultGroupLoadCallbacks); i++) {
- _defaultGroupLoadCallbacks[i] = noOpCb;
- }
-
- for (int i = 0; i < ARRAYSIZE(_defaultGroupFreeCallbacks); i++) {
- _defaultGroupFreeCallbacks[i] = noOpCb;
- }
-
- _boothsBoltCallbacks.typeLoadCallbacks = _defaultTypeLoadCallbacks;
- _boothsBoltCallbacks.typeFreeCallbacks = _defaultTypeFreeCallbacks;
- _boothsBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _boothsBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _boothsBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _boothsBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- FRED ---
- for (int i = 0; i < ARRAYSIZE(_fredTypeLoadCallbacks); i++) {
- _fredTypeLoadCallbacks[i] = noOpCb;
- }
-
- _fredTypeLoadCallbacks[2] = swapAllWordsCb;
- _fredTypeLoadCallbacks[6] = resolveAllRefsCb;
- _fredTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _fredTypeLoadCallbacks[10] = swapPicHeaderCb;
- _fredTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _fredTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _fredTypeLoadCallbacks[14] = swapFirstFourWordsCb;
- _fredTypeLoadCallbacks[25] = swapFredAnimEntryCb;
- _fredTypeLoadCallbacks[26] = swapFredAnimDescCb;
- _fredTypeLoadCallbacks[27] = swapFredLevelDescCb;
-
- for (int i = 0; i < ARRAYSIZE(_fredTypeFreeCallbacks); i++) {
- _fredTypeFreeCallbacks[i] = noOpCb;
- }
-
- _fredTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _fredBoltCallbacks.typeLoadCallbacks = _fredTypeLoadCallbacks;
- _fredBoltCallbacks.typeFreeCallbacks = _fredTypeFreeCallbacks;
- _fredBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _fredBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _fredBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _fredBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- GEORGE ---
- for (int i = 0; i < ARRAYSIZE(_georgeTypeLoadCallbacks); i++) {
- _georgeTypeLoadCallbacks[i] = noOpCb;
- }
-
- _georgeTypeLoadCallbacks[2] = swapAllWordsCb;
- _georgeTypeLoadCallbacks[6] = resolveAllRefsCb;
- _georgeTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _georgeTypeLoadCallbacks[10] = swapPicHeaderCb;
- _georgeTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _georgeTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _georgeTypeLoadCallbacks[14] = swapFirstFourWordsCb;
- _georgeTypeLoadCallbacks[25] = swapGeorgeFrameArrayCb;
- _georgeTypeLoadCallbacks[26] = swapGeorgeHelpEntryCb;
- _georgeTypeLoadCallbacks[27] = swapGeorgeThresholdsCb;
-
- for (int i = 0; i < ARRAYSIZE(_georgeTypeFreeCallbacks); i++) {
- _georgeTypeFreeCallbacks[i] = noOpCb;
- }
-
- _georgeTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _georgeBoltCallbacks.typeLoadCallbacks = _georgeTypeLoadCallbacks;
- _georgeBoltCallbacks.typeFreeCallbacks = _georgeTypeFreeCallbacks;
- _georgeBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _georgeBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _georgeBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _georgeBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- HUCK ---
- for (int i = 0; i < ARRAYSIZE(_huckTypeLoadCallbacks); i++) {
- _huckTypeLoadCallbacks[i] = noOpCb;
- }
-
- _huckTypeLoadCallbacks[2] = swapAllWordsCb;
- _huckTypeLoadCallbacks[6] = resolveAllRefsCb;
- _huckTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _huckTypeLoadCallbacks[10] = swapPicHeaderCb;
- _huckTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _huckTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _huckTypeLoadCallbacks[14] = swapFirstFourWordsCb;
- _huckTypeLoadCallbacks[25] = swapHuckWordArrayCb;
- _huckTypeLoadCallbacks[26] = swapHuckWordsCb;
-
- for (int i = 0; i < ARRAYSIZE(_huckTypeFreeCallbacks); i++) {
- _huckTypeFreeCallbacks[i] = noOpCb;
- }
-
- _huckTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _huckBoltCallbacks.typeLoadCallbacks = _huckTypeLoadCallbacks;
- _huckBoltCallbacks.typeFreeCallbacks = _huckTypeFreeCallbacks;
- _huckBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _huckBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _huckBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _huckBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- SCOOBY ---
- for (int i = 0; i < ARRAYSIZE(_scoobyTypeLoadCallbacks); i++) {
- _scoobyTypeLoadCallbacks[i] = noOpCb;
- }
-
- _scoobyTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _scoobyTypeLoadCallbacks[10] = swapPicHeaderCb;
- _scoobyTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _scoobyTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _scoobyTypeLoadCallbacks[26] = swapScoobyHelpEntryCb;
- _scoobyTypeLoadCallbacks[27] = swapScoobyWordArrayCb;
-
- for (int i = 0; i < ARRAYSIZE(_scoobyTypeFreeCallbacks); i++) {
- _scoobyTypeFreeCallbacks[i] = noOpCb;
- }
-
- _scoobyTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _scoobyBoltCallbacks.typeLoadCallbacks = _scoobyTypeLoadCallbacks;
- _scoobyBoltCallbacks.typeFreeCallbacks = _scoobyTypeFreeCallbacks;
- _scoobyBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _scoobyBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _scoobyBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _scoobyBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- TOPCAT ---
- for (int i = 0; i < ARRAYSIZE(_topCatTypeLoadCallbacks); i++) {
- _topCatTypeLoadCallbacks[i] = noOpCb;
- }
-
- _topCatTypeLoadCallbacks[2] = swapAllWordsCb;
- _topCatTypeLoadCallbacks[4] = swapAllLongsCb;
- _topCatTypeLoadCallbacks[6] = resolveAllRefsCb;
- _topCatTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _topCatTypeLoadCallbacks[10] = swapPicHeaderCb;
- _topCatTypeLoadCallbacks[11] = swapAndResolvePicDescCb;
- _topCatTypeLoadCallbacks[12] = swapFirstTwoWordsCb;
- _topCatTypeLoadCallbacks[25] = swapTopCatHelpEntryCb;
-
- for (int i = 0; i < ARRAYSIZE(_topCatTypeFreeCallbacks); i++) {
- _topCatTypeFreeCallbacks[i] = noOpCb;
- }
-
- _topCatTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _topCatBoltCallbacks.typeLoadCallbacks = _topCatTypeLoadCallbacks;
- _topCatBoltCallbacks.typeFreeCallbacks = _topCatTypeFreeCallbacks;
- _topCatBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _topCatBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _topCatBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _topCatBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-
- // --- YOGI ---
- for (int i = 0; i < ARRAYSIZE(_yogiTypeLoadCallbacks); i++) {
- _yogiTypeLoadCallbacks[i] = noOpCb;
- }
-
- _yogiTypeLoadCallbacks[2] = swapAllWordsCb;
- _yogiTypeLoadCallbacks[8] = swapSpriteHeaderCb;
- _yogiTypeLoadCallbacks[10] = swapPicHeaderCb;
- _yogiTypeLoadCallbacks[14] = swapFirstFourWordsCb;
- _yogiTypeLoadCallbacks[25] = swapYogiFirstWordCb;
- _yogiTypeLoadCallbacks[26] = swapYogiAllWordsCb;
-
- for (int i = 0; i < ARRAYSIZE(_yogiTypeFreeCallbacks); i++) {
- _yogiTypeFreeCallbacks[i] = noOpCb;
- }
-
- _yogiTypeFreeCallbacks[8] = freeSpriteCleanUpCb;
-
- _yogiBoltCallbacks.typeLoadCallbacks = _yogiTypeLoadCallbacks;
- _yogiBoltCallbacks.typeFreeCallbacks = _yogiTypeFreeCallbacks;
- _yogiBoltCallbacks.memberLoadCallbacks = _defaultMemberLoadCallbacks;
- _yogiBoltCallbacks.memberFreeCallbacks = _defaultMemberFreeCallbacks;
- _yogiBoltCallbacks.groupLoadCallbacks = _defaultGroupLoadCallbacks;
- _yogiBoltCallbacks.groupFreeCallbacks = _defaultGroupFreeCallbacks;
-}
-
} // End of namespace Bolt
More information about the Scummvm-git-logs
mailing list