Skip to content

Commit

Permalink
HOPKINS: Implemented image loading code
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Sep 9, 2012
1 parent 42a09f0 commit 97e84b2
Show file tree
Hide file tree
Showing 8 changed files with 844 additions and 118 deletions.
161 changes: 161 additions & 0 deletions engines/hopkins/files.cpp
Expand Up @@ -163,4 +163,165 @@ byte *FileManager::LIBERE_FICHIER(byte *ptr) {
return PTRNUL;
}

bool FileManager::RECHERCHE_CAT(const Common::String &file, int a2) {
byte *ptr; // [sp+1Ch] [bp-40h]@0
Common::File f;

switch (a2) {
case 1:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_INI.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_INI.RES");
break;

case 2:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_REP.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_REP.RES");
break;

case 3:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_LIN.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_LIN.RES");
break;

case 4:
CONSTRUIT_FICHIER(GLOBALS.HOPANIM, "RES_ANI.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
CONSTRUIT_FICHIER(GLOBALS.HOPANIM, "RES_ANI.RES");
break;

case 5:
CONSTRUIT_FICHIER(GLOBALS.HOPANIM, "RES_PER.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
CONSTRUIT_FICHIER(GLOBALS.HOPANIM, "RES_PER.RES");
break;

case 6:
CONSTRUIT_FICHIER(GLOBALS.HOPIMAGE, "PIC.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
break;

case 7:
CONSTRUIT_FICHIER(GLOBALS.HOPANIM, "RES_SAN.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
break;

case 8:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_SLI.CAT");
if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
break;

case 9:
switch (GLOBALS.FR) {
case 0:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_VAN.CAT");
break;
case 1:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_VFR.CAT");
break;
case 2:
CONSTRUIT_FICHIER(GLOBALS.HOPLINK, "RES_VES.CAT");
break;
}

if (!f.exists(GLOBALS.NFICHIER))
return PTRNUL;

ptr = CHARGE_FICHIER(GLOBALS.NFICHIER);
break;
// Deliberate fall-through to
default:
break;
}

// Scan for an entry in the catalogue
const byte *startP = ptr;
int result; // eax@50
void *v22; // ebx@53
bool matchFlag = false;
int offsetVal = 0;

do {
Common::String name = (const char *)startP;

if (file == name) {
// Found entry for file, so get it's details from the catalogue entry
const byte *pData = startP + offsetVal;
startP += offsetVal + 15;
GLOBALS.CAT_POSI = READ_LE_UINT32(pData + 15);
GLOBALS.CAT_TAILLE = READ_LE_UINT32(pData + 19);
matchFlag = true;
}

const char *finishString = "FINIS";
const char *nameP = name.c_str();
int finishRemainingChars = 6;
int v19 = 0;
bool finishMatch = true;

do {
if (!finishRemainingChars)
break;
finishMatch = *finishString++ == *nameP++;
--finishRemainingChars;
} while (finishMatch);

if (!finishMatch)
v19 = *(byte *)(finishString - 1) - *(byte *)(nameP - 1);
if (!v19) {
GLOBALS.dos_free2(ptr);
return PTRNUL;
}

offsetVal += 23;
} while (!matchFlag);
GLOBALS.dos_free2(ptr);

// TODO: Double check whether this really should be an unsigned int comparison
if ((uint16)(a2 - 6) > 1 && (uint16)(a2 - 8) > 1) {
if (!f.open(GLOBALS.NFICHIER))
error("CHARGE_FICHIER");

f.seek(GLOBALS.CAT_POSI);

byte *catData = GLOBALS.dos_malloc2(GLOBALS.CAT_TAILLE);
if (catData == PTRNUL)
error("CHARGE_FICHIER");

bload_it(f, catData, GLOBALS.CAT_TAILLE);
f.close();
result = true;
} else {
result = false;
}

return result;
}

} // End of namespace Hopkins
1 change: 1 addition & 0 deletions engines/hopkins/files.h
Expand Up @@ -43,6 +43,7 @@ class FileManager {
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 bool RECHERCHE_CAT(const Common::String &file, int a2);
};

} // End of namespace Hopkins
Expand Down
7 changes: 5 additions & 2 deletions engines/hopkins/globals.cpp
Expand Up @@ -30,8 +30,6 @@ namespace Hopkins {
Globals::Globals() {
FR = 0;
SVGA = 2;
MANU_SCROLL = 1;
SPEED_SCROLL = 16;
internet = 1;
PUBEXIT = 0;
FADESPD = 15;
Expand Down Expand Up @@ -658,4 +656,9 @@ byte *Globals::dos_malloc2(int count) {
return result;
}

byte *Globals::dos_free2(byte *p) {
free(p);
return PTRNUL;
}

} // End of namespace Hopkins
5 changes: 3 additions & 2 deletions engines/hopkins/globals.h
Expand Up @@ -111,8 +111,6 @@ class Globals {
int FADESPD;
int FR;
int SVGA;
int MANU_SCROLL;
int SPEED_SCROLL;
int internet;
int PUBEXIT;
bool XFULLSCREEN;
Expand Down Expand Up @@ -202,6 +200,8 @@ class Globals {
int OBJL, OBJH;
int Nouv_objet;
int HELICO;
uint32 CAT_POSI;
uint32 CAT_TAILLE;

Globals();
~Globals();
Expand All @@ -213,6 +213,7 @@ class Globals {
void INIT_VBOB();
void CHARGE_OBJET();
byte *dos_malloc2(int count);
byte *dos_free2(byte *p);
};

#define PTRNUL (byte *)NULL
Expand Down

0 comments on commit 97e84b2

Please sign in to comment.