aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hopkins')
-rw-r--r--engines/hopkins/events.cpp18
-rw-r--r--engines/hopkins/globals.cpp5
-rw-r--r--engines/hopkins/globals.h12
-rw-r--r--engines/hopkins/graphics.cpp91
-rw-r--r--engines/hopkins/graphics.h153
-rw-r--r--engines/hopkins/hopkins.cpp2
-rw-r--r--engines/hopkins/script.cpp2
7 files changed, 122 insertions, 161 deletions
diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp
index ead8ff0a33..a52371368e 100644
--- a/engines/hopkins/events.cpp
+++ b/engines/hopkins/events.cpp
@@ -313,8 +313,8 @@ int EventsManager::waitKeyPress() {
}
void EventsManager::VBL() {
- signed int v11 = 0;
- signed int v12 = 0;
+ int bottom = 0;
+ int right = 0;
int height = 0;
int width = 0;
int xp = 0;
@@ -355,12 +355,12 @@ void EventsManager::VBL() {
if (yp + _mouseSizeY >= mouseHeight + _vm->_graphicsManager._maxY)
height = _vm->_graphicsManager._maxY - mouseHeight - yp;
}
- v12 = width + xp;
- v11 = yp + height;
+ right = xp + width;
+ bottom = yp + height;
}
}
- if (!_vm->_globals.PUBEXIT)
+ if (!_vm->_globals._linuxEndDemoFl)
_vm->_objectsManager.displaySprite();
if (!_mouseFl) {
updateCursor();
@@ -376,7 +376,7 @@ void EventsManager::VBL() {
}
} else if (yp < _vm->_graphicsManager._maxY && xp < _vm->_graphicsManager._maxX && width > 1 && height > 1) {
_vm->_eventsManager.updateCursor();
- _vm->_graphicsManager.addVesaSegment(xp, yp, v12, v11);
+ _vm->_graphicsManager.addVesaSegment(xp, yp, right, bottom);
}
_vm->_globals._speed = 2;
@@ -432,12 +432,8 @@ void EventsManager::VBL() {
_vm->_graphicsManager.unlockScreen();
_vm->_graphicsManager.dstrect[0] = Common::Rect(0, 20, SCREEN_WIDTH, 460);
- for (int i = 1; i < _vm->_globals.NBBLOC + 1; i++) {
- if (_vm->_globals.BLOC[i]._activeFl)
- _vm->_globals.BLOC[i]._activeFl = false;
- }
+ _vm->_graphicsManager.RESET_SEGMENT_VESA();
- _vm->_globals.NBBLOC = 0;
_startPos.x = _vm->_graphicsManager._scrollPosX;
_vm->_graphicsManager._scrollOffset = _vm->_graphicsManager._scrollPosX;
_vm->_graphicsManager._scrollPosX = _vm->_graphicsManager._scrollPosX;
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp
index 2c2cfac80e..e9229c4d59 100644
--- a/engines/hopkins/globals.cpp
+++ b/engines/hopkins/globals.cpp
@@ -86,8 +86,6 @@ Globals::Globals() {
}
for (int i = 0; i < 300; ++i)
Common::fill((byte *)&ObjetW[i], (byte *)&ObjetW[i] + sizeof(ObjetWItem), 0);
- for (int i = 0; i < 250; ++i)
- Common::fill((byte *)&BLOC[i], (byte *)&BLOC[i] + sizeof(BlocItem), 0);
for (int i = 0; i < 25; ++i)
Common::fill((byte *)&Cache[i], (byte *)&Cache[i] + sizeof(CacheItem), 0);
@@ -108,7 +106,7 @@ Globals::Globals() {
// Initialize fields
_language = LANG_EN;
- PUBEXIT = false;
+ _linuxEndDemoFl = false;
_speed = 1;
_oldFrameIndex = 0;
_oldDirection = 0;
@@ -131,7 +129,6 @@ Globals::Globals() {
_screenId = 0;
_prevScreenId = 0;
_characterMaxPosY = 0;
- NBBLOC = 0;
_menuScrollType = 0;
_menuScrollSpeed = 0;
_menuSpeed = 0;
diff --git a/engines/hopkins/globals.h b/engines/hopkins/globals.h
index 4cc2f245be..033d40f935 100644
--- a/engines/hopkins/globals.h
+++ b/engines/hopkins/globals.h
@@ -127,14 +127,6 @@ struct ObjetWItem {
byte field7;
};
-struct BlocItem {
- uint16 _activeFl;
- int _x1;
- int _y1;
- int _x2;
- int _y2;
-};
-
/**
* Mode for SortItem records
*/
@@ -289,7 +281,6 @@ public:
LockAnimItem _lockedAnims[30];
VBobItem VBob[30];
ObjetWItem ObjetW[300];
- BlocItem BLOC[250];
CacheItem Cache[25];
int BOBZONE[105];
bool BOBZONE_FLAG[105];
@@ -298,7 +289,7 @@ public:
int _inventory[36];
SortItem _sortedDisplay[51];
Language _language;
- bool PUBEXIT;
+ bool _linuxEndDemoFl;
int PERSO_TYPE;
uint _speed;
Common::String FICH_ZONE;
@@ -338,7 +329,6 @@ public:
int _characterMaxPosY;
bool _disableInventFl;
bool NOMARCHE;
- int NBBLOC;
byte *_optionDialogSpr;
bool _optionDialogFl;
int _menuDisplayType;
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index 63bcbf20c8..03d79e376e 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -45,6 +45,7 @@ GraphicsManager::GraphicsManager() {
_scrollPosX = 0;
_largeScreenFl = false;
_oldScrollPosX = 0;
+ NBBLOC = 0;
_lineNbr2 = 0;
Agr_x = Agr_y = 0;
@@ -63,12 +64,16 @@ GraphicsManager::GraphicsManager() {
Red_x = Red_y = 0;
Red = 0;
_width = 0;
- spec_largeur = 0;
+ _specialWidth = 0;
Common::fill(&SD_PIXELS[0], &SD_PIXELS[PALETTE_SIZE * 2], 0);
Common::fill(&_colorTable[0], &_colorTable[PALETTE_EXT_BLOCK_SIZE], 0);
Common::fill(&_palette[0], &_palette[PALETTE_EXT_BLOCK_SIZE], 0);
Common::fill(&_oldPalette[0], &_oldPalette[PALETTE_EXT_BLOCK_SIZE], 0);
+
+ for (int i = 0; i < 250; ++i)
+ Common::fill((byte *)&BLOC[i], (byte *)&BLOC[i] + sizeof(BlocItem), 0);
+
}
GraphicsManager::~GraphicsManager() {
@@ -923,6 +928,14 @@ void GraphicsManager::Capture_Mem(const byte *srcSurface, byte *destSurface, int
} while (rowCount2 != 1);
}
+/**
+ * Draws a sprite onto the screen
+ * @param surface Destination surface
+ * @param spriteData The raw data for a sprite set
+ * @param xp X co-ordinate. For some reason, starts from 300 = first column
+ * @param yp Y co-ordinate. FOr some reason, starts from 300 = top row
+ * @param spriteIndex Index of the sprite to draw
+ */
void GraphicsManager::Sprite_Vesa(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex) {
// Get a pointer to the start of the desired sprite
const byte *spriteP = spriteData + 3;
@@ -1080,12 +1093,10 @@ void GraphicsManager::VISU_ALL() {
}
void GraphicsManager::RESET_SEGMENT_VESA() {
- if (_vm->_globals.NBBLOC > 0) {
- for (int idx = 0; idx != _vm->_globals.NBBLOC; idx++)
- _vm->_globals.BLOC[idx]._activeFl = false;
+ for (int idx = 0; idx <= NBBLOC; idx++)
+ BLOC[idx]._activeFl = false;
- _vm->_globals.NBBLOC = 0;
- }
+ NBBLOC = 0;
}
// Add VESA Segment
@@ -1104,19 +1115,15 @@ void GraphicsManager::addVesaSegment(int x1, int y1, int x2, int y2) {
if (y1 < _minY)
y1 = _minY;
- if (_vm->_globals.NBBLOC > 1) {
- int16 blocIndex = 0;
- do {
- BlocItem &bloc = _vm->_globals.BLOC[blocIndex];
- if (bloc._activeFl && tempX >= bloc._x1 && x2 <= bloc._x2 && y1 >= bloc._y1 && y2 <= bloc._y2)
- addFlag = false;
- ++blocIndex;
- } while (_vm->_globals.NBBLOC + 1 != blocIndex);
- }
+ for (int blocIndex = 0; blocIndex <= NBBLOC; blocIndex++) {
+ BlocItem &bloc = BLOC[blocIndex];
+ if (bloc._activeFl && tempX >= bloc._x1 && x2 <= bloc._x2 && y1 >= bloc._y1 && y2 <= bloc._y2)
+ addFlag = false;
+ };
if (addFlag) {
- assert(_vm->_globals.NBBLOC < 250);
- BlocItem &bloc = _vm->_globals.BLOC[++_vm->_globals.NBBLOC];
+ assert(NBBLOC < 250);
+ BlocItem &bloc = BLOC[++NBBLOC];
bloc._activeFl = true;
bloc._x1 = tempX;
@@ -1128,13 +1135,13 @@ void GraphicsManager::addVesaSegment(int x1, int y1, int x2, int y2) {
// Display VESA Segment
void GraphicsManager::displayVesaSegment() {
- if (_vm->_globals.NBBLOC == 0)
+ if (NBBLOC == 0)
return;
lockScreen();
- for (int idx = 1; idx <= _vm->_globals.NBBLOC; ++idx) {
- BlocItem &bloc = _vm->_globals.BLOC[idx];
+ for (int idx = 1; idx <= NBBLOC; ++idx) {
+ BlocItem &bloc = BLOC[idx];
Common::Rect &dstRect = dstrect[idx - 1];
if (!bloc._activeFl)
continue;
@@ -1163,10 +1170,10 @@ void GraphicsManager::displayVesaSegment() {
unlockScreen();
}
- _vm->_globals.BLOC[idx]._activeFl = false;
+ BLOC[idx]._activeFl = false;
}
- _vm->_globals.NBBLOC = 0;
+ NBBLOC = 0;
unlockScreen();
}
@@ -1516,7 +1523,7 @@ void GraphicsManager::Affiche_Perfect(byte *surface, const byte *srcData, int xp
_width = spriteWidth;
if (flipFl) {
byte *dest2P = spriteWidth + dest1P;
- spec_largeur = spriteWidth;
+ _specialWidth = spriteWidth;
if (_posYClipped) {
if (_posYClipped >= spriteHeight1 || spriteHeight1 < 0)
return;
@@ -1548,12 +1555,12 @@ void GraphicsManager::Affiche_Perfect(byte *surface, const byte *srcData, int xp
++spritePixelsP;
--dest2P;
}
- spritePixelsP = spec_largeur + spritePixelsCopy2P;
+ spritePixelsP = _specialWidth + spritePixelsCopy2P;
dest2P = _lineNbr2 + destCopy2P;
spriteHeight1 = yCtr2 - 1;
} while (yCtr2 != 1);
} else {
- spec_largeur = spriteWidth;
+ _specialWidth = spriteWidth;
if (_posYClipped) {
if (_posYClipped >= spriteHeight1 || spriteHeight1 < 0)
return;
@@ -1583,7 +1590,7 @@ void GraphicsManager::Affiche_Perfect(byte *surface, const byte *srcData, int xp
++dest1P;
++spritePixelsP;
}
- spritePixelsP = spec_largeur + spritePixelsCopyP;
+ spritePixelsP = _specialWidth + spritePixelsCopyP;
dest1P = _lineNbr2 + dest1CopyP;
spriteHeight1 = yCtr1 - 1;
} while (yCtr1 != 1);
@@ -1805,38 +1812,6 @@ void GraphicsManager::Copy_WinScan_Vbe(const byte *src, byte *dest) {
}
}
-void GraphicsManager::Copy_Video_Vbe(const byte *src) {
- assert(_videoPtr);
- int destOffset = 0;
- const byte *srcP = src;
- for (;;) {
- byte byteVal = *srcP;
- if (*srcP < kByteStop)
- break;
- else {
- if (byteVal == kByteStop)
- return;
- if (byteVal == k8bVal) {
- destOffset += srcP[1];
- byteVal = srcP[2];
- srcP += 2;
- } else if (byteVal == k16bVal) {
- destOffset += READ_LE_UINT16(srcP + 1);
- byteVal = srcP[3];
- srcP += 3;
- } else {
- destOffset += READ_LE_UINT32(srcP + 1);
- byteVal = srcP[5];
- srcP += 5;
- }
- }
-
- *((byte *)_videoPtr->pixels + destOffset) = byteVal;
- ++srcP;
- ++destOffset;
- }
-}
-
// Reduce Screen
void GraphicsManager::Reduc_Ecran(const byte *srcSurface, byte *destSurface, int xp, int yp, int width, int height, int zoom) {
const byte *srcP = xp + _lineNbr2 * yp + srcSurface;
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index e5feaddad5..af06e8ce88 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -45,131 +45,134 @@ struct RGB8 {
byte b;
};
+struct BlocItem {
+ uint16 _activeFl;
+ int _x1;
+ int _y1;
+ int _x2;
+ int _y2;
+};
+
class HopkinsEngine;
class GraphicsManager {
private:
HopkinsEngine *_vm;
- void loadScreen(const Common::String &file);
-public:
int _lockCounter;
bool _initGraphicsFl;
int _screenWidth;
int _screenHeight;
- int WinScan;
+ Graphics::Surface *_videoPtr;
+ int _width;
+ int _posXClipped, _posYClipped;
+ bool _clipFl;
+ int _specialWidth;
+
byte SD_PIXELS[PALETTE_SIZE * 2];
- byte *PAL_PIXELS;
+ int Agr_x, Agr_y;
+ bool Agr_Flag_x, Agr_Flag_y;
+ int clip_x1, clip_y1;
+ int Red_x, Red_y;
+ int Red;
+
+ void loadScreen(const Common::String &file);
+ void loadPCX640(byte *surface, const Common::String &file, byte *palette, bool typeFlag);
+ void loadPCX320(byte *surface, const Common::String &file, byte *palette);
+ void fadeIn(const byte *palette, int step, const byte *surface);
+ void fadeOut(const byte *palette, int step, const byte *surface);
+ void changePalette(const byte *palette);
+ uint16 mapRGB(byte r, byte g, byte b);
+
+ void Trans_bloc(byte *destP, const byte *srcP, int count, int minThreshold, int maxThreshold);
+ void Copy_Vga16(const byte *surface, int xp, int yp, int width, int height, int destX, int destY);
+ void copy16bFromSurfaceScaleX2(const byte *surface);
+public:
int _lineNbr;
byte _colorTable[PALETTE_EXT_BLOCK_SIZE];
byte _palette[PALETTE_EXT_BLOCK_SIZE];
byte _oldPalette[PALETTE_EXT_BLOCK_SIZE];
- Graphics::Surface *_videoPtr;
byte *_vesaScreen;
byte *_vesaBuffer;
int _scrollOffset;
int _scrollPosX;
bool _largeScreenFl;
int _oldScrollPosX;
- bool MANU_SCROLL;
int _scrollSpeed;
int _lineNbr2;
- int Agr_x, Agr_y;
- bool Agr_Flag_x, Agr_Flag_y;
- int _fadeDefaultSpeed;
- int FADE_LINUX;
- bool _skipVideoLockFl;
- int _scrollStatus;
- Common::Rect dstrect[50];
int _minX, _minY;
int _maxX, _maxY;
- int _posXClipped, _posYClipped;
- int clip_x1, clip_y1;
- bool _clipFl;
- int Red_x, Red_y;
- int Red;
- int _width;
- int spec_largeur;
bool _noFadingFl;
+ Common::Rect dstrect[50];
+ int _scrollStatus;
+ bool _skipVideoLockFl;
+ int _fadeDefaultSpeed;
+
+ int NBBLOC;
+ BlocItem BLOC[250];
+ int WinScan;
+ byte *PAL_PIXELS;
+ bool MANU_SCROLL;
+ int FADE_LINUX;
public:
GraphicsManager();
~GraphicsManager();
- void setParent(HopkinsEngine *vm);
- void setGraphicalMode(int width, int height);
+ void setParent(HopkinsEngine *vm);
void lockScreen();
void unlockScreen();
+ void clearPalette();
void clearScreen();
void loadImage(const Common::String &file);
void loadVgaImage(const Common::String &file);
- void initColorTable(int minIndex, int maxIndex, byte *palette);
- void scrollScreen(int amount);
- void Trans_bloc(byte *destP, const byte *srcP, int count, int minThreshold, int maxThreshold);
- void Trans_bloc2(byte *surface, byte *col, int size);
- void loadPCX640(byte *surface, const Common::String &file, byte *palette, bool typeFlag);
- void loadPCX320(byte *surface, const Common::String &file, byte *palette);
- void clearPalette();
- void SCANLINE(int pitch);
- void m_scroll16(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
- void m_scroll16A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
- void Copy_Vga16(const byte *surface, int xp, int yp, int width, int height, int destX, int destY);
- void fadeIn(const byte *palette, int step, const byte *surface);
- void fadeOut(const byte *palette, int step, const byte *surface);
- void fadeInShort();
- void fadeOutShort();
void fadeInLong();
- void fadeOutLong();
- void fadeOutDefaultLength(const byte *surface);
- void fadeInDefaultLength(const byte *surface);
void fadeInBreakout();
+ void fadeInDefaultLength(const byte *surface);
+ void fadeInShort();
+ void fadeOutDefaultLength(const byte *surface);
void fateOutBreakout();
+ void fadeOutLong();
+ void fadeOutShort();
+ void fastDisplay(const byte *spriteData, int xp, int yp, int spriteIndex, bool addSegment = true);
+ void displayVesaSegment();
+ void displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int colour);
+ void drawHorizontalLine(byte *surface, int xp, int yp, uint16 width, byte col);
+ void drawVerticalLine(byte *surface, int xp, int yp, int height, byte col);
+ void initColorTable(int minIndex, int maxIndex, byte *palette);
+ void setGraphicalMode(int width, int height);
void setPaletteVGA256(const byte *palette);
void setPaletteVGA256WithRefresh(const byte *palette, const byte *surface);
+ void scrollScreen(int amount);
+ int zoomIn(int v, int percentage);
+ int zoomOut(int v, int percentage);
+
+ void Restore_Mem(byte *destSurface, const byte *src, int xp, int yp, int width, int height);
+ void addVesaSegment(int x1, int y1, int x2, int y2);
+ void copySurface(const byte *surface, int x1, int y1, int width, int height, byte *destSurface, int destX, int destY);
void SETCOLOR3(int palIndex, int r, int g, int b);
void SETCOLOR4(int palIndex, int r, int g, int b);
- void changePalette(const byte *palette);
- uint16 mapRGB(byte r, byte g, byte b);
+ void AFFICHE_SPEEDVGA(const byte *objectData, int xp, int yp, int idx, bool addSegment = true);
+ void RESET_SEGMENT_VESA();
void DD_VBL();
- void Copy_WinScan_Vbe3(const byte *srcData, byte *destSurface);
- void Copy_Video_Vbe16(const byte *srcData);
- void Copy_Video_Vbe16a(const byte *srcData);
void Capture_Mem(const byte *srcSurface, byte *destSurface, int xs, int ys, int width, int height);
-
- /**
- * Draws a sprite onto the screen
- * @param surface Destination surface
- * @param spriteData The raw data for a sprite set
- * @param xp X co-ordinate. For some reason, starts from 300 = first column
- * @param yp Y co-ordinate. FOr some reason, starts from 300 = top row
- * @param spriteIndex Index of the sprite to draw
- */
- void Sprite_Vesa(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex);
-
- void FIN_VISU();
- void VISU_ALL();
- void RESET_SEGMENT_VESA();
- void addVesaSegment(int x1, int y1, int x2, int y2);
- void displayVesaSegment();
- void AFFICHE_SPEEDVGA(const byte *objectData, int xp, int yp, int idx, bool addSegment = true);
- void CopyAsm(const byte *surface);
- void copy16bFromSurfaceScaleX2(const byte *surface);
- void Restore_Mem(byte *destSurface, const byte *src, int xp, int yp, int width, int height);
- int zoomIn(int v, int percentage);
- int zoomOut(int v, int percentage);
void Affiche_Perfect(byte *surface, const byte *srcData, int xp300, int yp300, int frameIndex, int zoom1, int zoom2, bool flipFl);
- void fastDisplay(const byte *spriteData, int xp, int yp, int spriteIndex, bool addSegment = true);
- void copySurface(const byte *surface, int x1, int y1, int width, int height, byte *destSurface, int destX, int destY);
void Copy_Mem(const byte *srcSurface, int x1, int y1, uint16 width, int height, byte *destSurface, int destX, int destY);
- void displayFont(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int colour);
+ void SCANLINE(int pitch);
+ void Sprite_Vesa(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex);
+ void m_scroll16(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
+ void m_scroll16A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
+ void Trans_bloc2(byte *surface, byte *col, int size);
+ void VISU_ALL();
+ void FIN_VISU();
void INI_ECRAN(const Common::String &file, bool initializeScreen);
void INI_ECRAN2(const Common::String &file, bool initializeScreen);
- void OPTI_INI(const Common::String &file, int mode, bool initializeScreen);
void NB_SCREEN(bool initPalette);
- void Copy_WinScan_Vbe(const byte *srcP, byte *destP);
- void Copy_Video_Vbe(const byte *src);
void Reduc_Ecran(const byte *srcSruface, byte *destSurface, int xp, int yp, int width, int height, int zoom);
- void drawHorizontalLine(byte *surface, int xp, int yp, uint16 width, byte col);
- void drawVerticalLine(byte *surface, int xp, int yp, int height, byte col);
+ void OPTI_INI(const Common::String &file, int mode, bool initializeScreen);
+ void Copy_WinScan_Vbe3(const byte *srcData, byte *destSurface);
+ void Copy_WinScan_Vbe(const byte *srcP, byte *destP);
+ void Copy_Video_Vbe16(const byte *srcData);
+ void Copy_Video_Vbe16a(const byte *srcData);
};
} // End of namespace Hopkins
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index 4e0698a4c4..1b8187a5cf 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -1954,7 +1954,7 @@ void HopkinsEngine::restoreSystem() {
}
void HopkinsEngine::endLinuxDemo() {
- _globals.PUBEXIT = true;
+ _globals._linuxEndDemoFl = true;
_graphicsManager.RESET_SEGMENT_VESA();
_globals._forestFl = false;
_eventsManager._breakoutFl = false;
diff --git a/engines/hopkins/script.cpp b/engines/hopkins/script.cpp
index cf4f296fff..c25aacc414 100644
--- a/engines/hopkins/script.cpp
+++ b/engines/hopkins/script.cpp
@@ -2328,7 +2328,7 @@ int ScriptManager::handleOpcode(byte *dataP) {
memcpy(_vm->_graphicsManager._oldPalette, _vm->_graphicsManager._palette, 769);
_vm->_animationManager.playAnim2("PLAN.ANM", 50, 10, 800);
}
- _vm->_globals.NBBLOC = 0;
+ _vm->_graphicsManager.NBBLOC = 0;
break;
case 608: