aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/font.cpp367
-rw-r--r--engines/hopkins/graphics.cpp18
-rw-r--r--engines/hopkins/graphics.h2
3 files changed, 178 insertions, 209 deletions
diff --git a/engines/hopkins/font.cpp b/engines/hopkins/font.cpp
index 9049f82eee..aa0c1741a7 100644
--- a/engines/hopkins/font.cpp
+++ b/engines/hopkins/font.cpp
@@ -21,6 +21,7 @@
*/
#include "common/system.h"
+#include "common/file.h"
#include "common/textconsole.h"
#include "hopkins/font.h"
#include "hopkins/files.h"
@@ -108,91 +109,80 @@ void FontManager::DOS_TEXT(int idx, int a2, const Common::String &filename, int
}
void FontManager::BOITE(int idx, int fileIndex, const Common::String &filename, int xp, int yp) {
- /* There's something seriously wrong with the automatic disassembly.. it seems to have
- * an extra code end block. I'll likely need to manually disassemble the method
-
- byte *v5;
- int v6;
- int v7;
- int v8;
+ int filesize;
byte *v9;
- const byte *v10;
+ const byte *v10;
int v11;
- int v12;
- char v13;
- char v14;
- int v15;
+ char v13;
+ char v14;
+ int v15;
char v16;
int v17;
- int v18;
- int v19;
+ int v18;
+ int v19;
int v20;
int v21;
int v22;
- int v23;
+ int v23;
char v24;
int v25;
int v26;
int v27;
int v28;
int v29;
- int v30;
+ int v30;
int v31;
int v32;
- int v33;
+ int v33;
int v34;
int v35;
int v36;
- int v37;
- int v38;
- int v39;
+ int v37;
+ int v38;
int v40;
- int ptr;
- char *ptra;
- int ptrb;
+ int ptrb;
int ptrc;
- void *ptrd;
- void *ptre;
- int s;
+ byte *ptrd;
+ byte *ptre;
+ Common::String s;
int v49;
int v50;
- int v51;
- int v52;
- int v53;
+ int v51;
+ int v52;
+ int v53;
int v54;
int v55;
int v56;
int v57;
int v58;
- void *v59;
- void *v60;
- void *v61;
+ byte *v59;
+ byte *v60;
+ byte *v61;
int v62;
int v63;
int v64;
int v65;
int v66;
- int v67;
+ int v67;
int v68;
- int v69;
- int v70;
- int v71;
- int v72;
- int v73;
+ int v69;
+ int v70;
+ int v71;
+ int v72;
+ int v73;
int i;
int v75;
- Common::String fname;
+ Common::String file;
+ Common::File f;
v73 = xp;
v70 = yp;
v58 = 0;
if (idx < 0)
error("Bad number for text");
-
_vm->_globals.police_l = 11;
- v5 = idx;
- largeur_boite = 11 * Txt[idx].field3FE;
+ _vm->_globals.largeur_boite = 11 * Txt[idx].field3FE;
if (Txt[idx].field408) {
v34 = Txt[idx].field3FC;
if (v34 != 6 && v34 != 1 && v34 != 3 && v34 != 5) {
@@ -202,81 +192,76 @@ void FontManager::BOITE(int idx, int fileIndex, const Common::String &filename,
do {
v40 = idx;
TEXT_NOW1(xp + 5, v72, Txt[idx].field14[v38], Txt[idx].field40A);
- v5 = police_h + v72 + 1;
- v72 += police_h + 1;
+ v72 += _vm->_globals.police_h + 1;
++v38;
idx = v40;
} while (Txt[v40].field12 > v38);
}
} else {
v35 = idx;
- v36 = *(_WORD *)&Txt[v35 + 1030];
- v37 = *(_WORD *)&Txt[v35 + 1028];
-
- _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER,
- Txt[v35].field400, xp, yp, Txt[v35].field404, Txt[v35].field406);
- v5 = _vm->_graphicsManager.Ajoute_Segment_Vesa(xp, yp, xp + v37, yp + v36);
+ v36 = Txt[v35].height;
+ v37 = Txt[v35].width;
+ _vm->_graphicsManager.Restore_Mem(
+ _vm->_graphicsManager.VESA_BUFFER,
+ Txt[v35].field400,
+ xp,
+ yp,
+ Txt[v35].width,
+ Txt[v35].height);
+ _vm->_graphicsManager.Ajoute_Segment_Vesa(xp, yp, xp + v37, yp + v36);
}
} else {
v62 = 0;
do {
TRIER_TEXT[v62++] = 0;
- while (v62 <= 19);
-
- &Txt[idx].field408 = 1;
- _vm->_fileManager.CONSTRUIT_FICHIER(HOPLINK, filename);
- fname = _vm->_globals.NFICHIER;
-
- if (strncmp(fname.c_str(), oldname.c_str(), fname.size())) {
- oldname = fname;
- nom_indexoldname = fname;
-
- // *(int *)((char *)&dword_80AE4DC + strlen(nom_index) + 1) = dword_807C98D;
- Common::File f;
+ } while (v62 <= 19);
+ Txt[idx].field408 = 1;
+ _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename);
+
+ file = _vm->_globals.NFICHIER;
+ if (strncmp(file.c_str(), oldname.c_str(), strlen(file.c_str()))) {
+ oldname = file;
+ nom_index = file;
+
+ //*(int *)((char *)&dword_80AE4DC + strlen(nom_index) + 1) = dword_807C98D;
if (!f.open(nom_index))
- error("error opening file - %s", nom_index.c_str());
-
- int fileSize = f.size();
- for (int i = 0; i < (fileSize / 4); ++i)
+ error("Error opening file - %s", nom_index.c_str());
+ filesize = f.size();
+ for (int i = 0; i < (filesize / 4); ++i)
Index[i] = f.readUint32LE();
f.close();
}
-
- if (fname[0] != 'Z' || fname[1] != 'O') {
- Common::File f;
- if (!f.open(fname))
- error("error opening file - %s", fname.c_str());
+ if (filename[0] != 'Z' || filename[1] != 'O') {
+ if (!f.open(file))
+ error("Error opening file - %s", nom_index.c_str());
v69 = 2048;
f.seek(Index[fileIndex]);
- texte_tmp = _vm->_globals.dos_malloc2(2058);
+
+ texte_tmp = _vm->_globals.dos_malloc2(0x80Au);
if (texte_tmp == g_PTRNUL)
- error("temporary text");
-
- f.read(texte_temp, 2048);
+ error("Error allocating text");
+
+ f.read(texte_tmp, 0x800u);
f.close();
- texte_long = 2048;
+ _vm->_globals.texte_long = 2048;
} else {
v69 = 100;
- texte_long = 100;
- v9 = _vm->_globals.dos_malloc2(110);
+ _vm->_globals.texte_long = 100;
+ v9 = _vm->_globals.dos_malloc2(0x6Eu);
texte_tmp = v9;
- v10 = BUF_ZONE + Index[fileIndex];
- memcpy(v9, v10, 96);
-
+ v10 = _vm->_globals.BUF_ZONE + Index[fileIndex];
+ memcpy(v9, v10, 0x60u);
v11 = 0;
- WRITE_LE_UINT16((uint16 *)v9 + 48, READ_LE_UINT16((uint16 *)v10 + 48));
+ WRITE_LE_UINT16((uint16 *)v9 + 48, READ_LE_UINT16(v10 + 96));
}
-
v59 = texte_tmp;
v63 = 0;
-
if (!v69)
goto LABEL_43;
-
do {
- v13 = v59;
- if ((unsigned __int8)(*v59 + 46) > 0x1Bu) {
+ v13 = *v59;
+ if ((byte)(*v59 + 46) > 0x1Bu) {
if ((unsigned __int8)(v13 + 80) > 0x1Bu) {
if ((unsigned __int8)(v13 - 65) <= 0x19u || (unsigned __int8)(v13 - 97) <= 0x19u)
v13 = 32;
@@ -286,89 +271,74 @@ void FontManager::BOITE(int idx, int fileIndex, const Common::String &filename,
} else {
v13 += 111;
}
-
*v59 = v13;
v59 = v59 + 1;
++v63;
} while (v63 < v69);
-
v60 = texte_tmp;
v64 = 0;
if (v69) {
- ptr = idx;
-
- for (;;) {
+ while (1) {
v14 = *(v60 + v64);
if (v14 == 10 || v14 == 13) {
*(v60 + v64) = 0;
- v11 = &Txt[0];
- if (!Txt[ptr].field3FE)
+// v11 = (int)Txt;
+ if (!Txt[idx].field3FE)
break;
}
-
++v64;
if (v69 <= v64)
goto LABEL_43;
}
-
- Txt[ptr].field3FE = v64;
- largeur_boite = 0;
-
+ Txt[idx].field3FE = v64;
+ _vm->_globals.largeur_boite = 0;
+
v15 = 0;
if (v64 + 1 > 0) {
do {
v16 = *(v60 + v15);
if ((unsigned __int8)v16 <= 0x1Fu)
v16 = 32;
- largeur_boite += _vm->_objectManager.Get_Largeur(police, (unsigned __int8)v16 - 32);
+ _vm->_globals.largeur_boite += _vm->_objectsManager.Get_Largeur(_vm->_globals.police, (byte)v16 - 32);
++v15;
} while (v15 < v64 + 1);
}
-
- largeur_boite += 2;
- v17 = largeur_boite / 2;
+ _vm->_globals.largeur_boite += 2;
+ v17 = _vm->_globals.largeur_boite / 2;
if (v17 < 0)
v17 = -v17;
- *Txt[idx].field8 = 320 - v17;
+ Txt[idx].xp = 320 - v17;
v73 = _vm->_eventsManager.start_x + 320 - v17;
v58 = 1;
v18 = 0;
-
if (v64 + 1 > 0) {
- ptra = Txt[ptr];
-
do {
- ptra.field14[v18].field0 = *(v60 + v18);
+ Txt[idx].field14[v18] = *(v60 + v18);
++v18;
} while (v18 < v64 + 1);
}
} else {
LABEL_43:
-
- if (!largeur_boite)
- largeur_boite = 240;
+ if (!_vm->_globals.largeur_boite)
+ _vm->_globals.largeur_boite = 240;
v65 = 0;
v61 = texte_tmp;
-
do {
v19 = 0;
- ptrb = largeur_boite - 4;
-
- for (;;) {
+ ptrb = _vm->_globals.largeur_boite - 4;
+ while (1) {
v57 = v19;
- do {
+ do
v11 = *(v61 + v65 + v19++);
- } while (v11 != 32 && v11 != 37);
-
- if (v19 >= ptrb / police_l)
+ while (v11 != 32 && v11 != 37);
+ if (v19 >= ptrb / _vm->_globals.police_l)
break;
if (v11 == 37) {
- if (v19 < ptrb / police_l)
+ if (v19 < ptrb / _vm->_globals.police_l)
goto LABEL_55;
break;
}
}
-
if (v11 != 37)
goto LABEL_57;
v11 = 32;
@@ -378,15 +348,12 @@ LABEL_55:
LABEL_57:
v20 = v58;
v21 = v11;
-
- Txt[idx].field14[v20] = (const char *)v61 + v65;
- //strncpy((char *)(v20 + 1036 * idx + 134911728), (const char *)v61 + v65, v57);
+ Txt[idx].field14[v20] = Common::String((const char *)v61 + v65, v57);
TRIER_TEXT[v58++] = v57;
-
+
v65 += v57;
v11 = v21;
- } while ((byte)v21 != 37);
-
+ } while (v21 != 37);
v66 = 0;
do {
v22 = TRIER_TEXT[v66];
@@ -397,20 +364,17 @@ LABEL_57:
v23 = 0;
if (v22 - 1 > 0) {
do {
- v24 = *(&Txt[1036 * idx + 20] + 100 * v66 + v23);
- if ((unsigned __int8)v24 <= 0x1Fu)
+ v24 = Txt[idx].field14[v66][v23];
+ if ((byte)v24 <= 0x1Fu)
v24 = 32;
-
- ptrc += _vm->_objectManager.Get_Largeur(police, (unsigned __int8)v24 - 32);
+ ptrc += _vm->_objectsManager.Get_Largeur(_vm->_globals.police, (byte)v24 - 32);
++v23;
} while (v23 < TRIER_TEXT[v66] - 1);
}
-
TRIER_TEXT[v66] = ptrc;
}
++v66;
} while (v66 <= 19);
-
v67 = 0;
do {
v25 = v67;
@@ -420,116 +384,101 @@ LABEL_57:
v25 = 0;
if (TRIER_TEXT[v67] < TRIER_TEXT[v25])
TRIER_TEXT[v67] = 0;
- } while (v25 != v67);
+ } while (v25 != (signed __int16)v67);
++v67;
} while (v67 <= 19);
-
v68 = 0;
do {
if (TRIER_TEXT[v68])
- largeur_boite = TRIER_TEXT[v68];
+ _vm->_globals.largeur_boite = TRIER_TEXT[v68];
++v68;
} while (v68 <= 19);
-
- if ((Txt[idx].field3FC - 2) > 1u) {
- for (i = xp - _vm->_eventsManager.start_x; largeur_boite + i > 638 && i > -2 && Txt[idx].field3FC]; i -= 2)
+
+ if ((unsigned __int16)(Txt[idx].field3FC - 2) > 1u) {
+ for (i = xp - _vm->_eventsManager.start_x; _vm->_globals.largeur_boite + i > 638 && i > -2 && Txt[idx].field3FC; i -= 2)
;
- Txt[idx].field8 = i;
+ Txt[idx].xp = i;
v73 = _vm->_eventsManager.start_x + i;
} else {
- if (nbrligne == 639) {
- while (largeur_boite + v73 > 638 && v73 > -2)
+ if (_vm->_globals.nbrligne == (SCREEN_WIDTH - 1)) {
+ while (_vm->_globals.largeur_boite + v73 > 638 && v73 > -2)
v73 -= 2;
}
- if (nbrligne == (SCREEN_WIDTH * 2)) {
- while (largeur_boite + v73 > 1278 && v73 > -2)
+ if (_vm->_globals.nbrligne == (SCREEN_WIDTH * 2)) {
+ while (_vm->_globals.largeur_boite + v73 > 1278 && v73 > -2)
v73 -= 2;
}
- Txt[idx].field8 = v73;
+ Txt[idx].xp = v73;
}
}
-
- hauteur_boite = (police_h + 1) * v58 + 2;
+ _vm->_globals.hauteur_boite = (_vm->_globals.police_h + 1) * v58 + 2;
v56 = v73;
v55 = yp;
- v53 = largeur_boite + 10;
- v51 = (police_h + 1) * v58 + 12;
-
- v26 = idx;
+ v53 = _vm->_globals.largeur_boite + 10;
+ v51 = (_vm->_globals.police_h + 1) * v58 + 12;
+ v26 = 1036 * idx;
if (Txt[idx].field3FC == 6) {
v27 = v53 / 2;
if (v27 < 0)
v27 = -v27;
-
- Txt[v26].field8 = 315 - v27;
+ Txt[v26].xp = 315 - v27;
v28 = _vm->_eventsManager.start_x + 315 - v27;
v73 = _vm->_eventsManager.start_x + 315 - v27;
- Txt[v26].fieldA = 50;
+ Txt[v26].yp = 50;
v70 = 50;
v55 = 50;
v56 = v28;
}
-
v29 = Txt[idx].field3FC;
- if (v29 == 1 || v29 == 3 || (uint16)(v29 - 5) <= 1u) {
+ if (v29 == 1 || v29 == 3 || (unsigned __int16)(v29 - 5) <= 1u) {
v49 = v51 * v53;
ptrd = _vm->_globals.dos_malloc2(v51 * v53);
+ if (ptrd == g_PTRNUL) {
+ error("Cutting a block for text box (%d)", v49);
+ }
+ _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, ptrd, v56, v55, v53, v51);
+ _vm->_graphicsManager.Trans_bloc2(ptrd, _vm->_graphicsManager.TABLE_COUL, v49);
+ _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, ptrd, v56, v55, v53, v51);
+ _vm->_globals.dos_free2(ptrd);
- if (ptrd == g_PTRNUL)
- error("Error allocating block (%d)", v49);
+ _vm->_graphicsManager.Plot_Hline(_vm->_graphicsManager.VESA_BUFFER, v56, v55, v53, (byte)-2);
+ _vm->_graphicsManager.Plot_Hline(_vm->_graphicsManager.VESA_BUFFER, v56, v51 + v55, v53, (byte)-2);
+ _vm->_graphicsManager.Plot_Vline(_vm->_graphicsManager.VESA_BUFFER, v56, v70, v51, (byte)-2);
+ _vm->_graphicsManager.Plot_Vline(_vm->_graphicsManager.VESA_BUFFER, v53 + v56, v70, v51, (byte)-2);
}
-
- _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, ptrd, v56, v55, v53, v51);
- _vm->_graphicsManager.Trans_bloc2(ptrd, TABLE_COUL, v49);
- _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, ptrd, v56, v55, v53, v51);
- _vm->_globals.dos_free2(ptrd);
-
- _vm->_graphicsManager.Plot_Hline(_vm->_graphicsManager.VESA_BUFFER, v56, v55, v53, -2);
- _vm->_graphicsManager.Plot_Hline(_vm->_graphicsManager.VESA_BUFFER, v56, (v51 + v55), v53, -2);
- _vm->_graphicsManager.Plot_Vline(_vm->_graphicsManager.VESA_BUFFER, v56, v70, v51, -2);
- _vm->_graphicsManager.Plot_Vline(_vm->_graphicsManager.VESA_BUFFER, (v53 + v56), v70, v51, -2);
- }
-
- Txt[idx].field12 = v58;
- v75 = v73 + 5;
- v71 = v70 + 5;
- v30 = 0;
-
- if (v58 > 0) {
- do {
- TEXT_NOW1(v75, v71, Txt[idx].field14[v30], Txt[idx].field40A);
- v71 += police_h + 1;
- ++v30;
- } while ( v58 > v30 );
- }
-
- v54 = v53 + 1;
- v52 = v51 + 1;
- v31 = 1036 * idx;
- Txt[v31].field404 = v54;
- Txt[v31].field406 = v52;
- v32 = Txt[v31].field3FC;
-
- if (v32 == 6 || v32 == 1 || v32 == 3 || v32 == 5) {
- v33 = idx;
- if (Txt[v33].field400 != g_PTRNUL)
- Txt[v33].field400 = _vm->_globals.dos_free2(Txt[v33].field400);
-
- v50 = v52 * v54;
- ptre = dos_malloc2(v50 + 20);
- if (ptre == g_PTRNUL)
- error("Error allocating block (%d)", v50);
- }
-
- Txt[v33].field400 = ptre;
- Txt[v33].field404 = v54;
- Txt[v33].field406 = v52;
- _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, Txt[v33].field400, v56, v55,
- Txt[v33].field404, v52);
+ Txt[idx].field12 = v58;
+ v75 = v73 + 5;
+ v71 = v70 + 5;
+ v30 = 0;
+ if (v58 > 0) {
+ do {
+ TEXT_NOW1(v75, v71, Txt[idx].field14[v30], Txt[idx].field40A);
+ v71 += _vm->_globals.police_h + 1;
+ ++v30;
+ } while (v58 > v30);
+ }
+ v54 = v53 + 1;
+ v52 = v51 + 1;
+ v31 = idx;
+ Txt[v31].width = v54;
+ Txt[v31].height = v52;
+ v32 = Txt[v31].field3FC;
+ if (v32 == 6 || v32 == 1 || v32 == 3 || v32 == 5) {
+ v33 = idx;
+ if (Txt[v33].field400 != g_PTRNUL)
+ Txt[v33].field400 = _vm->_globals.dos_free2(Txt[v33].field400);
+ v50 = v52 * v54;
+ ptre = _vm->_globals.dos_malloc2(v50 + 20);
+ if (ptre == g_PTRNUL)
+ error("Cutting a block for text box (%d)", v50);
+
+ Txt[v33].field400 = ptre;
+ Txt[v33].width = v54;
+ Txt[v33].height = v52;
+ _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, Txt[v33].field400, v56, v55, Txt[v33].width, v52);
+ }
+ texte_tmp = _vm->_globals.dos_free2(texte_tmp);
}
-
- texte_tmp = _vm->_globals.dos_free2(texte_tmp);
- */
}
void FontManager::TEXT_NOW1(int xp, int yp, const Common::String &message, int transColour) {
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp
index 0761c45149..9fda73fc95 100644
--- a/engines/hopkins/graphics.cpp
+++ b/engines/hopkins/graphics.cpp
@@ -2563,4 +2563,22 @@ void GraphicsManager::Reduc_Ecran(byte *a1, byte *a2, int a3, int a4, int a5, in
}
}
+void GraphicsManager::Plot_Hline(byte *surface, int xp, int yp, unsigned int width, byte col) {
+ memset(surface + xp + nbrligne2 * yp, col, width);
+}
+
+void GraphicsManager::Plot_Vline(byte *surface, int xp, int yp, int height, char col) {
+ byte *v5;
+ int v6;
+
+ v5 = surface + xp + nbrligne2 * yp;
+ v6 = height;
+ do {
+ *v5 = col;
+ v5 += nbrligne2;
+ --v6;
+ } while (v6);
+}
+
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h
index e41b37f187..f92e367a2c 100644
--- a/engines/hopkins/graphics.h
+++ b/engines/hopkins/graphics.h
@@ -184,6 +184,8 @@ public:
void Copy_WinScan_Vbe(const byte *srcP, byte *destP);
void Copy_Video_Vbe(const byte *src);
void Reduc_Ecran(byte *a1, byte *a2, int a3, int a4, int a5, int a6, int a7);
+ void Plot_Hline(byte *surface, int xp, int yp, unsigned int width, byte col);
+ void Plot_Vline(byte *surface, int xp, int yp, int height, char col);
};
} // End of namespace Hopkins