[Scummvm-git-logs] scummvm master -> 1ed2cd40f3213720cd33d96fca9f6516b5589189

bluegr bluegr at gmail.com
Wed Sep 11 11:28:32 CEST 2019


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
1ed2cd40f3 CRYO: EDEN: Move graphics into a separate class


Commit: 1ed2cd40f3213720cd33d96fca9f6516b5589189
    https://github.com/scummvm/scummvm/commit/1ed2cd40f3213720cd33d96fca9f6516b5589189
Author: David Fioramonti (dafioram at gmail.com)
Date: 2019-09-11T12:28:28+03:00

Commit Message:
CRYO: EDEN: Move graphics into a separate class

Eden game object now contains a graphics object with which to
delegate graphics operations and store states of the graphics.

Much of the video playing is done in the graphics class
so I have moved a lot of the video state into there.

Some graphics related variables were moved out of eden and into
graphics, but many are still in eden.

Since they are still coupled there are lots of getters and setters.
For example both eden_graphics and eden share a handle to the same
video object.

I have made a few more things public than desirable.

I changed graphics to eden_graphics since it is specialized to eden
and not just cryo.

Changed paths:
  A engines/cryo/eden_graphics.cpp
  A engines/cryo/eden_graphics.h
  R engines/cryo/graphics.cpp
    engines/cryo/eden.cpp
    engines/cryo/eden.h
    engines/cryo/module.mk


diff --git a/engines/cryo/eden.cpp b/engines/cryo/eden.cpp
index 04191ff..247754c 100644
--- a/engines/cryo/eden.cpp
+++ b/engines/cryo/eden.cpp
@@ -42,6 +42,7 @@
 #include "cryo/cryolib.h"
 #include "cryo/eden.h"
 #include "cryo/sound.h"
+#include "cryo/eden_graphics.h"
 
 namespace Cryo {
 
@@ -62,28 +63,26 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm), kMaxMusicSize(2200000) {
 		{ 0x81, 0x90,    1, 0x10}
 	};
 
+	_graphics = nullptr;
+
 	_adamMapMarkPos = Common::Point(-1, -1);
 
 	_scrollPos = _oldScrollPos = 0;
 	_frescoTalk = false;
 	_torchCursor = false;
 	_curBankNum = 0;
-	_glowH = _glowW = _glowY = _glowX = 0;
 	_paletteUpdateRequired = false;
 	_cursorSaved = false;
-	_showBlackBars = false;
 	_backgroundSaved = false;
 	_bankData = nullptr;
 	_tyranPtr = nullptr;
 	_lastAnimFrameNumb = _curAnimFrameNumb = 0;
 	_lastAnimTicks = 0;
-	_curCharacterRect = nullptr;
 	_numAnimFrames = _maxPersoDesc = _numImgDesc = 0;
 	_restartAnimation = _animationActive = false;
 	_animationDelay = _animationIndex = _lastAnimationIndex = 0;
 	dword_30724 = dword_30728 = _mouthAnimations = _animationTable = nullptr;
 	_characterBankData = nullptr;
-	_savedUnderSubtitles = false;
 	_numTextLines = 0;
 	_textOutPtr = textout = nullptr;
 	_curSpecialObject = nullptr;
