diff options
Diffstat (limited to 'engines/hopkins/globals.cpp')
-rw-r--r-- | engines/hopkins/globals.cpp | 595 |
1 files changed, 595 insertions, 0 deletions
diff --git a/engines/hopkins/globals.cpp b/engines/hopkins/globals.cpp new file mode 100644 index 0000000000..0dd8caec9f --- /dev/null +++ b/engines/hopkins/globals.cpp @@ -0,0 +1,595 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/textconsole.h" +#include "common/file.h" +#include "hopkins/globals.h" +#include "hopkins/files.h" +#include "hopkins/font.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +// Global null pointer. This is needed by the engine to recognise NULL pointers, since +// there are places that differentiate between it and a 0 'error' value +byte *g_PTRNUL; + +// Default data for the Hopkins array + +const int HOPKINS_PERSO_0[] = { + 0, -2, 0, -3, 0, -6, 0, -1, 0, -3, 0, -3, 0, -5, 0, -3, 0, -6, 0, -3, 0, -3, 0, -3, + 9, -4, 8, -4, 6, -2, 9, -2, 9, -3, 9, -3, 9, -4, 9, -2, 9, -2, 8, -2, 9, -3, 9, -2, + 13, 0, 13, 0, 13, 0, 13, 0, 14, 0, 13, 0, 13, 0, 12, 0, 12, 0, 14, 0, 13, 0, 14, 0, + 10, 3, 9, 3, 10, 4, 8, 2, 7, 1, 10, 2, 9, 2, 7, 4, 7, 3, 8, 0, 9, 1, 9, 1, 0, 4, 0, + 4, 0, 6, 0, 3, 0, 4, 0, 3, 0, 4, 0, 4, 0, 6, 0, 3, 0, 3, 0, 3 +}; + +const int HOPKINS_PERSO_1[] = { + 0, -2, 0, -2, 0, -5, 0, -1, 0, -2, 0, -2, 0, -4, 0, -2, 0, -5, 0, -2, 0, -2, 0, -2, + 11, 0, 10, 0, 11, 0, 11, 0, 11, 0, 11, 0, 12, 0, 11, 0, 9, 0, 10, 0, 11, 0, 11, 0, + 11, 0, 10, 0, 11, 0, 11, 0, 11, 0, 11, 0, 12, 0, 11, 0, 9, 0, 10, 0, 11, 0, 11, 0, + 11, 0, 10, 0, 11, 0, 11, 0, 11, 0, 11, 0, 12, 0, 11, 0, 9, 0, 10, 0, 11, 0, 11, 0, + 0, 3, 0, 3, 0, 5, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 5, 0, 3, 0, 3, 0, 3 +}; + +const int HOPKINS_PERSO_2[] = { + 0, -2, 0, 0, 0, -3, 0, -2, 0, -2, 0, -1, 0, -2, 0, -1, 0, -3, 0, -2, 0, -2, 0, -2, + 8, 0, 9, 0, 5, 0, 9, 0, 7, 0, 7, 0, 7, 0, 7, 0, 6, 0, 7, 0, 6, 0, 9, 0, 8, 0, 9, 0, + 5, 0, 9, 0, 7, 0, 7, 0, 7, 0, 7, 0, 6, 0, 7, 0, 6, 0, 9, 0, 8, 0, 9, 0, 5, 0, 9, 0, + 7, 0, 7, 0, 7, 0, 7, 0, 6, 0, 7, 0, 6, 0, 9, 0, 0, 2, 0, 0, 0, 2, 0, 1, 0, 2, 0, 2, + 0, 2, 0, 2, 0, 2, 0, 1, 0, 2, 0, 2 +}; + +Globals::Globals() { + // Set up the special g_PTRNUL variable + g_PTRNUL = (byte *)malloc(16); + strcpy((char *)g_PTRNUL, "POINTERNULL"); + + // Initialise array properties + for (int i = 0; i < 6; ++i) + CACHE_BANQUE[i] = g_PTRNUL; + for (int i = 0; i < 106; ++i) + Common::fill((byte *)&ZONEP[i], (byte *)&ZONEP[i] + sizeof(ZonePItem), 0); + for (int i = 0; i < 100; ++i) + Common::fill((byte *)&CarreZone[i], (byte *)&CarreZone[i] + sizeof(CarreZoneItem), 0); + for (int i = 0; i < 35; ++i) + Common::fill((byte *)&Bqe_Anim[i], (byte *)&Bqe_Anim[i] + sizeof(BqeAnimItem), 0); + for (int i = 0; i < 8; ++i) + Common::fill((byte *)&Bank[i], (byte *)&Bank[i] + sizeof(BankItem), 0); + for (int i = 0; i < 36; ++i) + Common::fill((byte *)&Bob[i], (byte *)&Bob[i] + sizeof(BobItem), 0); + for (int i = 0; i < 6; ++i) + Common::fill((byte *)&Liste[i], (byte *)&Liste[i] + sizeof(ListeItem), 0); + for (int i = 0; i < 35; ++i) + Common::fill((byte *)&Liste2[i], (byte *)&Liste2[i] + sizeof(Liste2Item), 0); + for (int i = 0; i < 30; ++i) + Common::fill((byte *)&BL_ANIM[i], (byte *)&BL_ANIM[i] + sizeof(BlAnimItem), 0); + for (int i = 0; i < 30; ++i) + Common::fill((byte *)&VBob[i], (byte *)&VBob[i] + sizeof(VBobItem), 0); + for (int i = 0; i < 300; ++i) + Common::fill((byte *)&ObjetW[i], (byte *)&ObjetW[i] + sizeof(ObjetWItem), 0); + for (int i = 0; i < 250; ++i) + Common::fill((byte *)&BLOC[i], (byte *)&BLOC[i] + sizeof(BlocItem), 0); + for (int i = 0; i < 25; ++i) + Common::fill((byte *)&Cache[i], (byte *)&Cache[i] + sizeof(CacheItem), 0); + + for (int i = 0; i < 101; ++i) + Common::fill((byte *)&Segment[i], (byte *)&Segment[i] + sizeof(SegmentItem), 0); + for (int i = 0; i < 105; ++i) { + BOBZONE[i] = 0; + BOBZONE_FLAG[i] = false; + } + for (int i = 0; i < 500; ++i) + STAILLE[i] = 0; + for (int i = 0; i < 32002; ++i) + super_parcours[i] = 0; + for (int i = 0; i < 2100; ++i) + Param[i] = 0; + for (int i = 0; i < 70; ++i) + Common::fill((byte *)&Hopkins[i], (byte *)&Hopkins[i] + sizeof(HopkinsItem), 0); + + for (int i = 0; i < 36; ++i) + INVENTAIRE[i] = 0; + for (int i = 0; i < 51; ++i) + Common::fill((byte *)&Tri[i], (byte *)&Tri[i] + sizeof(TriItem), 0); + + // Initialise fields + FR = 0; + SVGA = 2; + internet = 1; + PUBEXIT = 0; + vitesse = 1; + INSTALL_TYPE = 1; + MUSICVOL = 6; + SOUNDVOL = 6; + VOICEVOL = 6; + XSETMODE = 0; + XZOOM = 0; + lItCounter = 0; + lOldItCounter = 0; + g_old_anim = 0; + g_old_sens = 0; + g_old_sens2 = 0; + last_sens = 0; + police_l = police_h = 0; + TETE = NULL; + texte_long = 0; + TEXTE_FORMATE = 0; + OBJET_EN_COURS = 0; + NUM_FICHIER_OBJ = 0; + nbrligne = 0; + largeur_boite = 0; + hauteur_boite = 0; + FORET = 0; + OBJL = OBJH = 0; + HELICO = 0; + CAT_POSI = 0; + CAT_TAILLE = 0; + Nouv_objet = 0; + iRegul = 0; + SORTIE = 0; + PLANX = PLANY = 0; + PLANI = 0; + PERSO = 0; + PASSWORD = 0; + ECRAN = 0; + NOSPRECRAN = 0; + OLD_ECRAN = 0; + Max_Propre_Gen = 0; + Max_Ligne_Long = 0; + Max_Perso_Y = 0; + Max_Propre = 0; + NBBLOC = 0; + opt_scrtype = 0; + opt_scrspeed = 0; + opt_vitesse = 0; + opt_sound = 0; + opt_voice = 0; + opt_music = 0; + opt_txt = 0; + opt_anm = 0; + NBTRI = 0; + AFFLI = 0; + AFFIVBL = 0; + NOT_VERIF = 0; + PERSO_TYPE = 0; + GOACTION = 0; + NECESSAIRE = 0; + Compteur = 0; + ACTION_SENS = 0; + ACTION_SENS = 0; + SegmentEnCours = 0; + STOP_BUG = 0; + MAX_COMPTE = 0; + + // Initialise pointers + ICONE = NULL; + BUF_ZONE = NULL; + CACHE_BANQUE[6] = NULL; + texte_tmp = NULL; + SPRITE_ECRAN = NULL; + SAUVEGARDE = NULL; + BUFFERTAPE = NULL; + essai0 = NULL; + essai1 = NULL; + essai2 = NULL; + Bufferobjet = NULL; + inventaire2 = NULL; + GESTE = NULL; + INVENTAIRE_OBJET = NULL; + FORETSPR = NULL; + COUCOU = NULL; + chemin = NULL; + cache_souris = NULL; + BufLig = NULL; + Bufferdecor = NULL; + ADR_FICHIER_OBJ = NULL; + police = NULL; + PERSO = NULL; + OPTION_SPR = NULL; + + // Reset flags + MUSICOFF = false; + SOUNDOFF = false; + VOICEOFF = false; + XFULLSCREEN = false; + XFORCE16 = false; + XFORCE8 = false; + CARD_SB = false; + SOUNDOFF = false; + MUSICOFF = false; + VOICEOFF = false; + CENSURE = false; + GESTE_FLAG = false; + BPP_NOAFF = false; + DESACTIVE_INVENT = false; + FLAG_VISIBLE = false; + netscape = false; + NOMARCHE = false; + NO_VISU = false; + OPTION_FLAG = false; + CACHEFLAG = false; + NOPARLE = false; + + // Reset indexed variables + force_to_data_0 = 0; + oldzone_46 = 0; + old_x1_65 = 0; + old_y1_66 = 0; + old_x2_67 = 0; + old_y2_68 = 0; + old_zone_68 = 0; + old_z_69 = 0; + old_x_69 = 0; + old_y_70 = 0; + compteur_71 = 0; + zozo_73 = 0; + j_104 = 0; +} + +Globals::~Globals() { + free(ICONE); + dos_free2(BUF_ZONE); + dos_free2(CACHE_BANQUE[6]); + dos_free2(texte_tmp); + dos_free2(SPRITE_ECRAN); + dos_free2((byte *)SAUVEGARDE); + dos_free2(BUFFERTAPE); + dos_free2(Bufferobjet); + dos_free2(inventaire2); + dos_free2(GESTE); + dos_free2(INVENTAIRE_OBJET); + dos_free2(FORETSPR); + dos_free2(COUCOU); + dos_free2(cache_souris); + dos_free2(Bufferdecor); + dos_free2(ADR_FICHIER_OBJ); + dos_free2(PERSO); + + free(g_PTRNUL); +} + +void Globals::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void Globals::setConfig() { + HOPIMAGE = "BUFFER"; + HOPANIM = "ANIM"; + HOPLINK = "LINK"; + HOPSAVE = "SAVE"; + HOPSOUND = "SOUND"; + HOPMUSIC = "MUSIC"; + HOPVOICE = "VOICE"; + HOPANM = "ANM"; + HOPSEQ = "SEQ"; + + switch (FR) { + case 0: + FICH_ZONE = "ZONEAN.TXT"; + FICH_TEXTE = "TEXTEAN.TXT"; + break; + case 1: + FICH_ZONE = "ZONE01.TXT"; + FICH_TEXTE = "TEXTE01.TXT"; + break; + case 2: + FICH_ZONE = "ZONEES.TXT"; + FICH_TEXTE = "TEXTEES.TXT"; + break; + } +} + +void Globals::clearAll() { + // TODO: The original allocated an explicit memory block for the null pointer + // to point to. For now, we're seeing if the NULL value will do as well + + for (int idx = 0; idx < 6; ++idx) + CACHE_BANQUE[idx] = g_PTRNUL; + + nbrligne = 80; + INIT_ANIM(); + + texte_tmp = g_PTRNUL; + texte_long = 0; + police = g_PTRNUL; + police_h = 0; + police_l = 0; + hauteur_boite = 0; + largeur_boite = 0; + + _vm->_fontManager.clearAll(); + + INIT_VBOB(); + ADR_FICHIER_OBJ = g_PTRNUL; + NUM_FICHIER_OBJ = 0; + Bufferdecor = g_PTRNUL; + Bufferobjet = g_PTRNUL; + _vm->_dialogsManager.Winventaire = g_PTRNUL; + _vm->_dialogsManager.inventaire2 = g_PTRNUL; + COUCOU = g_PTRNUL; + SPRITE_ECRAN = g_PTRNUL; + SAUVEGARDE = (Sauvegarde *)g_PTRNUL; + OBJET_EN_COURS = 0; + + for (int idx = 0; idx < 105; ++idx) { + ZONEP[idx].destX = 0; + ZONEP[idx].destY = 0; + ZONEP[idx].field4 = 0; + } + + essai0 = (int16 *)g_PTRNUL; + essai1 = (int16 *)g_PTRNUL; + essai2 = (int16 *)g_PTRNUL; + BufLig = (int16 *)g_PTRNUL; + chemin = (int16 *)g_PTRNUL; + + for (int idx = 0; idx < 400; ++idx) { + _vm->_linesManager.Ligne[idx].field0 = 0; + _vm->_linesManager.Ligne[idx].field2 = 0; + _vm->_linesManager.Ligne[idx].field4 = 0; + _vm->_linesManager.Ligne[idx].field6 = 0; + _vm->_linesManager.Ligne[idx].field8 = 0; + _vm->_linesManager.Ligne[idx].lineData = (int16 *)g_PTRNUL; + + _vm->_linesManager.LigneZone[idx].count = 0; + _vm->_linesManager.LigneZone[idx].field2 = 0; + _vm->_linesManager.LigneZone[idx].zoneData = (int16 *)g_PTRNUL; + } + + for (int idx = 0; idx < 100; ++idx) { + CarreZone[idx].field0 = 0; + } + + texte_long = 0; + texte_tmp = g_PTRNUL; + BUFFERTAPE = dos_malloc2(85000); + + SAUVEGARDE = (Sauvegarde *)malloc(sizeof(Sauvegarde)); + memset(SAUVEGARDE, 0, sizeof(Sauvegarde)); + + essai0 = (int16 *)BUFFERTAPE; + essai1 = (int16 *)(BUFFERTAPE + 25000); + essai2 = (int16 *)(BUFFERTAPE + 50000); + BufLig = (int16 *)(BUFFERTAPE + 75000); + largeur_boite = 240; + TEXTE_FORMATE = 300; + + Bufferobjet = dos_malloc2(2500); + INVENTAIRE_OBJET = dos_malloc2(2500); + + ADR_FICHIER_OBJ = g_PTRNUL; + FORETSPR = g_PTRNUL; + FORET = 0; + + cache_souris = dos_malloc2(2500); + GESTE = g_PTRNUL; + GESTE_FLAG = false; +} + +void Globals::HOPKINS_DATA() { + assert(PERSO_TYPE >= 0 && PERSO_TYPE <= 2); + + const int *srcList[] = { HOPKINS_PERSO_0, HOPKINS_PERSO_1, HOPKINS_PERSO_2 }; + const int *srcP = srcList[PERSO_TYPE]; + + for (int idx = 0; idx < 240 / 4; ++idx) { + Hopkins[idx].field0 = *srcP++; + Hopkins[idx].field2 = *srcP++; + } + + g_old_anim = -1; + g_old_sens = -1; +} + +void Globals::INIT_ANIM() { + for (int idx = 0; idx < 35; ++idx) { + Bqe_Anim[idx].data = g_PTRNUL; + Bqe_Anim[idx].field4 = 0; + } + + for (int idx = 0; idx < 8; ++idx) { + Bank[idx].data = g_PTRNUL; + Bank[idx].field4 = 0; + Bank[idx].filename1 = ""; + Bank[idx].fileHeader = 0; + Bank[idx].field1C = 0; + Bank[idx].filename2 = ""; + } +} + +void Globals::INIT_VBOB() { + for (int idx = 0; idx < 30; ++idx) { + VBob[idx].field4 = 0; + VBob[idx].xp = 0; + VBob[idx].yp = 0; + VBob[idx].frameIndex = 0; + VBob[idx].fieldC = 0; + VBob[idx].surface = g_PTRNUL; + VBob[idx].spriteData = g_PTRNUL; + VBob[idx].oldSpriteData = g_PTRNUL; + } +} + +void Globals::CLEAR_VBOB() { + for (int idx = 0; idx < 30; ++idx) { + VBob[idx].field4 = 0; + VBob[idx].xp = 0; + VBob[idx].yp = 0; + VBob[idx].frameIndex = 0; + VBob[idx].fieldC = 0; + VBob[idx].surface = g_PTRNUL; + VBob[idx].spriteData = g_PTRNUL; + VBob[idx].oldSpriteData = g_PTRNUL; + } +} + +// Load Object +void Globals::CHARGE_OBJET() { + _vm->_fileManager.CONSTRUIT_SYSTEM("OBJET.DAT"); + byte *data = _vm->_fileManager.CHARGE_FICHIER(NFICHIER); + byte *srcP = data; + + for (int idx = 0; idx < 300; ++idx) { + ObjetW[idx].field0 = *srcP++; + ObjetW[idx].field1 = *srcP++; + ObjetW[idx].field2 = *srcP++; + ObjetW[idx].field3 = *srcP++; + ObjetW[idx].field4 = *srcP++; + ObjetW[idx].field5 = *srcP++; + ObjetW[idx].field6 = *srcP++; + ObjetW[idx].field7 = *srcP++; + } + + free(data); +} + +byte *Globals::dos_malloc2(int count) { + byte *result = (byte *)malloc(count); + if (!result) + result = g_PTRNUL; + return result; +} + +byte *Globals::dos_free2(byte *p) { + if (p != g_PTRNUL) + free(p); + return g_PTRNUL; +} + +// Free File +byte *Globals::LIBERE_FICHIER(byte *p) { + dos_free2(p); + return g_PTRNUL; +} + +// Reset Cache +void Globals::RESET_CACHE() { + byte *dataP; + + for (int idx = 1; idx <= 5; ++idx) { + dataP = CACHE_BANQUE[idx]; + if (dataP != g_PTRNUL && dataP) + CACHE_BANQUE[idx] = dos_free2(CACHE_BANQUE[idx]); + CACHE_BANQUE[idx] = g_PTRNUL; + } + + for (int idx = 0; idx <= 20; ++idx) { + Cache[idx].fieldC = g_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 = false; +} + +void Globals::CACHE_ON() { + CACHEFLAG = true; +} + +// TODO: Find why some calls have a parameter value +void Globals::CACHE_OFF(int v1) { + CACHEFLAG = false; +} + +void Globals::CACHE_SUB(int idx) { + Cache[idx].fieldA = 0; +} + +void Globals::CACHE_ADD(int idx) { + Cache[idx].fieldA = 1; +} + +// Load Cache +void Globals::CHARGE_CACHE(const Common::String &file) { + byte *v2 = g_PTRNUL; + 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(); + _vm->_fileManager.CONSTRUIT_FICHIER(HOPLINK, file); + ptr = _vm->_fileManager.CHARGE_FICHIER(NFICHIER); + v16 = Common::String((const char *)ptr); + + _vm->_fileManager.CONSTRUIT_FICHIER(HOPLINK, v16); + + if (f.exists(NFICHIER)) { + spriteData = _vm->_fileManager.CHARGE_FICHIER(NFICHIER); + CACHE_BANQUE[1] = spriteData; + v15 = 60; + v14 = 0; + do { + v11 = (int16)READ_LE_UINT16((uint16 *)ptr + v15); + v4 = (int16)READ_LE_UINT16((uint16 *)ptr + v15 + 1); + v5 = (int16)READ_LE_UINT16((uint16 *)ptr + v15 + 2); + v6 = v14; + Cache[v6].field14 = (int16)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 == g_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 |