[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