aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/globals.cpp1
-rw-r--r--engines/hopkins/globals.h1
-rw-r--r--engines/hopkins/graphics.cpp235
-rw-r--r--engines/hopkins/graphics.h17
-rw-r--r--engines/hopkins/hopkins.cpp18
-rw-r--r--engines/hopkins/hopkins.h1
6 files changed, 263 insertions, 10 deletions
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp
index f0b06bf975..837b287ee4 100644
--- a/engines/hopkins/globals.cpp
+++ b/engines/hopkins/globals.cpp
@@ -32,7 +32,6 @@ Globals::Globals() {
SVGA = 2;
internet = 1;
PUBEXIT = 0;
- FADESPD = 15;
vitesse = 1;
INSTALL_TYPE = 1;
MUSICVOL = 6;
diff --git a/engines/hopkins/globals.h b/engines/hopkins/globals.h
index 8a10315cf7..201f22b4f7 100644
--- a/engines/hopkins/globals.h
+++ b/engines/hopkins/globals.h
@@ -108,7 +108,6 @@ struct ObjetWItem {
*/
class Globals {
public:
- int FADESPD;
int FR;
int SVGA;
int internet;
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index 9b95b3f515..7c43d0449f 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -53,6 +53,7 @@ GraphicsManager::GraphicsManager() {
nbrligne2 = 0;
Agr_x = Agr_y = 0;
Agr_Flag_x = Agr_Flag_y = 0;
+ FADESPD = 15;
}
GraphicsManager::~GraphicsManager() {
@@ -431,7 +432,7 @@ void GraphicsManager::A_PCXSCREEN_WIDTH_SCREEN_HEIGHT(byte *surface, const Commo
f.seek(filesize - 768);
}
- if (f.read(palette, PALETTE_SIZE * 3) != (PALETTE_SIZE * 3))
+ if (f.read(palette, PALETTE_BLOCK_SIZE) != (PALETTE_BLOCK_SIZE))
error("A_PCXSCREEN_WIDTH_SCREEN_HEIGHT");
f.close();
@@ -440,7 +441,7 @@ void GraphicsManager::A_PCXSCREEN_WIDTH_SCREEN_HEIGHT(byte *surface, const Commo
void GraphicsManager::Cls_Pal() {
if (Winbpp == 2) {
- Common::fill(&cmap[0], &cmap[PALETTE_SIZE * 3], 0);
+ Common::fill(&cmap[0], &cmap[PALETTE_BLOCK_SIZE], 0);
// TODO: Figure out what this is for
//SD_PIXELS[2 * v0] = SDL_MapRGB(*(_DWORD *)(LinuxScr + 4), 0, 0, 0);
@@ -654,6 +655,236 @@ void GraphicsManager::m_scroll16A(const byte *surface, int xs, int ys, int width
} while (v13 != 1);
}
+void GraphicsManager::fade_in(const byte *palette, int step, const byte *surface) {
+ __int16 v3;
+ int v4;
+ __int16 v5;
+ __int16 v6;
+ char *v7;
+ __int16 v8;
+ char *v9;
+ __int16 v10;
+ signed __int16 v12;
+ unsigned __int16 v13;
+ byte palData[PALETTE_BLOCK_SIZE];
+ byte v15[3];
+ __int16 v16;
+ char v17[2];
+ char v18[1532];
+
+ v13 = FADESPD;
+ v3 = 0;
+ do {
+ v4 = v3;
+ *(&v16 + v4) = 0;
+ palData[v4] = 0;
+ ++v3;
+ } while (v3 < (PALETTE_BLOCK_SIZE));
+
+ setpal_vga256(palData);
+ v12 = 0;
+
+ if ((signed __int16)v13 > 0) {
+ do {
+ v5 = 0;
+ do {
+ if ((unsigned __int8)palData[v5] < *(byte *)(v5 + palette)) {
+ v6 = *(&v16 + v5) + ((unsigned int)*(byte *)(v5 + palette) << 8) / (signed __int16)v13;
+ *(&v16 + v5) = v6;
+ palData[v5] = (v6 >> 8) & 0xff;
+ }
+
+ if (v15[v5] < *(byte *)(palette + v5 + 1)) {
+ v7 = &v17[2 * v5];
+ v8 = *(uint16 *)v7 + ((unsigned int)*(byte *)(palette + v5 + 1) << 8) / (signed __int16)v13;
+ *(uint16 *)v7 = v8;
+ v15[v5] = (v8 >> 8) & 0xff;
+ }
+
+ if (v15[v5 + 1] < *(byte *)(palette + v5 + 2)) {
+ v9 = &v18[2 * v5];
+ v10 = *(uint16 *)v9 + ((unsigned int)*(byte *)(palette + v5 + 2) << 8) / (signed __int16)v13;
+ *(uint16 *)v9 = v10;
+ v15[v5 + 1] = (v10 >> 8) & 0xff;
+ }
+
+ v5 += 3;
+ } while (v5 < (PALETTE_BLOCK_SIZE));
+
+ setpal_vga256(palData);
+ if (Winbpp == 2) {
+ if (SDL_ECHELLE)
+ m_scroll16A(surface, start_x, 0, 640, 480, 0, 0);
+ else
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+ DD_VBL();
+ }
+
+ ++v12;
+ } while (v12 < (signed __int16)v13);
+ }
+
+ setpal_vga256(palette);
+ if (Winbpp == 2) {
+ if (SDL_ECHELLE)
+ m_scroll16A(surface, start_x, 0, 640, 480, 0, 0);
+ else
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+ DD_VBL();
+ }
+}
+
+void GraphicsManager::fade_out(const byte *palette, int step, const byte *surface) {
+ __int16 v3;
+ __int16 v4;
+ int v5;
+ signed __int16 v6;
+ __int16 v7;
+ int v8;
+ __int16 v9;
+ __int16 v10;
+ __int16 v12;
+ unsigned __int16 v13;
+ byte palData[PALETTE_BLOCK_SIZE];
+ __int16 v15[PALETTE_BLOCK_SIZE];
+
+ v13 = v3 = FADESPD;
+ if (palette) {
+ v4 = 0;
+ do {
+ v5 = v4;
+ v3 = *(byte *)(v4 + palette);
+ v3 <<= 8;
+ v15[v5] = v3;
+ palData[v5] = *(byte *)(v4++ + palette);
+ } while (v4 < PALETTE_BLOCK_SIZE);
+
+ setpal_vga256(palData);
+ if (Winbpp == 2) {
+ if (SDL_ECHELLE)
+ m_scroll16A(surface, start_x, 0, 640, 480, 0, 0);
+ else
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+ DD_VBL();
+ }
+
+ v6 = 0;
+ if ((signed __int16)v13 > 0) {
+ do {
+ v7 = 0;
+ do {
+ v8 = v7;
+ v9 = v15[v7] - ((unsigned int)*(byte *)(v7 + palette) << 8) / (signed __int16)v13;
+ v15[v8] = v9;
+ palData[v8] = (v9 >> 8) & 0xff;
+ ++v7;
+ } while (v7 < (PALETTE_BLOCK_SIZE));
+
+ setpal_vga256(palData);
+ if (Winbpp == 2) {
+ if (SDL_ECHELLE)
+ m_scroll16A(surface, start_x, 0, 640, 480, 0, 0);
+ else
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+
+ DD_VBL();
+ }
+ ++v6;
+ } while ((signed __int16)v13 > v6);
+ }
+
+ v10 = 0;
+ do {
+ palData[v10++] = 0;
+ } while (v10 < (PALETTE_BLOCK_SIZE));
+
+ setpal_vga256(palData);
+
+ if (Winbpp == 2) {
+ if (!SDL_ECHELLE) {
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+ return DD_VBL();
+ }
+ goto LABEL_28;
+ }
+ } else {
+ v12 = 0;
+ do {
+ palData[v12++] = 0;
+ } while (v12 < (PALETTE_BLOCK_SIZE));
+
+ setpal_vga256(palData);
+ if (Winbpp == 2) {
+ if (!SDL_ECHELLE) {
+ m_scroll16(surface, start_x, 0, 640, 480, 0, 0);
+ return DD_VBL();
+ }
+
+LABEL_28:
+ m_scroll16A(surface, start_x, 0, 640, 480, 0, 0);
+ return DD_VBL();
+ }
+ }
+}
+
+void GraphicsManager::FADE_INS() {
+ FADESPD = 1;
+ fade_in(Palette, 1, (const byte *)VESA_BUFFER.pixels);
+}
+
+void GraphicsManager::FADE_OUTS() {
+ FADESPD = 1;
+ fade_out(Palette, 1, (const byte *)VESA_BUFFER.pixels);
+}
+
+void GraphicsManager::FADE_INW() {
+ FADESPD = 15;
+ fade_in(Palette, 20, (const byte *)VESA_BUFFER.pixels);
+}
+
+void GraphicsManager::FADE_OUTW() {
+ FADESPD = 15;
+ fade_out(Palette, 20, (const byte *)VESA_BUFFER.pixels);
+}
+
+void GraphicsManager::setpal_vga256(const byte *palette) {
+ CHANGE_PALETTE(palette);
+}
+
+void GraphicsManager::CHANGE_PALETTE(const byte *palette) {
+ signed int v1;
+ signed int v2;
+ int v3;
+ const byte *v4;
+
+ v1 = 0;
+ do {
+ PALPCX[v1] = *(byte *)(palette + v1);
+ ++v1;
+ } while (v1 < PALETTE_BLOCK_SIZE);
+
+ v2 = 0;
+ do {
+ v3 = 3 * v2;
+ cmap[v3] = *(byte *)(palette + 3 * v2);
+ v4 = palette + 3 * v2;
+ cmap[v3 + 1] = *(byte *)(v4 + 1);
+ cmap[v3 + 2] = *(byte *)(v4 + 2);
+
+ // TODO: Validate pixel encoding is correct
+ *(uint16 *)&SD_PIXELS[2 * v2++] =
+ *(byte *)v4 | (*(byte *)(v4 + 1) << 5) | (*(byte *)(v4 + 2) << 10);
+ } while (v2 < PALETTE_SIZE);
+
+ g_system->getPaletteManager()->setPalette(cmap, 0, PALETTE_SIZE);
+}
+
+void GraphicsManager::DD_VBL() {
+ // TODO: Is this okay here?
+ g_system->updateScreen();
+}
+
+
/*------------------------------------------------------------------------*/
byte *ObjectManager::CHANGE_OBJET(int objIndex) {
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index a3257f3044..9151e62684 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -31,6 +31,7 @@
namespace Hopkins {
#define PALETTE_SIZE 256
+#define PALETTE_BLOCK_SIZE (PALETTE_SIZE * 3)
struct RGB8 {
byte r;
@@ -52,8 +53,8 @@ public:
byte *PAL_PIXELS;
int nbrligne;
byte TABLE_COUL[256];
- byte cmap[PALETTE_SIZE * 3];
- byte Palette[PALETTE_SIZE * 3];
+ byte cmap[PALETTE_BLOCK_SIZE];
+ byte Palette[PALETTE_BLOCK_SIZE];
bool Linear;
Graphics::Surface *VideoPtr;
Graphics::Surface VESA_SCREEN;
@@ -70,7 +71,8 @@ public:
int nbrligne2;
int Agr_x, Agr_y;
int Agr_Flag_x, Agr_Flag_y;
-
+ int FADESPD;
+ byte PALPCX[800];
public:
GraphicsManager();
~GraphicsManager();
@@ -92,6 +94,15 @@ public:
void m_scroll2A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY);
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 fade_in(const byte *palette, int step, const byte *surface);
+ void fade_out(const byte *palette, int step, const byte *surface);
+ void FADE_INS();
+ void FADE_OUTS();
+ void FADE_INW();
+ void FADE_OUTW();
+ void setpal_vga256(const byte *palette);
+ void CHANGE_PALETTE(const byte *palette);
+ void DD_VBL();
};
class ObjectManager {
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index cae33551b8..916e7202e5 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -68,8 +68,11 @@ Common::Error HopkinsEngine::run() {
_graphicsManager.DD_Unlock();
_graphicsManager.LOAD_IMAGE("LINUX");
- /*
- FADE_INW();
+
+#ifdef HOPKINS_DEBUG
+ _graphicsManager.FADE_INW();
+ delay(1500);
+/*
SDL_Delay(1500);
FADE_OUTW();
if ( !internet )
@@ -469,6 +472,7 @@ LABEL_128:
}
}
*/
+#else
// Copy vesa surface to screen
_graphicsManager.DD_Lock();
memcpy((byte *)_graphicsManager.VideoPtr->pixels, (byte *)_graphicsManager.VESA_SCREEN.pixels,
@@ -481,7 +485,7 @@ LABEL_128:
while (g_system->getEventManager()->pollEvent(evt))
g_system->updateScreen();
}
-
+#endif
return Common::kNoError;
}
@@ -587,4 +591,12 @@ void HopkinsEngine::Init_Interrupt() {
// TODO: Determine whether the timer is needed
}
+void HopkinsEngine::delay(int delay) {
+ uint32 delayEnd = g_system->getMillis() + delay;
+
+ while (!g_vm->shouldQuit() && g_system->getMillis() < delayEnd) {
+ g_system->delayMillis(10);
+ }
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h
index 1a2e6961b2..c9c956ed53 100644
--- a/engines/hopkins/hopkins.h
+++ b/engines/hopkins/hopkins.h
@@ -95,6 +95,7 @@ public:
bool getIsDemo() const;
int getRandomNumber(int maxNumber);
+ void delay(int delay);
};
// Global reference to the HopkinsEngine object