From d8dd04130a3ea4018f26467f86a9e0bebe24bf5c Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 11 Oct 2012 22:53:59 +1100 Subject: HOPKINS: Implemented missing BOITE function in the font manager --- engines/hopkins/font.cpp | 367 ++++++++++++++++++++--------------------------- 1 file changed, 158 insertions(+), 209 deletions(-) (limited to 'engines/hopkins/font.cpp') 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) { -- cgit v1.2.3