aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2012-09-28 22:15:59 +1000
committerPaul Gilbert2012-09-28 22:15:59 +1000
commit7c9ad56aac27ea9dc799abc50314a0cdaa3fe0d9 (patch)
treea503d89c2743b60794b14d24f85e44f102687277
parent221050f39f677bcbc1396d7e24d70a3e8ed98a75 (diff)
downloadscummvm-rg350-7c9ad56aac27ea9dc799abc50314a0cdaa3fe0d9.tar.gz
scummvm-rg350-7c9ad56aac27ea9dc799abc50314a0cdaa3fe0d9.tar.bz2
scummvm-rg350-7c9ad56aac27ea9dc799abc50314a0cdaa3fe0d9.zip
HOPKINS: Implemented many of the previously stubbed methods
-rw-r--r--engines/hopkins/events.cpp10
-rw-r--r--engines/hopkins/files.cpp13
-rw-r--r--engines/hopkins/files.h2
-rw-r--r--engines/hopkins/font.cpp10
-rw-r--r--engines/hopkins/globals.cpp107
-rw-r--r--engines/hopkins/globals.h45
-rw-r--r--engines/hopkins/graphics.cpp133
-rw-r--r--engines/hopkins/graphics.h8
-rw-r--r--engines/hopkins/hopkins.cpp6
-rw-r--r--engines/hopkins/hopkins.h1
-rw-r--r--engines/hopkins/objects.cpp608
-rw-r--r--engines/hopkins/objects.h41
-rw-r--r--engines/hopkins/talk.cpp151
-rw-r--r--engines/hopkins/talk.h4
14 files changed, 920 insertions, 219 deletions
diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp
index fc7c12238a..9482b4ce09 100644
--- a/engines/hopkins/events.cpp
+++ b/engines/hopkins/events.cpp
@@ -36,7 +36,7 @@ EventsManager::EventsManager() {
mouse_linux = false;
souris_sizex = souris_sizey = 0;
ofset_souris_x = ofset_souris_y = 0;
- start_x = start_y = 0;
+ _vm->_eventsManager.start_x = start_y = 0;
CASSE = false;
souris_n = 0;
souris_bb = 0;
@@ -85,14 +85,14 @@ void EventsManager::souris_max() {
}
int EventsManager::XMOUSE() {
- souris_x = start_x + g_system->getEventManager()->getMousePos().x;
+ souris_x = _vm->_eventsManager.start_x + g_system->getEventManager()->getMousePos().x;
souris_y = g_system->getEventManager()->getMousePos().y;
return souris_x + ofset_souris_x;
}
int EventsManager::YMOUSE() {
- souris_x = start_x + g_system->getEventManager()->getMousePos().x;
+ souris_x = _vm->_eventsManager.start_x + g_system->getEventManager()->getMousePos().x;
souris_y = g_system->getEventManager()->getMousePos().y;
return souris_y + ofset_souris_y;
@@ -446,13 +446,13 @@ LABEL_65:
}
_vm->_globals.NBBLOC = 0;
- start_x = v4;
+ _vm->_eventsManager.start_x = v4;
ofscroll = v4;
SCROLL = v4;
}
OLD_SCROLL = v4;
- start_x = v4;
+ _vm->_eventsManager.start_x = v4;
ofscroll = v4;
}
diff --git a/engines/hopkins/files.cpp b/engines/hopkins/files.cpp
index 4e8eb0d80f..f84b597c9a 100644
--- a/engines/hopkins/files.cpp
+++ b/engines/hopkins/files.cpp
@@ -125,6 +125,15 @@ void FileManager::DMESS1() {
// No implementation in original
}
+void FileManager::bload(const Common::String &file, byte *buf) {
+ Common::File f;
+ if (!f.open(file))
+ error("Error openinig file - %s", file.c_str());
+ int32 filesize = f.size();
+ FileManager::bload_it(f, buf, filesize);
+ f.close();
+}
+
int FileManager::bload_it(Common::ReadStream &stream, void *buf, size_t nbytes) {
return stream.read(buf, nbytes);
}
@@ -325,4 +334,8 @@ uint32 FileManager::FLONG(const Common::String &filename) {
return size;
}
+void FileManager::CONSTRUIT_LINUX(const Common::String &file) {
+ warning("TODO: CONSTRUIT_LINUX");
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/files.h b/engines/hopkins/files.h
index b323006110..9a587efa80 100644
--- a/engines/hopkins/files.h
+++ b/engines/hopkins/files.h
@@ -39,12 +39,14 @@ public:
static byte *CHARGE_FICHIER(const Common::String &file);
static void DMESS();
static void DMESS1();
+ static void bload(const Common::String &file, byte *buf);
static int bload_it(Common::ReadStream &stream, void *buf, size_t nbytes);
static void F_Censure();
static int CONSTRUIT_SYSTEM(const Common::String &file);
static void CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file);
static byte *LIBERE_FICHIER(byte *ptr);
static byte *RECHERCHE_CAT(const Common::String &file, int a2);
+ static void CONSTRUIT_LINUX(const Common::String &file);
/**
* Returns the size of a file. Throws an error if the file can't be found
diff --git a/engines/hopkins/font.cpp b/engines/hopkins/font.cpp
index bbf83518a0..5618ea9767 100644
--- a/engines/hopkins/font.cpp
+++ b/engines/hopkins/font.cpp
@@ -330,7 +330,7 @@ void FontManager::BOITE(int idx, int fileIndex, const Common::String &filename,
if (v17 < 0)
v17 = -v17;
*Txt[idx].field8 = 320 - v17;
- v73 = start_x + 320 - v17;
+ v73 = _vm->_eventsManager.start_x + 320 - v17;
v58 = 1;
v18 = 0;
@@ -432,10 +432,10 @@ LABEL_57:
} while (v68 <= 19);
if ((unsigned __int16)(Txt[idx].field3FC - 2) > 1u) {
- for (i = xp - start_x; largeur_boite + i > 638 && i > -2 && Txt[idx].field3FC]; i -= 2)
+ for (i = xp - _vm->_eventsManager.start_x; largeur_boite + i > 638 && i > -2 && Txt[idx].field3FC]; i -= 2)
;
Txt[idx].field8 = i;
- v73 = start_x + i;
+ v73 = _vm->_eventsManager.start_x + i;
} else {
if (nbrligne == 639) {
while (largeur_boite + v73 > 638 && v73 > -2)
@@ -462,8 +462,8 @@ LABEL_57:
v27 = -v27;
Txt[v26].field8 = 315 - v27;
- v28 = start_x + 315 - v27;
- v73 = start_x + 315 - v27;
+ v28 = _vm->_eventsManager.start_x + 315 - v27;
+ v73 = _vm->_eventsManager.start_x + 315 - v27;
Txt[v26].fieldA = 50;
v70 = 50;
v55 = 50;
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp
index 7074e05c0b..7caf57c7b6 100644
--- a/engines/hopkins/globals.cpp
+++ b/engines/hopkins/globals.cpp
@@ -21,6 +21,7 @@
*/
#include "common/textconsole.h"
+#include "common/file.h"
#include "hopkins/globals.h"
#include "hopkins/files.h"
#include "hopkins/font.h"
@@ -718,4 +719,110 @@ byte *Globals::LIBERE_FICHIER(byte *p) {
return PTRNUL;
}
+void Globals::RESET_CACHE() {
+ byte *dataP;
+
+ for (int idx = 1; idx <= 5; ++idx) {
+ dataP = CACHE_BANQUE[idx];
+ if (dataP != PTRNUL && dataP)
+ CACHE_BANQUE[idx] = dos_free2(CACHE_BANQUE[idx]);
+ CACHE_BANQUE[idx] = PTRNUL;
+ }
+
+ for (int idx = 0; idx <= 20; ++idx) {
+ Cache[idx].fieldC = PTRNUL;
+ Cache[idx].field0 = 0;
+ Cache[idx].field4 = 0;
+ Cache[idx].field2 = 0;
+ Cache[idx].fieldA = 0;
+ Cache[idx].field6 = 0;
+ Cache[idx].field8 = 0;
+ Cache[idx].field10 = 0;
+ Cache[idx].field12 = 0;
+ Cache[idx].field14 = 0;
+ }
+
+ CACHEFLAG = 0;
+}
+
+void Globals::CACHE_ON() {
+ CACHEFLAG = 1;
+}
+
+void Globals::CACHE_OFF() {
+ CACHEFLAG = 0;
+}
+
+void Globals::CACHE_SUB(int idx) {
+ Cache[idx].fieldA = 0;
+}
+
+void Globals::CACHE_ADD(int idx) {
+ Cache[idx].fieldA = 1;
+}
+
+void Globals::CHARGE_CACHE(const Common::String &file) {
+ byte *v2;
+ int v4;
+ int v5;
+ int v6;
+ int v8;
+ int v9;
+ int v11;
+ byte *spriteData;
+ byte *ptr;
+ int v14;
+ int v15;
+ Common::String v16;
+ Common::File f;
+
+ RESET_CACHE();
+ FileManager::CONSTRUIT_FICHIER(HOPLINK, file);
+ ptr = FileManager::CHARGE_FICHIER(NFICHIER);
+ v16 = Common::String((const char *)ptr);
+
+ FileManager::CONSTRUIT_FICHIER(HOPLINK, v16);
+
+ if (!f.exists(NFICHIER)) {
+ spriteData = FileManager::CHARGE_FICHIER(NFICHIER);
+ CACHE_BANQUE[1] = spriteData;
+ v15 = 60;
+ v14 = 0;
+ do {
+ v11 = READ_LE_UINT16((uint16 *)ptr + v15);
+ v4 = READ_LE_UINT16((uint16 *)ptr + v15 + 1);
+ v5 = READ_LE_UINT16((uint16 *)ptr + v15 + 2);
+ v6 = v14;
+ Cache[v6].field14 = READ_LE_UINT16((uint16 *)ptr + v15 + 4);
+ Cache[v6].field2 = v11;
+ Cache[v6].field0 = v4;
+ Cache[v6].field4 = v5;
+ Cache[v6].field12 = 1;
+ if (spriteData == PTRNUL) {
+ Cache[v14].fieldA = 0;
+ } else {
+ v8 = _vm->_objectsManager.Get_Largeur(spriteData, v11);
+ v9 = _vm->_objectsManager.Get_Hauteur(spriteData, v11);
+ Cache[v14].fieldC = spriteData;
+ Cache[v14].field6 = v8;
+ Cache[v14].field8 = v9;
+ Cache[v14].fieldA = 1;
+ }
+
+ if ( !Cache[v14].field0 && !Cache[v14].field4 && !Cache[v14].field2)
+ Cache[v14].fieldA = 0;
+ v15 += 5;
+ ++v14;
+ } while (v14 <= 21);
+ CACHE_ON();
+ v2 = ptr;
+ }
+ dos_free2(v2);
+}
+
+void Globals::B_CACHE_OFF(int idx) {
+ Bob[idx].field34 = 1;
+}
+
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/globals.h b/engines/hopkins/globals.h
index 9d94873a09..ffb80fd9a0 100644
--- a/engines/hopkins/globals.h
+++ b/engines/hopkins/globals.h
@@ -72,8 +72,17 @@ struct ListeItem {
int field0;
int field2;
int field4;
- int x2;
- int y2;
+ int width;
+ int height;
+ int fieldA;
+};
+
+struct Liste2Item {
+ int field0;
+ int field2;
+ int field4;
+ int width;
+ int height;
};
struct BobItem {
@@ -113,14 +122,6 @@ struct BobItem {
int field4A;
};
-struct Liste2Item {
- int field0;
- int field2;
- int field4;
- int field6;
- int field8;
-};
-
struct BlAnimItem {
uint32 v1;
uint32 v2;
@@ -174,13 +175,19 @@ struct CacheItem {
int field6;
int field8;
int fieldA;
+ byte *fieldC;
int field10;
+ int field12;
int field14;
};
// Note: Fields decimal based for now
struct Sauvegarde {
int field4;
+ int field80;
+ int field170;
+ int field171;
+ int field172;
int field353;
int field354;
int field355;
@@ -249,12 +256,12 @@ public:
BqeAnimItem Bqe_Anim[35];
BankItem Bank[8];
BobItem Bob[36];
+ ListeItem Liste[6];
Liste2Item Liste2[35];
BlAnimItem BL_ANIM[30];
VBobItem VBob[35];
ObjetWItem ObjetW[300];
BlocItem BLOC[250];
- ListeItem Liste[7];
CacheItem Cache[25];
byte *Winventaire;
byte *texte_tmp;
@@ -293,10 +300,12 @@ public:
int HELICO;
uint32 CAT_POSI;
uint32 CAT_TAILLE;
+ bool CAT_FLAG;
int iRegul;
bool BPP_NOAFF;
int SORTIE;
int PLANX, PLANY;
+ int PLANI;
int PASSWORD;
int NOSPRECRAN;
int ECRAN;
@@ -322,9 +331,15 @@ public:
int opt_music;
int opt_txt;
int NBTRI;
+ int AFFLI;
+ int AFFIVBL;
+ int NOT_VERIF;
bool CACHEFLAG;
int AFFINVEN;
bool NOPARLE;
+ bool PLAN_FLAG;
+ int GOACTION;
+ int NECESSAIRE;
Globals();
~Globals();
@@ -339,6 +354,14 @@ public:
byte *dos_malloc2(int count);
byte *dos_free2(byte *p);
byte *LIBERE_FICHIER(byte *p);
+
+ void RESET_CACHE();
+ void CACHE_ON();
+ void CACHE_OFF();
+ void CACHE_SUB(int idx);
+ void CACHE_ADD(int idx);
+ void CHARGE_CACHE(const Common::String &file);
+ void B_CACHE_OFF(int idx);
};
#define PTRNUL (byte *)NULL
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index d8ad4de283..e1d360e731 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -43,7 +43,7 @@ GraphicsManager::GraphicsManager() {
nbrligne = 0;
Linear = false;
VideoPtr = NULL;
- start_x = 0;
+ _vm->_eventsManager.start_x = 0;
ofscroll = 0;
SCROLL = 0;
PCX_L = PCX_H = 0;
@@ -262,7 +262,7 @@ void GraphicsManager::INIT_TABLE(int a1, int a2, byte *palette) {
int GraphicsManager::SCROLL_ECRAN(int amount) {
int result = CLIP(amount, 0, SCREEN_WIDTH);
- start_x = result;
+ _vm->_eventsManager.start_x = result;
ofscroll = result;
SCROLL = result;
return result;
@@ -325,6 +325,10 @@ void GraphicsManager::Trans_bloc(byte *destP, byte *srcP, int count, int param1,
} while ( !breakFlag);
}
+void GraphicsManager::Trans_bloc2(byte *surface, byte *col, int size) {
+ warning("TODO: Trans_bloc2");
+}
+
// TODO: See if it's feasible and/or desirable to change this to use the Common PCX decoder
void GraphicsManager::A_PCX640_480(byte *surface, const Common::String &file, byte *palette, bool typeFlag) {
int filesize;
@@ -811,9 +815,9 @@ void GraphicsManager::fade_in(const byte *palette, int step, const byte *surface
setpal_vga256(palData2);
if (Winbpp == 2) {
if (SDL_ECHELLE)
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
DD_VBL();
}
}
@@ -824,9 +828,9 @@ void GraphicsManager::fade_in(const byte *palette, int step, const byte *surface
// Refresh the screen
if (Winbpp == 2) {
if (SDL_ECHELLE)
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
DD_VBL();
}
}
@@ -859,9 +863,9 @@ void GraphicsManager::fade_out(const byte *palette, int step, const byte *surfac
setpal_vga256(palData);
if (Winbpp == 2) {
if (SDL_ECHELLE)
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
DD_VBL();
}
@@ -880,9 +884,9 @@ void GraphicsManager::fade_out(const byte *palette, int step, const byte *surfac
setpal_vga256(palData);
if (Winbpp == 2) {
if (SDL_ECHELLE)
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
DD_VBL();
}
@@ -899,7 +903,7 @@ void GraphicsManager::fade_out(const byte *palette, int step, const byte *surfac
if (Winbpp == 2) {
if (!SDL_ECHELLE) {
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
return DD_VBL();
}
goto LABEL_28;
@@ -913,12 +917,12 @@ void GraphicsManager::fade_out(const byte *palette, int step, const byte *surfac
setpal_vga256(palData);
if (Winbpp == 2) {
if (!SDL_ECHELLE) {
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
return DD_VBL();
}
LABEL_28:
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
return DD_VBL();
}
}
@@ -953,9 +957,9 @@ void GraphicsManager::setpal_vga256_linux(const byte *palette, const byte *surfa
if (Winbpp == 2) {
if (SDL_ECHELLE)
- m_scroll16A(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
- m_scroll16(surface, start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
DD_VBL();
}
@@ -1494,17 +1498,17 @@ void GraphicsManager::Affiche_Segment_Vesa() {
dstRect.top = bloc.y1 * 2 + 30;
dstRect.setWidth((bloc.x2 - bloc.x1) * 2);
dstRect.setHeight((bloc.y2 - bloc.y1) * 2);
- } else if (bloc.x2 > start_x && bloc.x1 < (start_x + SCREEN_WIDTH)) {
- if (bloc.x1 < start_x)
- bloc.x1 = start_x;
- if (bloc.x2 > (start_x + SCREEN_WIDTH))
- bloc.x2 = start_x + SCREEN_WIDTH;
+ } else if (bloc.x2 > _vm->_eventsManager.start_x && bloc.x1 < (_vm->_eventsManager.start_x + SCREEN_WIDTH)) {
+ if (bloc.x1 < _vm->_eventsManager.start_x)
+ bloc.x1 = _vm->_eventsManager.start_x;
+ if (bloc.x2 > (_vm->_eventsManager.start_x + SCREEN_WIDTH))
+ bloc.x2 = _vm->_eventsManager.start_x + SCREEN_WIDTH;
if (!SDL_ECHELLE) {
// Calculate the bounds
int xp = Magic_Number(bloc.x1) - 4;
- if (xp < start_x)
- xp = start_x;
+ if (xp < _vm->_eventsManager.start_x)
+ xp = _vm->_eventsManager.start_x;
int yp = Magic_Number(bloc.y1) - 4;
if (yp < 0)
yp = 0;
@@ -1515,30 +1519,30 @@ void GraphicsManager::Affiche_Segment_Vesa() {
if (height < 4)
height = 4;
- if ((xp - start_x + width) > SCREEN_WIDTH)
+ if ((xp - _vm->_eventsManager.start_x + width) > SCREEN_WIDTH)
xp -= 4;
if ((height - yp) > (SCREEN_HEIGHT - 40))
yp -= 4;
if (Winbpp == 2) {
m_scroll16A(VESA_BUFFER, xp, yp, width, height,
- Reel_Zoom(xp - start_x, SDL_ECHELLE), Reel_Zoom(yp, SDL_ECHELLE));
+ Reel_Zoom(xp - _vm->_eventsManager.start_x, SDL_ECHELLE), Reel_Zoom(yp, SDL_ECHELLE));
} else {
m_scroll2A(VESA_BUFFER, xp, yp, width, height,
- Reel_Zoom(xp - start_x, SDL_ECHELLE), Reel_Zoom(yp, SDL_ECHELLE));
+ Reel_Zoom(xp - _vm->_eventsManager.start_x, SDL_ECHELLE), Reel_Zoom(yp, SDL_ECHELLE));
}
- dstRect.left = Reel_Zoom(xp - start_x, SDL_ECHELLE);
+ dstRect.left = Reel_Zoom(xp - _vm->_eventsManager.start_x, SDL_ECHELLE);
dstRect.top = Reel_Zoom(yp, SDL_ECHELLE);
dstRect.setWidth(Reel_Zoom(width, SDL_ECHELLE));
dstRect.setHeight(Reel_Zoom(height, SDL_ECHELLE));
} else {
if (Winbpp == 2) {
m_scroll16(VESA_BUFFER, bloc.x1, bloc.y1, bloc.x2 - bloc.x1, bloc.y2 - bloc.y1,
- bloc.x1 - start_x, bloc.y1);
+ bloc.x1 - _vm->_eventsManager.start_x, bloc.y1);
} else {
m_scroll(VESA_BUFFER, bloc.x1, bloc.y1, bloc.x2 - bloc.x1, bloc.y2 - bloc.y1,
- bloc.x1 - start_x, bloc.y1);
+ bloc.x1 - _vm->_eventsManager.start_x, bloc.y1);
}
}
}
@@ -2131,10 +2135,10 @@ void GraphicsManager::AFFICHE_SPEED(const byte *spriteData, int xp, int yp, int
Ajoute_Segment_Vesa(xp, yp, xp + width, yp + height);
}
-void GraphicsManager::SCOPY(const byte *surface, int x1, int y1, int x2, int y2, byte *destSurface, int destX, int destY) {
+void GraphicsManager::SCOPY(const byte *surface, int x1, int y1, int width, int height, byte *destSurface, int destX, int destY) {
int top;
- int width;
- int height;
+ int croppedWidth;
+ int croppedHeight;
int v11;
int height2;
int top2;
@@ -2142,28 +2146,28 @@ void GraphicsManager::SCOPY(const byte *surface, int x1, int y1, int x2, int y2,
left = x1;
top = y1;
- width = x2;
- height = y2;
+ croppedWidth = width;
+ croppedHeight = height;
if (x1 < min_x) {
- width = x2 - (min_x - x1);
+ croppedWidth = width - (min_x - x1);
left = min_x;
}
if (y1 < min_y) {
- height = y2 - (min_y - y1);
+ croppedHeight = height - (min_y - y1);
top = min_y;
}
top2 = top;
- if (top + height > max_y)
- height = max_y - top;
- v11 = left + width;
+ if (top + croppedHeight > max_y)
+ croppedHeight = max_y - top;
+ v11 = left + croppedWidth;
if (v11 > max_x)
- width = max_x - left;
+ croppedWidth = max_x - left;
- if (width > 0 && height > 0) {
- height2 = height;
- Copy_Mem(surface, left, top2, width, height, destSurface, destX, destY);
- Ajoute_Segment_Vesa(left, top2, left + width, top2 + height2);
+ if (croppedWidth > 0 && croppedHeight > 0) {
+ height2 = croppedHeight;
+ Copy_Mem(surface, left, top2, croppedWidth, croppedHeight, destSurface, destX, destY);
+ Ajoute_Segment_Vesa(left, top2, left + croppedWidth, top2 + height2);
}
}
@@ -2241,4 +2245,47 @@ void GraphicsManager::Affiche_Fonte(byte *surface, const byte *spriteData, int x
} while (v16 != 1);
}
+void GraphicsManager::INI_ECRAN(const Common::String &file) {
+ warning("TODO: INI_ECRAN");
+}
+
+void GraphicsManager::INI_ECRAN2(const Common::String &file) {
+ warning("TODO: INI_ECRAN2");
+}
+
+void GraphicsManager::NB_SCREEN() {
+ byte *v0;
+ const byte *v1;
+
+ if (!_vm->_globals.NECESSAIRE)
+ INIT_TABLE(50, 65, Palette);
+ if (nbrligne == SCREEN_WIDTH)
+ Trans_bloc2(VESA_BUFFER, TABLE_COUL, 307200);
+ if (nbrligne == 1280)
+ Trans_bloc2(VESA_BUFFER, TABLE_COUL, 614400);
+ _vm->_graphicsManager.DD_Lock();
+ if (Winbpp == 2) {
+ if (SDL_ECHELLE)
+ m_scroll16A(VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ else
+ m_scroll16(VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ }
+ if (Winbpp == 1) {
+ if (SDL_ECHELLE)
+ m_scroll2A(VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ else
+ m_scroll2(VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
+ }
+ _vm->_graphicsManager.DD_Unlock();
+
+ v0 = VESA_SCREEN;
+ v1 = VESA_BUFFER;
+ memcpy(VESA_SCREEN, VESA_BUFFER, 0x95FFCu);
+ v1 = v1 + 614396;
+ v0 = v0 + 614396;
+ *v0 = *v1;
+ *(v0 + 2) = *(v1 + 2);
+ DD_VBL();
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index 4a567e9a00..8e64e44785 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -68,7 +68,6 @@ public:
Graphics::Surface *VideoPtr;
byte *VESA_SCREEN;
byte *VESA_BUFFER;
- int start_x;
int ofscroll;
int SCROLL;
byte HEADER_PCX[128];
@@ -98,6 +97,7 @@ public:
int Largeur;
int Compteur_y;
int spec_largeur;
+ bool NOFADE;
public:
GraphicsManager();
~GraphicsManager();
@@ -113,6 +113,7 @@ public:
void INIT_TABLE(int a1, int a2, byte *a3);
int SCROLL_ECRAN(int amount);
void Trans_bloc(byte *destP, byte *srcP, int count, int param1, int param2);
+ void Trans_bloc2(byte *surface, byte *col, int size);
void A_PCX640_480(byte *surface, const Common::String &file, byte *palette, bool typeFlag);
void Cls_Pal();
void souris_max();
@@ -165,9 +166,12 @@ public:
int Reel_Reduc(int v, int percentage);
void Affiche_Perfect(byte *destSurface, const byte *srcData, int a3, int a4, int a5, int a6, int a7, int a8);
void AFFICHE_SPEED(const byte *spriteData, int xp, int yp, int spriteIndex);
- void SCOPY(const byte *surface, int x1, int y1, int x2, int y2, byte *destSurface, int destX, int destY);
+ void SCOPY(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, unsigned int width, int height, byte *destSurface, int destX, int destY);
void Affiche_Fonte(byte *surface, const byte *spriteData, int xp, int yp, int characterIndex, int transColour);
+ void INI_ECRAN(const Common::String &file);
+ void INI_ECRAN2(const Common::String &file);
+ void NB_SCREEN();
};
} // End of namespace Hopkins
diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp
index a13f9c0cdf..1da0295b35 100644
--- a/engines/hopkins/hopkins.cpp
+++ b/engines/hopkins/hopkins.cpp
@@ -197,7 +197,7 @@ LABEL_13:
if (GLOBALS.SORTIE != 4)
break;
_globals.DESACTIVE_INVENT = true;
- PLAN_BETA();
+ _objectsManager.PLAN_BETA();
_globals.DESACTIVE_INVENT = false;
}
@@ -925,10 +925,6 @@ void HopkinsEngine::REST_SYSTEM() {
_eventsManager.CONTROLE_MES();
}
-void HopkinsEngine::PLAN_BETA() {
- warning("PLAN_BETA");
-}
-
void HopkinsEngine::PUBQUIT() {
_globals.PUBEXIT = 1;
_graphicsManager.RESET_SEGMENT_VESA();
diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h
index 7692a83643..7930eae32b 100644
--- a/engines/hopkins/hopkins.h
+++ b/engines/hopkins/hopkins.h
@@ -82,7 +82,6 @@ private:
void PASS();
void REST_SYSTEM();
- void PLAN_BETA();
void PERSONAGE(const Common::String &s1, const Common::String &s2, const Common::String &s3,
const Common::String &s4, int v);
void PERSONAGE2(const Common::String &s1, const Common::String &s2, const Common::String &s3,
diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp
index 170692d9e4..b943def1bd 100644
--- a/engines/hopkins/objects.cpp
+++ b/engines/hopkins/objects.cpp
@@ -233,17 +233,17 @@ int ObjectsManager::AJOUTE_OBJET(int objIndex) {
void ObjectsManager::AFF_SPRITES() {
int v0;
- __int16 v1;
- __int16 v2;
- __int16 destX;
- __int16 destY;
+ int v1;
+ int v2;
+ int destX;
+ int destY;
int v5;
- __int16 v6;
- __int16 v7;
- __int16 v8;
- __int16 v9;
+ int v6;
+ int v7;
+ int v8;
+ int v9;
int v10;
- __int16 v11;
+ int v11;
uint16 *v12;
int v13;
int v14;
@@ -252,24 +252,24 @@ void ObjectsManager::AFF_SPRITES() {
int v17;
int v18;
int v19;
- __int16 v20;
- __int16 v21;
- __int16 v23;
- __int16 v24;
- __int16 v25;
- __int16 v26;
- __int16 v27;
- __int16 v28;
- __int16 v29;
- __int16 v30;
- __int16 v31;
- __int16 v32;
- __int16 v33;
- signed __int16 v34;
- signed __int16 v35;
- signed __int16 v36;
- __int16 v37;
- __int16 v38;
+ int v20;
+ int v21;
+ int v23;
+ int v24;
+ int v25;
+ int v26;
+ int v27;
+ int v28;
+ int v29;
+ int v30;
+ int v31;
+ int v32;
+ int v33;
+ signed int v34;
+ signed int v35;
+ signed int v36;
+ int v37;
+ int v38;
uint16 arr[50];
_vm->_globals.NBTRI = 0;
@@ -323,8 +323,9 @@ void ObjectsManager::AFF_SPRITES() {
if (v9 < _vm->_graphicsManager.min_y)
v9 = _vm->_graphicsManager.min_y;
- _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, v29, v24, _vm->_globals.Liste[v31].x2 + 4,
- _vm->_globals.Liste[v31].y2 + 4, _vm->_graphicsManager.VESA_BUFFER, v8, v9);
+ _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, v29, v24,
+ _vm->_globals.Liste[v31].width + 4, _vm->_globals.Liste[v31].height + 4,
+ _vm->_graphicsManager.VESA_BUFFER, v8, v9);
_vm->_globals.Liste[v5].field0 = 0;
}
++v31;
@@ -544,23 +545,23 @@ void ObjectsManager::BOB_ZERO(int idx) {
item.field0 = 0;
item.field2 = 0;
item.field4 = 0;
- item.field6 = 0;
- item.field8 = 0;
+ item.width = 0;
+ item.height = 0;
}
void ObjectsManager::DEF_BOB(int idx) {
int v2;
int v3;
int v4;
- __int16 v5;
- __int16 v6;
- __int16 v7;
- __int16 v8;
- __int16 v9;
- __int16 v10;
+ int v5;
+ int v6;
+ int v7;
+ int v8;
+ int v9;
+ int v10;
int v11;
- __int16 v12;
- __int16 v13;
+ int v12;
+ int v13;
v2 = idx;
if (_vm->_globals.Bob[v2].field40) {
@@ -582,31 +583,31 @@ void ObjectsManager::DEF_BOB(int idx) {
_vm->_globals.Liste2[v3].field4 = v13;
v4 = idx;
- _vm->_globals.Liste2[v3].field6 = _vm->_globals.Bob[v4].field46;
- _vm->_globals.Liste2[v3].field8 = _vm->_globals.Bob[v4].field48;
+ _vm->_globals.Liste2[v3].width = _vm->_globals.Bob[v4].field46;
+ _vm->_globals.Liste2[v3].height = _vm->_globals.Bob[v4].field48;
v5 = _vm->_globals.Liste2[v3].field2;
v6 = _vm->_graphicsManager.min_x;
if (v5 < _vm->_graphicsManager.min_x) {
- _vm->_globals.Liste2[v3].field6 -= _vm->_graphicsManager.min_x - v5;
+ _vm->_globals.Liste2[v3].width -= _vm->_graphicsManager.min_x - v5;
_vm->_globals.Liste2[v3].field2 = v6;
}
v7 = _vm->_globals.Liste2[v3].field4;
v8 = _vm->_graphicsManager.min_y;
if (v7 < _vm->_graphicsManager.min_y) {
- _vm->_globals.Liste2[v3].field8 -= _vm->_graphicsManager.min_y - v7;
+ _vm->_globals.Liste2[v3].height -= _vm->_graphicsManager.min_y - v7;
_vm->_globals.Liste2[v3].field4 = v8;
}
v9 = _vm->_globals.Liste2[v3].field2;
- if (_vm->_globals.Liste2[v3].field6 + v9 > _vm->_graphicsManager.max_x)
- _vm->_globals.Liste2[v3].field6 = _vm->_graphicsManager.max_x - v9;
+ if (_vm->_globals.Liste2[v3].width + v9 > _vm->_graphicsManager.max_x)
+ _vm->_globals.Liste2[v3].width = _vm->_graphicsManager.max_x - v9;
v10 = _vm->_globals.Liste2[v3].field4;
- if (_vm->_globals.Liste2[v3].field8 + v10 > _vm->_graphicsManager.max_y)
- _vm->_globals.Liste2[v3].field8 = _vm->_graphicsManager.max_y - v10;
+ if (_vm->_globals.Liste2[v3].height + v10 > _vm->_graphicsManager.max_y)
+ _vm->_globals.Liste2[v3].height = _vm->_graphicsManager.max_y - v10;
- if (_vm->_globals.Liste2[v3].field6 <= 0 || _vm->_globals.Liste2[v3].field8 <= 0)
+ if (_vm->_globals.Liste2[v3].width <= 0 || _vm->_globals.Liste2[v3].height <= 0)
_vm->_globals.Liste2[v3].field0 = 0;
v11 = idx;
@@ -614,8 +615,8 @@ void ObjectsManager::DEF_BOB(int idx) {
_vm->_graphicsManager.Ajoute_Segment_Vesa(
_vm->_globals.Liste2[v11].field2,
_vm->_globals.Liste2[v11].field4,
- _vm->_globals.Liste2[v11].field2 + _vm->_globals.Liste2[v11].field6,
- _vm->_globals.Liste2[v11].field4 + _vm->_globals.Liste2[v11].field8);
+ _vm->_globals.Liste2[v11].field2 + _vm->_globals.Liste2[v11].width,
+ _vm->_globals.Liste2[v11].field4 + _vm->_globals.Liste2[v11].height);
}
}
@@ -677,13 +678,13 @@ void ObjectsManager::BOB_OFF(int idx) {
void ObjectsManager::SCBOB(int idx) {
int v1;
- signed __int16 v2;
- signed __int16 v3;
- signed __int16 v4;
- signed __int16 v6;
- signed __int16 v7;
- __int16 v8;
- signed __int16 v9;
+ signed int v2;
+ signed int v3;
+ signed int v4;
+ signed int v6;
+ signed int v7;
+ int v8;
+ signed int v9;
v1 = idx;
if (_vm->_globals.Cache[idx].fieldA > 0) {
@@ -703,9 +704,9 @@ void ObjectsManager::SCBOB(int idx) {
v1 =_vm->_globals.Cache[idx].field14 +_vm->_globals.Cache[idx].field8 + v4;
if (v6 > v4) {
- if (v6 < (signed __int16)v1) {
+ if (v6 < (signed int)v1) {
v1 = 0;
- if (v9 >= v3 && v9 <= (signed __int16)(_vm->_globals.Cache[idx].field6 + v3)) {
+ if (v9 >= v3 && v9 <= (signed int)(_vm->_globals.Cache[idx].field6 + v3)) {
++_vm->_globals.Cache[idx].fieldA;
v1 = 1;
}
@@ -742,23 +743,23 @@ void ObjectsManager::SCBOB(int idx) {
}
void ObjectsManager::CALCUL_BOB(int idx) {
- __int16 result;
- __int16 v3;
- __int16 v4;
- __int16 v5;
- __int16 v6;
+ int result;
+ int v3;
+ int v4;
+ int v5;
+ int v6;
int v7;
int v8;
int v9;
int v10;
int v11;
- __int16 v13;
- __int16 v14;
- __int16 v15;
- __int16 v17;
- signed __int16 v20;
- __int16 v21;
- __int16 v22;
+ int v13;
+ int v14;
+ int v15;
+ int v17;
+ signed int v20;
+ int v21;
+ int v22;
_vm->_globals.Bob[idx].field3C = 0;
if (_vm->_globals.Bob[idx].field3A == 1) {
@@ -786,12 +787,12 @@ void ObjectsManager::CALCUL_BOB(int idx) {
v20 = 0;
v7 = _vm->_globals.Bob[idx].field36;
- if ((signed __int16)v7 < 0) {
- v7 = (signed __int16)v7;
- if ((signed __int16)v7 < 0)
+ if ((signed int)v7 < 0) {
+ v7 = (signed int)v7;
+ if ((signed int)v7 < 0)
v7 = -v7;
v20 = v7;
- if ((signed __int16)v7 > 95)
+ if ((signed int)v7 > 95)
v20 = 95;
}
if (_vm->_globals.Bob[idx].field36 > 0)
@@ -804,7 +805,7 @@ void ObjectsManager::CALCUL_BOB(int idx) {
if (v15 < 0)
v8 = -v15;
v15 = v8;
- v22 = -(signed __int16)_vm->_graphicsManager.Reel_Zoom((signed __int16)v8, v21);
+ v22 = -(signed int)_vm->_graphicsManager.Reel_Zoom((signed int)v8, v21);
}
if (v6 >= 0) {
v17 = _vm->_graphicsManager.Reel_Zoom(v6, v21);
@@ -813,7 +814,7 @@ void ObjectsManager::CALCUL_BOB(int idx) {
if (v15 < 0)
v9 = -v15;
v6 = v9;
- v17 = -(signed __int16)_vm->_graphicsManager.Reel_Zoom((signed __int16)v9, v21);
+ v17 = -(signed int)_vm->_graphicsManager.Reel_Zoom((signed int)v9, v21);
}
}
@@ -825,7 +826,7 @@ void ObjectsManager::CALCUL_BOB(int idx) {
if (v15 < 0)
v10 = -v15;
v15 = v10;
- v22 = -(signed __int16)_vm->_graphicsManager.Reel_Reduc((signed __int16)v10, v20);
+ v22 = -(signed int)_vm->_graphicsManager.Reel_Reduc((signed int)v10, v20);
}
if (v6 >= 0) {
v17 = _vm->_graphicsManager.Reel_Reduc(v6, v20);
@@ -833,7 +834,7 @@ void ObjectsManager::CALCUL_BOB(int idx) {
v11 = v15;
if (v15 < 0)
v11 = -v15;
- v17 = -(signed __int16)_vm->_graphicsManager.Reel_Reduc((signed __int16)v11, v20);
+ v17 = -(signed int)_vm->_graphicsManager.Reel_Reduc((signed int)v11, v20);
}
}
@@ -862,25 +863,25 @@ void ObjectsManager::CALCUL_BOB(int idx) {
width = _vm->_graphicsManager.Reel_Reduc(width, v20);
}
- _vm->_globals.Liste2[idx].field6 = width;
- _vm->_globals.Liste2[idx].field8 = height;
+ _vm->_globals.Liste2[idx].width = width;
+ _vm->_globals.Liste2[idx].height = height;
_vm->_globals.Bob[idx].field42 = width;
_vm->_globals.Bob[idx].field44 = height;
}
}
void ObjectsManager::VERIFCACHE() {
- __int16 v1;
- signed __int16 v2;
- signed __int16 v3;
- signed __int16 v4;
- __int16 v5;
- __int16 v6;
- __int16 v7;
- __int16 v8;
- __int16 v9;
- __int16 v10;
- __int16 v11;
+ int v1;
+ signed int v2;
+ signed int v3;
+ signed int v4;
+ int v5;
+ int v6;
+ int v7;
+ int v8;
+ int v9;
+ int v10;
+ int v11;
v8 = 0;
do {
@@ -954,7 +955,7 @@ void ObjectsManager::VERIFCACHE() {
}
void ObjectsManager::INVENT_ANIM() {
- __int16 v0;
+ int v0;
signed int v1;
if (!DESACTIVE_INVENT) {
@@ -1001,16 +1002,16 @@ void ObjectsManager::INVENT_ANIM() {
void ObjectsManager::DEF_SPRITE(int idx) {
int v2;
- __int16 v3;
- __int16 v4;
+ int v3;
+ int v4;
int v5;
int v6;
- __int16 v7;
- __int16 v8;
- __int16 v9;
- __int16 v10;
- __int16 v11;
- __int16 v12;
+ int v7;
+ int v8;
+ int v9;
+ int v10;
+ int v11;
+ int v12;
int v13;
v2 = idx;
@@ -1026,29 +1027,29 @@ void ObjectsManager::DEF_SPRITE(int idx) {
v5 = idx;
v6 = idx;
- _vm->_globals.Liste[v5].x2 = Sprite[v6].field30;
- _vm->_globals.Liste[v5].y2 = Sprite[v6].field32;
+ _vm->_globals.Liste[v5].width = Sprite[v6].field30;
+ _vm->_globals.Liste[v5].height = Sprite[v6].field32;
v7 = _vm->_globals.Liste[v5].field2;
v8 = _vm->_graphicsManager.min_x;
if (v7 < _vm->_graphicsManager.min_x) {
- _vm->_globals.Liste[v5].x2 -= _vm->_graphicsManager.min_x - v7;
+ _vm->_globals.Liste[v5].width -= _vm->_graphicsManager.min_x - v7;
_vm->_globals.Liste[v5].field2 = v8;
}
v9 = _vm->_globals.Liste[v5].field4;
v10 = _vm->_graphicsManager.min_y;
if (v9 < _vm->_graphicsManager.min_y) {
- _vm->_globals.Liste[v5].y2 -= _vm->_graphicsManager.min_y - v9;
+ _vm->_globals.Liste[v5].height -= _vm->_graphicsManager.min_y - v9;
_vm->_globals.Liste[v5].field4 = v10;
}
v11 = _vm->_globals.Liste[v5].field2;
- if (_vm->_globals.Liste[v5].x2 + v11 > _vm->_graphicsManager.max_x)
- _vm->_globals.Liste[v5].x2 = _vm->_graphicsManager.max_x - v11;
+ if (_vm->_globals.Liste[v5].width + v11 > _vm->_graphicsManager.max_x)
+ _vm->_globals.Liste[v5].width = _vm->_graphicsManager.max_x - v11;
v12 = _vm->_globals.Liste[v5].field4;
- if ( _vm->_globals.Liste[v5].y2 + v12 > _vm->_graphicsManager.max_y)
- _vm->_globals.Liste[v5].y2 = _vm->_graphicsManager.max_y - v12;
- if ( _vm->_globals.Liste[v5].x2 <= 0 || _vm->_globals.Liste[v5].y2 <= 0)
+ if ( _vm->_globals.Liste[v5].height + v12 > _vm->_graphicsManager.max_y)
+ _vm->_globals.Liste[v5].height = _vm->_graphicsManager.max_y - v12;
+ if ( _vm->_globals.Liste[v5].width <= 0 || _vm->_globals.Liste[v5].height <= 0)
_vm->_globals.Liste[v5].field0 = 0;
v13 = idx;
@@ -1056,8 +1057,8 @@ void ObjectsManager::DEF_SPRITE(int idx) {
_vm->_graphicsManager.Ajoute_Segment_Vesa(
_vm->_globals.Liste[v13].field2,
_vm->_globals.Liste[v13].field4,
- _vm->_globals.Liste[v13].field2 + _vm->_globals.Liste[v13].x2,
- _vm->_globals.Liste[v13].field4 + _vm->_globals.Liste[v13].y2);
+ _vm->_globals.Liste[v13].field2 + _vm->_globals.Liste[v13].width,
+ _vm->_globals.Liste[v13].field4 + _vm->_globals.Liste[v13].height);
}
}
@@ -1074,21 +1075,21 @@ void ObjectsManager::DEF_CACHE(int idx) {
void ObjectsManager::CALCUL_SPRITE(int idx) {
int width, height;
- __int16 v3;
- __int16 v4;
- __int16 v5;
- __int16 v6;
- __int16 v7;
- __int16 v8;
+ int v3;
+ int v4;
+ int v5;
+ int v6;
+ int v7;
+ int v8;
int v9;
int v10;
int v11;
int v12;
int v13;
- __int16 v15;
- __int16 v16;
+ int v15;
+ int v16;
int v17;
- __int16 v22;
+ int v22;
Sprite[idx + 42].field2A = 0;
int v0 = Sprite[idx].field10;
@@ -1112,12 +1113,12 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
int reducePercent = 0;
v9 = Sprite[idx].fieldC;
- if ((signed __int16)v9 < 0) {
- v9 = (signed __int16)v9;
- if ((signed __int16)v9 < 0)
+ if ((signed int)v9 < 0) {
+ v9 = (signed int)v9;
+ if ((signed int)v9 < 0)
v9 = -v9;
reducePercent = v9;
- if ((signed __int16)v9 > 95)
+ if ((signed int)v9 > 95)
reducePercent = 95;
}
if (Sprite[idx].fieldC > 0)
@@ -1132,7 +1133,7 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
if (v4 < 0)
v10 = -v4;
v4 = v10;
- v22 = -_vm->_graphicsManager.Reel_Zoom((signed __int16)v10, zoomPercent);
+ v22 = -_vm->_graphicsManager.Reel_Zoom((signed int)v10, zoomPercent);
}
if (v8 >= 0) {
@@ -1142,7 +1143,7 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
if (v4 < 0)
v11 = -v4;
v8 = v11;
- v7 = -_vm->_graphicsManager.Reel_Zoom((signed __int16)v11, zoomPercent);
+ v7 = -_vm->_graphicsManager.Reel_Zoom((signed int)v11, zoomPercent);
}
}
if (reducePercent) {
@@ -1153,7 +1154,7 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
if (v4 < 0)
v12 = -v4;
v4 = v12;
- v22 = -_vm->_graphicsManager.Reel_Reduc((signed __int16)v12, reducePercent);
+ v22 = -_vm->_graphicsManager.Reel_Reduc((signed int)v12, reducePercent);
}
if (v8 >= 0) {
v7 = _vm->_graphicsManager.Reel_Reduc(v8, reducePercent);
@@ -1161,7 +1162,7 @@ void ObjectsManager::CALCUL_SPRITE(int idx) {
v13 = v4;
if (v4 < 0)
v13 = -v4;
- v7 = -_vm->_graphicsManager.Reel_Reduc((signed __int16)v13, reducePercent);
+ v7 = -_vm->_graphicsManager.Reel_Reduc((signed int)v13, reducePercent);
}
}
@@ -1212,25 +1213,25 @@ int ObjectsManager::AvantTri(int a1, int a2, int a3) {
void ObjectsManager::AFF_BOB_ANIM() {
signed int v1;
- __int16 v2;
- signed __int16 v5;
- __int16 v6;
- __int16 v7;
- __int16 v8;
- signed __int16 v10;
- __int16 v11;
+ int v2;
+ signed int v5;
+ int v6;
+ int v7;
+ int v8;
+ signed int v10;
+ int v11;
int v12;
int v13;
- __int16 v14;
+ int v14;
int v18;
int v19;
byte *v20;
byte *v21;
int v22;
- __int16 v24;
- __int16 v26;
- __int16 v27;
- __int16 v28;
+ int v24;
+ int v26;
+ int v27;
+ int v28;
int idx = 0;
do {
@@ -1265,7 +1266,7 @@ void ObjectsManager::AFF_BOB_ANIM() {
if (_vm->_globals.BL_ANIM[idx].v1 == 1)
_vm->_globals.Bob[idx].field8 = _vm->_globals.BL_ANIM[idx].v2;
if ( PERSO_ON == 1 && idx > 20 )
- _vm->_globals.Bob[idx].field8 += _vm->_graphicsManager.start_x;
+ _vm->_globals.Bob[idx].field8 += _vm->_eventsManager.start_x;
_vm->_globals.Bob[idx].fieldA = READ_LE_UINT16(v20 + 2 * v24 + 2);
_vm->_globals.Bob[idx].field12 = READ_LE_UINT16(v20 + 2 * v24 + 4);
@@ -1284,7 +1285,7 @@ LABEL_37:
LABEL_38:
v12 = idx;
- if ((unsigned __int16)(_vm->_globals.Bob[v12].field1E - 1) <= 1u)
+ if ((unsigned int)(_vm->_globals.Bob[v12].field1E - 1) <= 1u)
_vm->_globals.Bob[v12].field1C = 1;
continue;
}
@@ -1306,7 +1307,7 @@ LABEL_38:
if (_vm->_globals.BL_ANIM[idx].v1 == 1)
_vm->_globals.Bob[idx].field8 = _vm->_globals.BL_ANIM[idx].v2;
if (PERSO_ON == 1 && idx > 20)
- _vm->_globals.Bob[idx].field8 += _vm->_graphicsManager.start_x;
+ _vm->_globals.Bob[idx].field8 += _vm->_eventsManager.start_x;
_vm->_globals.Bob[idx].fieldA = READ_LE_UINT16(v21 + 2);
_vm->_globals.Bob[idx].field12 = READ_LE_UINT16(v21 + 4);
@@ -1354,7 +1355,7 @@ LABEL_38:
if (_vm->_globals.Liste2[v27].field0) {
_vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN,
_vm->_globals.Liste2[v27].field2, _vm->_globals.Liste2[v27].field4,
- _vm->_globals.Liste2[v27].field6, _vm->_globals.Liste2[v27].field8,
+ _vm->_globals.Liste2[v27].width, _vm->_globals.Liste2[v27].height,
_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.Liste2[v27].field2,
_vm->_globals.Liste2[v27].field4);
_vm->_globals.Liste2[v27].field0 = 0;
@@ -1369,7 +1370,7 @@ LABEL_38:
if (_vm->_globals.Liste2[v27].field0) {
_vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN,
_vm->_globals.Liste2[v27].field2, _vm->_globals.Liste2[v27].field4,
- _vm->_globals.Liste2[v27].field6, _vm->_globals.Liste2[v27].field8,
+ _vm->_globals.Liste2[v27].width, _vm->_globals.Liste2[v27].height,
_vm->_graphicsManager.VESA_BUFFER,
_vm->_globals.Liste2[v27].field2, _vm->_globals.Liste2[v27].field4);
_vm->_globals.Liste2[v27].field0 = 0;
@@ -1512,4 +1513,319 @@ void ObjectsManager::AFF_VBOB() {
} while ( idx <= 29 );
}
+int ObjectsManager::XSPR(int idx) {
+ if (idx > 5)
+ error("request of the Coord. x a sprite > MAX_SPRITE.");
+ return Sprite[idx].field8;
+}
+
+int ObjectsManager::YSPR(int idx) {
+ if (idx > 5)
+ error("request of the Coord. y a sprite > MAX_SPRITE.");
+ return Sprite[idx].fieldA;
+}
+
+void ObjectsManager::SPRITE_NOW(const byte *spriteData, int a2, int a3, int a4, int a5, int a6, int a7, int a8) {
+ _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, spriteData, a2, a3, a5, a6, a7, a8);
+}
+
+void ObjectsManager::CLEAR_SPR() {
+ int idx;
+
+ idx = 0;
+ do {
+ Sprite[idx].field1C = PTRNUL;
+ Sprite[idx].spriteData = PTRNUL;
+ Sprite[idx].field0 = 0;
+ ++idx;
+ } while (idx <= 4);
+
+ idx = 0;
+ do {
+ _vm->_globals.Liste[idx].field0 = 0;
+ _vm->_globals.Liste[idx].field2 = 0;
+ _vm->_globals.Liste[idx].field4 = 0;
+ _vm->_globals.Liste[idx].width = 0;
+ _vm->_globals.Liste[idx].height = 0;
+ _vm->_globals.Liste[idx].fieldA = 0;
+ ++idx;
+ } while (idx <= 4);
+}
+
+void ObjectsManager::SPRITE_ON(int idx) {
+ if (idx > 5)
+ error("Tentative d'affichage d'un sprite > MAX_SPRITE.");
+
+ Sprite[idx].field0 = 1;
+}
+
+void ObjectsManager::SPRITE(const byte *spriteData, int a2, int a3, int idx, int a5, int a6, int a7, int a8, int a9) {
+ if (idx > 5 )
+ (8, (int)"Tentative d'affichage d'un sprite > MAX_SPRITE.");
+ Sprite[idx].spriteData = spriteData;
+ Sprite[idx].field8 = a2;
+ Sprite[idx].fieldA = a3;
+ Sprite[idx].field10 = a5;
+ Sprite[idx].fieldC = a6;
+ Sprite[idx].field12 = a8;
+ Sprite[idx].field14 = a9;
+ Sprite[idx].field1C = PTRNUL;
+ Sprite[idx].field20 = 0;
+ Sprite[idx].field24 = 0;
+ Sprite[idx].field26 = 0;
+ Sprite[idx].field22 = 0;
+ Sprite[idx].field0 = 0;
+ Sprite[idx].field28 = 0;
+ Sprite[idx].fieldE = a7;
+ if (*spriteData == 'R' && *(spriteData + 1) == 'L' && *(spriteData + 2) == 'E')
+ Sprite[idx].field28 = 1;
+
+ if (Sprite[idx].field28 == 1) {
+ Sprite[idx].fieldC = 0;
+ Sprite[idx].fieldE = 0;
+ }
+}
+
+void ObjectsManager::SPRITE2(const byte *spriteData, int idx, byte *a3, int a4, int a5) {
+ Sprite[idx].spriteData = spriteData;
+ Sprite[idx].field1C = a3;
+ Sprite[idx].field20 = a4;
+ Sprite[idx].field24 = 0;
+ Sprite[idx].field26 = 0;
+ Sprite[idx].fieldC = 0;
+ Sprite[idx].fieldE = 0;
+ Sprite[idx].field0 = 1;
+ Sprite[idx].field22 = 0;
+ Sprite[idx].field14 = a5;
+ if (*spriteData == 'R' && *(spriteData + 1) == 'L' && *(spriteData + 2) == 'E')
+ Sprite[idx].field28 = 1;
+
+ if (Sprite[idx].field28 == 1) {
+ Sprite[idx].fieldC = 0;
+ Sprite[idx].fieldE = 0;
+ }
+}
+
+void ObjectsManager::SPRITE_OFF(int idx) {
+ Sprite[idx].field0 = 3;
+ if (Sprite[idx].field1C != PTRNUL)
+ _vm->_globals.dos_free2(Sprite[idx].field1C);
+ Sprite[idx].field1C = PTRNUL;
+}
+
+void ObjectsManager::SPRITE_GEL(int idx) {
+ Sprite[idx].field0 = 3;
+}
+
+int ObjectsManager::SXSPR(int idx) {
+ if (idx > 5)
+ error("request of the size of a sprite x > MAX_SPRITE.");
+ return Get_Largeur(Sprite[idx].spriteData, Sprite[idx].field10);
+}
+
+int ObjectsManager::SYSPR(int idx) {
+ if (idx > 5)
+ error("request of the size of a sprite y > MAX_SPRITE.");
+ return Get_Hauteur(Sprite[idx].spriteData, Sprite[idx].field10);
+}
+
+int ObjectsManager::POSISPR(int idx) {
+ return Sprite[idx].field22 / 6;
+}
+
+void ObjectsManager::SETPOSISPR(int idx, int a2) {
+ Sprite[idx].field22 = 6 * a2;
+ Sprite[idx].field24 = 0;
+ Sprite[idx].field26 = 0;
+}
+
+void ObjectsManager::SETXSPR(int idx, int xp) {
+ if (idx > 5)
+ error("Set the Coord. x a sprite> MAX_SPRITE.");
+ Sprite[idx].field8 = xp;
+}
+
+void ObjectsManager::SETANISPR(int idx, int a2) {
+ if (idx > 5)
+ error("Set the Coord. x a sprite> MAX_SPRITE.");
+
+ Sprite[idx].field10 = a2;
+}
+
+void ObjectsManager::SETYSPR(int idx, int yp) {
+ if ( idx > 5 )
+ error("Set the Coord. y a sprite> MAX_SPRITE.");
+ Sprite[idx].fieldA = yp;
+}
+
+void ObjectsManager::SETTAILLESPR(int idx, int a2) {
+ if (idx > 5)
+ error("Set the Coord. there a sprite> MAX_SPRITE.");
+
+ if (Sprite[idx].field28 != 1)
+ Sprite[idx].fieldC = a2;
+}
+
+void ObjectsManager::SETFLIPSPR(int idx, int a2) {
+ if (Sprite[idx].field28 != 1) {
+ if (idx > 5)
+ error("Set the Coord. there a sprite> MAX_SPRITE.");
+ Sprite[idx].fieldE = a2;
+ }
+}
+
+void ObjectsManager::VERIFZONE() {
+ warning("VERIFZONE");
+}
+
+void ObjectsManager::GOHOME2() {
+ warning("GOHOME2");
+}
+
+void ObjectsManager::CHARGE_OBSTACLE(const Common::String &file) {
+ warning("CHARGE_OBSTACLE");
+}
+
+void ObjectsManager::CHARGE_CACHE(const Common::String &file) {
+ warning("CHARGE_CACHE");
+}
+
+void ObjectsManager::CHARGE_ZONE(const Common::String &file) {
+ warning("CHARGE_ZONE");
+}
+
+void ObjectsManager::PLAN_BETA() {
+ int v1;
+ int v2;
+ int v3;
+ int v4;
+ int v5;
+
+ v1 = 0;
+ INVENTFLAG = false;
+ KEY_INVENT = 0;
+ _vm->_globals.Max_Propre = 1;
+ _vm->_globals.Max_Ligne_Long = 1;
+ _vm->_globals.Max_Propre_Gen = 1;
+ _vm->_globals.Max_Perso_Y = 440;
+ _vm->_globals.NOSPRECRAN = 1;
+ _vm->_globals.PLAN_FLAG = 1;
+ _vm->_graphicsManager.NOFADE = false;
+ _vm->_globals.NOMARCHE = 0;
+ sprite_ptr = PTRNUL;
+ _vm->_globals.SORTIE = 0;
+ _vm->_globals.AFFLI = 0;
+ _vm->_globals.AFFIVBL = 0;
+ _vm->_globals.NOT_VERIF = 1;
+ _vm->_soundManager.WSOUND(31);
+ _vm->_globals.iRegul = 1;
+ _vm->_graphicsManager.LOAD_IMAGE("PLAN");
+ CHARGE_OBSTACLE("PLAN.OB2");
+ CHARGE_CACHE("PLAN.CA2");
+ CHARGE_ZONE("PLAN.ZO2");
+ FileManager::CONSTRUIT_SYSTEM("VOITURE.SPR");
+ sprite_ptr = FileManager::CHARGE_FICHIER(_vm->_globals.NFICHIER);
+ _vm->_animationManager.CHARGE_ANIM("PLAN");
+ _vm->_graphicsManager.VISU_ALL();
+ _vm->_graphicsManager.INI_ECRAN2("PLAN");
+ v2 = 0;
+ do {
+ _vm->_globals.B_CACHE_OFF(v2++);
+ } while (v2 <= 15);
+ _vm->_globals.B_CACHE_OFF(19);
+ _vm->_globals.B_CACHE_OFF(20);
+ _vm->_globals.CACHE_ON();
+
+ if (!_vm->_globals.PLANX && !_vm->_globals.PLANY) {
+ _vm->_globals.PLANX = 900;
+ _vm->_globals.PLANY = 319;
+ _vm->_globals.PLANI = 1;
+ }
+ SPRITE(sprite_ptr, _vm->_globals.PLANX, _vm->_globals.PLANY, 0, _vm->_globals.PLANI, 0, 0, 5, 5);
+ _vm->_eventsManager.souris_xy(_vm->_globals.PLANX, _vm->_globals.PLANY);
+ my_anim = 0;
+ _vm->_eventsManager.MOUSE_ON();
+ v3 = XSPR(0);
+ _vm->_graphicsManager.SCROLL_ECRAN(v3 - 320);
+ _vm->_graphicsManager.ofscroll = XSPR(0) - 320;
+ SPRITE_ON(0);
+ _vm->_globals.chemin = PTRNUL;
+ _vm->_graphicsManager.SETCOLOR3(252, 100, 100, 100);
+ _vm->_graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _vm->_graphicsManager.SETCOLOR3(251, 100, 100, 100);
+ _vm->_graphicsManager.SETCOLOR3(254, 0, 0, 0);
+ _vm->_globals.BPP_NOAFF = 1;
+
+ v4 = 0;
+ do {
+ _vm->_eventsManager.VBL();
+ ++v4;
+ } while (v4 <= 4);
+
+ _vm->_globals.BPP_NOAFF = 0;
+ _vm->_globals.iRegul = 1;
+ _vm->_graphicsManager.FADE_INW();
+ _vm->_eventsManager.CHANGE_MOUSE(4);
+ _vm->_graphicsManager.NOFADE = false;
+
+ do {
+ v5 = _vm->_eventsManager.BMOUSE();
+ if (v5) {
+ if (_vm->_globals.SAUVEGARDE->field170 == 1 && !_vm->_globals.SAUVEGARDE->field171) {
+ _vm->_globals.SAUVEGARDE->field171 = 1;
+ _vm->_globals.NOPARLE = true;
+ _vm->_talkManager.PARLER_PERSO("APPEL1.pe2");
+ _vm->_globals.NOPARLE = false;
+ v5 = 0;
+ }
+ if (_vm->_globals.SAUVEGARDE->field80 == 1 && !_vm->_globals.SAUVEGARDE->field172) {
+ _vm->_globals.SAUVEGARDE->field172 = 1;
+ _vm->_globals.NOPARLE = 1;
+ _vm->_talkManager.PARLER_PERSO("APPEL2.pe2");
+ _vm->_globals.NOPARLE = 0;
+ v5 = 0;
+ _vm->_eventsManager.souris_bb = false;
+ }
+ if (v5 == 1)
+ BTGAUCHE();
+ }
+
+ VERIFZONE();
+ GOHOME2();
+
+ if (_vm->_globals.chemin == PTRNUL && _vm->_globals.GOACTION == 1)
+ PARADISE();
+ _vm->_eventsManager.VBL();
+
+ if (_vm->_globals.SORTIE)
+ v1 = 1;
+ } while (v1 != 1);
+
+ if (!_vm->_graphicsManager.NOFADE)
+ _vm->_graphicsManager.FADE_OUTW();
+ _vm->_globals.iRegul = 0;
+ _vm->_graphicsManager.NOFADE = false;
+ _vm->_globals.PLANX = XSPR(0);
+ _vm->_globals.PLANY = YSPR(0);
+ _vm->_globals.PLANI = 1;
+ SPRITE_OFF(0);
+ _vm->_globals.AFFLI = 0;
+ sprite_ptr = _vm->_globals.LIBERE_FICHIER(sprite_ptr);
+ CLEAR_ECRAN();
+ _vm->_globals.NOSPRECRAN = 0;
+ _vm->_globals.PLAN_FLAG = 0;
+}
+
+void ObjectsManager::BTGAUCHE() {
+ warning("TODO: BTGAUCHE");
+}
+
+void ObjectsManager::PARADISE() {
+ warning("TODO: PARADISE");
+}
+
+void ObjectsManager::CLEAR_ECRAN() {
+ warning("TODO: CLEAR_ECRAN");
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/objects.h b/engines/hopkins/objects.h
index 8212fa7dee..d17764881b 100644
--- a/engines/hopkins/objects.h
+++ b/engines/hopkins/objects.h
@@ -31,7 +31,7 @@ namespace Hopkins {
struct SpriteItem {
int field0;
- byte *spriteData;
+ const byte *spriteData;
int field8;
int fieldA;
int fieldC;
@@ -39,6 +39,11 @@ struct SpriteItem {
int field10;
int field12;
int field14;
+ byte *field1C;
+ int field20;
+ int field22;
+ int field24;
+ int field26;
int field28;
int field2A;
int field2C;
@@ -68,6 +73,7 @@ public:
byte *inventaire2;
byte *SL_SPR;
byte *SL_SPR2;
+ byte *sprite_ptr;
bool PERSO_ON;
bool SL_FLAG;
bool FLAG_VISIBLE;
@@ -75,6 +81,9 @@ public:
int DESACTIVE_CURSOR;
bool BOBTOUS;
SpriteItem Sprite[6];
+ bool INVENTFLAG;
+ int KEY_INVENT;
+ int my_anim;
public:
ObjectsManager();
void setParent(HopkinsEngine *vm);
@@ -112,6 +121,36 @@ public:
int AvantTri(int a1, int a2, int a3);
void AFF_BOB_ANIM();
void AFF_VBOB();
+
+ int XSPR(int idx);
+ int YSPR(int idx);
+ void SPRITE_NOW(const byte *spriteData, int a2, int a3, int a4, int a5, int a6, int a7, int a8);
+
+ void CLEAR_SPR();
+ void SPRITE_ON(int idx);
+ void SPRITE(const byte *spriteData, int a2, int a3, int idx, int a5, int a6, int a7, int a8, int a9);
+ void SPRITE2(const byte *spriteData, int idx, byte *a3, int a4, int a5);
+ void SPRITE_OFF(int idx);
+ void SPRITE_GEL(int idx);
+ int SXSPR(int idx);
+ int SYSPR(int idx);
+ int POSISPR(int idx);
+ void SETPOSISPR(int idx, int a2);
+ void SETXSPR(int idx, int xp);
+ void SETANISPR(int idx, int a2);
+ void SETYSPR(int idx, int yp);
+ void SETTAILLESPR(int idx, int a2);
+ void SETFLIPSPR(int idx, int a2);
+
+ void VERIFZONE();
+ void GOHOME2();
+ void CHARGE_OBSTACLE(const Common::String &file);
+ void CHARGE_CACHE(const Common::String &file);
+ void CHARGE_ZONE(const Common::String &file);
+ void PLAN_BETA();
+ void BTGAUCHE();
+ void PARADISE();
+ void CLEAR_ECRAN();
};
} // End of namespace Hopkins
diff --git a/engines/hopkins/talk.cpp b/engines/hopkins/talk.cpp
index 0051c4efc1..2043f9a245 100644
--- a/engines/hopkins/talk.cpp
+++ b/engines/hopkins/talk.cpp
@@ -37,6 +37,145 @@ void TalkManager::setParent(HopkinsEngine *vm) {
_vm = vm;
}
+void TalkManager::PARLER_PERSO(const Common::String &filename) {
+ int v2;
+ int v3;
+ int v4;
+ int v5;
+ int v6;
+ int v7;
+ byte *v8;
+ byte *v9;
+ byte *v10;
+ int v11;
+ byte v13;
+ int v14;
+ int v15;
+ Common::String v16;
+
+ v15 = 0;
+ _vm->_fontManager.TEXTE_OFF(5);
+ _vm->_fontManager.TEXTE_OFF(9);
+ _vm->_eventsManager.VBL();
+ _vm->_graphicsManager.no_scroll = 1;
+ v13 = _vm->_globals.DESACTIVE_INVENT;
+ _vm->_globals.DESACTIVE_INVENT = 1;
+ BUFFERPERSO = FileManager::RECHERCHE_CAT(filename, 5);
+ TAILLEPERSO = _vm->_globals.CAT_TAILLE;
+ if (BUFFERPERSO == PTRNUL) {
+ FileManager::CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, filename);
+ BUFFERPERSO = FileManager::CHARGE_FICHIER(_vm->_globals.NFICHIER);
+ TAILLEPERSO = FileManager::FLONG(_vm->_globals.NFICHIER);
+ }
+ _vm->_globals.SAUVEGARDE->field4 = 0;
+ RENVOIE_FICHIER(40, v16, (const char *)BUFFERPERSO);
+ RENVOIE_FICHIER(0, FQUEST, (const char *)BUFFERPERSO);
+ RENVOIE_FICHIER(20, FREPON, (const char *)BUFFERPERSO);
+ if (_vm->_globals.FR == 1) {
+ FREPON = FQUEST = "RUE.TXT";
+ } else if (!_vm->_globals.FR) {
+ FREPON = FQUEST = "RUEAN.TXT";
+ } else if (_vm->_globals.FR == 2) {
+ FREPON = FQUEST = "RUEES.TXT";
+ }
+ v2 = READ_LE_UINT16((uint16 *)BUFFERPERSO + 40);
+ v3 = 20 * READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110;
+ PCHERCHE = 20 * READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110;
+ PERSOSPR = FileManager::RECHERCHE_CAT(v16, 7);
+ if (PERSOSPR) {
+ _vm->_globals.CAT_FLAG = 0;
+ FileManager::CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, v16);
+ } else {
+ _vm->_globals.CAT_FLAG = 1;
+ FileManager::CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_SAN.RES");
+ }
+ PERSOSPR = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER);
+ _vm->_globals.CAT_FLAG = 0;
+ FileManager::CONSTRUIT_LINUX("TEMP.SCR");
+ if (_vm->_graphicsManager.nbrligne == 640)
+ FileManager::SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x4B000u);
+ if (_vm->_graphicsManager.nbrligne == 1280)
+ FileManager::SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x96000u);
+ if (!_vm->_graphicsManager.nbrligne)
+ _vm->_graphicsManager.ofscroll = 0;
+ _vm->_graphicsManager.NB_SCREEN();
+ _vm->_objectsManager.PERSO_ON = 1;
+ CHERCHE_PAL(v3, 0);
+ CHERCHE_ANIM0(v3, 0);
+ ANIM_PERSO_INIT();
+ PLIGNE1 = v2;
+ PLIGNE2 = v2 + 1;
+ PLIGNE3 = v2 + 2;
+ PLIGNE4 = v2 + 3;
+ v14 = _vm->_eventsManager.btsouris;
+ _vm->_eventsManager.btsouris = 4;
+ _vm->_eventsManager.CHANGE_MOUSE(0);
+ if (!_vm->_globals.NOPARLE) {
+ v4 = v2 + 3;
+ do {
+ v5 = DIALOGUE();
+ if ((signed __int16)v5 != v4)
+ v15 = DIALOGUE_REP(v5);
+ if (v15 == -1)
+ v5 = v2 + 3;
+ _vm->_eventsManager.VBL();
+ } while ((signed __int16)v5 != v4);
+ }
+ if (_vm->_globals.NOPARLE == 1) {
+ v6 = 1;
+ do
+ v7 = DIALOGUE_REP(v6++);
+ while (v7 != -1);
+ }
+ CLEAR_ANIM_PERSO();
+ _vm->_globals.NOPARLE = 0;
+ _vm->_globals.NECESSAIRE = 1;
+ BUFFERPERSO = FileManager::LIBERE_FICHIER(BUFFERPERSO);
+ PERSOSPR = FileManager::LIBERE_FICHIER(PERSOSPR);
+ _vm->_graphicsManager.NB_SCREEN();
+ _vm->_globals.NECESSAIRE = 0;
+ FileManager::CONSTRUIT_LINUX("TEMP.SCR");
+ FileManager::bload(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN);
+ _vm->_objectsManager.PERSO_ON = 0;
+ _vm->_eventsManager.btsouris = v14;
+
+ _vm->_eventsManager.CHANGE_MOUSE(v14);
+ _vm->_graphicsManager.SETCOLOR3(253, 100, 100, 100);
+ _vm->_graphicsManager.INIT_TABLE(145, 150, _vm->_graphicsManager.Palette);
+ _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette);
+ _vm->_graphicsManager.DD_LOCK();
+ if (_vm->_graphicsManager.Winbpp == 2) {
+ if (_vm->_graphicsManager.SDL_ECHELLE)
+ _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x, 0, 640, 480, 0, 0);
+ else
+ _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x, 0, 640, 480, 0, 0);
+ }
+ if (_vm->_graphicsManager.Winbpp == 1) {
+ if (_vm->_graphicsManager.SDL_ECHELLE)
+ _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x, 0, 640, 480, 0, 0);
+ else
+ _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x, 0, 640, 480, 0, 0);
+ }
+ _vm->_graphicsManager.DD_UNLOCK();
+ v8 = _vm->_graphicsManager.VESA_BUFFER;
+ v9 = _vm->_graphicsManager.VESA_SCREEN;
+ memcpy(_vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.VESA_SCREEN, 0x95FFCu);
+ v9 = v9 + 614396;
+ v8 = v8 + 614396;
+ *v8 = *v9;
+ v8 = v8 + 2;
+ *v8 = *(v9 + 2);
+ v10 = v8 + 1;
+ _vm->_globals.DESACTIVE_INVENT = v13;
+ _vm->_graphicsManager.DD_VBL();
+ v11 = 0;
+ do {
+ _vm->_eventsManager.VBL();
+ ++v11;
+ } while (v11 <= 4);
+ _vm->_graphicsManager.no_scroll = 0;
+}
+
void TalkManager::PARLER_PERSO2(const Common::String &filename) {
int v1;
int v2;
@@ -598,4 +737,16 @@ void TalkManager::BOB_VISU_PARLE(int idx) {
}
}
+void TalkManager::CHERCHE_ANIM0(int a1, int a2) {
+ warning("TODO: CHERCHE_ANIM0");
+}
+
+void TalkManager::ANIM_PERSO_INIT() {
+ warning("TODO: ANIM_PERSO_INIT");
+}
+
+void TalkManager::CLEAR_ANIM_PERSO() {
+ warning("TODO: CLEAR_ANIM_PERSO");
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/talk.h b/engines/hopkins/talk.h
index 6e6cb2d608..137ff983d4 100644
--- a/engines/hopkins/talk.h
+++ b/engines/hopkins/talk.h
@@ -48,6 +48,7 @@ public:
void setParent(HopkinsEngine *vm);
void PARLER_PERSO2(const Common::String &filename);
+ void PARLER_PERSO(const Common::String &filename);
void RENVOIE_FICHIER(int srcStart, Common::String &dest, const char *srcData);
int DIALOGUE();
int DIALOGUE_REP(int idx);
@@ -58,6 +59,9 @@ public:
int VERIF_BOITE(__int16 a1, const Common::String &a2, __int16 a3);
void VISU_PARLE();
void BOB_VISU_PARLE(int idx);
+ void CHERCHE_ANIM0(int a1, int a2);
+ void ANIM_PERSO_INIT();
+ void CLEAR_ANIM_PERSO();
};
} // End of namespace Hopkins