@@ -94,7 +93,7 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm), kMaxMusicSize(2200000) {
 	_lastPhrasesFile = 0;
 	_dialogSkipFlags = 0;
 	_voiceSamplesBuffer = nullptr;
-	_needToFade = false;
+	
 	_mainBankBuf = nullptr;
 	_musicBuf = nullptr;
 	_gameLipsync = nullptr;
@@ -115,7 +114,6 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm), kMaxMusicSize(2200000) {
 	_musicChannel = _voiceChannel = nullptr;
 	_hnmSoundChannel = nullptr;
 	_voiceSound = nullptr;
-	_view2 = _underSubtitlesView = _subtitlesView = _underBarsView = _mainView = _hnmView = nullptr;
 	_cirsorPanX = 0;
 	_inventoryScrollDelay = 0;
 	_cursorPosY = _cursorPosX = 0;
@@ -123,7 +121,6 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm), kMaxMusicSize(2200000) {
 	_currSpot = _curSpot2 = nullptr;
 	_mouseHeld = false;
 	_normalCursor = false;
-	_showVideoSubtitle = false;
 	_specialTextMode = false;
 	_voiceSamplesSize = 0;
 	_animateTalking = false;
@@ -172,21 +169,24 @@ EdenGame::EdenGame(CryoEngine *vm) : _vm(vm), kMaxMusicSize(2200000) {
 	_cursCenter = 11;
 }
 
+EdenGame::~EdenGame() {
+}
+
 void EdenGame::removeConsole() {
 }
 
 void EdenGame::scroll() {
 	restoreFriezes();
-	_mainView->_normal._srcLeft = _scrollPos;
-	_mainView->_zoom._srcLeft = _scrollPos;
+	_graphics->getMainView()->_normal._srcLeft = _scrollPos;
+	_graphics->getMainView()->_zoom._srcLeft = _scrollPos;
 }
 
 void EdenGame::resetScroll() {
 	_oldScrollPos = _scrollPos;
 	_scrollPos = 0;
 	restoreFriezes();   //TODO: inlined scroll() ?
-	_mainView->_normal._srcLeft = 0;
-	_mainView->_zoom._srcLeft = 0;
+	_graphics->getMainView()->_normal._srcLeft = 0;
+	_graphics->getMainView()->_zoom._srcLeft = 0;
 }
 
 void EdenGame::scrollFrescoes() {
@@ -199,18 +199,27 @@ void EdenGame::scrollFrescoes() {
 	scroll();
 }
 
+bool EdenGame::animationIsActive() {
+	return _animationActive;
+}
+
 // Original name: afffresques
 void EdenGame::displayFrescoes() {
 	useBank(_globals->_frescoeImgBank);
-	drawSprite(0, 0, 16);
+	_graphics->drawSprite(0, 0, 16);
 	useBank(_globals->_frescoeImgBank + 1);
-	drawSprite(0, 320, 16);
+	_graphics->drawSprite(0, 320, 16);
 	_paletteUpdateRequired = true;
 }
 
+void EdenGame::setVolume(uint16 vol) {
+	_hnmSoundChannel->setVolumeLeft(vol);
+	_hnmSoundChannel->setVolumeRight(vol);
+}
+
 void EdenGame::gametofresques() {
 	_frescoTalk = false;
-	rundcurs();
+	_graphics->rundcurs();
 	saveFriezes();
 	displayFrescoes();
 	_globals->_displayFlags = DisplayFlags::dfFrescoes;
@@ -220,8 +229,8 @@ void EdenGame::gametofresques() {
 void EdenGame::doFrescoes() {
 	_cursorSaved = false;
 	_torchCursor = true;
-	_glowX = -1;
-	_glowY = -1;
+	_graphics->setGlowX(-1);
+	_graphics->setGlowY(-1);
 	_globals->_gameFlags |= GameFlags::gfFlag20;
 	_globals->_varD4 = 0;
 	_globals->_curObjectId = 0;
@@ -275,7 +284,7 @@ void EdenGame::scrollPanel() {
 // Original name: affsuiveur
 void EdenGame::displayFollower(Follower *follower, int16 x, int16 y) {
 	useBank(follower->_spriteBank);
-	drawSprite(follower->_spriteNum, x, y + 16);
+	_graphics->drawSprite(follower->_spriteNum, x, y + 16);
 }
 
 // Original name: persoinmiroir
@@ -331,7 +340,7 @@ void EdenGame::characterInMirror() {
 // Original name: gametomiroir
 void EdenGame::gameToMirror(byte arg1) {
 	if (_globals->_displayFlags != DisplayFlags::dfFlag2) {
-		rundcurs();
+		_graphics->rundcurs();
 		restoreFriezes();
 		drawTopScreen();
 		showObjects();
@@ -343,9 +352,9 @@ void EdenGame::gameToMirror(byte arg1) {
 			resNum = 2487;				// PCIMG.HSQ
 
 	useBank(resNum);
-	drawSprite(0, 0, 16);
+	_graphics->drawSprite(0, 0, 16);
 	useBank(resNum + 1);
-	drawSprite(0, 320, 16);
+	_graphics->drawSprite(0, 320, 16);
 	characterInMirror();
 	_paletteUpdateRequired = true;
 	_globals->_iconsIndex = 16;
@@ -359,7 +368,7 @@ void EdenGame::flipMode() {
 		endCharacterSpeech();
 		if (_globals->_displayFlags == DisplayFlags::dfPerson) {
 			if (_globals->_characterPtr == &_persons[PER_TAU] && _globals->_phaseNum >= 80)
-				displaySubtitles();
+				_graphics->displaySubtitles();
 			else {
 				getDataSync();
 				loadCurrCharacter();
@@ -368,7 +377,7 @@ void EdenGame::flipMode() {
 				animCharacter();
 			}
 		} else
-			displaySubtitles();
+			_graphics->displaySubtitles();
 		persovox();
 	} else {
 		if (_globals->_displayFlags != DisplayFlags::dfFrescoes && _globals->_displayFlags != DisplayFlags::dfFlag2) {
@@ -390,7 +399,7 @@ void EdenGame::flipMode() {
 
 // Original name: quitmiroir
 void EdenGame::quitMirror() {
-	rundcurs();
+	_graphics->rundcurs();
 	display();
 	resetScroll();
 	saveFriezes();
@@ -414,7 +423,7 @@ void EdenGame::actionClickValleyPlan() {
 	if (_globals->_roomNum == 8 || _globals->_roomNum < 16)
 		return;
 
-	rundcurs();
+	_graphics->rundcurs();
 	display();
 	if (_globals->_displayFlags == DisplayFlags::dfMirror)
 		quitMirror();
@@ -438,9 +447,9 @@ void EdenGame::gotoPlace(Goto *go) {
 			closeCharacterScreen();
 	}
 	if (go->_enterVideoNum) {
-		hideBars();
-		playHNM(go->_enterVideoNum);
-		_needToFade = true;
+		_graphics->hideBars();
+		_graphics->playHNM(go->_enterVideoNum);
+		_graphics->setFade(true);
 	}
 	initPlace(_globals->_newRoomNum);
 	specialoutside();
@@ -543,7 +552,7 @@ void EdenGame::move(Direction dir) {
 	int16 roomNum = _globals->_roomNum;
 	debug("move: from room %4X", roomNum);
 	char newLoc = 0;
-	rundcurs();
+	_graphics->rundcurs();
 	display();
 	_globals->_prevLocation = roomNum & 0xFF;
 	switch (dir) {
@@ -593,8 +602,8 @@ void EdenGame::move2(Direction dir) {
 // Original name: dinosoufle
 void EdenGame::actionDinoBlow() {
 	if (_globals->_curObjectId == 0) {
-		hideBars();
-		playHNM(148);
+		_graphics->hideBars();
+		_graphics->playHNM(148);
 		maj2();
 	}
 }
@@ -604,9 +613,9 @@ void EdenGame::actionPlateMonk() {
 	if (_globals->_curObjectId != 0) {
 		if (_globals->_curObjectId == Objects::obPrism) {
 			loseObject(Objects::obPrism);
-			hideBars();
+			_graphics->hideBars();
 			_specialTextMode = true;
-			playHNM(89);
+			_graphics->playHNM(89);
 			// CHECKME: Unused code
 			// word_2F514 |= 0x8000;
 			maj2();
@@ -614,8 +623,8 @@ void EdenGame::actionPlateMonk() {
 			showEvents();
 		}
 	} else {
-		hideBars();
-		playHNM(7);
+		_graphics->hideBars();
+		_graphics->playHNM(7);
 		maj2();
 		_globals->_eventType = EventType::etEvent4;
 		showEvents();
@@ -726,7 +735,7 @@ void EdenGame::handleDinaDialog() {
 			bool res = dialoscansvmas((Dialog *)getElem(_gameDialogs, num));
 			_frescoTalk = false;
 			if (res) {
-				restoreUnderSubtitles();
+				_graphics->restoreUnderSubtitles();
 				_frescoTalk = true;
 				persovox();
 			}
@@ -737,6 +746,22 @@ void EdenGame::handleDinaDialog() {
 	}
 }
 
+int16 EdenGame::getCurPosX() {
+	return _cursorPosX;
+}
+
+int16 EdenGame::getCurPosY() {
+	return _cursorPosY;
+}
+
+void EdenGame::setCurPosX(int16 xpos) {
+	_cursorPosX = xpos;
+}
+
+void EdenGame::setCurPosY(int16 ypos) {
+	_cursorPosY = ypos;
+}
+
 // Original name: roiparle
 void EdenGame::handleKingDialog() {
 	if (_globals->_phaseNum <= 400)
@@ -747,8 +772,8 @@ void EdenGame::handleKingDialog() {
 void EdenGame::actionKingDialog1() {
 	if (_globals->_curObjectId == Objects::obSword) {
 		_globals->_gameFlags |= GameFlags::gfFlag80;
-		hideBars();
-		playHNM(76);
+		_graphics->hideBars();
+		_graphics->playHNM(76);
 		move2(kCryoNorth);
 	} else {
 		_globals->_frescoNumber = 1;
@@ -867,8 +892,8 @@ void EdenGame::actionGetTablet() {
 	_gameIcons[16]._cursorId |= 0x8000;
 	showObjects();
 	_gameRooms[131]._video = 0;
-	hideBars();
-	playHNM(149);
+	_graphics->hideBars();
+	_graphics->playHNM(149);
 	_globals->_varF1 = RoomFlags::rf04;
 	_globals->_drawFlags = DrawFlags::drDrawFlag20;
 	_normalCursor = true;
@@ -897,8 +922,8 @@ void EdenGame::actionLookLake() {
 		room->_id = 3;
 	}
 	debug("sea monster: room = %X, d0 = %X\n", _globals->_roomNum, _globals->_roomImgBank);
-	hideBars();
-	playHNM(vid);
+	_graphics->hideBars();
+	_graphics->playHNM(vid);
 	updateRoom(_globals->_roomNum);           //TODO: getting memory trashed here?
 	if (_globals->_curObjectId == Objects::obApple)
 		loseObject(Objects::obApple);
@@ -939,7 +964,7 @@ void EdenGame::actionGotoFullNest() {
 // Original name: gotoval
 void EdenGame::actionGotoVal() {
 	uint16 target = _globals->_roomNum;
-	rundcurs();
+	_graphics->rundcurs();
 	display();
 	_scrollPos = 0;
 	char obj = _curSpot2->_objectId - 14;    //TODO
@@ -949,8 +974,8 @@ void EdenGame::actionGotoVal() {
 
 // Original name: visiter
 void EdenGame::actionVisit() {
-	hideBars();
-	playHNM(144);
+	_graphics->hideBars();
+	_graphics->playHNM(144);
 	_globals->_varF1 = RoomFlags::rf04;
 	maj2();
 }
@@ -960,10 +985,10 @@ void EdenGame::actionFinal() {
 	if (_globals->_curObjectId != 0)
 		return;
 
-	hideBars();
+	_graphics->hideBars();
 	*(int16 *)(_gameRooms + 0x6DC) = 319; //TODO
 	_globals->_roomImgBank = 319;
-	playHNM(97);
+	_graphics->playHNM(97);
 	maj2();
 	_globals->_eventType = EventType::etEvent12;
 	showEvents();
@@ -999,14 +1024,14 @@ void EdenGame::display() {
 	if (!_globals->_mirrorEffect && !_globals->_var103) {
 		if (_paletteUpdateRequired) {
 			_paletteUpdateRequired = false;
-			CLPalette_Send2Screen(_globalPalette, 0, 256);
+			_graphics->SendPalette2Screen(256);
 		}
-		CLBlitter_CopyView2Screen(_mainView);
+		CLBlitter_CopyView2Screen(_graphics->getMainView());
 	} else {
 		if (_globals->_mirrorEffect)
-			displayEffect3();
+			_graphics->displayEffect3();
 		else
-			displayEffect2();
+			_graphics->displayEffect2();
 
 		_globals->_var103 = 0;
 		_globals->_mirrorEffect = 0;
@@ -1015,57 +1040,35 @@ void EdenGame::display() {
 
 void EdenGame::afficher128() {
 	if (_globals->_updatePaletteFlag == 16) {
-		CLPalette_Send2Screen(_globalPalette, 0, 129);
-		CLBlitter_CopyView2Screen(_mainView);
+		_graphics->SendPalette2Screen(129);
+		CLBlitter_CopyView2Screen(_graphics->getMainView());
 		_globals->_updatePaletteFlag = 0;
 	} else {
-		clearScreen();
-		fadeToBlackLowPalette(1);
-		if (_showBlackBars)
-			drawBlackBars();
-		CLBlitter_CopyView2Screen(_mainView);
-		fadeFromBlackLowPalette(1);
+		_graphics->clearScreen();
+		_graphics->fadeToBlackLowPalette(1);
+		if (_graphics->getShowBlackBars())
+			_graphics->drawBlackBars();
+		CLBlitter_CopyView2Screen(_graphics->getMainView());
+		_graphics->fadeFromBlackLowPalette(1);
 	}
 }
 
 // Original name: sauvefrises
 void EdenGame::saveFriezes() {
-	saveTopFrieze(0);
-	saveBottomFrieze();
-}
-
-// Original name: sauvefriseshaut
-void EdenGame::saveTopFrieze(int16 x) { // Save top bar
-	_underTopBarScreenRect = Common::Rect(x, 0, x + 320 - 1, 15);
-	_underTopBarBackupRect = Common::Rect(0, 0, 320 - 1, 15);
-	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-}
-
-// Original name: sauvefrisesbas
-void EdenGame::saveBottomFrieze() {         // Save bottom bar
-	_underBottomBarScreenRect.left = 0;
-	_underBottomBarScreenRect.right = 320 - 1;
-	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underBottomBarScreenRect, &_underBottomBarBackupRect);
+	_graphics->saveTopFrieze(0);
+	_graphics->saveBottomFrieze();
 }
 
 // Original name: restaurefrises
 void EdenGame::restoreFriezes() {
-	restoreTopFrieze();
-	restoreBottomFrieze();
+	_graphics->restoreTopFrieze();
+	_graphics->restoreBottomFrieze();
 }
 
-// Original name: restaurefriseshaut
-void EdenGame::restoreTopFrieze() {
-	_underTopBarScreenRect.left = _scrollPos;
-	_underTopBarScreenRect.right = _scrollPos + 320 - 1;
-	CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarBackupRect, &_underTopBarScreenRect);
-}
 
-// Original name: restaurefrisesbas
-void EdenGame::restoreBottomFrieze() {
-	_underBottomBarScreenRect.left = _scrollPos;
-	_underBottomBarScreenRect.right = _scrollPos + 320 - 1;
-	CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underBottomBarBackupRect, &_underBottomBarScreenRect);
+
+byte * EdenGame::getBankData() {
+	return _bankData;
 }
 
 void EdenGame::useMainBank() {
@@ -1089,68 +1092,15 @@ void EdenGame::useBank(int16 bank) {
 	}
 }
 
-void EdenGame::readPalette(byte *ptr) {
-	bool doit = true;
-	color3_t pal_entry;
-	while (doit) {
-		uint16 idx = *ptr++;
-		if (idx != 0xFF) {
-			uint16 cnt = *ptr++;
-			while (cnt--) {
-				if (idx == 0) {
-					pal_entry.r = 0;
-					pal_entry.g = 0;
-					pal_entry.b = 0;
-					ptr += 3;
-				} else {
-					pal_entry.r = *ptr++ << 10;
-					pal_entry.g = *ptr++ << 10;
-					pal_entry.b = *ptr++ << 10;
-				}
-				CLPalette_SetRGBColor(_globalPalette, idx, &pal_entry);
-				idx++;
-			}
-		} else
-			doit = false;
-	}
-}
-
-// Original name: sauvefondbouche
-void EdenGame::saveMouthBackground() {
-	rect_src.left = _curCharacterRect->left;
-	rect_src.top = _curCharacterRect->top;
-	rect_src.right = _curCharacterRect->right;
-	rect_src.bottom = _curCharacterRect->bottom;
-	rect_dst.left = _curCharacterRect->left + 320;
-	rect_dst.top = _curCharacterRect->top;
-	rect_dst.right = _curCharacterRect->right + 320;
-	rect_dst.bottom = _curCharacterRect->bottom;
-	CLBlitter_CopyViewRect(_mainView, _mainView, &rect_src, &rect_dst);
-	_backgroundSaved = true;
-}
-
-// Original name: restaurefondbouche
-void EdenGame::restoreMouthBackground() {
-	rect_src.left = _curCharacterRect->left;
-	rect_src.top = _curCharacterRect->top;
-	rect_src.right = _curCharacterRect->right;
-	rect_src.bottom = _curCharacterRect->bottom;
-	rect_dst.left = _curCharacterRect->left + 320;
-	rect_dst.top = _curCharacterRect->top;
-	rect_dst.right = _curCharacterRect->right + 320;
-	rect_dst.bottom = _curCharacterRect->bottom;
-	CLBlitter_CopyViewRect(_mainView, _mainView, &rect_dst, &rect_src);
-}
-
 void EdenGame::drawTopScreen() {  // Draw  top bar (location / party / map)
 	_globals->_drawFlags &= ~DrawFlags::drDrawTopScreen;
 	useBank(314);
-	drawSprite(36, 83, 0);
-	drawSprite(_globals->_areaPtr->_num - 1, 0, 0);
-	drawSprite(23, 145, 0);
+	_graphics->drawSprite(36, 83, 0);
+	_graphics->drawSprite(_globals->_areaPtr->_num - 1, 0, 0);
+	_graphics->drawSprite(23, 145, 0);
 	for (perso_t *perso = &_persons[PER_DINA]; perso != &_persons[PER_UNKN_156]; perso++) {
 		if ((perso->_flags & PersonFlags::pfInParty) && !(perso->_flags & PersonFlags::pf80))
-			drawSprite(perso->_targetLoc + 18, perso->_lastLoc + 120, 0);
+			_graphics->drawSprite(perso->_targetLoc + 18, perso->_lastLoc + 120, 0);
 	}
 	_adamMapMarkPos.x = -1;
 	_adamMapMarkPos.y = -1;
@@ -1161,7 +1111,7 @@ void EdenGame::drawTopScreen() {  // Draw  top bar (location / party / map)
 // Original name: affplanval
 void EdenGame::displayValleyMap() { // Draw mini-map
 	if (_globals->_areaPtr->_type == AreaType::atValley) {
-		drawSprite(_globals->_areaPtr->_num + 9, 266, 1);
+		_graphics->drawSprite(_globals->_areaPtr->_num + 9, 266, 1);
 		for (perso_t *perso = &_persons[PER_UNKN_18C]; perso->_roomNum != 0xFFFF; perso++) {
 			if (((perso->_roomNum >> 8) == _globals->_areaNum)
 			        && !(perso->_flags & PersonFlags::pf80) && (perso->_flags & PersonFlags::pf20))
@@ -1169,20 +1119,20 @@ void EdenGame::displayValleyMap() { // Draw mini-map
 		}
 		if (_globals->_areaPtr->_citadelLevel)
 			displayMapMark(34, _globals->_areaPtr->_citadelRoomPtr->_location);
-		saveTopFrieze(0);
+		_graphics->saveTopFrieze(0);
 		int16 loc = _globals->_roomNum & 0xFF;
 		if (loc >= 16)
 			displayAdamMapMark(loc);
-		restoreTopFrieze();
+		_graphics->restoreTopFrieze();
 	} else {
-		saveTopFrieze(0);
-		restoreTopFrieze();
+		_graphics->saveTopFrieze(0);
+		_graphics->restoreTopFrieze();
 	}
 }
 
 // Original name: affrepere
 void EdenGame::displayMapMark(int16 index, int16 location) {
-	drawSprite(index, 269 + location % 16 * 4, 2 + (location - 16) / 16 * 3);
+	_graphics->drawSprite(index, 269 + location % 16 * 4, 2 + (location - 16) / 16 * 3);
 }
 
 // Original name: affrepereadam
@@ -1194,8 +1144,8 @@ void EdenGame::displayAdamMapMark(int16 location) {
 		x += (location & 15) * 4;
 		y += ((location - 16) >> 4) * 3;
 		saveAdamMapMark(x, y);
-		byte *pix = _underBarsView->_bufferPtr;
-		int16 w = _underBarsView->_width;
+		byte *pix = _graphics->getUnderBarsView()->_bufferPtr;
+		int16 w = _graphics->getUnderBarsView()->_width;
 		pix += x + w * y;
 		pix[1] = 0xC3;
 		pix[2] = 0xC3;
@@ -1217,8 +1167,8 @@ void EdenGame::restoreAdamMapMark() {
 
 	int16 x = _adamMapMarkPos.x;
 	int16 y = _adamMapMarkPos.y;
-	byte *pix = _underBarsView->_bufferPtr;
-	int16 w = _underBarsView->_width;
+	byte *pix = _graphics->getUnderBarsView()->_bufferPtr;
+	int16 w = _graphics->getUnderBarsView()->_width;
 	pix += x + w * y;
 	pix[1] = _oldPix[0];
 	pix[2] = _oldPix[1];
@@ -1236,8 +1186,8 @@ void EdenGame::restoreAdamMapMark() {
 void EdenGame::saveAdamMapMark(int16 x, int16 y) {
 	_adamMapMarkPos.x = x;
 	_adamMapMarkPos.y = y;
-	byte *pix = _underBarsView->_bufferPtr;
-	int16 w = _underBarsView->_width;
+	byte *pix = _graphics->getUnderBarsView()->_bufferPtr;
+	int16 w = _graphics->getUnderBarsView()->_width;
 	pix += x + w * y;
 	_oldPix[0] = pix[1];
 	_oldPix[1] = pix[2];
@@ -1446,6 +1396,10 @@ void EdenGame::evolveCitadel(int16 level) {
 	}
 }
 
+int16 EdenGame::getCurBankNum() {
+	return _curBankNum;
+}
+
 // Original name: citacapoute
 void EdenGame::destroyCitadelRoom(int16 roomNum) {
 	perso_t *perso = &_persons[PER_UNKN_18C];
@@ -1811,11 +1765,15 @@ void EdenGame::addTime(int16 t) {
 	}
 }
 
+byte *EdenGame::getImageDesc() {
+	return _imageDesc;
+}
+
 // Original name: anim_perso
 void EdenGame::animCharacter() {
 	if (_curBankNum != _globals->_characterImageBank)
 		loadCharacter(_globals->_characterPtr);
-	restoreUnderSubtitles();
+	_graphics->restoreUnderSubtitles();
 	if (_restartAnimation) {
 		_lastAnimTicks = _vm->_timerTicks;
 		_restartAnimation = false;
@@ -1834,7 +1792,7 @@ void EdenGame::animCharacter() {
 		_mouthAnimations = _imageDesc + 200;
 		removeMouthSprite();
 		if (*_mouthAnimations)
-			displayImage();
+			_graphics->displayImage();
 		_animationDelay--;
 		if (!_animationDelay) {
 			_globals->_animationFlags = 1;
@@ -1850,8 +1808,10 @@ void EdenGame::animCharacter() {
 	if (_animateTalking) {
 		if (!_animationTable) {
 			_animationTable = _gameLipsync + 7262;    //TODO: fix me
-			if (!_backgroundSaved)
-				saveMouthBackground();
+			if (!_backgroundSaved) {
+				_graphics->saveMouthBackground();
+				_backgroundSaved = true;
+			}
 		}
 		if (!_personTalking)
 			_curAnimFrameNumb = _numAnimFrames - 1;
@@ -1860,16 +1820,16 @@ void EdenGame::animCharacter() {
 			_animateTalking = false;
 		else if (_animationIndex != _lastAnimationIndex) {
 			useCharacterBank();
-			restoreMouthBackground();
+			_graphics->restoreMouthBackground();
 //			debug("perso spr %d", animationIndex);
 			setCharacterSprite(_globals->_persoSpritePtr2 + _animationIndex * 2);  //TODO: int16s?
 			_mouthAnimations = _imageDesc + 200;
 			if (*_mouthAnimations)
-				displayImage();
+				_graphics->displayImage();
 			_lastAnimationIndex = _animationIndex;
 		}
 	}
-	displaySubtitles();
+	_graphics->displaySubtitles();
 }
 
 void EdenGame::getanimrnd() {
@@ -1904,7 +1864,7 @@ void EdenGame::addanim() {
 	if (_globals->_characterPtr->_id != PersonId::pidCabukaOfCantura && _globals->_characterPtr->_targetLoc != 7) //TODO: targetLoc is minisprite idx
 		removeMouthSprite();
 	if (*_mouthAnimations)
-		displayImage();
+		_graphics->displayImage();
 }
 
 // Original name: virespritebouche
@@ -1973,7 +1933,7 @@ void EdenGame::setCharacterSprite(byte *spr) {
 // Original name: af_perso1
 void EdenGame::displayCharacter1() {
 	setCharacterSprite(_globals->_persoSpritePtr + READ_LE_UINT16(_globals->_persoSpritePtr));
-	displayImage();
+	_graphics->displayImage();
 }
 
 // Original name: af_perso
@@ -1993,7 +1953,7 @@ void EdenGame::loadCharacter(perso_t *perso) {
 		return;
 
 	if (perso->_spriteBank != _globals->_characterImageBank) {
-		_curCharacterRect = &_characterRects[perso->_id];   //TODO: array of int16?
+		_graphics->setCurCharRect(&_characterRects[perso->_id]); //TODO: array of int16?
 		dword_30728 = _characterArray[perso->_id];
 		ef_perso();
 		_globals->_characterImageBank = perso->_spriteBank;
@@ -2048,9 +2008,9 @@ void EdenGame::no_perso() {
 void EdenGame::closeCharacterScreen() {
 	endCharacterSpeech();
 	if (_globals->_displayFlags == DisplayFlags::dfPerson && _globals->_characterPtr->_id != PersonId::pidNarrator && _globals->_eventType != EventType::etEventE) {
-		rundcurs();
-		_savedUnderSubtitles = true;
-		restoreUnderSubtitles();
+		_graphics->rundcurs();
+		_graphics->setSavedUnderSubtitles(true);
+		_graphics->restoreUnderSubtitles();
 		display();
 		_globals->_var103 = 16;
 	}
@@ -2100,7 +2060,7 @@ void EdenGame::displayBackgroundFollower() {
 			if (follower->sx >= 320)
 				bank = 327;
 			useBank(bank + _globals->_roomBackgroundBankNum);
-			drawSprite(0, 0, 16, true);
+			_graphics->drawSprite(0, 0, 16, true);
 			break;
 		}
 	}
@@ -2110,12 +2070,20 @@ void EdenGame::displayNoFollower(int16 bank) {
 	if (bank) {
 		useBank(bank);
 		if (_globals->_characterPtr == &_persons[PER_UNKN_156])
-			drawSprite(0, 0, 16, true);
+			_graphics->drawSprite(0, 0, 16, true);
 		else
-			drawSprite(0, 0, 16);
+			_graphics->drawSprite(0, 0, 16);
 	}
 }
 
+int16 EdenGame::getGameIconX(int16 index) {
+	return _gameIcons[index].sx;
+}
+
+int16 EdenGame::getGameIconY(int16 index) {
+	return _gameIcons[index].sy;
+}
+
 // Original name: af_fondperso1
 void EdenGame::displayCharacterBackground1() {
 	byte bank;
@@ -2197,11 +2165,11 @@ void EdenGame::showCharacter() {
 			setCharacterIcon();
 			displayCharacterBackground();
 			if (perso == &_persons[PER_TAU] && _globals->_curObjectId == Objects::obShell) {
-				displaySubtitles();
+				_graphics->displaySubtitles();
 				updateCursor();
 				_paletteUpdateRequired = true;
 				display();
-				rundcurs();
+				_graphics->rundcurs();
 				return;
 			}
 		}
@@ -2209,7 +2177,7 @@ void EdenGame::showCharacter() {
 		addanim();
 		if (!_globals->_curCharacterAnimPtr) {
 			displayCharacter();
-			displaySubtitles();
+			_graphics->displaySubtitles();
 		}
 		_restartAnimation = true;
 		animCharacter();
@@ -2217,11 +2185,11 @@ void EdenGame::showCharacter() {
 			updateCursor();
 		_paletteUpdateRequired = true;
 		if (perso != &_persons[PER_UNKN_156])
-			rundcurs();
+			_graphics->rundcurs();
 		display();
 	} else {
 		displayPlace();
-		displaySubtitles();
+		_graphics->displaySubtitles();
 	}
 }
 
@@ -2232,7 +2200,7 @@ void EdenGame::displayCharacterPanel() {
 	addanim();
 	if (!_globals->_curCharacterAnimPtr) {
 		displayCharacter();
-		displaySubtitles();
+		_graphics->displaySubtitles();
 	}
 	_restartAnimation = true;
 	_paletteUpdateRequired = true;
@@ -2243,7 +2211,7 @@ void EdenGame::displayCharacterPanel() {
 		updateCursor();
 	display();
 	if (perso != &_persons[PER_UNKN_156])
-		rundcurs();
+		_graphics->rundcurs();
 	_globals->_drawFlags |= DrawFlags::drDrawFlag8;
 	_globals->_iconsIndex = 112;
 }
@@ -2297,6 +2265,10 @@ void EdenGame::waitEndSpeak() {
 	_mouseHeld = true;
 }
 
+int16 EdenGame::getNumTextLines() {
+	return _numTextLines;
+}
+
 void EdenGame::my_bulle() {
 	if (!_globals->_textNum)
 		return;
@@ -2406,19 +2378,31 @@ void EdenGame::my_bulle() {
 		byte x = *icons++;
 		byte y = *icons++;
 		byte s = *icons++;
-		drawSprite(52, x + _subtitlesXCenter, y - 1, false, true);
-		drawSprite(s + 9, x + _subtitlesXCenter + 1, y, false, true);
+		_graphics->drawSprite(52, x + _subtitlesXCenter, y - 1, false, true);
+		_graphics->drawSprite(s + 9, x + _subtitlesXCenter + 1, y, false, true);
 	}
 }
 
+int16 EdenGame::getScrollPos() {
+	return _scrollPos;
+}
+
+bool EdenGame::getSpecialTextMode() {
+	return _specialTextMode;
+}
+
+void EdenGame::setSpecialTextMode(bool value) {
+	_specialTextMode = value;
+}
+
 void EdenGame::my_pr_bulle() {
-	CLBlitter_FillView(_subtitlesView, 0);
+	CLBlitter_FillView(_graphics->getSubtitlesView(), 0);
 	if (_globals->_prefLanguage == 0)
 		return;
 
 	byte *coo = _sentenceCoordsBuffer;
 	bool done = false;
-	textout = _subtitlesViewBuf;
+	textout = _graphics->getSubtitlesViewBuf();
 	byte *textPtr = _sentenceBuffer;
 	int16 lines = 1;
 	while (!done) {
@@ -2487,41 +2471,6 @@ void EdenGame::drawSubtitleChar(byte c, byte color, int16 width) {
 	}
 }
 
-// Original name: sauvefondbulle
-void EdenGame::saveUnderSubtitles(int16 y) {
-	_underSubtitlesScreenRect.top = y - _numTextLines * FONT_HEIGHT;
-	_underSubtitlesScreenRect.left = _scrollPos + _subtitlesXScrMargin;
-	_underSubtitlesScreenRect.right = _scrollPos + _subtitlesXScrMargin + _subtitlesXWidth - 1;
-	_underSubtitlesScreenRect.bottom = y;
-	_underSubtitlesBackupRect.top = 0;
-	_underSubtitlesBackupRect.bottom = _numTextLines * FONT_HEIGHT;
-	CLBlitter_CopyViewRect(_mainView, _underSubtitlesView, &_underSubtitlesScreenRect, &_underSubtitlesBackupRect);
-	_savedUnderSubtitles = true;
-}
-
-// Original name: restaurefondbulle
-void EdenGame::restoreUnderSubtitles() {
-	if (!_savedUnderSubtitles)
-		return;
-	CLBlitter_CopyViewRect(_underSubtitlesView, _mainView, &_underSubtitlesBackupRect, &_underSubtitlesScreenRect);
-	_savedUnderSubtitles = false;
-}
-
-// Original name: af_subtitlehnm
-void EdenGame::displayHNMSubtitle() {
-	byte *src = _subtitlesViewBuf;
-	byte *dst = _hnmViewBuf + _subtitlesXScrMargin + (158 - _numTextLines * FONT_HEIGHT) * 320;
-	for (int16 y = 0; y < _numTextLines * FONT_HEIGHT; y++) {
-		for (int16 x = 0; x < _subtitlesXWidth; x++) {
-			char c = *src++;
-			if (c)
-				*dst = c;
-			dst++;
-		}
-		dst += 320 - _subtitlesXWidth;
-	}
-}
-
 // Original name: patchPhrase
 void EdenGame::patchSentence() {
 	_sentenceBuffer[36] = 'c';
@@ -2710,7 +2659,7 @@ void EdenGame::handleCharacterDialog(int16 pers) {
 	uint16 idx = perso->_id * 8 | _globals->_dialogType;
 	dialoscansvmas((Dialog *)getElem(_gameDialogs, idx));
 	displayPlace();
-	displaySubtitles();
+	_graphics->displaySubtitles();
 	persovox();
 	_globals->_varCA = 0;
 	_globals->_dialogType = DialogType::dtTalk;
@@ -2943,12 +2892,12 @@ void EdenGame::actionAdam() {
 		int16 vid = 84;
 		if (!object->_count)
 			vid = *objvid;
-		hideBars();
+		_graphics->hideBars();
 		_specialTextMode = true;
-		playHNM(vid);
+		_graphics->playHNM(vid);
 		_paletteUpdateRequired = true;
 		_globals->_mirrorEffect = 16; // CHECKME: Verify the value
-		showBars();
+		_graphics->showBars();
 		gameToMirror(0);
 		}
 		break;
@@ -3489,6 +3438,10 @@ bool EdenGame::dialoscansvmas(Dialog *dial) {
 	return res;
 }
 
+byte *EdenGame::getGameDialogs() {
+	return _gameDialogs;
+}
+
 // Original name: dialo_even
 bool EdenGame::dialogEvent(perso_t *perso) {
 	_globals->_characterPtr = perso;
@@ -3509,12 +3462,12 @@ void EdenGame::characterStayHere() {
 
 // Original name: mort
 void EdenGame::endDeath(int16 vid) {
-	hideBars();
-	playHNM(vid);
-	fadeToBlack(2);
+	_graphics->hideBars();
+	_graphics->playHNM(vid);
+	_graphics->fadeToBlack(2);
 	CLBlitter_FillScreenView(0);
-	CLBlitter_FillView(_mainView, 0);
-	showBars();
+	CLBlitter_FillView(_graphics->getMainView(), 0);
+	_graphics->showBars();
 	_globals->_narratorSequence = 51;
 	_globals->_newMusicType = MusicType::mtNormal;
 	musique();
@@ -3782,26 +3735,11 @@ void EdenGame::initGlobals() {
 	_globals->_persoSpritePtr = nullptr;
 	_globals->_numGiveObjs = 0;
 
-	initRects();
-
-	_underSubtitlesScreenRect.top = 0;
-	_underSubtitlesScreenRect.left = _subtitlesXScrMargin;
-	_underSubtitlesScreenRect.right = _subtitlesXScrMargin + _subtitlesXWidth - 1;
-	_underSubtitlesScreenRect.bottom = 176 - 1;
+	_graphics->initRects();
 
-	_underSubtitlesBackupRect.top = 0;
-	_underSubtitlesBackupRect.left = _subtitlesXScrMargin;
-	_underSubtitlesBackupRect.right = _subtitlesXScrMargin + _subtitlesXWidth - 1;
-	_underSubtitlesBackupRect.bottom = 60 - 1;
+	_graphics->initGlobals();
 
-	_savedUnderSubtitles = false;
-}
-
-void EdenGame::initRects() {
-	_underTopBarScreenRect = Common::Rect(0, 0, 320 - 1, 16 - 1);
-	_underTopBarBackupRect = Common::Rect(0, 0, 320 - 1, 16 - 1);
-	_underBottomBarScreenRect = Common::Rect(0, 176, 320 - 1, 200 - 1);  //TODO: original bug? this cause crash in copyrect (this, underBottomBarBackupRect)
-	_underBottomBarBackupRect = Common::Rect(0, 16, 320 - 1, 40 - 1);
+	_graphics->setSavedUnderSubtitles(false);
 }
 
 // Original name: closesalle
@@ -3820,7 +3758,7 @@ void EdenGame::displayPlace() {
 		_globals->_autoDialog = false;
 	}
 	_globals->_nextRoomIcon = &_gameIcons[_roomIconsBase];
-	displayRoom();
+	_graphics->displayRoom();
 	_paletteUpdateRequired = true;
 }
 
@@ -3832,6 +3770,14 @@ void EdenGame::loadPlace(int16 num) {
 	loadRawFile(num + 419, _placeRawBuf);
 }
 
+byte EdenGame::getActionCursor(byte value) {
+	return _actionCursors[value];
+}
+
+byte *EdenGame::getPlaceRawBuf() {
+	return _placeRawBuf;
+}
+
 void EdenGame::specialoutside() {
 	if (_globals->_lastAreaPtr->_type == AreaType::atValley && (_globals->_party & PersonMask::pmLeader))
 		perso_ici(5);
@@ -3879,8 +3825,8 @@ void EdenGame::specialin() {
 	if (_globals->_roomNum == 3075 && _globals->_phaseNum == 546) {
 		incPhase();
 		if (_globals->_curItemsMask & 0x2000) { // Morkus' tablet
-			hideBars();
-			playHNM(92);
+			_graphics->hideBars();
+			_graphics->playHNM(92);
 			_gameRooms[129]._exits[0] = 0;
 			_gameRooms[129]._exits[2] = 1;
 			_globals->_roomNum = 3074;
@@ -3916,13 +3862,13 @@ void EdenGame::animpiece() {
 	if (_globals->_roomVidNum && _globals->_var100 != 0xFF) {
 		if (_globals->_valleyVidNum || !room->_level || (room->_flags & RoomFlags::rfHasCitadel)
 		        || room->_level == _globals->_var100) {
-			hideBars();
+			_graphics->hideBars();
 			_globals->_updatePaletteFlag = 16;
 			if (!(_globals->_narratorSequence & 0x80)) //TODO: bug? !() @ 100DC
 				_globals->_mirrorEffect = 0;
-			if (!_needToFade)
-				_needToFade = room->_flags & RoomFlags::rf02;
-			playHNM(_globals->_roomVidNum);
+			if (!_graphics->getFade())
+				_graphics->setFade(room->_flags & RoomFlags::rf02);
+			_graphics->playHNM(_globals->_roomVidNum);
 			return;
 		}
 	}
@@ -4038,16 +3984,16 @@ void EdenGame::maj2() {
 	if (_globals->_mirrorEffect || _globals->_var103)
 		display();
 	else if (_globals->_varF1 == (RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01)) {
-		drawBlackBars();
-		displayEffect1();
+		_graphics->drawBlackBars();
+		_graphics->displayEffect1();
 	} else if (_globals->_varF1 && !(_globals->_varF1 & RoomFlags::rf04) && !r30) {
 		if (!(_globals->_displayFlags & DisplayFlags::dfPanable))
-			drawBlackBars();
+			_graphics->drawBlackBars();
 		else if (_globals->_valleyVidNum)
-			drawBlackBars();
-		displayEffect1();
+			_graphics->drawBlackBars();
+		_graphics->displayEffect1();
 	} else if (r30 && !(_globals->_varF1 & RoomFlags::rf04))
-		effetpix();
+		_graphics->effetpix();
 	else
 		afficher128();
 	musique();
@@ -4055,7 +4001,7 @@ void EdenGame::maj2() {
 		drawTopScreen();
 		showObjects();
 	}
-	showBars();
+	_graphics->showBars();
 	showEvents();
 	_globals->_labyrinthDirections = 0;
 	specialin();
@@ -4121,6 +4067,10 @@ void EdenGame::EmergencyExit() {
 	SysBeep(1);
 }
 
+void EdenGame::stopMusic() {
+	_musicChannel->stop();
+}
+
 void EdenGame::run() {
 	_invIconsCount = (_vm->getPlatform() == Common::kPlatformMacintosh) ? 9 : 11;
 	_roomIconsBase = _invIconsBase + _invIconsCount;
@@ -4136,10 +4086,12 @@ void EdenGame::run() {
 
 	_musicChannel = new CSoundChannel(_vm->_mixer, 11025, false);
 	_voiceChannel = new CSoundChannel(_vm->_mixer, 11025, false);
+	_graphics = new EdenGraphics(this,_vm->_video);
+	_graphics->setSavedUnderSubtitles(false);
 
 	allocateBuffers();
 	openbigfile();
-	openWindow();
+	_graphics->openWindow();
 	loadpermfiles();
 
 	if (!_bufferAllocationErrorFl) {
@@ -4154,16 +4106,16 @@ void EdenGame::run() {
 			_quitFlag3 = false;
 			_normalCursor = true;
 			_torchCursor = false;
-			_cursKeepPos = Common::Point(-1, -1);
+			_graphics->setCursKeepPos(-1,-1);
 			if (!_gameLoaded)
 				intro();
 			edmain();
 			startmusique(1);
-			drawBlackBars();
+			_graphics->drawBlackBars();
 			display();
-			fadeToBlack(3);
-			clearScreen();
-			playHNM(95);
+			_graphics->fadeToBlack(3);
+			_graphics->clearScreen();
+			_graphics->playHNM(95);
 			if (_globals->_endGameFlag == 50) {
 				loadrestart();
 				_gameLoaded = false;
@@ -4176,10 +4128,12 @@ void EdenGame::run() {
 		// LostEdenMac_SavePrefs();
 	}
 
+	_graphics->fadeToBlack(4);
+
 	delete _voiceChannel;
 	delete _musicChannel;
+	delete _graphics;
 
-	fadeToBlack(4);
 	closebigfile();
 	freebuf();
 	CRYOLib_ManagersDone();
@@ -4193,12 +4147,12 @@ void EdenGame::edmain() {
 			// if in demo mode, reset game after a while
 			_demoCurrentTicks = _vm->_timerTicks;
 			if (_demoCurrentTicks - _demoStartTicks > 3000) {
-				rundcurs();
+				_graphics->rundcurs();
 				display();
 				fademusica0(2);
-				fadeToBlack(3);
+				_graphics->fadeToBlack(3);
 				CLBlitter_FillScreenView(0);
-				CLBlitter_FillView(_mainView, 0);
+				CLBlitter_FillView(_graphics->getMainView(), 0);
 				_musicChannel->stop();
 				_musicPlayingFlag = false;
 				_musicEnabledFlag = false;
@@ -4206,7 +4160,7 @@ void EdenGame::edmain() {
 				enterGame();
 			}
 		}
-		rundcurs();
+		_graphics->rundcurs();
 		musicspy();
 		FRDevents();
 		handleNarrator();
@@ -4237,28 +4191,28 @@ void EdenGame::intro() {
 		_vm->_video->closeSound();
 		_vm->_video->setupSound(22050, false, true);
 		_hnmSoundChannel = _vm->_video->getSoundChannel();
-		playHNM(2012);
-		playHNM(171);
+		_graphics->playHNM(2012);
+		_graphics->playHNM(171);
 		CLBlitter_FillScreenView(0);
 		_specialTextMode = false;
-		playHNM(2001);
+		_graphics->playHNM(2001);
 		_hnmSoundChannel->stop();
 		_vm->_video->closeSound();
 		_vm->_video->setupSound(11025, false, false);
 		_hnmSoundChannel = _vm->_video->getSoundChannel();
 	} else {
 		if (_vm->isDemo()) {
-			playHNM(171);	// Virgin logo
-			playHNM(98);	// Cryo logo
+			_graphics->playHNM(171);	// Virgin logo
+			_graphics->playHNM(98);	// Cryo logo
 		}
 		else {
-			playHNM(98);	// Cryo logo
-			playHNM(171);	// Virgin logo
+			_graphics->playHNM(98);	// Cryo logo
+			_graphics->playHNM(171);	// Virgin logo
 		}
 		CLBlitter_FillScreenView(0);
 		_specialTextMode = false;
 		startmusique(2);	// INTRO.MUS is played during intro video
-		playHNM(170);	// Intro video
+		_graphics->playHNM(170);	// Intro video
 	}
 }
 
@@ -4287,7 +4241,7 @@ void EdenGame::enterGame() {
 	showObjects();
 	drawTopScreen();
 	saveFriezes();
-	_showBlackBars = true;
+	_graphics->setShowBlackBars(true);
 	_globals->_mirrorEffect = 1;
 	updateRoom(_globals->_roomNum);
 	if (flag) {
@@ -4345,14 +4299,14 @@ void EdenGame::FRDevents() {
 		_curSpot2 = _currSpot;
 	if (_globals->_displayFlags & DisplayFlags::dfFrescoes) {
 		if (_frescoTalk)
-			restoreUnderSubtitles();
+			_graphics->restoreUnderSubtitles();
 		if (_currCursor == 9 && !_torchCursor) {
-			rundcurs();
+			_graphics->rundcurs();
 			_torchCursor = true;
-			_glowX = -1;
+			_graphics->setGlowX(-1);
 		}
 		if (_currCursor != 9 && _torchCursor) {
-			unglow();
+			_graphics->unglow();
 			_torchCursor = false;
 			_cursorSaved = false;
 		}
@@ -4426,24 +4380,24 @@ void EdenGame::updateCursor() {
 
 	if (!_torchCursor) {
 		useMainBank();
-		sundcurs(_cursorPosX + _scrollPos, _cursorPosY);
+		_graphics->sundcurs(_cursorPosX + _scrollPos, _cursorPosY);
 		if (_currCursor != 53 && _currCursor < 10) { //TODO: cond
 			if (_vm->getPlatform() == Common::kPlatformMacintosh)
 				engineMac();
 			else
 				enginePC();
 		} else
-			drawSprite(_currCursor, _cursorPosX + _scrollPos, _cursorPosY);
-		_glowX = 1;
+			_graphics->drawSprite(_currCursor, _cursorPosX + _scrollPos, _cursorPosY);
+		_graphics->setGlowX(1);
 	} else {
 		useBank(117);
 		if (_cursorPosX > 294)
 			_cursorPosX = 294;
-		unglow();
-		glow(_glowIndex);
-		drawSprite(_torchCurIndex, _cursorPosX + _scrollPos, _cursorPosY);
+		_graphics->unglow();
+		_graphics->glow(_glowIndex);
+		_graphics->drawSprite(_torchCurIndex, _cursorPosX + _scrollPos, _cursorPosY);
 		if (_frescoTalk)
-			displaySubtitles();
+			_graphics->displaySubtitles();
 	}
 }
 
@@ -4838,9 +4792,38 @@ void EdenGame::persovox() {
 	_lastAnimTicks = _vm->_timerTicks;
 }
 
+bool EdenGame::personIsTalking() {
+	return _personTalking;
+}
+
+perso_t *EdenGame::personSubtitles() {
+	perso_t *perso = nullptr;
+	switch (_globals->_curVideoNum) {
+	case 170:
+		perso = &_persons[PER_UNKN_156];
+		break;
+	case 83:
+		perso = &_persons[PER_MORKUS];
+		break;
+	case 88:
+		perso = &_persons[PER_MORKUS];
+		break;
+	case 89:
+		perso = &_persons[PER_MORKUS];
+		break;
+	case 94:
+		perso = &_persons[PER_MORKUS];
+		break;
+	default:
+		return perso;
+	}
+	return perso;
+}
+
+
 // Original name: endpersovox
 void EdenGame::endCharacterSpeech() {
-	restoreUnderSubtitles();
+	_graphics->restoreUnderSubtitles();
 	if (_personTalking) {
 		_voiceChannel->stop();
 		_personTalking = false;
@@ -4944,22 +4927,33 @@ void EdenGame::showObjects() {
 			icon->_cursorId |= 0x8000;
 	}
 	useMainBank();
-	drawSprite(55, 0, 176);
+	_graphics->drawSprite(55, 0, 176);
 	icon = &_gameIcons[_invIconsBase];
 	total = _globals->_objCount;
 	int16 index = _globals->_inventoryScrollPos;
 	for (int16 i = _invIconsCount; total-- && i--; icon++) {
 		char obj = _ownObjects[index++];
 		icon->_objectId = obj;
-		drawSprite(obj + 9, icon->sx, 178);
+		_graphics->drawSprite(obj + 9, icon->sx, 178);
 	}
 	_paletteUpdateRequired = true;
 	if ((_globals->_displayFlags & DisplayFlags::dfMirror) || (_globals->_displayFlags & DisplayFlags::dfPanable)) {
-		saveBottomFrieze();
+		_graphics->saveBottomFrieze();
 		scroll();
 	}
 }
 
+
+byte * EdenGame::getGlowBuffer() {
+	return _glowBuffer;
+}
+
+void EdenGame::setMusicFade(byte value) {
+	_musicFadeFlag = value;
+}
+
+
+
 void EdenGame::winObject(int16 id) {
 	object_t *object = getObjectPtr(id);
 	object->_flags |= ObjectFlags::ofFlag1;
@@ -5171,15 +5165,31 @@ void EdenGame::gotoPanel() {
 	_globals->_displayFlags = DisplayFlags::dfFlag2;
 	_globals->_menuFlags = 0;
 	displayPanel();
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	displayTopPanel();
-	CLBlitter_CopyView2Screen(_mainView);
-	CLPalette_Send2Screen(_globalPalette, 0, 256);
+	CLBlitter_CopyView2Screen(_graphics->getMainView());
+	_graphics->SendPalette2Screen(256);
 	_cursorPosX = 320 / 2;
 	_cursorPosY = 200 / 2;
 	_vm->setMousePosition(_mouseCenterX, _mouseCenterY);
 }
 
+void EdenGame::setMouseCenterX(uint16 xpos) {
+	_mouseCenterX = xpos;
+}
+
+void EdenGame::setMouseCenterY(uint16 ypos) {
+	_mouseCenterY = ypos;
+}
+
+uint16 EdenGame::getMouseCenterX() {
+	return _mouseCenterX;
+}
+
+uint16 EdenGame::getMouseCenterY() {
+	return _mouseCenterY;
+}
+
 void EdenGame::noclicpanel() {
 	if (_globals->_menuFlags & MenuFlags::mfFlag4) {
 		moveTapeCursor();
@@ -5225,12 +5235,12 @@ skip:
 }
 
 void EdenGame::generique() {
-	drawBlackBars();
+	_graphics->drawBlackBars();
 	display();
-	fadeToBlack(3);
-	clearScreen();
+	_graphics->fadeToBlack(3);
+	_graphics->clearScreen();
 	int oldmusic = _globals->_currMusicNum;
-	playHNM(95);
+	_graphics->playHNM(95);
 	displayPanel();
 	displayTopPanel();
 	_paletteUpdateRequired = true;
@@ -5245,14 +5255,30 @@ void EdenGame::cancel2() {
 	gameToMirror(1);
 }
 
+byte *EdenGame::getCurKeepBuf() {
+	return _cursKeepBuf;
+}
+
+bool EdenGame::isMouseHeld() {
+	return _mouseHeld;
+}
+
+void EdenGame::setMouseHeld() {
+	_mouseHeld = true;
+}
+
+void EdenGame::setMouseNotHeld() {
+	_mouseHeld = false;
+}
+
 void EdenGame::testvoice() {
 	_globals->_frescoNumber = 0;
 	_globals->_characterPtr = _persons;
 	_globals->_dialogType = DialogType::dtInspect;
 	int16 num = (_persons[PER_KING]._id << 3) | _globals->_dialogType;
 	dialoscansvmas((Dialog *)getElem(_gameDialogs, num));
-	restoreUnderSubtitles();
-	displaySubtitles();
+	_graphics->restoreUnderSubtitles();
+	_graphics->displaySubtitles();
 	persovox();
 	waitEndSpeak();
 	endCharacterSpeech();
@@ -5275,7 +5301,7 @@ void EdenGame::load() {
 	}
 	_vm->hideMouse();
 	CLBlitter_FillScreenView(0xFFFFFFFF);
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	CLBlitter_FillScreenView(0);
 	if (!_gameLoaded) {
 		_musicFadeFlag = 3;
@@ -5293,9 +5319,9 @@ void EdenGame::load() {
 	}
 	bool talk = _globals->_autoDialog;    //TODO check me
 	initafterload();
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	CLBlitter_FillScreenView(0);
-	CLBlitter_FillView(_mainView, 0);
+	CLBlitter_FillView(_graphics->getMainView(), 0);
 	drawTopScreen();
 	_globals->_inventoryScrollPos = 0;
 	showObjects();
@@ -5343,7 +5369,7 @@ void EdenGame::save() {
 	saveGame(name);
 	_vm->hideMouse();
 	CLBlitter_FillScreenView(0xFFFFFFFF);
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	CLBlitter_FillScreenView(0);
 	_musicFadeFlag = 3;
 	musicspy();
@@ -5351,7 +5377,7 @@ void EdenGame::save() {
 }
 
 void EdenGame::desktopcolors() {
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	CLBlitter_FillScreenView(0xFFFFFFFF);
 	CLPalette_BeSystem();
 	_vm->showMouse();
@@ -5389,13 +5415,13 @@ void EdenGame::panelrestart() {
 		_globals->_currMusicNum = 0;
 		startmusique(curmus);
 	}
-	fadeToBlack(3);
+	_graphics->fadeToBlack(3);
 	CLBlitter_FillScreenView(0);
-	CLBlitter_FillView(_mainView, 0);
+	CLBlitter_FillView(_graphics->getMainView(), 0);
 	drawTopScreen();
 	showObjects();
 	saveFriezes();
-	_showBlackBars = true;
+	_graphics->setShowBlackBars(true);
 	updateRoom(_globals->_roomNum);
 }
 
@@ -5409,7 +5435,7 @@ void EdenGame::confirmer(char mode, char yesId) {
 	_gameIcons[119]._objectId = yesId;
 	_confirmMode = mode;
 	useBank(65);
-	drawSprite(12, 117, 74);
+	_graphics->drawSprite(12, 117, 74);
 	_cursorPosX = 156;
 	if (_vm->shouldQuit())
 		_cursorPosX = 136;
@@ -5451,7 +5477,7 @@ void EdenGame::choseSubtitleOption() {
 	if (lang > 5)
 		return;
 	_globals->_prefLanguage = lang;
-	langbuftopanel();
+	_graphics->langbuftopanel();
 	displayLanguage();
 }
 
@@ -5476,7 +5502,7 @@ void EdenGame::changervol() {
 		newvol(_curSliderValuePtr, delta);
 		if (_globals->_menuFlags & MenuFlags::mfFlag2)
 			newvol(_curSliderValuePtr + 1, delta);
-		cursbuftopanel();
+		_graphics->cursbuftopanel();
 		displayCursors();
 		_curSliderY = _cursorPosY;
 	} else
@@ -5569,16 +5595,28 @@ void EdenGame::moveTapeCursor() {
 		_globals->_menuFlags &= ~MenuFlags::mfFlag4;
 }
 
+void EdenGame::setCursorSaved(bool cursorSaved) {
+	_cursorSaved = cursorSaved;
+}
+
+bool EdenGame::getCursorSaved() {
+	return _cursorSaved;
+}
+
+bool EdenGame::getNoPalette() {
+	return _noPalette;
+}
+
 // Original name: affcurstape
 void EdenGame::displayTapeCursor() {
 	if (_globals->_drawFlags & DrawFlags::drDrawFlag8)
 		_noPalette = true;
 	useBank(65);
-	drawSprite(2, 0, 176);
+	_graphics->drawSprite(2, 0, 176);
 	int x = (_globals->_tapePtr - _tapes) * 8 + 97;
 	_gameIcons[112].sx = x - 3;
 	_gameIcons[112].ex = x + 3;
-	drawSprite(5, x, 179);
+	_graphics->drawSprite(5, x, 179);
 	_noPalette = false;
 }
 
@@ -5610,29 +5648,11 @@ void EdenGame::clickTapeCursor() {
 	_globals->_menuFlags |= MenuFlags::mfFlag4;
 }
 
-void EdenGame::paneltobuf() {
-	setSrcRect(0, 16, 320 - 1, 169 - 1);
-	setDestRect(320, 16, 640 - 1, 169 - 1);
-	CLBlitter_CopyViewRect(_mainView, _mainView, &rect_src, &rect_dst);
-}
-
-void EdenGame::cursbuftopanel() {
-	setSrcRect(434, 40, 525 - 1, 111 - 1);
-	setDestRect(114, 40, 205 - 1, 111 - 1);
-	CLBlitter_CopyViewRect(_mainView, _mainView, &rect_src, &rect_dst);
-}
-
-void EdenGame::langbuftopanel() {
-	setSrcRect(328, 42, 407 - 1, 97 - 1);
-	setDestRect(8, 42,  87 - 1, 97 - 1);
-	CLBlitter_CopyViewRect(_mainView, _mainView, &rect_src, &rect_dst);
-}
-
 // Original name: affpanel
 void EdenGame::displayPanel() {
 	useBank(65);
-	drawSprite(0, 0, 16);
-	paneltobuf();
+	_graphics->drawSprite(0, 0, 16);
+	_graphics->paneltobuf();
 	displayLanguage();
 	displayCursors();
 	displayTapeCursor();
@@ -5643,8 +5663,8 @@ void EdenGame::displayLanguage() {
 	useBank(65);
 	if (_globals->_prefLanguage > 5)
 		return;
-	drawSprite(6,  8, _globals->_prefLanguage * 9 + 43);  //TODO: * FONT_HEIGHT
-	drawSprite(7, 77, _globals->_prefLanguage * 9 + 44);
+	_graphics->drawSprite(6,  8, _globals->_prefLanguage * 9 + 43);  //TODO: * FONT_HEIGHT
+	_graphics->drawSprite(7, 77, _globals->_prefLanguage * 9 + 44);
 }
 
 // Original name: affcursvol
@@ -5652,11 +5672,11 @@ void EdenGame::displayVolCursor(int16 x, int16 vol1, int16 vol2) {
 	int16 slider = 3;
 	if (_lastMenuItemIdLo && (_lastMenuItemIdLo & 9) != 1) //TODO check me
 		slider = 4;
-	drawSprite(slider, x, 104 - vol1);
+	_graphics->drawSprite(slider, x, 104 - vol1);
 	slider = 3;
 	if ((_lastMenuItemIdLo & 9) != 0)
 		slider = 4;
-	drawSprite(slider, x + 12, 104 - vol2);
+	_graphics->drawSprite(slider, x + 12, 104 - vol2);
 }
 
 // Original name: affcurseurs
@@ -5681,17 +5701,17 @@ void EdenGame::selectCursor(int itemId) {
 
 // Original name: afftoppano
 void EdenGame::displayTopPanel() {
-	drawSprite(1, 0, 0);
+	_graphics->drawSprite(1, 0, 0);
 }
 
 // Original name: affresult
 void EdenGame::displayResult() {
-	restoreUnderSubtitles();
+	_graphics->restoreUnderSubtitles();
 	_globals->_characterPtr = &_persons[19];
 	_globals->_dialogType = DialogType::dtInspect;
 	int16 num = (_persons[PER_UNKN_156]._id << 3) | _globals->_dialogType;
 	if (dialoscansvmas((Dialog *)getElem(_gameDialogs, num)))
-		displaySubtitles();
+		_graphics->displaySubtitles();
 	_globals->_varCA = 0;
 	_globals->_dialogType = DialogType::dtTalk;
 	_globals->_characterPtr = nullptr;
@@ -7137,14 +7157,7 @@ void EdenGame::loadMap(int file_id, byte *buffer) {
 	if (_vm->getPlatform() == Common::kPlatformMacintosh) {
 		loadpartoffile(file_id, buffer, 32, 256 * 3);
 
-		for (int i = 0; i < 256; i++) {
-			color3_t color;
-			color.r = buffer[i * 3] << 8;
-			color.g = buffer[i * 3 + 1] << 8;
-			color.b = buffer[i * 3 + 2] << 8;
-			CLPalette_SetRGBColor(_globalPalette, i, &color);
-		}
-		CLPalette_Send2Screen(_globalPalette, 0, 256);
+		_graphics->setPaletteColor(buffer);
 
 		loadpartoffile(file_id, buffer, 32 + 256 * 3, 0x4000);
 	} else {
@@ -7391,7 +7404,7 @@ void EdenGame::displayPolygoneMapping(Cube *cubep, CubeFace *face) {
 	ymin = MIN(r31, ymin);
 	ymax = MAX(r31, ymax);
 	drawMappingLine(r20, r30, r26, r31, r19, r18, r25, r24, _lines);
-	displayMappingLine(ymin, ymax, _mainView->_bufferPtr, face->_texturePtr);
+	displayMappingLine(ymin, ymax, _graphics->getMainView()->_bufferPtr, face->_texturePtr);
 }
 
 // Original name: trace_ligne_mapping
@@ -7454,7 +7467,7 @@ void EdenGame::drawMappingLine(int16 r3, int16 r4, int16 r5, int16 r6, int16 r7,
 // Original name: affiche_ligne_mapping
 void EdenGame::displayMappingLine(int16 r3, int16 r4, byte *target, byte *texture) {
 	int16 height = r4 - r3;
-	byte *trg_line = _mainView->_bufferPtr + r3 * 640;    //TODO: target??
+	byte *trg_line = _graphics->getMainView()->_bufferPtr + r3 * 640;    //TODO: target??
 	int16 *line = &_lines[r3 * 8];
 	//	debug("curs: beg draw %d - %d", r3, r4);
 	for (int r22 = height; r22; r22--, line += 8, trg_line += 640) {
@@ -7703,17 +7716,17 @@ void EdenGame::renderCube() {
 
 	const int xshift = -5;		// TODO: temporary fix to decrease left margin
 	unsigned char *cur = _cursor;
-	unsigned char *scr = _mainView->_bufferPtr + _cursorPosX + _scrollPos  + xshift + _cursorPosY * _mainView->_pitch;
+	unsigned char *scr = _graphics->getMainView()->_bufferPtr + _cursorPosX + _scrollPos  + xshift + _cursorPosY * _graphics->getMainView()->_pitch;
 
 	for (int y = 0; y < 40; y++) {
 		for (int x = 0; x < 40; x++) {
-			if (x + _cursorPosX + _scrollPos + xshift < _mainView->_pitch && y + _cursorPosY < _mainView->_height)
+			if (x + _cursorPosX + _scrollPos + xshift < _graphics->getMainView()->_pitch && y + _cursorPosY < _graphics->getMainView()->_height)
 				if (*cur)
 					*scr = *cur;
 			scr++;
 			cur++;
 		}
-		scr += _mainView->_pitch - 40;
+		scr += _graphics->getMainView()->_pitch - 40;
 	}
 }
 
diff --git a/engines/cryo/eden.h b/engines/cryo/eden.h
index dcf101c..f2983e8 100644
--- a/engines/cryo/eden.h
+++ b/engines/cryo/eden.h
@@ -40,17 +40,80 @@ enum Direction {
 namespace Cryo {
 
 class CryoEngine;
+class EdenGraphics;
 
 class EdenGame {
 private:
-	CryoEngine *_vm;
+	
+	EdenGraphics *_graphics;
 
 public:
 	EdenGame(CryoEngine *vm);
+	~EdenGame();
 
 	void run();
 	object_t *getObjectPtr(int16 id);
 	void showObjects();
+	void saveFriezes();
+	void useBank(int16 bank);
+	void musicspy();
+	void fademusica0(int16 delay);
+	void wait(int howlong);
+	bool isObjectHere(int16 id);
+	void display();
+
+	void setMouseCenterX(uint16 xpos);
+	void setMouseCenterY(uint16 ypos);
+
+	void stopMusic();
+
+	void setVolume(uint16 vol);
+
+	uint16 getMouseCenterX();
+	uint16 getMouseCenterY();
+
+	bool dialoscansvmas(Dialog *dial);
+	void musique();
+	void preloadDialogs(int16 vid);
+	void loadHnm(uint16 num);
+	bool personIsTalking();
+	bool animationIsActive();
+	byte *getImageDesc();
+	byte *getPlaceRawBuf();
+	byte getActionCursor(byte value);
+	int16 getNumTextLines();
+	int16 getScrollPos();
+	/* 
+	 * Identify person based on current video number
+	 */
+	perso_t *personSubtitles();
+
+	int16 getGameIconY(int16 index);
+	int16 getGameIconX(int16 index);
+
+	byte *getGameDialogs();
+
+	bool getSpecialTextMode();
+	void setSpecialTextMode(bool value);
+
+	void setCursorSaved(bool cursorSaved);
+	bool getCursorSaved();
+	bool getNoPalette();
+	int16 getCurBankNum();
+	byte *getCurKeepBuf();
+	byte *getBankData();
+	int16 getCurPosX();
+	void setCurPosX(int16 xpos);
+	int16 getCurPosY();
+	void setCurPosY(int16 ypos);
+	byte *getGlowBuffer();
+	void setMusicFade(byte value);
+	bool isMouseHeld();
+	void setMouseHeld();
+	void setMouseNotHeld();
+
+	global_t *_globals; // TODO: Make private and use getters
+	CryoEngine *_vm;
 
 private:
 	void removeConsole();
@@ -110,29 +173,15 @@ private:
 	void actionMoveEast();
 	void actionMoveSouth();
 	void actionMoveWest();
-	void display();
+
 	void afficher128();
-	void saveFriezes();
-	void saveTopFrieze(int16 x);
-	void saveBottomFrieze();
+
+
 	void restoreFriezes();
-	void restoreTopFrieze();
-	void restoreBottomFrieze();
+
 	void useMainBank();
 	void useCharacterBank();
-	void useBank(int16 bank);
-	void sundcurs(int16 x, int16 y);
-	void rundcurs();
-	void drawSprite(int16 index, int16 x, int16 y, bool withBlack = false, bool onSubtitle = false);
-	void getglow(int16 x, int16 y, int16 w, int16 h);
-	void unglow();
-	void glow(int16 index);
-	void readPalette(byte *ptr);
-	void hideBars();
-	void showBars();
-	void saveMouthBackground();
-	void restoreMouthBackground();
-	void drawBlackBars();
+
 	void drawTopScreen();
 	void displayValleyMap();
 	void displayMapMark(int16 index, int16 location);
@@ -170,7 +219,6 @@ private:
 	void removeMouthSprite();
 	void AnimEndCharacter();
 	void setCharacterSprite(byte *spr);
-	void displayImage();
 	void displayCharacter1();
 	void displayCharacter();
 	void ef_perso();
@@ -192,10 +240,7 @@ private:
 	void my_bulle();
 	void my_pr_bulle();
 	void drawSubtitleChar(byte c, byte color, int16 width);
-	void displaySubtitles();
-	void saveUnderSubtitles(int16 y);
-	void restoreUnderSubtitles();
-	void displayHNMSubtitle();
+	
 	void patchSentence();
 	void vavapers();
 	void citadelle();
@@ -258,34 +303,20 @@ private:
 	void actionGotoMap();
 	void record();
 	bool dial_scan(Dialog *dial);
-	bool dialoscansvmas(Dialog *dial);
+
 	bool dialogEvent(perso_t *perso);
 	void characterStayHere();
 	void endDeath(int16 vid);
 	void chronoEvent();
 	void setChrono(int16 t);
-	void preloadDialogs(int16 vid);
-	void displayEffect1();
-	void displayEffect2();
-	void displayEffect3();
-	void displayEffect4();
-	void clearScreen();
-	void colimacon(int16 pattern[16]);
-	void fadeToBlack(int delay);
-	void fadeToBlackLowPalette(int delay);
-	void fadeFromBlackLowPalette(int delay);
-	void blackRect32();
-	void setSrcRect(int16 sx, int16 sy, int16 ex, int16 ey);
-	void setDestRect(int16 sx, int16 sy, int16 ex, int16 ey);
-	void wait(int howlong);
-	void effetpix();
+
+
 	void verifh(byte *ptr);
 	void openbigfile();
 	void closebigfile();
 	void loadRawFile(uint16 num, byte *buffer);
 	void loadIconFile(uint16 num, Icon *buffer);
 	void loadRoomFile(uint16 num, Room *buffer);
-	void loadHnm(uint16 num);
 	int loadSound(uint16 num);
 	void convertMacToPC();
 	void loadpermfiles();
@@ -299,10 +330,8 @@ private:
 	void removeInfo(byte info);
 	void updateInfoList();
 	void initGlobals();
-	void initRects();
+
 	void closeRoom();
-	void displaySingleRoom(Room *room);
-	void displayRoom();
 	void displayPlace();
 	void loadPlace(int16 num);
 	void specialoutside();
@@ -317,7 +346,6 @@ private:
 	void updateRoom(uint16 roomNum);
 	void allocateBuffers();
 	void freebuf();
-	void openWindow();
 	void EmergencyExit();
 	void edmain();
 	void intro();
@@ -327,22 +355,19 @@ private:
 	Icon *scan_icon_list(int16 x, int16 y, int16 index);
 	void updateCursor();
 	void mouse();
-	void showMovie(char arg1);
-	void playHNM(int16 num);
-	void handleHNMSubtitles();
-	void musique();
+
 	void startmusique(byte num);
-	void musicspy();
+
 	int loadmusicfile(int16 num);
 	void persovox();
 	void endCharacterSpeech();
 	void fademusicup();
-	void fademusica0(int16 delay);
+
 	void countObjects();
 	void winObject(int16 id);
 	void loseObject(int16 id);
 	void lostObject();
-	bool isObjectHere(int16 id);
+
 	void objectmain(int16 id);
 	void getObject(int16 id);
 	void putObject();
@@ -381,9 +406,6 @@ private:
 	void forwardTape();
 	void stopTape();
 	void clickTapeCursor();
-	void paneltobuf();
-	void cursbuftopanel();
-	void langbuftopanel();
 	void displayPanel();
 	void displayLanguage();
 	void displayVolCursor(int16 x, int16 vol1, int16 vol2);
@@ -557,24 +579,16 @@ private:
 	byte  _oldPix[8];
 	Common::Point _adamMapMarkPos;
 	byte  _cursKeepBuf[2500];
-	Common::Point _cursKeepPos;
 	bool  _torchCursor;
 	int16 _curBankNum;
-	int16 _glowX;
-	int16 _glowY;
-	int16 _glowW;
-	int16 _glowH;
 	bool  _paletteUpdateRequired;
 	bool  _cursorSaved;
-	bool  _showBlackBars;
 	bool  _backgroundSaved;
 	byte *_bankData;
-	color_t _globalPalette[256];    //TODO palette_t
 	perso_t *_tyranPtr;
 	int   _lastAnimFrameNumb;
 	int   _curAnimFrameNumb;
 	int   _lastAnimTicks;
-	Common::Rect *_curCharacterRect;
 	int16 _numAnimFrames;
 	int16 _maxPersoDesc;
 	int16 _numImgDesc;
@@ -590,7 +604,6 @@ private:
 	byte *_animationTable;
 	byte  _imageDesc[512];
 	byte *_characterBankData;
-	bool  _savedUnderSubtitles;
 	int16 _numTextLines;
 	byte  _sentenceBuffer[400];
 	byte   phraseIconsBuffer[10];
@@ -607,14 +620,9 @@ private:
 	char            _lastPhrasesFile;
 	byte _dialogSkipFlags;
 
-	color3_t        newColor;
-	color_t         oldPalette[256];    // TODO palette_t ?
-	color_t         newPalette[256];
-	Common::Rect          rect_dst, rect_src;
 	byte *_voiceSamplesBuffer;    //TODO: sound sample buffer
 	Common::File _bigfile;
 	byte  _infoList[16];
-	bool  _needToFade;
 	byte *_mainBankBuf;
 	byte *_musicBuf;
 	byte *_gameLipsync;
@@ -627,12 +635,9 @@ private:
 	Room *_gameRooms;
 	PakHeaderNode *_bigfileHeader;
 	byte *_glowBuffer;
-	byte *_mainViewBuf;
-	byte *_view2Buf;
+
 	byte *_gameFont;  //TODO: rename to font?
-	byte *_subtitlesViewBuf;
-	byte *_underSubtitlesViewBuf; // CHECKME: Useless?
-	global_t *_globals;
+
 	uint16 _mouseCenterX;
 	uint16 _mouseCenterY;
 	bool _bufferAllocationErrorFl;
@@ -646,18 +651,6 @@ private:
 	CSoundChannel *_hnmSoundChannel;
 	Sound        *_voiceSound;
 
-	View  *_view2;
-	View  *_underSubtitlesView;
-	View  *_subtitlesView;
-	View  *_underBarsView;
-	View  *_mainView;
-	View  *_hnmView;
-	Common::Rect _underSubtitlesBackupRect;
-	Common::Rect _underSubtitlesScreenRect;
-	Common::Rect _underBottomBarBackupRect;
-	Common::Rect _underBottomBarScreenRect;
-	Common::Rect _underTopBarBackupRect;
-	Common::Rect _underTopBarScreenRect;
 	int   _demoCurrentTicks;
 	int   _demoStartTicks;
 	int   _currentTime;
@@ -670,11 +663,8 @@ private:
 	Icon *_curSpot2;
 	bool  _mouseHeld;
 	bool  _normalCursor;
-	byte *_hnmViewBuf;
-	bool  _showVideoSubtitle;
-	bool  _videoCanceledFlag;  //TODO: hnm_canceled
+
 	bool  _specialTextMode;
-	int   _hnmFrameNum;
 	int   _voiceSamplesSize;   //TODO: perso vox sample data len
 	int16 _musicRightVol;
 	int16 _musicLeftVol;
diff --git a/engines/cryo/eden_graphics.cpp b/engines/cryo/eden_graphics.cpp
new file mode 100644
index 0000000..cec2a0a
--- /dev/null
+++ b/engines/cryo/eden_graphics.cpp
@@ -0,0 +1,1447 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "cryo/cryo.h"
+#include "cryo/platdefs.h"
+#include "cryo/cryolib.h"
+#include "cryo/eden.h"
+#include "cryo/sound.h"
+#include "cryo/eden_graphics.h"
+#include "cryo/video.h"
+
+namespace Cryo {
+
+EdenGraphics::EdenGraphics(EdenGame *game, HnmPlayer *video) : _game(game), _video(video) {
+	_glowH = _glowW = _glowY = _glowX = 0;
+	_showVideoSubtitle = false;
+	_showBlackBars = false;	
+	_mainView = nullptr;
+	_mainViewBuf = nullptr;
+	_hnmView = nullptr;
+	_view2 = nullptr;
+	_view2Buf = nullptr;
+	_curCharacterRect = nullptr;
+	_subtitlesViewBuf = nullptr;
+	_underSubtitlesView = nullptr;
+	_subtitlesView = nullptr;
+	_underBarsView = nullptr;
+	_needToFade = false;
+}
+
+void EdenGraphics::SendPalette2Screen(int16 value) {
+	CLPalette_Send2Screen(_globalPalette, 0, value);
+}
+
+void EdenGraphics::setFade(bool value) {
+	_needToFade = value;
+}
+
+bool EdenGraphics::getFade() {
+	return _needToFade;
+}
+
+void EdenGraphics::setPaletteColor(byte *buffer) {
+	for (int i = 0; i < 256; i++) {
+		color3_t color;
+		color.r = buffer[i * 3] << 8;
+		color.g = buffer[i * 3 + 1] << 8;
+		color.b = buffer[i * 3 + 2] << 8;
+		CLPalette_SetRGBColor(_globalPalette, i, &color);
+	}
+	SendPalette2Screen(256);
+}
+
+void EdenGraphics::readPalette(byte *ptr) {
+	bool doit = true;
+	color3_t pal_entry;
+	while (doit) {
+		uint16 idx = *ptr++;
+		if (idx != 0xFF) {
+			uint16 cnt = *ptr++;
+			while (cnt--) {
+				if (idx == 0) {
+					pal_entry.r = 0;
+					pal_entry.g = 0;
+					pal_entry.b = 0;
+					ptr += 3;
+				} else {
+					pal_entry.r = *ptr++ << 10;
+					pal_entry.g = *ptr++ << 10;
+					pal_entry.b = *ptr++ << 10;
+				}
+				CLPalette_SetRGBColor(_globalPalette, idx, &pal_entry);
+				idx++;
+			}
+		} else
+			doit = false;
+	}
+}
+
+// Original name: noclipax
+void EdenGraphics::drawSprite(int16 index, int16 x, int16 y, bool withBlack, bool onSubtitle) {
+	uint16 width = (!onSubtitle) ? 640 : _subtitlesXWidth;
+	byte *pix = _game->getBankData();
+	byte *buf = (!onSubtitle) ? _mainViewBuf : _subtitlesViewBuf;
+	byte *scr = buf + x + y * width;
+	if (_game->getCurBankNum() != 117 && (!_game->getNoPalette() || withBlack || onSubtitle)) {
+		if (READ_LE_UINT16(pix) > 2)
+			readPalette(pix + 2);
+	}
+	pix += READ_LE_UINT16(pix);
+	pix += READ_LE_UINT16(pix + index * 2);
+	//  int16   height:9
+	//  int16   pad:6;
+	//  int16   flag:1;
+	byte h0 = *pix++;
+	byte h1 = *pix++;
+	int16 w = ((h1 & 1) << 8) | h0;
+	int16 h = *pix++;
+	byte mode = *pix++;
+	if (mode != 0xFF && mode != 0xFE)
+		return;
+	if (y + h > 200 && !onSubtitle)
+		h -= (y + h - 200);
+	if (h1 & 0x80) {
+		// compressed
+		for (; h-- > 0;) {
+			for (int16 ww = w; ww > 0;) {
+				byte c = *pix++;
+				if (c >= 0x80) {
+					if (c == 0x80) {
+						byte fill = *pix++;
+						if (fill == 0 && !withBlack) {
+							scr += 128 + 1;
+							ww -= 128 + 1;
+						}
+						else {
+							byte runVal;
+							*scr++ = fill;  //TODO: wha?
+							*scr++ = fill;
+							ww -= 128 + 1;
+							for (runVal = 127; runVal--;)
+								*scr++ = fill;
+						}
+					}
+					else {
+						byte fill = *pix++;
+						byte runVal = 255 - c + 2;
+						ww -= runVal;
+						if (fill == 0 && !withBlack)
+							scr += runVal;
+						else
+							for (; runVal--;)
+								*scr++ = fill;
+					}
+				}
+				else {
+					byte runVal = c + 1;
+					ww -= runVal;
+					for (; runVal--;) {
+						byte p = *pix++;
+						if (p == 0 && !withBlack)
+							scr++;
+						else
+							*scr++ = p;
+					}
+				}
+			}
+			scr += width - w;
+		}
+	}
+	else {
+		// uncompressed
+		for (; h--;) {
+			for (int16 ww = w; ww--;) {
+				byte p = *pix++;
+				if (p == 0 && !withBlack)
+					scr++;
+				else
+					*scr++ = p;
+			}
+			scr += width - w;
+		}
+	}
+}
+
+void EdenGraphics::setCursKeepPos(int16 x, int16 y) {
+	_cursKeepPos = Common::Point(-1, -1);
+}
+
+byte *EdenGraphics::getSubtitlesViewBuf() {
+	return _subtitlesViewBuf;
+}
+
+View *EdenGraphics::getSubtitlesView() {
+	return _subtitlesView;
+}
+
+void EdenGraphics::loadMouthRectFromCurChar() {
+	_rect_src.left   = _curCharacterRect->left;
+	_rect_src.top    = _curCharacterRect->top;
+	_rect_src.right  = _curCharacterRect->right;
+	_rect_src.bottom = _curCharacterRect->bottom;
+	_rect_dst.left   = _curCharacterRect->left  + 320;
+	_rect_dst.top    = _curCharacterRect->top;
+	_rect_dst.right  = _curCharacterRect->right + 320;
+	_rect_dst.bottom = _curCharacterRect->bottom;
+}
+
+void EdenGraphics::paneltobuf() {
+	setSrcRect(0, 16, 320 - 1, 169 - 1);
+	setDestRect(320, 16, 640 - 1, 169 - 1);
+	CLBlitter_CopyViewRect(getMainView(), getMainView(), &_rect_src, &_rect_dst);	
+}
+
+void EdenGraphics::cursbuftopanel() {
+	setSrcRect(434, 40, 525 - 1, 111 - 1);
+	setDestRect(114, 40, 205 - 1, 111 - 1);
+	CLBlitter_CopyViewRect(getMainView(), getMainView(), &_rect_src, &_rect_dst);	
+}
+
+void EdenGraphics::langbuftopanel() {
+	setSrcRect(328, 42, 407 - 1, 97 - 1);
+	setDestRect(8, 42,  87 - 1, 97 - 1);
+	CLBlitter_CopyViewRect(getMainView(), getMainView(), &_rect_src, &_rect_dst);	
+}
+
+// Original name: sauvefondbouche
+void EdenGraphics::saveMouthBackground() {
+	loadMouthRectFromCurChar();
+	CLBlitter_CopyViewRect(getMainView(), getMainView(), &_rect_src, &_rect_dst);	
+}
+
+// Original name: restaurefondbouche
+void EdenGraphics::restoreMouthBackground() {
+	loadMouthRectFromCurChar();
+	CLBlitter_CopyViewRect(getMainView(), getMainView(), &_rect_dst, &_rect_src);
+}
+
+void EdenGraphics::setGlowX(int16 value) {
+	_glowX = value;
+}
+
+View *EdenGraphics::getMainView() {
+	return _mainView;
+}
+
+void EdenGraphics::setGlowY(int16 value) {
+	_glowY = value;
+}
+
+void EdenGraphics::setCurCharRect(Common::Rect * charRect) {
+	_curCharacterRect = charRect;
+}
+
+void EdenGraphics::sundcurs(int16 x, int16 y) {
+	byte *keep = _game->getCurKeepBuf();
+	x = CLIP<int16>(x - 4, 0, 640 - 48);
+	y = CLIP<int16>(y - 4, 0, 200 - 48);
+	_cursKeepPos = Common::Point(x, y);
+	byte *scr = _mainViewBuf + _cursKeepPos.x + _cursKeepPos.y * 640;
+	for (int16 h = 48; h--;) {
+		for (int16 w = 48; w--;)
+			*keep++ = *scr++;
+		scr += 640 - 48;
+	}
+	_game->setCursorSaved(true);;
+}
+
+void EdenGraphics::rundcurs() {
+	byte *keep = _game->getCurKeepBuf();
+	byte *scr = _mainViewBuf + _cursKeepPos.x + _cursKeepPos.y * 640;
+	if (!_game->getCursorSaved() || (_cursKeepPos == Common::Point(-1, -1)))  //TODO ...
+		return;
+
+	for (int16 h = 48; h--;) {
+		for (int16 w = 48; w--;)
+			*scr++ = *keep++;
+		scr += 640 - 48;
+	}
+}
+
+byte * EdenGraphics::getHnmViewBuf() {
+	return _hnmViewBuf;
+}
+
+void EdenGraphics::getglow(int16 x, int16 y, int16 w, int16 h) {
+	byte *scr = _mainViewBuf + x + y * 640;
+	byte *gl = _game->getGlowBuffer();
+	_glowX = x;
+	_glowY = y;
+	_glowW = w;
+	_glowH = h;
+	for (; h--;) {
+		for (int16 ww = w; ww--;)
+			*gl++ = *scr++;
+		scr += 640 - w;
+	}
+}
+
+void EdenGraphics::unglow() {
+	byte *gl = _game->getGlowBuffer();
+	byte *scr = _mainViewBuf + _glowX + _glowY * 640;
+	if (_glowX < 0 || _glowY < 0)   //TODO: move it up
+		return;
+	for (; _glowH--;) {
+		for (int16 ww = _glowW; ww--;)
+			*scr++ = *gl++;
+		scr += 640 - _glowW;
+	}
+}
+
+void EdenGraphics::glow(int16 index) {
+	// byte pixbase;
+	byte *pix = _game->getBankData();
+
+	index += 9;
+	pix += READ_LE_UINT16(pix);
+	pix += READ_LE_UINT16(pix + index * 2);
+	//  int16   height:9
+	//  int16   pad:6;
+	//  int16   flag:1;
+	byte h0 = *pix++;
+	byte h1 = *pix++;
+	int16 w = ((h1 & 1) << 8) | h0;
+	int16 h = *pix++;
+	byte mode = *pix++;
+	if (mode != 0xFF && mode != 0xFE)
+		return;
+
+	int16 x = _game->getCurPosX() + _game->getScrollPos() - 38;
+	int16 y = _game->getCurPosY() - 28;
+	int16 ex = _game->_globals->_frescoeWidth + 320;
+
+	if (x + w <= 0 || x >= ex || y + h <= 0 || y >= 176)
+		return;
+
+	int16 dx;
+	if (x < 0) {
+		dx = -x;
+		x = 0;
+	}
+	else if (x + w > ex)
+		dx = x + w - ex;
+	else
+		dx = 0;
+
+	int16 dy = 0;
+	if (y < 16) {
+		dy = 16 - y;
+		y = 16;
+	}
+	else if (y + h > 175)
+		dy = y + h - 175;
+
+	int16 pstride = dx;
+	int16 sstride = 640 - (w - dx);
+	if (y == 16)
+		pix += w * dy;
+	if (x == 0)
+		pix += dx;
+
+	byte *scr = _mainViewBuf + x + y * 640;
+
+	w -= dx;
+	h -= dy;
+
+	getglow(x, y, w, h);
+
+	for (; h--;) {
+		for (int16 ww = w; ww--;) {
+			byte p = *pix++;
+			if (p == 0)
+				scr++;
+			else
+				*scr++ += p << 4;
+		}
+		pix += pstride;
+		scr += sstride;
+	}
+}
+
+// Original name : blackbars
+void EdenGraphics::drawBlackBars() {
+	byte *scr = _mainViewBuf;
+	for (int16 y = 0; y < 16; y++) {
+		for (int16 x = 0; x < 640; x++)
+			*scr++ = 0;
+	}
+
+	scr += 640 * (200 - 16 - 24);
+	for (int16 y = 0; y < 24; y++) {
+		for (int16 x = 0; x < 640; x++)
+			*scr++ = 0;
+	}
+}
+
+// Original name: restaurefriseshaut
+void EdenGraphics::restoreTopFrieze() {
+	_underTopBarScreenRect.left = _game->getScrollPos();
+	_underTopBarScreenRect.right = _game->getScrollPos() + 320 - 1;
+	CLBlitter_CopyViewRect(_underBarsView, getMainView(), &_underTopBarBackupRect, &_underTopBarScreenRect);
+}
+
+// Original name: bars_out
+void EdenGraphics::hideBars() {
+	if (_showBlackBars)
+		return;
+
+	_game->display();
+	_underTopBarScreenRect.left = _game->getScrollPos();
+	_underTopBarScreenRect.right = _game->getScrollPos() + 320 - 1;
+	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+	_underBottomBarScreenRect.left = _underTopBarScreenRect.left;
+	_underBottomBarScreenRect.right = _underTopBarScreenRect.right;
+	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underBottomBarScreenRect, &_underBottomBarBackupRect);
+	int16 r19 = 14;   // TODO - init in decl?
+	int16 r20 = 176;
+	int16 r25 = 14;
+	int16 r24 = 21;
+	_underTopBarScreenRect.left = 0;
+	_underTopBarScreenRect.right = 320 - 1;
+	_underTopBarBackupRect.left = _game->getScrollPos();
+	_underTopBarBackupRect.right = _game->getScrollPos() + 320 - 1;
+	unsigned int *scr40, *scr41, *scr42;
+	while (r24 > 0) {
+		if (r25 > 0) {
+			_underTopBarScreenRect.top = 16 - r25;
+			_underTopBarScreenRect.bottom = 16 - 1;
+			_underTopBarBackupRect.top = 0;
+			_underTopBarBackupRect.bottom = r25 - 1;
+			CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+			scr40 = ((unsigned int *)_mainViewBuf) + r19 * 640 / 4;
+			scr41 = scr40 + 640 / 4;
+			for (int i = 0; i < 320; i += 4) {
+				*scr40++ = 0;
+				*scr41++ = 0;
+			}
+		}
+		_underTopBarScreenRect.top = 16;
+		_underTopBarScreenRect.bottom = r24 + 16 - 1;
+		_underTopBarBackupRect.top = 200 - r24;
+		_underTopBarBackupRect.bottom = 200 - 1;
+		CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+		scr40 = ((unsigned int *)_mainViewBuf) + r20 * 640 / 4;
+		scr41 = scr40 + 640 / 4;
+		scr42 = scr41 + 640 / 4;
+		for (int i = 0; i < 320; i += 4) {
+			*scr40++ = 0;
+			*scr41++ = 0;
+			*scr42++ = 0;
+		}
+		r19 -= 2;
+		r20 += 3;
+		r25 -= 2;
+		r24 -= 3;
+		_game->display();
+	}
+	scr40 = (unsigned int *)_mainViewBuf;
+	scr41 = scr40 + 640 / 4;
+	for (int i = 0; i < 320; i += 4) {
+		*scr40++ = 0;
+		*scr41++ = 0;
+	}
+	scr40 = ((unsigned int *)_mainViewBuf) + r20 * 640 / 4;
+	scr41 = scr40 + 640 / 4;
+	scr42 = scr41 + 640 / 4;
+	for (int i = 0; i < 320; i += 4) {
+		*scr40++ = 0;
+		*scr41++ = 0;
+		*scr42++ = 0;
+	}
+	_game->display();
+	initRects();
+	_showBlackBars = true;
+}
+
+void EdenGraphics::initRects() {
+	_underTopBarScreenRect = Common::Rect(0, 0, 320 - 1, 16 - 1);
+	_underTopBarBackupRect = Common::Rect(0, 0, 320 - 1, 16 - 1);
+	_underBottomBarScreenRect = Common::Rect(0, 176, 320 - 1, 200 - 1);  //TODO: original bug? this cause crash in copyrect (this, underBottomBarBackupRect)
+	_underBottomBarBackupRect = Common::Rect(0, 16, 320 - 1, 40 - 1);
+}
+
+// Original name: bars_in
+void EdenGraphics::showBars() {
+	if (!_showBlackBars)
+		return;
+
+	drawBlackBars();
+	int16 r29 = 2;
+	int16 r28 = 2;
+	_underTopBarScreenRect.left = 0;
+	_underTopBarScreenRect.right = 320 - 1;
+	_underTopBarBackupRect.left = _game->getScrollPos();
+	_underTopBarBackupRect.right = _game->getScrollPos() + 320 - 1;
+	while (r28 < 24) {
+		if (r29 <= 16) {
+			_underTopBarScreenRect.top = 16 - r29;
+			_underTopBarScreenRect.bottom = 16 - 1;
+			_underTopBarBackupRect.top = 0;
+			_underTopBarBackupRect.bottom = r29 - 1;
+			CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+		}
+		_underTopBarScreenRect.top = 16;
+		_underTopBarScreenRect.bottom = 16 + r28;
+		_underTopBarBackupRect.top = 200 - 1 - r28;
+		_underTopBarBackupRect.bottom = 200 - 1;
+		CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+		r29 += 2;
+		r28 += 3;
+		_game->display();
+	}
+	initRects();
+	_showBlackBars = false;
+}
+
+// Original name: af_image
+void EdenGraphics::displayImage() {
+	byte *img = _game->getImageDesc() + 200;
+
+	int16 count = READ_LE_UINT16(img);
+	if (!count)
+		return;
+
+	byte *img_start = img;
+	byte *curimg = _game->getImageDesc();
+
+	img += 2;
+	count *= 3;
+	while (count--)
+		*curimg++ = *img++;
+	img = img_start;
+	count = READ_LE_UINT16(img);
+	img += 2;
+	/////// draw it
+	while (count--) {
+		uint16 index = *img++;
+		uint16 x = *img++ + _game->getGameIconX(0);
+		uint16 y = *img++ + _game->getGameIconY(0);
+		byte *pix = _game->getBankData();
+		byte *scr = _mainViewBuf + x + y * 640;
+		index--;
+		if (READ_LE_UINT16(pix) > 2)
+			readPalette(pix + 2);
+		pix += READ_LE_UINT16(pix);
+		pix += READ_LE_UINT16(pix + index * 2);
+		//  int16   height:9
+		//  int16   pad:6;
+		//  int16   flag:1;
+		byte h0 = *pix++;
+		byte h1 = *pix++;
+		int16 w = ((h1 & 1) << 8) | h0;
+		int16 h = *pix++;
+		byte mode = *pix++;
+		if (mode != 0xFF && mode != 0xFE)
+			continue;   //TODO: enclosing block?
+		if (h1 & 0x80) {
+			// compressed
+			for (; h-- > 0;) {
+				for (int16 ww = w; ww > 0;) {
+					byte c = *pix++;
+					if (c >= 0x80) {
+						if (c == 0x80) {
+							byte fill = *pix++;
+							if (fill == 0) {
+								scr += 128 + 1;
+								ww -= 128 + 1;
+							}
+							else {
+								byte runVal;
+								*scr++ = fill;  //TODO: wha?
+								*scr++ = fill;
+								ww -= 128 + 1;
+								for (runVal = 127; runVal--;)
+									*scr++ = fill;
+							}
+						}
+						else {
+							byte fill = *pix++;
+							byte runVal = 255 - c + 2;
+							ww -= runVal;
+							if (fill == 0)
+								scr += runVal;
+							else {
+								for (; runVal--;)
+									*scr++ = fill;
+							}
+						}
+					}
+					else {
+						byte runVal = c + 1;
+						ww -= runVal;
+						for (; runVal--;) {
+							byte p = *pix++;
+							if (p == 0)
+								scr++;
+							else
+								*scr++ = p;
+						}
+					}
+				}
+				scr += 640 - w;
+			}
+		}
+		else {
+			// uncompressed
+			for (; h--;) {
+				for (int16 ww = w; ww--;) {
+					byte p = *pix++;
+					if (p == 0)
+						scr++;
+					else
+						*scr++ = p;
+				}
+				scr += 640 - w;
+			}
+		}
+	}
+}
+
+// Original name: af_subtitle
+void EdenGraphics::displaySubtitles() {
+	byte *src = _subtitlesViewBuf;
+	byte *dst = _mainViewBuf;
+	int16 y;
+	if (_game->_globals->_displayFlags & DisplayFlags::dfFlag2) {
+		y = 174;
+		if ((_game->_globals->_drawFlags & DrawFlags::drDrawMenu) && _game->getNumTextLines() == 1)
+			y = 167;
+		dst += 640 * (y - _game->getNumTextLines() * FONT_HEIGHT) + _subtitlesXScrMargin;
+	}
+	else {
+		y = 174;
+		dst += 640 * (y - _game->getNumTextLines() * FONT_HEIGHT) + _game->getScrollPos() + _subtitlesXScrMargin;
+	}
+	if (_game->animationIsActive() && !_game->personIsTalking())
+		return;
+	saveUnderSubtitles(y);
+	for (int16 h = 0; h < _game->getNumTextLines() * FONT_HEIGHT + 1; h++) {
+		for (int16 w = 0; w < _subtitlesXWidth; w++) {
+			byte c = *src++;
+			if (c)
+				*dst = c;
+			dst++;
+		}
+		dst += 640 - _subtitlesXWidth;
+	}
+}
+
+// Original name afsalle1
+void EdenGraphics::displaySingleRoom(Room *room) {
+	byte *ptr = (byte *)getElem(_game->getPlaceRawBuf(), room->_id - 1);
+	ptr++;
+	for (;;) {
+		byte b0 = *ptr++;
+		byte b1 = *ptr++;
+		int16 index = (b1 << 8) | b0;
+		if (index == -1)
+			break;
+		if (index > 0) {
+			int16 x = *ptr++ | (((b1 & 0x2) >> 1) << 8);      //TODO: check me
+			int16 y = *ptr++;
+			ptr++;
+			index &= 0x1FF;
+			if (!(_game->_globals->_displayFlags & 0x80)) {
+				if (index == 1 || _game->_globals->_varF7)
+					drawSprite(index - 1, x, y, true);
+			}
+			_game->_globals->_varF7 = 0;
+			continue;
+		}
+		if (b1 & 0x40) {
+			if (b1 & 0x20) {
+				bool addIcon = false;
+				Icon *icon = _game->_globals->_nextRoomIcon;
+				if (b0 < 4) {
+					if (_game->_globals->_roomPtr->_exits[b0])
+						addIcon = true;
+				}
+				else if (b0 > 229) {
+					if (_game->_globals->_partyOutside & (1 << (b0 - 230)))
+						addIcon = true;
+				}
+				else if (b0 >= 100) {
+					debug("add object %d", b0 - 100);
+					if (_game->isObjectHere(b0 - 100)) {
+						addIcon = true;
+						_game->_globals->_varF7 = 1;
+					}
+				}
+				else
+					addIcon = true;
+				if (addIcon) {
+					icon->_actionId = b0;
+					icon->_objectId = b0;
+					icon->_cursorId = _game->getActionCursor(b0);
+					int16 x = READ_LE_UINT16(ptr);
+					ptr += 2;
+					int16 y = READ_LE_UINT16(ptr);
+					ptr += 2;
+					int16 ex = READ_LE_UINT16(ptr);
+					ptr += 2;
+					int16 ey = READ_LE_UINT16(ptr);
+					ptr += 2;
+					x += _game->_globals->_roomBaseX;
+					ex += _game->_globals->_roomBaseX;
+					debug("add hotspot at %3d:%3d - %3d:%3d, action = %d", x, y, ex, ey, b0);
+
+					if (_game->_vm->_showHotspots) {
+						for (int iii = x; iii < ex; iii++)
+							_mainViewBuf[y * 640 + iii] = _mainViewBuf[ey * 640 + iii] = (iii % 2) ? 0 : 255;
+						for (int iii = y; iii < ey; iii++)
+							_mainViewBuf[iii * 640 + x] = _mainViewBuf[iii * 640 + ex] = (iii % 2) ? 0 : 255;
+					}
+
+					icon->sx = x;
+					icon->sy = y;
+					icon->ex = ex;
+					icon->ey = ey;
+					_game->_globals->_nextRoomIcon = ++icon;
+					icon->sx = -1;
+				}
+				else
+					ptr += 8;
+			}
+			else
+				ptr += 8;
+		}
+		else
+			ptr += 8;
+	}
+}
+
+// Original name: restaurefrisesbas
+void EdenGraphics::restoreBottomFrieze() {
+	_underBottomBarScreenRect.left = _game->getScrollPos();
+	_underBottomBarScreenRect.right = _game->getScrollPos() + 320 - 1;
+	CLBlitter_CopyViewRect(_underBarsView, getMainView(), &_underBottomBarBackupRect, &_underBottomBarScreenRect);
+}
+
+// Original name: sauvefriseshaut
+void EdenGraphics::saveTopFrieze(int16 x) { // Save top bar
+	_underTopBarScreenRect = Common::Rect(x, 0, x + 320 - 1, 15);
+	_underTopBarBackupRect = Common::Rect(0, 0, 320 - 1, 15);
+	CLBlitter_CopyViewRect(getMainView(), _underBarsView, &_underTopBarScreenRect, &_underTopBarBackupRect);
+}
+
+// Original name: sauvefrisesbas
+void EdenGraphics::saveBottomFrieze() {         // Save bottom bar
+	_underBottomBarScreenRect.left = 0;
+	_underBottomBarScreenRect.right = 320 - 1;
+	CLBlitter_CopyViewRect(getMainView(), _underBarsView, &_underBottomBarScreenRect, &_underBottomBarBackupRect);
+}
+
+// Original name: afsalle
+void EdenGraphics::displayRoom() {
+	Room *room = _game->_globals->_roomPtr;
+	_game->_globals->_displayFlags = DisplayFlags::dfFlag1;
+	_game->_globals->_roomBaseX = 0;
+	_game->_globals->_roomBackgroundBankNum = room->_backgroundBankNum;
+	if (room->_flags & RoomFlags::rf08) {
+		_game->_globals->_displayFlags |= DisplayFlags::dfFlag80;
+		if (room->_flags & RoomFlags::rfPanable) {
+			// Scrollable room on 2 screens
+			_game->_globals->_displayFlags |= DisplayFlags::dfPanable;
+			_game->_globals->_varF4 = 0;
+			rundcurs();
+			_game->saveFriezes();
+			_game->useBank(room->_bank - 1);
+			drawSprite(0, 0, 16, true);
+			_game->useBank(room->_bank);
+			drawSprite(0, 320, 16, true);
+			displaySingleRoom(room);
+			_game->_globals->_roomBaseX = 320;
+			displaySingleRoom(room + 1);
+		}
+		else
+			displaySingleRoom(room);
+	}
+	else {
+		//TODO: roomImgBank is garbage here!
+		debug("displayRoom: room 0x%X using bank %d", _game->_globals->_roomNum, _game->_globals->_roomImgBank);
+		_game->useBank(_game->_globals->_roomImgBank);
+		displaySingleRoom(room);
+		assert(_game->_vm->_screenView->_pitch == 320);
+	}
+}
+
+View *EdenGraphics::getUnderBarsView() {
+	return _underBarsView;
+}
+
+void EdenGraphics::openWindow() {
+	_underBarsView = new View(320, 40); //TODO: Who deletes these?
+	_underBarsView->_normal._width = 320;
+
+	_view2 = new View(32, 32);
+	_view2Buf = _view2->_bufferPtr;
+
+	_subtitlesView = new View(_subtitlesXWidth, 60);
+	_subtitlesViewBuf = _subtitlesView->_bufferPtr;
+
+	_underSubtitlesView = new View(_subtitlesXWidth, 60);
+	_underSubtitlesViewBuf = _underSubtitlesView->_bufferPtr;
+
+	_mainView = new View(640, 200);
+	_mainView->_normal._width = 320;
+	CLBlitter_FillView(_mainView, 0xFFFFFFFF);
+	_mainView->setSrcZoomValues(0, 0);
+	_mainView->setDisplayZoomValues(640, 400);
+	_mainView->centerIn(_game->_vm->_screenView);
+	_mainViewBuf = _mainView->_bufferPtr;
+
+	_game->setMouseCenterX(_mainView->_normal._dstLeft + _mainView->_normal._width  / 2);
+	_game->setMouseCenterY(_mainView->_normal._dstTop  + _mainView->_normal._height / 2);
+	_game->_vm->setMousePosition(_game->getMouseCenterX(), _game->getMouseCenterY());
+	_game->_vm->hideMouse();
+
+	_game->setCurPosX(320 / 2);
+	_game->setCurPosY(200 / 2);
+}
+
+// Original name: effet1
+void EdenGraphics::displayEffect1() {
+	blackRect32();
+	setSrcRect(0, 0, 16 - 1, 4 - 1);
+	int y = _mainView->_normal._dstTop;
+	for (int16 i = 16; i <= 96; i += 4) {
+		for (int x = _mainView->_normal._dstLeft; x < _mainView->_normal._dstLeft + 320; x += 16) {
+			setDestRect(x, y + i, x + 16 - 1, y + i + 4 - 1);
+			CLBlitter_CopyViewRect(_view2, _game->_vm->_screenView, &_rect_src, &_rect_dst);
+			setDestRect(x, y + 192 - i, x + 16 - 1, y + 192 - i + 4 - 1);
+			CLBlitter_CopyViewRect(_view2, _game->_vm->_screenView, &_rect_src, &_rect_dst);
+		}
+		CLBlitter_UpdateScreen();
+		_game->wait(1);
+	}
+	CLPalette_Send2Screen(_globalPalette, 0, 256);
+	_mainView->_normal._height = 2;
+	_mainView->_zoom._height = 4;
+	int16 ny = _mainView->_normal._dstTop;
+	int16 dy = _mainView->_zoom._dstTop;
+	for (int16 i = 0; i < 100; i += 2) {
+		_mainView->_normal._srcTop = 99 - i;
+		_mainView->_zoom._srcTop = 99 - i;
+		_mainView->_normal._dstTop = 99 - i + ny;
+		_mainView->_zoom._dstTop = (99 - i) * 2 + dy;
+		CLBlitter_CopyView2Screen(_mainView);
+		_mainView->_normal._srcTop = 100 + i;
+		_mainView->_zoom._srcTop = 100 + i;
+		_mainView->_normal._dstTop = 100 + i + ny;
+		_mainView->_zoom._dstTop = (100 + i) * 2 + dy;
+		CLBlitter_CopyView2Screen(_mainView);
+		CLBlitter_UpdateScreen();
+		_game->wait(1);
+	}
+	_mainView->_normal._height = 200;
+	_mainView->_zoom._height = 400;
+	_mainView->_normal._srcTop = 0;
+	_mainView->_zoom._srcTop = 0;
+	_mainView->_normal._dstTop = ny;
+	_mainView->_zoom._dstTop = dy;
+	_game->_globals->_varF1 = 0;
+}
+
+// Original name: effet2
+void EdenGraphics::displayEffect2() {
+	static int16 pattern1[] = { 0, 1, 2, 3, 7, 11, 15, 14, 13, 12, 8, 4, 5, 6, 10, 9 };
+	static int16 pattern2[] = { 0, 15, 1, 14, 2, 13, 3, 12, 7, 8, 11, 4, 5, 10, 6, 9 };
+	static int16 pattern3[] = { 0, 2, 5, 7, 8, 10, 13, 15, 1, 3, 4, 6, 9, 11, 12, 14 };
+	static int16 pattern4[] = { 0, 3, 15, 12, 1, 7, 14, 8, 2, 11, 13, 4, 5, 6, 10, 9 };
+
+	static int eff2pat = 0;
+	if (_game->_globals->_var103 == 69) {
+		displayEffect4();
+		return;
+	}
+	switch (++eff2pat) {
+	case 1:
+		colimacon(pattern1);
+		break;
+	case 2:
+		colimacon(pattern2);
+		break;
+	case 3:
+		colimacon(pattern3);
+		break;
+	case 4:
+		colimacon(pattern4);
+		eff2pat = 0;
+		break;
+	}
+}
+
+// Original name: effet3
+void EdenGraphics::displayEffect3() {
+	CLPalette_GetLastPalette(_oldPalette);
+	for (uint16 i = 0; i < 6; i++) {
+		for (uint16 c = 0; c < 256; c++) {
+			_newColor.r = _oldPalette[c].r >> i;
+			_newColor.g = _oldPalette[c].g >> i;
+			_newColor.b = _oldPalette[c].b >> i;
+			CLPalette_SetRGBColor(_newPalette, c, &_newColor);
+		}
+		CLPalette_Send2Screen(_newPalette, 0, 256);
+		_game->wait(1);
+	}
+	CLBlitter_CopyView2Screen(_mainView);
+	for (uint16 i = 0; i < 6; i++) {
+		for (uint16 c = 0; c < 256; c++) {
+			_newColor.r = _globalPalette[c].r >> (5 - i);
+			_newColor.g = _globalPalette[c].g >> (5 - i);
+			_newColor.b = _globalPalette[c].b >> (5 - i);
+			CLPalette_SetRGBColor(_newPalette, c, &_newColor);
+		}
+		CLPalette_Send2Screen(_newPalette, 0, 256);
+		_game->wait(1);
+	}
+}
+
+// Original name: effet4
+void EdenGraphics::displayEffect4() {
+	byte *scr, *pix, *r24, *r25, *r30, c;
+	int16 r17, r23, r16, r18, r19, r22, r27, r31;
+	CLPalette_Send2Screen(_globalPalette, 0, 256);
+
+	int16 ww = _game->_vm->_screenView->_pitch;
+	int16 x = _mainView->_normal._dstLeft;
+	int16 y = _mainView->_normal._dstTop;
+	for (int16 i = 32; i > 0; i -= 2) {
+		scr = _game->_vm->_screenView->_bufferPtr;
+		scr += (y + 16) * ww + x;
+		pix = _mainView->_bufferPtr + 16 * 640;
+		r17 = 320 / i;
+		r23 = 320 - 320 / i * i;  //TODO: 320 % i ?
+		r16 = 160 / i;
+		r18 = 160 - 160 / i * i;  //TODO: 160 % i ?
+		for (r19 = r16; r19 > 0; r19--) {
+			r24 = scr;
+			r25 = pix;
+			for (r22 = r17; r22 > 0; r22--) {
+				c = *r25;
+				r25 += i;
+				r30 = r24;
+				for (r27 = i; r27 > 0; r27--) {
+					for (r31 = i; r31 > 0; r31--)
+						*r30++ = c;
+					r30 += ww - i;
+				}
+				r24 += i;
+			}
+			if (r23) {
+				c = *r25;
+				r30 = r24;
+				for (r27 = i; r27 > 0; r27--) {
+					for (r31 = r23; r31 > 0; r31--)
+						*r30++ = c;
+					r30 += ww - r23;
+				}
+			}
+			scr += i * ww;
+			pix += i * 640;
+		}
+		if (r18) {
+			r24 = scr;
+			r25 = pix;
+			for (r22 = r17; r22 > 0; r22--) {
+				c = *r25;
+				r25 += i;
+				r30 = r24;
+				for (r27 = r18; r27 > 0; r27--) {
+					for (r31 = i; r31 > 0; r31--)
+						*r30++ = c;
+					r30 += ww - i;
+				}
+				r24 += i;
+			}
+			if (r23) {
+				c = *r25;
+				r30 = r24;
+				for (r27 = r18; r27 > 0; r27--) {
+					for (r31 = r23; r31 > 0; r31--)
+						*r30++ = c;
+					r30 += ww - r23;
+				}
+			}
+		}
+		CLBlitter_UpdateScreen();
+		_game->wait(3);
+	}
+	CLBlitter_CopyView2Screen(_mainView);
+}
+
+void EdenGraphics::clearScreen() {
+	int16 ww = _game->_vm->_screenView->_pitch;
+	int16 x = _mainView->_normal._dstLeft;
+	int16 y = _mainView->_normal._dstTop;
+	byte *scr = _game->_vm->_screenView->_bufferPtr;
+	scr += (y + 16) * ww + x;
+	for (int16 yy = 0; yy < 160; yy++) {
+		for (int16 xx = 0; xx < 320; xx++)
+			*scr++ = 0;
+		scr += ww - 320;
+	}
+	CLBlitter_UpdateScreen();
+}
+
+void EdenGraphics::colimacon(int16 pattern[16]) {
+	int16 p, r27, r25;
+
+	int16 ww = _game->_vm->_screenView->_pitch;
+	int16 x = _mainView->_normal._dstLeft;
+	int16 y = _mainView->_normal._dstTop;
+	byte *scr = _game->_vm->_screenView->_bufferPtr;
+	scr += (y + 16) * ww + x;
+	for (int16 i = 0; i < 16; i++) {
+		p = pattern[i];
+		r27 = p % 4 + p / 4 * ww;
+		for (int16 j = 0; j < 320 * 160 / 16; j++)
+			scr[j / (320 / 4) * ww * 4 + j % (320 / 4) * 4 + r27] = 0;
+		CLBlitter_UpdateScreen();
+		_game->wait(1);
+	}
+	CLPalette_Send2Screen(_globalPalette, 0, 256);
+	byte *pix = _mainView->_bufferPtr;
+	x = _mainView->_normal._dstLeft;
+	y = _mainView->_normal._dstTop;
+	pix += 640 * 16;
+	scr = _game->_vm->_screenView->_bufferPtr;
+	scr += (y + 16) * ww + x;
+	for (int16 i = 0; i < 16; i++) {
+		p = pattern[i];
+		r25 = p % 4 + p / 4 * 640;
+		r27 = p % 4 + p / 4 * ww;
+		for (int16 j = 0; j < 320 * 160 / 16; j++)
+			scr[j / (320 / 4) * ww * 4 + j % (320 / 4) * 4 + r27] =
+			pix[j / (320 / 4) * 640 * 4 + j % (320 / 4) * 4 + r25];
+		CLBlitter_UpdateScreen();
+		_game->wait(1);
+	}
+}
+
+void EdenGraphics::fadeToBlack(int delay) {
+	CLPalette_GetLastPalette(_oldPalette);
+	for (int16 i = 0; i < 6; i++) {
+		for (int16 j = 0; j < 256; j++) {
+			_newColor.r = _oldPalette[j].r >> i;
+			_newColor.g = _oldPalette[j].g >> i;
+			_newColor.b = _oldPalette[j].b >> i;
+			CLPalette_SetRGBColor(_newPalette, j, &_newColor);
+		}
+		CLPalette_Send2Screen(_newPalette, 0, 256);
+		_game->wait(delay);
+	}
+}
+
+// Original name: fadetoblack128
+void EdenGraphics::fadeToBlackLowPalette(int delay) {
+	CLPalette_GetLastPalette(_oldPalette);
+	for (int16 i = 0; i < 6; i++) {
+		for (int16 j = 0; j < 129; j++) { //CHECKME: Should be 128?
+			_newColor.r = _oldPalette[j].r >> i;
+			_newColor.g = _oldPalette[j].g >> i;
+			_newColor.b = _oldPalette[j].b >> i;
+			CLPalette_SetRGBColor(_newPalette, j, &_newColor);
+		}
+		CLPalette_Send2Screen(_newPalette, 0, 128);
+		_game->wait(delay);
+	}
+}
+
+// Original name: fadefromblack128
+void EdenGraphics::fadeFromBlackLowPalette(int delay) {
+	for (int16 i = 0; i < 6; i++) {
+		for (int16 j = 0; j < 129; j++) { //CHECKME: Should be 128?
+			_newColor.r = _globalPalette[j].r >> (5 - i);
+			_newColor.g = _globalPalette[j].g >> (5 - i);
+			_newColor.b = _globalPalette[j].b >> (5 - i);
+			CLPalette_SetRGBColor(_newPalette, j, &_newColor);
+		}
+		CLPalette_Send2Screen(_newPalette, 0, 128);
+		_game->wait(delay);
+	}
+}
+
+// Original name: rectanglenoir32
+void EdenGraphics::blackRect32() {
+	// blacken 32x32 rectangle
+	int *pix = (int *)_view2Buf;
+	for (int16 i = 0; i < 32; i++) {
+		pix[0] = 0;
+		pix[1] = 0;
+		pix[2] = 0;
+		pix[3] = 0;
+		pix[4] = 0;
+		pix[5] = 0;
+		pix[6] = 0;
+		pix[7] = 0;
+		pix += 32 / 4;
+	}
+}
+
+void EdenGraphics::setSrcRect(int16 sx, int16 sy, int16 ex, int16 ey) {
+	_rect_src = Common::Rect(sx, sy, ex, ey);
+}
+
+void EdenGraphics::setDestRect(int16 sx, int16 sy, int16 ex, int16 ey) {
+	_rect_dst = Common::Rect(sx, sy, ex, ey);
+}
+
+void EdenGraphics::effetpix() {
+	uint16 r25, r18, r31, r30;  //TODO: change to xx/yy
+
+	uint16 ww = _game->_vm->_screenView->_pitch;
+	r25 = ww * 80;
+	r18 = 640 * 80;
+	byte *pix = _mainView->_bufferPtr + 16 * 640;
+	int x = _mainView->_normal._dstLeft;
+	int y = _mainView->_normal._dstTop;
+	byte *scr = _game->_vm->_screenView->_bufferPtr;
+	scr += (y + 16) * ww + x;
+	int16 r20 = 0x4400;   //TODO
+	int16 r27 = 1;
+	int16 r26 = 0;
+	do {
+		char r8 = r27 & 1;
+		r27 >>= 1;
+		if (r8)
+			r27 ^= r20;
+		if (r27 < 320 * 80) {
+			r31 = r27 / 320;
+			r30 = r27 % 320;
+			scr[r31 * ww + r30] = 0;
+			scr[r31 * ww + r25 + r30] = 0;
+			if (++r26 == 960) {
+				CLBlitter_UpdateScreen();
+				_game->wait(1);
+				r26 = 0;
+			}
+		}
+	} while (r27 != 1);
+	CLPalette_Send2Screen(_globalPalette, 0, 256);
+	r20 = 0x4400;
+	r27 = 1;
+	r26 = 0;
+	do {
+		char r8 = r27 & 1;
+		r27 >>= 1;
+		if (r8)
+			r27 ^= r20;
+		if (r27 < 320 * 80) {
+			r31 = r27 / 320;
+			r30 = r27 % 320;
+			byte p0 = pix[r31 * 640 + r30];
+			byte p1 = pix[r31 * 640 + r18 + r30];
+			scr[r31 * ww + r30] = p0;
+			scr[r31 * ww + r25 + r30] = p1;
+			if (++r26 == 960) {
+				CLBlitter_UpdateScreen();
+				_game->wait(1);
+				r26 = 0;
+			}
+		}
+	} while (r27 != 1);
+	assert(_game->_vm->_screenView->_pitch == 320);
+}
+
+////// film.c
+// Original name: showfilm
+void EdenGraphics::showMovie(char arg1) {
+	_video->readHeader();
+	if (_game->_globals->_curVideoNum == 92) {
+		// _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless?
+		_game->setVolume(0);
+	}
+
+	if (_video->getVersion() != 4)
+		return;
+
+	bool playing = true;
+	_video->allocMemory();
+	_hnmView = new View(_video->_header._width, _video->_header._height);
+	_hnmView->setSrcZoomValues(0, 0);
+	_hnmView->setDisplayZoomValues(_video->_header._width * 2, _video->_header._height * 2);
+	_hnmView->centerIn(_game->_vm->_screenView);
+	_hnmViewBuf = _hnmView->_bufferPtr;
+	if (arg1) {
+		_hnmView->_normal._height = 160;
+		_hnmView->_zoom._height = 320;   //TODO: width??
+		_hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16;
+		_hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32;
+	}
+	_video->setFinalBuffer(_hnmView->_bufferPtr);
+	do {
+		_hnmFrameNum = _video->getFrameNum();
+		_video->waitLoop();
+		playing = _video->nextElement();
+		if (_game->getSpecialTextMode())
+			handleHNMSubtitles();
+		else
+			_game->musicspy();
+		CLBlitter_CopyView2Screen(_hnmView);
+		assert(_game->_vm->_screenView->_pitch == 320);
+		_game->_vm->pollEvents();
+
+		if (arg1) {
+			if (_game->_vm->isMouseButtonDown()) {
+				if (!_game->isMouseHeld()) {
+					_game->setMouseHeld();
+					_videoCanceledFlag = true;
+				}
+			}
+			else
+				_game->setMouseNotHeld();
+		}
+	} while (playing && !_videoCanceledFlag);
+	delete _hnmView;
+	_video->deallocMemory();
+}
+
+bool EdenGraphics::getShowBlackBars() {
+	return _showBlackBars;
+}
+
+void EdenGraphics::setShowBlackBars(bool value) {
+	_showBlackBars = value;
+}
+
+void EdenGraphics::playHNM(int16 num) {
+	perso_t *perso = nullptr;
+	int16 oldDialogType = -1;
+	_game->_globals->_curVideoNum = num;
+	if (num != 2001 && num != 2012 && num != 98 && num != 171) {
+		byte oldMusicType = _game->_globals->_newMusicType;
+		_game->_globals->_newMusicType = MusicType::mtEvent;
+		_game->musique();
+		_game->musicspy();
+		_game->_globals->_newMusicType = oldMusicType;
+	}
+	_game->_globals->_videoSubtitleIndex = 1;
+	if (_game->getSpecialTextMode()) {
+		perso = _game->_globals->_characterPtr;
+		oldDialogType = _game->_globals->_dialogType;
+		_game->preloadDialogs(num);
+		_game->fademusica0(1);
+		_game->stopMusic();
+	}
+	_showVideoSubtitle = false;
+	_videoCanceledFlag = false;
+	_game->loadHnm(num);
+	_video->reset();
+	if (_needToFade) {
+		fadeToBlack(4);
+		clearScreen();
+		_needToFade = false;
+	}
+	if (num == 2012 || num == 98 || num == 171)
+		showMovie(0);
+	else
+		showMovie(1);
+	_cursKeepPos = Common::Point(-1, -1);
+	if (_game->getSpecialTextMode()) {
+		_game->setMusicFade(3);;
+		_game->musicspy();
+		_game->_globals->_characterPtr = perso;
+		_game->_globals->_dialogType = oldDialogType;
+		_game->setSpecialTextMode(false);
+	}
+	if (_videoCanceledFlag)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+	if (_game->_globals->_curVideoNum == 167)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+	if (_game->_globals->_curVideoNum == 104)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+	if (_game->_globals->_curVideoNum == 102)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+	if (_game->_globals->_curVideoNum == 77)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+	if (_game->_globals->_curVideoNum == 149)
+		_game->_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
+}
+
+void EdenGraphics::initGlobals() {
+	_underSubtitlesScreenRect.top = 0;
+	_underSubtitlesScreenRect.left = _subtitlesXScrMargin;
+	_underSubtitlesScreenRect.right = _subtitlesXScrMargin + _subtitlesXWidth - 1;
+	_underSubtitlesScreenRect.bottom = 176 - 1;
+
+	_underSubtitlesBackupRect.top = 0;
+	_underSubtitlesBackupRect.left = _subtitlesXScrMargin;
+	_underSubtitlesBackupRect.right = _subtitlesXScrMargin + _subtitlesXWidth - 1;
+	_underSubtitlesBackupRect.bottom = 60 - 1;	
+}
+
+// Original name: sauvefondbulle
+void EdenGraphics::saveUnderSubtitles(int16 y) {
+	_underSubtitlesScreenRect.top = y - _game->getNumTextLines() * FONT_HEIGHT;
+	_underSubtitlesScreenRect.left = _game->getScrollPos() + _subtitlesXScrMargin;
+	_underSubtitlesScreenRect.right = _game->getScrollPos() + _subtitlesXScrMargin + _subtitlesXWidth - 1;
+	_underSubtitlesScreenRect.bottom = y;
+	_underSubtitlesBackupRect.top = 0;
+	_underSubtitlesBackupRect.bottom = _game->getNumTextLines() * FONT_HEIGHT;
+	CLBlitter_CopyViewRect(getMainView(), _underSubtitlesView, &_underSubtitlesScreenRect, &_underSubtitlesBackupRect);
+	_savedUnderSubtitles = true;
+}
+
+void EdenGraphics::setSavedUnderSubtitles(bool value) {
+	_savedUnderSubtitles = value;
+}
+
+// Original name: restaurefondbulle
+void EdenGraphics::restoreUnderSubtitles() {
+	if (!_savedUnderSubtitles)
+		return;
+	CLBlitter_CopyViewRect(_underSubtitlesView, getMainView(), &_underSubtitlesBackupRect, &_underSubtitlesScreenRect);
+	_savedUnderSubtitles = false;
+}
+
+// Original name: af_subtitlehnm
+void EdenGraphics::displayHNMSubtitle() {
+	byte *src = getSubtitlesViewBuf();
+	byte *dst = getHnmViewBuf() + _subtitlesXScrMargin + (158 - _game->getNumTextLines() * FONT_HEIGHT) * 320;
+	for (int16 y = 0; y < _game->getNumTextLines() * FONT_HEIGHT; y++) {
+		for (int16 x = 0; x < _subtitlesXWidth; x++) {
+			char c = *src++;
+			if (c)
+				*dst = c;
+			dst++;
+		}
+		dst += 320 - _subtitlesXWidth;
+	}
+}
+
+// Original name bullehnm
+void EdenGraphics::handleHNMSubtitles() {
+#define SUB_LINE(start, end) \
+	(start), (end) | 0x8000
+
+	static uint16 kFramesVid170[] = {
+		SUB_LINE(68, 120),
+		SUB_LINE(123, 196),
+		SUB_LINE(199, 274),
+		SUB_LINE(276, 370),
+		SUB_LINE(799, 885),
+		SUB_LINE(888, 940),
+		SUB_LINE(947, 1000),
+		SUB_LINE(1319, 1378),
+		SUB_LINE(1380, 1440),
+		SUB_LINE(1854, 1898),
+		SUB_LINE(1900, 1960),
+		SUB_LINE(2116, 2184),
+		SUB_LINE(2186, 2252),
+		SUB_LINE(2254, 2320),
+		SUB_LINE(3038, 3094),
+		SUB_LINE(3096, 3160),
+		0xFFFF
+	};
+
+	static uint16 kFramesVid83[] = {
+		SUB_LINE(99, 155),
+		SUB_LINE(157, 256),
+		0xFFFF
+	};
+
+	static uint16 kFramesVid88[] = {
+		SUB_LINE(106, 173),
+		SUB_LINE(175, 244),
+		SUB_LINE(246, 350),
+		SUB_LINE(352, 467),
+		0xFFFF
+	};
+
+	static uint16 kFramesVid89[] = {
+		SUB_LINE(126, 176),
+		SUB_LINE(178, 267),
+		SUB_LINE(269, 342),
+		SUB_LINE(344, 398),
+		SUB_LINE(400, 458),
+		SUB_LINE(460, 558),
+		0xFFFF
+	};
+
+	static uint16 kFramesVid94[] = {
+		SUB_LINE(101, 213),
+		SUB_LINE(215, 353),
+		SUB_LINE(355, 455),
+		SUB_LINE(457, 518),
+		SUB_LINE(520, 660),
+		SUB_LINE(662, 768),
+		0xFFFF
+	};
+
+#undef SUB_LINE
+
+	uint16 *frames = nullptr;
+	perso_t *perso = nullptr;
+
+	switch (_game->_globals->_curVideoNum) {
+	case 170:
+		frames = kFramesVid170;
+		break;
+	case 83:
+		frames = kFramesVid83;
+		break;
+	case 88:
+		frames = kFramesVid88;
+		break;
+	case 89:
+		frames = kFramesVid89;
+		break;
+	case 94:
+		frames = kFramesVid94;
+		break;
+	default:
+		return;
+	}
+
+	perso = _game->personSubtitles();
+
+	assert(perso  != nullptr);
+	assert(frames != nullptr);
+
+	uint16 *frames_start = frames;
+	uint16 frame;
+	while ((frame = *frames++) != 0xFFFF) {
+		if ((frame & ~0x8000) == _hnmFrameNum)
+			break;
+	}
+	if (frame == 0xFFFF) {
+		if (_showVideoSubtitle)
+			displayHNMSubtitle();
+		return;
+	}
+	if (frame & 0x8000)
+		_showVideoSubtitle = false;
+	else {
+		_game->_globals->_videoSubtitleIndex = (frames - frames_start) / 2 + 1;
+		_game->_globals->_characterPtr = perso;
+		_game->_globals->_dialogType = DialogType::dtInspect;
+		int16 num = (perso->_id << 3) | _game->_globals->_dialogType;
+		_game->dialoscansvmas((Dialog *)getElem(_game->getGameDialogs(), num));
+		_showVideoSubtitle = true;
+	}
+	if (_showVideoSubtitle)
+		displayHNMSubtitle();
+}
+
+}   // namespace Cryo
diff --git a/engines/cryo/eden_graphics.h b/engines/cryo/eden_graphics.h
new file mode 100644
index 0000000..05bb688
--- /dev/null
+++ b/engines/cryo/eden_graphics.h
@@ -0,0 +1,244 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef CRYO_EDEN_GRAPHICS_H
+#define CRYO_EDEN_GRAPHICS_H
+
+#include "cryo/defs.h" // Room
+
+namespace Cryo {
+
+class EdenGame;
+class HnmPlayer;
+
+class EdenGraphics {
+public:
+	EdenGraphics(EdenGame *game, HnmPlayer *video);
+
+	// Original name: noclipax
+	void drawSprite(int16 index, int16 x, int16 y, bool withBlack = false, bool onSubtitle = false);
+
+	// Original name: af_subtitle
+	void displaySubtitles();
+
+	// Original name: bars_in
+	void showBars();
+
+	void sundcurs(int16 x, int16 y);
+
+	void rundcurs();
+
+	void unglow();
+
+	void glow(int16 index);
+
+	void setGlowX(int16 value);
+
+	void setGlowY(int16 value);	
+
+	// Original name : blackbars
+	void drawBlackBars();
+
+	// Original name: bars_out
+	void hideBars();
+
+	// Original name: afsalle
+	void displayRoom();
+
+	// Original name: af_image
+	void displayImage();
+
+	void effetpix();
+
+	// Original name: effet1
+	void displayEffect1();
+
+	// Original name: effet2
+	void displayEffect2();
+
+	void setShowBlackBars(bool value);
+
+	bool getShowBlackBars();
+
+	void paneltobuf();
+
+	void cursbuftopanel();
+
+	void langbuftopanel();
+
+	View *getSubtitlesView();
+
+	View *getMainView();
+
+	byte *getHnmViewBuf();
+
+	void setCurCharRect(Common::Rect *charRect);
+
+	void setPaletteColor(byte *buffer);
+
+	// Original name: sauvefondbouche
+	void saveMouthBackground();
+
+	// Original name: restaurefondbouche
+	void restoreMouthBackground();
+
+	void openWindow();
+
+	bool _savedUnderSubtitles;
+
+	void setSavedUnderSubtitles(bool value);
+
+	byte *getSubtitlesViewBuf();
+
+	View *getUnderBarsView();
+
+	void SendPalette2Screen(int16 value);
+
+	void setFade(bool value);
+
+	bool getFade();
+
+	// Original name: effet3
+	void displayEffect3();
+
+	void setDestRect(int16 sx, int16 sy, int16 ex, int16 ey);
+
+	void setSrcRect(int16 sx, int16 sy, int16 ex, int16 ey);
+
+	void fadeToBlack(int delay);
+
+	// Original name: fadetoblack128
+	void fadeToBlackLowPalette(int delay);
+
+	// Original name: fadefromblack128
+	void fadeFromBlackLowPalette(int delay);
+
+	void clearScreen();
+
+	void playHNM(int16 num);
+
+	void setCursKeepPos(int16 x, int16 y);
+
+	void restoreUnderSubtitles();
+
+	void initRects();
+
+	void initGlobals();
+
+	void saveTopFrieze(int16 x);
+
+	void saveBottomFrieze();
+
+	void restoreTopFrieze();
+
+	void restoreBottomFrieze();
+
+private:
+	EdenGame *_game;
+	HnmPlayer *_video;
+
+	int16 _glowX;
+	int16 _glowY;
+	int16 _glowW;
+	int16 _glowH;
+
+	bool  _showVideoSubtitle;
+
+	Common::Point _cursKeepPos;
+
+	View  *_mainView;
+	View  *_underSubtitlesView;
+	View  *_subtitlesView;
+	View  *_underBarsView;
+
+	Common::Rect _underSubtitlesScreenRect;
+	Common::Rect _underSubtitlesBackupRect;	
+
+	Common::Rect _underTopBarScreenRect;
+	Common::Rect _underBottomBarBackupRect;
+	Common::Rect _underBottomBarScreenRect;
+	Common::Rect _underTopBarBackupRect;
+
+	byte *_underSubtitlesViewBuf; // CHECKME: Useless?	
+
+	byte *_mainViewBuf;	
+
+	View  *_hnmView;
+	byte *_hnmViewBuf;
+	byte *_view2Buf;
+
+	Common::Rect *_curCharacterRect;
+
+	Common::Rect _rect_dst, _rect_src;
+
+	View  *_view2;	
+
+	int _hnmFrameNum;
+
+	bool  _videoCanceledFlag;  //TODO: hnm_canceled
+
+	color_t _globalPalette[256];    //TODO palette_t
+
+	byte *_subtitlesViewBuf;
+
+	bool _needToFade;
+
+	color3_t _newColor;
+	color_t  _oldPalette[256];    // TODO palette_t ?
+	color_t  _newPalette[256];
+
+	bool _showBlackBars;	
+
+	void saveUnderSubtitles(int16 y);
+
+
+
+	void displayHNMSubtitle();
+
+	void readPalette(byte *ptr);
+
+	void getglow(int16 x, int16 y, int16 w, int16 h);
+
+	void loadMouthRectFromCurChar();
+
+	// Original name afsalle1
+	void displaySingleRoom(Room *room);
+
+	// Original name: effet4
+	void displayEffect4();
+
+	void colimacon(int16 pattern[]);
+
+	// Original name: rectanglenoir32
+	void blackRect32();
+
+	////// film.c
+	// Original name: showfilm
+	void showMovie(char arg1);
+
+	// Original name bullehnm
+	void handleHNMSubtitles();
+};
+
+}   // namespace Cryo
+
+#endif // CRYO_EDEN_GRAPHICS_H
\ No newline at end of file
diff --git a/engines/cryo/graphics.cpp b/engines/cryo/graphics.cpp
deleted file mode 100644
index 51cb818f..0000000
--- a/engines/cryo/graphics.cpp
+++ /dev/null
@@ -1,1208 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "cryo/defs.h"
-#include "cryo/cryo.h"
-#include "cryo/platdefs.h"
-#include "cryo/cryolib.h"
-#include "cryo/eden.h"
-#include "cryo/sound.h"
-
-namespace Cryo {
-
-// Original name: noclipax
-void EdenGame::drawSprite(int16 index, int16 x, int16 y, bool withBlack, bool onSubtitle) {
-	uint16 width = (!onSubtitle) ? 640 : _subtitlesXWidth;
-	byte *pix = _bankData;
-	byte *buf = (!onSubtitle) ? _mainViewBuf : _subtitlesViewBuf;
-	byte *scr = buf + x + y * width;
-	if (_curBankNum != 117 && (!_noPalette || withBlack || onSubtitle)) {
-		if (READ_LE_UINT16(pix) > 2)
-			readPalette(pix + 2);
-	}
-	pix += READ_LE_UINT16(pix);
-	pix += READ_LE_UINT16(pix + index * 2);
-	//  int16   height:9
-	//  int16   pad:6;
-	//  int16   flag:1;
-	byte h0 = *pix++;
-	byte h1 = *pix++;
-	int16 w = ((h1 & 1) << 8) | h0;
-	int16 h = *pix++;
-	byte mode = *pix++;
-	if (mode != 0xFF && mode != 0xFE)
-		return;
-	if (y + h > 200 && !onSubtitle)
-		h -= (y + h - 200);
-	if (h1 & 0x80) {
-		// compressed
-		for (; h-- > 0;) {
-			for (int16 ww = w; ww > 0;) {
-				byte c = *pix++;
-				if (c >= 0x80) {
-					if (c == 0x80) {
-						byte fill = *pix++;
-						if (fill == 0 && !withBlack) {
-							scr += 128 + 1;
-							ww -= 128 + 1;
-						}
-						else {
-							byte runVal;
-							*scr++ = fill;  //TODO: wha?
-							*scr++ = fill;
-							ww -= 128 + 1;
-							for (runVal = 127; runVal--;)
-								*scr++ = fill;
-						}
-					}
-					else {
-						byte fill = *pix++;
-						byte runVal = 255 - c + 2;
-						ww -= runVal;
-						if (fill == 0 && !withBlack)
-							scr += runVal;
-						else
-							for (; runVal--;)
-								*scr++ = fill;
-					}
-				}
-				else {
-					byte runVal = c + 1;
-					ww -= runVal;
-					for (; runVal--;) {
-						byte p = *pix++;
-						if (p == 0 && !withBlack)
-							scr++;
-						else
-							*scr++ = p;
-					}
-				}
-			}
-			scr += width - w;
-		}
-	}
-	else {
-		// uncompressed
-		for (; h--;) {
-			for (int16 ww = w; ww--;) {
-				byte p = *pix++;
-				if (p == 0 && !withBlack)
-					scr++;
-				else
-					*scr++ = p;
-			}
-			scr += width - w;
-		}
-	}
-}
-
-void EdenGame::sundcurs(int16 x, int16 y) {
-	byte *keep = _cursKeepBuf;
-	x = CLIP<int16>(x - 4, 0, 640 - 48);
-	y = CLIP<int16>(y - 4, 0, 200 - 48);
-	_cursKeepPos = Common::Point(x, y);
-	byte *scr = _mainViewBuf + _cursKeepPos.x + _cursKeepPos.y * 640;
-	for (int16 h = 48; h--;) {
-		for (int16 w = 48; w--;)
-			*keep++ = *scr++;
-		scr += 640 - 48;
-	}
-	_cursorSaved = true;
-}
-
-void EdenGame::rundcurs() {
-	byte *keep = _cursKeepBuf;
-	byte *scr = _mainViewBuf + _cursKeepPos.x + _cursKeepPos.y * 640;
-	if (!_cursorSaved || (_cursKeepPos == Common::Point(-1, -1)))  //TODO ...
-		return;
-
-	for (int16 h = 48; h--;) {
-		for (int16 w = 48; w--;)
-			*scr++ = *keep++;
-		scr += 640 - 48;
-	}
-}
-
-void EdenGame::getglow(int16 x, int16 y, int16 w, int16 h) {
-	byte *scr = _mainViewBuf + x + y * 640;
-	byte *gl = _glowBuffer;
-	_glowX = x;
-	_glowY = y;
-	_glowW = w;
-	_glowH = h;
-	for (; h--;) {
-		for (int16 ww = w; ww--;)
-			*gl++ = *scr++;
-		scr += 640 - w;
-	}
-}
-
-void EdenGame::unglow() {
-	byte *gl = _glowBuffer;
-	byte *scr = _mainViewBuf + _glowX + _glowY * 640;
-	if (_glowX < 0 || _glowY < 0)   //TODO: move it up
-		return;
-	for (; _glowH--;) {
-		for (int16 ww = _glowW; ww--;)
-			*scr++ = *gl++;
-		scr += 640 - _glowW;
-	}
-}
-
-void EdenGame::glow(int16 index) {
-	// byte pixbase;
-	byte *pix = _bankData;
-
-	index += 9;
-	pix += READ_LE_UINT16(pix);
-	pix += READ_LE_UINT16(pix + index * 2);
-	//  int16   height:9
-	//  int16   pad:6;
-	//  int16   flag:1;
-	byte h0 = *pix++;
-	byte h1 = *pix++;
-	int16 w = ((h1 & 1) << 8) | h0;
-	int16 h = *pix++;
-	byte mode = *pix++;
-	if (mode != 0xFF && mode != 0xFE)
-		return;
-
-	int16 x = _cursorPosX + _scrollPos - 38;
-	int16 y = _cursorPosY - 28;
-	int16 ex = _globals->_frescoeWidth + 320;
-
-	if (x + w <= 0 || x >= ex || y + h <= 0 || y >= 176)
-		return;
-
-	int16 dx;
-	if (x < 0) {
-		dx = -x;
-		x = 0;
-	}
-	else if (x + w > ex)
-		dx = x + w - ex;
-	else
-		dx = 0;
-
-	int16 dy = 0;
-	if (y < 16) {
-		dy = 16 - y;
-		y = 16;
-	}
-	else if (y + h > 175)
-		dy = y + h - 175;
-
-	int16 pstride = dx;
-	int16 sstride = 640 - (w - dx);
-	if (y == 16)
-		pix += w * dy;
-	if (x == 0)
-		pix += dx;
-
-	byte *scr = _mainViewBuf + x + y * 640;
-
-	w -= dx;
-	h -= dy;
-
-	getglow(x, y, w, h);
-
-	for (; h--;) {
-		for (int16 ww = w; ww--;) {
-			byte p = *pix++;
-			if (p == 0)
-				scr++;
-			else
-				*scr++ += p << 4;
-		}
-		pix += pstride;
-		scr += sstride;
-	}
-}
-
-// Original name : blackbars
-void EdenGame::drawBlackBars() {
-	byte *scr = _mainViewBuf;
-	for (int16 y = 0; y < 16; y++) {
-		for (int16 x = 0; x < 640; x++)
-			*scr++ = 0;
-	}
-
-	scr += 640 * (200 - 16 - 24);
-	for (int16 y = 0; y < 24; y++) {
-		for (int16 x = 0; x < 640; x++)
-			*scr++ = 0;
-	}
-}
-
-// Original name: bars_out
-void EdenGame::hideBars() {
-	if (_showBlackBars)
-		return;
-
-	display();
-	_underTopBarScreenRect.left = _scrollPos;
-	_underTopBarScreenRect.right = _scrollPos + 320 - 1;
-	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-	_underBottomBarScreenRect.left = _underTopBarScreenRect.left;
-	_underBottomBarScreenRect.right = _underTopBarScreenRect.right;
-	CLBlitter_CopyViewRect(_mainView, _underBarsView, &_underBottomBarScreenRect, &_underBottomBarBackupRect);
-	int16 r19 = 14;   // TODO - init in decl?
-	int16 r20 = 176;
-	int16 r25 = 14;
-	int16 r24 = 21;
-	_underTopBarScreenRect.left = 0;
-	_underTopBarScreenRect.right = 320 - 1;
-	_underTopBarBackupRect.left = _scrollPos;
-	_underTopBarBackupRect.right = _scrollPos + 320 - 1;
-	unsigned int *scr40, *scr41, *scr42;
-	while (r24 > 0) {
-		if (r25 > 0) {
-			_underTopBarScreenRect.top = 16 - r25;
-			_underTopBarScreenRect.bottom = 16 - 1;
-			_underTopBarBackupRect.top = 0;
-			_underTopBarBackupRect.bottom = r25 - 1;
-			CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-			scr40 = ((unsigned int *)_mainViewBuf) + r19 * 640 / 4;
-			scr41 = scr40 + 640 / 4;
-			for (int i = 0; i < 320; i += 4) {
-				*scr40++ = 0;
-				*scr41++ = 0;
-			}
-		}
-		_underTopBarScreenRect.top = 16;
-		_underTopBarScreenRect.bottom = r24 + 16 - 1;
-		_underTopBarBackupRect.top = 200 - r24;
-		_underTopBarBackupRect.bottom = 200 - 1;
-		CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-		scr40 = ((unsigned int *)_mainViewBuf) + r20 * 640 / 4;
-		scr41 = scr40 + 640 / 4;
-		scr42 = scr41 + 640 / 4;
-		for (int i = 0; i < 320; i += 4) {
-			*scr40++ = 0;
-			*scr41++ = 0;
-			*scr42++ = 0;
-		}
-		r19 -= 2;
-		r20 += 3;
-		r25 -= 2;
-		r24 -= 3;
-		display();
-	}
-	scr40 = (unsigned int *)_mainViewBuf;
-	scr41 = scr40 + 640 / 4;
-	for (int i = 0; i < 320; i += 4) {
-		*scr40++ = 0;
-		*scr41++ = 0;
-	}
-	scr40 = ((unsigned int *)_mainViewBuf) + r20 * 640 / 4;
-	scr41 = scr40 + 640 / 4;
-	scr42 = scr41 + 640 / 4;
-	for (int i = 0; i < 320; i += 4) {
-		*scr40++ = 0;
-		*scr41++ = 0;
-		*scr42++ = 0;
-	}
-	display();
-	initRects();
-	_showBlackBars = true;
-}
-
-// Original name: bars_in
-void EdenGame::showBars() {
-	if (!_showBlackBars)
-		return;
-
-	drawBlackBars();
-	int16 r29 = 2;
-	int16 r28 = 2;
-	_underTopBarScreenRect.left = 0;
-	_underTopBarScreenRect.right = 320 - 1;
-	_underTopBarBackupRect.left = _scrollPos;
-	_underTopBarBackupRect.right = _scrollPos + 320 - 1;
-	while (r28 < 24) {
-		if (r29 <= 16) {
-			_underTopBarScreenRect.top = 16 - r29;
-			_underTopBarScreenRect.bottom = 16 - 1;
-			_underTopBarBackupRect.top = 0;
-			_underTopBarBackupRect.bottom = r29 - 1;
-			CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-		}
-		_underTopBarScreenRect.top = 16;
-		_underTopBarScreenRect.bottom = 16 + r28;
-		_underTopBarBackupRect.top = 200 - 1 - r28;
-		_underTopBarBackupRect.bottom = 200 - 1;
-		CLBlitter_CopyViewRect(_underBarsView, _mainView, &_underTopBarScreenRect, &_underTopBarBackupRect);
-		r29 += 2;
-		r28 += 3;
-		display();
-	}
-	initRects();
-	_showBlackBars = false;
-}
-
-// Original name: af_image
-void EdenGame::displayImage() {
-	byte *img = _imageDesc + 200;
-
-	int16 count = READ_LE_UINT16(img);
-	if (!count)
-		return;
-
-	byte *img_start = img;
-	byte *curimg = _imageDesc;
-
-	img += 2;
-	count *= 3;
-	while (count--)
-		*curimg++ = *img++;
-	img = img_start;
-	count = READ_LE_UINT16(img);
-	img += 2;
-	/////// draw it
-	while (count--) {
-		uint16 index = *img++;
-		uint16 x = *img++ + _gameIcons[0].sx;
-		uint16 y = *img++ + _gameIcons[0].sy;
-		byte *pix = _bankData;
-		byte *scr = _mainViewBuf + x + y * 640;
-		index--;
-		if (READ_LE_UINT16(pix) > 2)
-			readPalette(pix + 2);
-		pix += READ_LE_UINT16(pix);
-		pix += READ_LE_UINT16(pix + index * 2);
-		//  int16   height:9
-		//  int16   pad:6;
-		//  int16   flag:1;
-		byte h0 = *pix++;
-		byte h1 = *pix++;
-		int16 w = ((h1 & 1) << 8) | h0;
-		int16 h = *pix++;
-		byte mode = *pix++;
-		if (mode != 0xFF && mode != 0xFE)
-			continue;   //TODO: enclosing block?
-		if (h1 & 0x80) {
-			// compressed
-			for (; h-- > 0;) {
-				for (int16 ww = w; ww > 0;) {
-					byte c = *pix++;
-					if (c >= 0x80) {
-						if (c == 0x80) {
-							byte fill = *pix++;
-							if (fill == 0) {
-								scr += 128 + 1;
-								ww -= 128 + 1;
-							}
-							else {
-								byte runVal;
-								*scr++ = fill;  //TODO: wha?
-								*scr++ = fill;
-								ww -= 128 + 1;
-								for (runVal = 127; runVal--;)
-									*scr++ = fill;
-							}
-						}
-						else {
-							byte fill = *pix++;
-							byte runVal = 255 - c + 2;
-							ww -= runVal;
-							if (fill == 0)
-								scr += runVal;
-							else {
-								for (; runVal--;)
-									*scr++ = fill;
-							}
-						}
-					}
-					else {
-						byte runVal = c + 1;
-						ww -= runVal;
-						for (; runVal--;) {
-							byte p = *pix++;
-							if (p == 0)
-								scr++;
-							else
-								*scr++ = p;
-						}
-					}
-				}
-				scr += 640 - w;
-			}
-		}
-		else {
-			// uncompressed
-			for (; h--;) {
-				for (int16 ww = w; ww--;) {
-					byte p = *pix++;
-					if (p == 0)
-						scr++;
-					else
-						*scr++ = p;
-				}
-				scr += 640 - w;
-			}
-		}
-	}
-}
-
-// Original name: af_subtitle
-void EdenGame::displaySubtitles() {
-	byte *src = _subtitlesViewBuf;
-	byte *dst = _mainViewBuf;
-	int16 y;
-	if (_globals->_displayFlags & DisplayFlags::dfFlag2) {
-		y = 174;
-		if ((_globals->_drawFlags & DrawFlags::drDrawMenu) && _numTextLines == 1)
-			y = 167;
-		dst += 640 * (y - _numTextLines * FONT_HEIGHT) + _subtitlesXScrMargin;
-	}
-	else {
-		y = 174;
-		dst += 640 * (y - _numTextLines * FONT_HEIGHT) + _scrollPos + _subtitlesXScrMargin;
-	}
-	if (_animationActive && !_personTalking)
-		return;
-	saveUnderSubtitles(y);
-	for (int16 h = 0; h < _numTextLines * FONT_HEIGHT + 1; h++) {
-		for (int16 w = 0; w < _subtitlesXWidth; w++) {
-			byte c = *src++;
-			if (c)
-				*dst = c;
-			dst++;
-		}
-		dst += 640 - _subtitlesXWidth;
-	}
-}
-
-// Original name afsalle1
-void EdenGame::displaySingleRoom(Room *room) {
-	byte *ptr = (byte *)getElem(_placeRawBuf, room->_id - 1);
-	ptr++;
-	for (;;) {
-		byte b0 = *ptr++;
-		byte b1 = *ptr++;
-		int16 index = (b1 << 8) | b0;
-		if (index == -1)
-			break;
-		if (index > 0) {
-			int16 x = *ptr++ | (((b1 & 0x2) >> 1) << 8);      //TODO: check me
-			int16 y = *ptr++;
-			ptr++;
-			index &= 0x1FF;
-			if (!(_globals->_displayFlags & 0x80)) {
-				if (index == 1 || _globals->_varF7)
-					drawSprite(index - 1, x, y, true);
-			}
-			_globals->_varF7 = 0;
-			continue;
-		}
-		if (b1 & 0x40) {
-			if (b1 & 0x20) {
-				bool addIcon = false;
-				Icon *icon = _globals->_nextRoomIcon;
-				if (b0 < 4) {
-					if (_globals->_roomPtr->_exits[b0])
-						addIcon = true;
-				}
-				else if (b0 > 229) {
-					if (_globals->_partyOutside & (1 << (b0 - 230)))
-						addIcon = true;
-				}
-				else if (b0 >= 100) {
-					debug("add object %d", b0 - 100);
-					if (isObjectHere(b0 - 100)) {
-						addIcon = true;
-						_globals->_varF7 = 1;
-					}
-				}
-				else
-					addIcon = true;
-				if (addIcon) {
-					icon->_actionId = b0;
-					icon->_objectId = b0;
-					icon->_cursorId = _actionCursors[b0];
-					int16 x = READ_LE_UINT16(ptr);
-					ptr += 2;
-					int16 y = READ_LE_UINT16(ptr);
-					ptr += 2;
-					int16 ex = READ_LE_UINT16(ptr);
-					ptr += 2;
-					int16 ey = READ_LE_UINT16(ptr);
-					ptr += 2;
-					x += _globals->_roomBaseX;
-					ex += _globals->_roomBaseX;
-					debug("add hotspot at %3d:%3d - %3d:%3d, action = %d", x, y, ex, ey, b0);
-
-					if (_vm->_showHotspots) {
-						for (int iii = x; iii < ex; iii++)
-							_mainViewBuf[y * 640 + iii] = _mainViewBuf[ey * 640 + iii] = (iii % 2) ? 0 : 255;
-						for (int iii = y; iii < ey; iii++)
-							_mainViewBuf[iii * 640 + x] = _mainViewBuf[iii * 640 + ex] = (iii % 2) ? 0 : 255;
-					}
-
-					icon->sx = x;
-					icon->sy = y;
-					icon->ex = ex;
-					icon->ey = ey;
-					_globals->_nextRoomIcon = ++icon;
-					icon->sx = -1;
-				}
-				else
-					ptr += 8;
-			}
-			else
-				ptr += 8;
-		}
-		else
-			ptr += 8;
-	}
-}
-
-// Original name: afsalle
-void EdenGame::displayRoom() {
-	Room *room = _globals->_roomPtr;
-	_globals->_displayFlags = DisplayFlags::dfFlag1;
-	_globals->_roomBaseX = 0;
-	_globals->_roomBackgroundBankNum = room->_backgroundBankNum;
-	if (room->_flags & RoomFlags::rf08) {
-		_globals->_displayFlags |= DisplayFlags::dfFlag80;
-		if (room->_flags & RoomFlags::rfPanable) {
-			// Scrollable room on 2 screens
-			_globals->_displayFlags |= DisplayFlags::dfPanable;
-			_globals->_varF4 = 0;
-			rundcurs();
-			saveFriezes();
-			useBank(room->_bank - 1);
-			drawSprite(0, 0, 16, true);
-			useBank(room->_bank);
-			drawSprite(0, 320, 16, true);
-			displaySingleRoom(room);
-			_globals->_roomBaseX = 320;
-			displaySingleRoom(room + 1);
-		}
-		else
-			displaySingleRoom(room);
-	}
-	else {
-		//TODO: roomImgBank is garbage here!
-		debug("displayRoom: room 0x%X using bank %d", _globals->_roomNum, _globals->_roomImgBank);
-		useBank(_globals->_roomImgBank);
-		displaySingleRoom(room);
-		assert(_vm->_screenView->_pitch == 320);
-	}
-}
-
-void EdenGame::openWindow() {
-	_underBarsView = new View(320, 40);
-	_underBarsView->_normal._width = 320;
-
-	_view2 = new View(32, 32);
-	_view2Buf = _view2->_bufferPtr;
-
-	_subtitlesView = new View(_subtitlesXWidth, 60);
-	_subtitlesViewBuf = _subtitlesView->_bufferPtr;
-
-	_underSubtitlesView = new View(_subtitlesXWidth, 60);
-	_underSubtitlesViewBuf = _underSubtitlesView->_bufferPtr;
-
-	_mainView = new View(640, 200);
-	_mainView->_normal._width = 320;
-	CLBlitter_FillView(_mainView, 0xFFFFFFFF);
-	_mainView->setSrcZoomValues(0, 0);
-	_mainView->setDisplayZoomValues(640, 400);
-	_mainView->centerIn(_vm->_screenView);
-	_mainViewBuf = _mainView->_bufferPtr;
-
-	_mouseCenterX = _mainView->_normal._dstLeft + _mainView->_normal._width / 2;
-	_mouseCenterY = _mainView->_normal._dstTop + _mainView->_normal._height / 2;
-	_vm->setMousePosition(_mouseCenterX, _mouseCenterY);
-	_vm->hideMouse();
-
-	_cursorPosX = 320 / 2;
-	_cursorPosY = 200 / 2;
-}
-
-// Original name: effet1
-void EdenGame::displayEffect1() {
-	blackRect32();
-	setSrcRect(0, 0, 16 - 1, 4 - 1);
-	int y = _mainView->_normal._dstTop;
-	for (int16 i = 16; i <= 96; i += 4) {
-		for (int x = _mainView->_normal._dstLeft; x < _mainView->_normal._dstLeft + 320; x += 16) {
-			setDestRect(x, y + i, x + 16 - 1, y + i + 4 - 1);
-			CLBlitter_CopyViewRect(_view2, _vm->_screenView, &rect_src, &rect_dst);
-			setDestRect(x, y + 192 - i, x + 16 - 1, y + 192 - i + 4 - 1);
-			CLBlitter_CopyViewRect(_view2, _vm->_screenView, &rect_src, &rect_dst);
-		}
-		CLBlitter_UpdateScreen();
-		wait(1);
-	}
-	CLPalette_Send2Screen(_globalPalette, 0, 256);
-	_mainView->_normal._height = 2;
-	_mainView->_zoom._height = 4;
-	int16 ny = _mainView->_normal._dstTop;
-	int16 dy = _mainView->_zoom._dstTop;
-	for (int16 i = 0; i < 100; i += 2) {
-		_mainView->_normal._srcTop = 99 - i;
-		_mainView->_zoom._srcTop = 99 - i;
-		_mainView->_normal._dstTop = 99 - i + ny;
-		_mainView->_zoom._dstTop = (99 - i) * 2 + dy;
-		CLBlitter_CopyView2Screen(_mainView);
-		_mainView->_normal._srcTop = 100 + i;
-		_mainView->_zoom._srcTop = 100 + i;
-		_mainView->_normal._dstTop = 100 + i + ny;
-		_mainView->_zoom._dstTop = (100 + i) * 2 + dy;
-		CLBlitter_CopyView2Screen(_mainView);
-		CLBlitter_UpdateScreen();
-		wait(1);
-	}
-	_mainView->_normal._height = 200;
-	_mainView->_zoom._height = 400;
-	_mainView->_normal._srcTop = 0;
-	_mainView->_zoom._srcTop = 0;
-	_mainView->_normal._dstTop = ny;
-	_mainView->_zoom._dstTop = dy;
-	_globals->_varF1 = 0;
-}
-
-// Original name: effet2
-void EdenGame::displayEffect2() {
-	static int16 pattern1[] = { 0, 1, 2, 3, 7, 11, 15, 14, 13, 12, 8, 4, 5, 6, 10, 9 };
-	static int16 pattern2[] = { 0, 15, 1, 14, 2, 13, 3, 12, 7, 8, 11, 4, 5, 10, 6, 9 };
-	static int16 pattern3[] = { 0, 2, 5, 7, 8, 10, 13, 15, 1, 3, 4, 6, 9, 11, 12, 14 };
-	static int16 pattern4[] = { 0, 3, 15, 12, 1, 7, 14, 8, 2, 11, 13, 4, 5, 6, 10, 9 };
-
-	static int eff2pat = 0;
-	if (_globals->_var103 == 69) {
-		displayEffect4();
-		return;
-	}
-	switch (++eff2pat) {
-	case 1:
-		colimacon(pattern1);
-		break;
-	case 2:
-		colimacon(pattern2);
-		break;
-	case 3:
-		colimacon(pattern3);
-		break;
-	case 4:
-		colimacon(pattern4);
-		eff2pat = 0;
-		break;
-	}
-}
-
-// Original name: effet3
-void EdenGame::displayEffect3() {
-	CLPalette_GetLastPalette(oldPalette);
-	for (uint16 i = 0; i < 6; i++) {
-		for (uint16 c = 0; c < 256; c++) {
-			newColor.r = oldPalette[c].r >> i;
-			newColor.g = oldPalette[c].g >> i;
-			newColor.b = oldPalette[c].b >> i;
-			CLPalette_SetRGBColor(newPalette, c, &newColor);
-		}
-		CLPalette_Send2Screen(newPalette, 0, 256);
-		wait(1);
-	}
-	CLBlitter_CopyView2Screen(_mainView);
-	for (uint16 i = 0; i < 6; i++) {
-		for (uint16 c = 0; c < 256; c++) {
-			newColor.r = _globalPalette[c].r >> (5 - i);
-			newColor.g = _globalPalette[c].g >> (5 - i);
-			newColor.b = _globalPalette[c].b >> (5 - i);
-			CLPalette_SetRGBColor(newPalette, c, &newColor);
-		}
-		CLPalette_Send2Screen(newPalette, 0, 256);
-		wait(1);
-	}
-}
-
-// Original name: effet4
-void EdenGame::displayEffect4() {
-	byte *scr, *pix, *r24, *r25, *r30, c;
-	int16 r17, r23, r16, r18, r19, r22, r27, r31;
-	CLPalette_Send2Screen(_globalPalette, 0, 256);
-
-	int16 ww = _vm->_screenView->_pitch;
-	int16 x = _mainView->_normal._dstLeft;
-	int16 y = _mainView->_normal._dstTop;
-	for (int16 i = 32; i > 0; i -= 2) {
-		scr = _vm->_screenView->_bufferPtr;
-		scr += (y + 16) * ww + x;
-		pix = _mainView->_bufferPtr + 16 * 640;
-		r17 = 320 / i;
-		r23 = 320 - 320 / i * i;  //TODO: 320 % i ?
-		r16 = 160 / i;
-		r18 = 160 - 160 / i * i;  //TODO: 160 % i ?
-		for (r19 = r16; r19 > 0; r19--) {
-			r24 = scr;
-			r25 = pix;
-			for (r22 = r17; r22 > 0; r22--) {
-				c = *r25;
-				r25 += i;
-				r30 = r24;
-				for (r27 = i; r27 > 0; r27--) {
-					for (r31 = i; r31 > 0; r31--)
-						*r30++ = c;
-					r30 += ww - i;
-				}
-				r24 += i;
-			}
-			if (r23) {
-				c = *r25;
-				r30 = r24;
-				for (r27 = i; r27 > 0; r27--) {
-					for (r31 = r23; r31 > 0; r31--)
-						*r30++ = c;
-					r30 += ww - r23;
-				}
-			}
-			scr += i * ww;
-			pix += i * 640;
-		}
-		if (r18) {
-			r24 = scr;
-			r25 = pix;
-			for (r22 = r17; r22 > 0; r22--) {
-				c = *r25;
-				r25 += i;
-				r30 = r24;
-				for (r27 = r18; r27 > 0; r27--) {
-					for (r31 = i; r31 > 0; r31--)
-						*r30++ = c;
-					r30 += ww - i;
-				}
-				r24 += i;
-			}
-			if (r23) {
-				c = *r25;
-				r30 = r24;
-				for (r27 = r18; r27 > 0; r27--) {
-					for (r31 = r23; r31 > 0; r31--)
-						*r30++ = c;
-					r30 += ww - r23;
-				}
-			}
-		}
-		CLBlitter_UpdateScreen();
-		wait(3);
-	}
-	CLBlitter_CopyView2Screen(_mainView);
-}
-
-void EdenGame::clearScreen() {
-	int16 ww = _vm->_screenView->_pitch;
-	int16 x = _mainView->_normal._dstLeft;
-	int16 y = _mainView->_normal._dstTop;
-	byte *scr = _vm->_screenView->_bufferPtr;
-	scr += (y + 16) * ww + x;
-	for (int16 yy = 0; yy < 160; yy++) {
-		for (int16 xx = 0; xx < 320; xx++)
-			*scr++ = 0;
-		scr += ww - 320;
-	}
-	CLBlitter_UpdateScreen();
-}
-
-void EdenGame::colimacon(int16 pattern[16]) {
-	int16 p, r27, r25;
-
-	int16 ww = _vm->_screenView->_pitch;
-	int16 x = _mainView->_normal._dstLeft;
-	int16 y = _mainView->_normal._dstTop;
-	byte *scr = _vm->_screenView->_bufferPtr;
-	scr += (y + 16) * ww + x;
-	for (int16 i = 0; i < 16; i++) {
-		p = pattern[i];
-		r27 = p % 4 + p / 4 * ww;
-		for (int16 j = 0; j < 320 * 160 / 16; j++)
-			scr[j / (320 / 4) * ww * 4 + j % (320 / 4) * 4 + r27] = 0;
-		CLBlitter_UpdateScreen();
-		wait(1);
-	}
-	CLPalette_Send2Screen(_globalPalette, 0, 256);
-	byte *pix = _mainView->_bufferPtr;
-	x = _mainView->_normal._dstLeft;
-	y = _mainView->_normal._dstTop;
-	pix += 640 * 16;
-	scr = _vm->_screenView->_bufferPtr;
-	scr += (y + 16) * ww + x;
-	for (int16 i = 0; i < 16; i++) {
-		p = pattern[i];
-		r25 = p % 4 + p / 4 * 640;
-		r27 = p % 4 + p / 4 * ww;
-		for (int16 j = 0; j < 320 * 160 / 16; j++)
-			scr[j / (320 / 4) * ww * 4 + j % (320 / 4) * 4 + r27] =
-			pix[j / (320 / 4) * 640 * 4 + j % (320 / 4) * 4 + r25];
-		CLBlitter_UpdateScreen();
-		wait(1);
-	}
-}
-
-void EdenGame::fadeToBlack(int delay) {
-	CLPalette_GetLastPalette(oldPalette);
-	for (int16 i = 0; i < 6; i++) {
-		for (int16 j = 0; j < 256; j++) {
-			newColor.r = oldPalette[j].r >> i;
-			newColor.g = oldPalette[j].g >> i;
-			newColor.b = oldPalette[j].b >> i;
-			CLPalette_SetRGBColor(newPalette, j, &newColor);
-		}
-		CLPalette_Send2Screen(newPalette, 0, 256);
-		wait(delay);
-	}
-}
-
-// Original name: fadetoblack128
-void EdenGame::fadeToBlackLowPalette(int delay) {
-	CLPalette_GetLastPalette(oldPalette);
-	for (int16 i = 0; i < 6; i++) {
-		for (int16 j = 0; j < 129; j++) { //CHECKME: Should be 128?
-			newColor.r = oldPalette[j].r >> i;
-			newColor.g = oldPalette[j].g >> i;
-			newColor.b = oldPalette[j].b >> i;
-			CLPalette_SetRGBColor(newPalette, j, &newColor);
-		}
-		CLPalette_Send2Screen(newPalette, 0, 128);
-		wait(delay);
-	}
-}
-
-// Original name: fadefromblack128
-void EdenGame::fadeFromBlackLowPalette(int delay) {
-	for (int16 i = 0; i < 6; i++) {
-		for (int16 j = 0; j < 129; j++) { //CHECKME: Should be 128?
-			newColor.r = _globalPalette[j].r >> (5 - i);
-			newColor.g = _globalPalette[j].g >> (5 - i);
-			newColor.b = _globalPalette[j].b >> (5 - i);
-			CLPalette_SetRGBColor(newPalette, j, &newColor);
-		}
-		CLPalette_Send2Screen(newPalette, 0, 128);
-		wait(delay);
-	}
-}
-
-// Original name: rectanglenoir32
-void EdenGame::blackRect32() {
-	// blacken 32x32 rectangle
-	int *pix = (int *)_view2Buf;
-	for (int16 i = 0; i < 32; i++) {
-		pix[0] = 0;
-		pix[1] = 0;
-		pix[2] = 0;
-		pix[3] = 0;
-		pix[4] = 0;
-		pix[5] = 0;
-		pix[6] = 0;
-		pix[7] = 0;
-		pix += 32 / 4;
-	}
-}
-
-void EdenGame::setSrcRect(int16 sx, int16 sy, int16 ex, int16 ey) {
-	rect_src = Common::Rect(sx, sy, ex, ey);
-}
-
-void EdenGame::setDestRect(int16 sx, int16 sy, int16 ex, int16 ey) {
-	rect_dst = Common::Rect(sx, sy, ex, ey);
-}
-
-void EdenGame::effetpix() {
-	uint16 r25, r18, r31, r30;  //TODO: change to xx/yy
-
-	uint16 ww = _vm->_screenView->_pitch;
-	r25 = ww * 80;
-	r18 = 640 * 80;
-	byte *pix = _mainView->_bufferPtr + 16 * 640;
-	int x = _mainView->_normal._dstLeft;
-	int y = _mainView->_normal._dstTop;
-	byte *scr = _vm->_screenView->_bufferPtr;
-	scr += (y + 16) * ww + x;
-	int16 r20 = 0x4400;   //TODO
-	int16 r27 = 1;
-	int16 r26 = 0;
-	do {
-		char r8 = r27 & 1;
-		r27 >>= 1;
-		if (r8)
-			r27 ^= r20;
-		if (r27 < 320 * 80) {
-			r31 = r27 / 320;
-			r30 = r27 % 320;
-			scr[r31 * ww + r30] = 0;
-			scr[r31 * ww + r25 + r30] = 0;
-			if (++r26 == 960) {
-				CLBlitter_UpdateScreen();
-				wait(1);
-				r26 = 0;
-			}
-		}
-	} while (r27 != 1);
-	CLPalette_Send2Screen(_globalPalette, 0, 256);
-	r20 = 0x4400;
-	r27 = 1;
-	r26 = 0;
-	do {
-		char r8 = r27 & 1;
-		r27 >>= 1;
-		if (r8)
-			r27 ^= r20;
-		if (r27 < 320 * 80) {
-			r31 = r27 / 320;
-			r30 = r27 % 320;
-			byte p0 = pix[r31 * 640 + r30];
-			byte p1 = pix[r31 * 640 + r18 + r30];
-			scr[r31 * ww + r30] = p0;
-			scr[r31 * ww + r25 + r30] = p1;
-			if (++r26 == 960) {
-				CLBlitter_UpdateScreen();
-				wait(1);
-				r26 = 0;
-			}
-		}
-	} while (r27 != 1);
-	assert(_vm->_screenView->_pitch == 320);
-}
-
-////// film.c
-// Original name: showfilm
-void EdenGame::showMovie(char arg1) {
-	_vm->_video->readHeader();
-	if (_globals->_curVideoNum == 92) {
-		// _hnmContext->_header._unusedFlag2 = 0; CHECKME: Useless?
-		_hnmSoundChannel->setVolumeLeft(0);
-		_hnmSoundChannel->setVolumeRight(0);
-	}
-
-	if (_vm->_video->getVersion() != 4)
-		return;
-
-	bool playing = true;
-	_vm->_video->allocMemory();
-	_hnmView = new View(_vm->_video->_header._width, _vm->_video->_header._height);
-	_hnmView->setSrcZoomValues(0, 0);
-	_hnmView->setDisplayZoomValues(_vm->_video->_header._width * 2, _vm->_video->_header._height * 2);
-	_hnmView->centerIn(_vm->_screenView);
-	_hnmViewBuf = _hnmView->_bufferPtr;
-	if (arg1) {
-		_hnmView->_normal._height = 160;
-		_hnmView->_zoom._height = 320;   //TODO: width??
-		_hnmView->_normal._dstTop = _mainView->_normal._dstTop + 16;
-		_hnmView->_zoom._dstTop = _mainView->_zoom._dstTop + 32;
-	}
-	_vm->_video->setFinalBuffer(_hnmView->_bufferPtr);
-	do {
-		_hnmFrameNum = _vm->_video->getFrameNum();
-		_vm->_video->waitLoop();
-		playing = _vm->_video->nextElement();
-		if (_specialTextMode)
-			handleHNMSubtitles();
-		else
-			musicspy();
-		CLBlitter_CopyView2Screen(_hnmView);
-		assert(_vm->_screenView->_pitch == 320);
-		_vm->pollEvents();
-
-		if (arg1) {
-			if (_vm->isMouseButtonDown()) {
-				if (!_mouseHeld) {
-					_mouseHeld = true;
-					_videoCanceledFlag = true;
-				}
-			}
-			else
-				_mouseHeld = false;
-		}
-	} while (playing && !_videoCanceledFlag);
-	delete _hnmView;
-	_vm->_video->deallocMemory();
-}
-
-void EdenGame::playHNM(int16 num) {
-	perso_t *perso = nullptr;
-	int16 oldDialogType = -1;
-	_globals->_curVideoNum = num;
-	if (num != 2001 && num != 2012 && num != 98 && num != 171) {
-		byte oldMusicType = _globals->_newMusicType;
-		_globals->_newMusicType = MusicType::mtEvent;
-		musique();
-		musicspy();
-		_globals->_newMusicType = oldMusicType;
-	}
-	_globals->_videoSubtitleIndex = 1;
-	if (_specialTextMode) {
-		perso = _globals->_characterPtr;
-		oldDialogType = _globals->_dialogType;
-		preloadDialogs(num);
-		fademusica0(1);
-		_musicChannel->stop();
-	}
-	_showVideoSubtitle = false;
-	_videoCanceledFlag = false;
-	loadHnm(num);
-	_vm->_video->reset();
-	if (_needToFade) {
-		fadeToBlack(4);
-		clearScreen();
-		_needToFade = false;
-	}
-	if (num == 2012 || num == 98 || num == 171)
-		showMovie(0);
-	else
-		showMovie(1);
-	_cursKeepPos = Common::Point(-1, -1);
-	if (_specialTextMode) {
-		_musicFadeFlag = 3;
-		musicspy();
-		_globals->_characterPtr = perso;
-		_globals->_dialogType = oldDialogType;
-		_specialTextMode = false;
-	}
-	if (_videoCanceledFlag)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-	if (_globals->_curVideoNum == 167)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-	if (_globals->_curVideoNum == 104)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-	if (_globals->_curVideoNum == 102)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-	if (_globals->_curVideoNum == 77)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-	if (_globals->_curVideoNum == 149)
-		_globals->_varF1 = RoomFlags::rf40 | RoomFlags::rf04 | RoomFlags::rf01;
-}
-
-// Original name bullehnm
-void EdenGame::handleHNMSubtitles() {
-#define SUB_LINE(start, end) \
-	(start), (end) | 0x8000
-
-	static uint16 kFramesVid170[] = {
-		SUB_LINE(68, 120),
-		SUB_LINE(123, 196),
-		SUB_LINE(199, 274),
-		SUB_LINE(276, 370),
-		SUB_LINE(799, 885),
-		SUB_LINE(888, 940),
-		SUB_LINE(947, 1000),
-		SUB_LINE(1319, 1378),
-		SUB_LINE(1380, 1440),
-		SUB_LINE(1854, 1898),
-		SUB_LINE(1900, 1960),
-		SUB_LINE(2116, 2184),
-		SUB_LINE(2186, 2252),
-		SUB_LINE(2254, 2320),
-		SUB_LINE(3038, 3094),
-		SUB_LINE(3096, 3160),
-		0xFFFF
-	};
-
-	static uint16 kFramesVid83[] = {
-		SUB_LINE(99, 155),
-		SUB_LINE(157, 256),
-		0xFFFF
-	};
-
-	static uint16 kFramesVid88[] = {
-		SUB_LINE(106, 173),
-		SUB_LINE(175, 244),
-		SUB_LINE(246, 350),
-		SUB_LINE(352, 467),
-		0xFFFF
-	};
-
-	static uint16 kFramesVid89[] = {
-		SUB_LINE(126, 176),
-		SUB_LINE(178, 267),
-		SUB_LINE(269, 342),
-		SUB_LINE(344, 398),
-		SUB_LINE(400, 458),
-		SUB_LINE(460, 558),
-		0xFFFF
-	};
-
-	static uint16 kFramesVid94[] = {
-		SUB_LINE(101, 213),
-		SUB_LINE(215, 353),
-		SUB_LINE(355, 455),
-		SUB_LINE(457, 518),
-		SUB_LINE(520, 660),
-		SUB_LINE(662, 768),
-		0xFFFF
-	};
-
-#undef SUB_LINE
-
-	uint16 *frames;
-	perso_t *perso;
-	switch (_globals->_curVideoNum) {
-	case 170:
-		frames = kFramesVid170;
-		perso = &_persons[PER_UNKN_156];
-		break;
-	case 83:
-		frames = kFramesVid83;
-		perso = &_persons[PER_MORKUS];
-		break;
-	case 88:
-		frames = kFramesVid88;
-		perso = &_persons[PER_MORKUS];
-		break;
-	case 89:
-		frames = kFramesVid89;
-		perso = &_persons[PER_MORKUS];
-		break;
-	case 94:
-		frames = kFramesVid94;
-		perso = &_persons[PER_MORKUS];
-		break;
-	default:
-		return;
-	}
-	uint16 *frames_start = frames;
-	uint16 frame;
-	while ((frame = *frames++) != 0xFFFF) {
-		if ((frame & ~0x8000) == _hnmFrameNum)
-			break;
-	}
-	if (frame == 0xFFFF) {
-		if (_showVideoSubtitle)
-			displayHNMSubtitle();
-		return;
-	}
-	if (frame & 0x8000)
-		_showVideoSubtitle = false;
-	else {
-		_globals->_videoSubtitleIndex = (frames - frames_start) / 2 + 1;
-		_globals->_characterPtr = perso;
-		_globals->_dialogType = DialogType::dtInspect;
-		int16 num = (perso->_id << 3) | _globals->_dialogType;
-		dialoscansvmas((Dialog *)getElem(_gameDialogs, num));
-		_showVideoSubtitle = true;
-	}
-	if (_showVideoSubtitle)
-		displayHNMSubtitle();
-}
-
-}   // namespace Cryo
diff --git a/engines/cryo/module.mk b/engines/cryo/module.mk
index 1fcb0ae..c8d3f8e 100644
--- a/engines/cryo/module.mk
+++ b/engines/cryo/module.mk
@@ -6,7 +6,7 @@ MODULE_OBJS = \
 	debugger.o \
 	detection.o \
 	eden.o \
-	graphics.o \
+	eden_graphics.o \
 	resource.o \
 	sound.o \
 	video.o





More information about the Scummvm-git-logs mailing list