diff options
Diffstat (limited to 'engines')
38 files changed, 24281 insertions, 0 deletions
diff --git a/engines/configure.engines b/engines/configure.engines index b132c32ad0..e17e2f67e0 100644 --- a/engines/configure.engines +++ b/engines/configure.engines @@ -16,6 +16,7 @@ add_engine dreamweb "Dreamweb" yes add_engine gob "Gobli*ns" yes add_engine groovie "Groovie" yes "groovie2" "7th Guest" add_engine groovie2 "Groovie 2 games" no +add_engine hopkins "Hopkins FBI" no add_engine hugo "Hugo Trilogy" yes add_engine kyra "Kyra" yes "lol eob" "Legend of Kyrandia 1-3" add_engine lol "Lands of Lore" yes diff --git a/engines/engines.mk b/engines/engines.mk index 61004463fe..bcf97df991 100644 --- a/engines/engines.mk +++ b/engines/engines.mk @@ -75,6 +75,11 @@ DEFINES += -DENABLE_GROOVIE2 endif endif +ifdef ENABLE_HOPKINS +DEFINES += -DENABLE_HOPKINS=$(ENABLE_HOPKINS) +MODULES += engines/hopkins +endif + ifdef ENABLE_HUGO DEFINES += -DENABLE_HUGO=$(ENABLE_HUGO) MODULES += engines/hugo diff --git a/engines/hopkins/anim.cpp b/engines/hopkins/anim.cpp new file mode 100644 index 0000000000..5102a883a6 --- /dev/null +++ b/engines/hopkins/anim.cpp @@ -0,0 +1,1340 @@ +/* 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/system.h" +#include "graphics/palette.h" +#include "common/file.h" +#include "common/rect.h" +#include "engines/util.h" +#include "hopkins/anim.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +AnimationManager::AnimationManager() { + CLS_ANM = false; + NO_SEQ = false; +} + +// Play Anim +void AnimationManager::PLAY_ANM(const Common::String &filename, uint32 rate1, uint32 rate2, uint32 rate3) { + int v4; + int v5; + bool hasScreenCopy; + byte *screenCopy = NULL; + byte *v10 = NULL; + int v13; + byte *ptr = NULL; + size_t nbytes; + Common::File f; + + if (_vm->shouldQuit()) + return; + + hasScreenCopy = false; + while (!_vm->shouldQuit()) { +LABEL_2: + v10 = _vm->_graphicsManager.VESA_SCREEN; + ptr = _vm->_globals.dos_malloc2(0x14u); + + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANM, filename); + if (!f.open(_vm->_globals.NFICHIER)) + error("File not found - %s", _vm->_globals.NFICHIER.c_str()); + + f.skip(6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.skip(4); + nbytes = f.readUint32LE(); + f.skip(14); + f.read(v10, nbytes); + + if (CLS_ANM == true) { + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + } + if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > 640) { + hasScreenCopy = true; + screenCopy = _vm->_globals.dos_malloc2(0x4B000u); + memcpy(screenCopy, v10, 0x4B000u); + } + if (NO_SEQ) { + if (hasScreenCopy) + memcpy(screenCopy, _vm->_graphicsManager.VESA_BUFFER, 0x4B000u); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + } else { + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (hasScreenCopy) + _vm->_graphicsManager.m_scroll16A(screenCopy, 0, 0, 640, 480, 0, 0); + else + _vm->_graphicsManager.m_scroll16(v10, 0, 0, 640, 480, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (hasScreenCopy) + _vm->_graphicsManager.m_scroll2A(screenCopy, 0, 0, 640, 480, 0, 0); + else + _vm->_graphicsManager.m_scroll2(v10, 0, 0, 640, 480, 0, 0); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + } + _vm->_eventsManager.lItCounter = 0; + _vm->_eventsManager.ESC_KEY = false; + _vm->_soundManager.LOAD_ANM_SOUND(); + if (_vm->_globals.iRegul != 1) + break; + while (!_vm->shouldQuit()) { + if (_vm->_eventsManager.ESC_KEY == true) + goto LABEL_58; + if (REDRAW_ANIM() == true) + break; + _vm->_eventsManager.CONTROLE_MES(); + if (_vm->_eventsManager.lItCounter >= rate1) + goto LABEL_25; + } +LABEL_53: + if (_vm->_graphicsManager.NOLOCK == true) + goto LABEL_58; + _vm->_globals.dos_free2(ptr); + f.close(); + + if (hasScreenCopy == 1) +LABEL_55: + screenCopy = _vm->_globals.dos_free2(screenCopy); + } +LABEL_25: + _vm->_eventsManager.lItCounter = 0; + v4 = 0; + v13 = 0; + while (!_vm->shouldQuit()) { + ++v13; + _vm->_soundManager.PLAY_ANM_SOUND(v13); + + if (f.read(ptr, 16) != 16) + v4 = -1; + + if (strncmp((char *)ptr, "IMAGE=", 6)) + v4 = -1; + if (v4) + goto LABEL_49; + + f.read(v10, READ_LE_UINT32(ptr + 8)); + if (_vm->_globals.iRegul == 1) + break; +LABEL_38: + _vm->_eventsManager.lItCounter = 0; + _vm->_graphicsManager.DD_Lock(); + if (hasScreenCopy) { + if (*v10 != (byte)-4) { + _vm->_graphicsManager.Copy_WinScan_Vbe3(v10, screenCopy); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.m_scroll16A(screenCopy, 0, 0, 640, 480, 0, 0); + else + _vm->_graphicsManager.m_scroll2A(screenCopy, 0, 0, 640, 480, 0, 0); + } + } else if (*v10 != (byte)-4) { + if (_vm->_graphicsManager.Winbpp == 1) + _vm->_graphicsManager.Copy_Video_Vbe3(v10); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.Copy_Video_Vbe16(v10); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + _vm->_soundManager.VERIF_SOUND(); +LABEL_49: + if (v4 == -1) { + if (_vm->_globals.iRegul == 1) { + while (_vm->_eventsManager.ESC_KEY != true) { + if (REDRAW_ANIM() == true) + goto LABEL_53; + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= rate3) + goto LABEL_57; + } + } else { +LABEL_57: + _vm->_eventsManager.lItCounter = 0; + _vm->_soundManager.VERIF_SOUND(); + } + goto LABEL_58; + } + } + while (!_vm->shouldQuit() && _vm->_eventsManager.ESC_KEY != true) { + if (REDRAW_ANIM() == true) { + if (_vm->_graphicsManager.NOLOCK == true) + break; + _vm->_globals.dos_free2(ptr); + f.close(); + + if (1 /*hasScreenCopy <= 640 */) + goto LABEL_2; + goto LABEL_55; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= rate2) + goto LABEL_38; + } +LABEL_58: + if (_vm->_graphicsManager.FADE_LINUX == 2 && !hasScreenCopy) { + screenCopy = _vm->_globals.dos_malloc2(0x4B000u); + + f.seek(0); + f.skip(6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.skip(4); + nbytes = f.readUint32LE(); + f.skip(14); + f.read(v10, nbytes); + + memcpy(screenCopy, v10, 0x4B000u); + + v5 = 0; + do { + memset(ptr, 0, 0x13u); + if (f.read(ptr, 16) != 16) + v5 = -1; + + if (strncmp((char *)ptr, "IMAGE=", 6)) + v5 = -1; + if (!v5) { + f.read(v10, READ_LE_UINT32(ptr + 8)); + if (*v10 != (byte)-4) + _vm->_graphicsManager.Copy_WinScan_Vbe3(v10, screenCopy); + } + } while (v5 != -1); + _vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy); + screenCopy = _vm->_globals.dos_free2(screenCopy); + } + if (hasScreenCopy == 1) { + if (_vm->_graphicsManager.FADE_LINUX == 2) + _vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy); + _vm->_globals.dos_free2(screenCopy); + } + + _vm->_graphicsManager.FADE_LINUX = 0; + f.close(); + _vm->_globals.dos_free2(ptr); + _vm->_graphicsManager.NOLOCK = false; +} + +// Play Anim 2 +void AnimationManager::PLAY_ANM2(const Common::String &filename, uint32 a2, uint32 a3, uint32 a4) { + byte *v4; + int v5; + int v6; + int v8; + byte *ptr; + byte *ptra; + int v11; + byte *v12; + byte *v13; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + char v21; + size_t nbytes; + byte buf[6]; + char v25; + Common::File f; + + if (_vm->shouldQuit()) + return; + + v8 = 0; + while (!_vm->shouldQuit()) { + v17 = 0; + v16 = 0; + v19 = 0; + v18 = 0; + v20 = 1; + memcpy(_vm->_graphicsManager.OLD_PAL, _vm->_graphicsManager.Palette, 0x301u); + + _vm->_fileManager.CONSTRUIT_LINUX("TEMP.SCR"); + if (_vm->_graphicsManager.nbrligne == SCREEN_WIDTH) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x4B000u); + if (_vm->_graphicsManager.nbrligne == 1280) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x96000u); + if (!_vm->_graphicsManager.nbrligne) + _vm->_graphicsManager.ofscroll = 0; + + v12 = _vm->_graphicsManager.VESA_SCREEN; + v13 = _vm->_globals.dos_malloc2(0x14u); + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANM, filename); + + if (!f.open(_vm->_globals.NFICHIER)) + error("Error opening file - %s", _vm->_globals.NFICHIER.c_str()); + + f.read(&buf, 6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.read(&buf, 4); + nbytes = f.readUint32LE(); + v21 = f.readUint32LE(); + v20 = f.readUint16LE(); + v19 = f.readUint16LE(); + v18 = f.readUint16LE(); + v17 = f.readUint16LE(); + v16 = f.readUint16LE(); + + f.read(v12, nbytes); + + _vm->_graphicsManager.Cls_Pal(); + v11 = _vm->_graphicsManager.SCROLL; + _vm->_graphicsManager.SCANLINE(SCREEN_WIDTH * 2); + _vm->_graphicsManager.SCROLL_ECRAN(0); + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.max_x = SCREEN_WIDTH; + if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > SCREEN_WIDTH) { + v8 = 1; + ptr = _vm->_globals.dos_malloc2(0x4B000u); + memcpy(ptr, v12, 0x4B000u); + } + if (_vm->_animationManager.NO_SEQ) { + if (v8 == 1) + memcpy(ptr, _vm->_graphicsManager.VESA_BUFFER, 0x4B000u); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + } else { + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (v8) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(v12, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (v8) + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(v12, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + } + _vm->_eventsManager.lItCounter = 0; + _vm->_eventsManager.ESC_KEY = false; + _vm->_soundManager.LOAD_ANM_SOUND(); + if (_vm->_globals.iRegul != 1) + break; + while (1) { + if (_vm->_eventsManager.ESC_KEY == true) + goto LABEL_114; + if (REDRAW_ANIM() == true) + break; + _vm->_eventsManager.CONTROLE_MES(); + if (_vm->_eventsManager.lItCounter >= a2) + goto LABEL_48; + } + if (_vm->_graphicsManager.NOLOCK == true) + goto LABEL_114; + if (v8 == 1) + ptr = _vm->_globals.dos_free2(ptr); + _vm->_globals.dos_free2(v13); + f.close(); + + _vm->_fileManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + memcpy(_vm->_graphicsManager.Palette, _vm->_graphicsManager.OLD_PAL, 0x301u); + v4 = &_vm->_graphicsManager.Palette[769]; + _vm->_graphicsManager.Cls_Pal(); + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.SCROLL = v11; + _vm->_graphicsManager.SCROLL_ECRAN(v11); + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) { + _vm->_graphicsManager.SCANLINE(0x500u); + _vm->_graphicsManager.max_x = 1280; + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else { + _vm->_eventsManager.souris_max(); + _vm->_graphicsManager.SCANLINE(SCREEN_WIDTH * 2); + _vm->_graphicsManager.max_x = SCREEN_WIDTH; + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) +LABEL_111: + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } +LABEL_112: + _vm->_graphicsManager.DD_Unlock(); + _vm->_eventsManager.VBL(); + _vm->_graphicsManager.FADE_INS(); + } +LABEL_48: + _vm->_eventsManager.lItCounter = 0; + v5 = 0; + v15 = 0; + while (1) { + ++v15; + _vm->_soundManager.PLAY_ANM_SOUND(v15); + memset(&buf, 0, 6u); + memset(v13, 0, 0x13u); + + if (f.read(v13, 0x10) != 0x10) + v5 = -1; + + v25 = 0; + if (strncmp((const char *)v13, "IMAGE=", 6)) + v5 = -1; + + if (v5) + goto LABEL_88; + f.read(v12, READ_LE_UINT32(v13 + 2)); + if (_vm->_globals.iRegul == 1) + break; +LABEL_77: + _vm->_eventsManager.lItCounter = 0; + _vm->_graphicsManager.DD_Lock(); + if (v8) { + if (*v12 != (byte)-4) { + _vm->_graphicsManager.Copy_WinScan_Vbe3(v12, ptr); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else if (*v12 != (byte)-4) { + if (_vm->_graphicsManager.Winbpp == 1) + _vm->_graphicsManager.Copy_Video_Vbe3(v12); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.Copy_Video_Vbe16(v12); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + _vm->_soundManager.VERIF_SOUND(); +LABEL_88: + if (v5 == -1) { + if (_vm->_globals.iRegul == 1) { + while (_vm->_eventsManager.ESC_KEY != true) { + if (REDRAW_ANIM() == true) { + if (_vm->_graphicsManager.NOLOCK == true) + goto LABEL_114; + if (v8 == 1) + ptr = _vm->_globals.dos_free2(ptr); + _vm->_globals.dos_free2(v13); + f.close(); + + _vm->_fileManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + memcpy(_vm->_graphicsManager.Palette, _vm->_graphicsManager.OLD_PAL, 0x301u); + v4 = &_vm->_graphicsManager.Palette[769]; + _vm->_graphicsManager.Cls_Pal(); + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.SCROLL = v11; + _vm->_graphicsManager.SCROLL_ECRAN(v11); + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) { + _vm->_graphicsManager.SCANLINE(0x500u); + _vm->_graphicsManager.max_x = 1280; + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else { + _vm->_eventsManager.souris_max(); + _vm->_graphicsManager.SCANLINE(SCREEN_WIDTH * 2); + _vm->_graphicsManager.max_x = SCREEN_WIDTH; + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + goto LABEL_111; + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } + goto LABEL_112; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= a4) + goto LABEL_114; + } + } + goto LABEL_114; + } + } + while (_vm->_eventsManager.ESC_KEY != true) { + if (REDRAW_ANIM() == true) { + if (_vm->_graphicsManager.NOLOCK == true) + break; + if (v8 == 1) + ptr = _vm->_globals.dos_free2(ptr); + _vm->_globals.dos_free2(v13); + f.close(); + + _vm->_fileManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + memcpy(_vm->_graphicsManager.Palette, _vm->_graphicsManager.OLD_PAL, 0x301u); + v4 = &_vm->_graphicsManager.Palette[769]; + _vm->_graphicsManager.Cls_Pal(); + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.SCROLL = v11; + _vm->_graphicsManager.SCROLL_ECRAN(v11); + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) { + _vm->_graphicsManager.SCANLINE(0x500u); + _vm->_graphicsManager.max_x = 1280; + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else { + _vm->_eventsManager.souris_max(); + _vm->_graphicsManager.SCANLINE(SCREEN_WIDTH * 2); + _vm->_graphicsManager.max_x = SCREEN_WIDTH; + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + goto LABEL_111; + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } + goto LABEL_112; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= a3) + goto LABEL_77; + } +LABEL_114: + _vm->_graphicsManager.NOLOCK = false; + f.close(); + + if (_vm->_graphicsManager.FADE_LINUX == 2 && !v8) { + ptra = _vm->_globals.dos_malloc2(0x4B000u); + + f.seek(0); + f.read(&buf, 6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.read(&buf, 4u); + nbytes = f.readUint32LE(); + v21 = f.readUint32LE(); + v20 = f.readUint16LE(); + v19 = f.readUint16LE(); + v18 = f.readUint16LE(); + v17 = f.readUint16LE(); + v16 = f.readUint16LE(); + f.read(v12, nbytes); + memcpy(ptra, v12, 0x4B000u); + + v6 = 0; + do { + memset(&buf, 0, 6u); + memset(v13, 0, 0x13u); + if (f.read(v13, 16) != 16) + v6 = -1; + if (strncmp((const char *)v13, "IMAGE=", 6)) + v6 = -1; + + if (!v6) { + f.read(v12, READ_LE_UINT32(v13 + 8)); + if (*v12 != (byte)-4) + _vm->_graphicsManager.Copy_WinScan_Vbe3(v12, ptra); + } + } while (v6 != -1); + _vm->_graphicsManager.FADE_OUTW_LINUX(ptra); + ptr = _vm->_globals.dos_free2(ptra); + } + if (v8 == 1) { + if (_vm->_graphicsManager.FADE_LINUX == 2) + _vm->_graphicsManager.FADE_OUTW_LINUX(ptr); + _vm->_globals.dos_free2(ptr); + } + _vm->_graphicsManager.FADE_LINUX = 0; + _vm->_globals.dos_free2(v13); + + _vm->_fileManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + memcpy(_vm->_graphicsManager.Palette, _vm->_graphicsManager.OLD_PAL, 0x301u); + _vm->_graphicsManager.Cls_Pal(); + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.SCROLL = v11; + _vm->_graphicsManager.SCROLL_ECRAN(v11); + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) { + _vm->_graphicsManager.SCANLINE(0x500u); + _vm->_graphicsManager.max_x = 1280; + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else { + _vm->_eventsManager.souris_max(); + _vm->_graphicsManager.SCANLINE(SCREEN_WIDTH * 2); + _vm->_graphicsManager.max_x = SCREEN_WIDTH; + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.Cls_Video(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (_vm->_graphicsManager.SDL_ECHELLE) + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.FADE_INS(); + _vm->_graphicsManager.DD_VBL(); +} + +bool AnimationManager::REDRAW_ANIM() { + return false; +} + +// Load Anim +void AnimationManager::CHARGE_ANIM(const Common::String &animName) { + byte v20[15]; + char header[10]; + char filename1[15]; + char filename2[15]; + char filename3[15]; + char filename4[15]; + char filename5[15]; + char filename6[15]; + + CLEAR_ANIM(); + + Common::String filename = animName + ".ANI"; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, filename); + + Common::File f; + if (!f.open(_vm->_globals.NFICHIER)) + error("Failed to open %s", _vm->_globals.NFICHIER.c_str()); + + int filesize = f.size(); + int nbytes = filesize - 115; + f.read(header, 10); + f.read(v20, 15); + f.read(filename1, 15); + f.read(filename2, 15); + f.read(filename3, 15); + f.read(filename4, 15); + f.read(filename5, 15); + f.read(filename6, 15); + + if (header[0] != 'A' || header[1] != 'N' || header[2] != 'I' || header[3] != 'S') + error("File incompatible with this soft."); + + const char *files[6] = { &filename1[0], &filename2[0], &filename3[0], &filename4[0], + &filename5[0], &filename6[0] }; + + for (int idx = 1; idx <= 6; ++idx) { + if (files[idx - 1][0]) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, files[idx - 1]); + + if (!f.exists(_vm->_globals.NFICHIER)) + error("File not found"); + if (CHARGE_BANK_SPRITE1(idx, files[idx - 1])) + error("File not compatible with this soft."); + } + } + + byte *data = _vm->_globals.dos_malloc2(nbytes + 1); + f.read(data, nbytes); + f.close(); + + for (int idx = 1; idx <= 20; ++idx) { + RECHERCHE_ANIM(data, idx, nbytes); + } + + _vm->_globals.dos_free2(data); +} + +void AnimationManager::CLEAR_ANIM() { + for (int idx = 0; idx < 35; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].data != g_PTRNUL) + _vm->_globals.Bqe_Anim[idx].data = _vm->_globals.dos_free2(_vm->_globals.Bqe_Anim[idx].data); + _vm->_globals.Bqe_Anim[idx].field4 = 0; + } + + for (int idx = 0; idx < 8; ++idx) { + if (_vm->_globals.Bank[idx].data != g_PTRNUL) + _vm->_globals.Bank[idx].data = _vm->_globals.dos_free2(_vm->_globals.Bank[idx].data); + _vm->_globals.Bank[idx].field4 = 0; + _vm->_globals.Bank[idx].filename1 = ""; + _vm->_globals.Bank[idx].fileHeader = 0; + _vm->_globals.Bank[idx].field1C = 0; + } +} + +// Load Sprite Bank 1 +int AnimationManager::CHARGE_BANK_SPRITE1(int idx, const Common::String &filename) { + byte *v3; + byte *v4; + int v7; + int v8; + int width; + int height; + byte *v13; + int v16; + int v17; + byte *ptr; + byte *v19; + int v20; + int v21; + int result = 0; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, filename); + _vm->_globals.Bank[idx].field1C = _vm->_fileManager.FLONG(_vm->_globals.NFICHIER); + _vm->_globals.Bank[idx].field4 = 1; + _vm->_globals.Bank[idx].filename1 = filename; + _vm->_globals.Bank[idx].filename2 = _vm->_globals.REP_SPR; + + v3 = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + v4 = v3; + + _vm->_globals.Bank[idx].fileHeader = 0; + if (*(v3 + 1) == 'L' && *(v3 + 2) == 'E') + _vm->_globals.Bank[idx].fileHeader = 1; + if (*(v3 + 1) == 'O' && *(v3 + 2) == 'R') + _vm->_globals.Bank[184].fileHeader = 2; + + if (_vm->_globals.Bank[idx].fileHeader) { + _vm->_globals.Bank[idx].data = v3; + + v7 = 0; + v8 = 0; + do { + ptr = v4; + width = _vm->_objectsManager.Get_Largeur(v4, v8); + height = _vm->_objectsManager.Get_Hauteur(ptr, v8); + v4 = ptr; + if (!width && !height) + v7 = 1; + if (!v7) + ++v8; + if (v8 > 249) + v7 = 1; + } while (v7 != 1); + + if (v8 <= 249) { + _vm->_globals.Bank[idx].field1A = v8; + + Common::String ofsFilename = _vm->_globals.Bank[idx].filename1; + char ch; + do { + ch = ofsFilename.lastChar(); + ofsFilename.deleteLastChar(); + } while (ch != '.'); + ofsFilename += ".OFS"; + + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, ofsFilename); + Common::File f; + if (f.exists(_vm->_globals.NFICHIER)) { + v19 = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + v13 = v19; + + if (_vm->_globals.Bank[idx].field1A > 0) { + for (int v14 = 0; v14 < _vm->_globals.Bank[idx].field1A; ++v14) { + v16 = (int16)READ_LE_UINT16(v13); + v17 = (int16)READ_LE_UINT16(v13 + 2); + v21 = (int16)READ_LE_UINT16(v13 + 4); + v20 = (int16)READ_LE_UINT16(v13 + 6); + v13 += 8; + + _vm->_objectsManager.set_offsetxy(_vm->_globals.Bank[idx].data, v14, v16, v17, 0); + if (_vm->_globals.Bank[idx].fileHeader == 2) + _vm->_objectsManager.set_offsetxy(_vm->_globals.Bank[idx].data, v14, v21, v20, 1); + } + } + + _vm->_globals.dos_free2(v19); + } + + result = 0; + } else { + _vm->_globals.dos_free2(ptr); + _vm->_globals.Bank[idx].field4 = 0; + result = -2; + } + } else { + _vm->_globals.dos_free2(v3); + _vm->_globals.Bank[idx].field4 = 0; + result = -1; + } + + return result; +} + +// Search Anim +void AnimationManager::RECHERCHE_ANIM(const byte *data, int animIndex, int count) { + int v3; + const byte *v5; + int v6; + int v7; + int v8; + byte *v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v19; + int v20; + int v21; + int v22; + const byte *v23; + int v; + + v21 = 0; + v3 = 0; + v19 = animIndex; + do { + v20 = *(v21 + data); + if (v20 == 'A' && *(data + v21 + 1) == 'N' && *(data + v21 + 2) == 'I' && *(data + v21 + 3) == 'M') { + int entryIndex = *(data + v21 + 4); + if (animIndex == entryIndex) { + v5 = v21 + data + 5; + v6 = v21 + 5; + v7 = 0; + v8 = 0; + do { + if (*v5 == 'A' && *(v5 + 1) == 'N' && *(v5 + 2) == 'I' && *(v5 + 3) == 'M') + v8 = 1; + if (*v5 == 'F' && *(v5 + 1) == 'I' && *(v5 + 2) == 'N') + v8 = 1; + if (count < v6) { + _vm->_globals.Bqe_Anim[animIndex].field4 = 0; + _vm->_globals.Bqe_Anim[v19].data = g_PTRNUL; + return; + } + ++v6; + ++v7; + ++v5; + } while (v8 != 1); + _vm->_globals.Bqe_Anim[v19].data = _vm->_globals.dos_malloc2(v7 + 50); + _vm->_globals.Bqe_Anim[animIndex].field4 = 1; + memcpy(_vm->_globals.Bqe_Anim[v19].data, v21 + data + 5, 0x14u); + + byte *dataP = _vm->_globals.Bqe_Anim[v19].data; + v9 = dataP + 20; + v23 = v21 + data + 25; + v10 = READ_LE_UINT16(v21 + data + 25); + v11 = READ_LE_UINT16(v21 + data + 27); + v22 = READ_LE_UINT16(v21 + data + 29); + v12 = READ_LE_UINT16(v21 + data + 31); + v13 = *(v21 + data + 33); + *(dataP + 29) = *(v21 + data + 34); + WRITE_LE_UINT16(dataP + 20, v10); + WRITE_LE_UINT16(dataP + 22, v11); + WRITE_LE_UINT16(dataP + 24, v22); + WRITE_LE_UINT16(dataP + 26, v12); + *(dataP + 28) = v13; + + v14 = 1; + do { + v9 += 10; + v23 += 10; + if (!v22) + break; + + v = READ_LE_UINT16(v23); + v15 = READ_LE_UINT16(v23 + 2); + v22 = READ_LE_UINT16(v23 + 4); + v16 = READ_LE_UINT16(v23 + 6); + v17 = *(v23 + 8); + *(v9 + 9) = *(v23 + 9); + WRITE_LE_UINT16(v9, v); + WRITE_LE_UINT16(v9 + 2, v15); + WRITE_LE_UINT16(v9 + 4, v22); + WRITE_LE_UINT16(v9 + 6, v16); + *(v9 + 8) = v17; + ++v14; + } while (v14 <= 4999); + v3 = 1; + } + } + if (v20 == 'F' && *(data + v21 + 1) == 'I' && *(data + v21 + 2) == 'N') + v3 = 1; + ++v21; + } while (v21 <= count && v3 != 1); +} + +void AnimationManager::PLAY_SEQ(int a1, const Common::String &a2, uint32 a3, uint32 a4, uint32 a5) { + int v5; + int v7; + byte *ptr = NULL; + byte *v9; + byte *v10; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + char v18; + size_t nbytes; + int buf; + Common::File f; + + if (_vm->shouldQuit()) + return; + + v7 = 0; + v14 = 0; + v13 = 0; + v16 = 0; + v15 = 0; + v17 = 1; + _vm->_eventsManager.souris_flag = false; + if (!NO_COUL) { + _vm->_eventsManager.VBL(); + + _vm->_fileManager.CONSTRUIT_LINUX("TEMP.SCR"); + if (_vm->_graphicsManager.nbrligne == SCREEN_WIDTH) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x4B000u); + if (_vm->_graphicsManager.nbrligne == (SCREEN_WIDTH * 2)) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x96000u); + if (!_vm->_graphicsManager.nbrligne) + _vm->_graphicsManager.ofscroll = 0; + } + v9 = _vm->_graphicsManager.VESA_SCREEN; + v10 = _vm->_globals.dos_malloc2(0x16u); + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPSEQ, a2); + if (!f.open(_vm->_globals.NFICHIER)) + error("Error opening file - %s", _vm->_globals.NFICHIER.c_str()); + + f.read(&buf, 6u); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.read(&buf, 4u); + nbytes = f.readUint32LE(); + v18 = f.readUint32LE(); + v17 = f.readUint16LE(); + v16 = f.readUint16LE(); + v15 = f.readUint16LE(); + v14 = f.readUint16LE(); + v13 = f.readUint16LE(); + f.read(v9, nbytes); + + if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > SCREEN_WIDTH) { + v7 = 1; + ptr = _vm->_globals.dos_malloc2(0x4B000u); + memcpy(ptr, v9, 0x4B000u); + } + if (_vm->_animationManager.NO_SEQ) { + if (v7 == 1) + memcpy(ptr, _vm->_graphicsManager.VESA_BUFFER, 0x4B000u); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + } else { + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.Winbpp == 2) { + if (v7) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(v9, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (v7) + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(v9, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + } + _vm->_eventsManager.lItCounter = 0; + _vm->_eventsManager.ESC_KEY = false; + _vm->_soundManager.LOAD_ANM_SOUND(); + if (_vm->_globals.iRegul == 1) { + do { + if (_vm->_eventsManager.ESC_KEY == true) { + if (!_vm->_eventsManager.NOESC) + goto LABEL_59; + _vm->_eventsManager.ESC_KEY = false; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + } while (_vm->_eventsManager.lItCounter < a3); + } + _vm->_eventsManager.lItCounter = 0; + v5 = 0; + v12 = 0; + do { + ++v12; + _vm->_soundManager.PLAY_ANM_SOUND(v12); + memset(&buf, 0, 6u); + memset(v10, 0, 0x13u); + if (f.read(v10, 16) != 16) + v5 = -1; + + if (strncmp((const char *)v10, "IMAGE=", 6)) + v5 = -1; + if (!v5) { + f.read(v9, (int16)READ_LE_UINT16(v10 + 8)); + if (_vm->_globals.iRegul == 1) { + do { + if (_vm->_eventsManager.ESC_KEY == true) { + if (!_vm->_eventsManager.NOESC) + goto LABEL_59; + _vm->_eventsManager.ESC_KEY = false; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + } while (_vm->_eventsManager.lItCounter < a4); + } + _vm->_eventsManager.lItCounter = 0; + _vm->_graphicsManager.DD_Lock(); + if (v7) { + if (*v9 != (byte)-4) { + _vm->_graphicsManager.Copy_WinScan_Vbe(v9, ptr); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else if (*v9 != (byte)-4) { + if (_vm->_graphicsManager.Winbpp == 1) + _vm->_graphicsManager.Copy_Video_Vbe(v9); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.Copy_Video_Vbe16a(v9); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + _vm->_soundManager.VERIF_SOUND(); + } + } while (v5 != -1); + if (_vm->_globals.iRegul == 1) { + do { + if (_vm->_eventsManager.ESC_KEY == true) { + if (!_vm->_eventsManager.NOESC) + goto LABEL_59; + _vm->_eventsManager.ESC_KEY = false; + } + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + } while (_vm->_eventsManager.lItCounter < a5); + } + _vm->_eventsManager.lItCounter = 0; +LABEL_59: + _vm->_graphicsManager.NOLOCK = false; + f.close(); + + if (!NO_COUL) { + _vm->_fileManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + _vm->_eventsManager.souris_flag = true; + } + if (v7 == 1) + _vm->_globals.dos_free2(ptr); + _vm->_globals.dos_free2(v10); +} + +void AnimationManager::PLAY_SEQ2(const Common::String &a1, uint32 a2, uint32 a3, uint32 a4) { + bool v4; + bool v5; + int v7; + byte *ptr = NULL; + byte *ptra; + byte *v10; + byte *v11 = NULL; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + char v19; + size_t nbytes; + Common::File f; + + v7 = 0; + for (;;) { + if (_vm->shouldQuit()) + return; + + v15 = 0; + v14 = 0; + v17 = 0; + v16 = 0; + v18 = 1; + _vm->_eventsManager.souris_flag = false; + v10 = _vm->_graphicsManager.VESA_SCREEN; + v11 = _vm->_globals.dos_malloc2(0x16u); + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPSEQ, a1); + + if (!f.open(_vm->_globals.NFICHIER)) + error("File not found - %s", _vm->_globals.NFICHIER.c_str()); + + f.skip(6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.skip(4); + nbytes = f.readUint32LE(); + v19 = f.readUint32LE(); + v18 = f.readUint16LE(); + v17 = f.readUint16LE(); + v16 = f.readUint16LE(); + v15 = f.readUint16LE(); + v14 = f.readUint16LE(); + f.read(v10, nbytes); + + if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > SCREEN_WIDTH) { + v7 = 1; + ptr = _vm->_globals.dos_malloc2(0x4B000u); + memcpy((void *)ptr, v10, 0x4B000u); + } + if (_vm->_animationManager.NO_SEQ) { + if (v7 == 1) { + assert(ptr != NULL); + memcpy((void *)ptr, _vm->_graphicsManager.VESA_BUFFER, 0x4B000u); + } + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + } else { + _vm->_graphicsManager.DD_Lock(); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + if (_vm->_graphicsManager.Winbpp == 2) { + if (v7) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll16(v10, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (_vm->_graphicsManager.Winbpp == 1) { + if (v7) + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2(v10, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + } + _vm->_eventsManager.lItCounter = 0; + _vm->_eventsManager.ESC_KEY = false; + _vm->_soundManager.LOAD_ANM_SOUND(); + if (_vm->_globals.iRegul != 1) + break; + while (!_vm->shouldQuit()) { + if (_vm->_eventsManager.ESC_KEY == true) + goto LABEL_54; + if (REDRAW_ANIM() == true) + break; + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= a2) + goto LABEL_23; + } +LABEL_48: + if (_vm->_graphicsManager.NOLOCK == true) + goto LABEL_54; + if (v7 == 1) + ptr = _vm->_globals.dos_free2(ptr); + _vm->_globals.dos_free2(v11); + f.close(); + } +LABEL_23: + _vm->_eventsManager.lItCounter = 0; + v4 = false; + v13 = 0; + while (!_vm->shouldQuit()) { + _vm->_soundManager.PLAY_ANM_SOUND(v13++); + + memset(v11, 0, 0x13u); + if (f.read(v11, 16) != 16) + v4 = true; + + if (strncmp((const char *)v11, "IMAGE=", 6)) + v4 = true; + if (v4) + goto LABEL_44; + f.read(v10, READ_LE_UINT32(v11 + 8)); + if (_vm->_globals.iRegul == 1) + break; +LABEL_33: + _vm->_eventsManager.lItCounter = 0; + _vm->_graphicsManager.DD_Lock(); + if (v7) { + if (*v10 != (byte)-4) { + _vm->_graphicsManager.Copy_WinScan_Vbe(v10, ptr); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.m_scroll16A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + _vm->_graphicsManager.m_scroll2A(ptr, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + } else if (*v10 != (byte)-4) { + if (_vm->_graphicsManager.Winbpp == 1) + _vm->_graphicsManager.Copy_Video_Vbe(v10); + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.Copy_Video_Vbe16a(v10); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + _vm->_soundManager.VERIF_SOUND(); +LABEL_44: + if (v4) { + if (_vm->_globals.iRegul == 1) { + while (_vm->_eventsManager.ESC_KEY != true) { + if (REDRAW_ANIM() == true) + goto LABEL_48; + _vm->_eventsManager.CONTROLE_MES(); + _vm->_soundManager.VERIF_SOUND(); + if (_vm->_eventsManager.lItCounter >= a4) + goto LABEL_53; + } + } else { +LABEL_53: + _vm->_eventsManager.lItCounter = 0; + } + goto LABEL_54; + } + } + while (_vm->_eventsManager.ESC_KEY != true) { + _vm->_eventsManager.CONTROLE_MES(); + if (REDRAW_ANIM() == true) + goto LABEL_48; + if (_vm->_eventsManager.lItCounter >= a3) + goto LABEL_33; + } +LABEL_54: + if (_vm->_graphicsManager.FADE_LINUX == 2 && !v7) { + ptra = _vm->_globals.dos_malloc2(0x4B000u); + + f.seek(0); + f.skip(6); + f.read(_vm->_graphicsManager.Palette, 0x320u); + f.skip(4); + nbytes = f.readUint32LE(); + v19 = f.readUint32LE(); + v18 = f.readUint16LE(); + v17 = f.readUint16LE(); + v16 = f.readUint16LE(); + v15 = f.readUint16LE(); + v14 = f.readUint16LE(); + f.read(v10, nbytes); + + memcpy(ptra, v10, 0x4B000u); + v5 = false; + do { + memset(v11, 0, 0x13u); + if (f.read(v11, 16) != 16) + v5 = true; + + if (strncmp((const char *)v11, "IMAGE=", 6)) + v5 = true; + if (!v5) { + f.read(v10, READ_LE_UINT32(v11 + 8)); + if (*v10 != (byte)-4) + _vm->_graphicsManager.Copy_WinScan_Vbe(v10, ptra); + } + } while (!v5); + _vm->_graphicsManager.FADE_OUTW_LINUX(ptra); + ptr = _vm->_globals.dos_free2(ptra); + } + if (v7 == 1) { + if (_vm->_graphicsManager.FADE_LINUX == 2) + _vm->_graphicsManager.FADE_OUTW_LINUX(ptr); + _vm->_globals.dos_free2(ptr); + } + _vm->_graphicsManager.FADE_LINUX = 0; + + f.close(); + _vm->_globals.dos_free2(v11); + _vm->_eventsManager.souris_flag = true; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/anim.h b/engines/hopkins/anim.h new file mode 100644 index 0000000000..339355ef75 --- /dev/null +++ b/engines/hopkins/anim.h @@ -0,0 +1,59 @@ +/* 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. + * + */ + +#ifndef HOPKINS_ANIM_H +#define HOPKINS_ANIM_H + +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/str.h" +#include "graphics/surface.h" + +namespace Hopkins { + +class HopkinsEngine; + +class AnimationManager { +private: + int CHARGE_BANK_SPRITE1(int idx, const Common::String &filename); +public: + HopkinsEngine *_vm; + bool CLS_ANM; + bool NO_SEQ; + bool NO_COUL; +public: + AnimationManager(); + void setParent(HopkinsEngine *vm) { _vm = vm; } + + void PLAY_ANM(const Common::String &filename, uint32 rate, uint32 rate2, uint32 rate3); + void PLAY_ANM2(const Common::String &filename, uint32 a2, uint32 a3, uint32 a4); + bool REDRAW_ANIM(); + void CHARGE_ANIM(const Common::String &animName); + void CLEAR_ANIM(); + void RECHERCHE_ANIM(const byte *data, int animIndex, int count); + void PLAY_SEQ(int a1, const Common::String &a2, uint32 a3, uint32 a4, uint32 a5); + void PLAY_SEQ2(const Common::String &a1, uint32 a2, uint32 a3, uint32 a4); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_ANIM_H */ diff --git a/engines/hopkins/debugger.cpp b/engines/hopkins/debugger.cpp new file mode 100644 index 0000000000..a332d2160e --- /dev/null +++ b/engines/hopkins/debugger.cpp @@ -0,0 +1,38 @@ +/* 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 "hopkins/debugger.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +Debugger::Debugger() : GUI::Debugger() { + DCmd_Register("continue", WRAP_METHOD(Debugger, Cmd_Exit)); +} + +void Debugger::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/debugger.h b/engines/hopkins/debugger.h new file mode 100644 index 0000000000..7a2f44aafe --- /dev/null +++ b/engines/hopkins/debugger.h @@ -0,0 +1,45 @@ +/* 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. + * + */ + +#ifndef HOPKINS_DEBUGGER_H +#define HOPKINS_DEBUGGER_H + +#include "common/scummsys.h" +#include "gui/debugger.h" + +namespace Hopkins { + +class HopkinsEngine; + +class Debugger : public GUI::Debugger { +private: + HopkinsEngine *_vm; + +public: + Debugger(); + virtual ~Debugger() {} + void setParent(HopkinsEngine *vm); +}; + +} // End of namespace Hopkins + +#endif diff --git a/engines/hopkins/detection.cpp b/engines/hopkins/detection.cpp new file mode 100644 index 0000000000..8724802552 --- /dev/null +++ b/engines/hopkins/detection.cpp @@ -0,0 +1,185 @@ +/* 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 "base/plugins.h" + +#include "common/savefile.h" +#include "common/str-array.h" +#include "common/memstream.h" +#include "engines/advancedDetector.h" +#include "common/system.h" +#include "graphics/colormasks.h" +#include "graphics/surface.h" + +#include "hopkins/hopkins.h" + +#define MAX_SAVES 99 + +namespace Hopkins { + +struct HopkinsGameDescription { + ADGameDescription desc; +}; + +uint32 HopkinsEngine::getFeatures() const { + return _gameDescription->desc.flags; +} + +Common::Language HopkinsEngine::getLanguage() const { + return _gameDescription->desc.language; +} + +Common::Platform HopkinsEngine::getPlatform() const { + return _gameDescription->desc.platform; +} + +bool HopkinsEngine::getIsDemo() const { + return _gameDescription->desc.flags & ADGF_DEMO; +} + +} // End of namespace Hopkins + +static const PlainGameDescriptor hopkinsGames[] = { + {"hopkins", "Hopkins FBI"}, + {0, 0} +}; + +#include "hopkins/detection_tables.h" + +class HopkinsMetaEngine : public AdvancedMetaEngine { +public: + HopkinsMetaEngine() : AdvancedMetaEngine(Hopkins::gameDescriptions, sizeof(Hopkins::HopkinsGameDescription), hopkinsGames) { + } + + virtual const char *getName() const { + return "Hopkins Engine"; + } + + virtual const char *getOriginalCopyright() const { + return "Hopkins Engine (C) ???"; + } + + virtual bool hasFeature(MetaEngineFeature f) const; + virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; + virtual SaveStateList listSaves(const char *target) const; + virtual int getMaximumSaveSlot() const; + virtual void removeSaveState(const char *target, int slot) const; + SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; +}; + +bool HopkinsMetaEngine::hasFeature(MetaEngineFeature f) const { + return + (f == kSupportsListSaves) || + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsDeleteSave) || + (f == kSavesSupportMetaInfo) || + (f == kSavesSupportThumbnail); +} + +bool Hopkins::HopkinsEngine::hasFeature(EngineFeature f) const { + return + (f == kSupportsRTL) || + (f == kSupportsLoadingDuringRuntime) || + (f == kSupportsSavingDuringRuntime); +} + +bool HopkinsMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { + const Hopkins::HopkinsGameDescription *gd = (const Hopkins::HopkinsGameDescription *)desc; + if (gd) { + *engine = new Hopkins::HopkinsEngine(syst, gd); + } + return gd != 0; +} + +SaveStateList HopkinsMetaEngine::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::StringArray filenames; + Common::String saveDesc; + Common::String pattern = Common::String::format("%s.0??", target); + + filenames = saveFileMan->listSavefiles(pattern); + sort(filenames.begin(), filenames.end()); // Sort to get the files in numerical order + + Hopkins::hopkinsSavegameHeader header; + + SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + const char *ext = strrchr(file->c_str(), '.'); + int slot = ext ? atoi(ext + 1) : -1; + + if (slot >= 0 && slot < MAX_SAVES) { + Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); + + if (in) { + if (Hopkins::SaveLoadManager::readSavegameHeader(in, header)) { + saveList.push_back(SaveStateDescriptor(slot, header.saveName)); + + header.thumbnail->free(); + delete header.thumbnail; + } + + delete in; + } + } + } + + return saveList; +} + +int HopkinsMetaEngine::getMaximumSaveSlot() const { + return MAX_SAVES; +} + +void HopkinsMetaEngine::removeSaveState(const char *target, int slot) const { + Common::String filename = Common::String::format("%s.%03d", target, slot); + g_system->getSavefileManager()->removeSavefile(filename); +} + +SaveStateDescriptor HopkinsMetaEngine::querySaveMetaInfos(const char *target, int slot) const { + Common::String filename = Common::String::format("%s.%03d", target, slot); + Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(filename); + + if (f) { + Hopkins::hopkinsSavegameHeader header; + Hopkins::SaveLoadManager::readSavegameHeader(f, header); + delete f; + + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setThumbnail(header.thumbnail); + desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); + desc.setSaveTime(header.saveHour, header.saveMinutes); + desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); + + return desc; + } + + return SaveStateDescriptor(); +} + + +#if PLUGIN_ENABLED_DYNAMIC(HOPKINS) +REGISTER_PLUGIN_DYNAMIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine); +#else +REGISTER_PLUGIN_STATIC(HOPKINS, PLUGIN_TYPE_ENGINE, HopkinsMetaEngine); +#endif diff --git a/engines/hopkins/detection_tables.h b/engines/hopkins/detection_tables.h new file mode 100644 index 0000000000..9e1d329f39 --- /dev/null +++ b/engines/hopkins/detection_tables.h @@ -0,0 +1,106 @@ +/* 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. + * + */ + +namespace Hopkins { + +static const HopkinsGameDescription gameDescriptions[] = { + { + // Hopkins FBI Linux Demo 1.00 + { + "hopkins", + 0, + { + {"Hopkins-PDemo.bin", 0, "88b4d6e14b9b1407083cb3d1213c0fa7", 272027}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformLinux, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + }, + + { + // Hopkins FBI Linux Demo 1.02 + { + "hopkins", + 0, + { + {"Hopkins-PDemo.bin", 0, "f82f4e698f3a189419351be0de2b2f8e", 273760}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformLinux, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + }, + + { + // Hopkins FBI OS/2, provided by Strangerke + { + "hopkins", + 0, + { + {"Hopkins.exe", 0, "63d45f882278e5a9fa1027066223e5d9", 292864}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformOS2, + ADGF_NO_FLAGS, + GUIO1(GUIO_NONE) + }, + }, + { + // Hopkins FBI Win95 Demo, provided by Strangerke + { + "hopkins", + 0, + { + {"Hopkins.exe", 0, "0c9ebfe371f4dcf84a49f333f04839a0", 376897}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + }, + { + // Hopkins FBI Win95, provided by Strangerke + { + "hopkins", + 0, + { + {"Hopkins.exe", 0, "277a5c144bf9ec7d8450ae37afb85090", 419281}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + GUIO1(GUIO_NONE) + }, + }, + { AD_TABLE_END_MARKER } +}; + +} // End of namespace Hopkins diff --git a/engines/hopkins/dialogs.cpp b/engines/hopkins/dialogs.cpp new file mode 100644 index 0000000000..28207bf6c7 --- /dev/null +++ b/engines/hopkins/dialogs.cpp @@ -0,0 +1,752 @@ +/* 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/scummsys.h" +#include "common/events.h" +#include "common/file.h" +#include "common/util.h" +#include "hopkins/dialogs.h" +#include "hopkins/events.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" +#include "hopkins/sound.h" + +namespace Hopkins { + +DialogsManager::DialogsManager() { + DESACTIVE_INVENT = false; + INVENTFLAG = false; + AFFINVEN = false; + VIRE_INVENT = false; + inventairex = inventairey = 0; + inventairel = inventaireh = 0; + Winventaire = NULL; + inventaire2 = g_PTRNUL; +} + +DialogsManager::~DialogsManager() { + _vm->_globals.dos_free2(Winventaire); +} + +void DialogsManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void DialogsManager::showOptionsDialog() { + bool doneFlag; + + doneFlag = false; + _vm->_eventsManager.CHANGE_MOUSE(0); + _vm->_eventsManager.VBL(); + if (_vm->_globals.FR == 1) + _vm->_fileManager.CONSTRUIT_SYSTEM("OPTIFR.SPR"); + if (!_vm->_globals.FR) + _vm->_fileManager.CONSTRUIT_SYSTEM("OPTIAN.SPR"); + if (_vm->_globals.FR == 2) + _vm->_fileManager.CONSTRUIT_SYSTEM("OPTIES.SPR"); + + _vm->_globals.OPTION_SPR = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + _vm->_globals.OPTION_FLAG = true; + + do { + if (_vm->_eventsManager.BMOUSE()) { + Common::Point mousePos(_vm->_eventsManager.XMOUSE(), _vm->_eventsManager.YMOUSE()); + mousePos.x = _vm->_eventsManager.XMOUSE(); + mousePos.y = _vm->_eventsManager.YMOUSE(); + + if (!_vm->_soundManager.MUSICOFF) { + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 300 && mousePos.y > 113 && mousePos.x <= _vm->_graphicsManager.ofscroll + 327 && mousePos.y <= 138) { + ++_vm->_soundManager.MUSICVOL; + _vm->_soundManager.OLD_MUSICVOL = _vm->_soundManager.MUSICVOL; + + if (_vm->_soundManager.MUSICVOL <= 12) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.MUSICVOL = 12; + _vm->_soundManager.MODSetMusicVolume(_vm->_soundManager.MUSICVOL); + } + + if (!_vm->_soundManager.MUSICOFF && mousePos.x >= _vm->_graphicsManager.ofscroll + 331 && mousePos.y > 113 && mousePos.x <= _vm->_graphicsManager.ofscroll + 358 && mousePos.y <= 138) { + --_vm->_soundManager.MUSICVOL; + if (_vm->_soundManager.MUSICVOL >= 0) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.MUSICVOL = 0; + + _vm->_soundManager.OLD_MUSICVOL = _vm->_soundManager.MUSICVOL; + _vm->_soundManager.MODSetMusicVolume(_vm->_soundManager.MUSICVOL); + } + } + if (!_vm->_soundManager.SOUNDOFF) { + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 300 && mousePos.y > 140 && mousePos.x <= _vm->_graphicsManager.ofscroll + 327 && mousePos.y <= 165) { + ++_vm->_soundManager.SOUNDVOL; + if (_vm->_soundManager.SOUNDVOL <= 16) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.SOUNDVOL = 16; + _vm->_soundManager.OLD_SOUNDVOL = _vm->_soundManager.SOUNDVOL; + _vm->_soundManager.MODSetSampleVolume(); + } + + if (!_vm->_soundManager.SOUNDOFF && mousePos.x >= _vm->_graphicsManager.ofscroll + 331 && mousePos.y > 140 && mousePos.x <= _vm->_graphicsManager.ofscroll + 358 && mousePos.y <= 165) { + --_vm->_soundManager.SOUNDVOL; + if (_vm->_soundManager.SOUNDVOL >= 0) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.SOUNDVOL = 0; + _vm->_soundManager.OLD_SOUNDVOL = _vm->_soundManager.SOUNDVOL; + _vm->_soundManager.MODSetSampleVolume(); + } + } + + if (!_vm->_soundManager.VOICEOFF) { + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 300 && mousePos.y > 167 && mousePos.x <= _vm->_graphicsManager.ofscroll + 327 && mousePos.y <= 192) { + ++_vm->_soundManager.VOICEVOL; + + if (_vm->_soundManager.VOICEVOL <= 16) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.VOICEVOL = 16; + _vm->_soundManager.OLD_VOICEVOL = _vm->_soundManager.VOICEVOL; + _vm->_soundManager.MODSetVoiceVolume(); + } + + if (!_vm->_soundManager.VOICEOFF && mousePos.x >= _vm->_graphicsManager.ofscroll + 331 && mousePos.y > 167 && mousePos.x <= _vm->_graphicsManager.ofscroll + 358 && mousePos.y <= 192) { + --_vm->_soundManager.VOICEVOL; + if (_vm->_soundManager.VOICEVOL >= 0) + _vm->_soundManager.PLAY_SOUND("bruit2.wav"); + else + _vm->_soundManager.VOICEVOL = 0; + _vm->_soundManager.OLD_VOICEVOL = _vm->_soundManager.VOICEVOL; + _vm->_soundManager.MODSetVoiceVolume(); + } + } + + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 431) { + if (mousePos.y > 194 && mousePos.x <= _vm->_graphicsManager.ofscroll + 489 && mousePos.y <= 219) + _vm->_soundManager.TEXTOFF = _vm->_soundManager.TEXTOFF != 1; + + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 431) { + if (mousePos.y > 167 && mousePos.x <= _vm->_graphicsManager.ofscroll + 489 && mousePos.y <= 192) + _vm->_soundManager.VOICEOFF = _vm->_soundManager.VOICEOFF != 1; + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 431) { + if (mousePos.y > 113 && mousePos.x <= _vm->_graphicsManager.ofscroll + 489 && mousePos.y <= 138) { + if (_vm->_soundManager.MUSICOFF == 1) { + _vm->_soundManager.MUSICOFF = 0; + _vm->_soundManager.MODSetMusicVolume(_vm->_soundManager.MUSICVOL); + } else { + _vm->_soundManager.MUSICOFF = 1; + _vm->_soundManager.MODSetMusicVolume(0); + } + } + + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 431 && mousePos.y > 140 && mousePos.x <= _vm->_graphicsManager.ofscroll + 489 && mousePos.y <= 165) + _vm->_soundManager.SOUNDOFF = _vm->_soundManager.SOUNDOFF != 1; + } + } + } + + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 175 && mousePos.y > 285 && mousePos.x <= _vm->_graphicsManager.ofscroll + 281 && mousePos.y <= 310) { + _vm->_globals.SORTIE = 300; + doneFlag = true; + } + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 355 && mousePos.y > 285 && mousePos.x <= _vm->_graphicsManager.ofscroll + 490 && mousePos.y <= 310) + doneFlag = true; + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 300 && mousePos.y > 194 && mousePos.x <= _vm->_graphicsManager.ofscroll + 358 && mousePos.y <= 219) { + switch (_vm->_graphicsManager.SPEED_SCROLL) { + case 1: + _vm->_graphicsManager.SPEED_SCROLL = 2; + break; + case 2: + _vm->_graphicsManager.SPEED_SCROLL = 4; + break; + case 4: + _vm->_graphicsManager.SPEED_SCROLL = 8; + break; + case 8: + _vm->_graphicsManager.SPEED_SCROLL = 16; + break; + case 16: + _vm->_graphicsManager.SPEED_SCROLL = 32; + break; + case 32: + _vm->_graphicsManager.SPEED_SCROLL = 48; + break; + case 48: + _vm->_graphicsManager.SPEED_SCROLL = 64; + break; + case 64: + _vm->_graphicsManager.SPEED_SCROLL = 128; + break; + case 128: + _vm->_graphicsManager.SPEED_SCROLL = 160; + break; + case 160: + _vm->_graphicsManager.SPEED_SCROLL = 320; + break; + case 320: + _vm->_graphicsManager.SPEED_SCROLL = 1; + break; + } + } + + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 348 && mousePos.y > 248 && mousePos.x <= _vm->_graphicsManager.ofscroll + 394 && mousePos.y <= 273) + _vm->_globals.vitesse = 2; + if (mousePos.x >= _vm->_graphicsManager.ofscroll + 300 && mousePos.y > 221 && mousePos.x <= _vm->_graphicsManager.ofscroll + 358 && mousePos.y <= 246) + _vm->_globals.SVGA = 2; + if (mousePos.x < _vm->_graphicsManager.ofscroll + 165 || mousePos.x > _vm->_graphicsManager.ofscroll + 496 || (uint)(mousePos.y - 107) > 0xD3u) + doneFlag = true; + } + + if (!_vm->_graphicsManager.MANU_SCROLL) + _vm->_globals.opt_scrtype = 2; + if (_vm->_graphicsManager.MANU_SCROLL == 1) + _vm->_globals.opt_scrtype = 1; + if (_vm->_globals.vitesse == 1) + _vm->_globals.opt_vitesse = 6; + if (_vm->_globals.vitesse == 2) + _vm->_globals.opt_vitesse = 5; + if (_vm->_globals.vitesse == 3) + _vm->_globals.opt_vitesse = 4; + + _vm->_globals.opt_txt = !_vm->_soundManager.TEXTOFF ? 7 : 8; + _vm->_globals.opt_voice = !_vm->_soundManager.VOICEOFF ? 7 : 8; + _vm->_globals.opt_sound = !_vm->_soundManager.SOUNDOFF ? 7 : 8; + _vm->_globals.opt_music = !_vm->_soundManager.MUSICOFF ? 7 : 8; + + if (_vm->_globals.SVGA == 1) + _vm->_globals.opt_anm = 10; + if (_vm->_globals.SVGA == 2) + _vm->_globals.opt_anm = 9; + if (_vm->_globals.SVGA == 3) + _vm->_globals.opt_anm = 11; + if (_vm->_graphicsManager.SPEED_SCROLL == 1) + _vm->_globals.opt_scrspeed = 12; + if (_vm->_graphicsManager.SPEED_SCROLL == 2) + _vm->_globals.opt_scrspeed = 13; + if (_vm->_graphicsManager.SPEED_SCROLL == 4) + _vm->_globals.opt_scrspeed = 14; + if (_vm->_graphicsManager.SPEED_SCROLL == 8) + _vm->_globals.opt_scrspeed = 15; + if (_vm->_graphicsManager.SPEED_SCROLL == 16) + _vm->_globals.opt_scrspeed = 16; + if (_vm->_graphicsManager.SPEED_SCROLL == 32) + _vm->_globals.opt_scrspeed = 17; + if (_vm->_graphicsManager.SPEED_SCROLL == 48) + _vm->_globals.opt_scrspeed = 18; + if (_vm->_graphicsManager.SPEED_SCROLL == 64) + _vm->_globals.opt_scrspeed = 19; + if (_vm->_graphicsManager.SPEED_SCROLL == 128) + _vm->_globals.opt_scrspeed = 20; + if (_vm->_graphicsManager.SPEED_SCROLL == 160) + _vm->_globals.opt_scrspeed = 21; + if (_vm->_graphicsManager.SPEED_SCROLL == 320) + _vm->_globals.opt_scrspeed = 22; + if (_vm->_graphicsManager.SPEED_SCROLL == 640) + _vm->_globals.opt_scrspeed = 23; + + _vm->_eventsManager.VBL(); + } while (!doneFlag); + + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, _vm->_graphicsManager.ofscroll + 164, + 107, 335, 215, _vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.ofscroll + 164, 107); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_graphicsManager.ofscroll + 164, 107, + _vm->_graphicsManager.ofscroll + 498, 320); + + _vm->_globals.OPTION_SPR = _vm->_globals.dos_free2(_vm->_globals.OPTION_SPR); + _vm->_globals.OPTION_FLAG = false; +} + +void DialogsManager::showInventory() { + int v1; + size_t filesize; + int v4; + int v5; + int v6; + byte *v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + Common::File f; + + v13 = 0; + if (!VIRE_INVENT && !AFFINVEN && !_vm->_globals.DESACTIVE_INVENT) { + _vm->_graphicsManager.no_scroll = 1; + _vm->_objectsManager.FLAG_VISIBLE_EFFACE = 4; + _vm->_objectsManager.FLAG_VISIBLE = false; + v1 = 0; + do { + INVENT_ANIM(); + _vm->_eventsManager.XMOUSE(); + _vm->_eventsManager.YMOUSE(); + _vm->_eventsManager.VBL(); + ++v1; + } while (v1 <= 1); + _vm->_dialogsManager.Winventaire = g_PTRNUL; + +LABEL_7: + _vm->_eventsManager.souris_bb = 0; + _vm->_eventsManager.souris_b = 0; + _vm->_globals.DESACTIVE_INVENT = true; + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + + switch (_vm->_globals.FR) { + case 0: + _vm->_fileManager.CONSTRUIT_SYSTEM("INVENTAN.SPR"); + break; + case 1: + _vm->_fileManager.CONSTRUIT_SYSTEM("INVENTFR.SPR"); + break; + case 2: + _vm->_fileManager.CONSTRUIT_SYSTEM("INVENTES.SPR"); + break; + } + + if (!f.open(_vm->_globals.NFICHIER)) + error("Error opening file - %s", _vm->_globals.NFICHIER.c_str()); + + filesize = f.size(); + _vm->_dialogsManager.Winventaire = _vm->_globals.dos_malloc2(filesize); + _vm->_fileManager.bload_it(f, _vm->_dialogsManager.Winventaire, filesize); + f.close(); + + _vm->_fileManager.CONSTRUIT_SYSTEM("INVENT2.SPR"); + inventaire2 = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + v19 = _vm->_graphicsManager.ofscroll + 152; + v18 = _vm->_objectsManager.Get_Largeur(_vm->_dialogsManager.Winventaire, 0); + v17 = _vm->_objectsManager.Get_Hauteur(_vm->_dialogsManager.Winventaire, 0); + inventairex = v19; + inventairey = 114; + inventairel = v18; + inventaireh = v17; + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_dialogsManager.Winventaire, + v19 + 300, 414, 0, 0, 0, 0); + v15 = 0; + v4 = 0; + v14 = 1; + do { + v16 = 0; + v5 = 1; + do { + ++v4; + v6 = _vm->_globals.INVENTAIRE[v4]; + if (v6 && v4 <= 29) { + v7 = _vm->_objectsManager.CAPTURE_OBJET(v6, 0); + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, v7, v19 + v16 + 6, + v15 + 120, _vm->_globals.OBJL, _vm->_globals.OBJH); + _vm->_globals.dos_free2(v7); + } + v16 += 54; + ++v5; + } while (v5 <= 6); + v15 += 38; + ++v14; + } while (v14 <= 5); + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_dialogsManager.Winventaire, inventairex, inventairey, inventairel, inventaireh); + _vm->_eventsManager.souris_bb = 0; + v20 = 0; + + // Main loop to select an inventory item + while (!_vm->shouldQuit()) { + // Turn on drawing the inventory dialog in the event manager + AFFINVEN = true; + + v8 = _vm->_eventsManager.XMOUSE(); + v9 = _vm->_eventsManager.YMOUSE(); + v12 = _vm->_eventsManager.BMOUSE(); + v10 = v13; + v11 = _vm->_linesManager.ZONE_OBJET(v8, v9); + v13 = v11; + if (v11 != v10) + _vm->_objectsManager.PARAMCADRE(v11); + if (_vm->_eventsManager.btsouris != 16) { + if ((uint16)(_vm->_eventsManager.btsouris - 1) > 1u) { + if (_vm->_eventsManager.btsouris != 3) { + if (v12 == 2) { + _vm->_objectsManager.OBJETPLUS(v13); + if (_vm->_eventsManager.btsouris != 23) + _vm->_eventsManager.CHANGE_MOUSE(_vm->_eventsManager.btsouris); + } + } + } + } + if (v12 == 1) { + if (_vm->_eventsManager.btsouris == 1 || _vm->_eventsManager.btsouris == 16 || !_vm->_eventsManager.btsouris || (uint16)(_vm->_eventsManager.btsouris - 2) <= 1u) + break; + v9 = v13; + _vm->_objectsManager.VALID_OBJET(_vm->_globals.INVENTAIRE[v13]); + if (_vm->_eventsManager.btsouris == 8) + v20 = 1; + if (v20 != 1) { + _vm->_scriptManager.TRAVAILOBJET = 1; + _vm->_globals.SAUVEGARDE->data[svField3] = _vm->_globals.OBJET_EN_COURS; + _vm->_globals.SAUVEGARDE->data[svField8] = _vm->_globals.INVENTAIRE[v13]; + _vm->_globals.SAUVEGARDE->data[svField9] = _vm->_eventsManager.btsouris; + _vm->_objectsManager.OPTI_OBJET(); + _vm->_scriptManager.TRAVAILOBJET = 0; + + if (_vm->_soundManager.VOICEOFF == 1) { + do + _vm->_eventsManager.VBL(); + while (!_vm->_globals.SORTIE && _vm->_eventsManager.BMOUSE() != 1); + _vm->_fontManager.TEXTE_OFF(9); + } + if (_vm->_globals.SORTIE) { + if (_vm->_globals.SORTIE == 2) + v20 = 1; + _vm->_globals.SORTIE = 0; + if (v20 != 1) { + inventaire2 = _vm->_globals.dos_free2(inventaire2); + if (g_PTRNUL != _vm->_dialogsManager.Winventaire) + _vm->_dialogsManager.Winventaire = _vm->_globals.dos_free2(_vm->_dialogsManager.Winventaire); + goto LABEL_7; + } + } else if (v20 != 1) { + AFFINVEN = true; + } + } + } + if (VIRE_INVENT == true) + v20 = 1; + if (v20 == 1) + break; + _vm->_eventsManager.VBL(); + if ((uint16)(_vm->_globals.ECRAN - 35) <= 5u) + _vm->_objectsManager.SPECIAL_JEU(); + } + _vm->_fontManager.TEXTE_OFF(9); + if (AFFINVEN) { + AFFINVEN = false; + v9 = 114; + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, v19, 114, v18, v17, _vm->_graphicsManager.VESA_BUFFER, v19, 114); + _vm->_graphicsManager.Ajoute_Segment_Vesa(v19, 114, v19 + v18, v18 + 114); + _vm->_objectsManager.BOBTOUS = true; + } + if (_vm->_dialogsManager.Winventaire != g_PTRNUL) + _vm->_dialogsManager.Winventaire = _vm->_globals.dos_free2(_vm->_dialogsManager.Winventaire); + inventaire2 = _vm->_globals.dos_free2(inventaire2); + + if (_vm->_eventsManager.btsouris == 1) + showOptionsDialog(); + if (_vm->_eventsManager.btsouris == 3) + _vm->_dialogsManager.CHARGE_PARTIE(); + if (_vm->_eventsManager.btsouris == 2) + _vm->_dialogsManager.SAUVE_PARTIE(); + + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(4); + _vm->_objectsManager.old_cady = 0; + _vm->_objectsManager.cady = 0; + _vm->_objectsManager.old_cadx = 0; + _vm->_objectsManager.cadx = 0; + _vm->_globals.DESACTIVE_INVENT = false; + _vm->_graphicsManager.no_scroll = 0; + } +} + +void DialogsManager::INVENT_ANIM() { + int v0; + int v1; + + if (!DESACTIVE_INVENT) { + if (_vm->_objectsManager.FLAG_VISIBLE_EFFACE && !_vm->_objectsManager.FLAG_VISIBLE) { + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, _vm->_objectsManager.I_old_x, 27, 48, 38, + _vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.I_old_x, 27); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_objectsManager.I_old_x, 27, _vm->_objectsManager.I_old_x + 48, 65); + --_vm->_objectsManager.FLAG_VISIBLE_EFFACE; + } + + if (_vm->_objectsManager.FLAG_VISIBLE) { + if (_vm->_objectsManager.I_old_x <= 1) + _vm->_objectsManager.I_old_x = 2; + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, _vm->_objectsManager.I_old_x, 27, 48, 38, + _vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.I_old_x, 27); + + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_objectsManager.I_old_x, 27, _vm->_objectsManager.I_old_x + 48, 65); + v0 = _vm->_graphicsManager.ofscroll + 2; + v1 = _vm->_graphicsManager.ofscroll + 2; + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.ICONE, v1 + 300, 327, 0); + _vm->_graphicsManager.Ajoute_Segment_Vesa(v1, 27, v1 + 45, 62); + _vm->_objectsManager.I_old_x = v0; + } + + if (_vm->_globals.SAUVEGARDE->data[svField357] == 1) { + if (_vm->_globals.SAUVEGARDE->data[svField353] == 1) + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.TETE, 832, 325, 0, 0, 0, 0); + if (_vm->_globals.SAUVEGARDE->data[svField355] == 1) + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.TETE, 866, 325, 1, 0, 0, 0); + _vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 560, 60); + _vm->_graphicsManager.Ajoute_Segment_Vesa(566, 25, 594, 60); + } + if (_vm->_globals.SAUVEGARDE->data[svField356] == 1) { + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.TETE, 832, 325, 0, 0, 0, 0); + _vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 560, 60); + } + + if (_vm->_globals.SAUVEGARDE->data[svField354] == 1) { + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.TETE, 832, 325, 0, 0, 0, 0); + _vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 560, 60); + } + } +} + +void DialogsManager::TestForDialogOpening() { + if (_vm->_globals.PLAN_FLAG) + _vm->_eventsManager.GAME_KEY = KEY_NONE; + + if (_vm->_eventsManager.GAME_KEY != KEY_NONE) { + if (!INVENTFLAG) { + DIALOG_KEY key = _vm->_eventsManager.GAME_KEY; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + INVENTFLAG = true; + + switch (key) { + case KEY_INVENTORY: + _vm->_dialogsManager.showInventory(); + break; + case KEY_OPTIONS: + _vm->_dialogsManager.showOptionsDialog(); + break; + case KEY_LOAD: + _vm->_dialogsManager.CHARGE_PARTIE(); + break; + case KEY_SAVE: + _vm->_dialogsManager.SAUVE_PARTIE(); + break; + default: + break; + } + + INVENTFLAG = false; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + } + } +} + +// Load Game +void DialogsManager::CHARGE_PARTIE() { + int slotNumber; + + _vm->_eventsManager.VBL(); + LOAD_SAUVE(2); + do { + do { + slotNumber = CHERCHE_PARTIE(); + _vm->_eventsManager.VBL(); + } while (_vm->_eventsManager.BMOUSE() != 1); + } while (!slotNumber); + _vm->_objectsManager.SL_FLAG = false; + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x + 183, 60, 274, 353, _vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x + 183, 60); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_eventsManager.start_x + 183, 60, 457, 413); + _vm->_objectsManager.BOBTOUS = true; + _vm->_objectsManager.SL_SPR = _vm->_globals.dos_free2(_vm->_objectsManager.SL_SPR); + _vm->_objectsManager.SL_SPR2 = _vm->_globals.dos_free2(_vm->_objectsManager.SL_SPR2); + _vm->_objectsManager.SL_X = 0; + _vm->_objectsManager.SL_Y = 0; + + if (slotNumber != 7) { + _vm->_saveLoadManager.restore(slotNumber); + } + + _vm->_objectsManager.CHANGE_OBJET(14); +} + +// Save Game +void DialogsManager::SAUVE_PARTIE() { + int slotNumber; + Common::String saveName; + + _vm->_eventsManager.VBL(); + + LOAD_SAUVE(1); + do { + do { + slotNumber = CHERCHE_PARTIE(); + _vm->_eventsManager.VBL(); + } while (!_vm->shouldQuit() && _vm->_eventsManager.BMOUSE() != 1); + } while (!_vm->shouldQuit() && !slotNumber); + + _vm->_objectsManager.SL_FLAG = false; + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, _vm->_eventsManager.start_x + 183, 60, 274, 353, _vm->_graphicsManager.VESA_BUFFER, _vm->_eventsManager.start_x + 183, 60); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_eventsManager.start_x + 183, 60, _vm->_eventsManager.start_x + 457, 413); + _vm->_objectsManager.BOBTOUS = true; + _vm->_objectsManager.SL_SPR = _vm->_globals.dos_free2(_vm->_objectsManager.SL_SPR); + _vm->_objectsManager.SL_SPR2 = _vm->_globals.dos_free2(_vm->_objectsManager.SL_SPR2); + _vm->_objectsManager.SL_X = 0; + _vm->_objectsManager.SL_Y = 0; + + if (slotNumber != 7) { + // Since the original GUI doesn't support save names, use a default name + saveName = Common::String::format("Save #%d", slotNumber); + + // Save the game + _vm->_saveLoadManager.save(slotNumber, saveName); + } +} + + +// Load Save +void DialogsManager::LOAD_SAUVE(int a1) { + int slotNumber; + hopkinsSavegameHeader header; + byte *thumb; + + switch (_vm->_globals.FR) { + case 0: + _vm->_fileManager.CONSTRUIT_SYSTEM("SAVEAN.SPR"); + break; + case 1: + _vm->_fileManager.CONSTRUIT_SYSTEM("SAVEFR.SPR"); + break; + case 2: + _vm->_fileManager.CONSTRUIT_SYSTEM("SAVEES.SPR"); + break; + } + + _vm->_objectsManager.SL_SPR = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER); + _vm->_fileManager.CONSTRUIT_SYSTEM("SAVE2.SPR"); + _vm->_objectsManager.SL_SPR2 = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 483, 360, 0); + + if (_vm->_globals.FR) { + if (a1 == 1) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 525, 375, 1); + if (a1 == 2) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 515, 375, 2); + } else { + if (a1 == 1) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 535, 372, 1); + if (a1 == 2) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 539, 372, 2); + } + + for (slotNumber = 1; slotNumber <= 6; ++slotNumber) { + if (_vm->_saveLoadManager.readSavegameHeader(slotNumber, header)) { + thumb = (byte *)header.thumbnail->pixels; + + switch (slotNumber) { + case 1: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 190, 112, 0x80u, 87); + break; + case 2: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 323, 112, 0x80u, 87); + break; + case 3: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 190, 203, 0x80u, 87); + break; + case 4: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 323, 203, 0x80u, 87); + break; + case 5: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 190, 294, 0x80u, 87); + break; + case 6: + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, thumb, _vm->_eventsManager.start_x + 323, 294, 0x80u, 87); + break; + } + + delete header.thumbnail; + } + } + + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_objectsManager.SL_SPR, _vm->_eventsManager.start_x + 183, 60, 0x112u, 353); + _vm->_objectsManager.SL_FLAG = true; + _vm->_objectsManager.SL_MODE = a1; + _vm->_objectsManager.SL_X = 0; + _vm->_objectsManager.SL_Y = 0; +} + +// Search Game +int DialogsManager::CHERCHE_PARTIE() { + int slotNumber; + int xp; + int yp; + + slotNumber = 0; + xp = _vm->_eventsManager.XMOUSE(); + yp = _vm->_eventsManager.YMOUSE(); + + _vm->_graphicsManager.ofscroll = _vm->_eventsManager.start_x; + if ((uint16)(yp - 112) <= 0x56u) { + if (xp > _vm->_eventsManager.start_x + 189 && xp < _vm->_eventsManager.start_x + 318) + slotNumber = 1; + if ((uint16)(yp - 112) <= 0x56u && xp > _vm->_graphicsManager.ofscroll + 322 && xp < _vm->_graphicsManager.ofscroll + 452) + slotNumber = 2; + } + if ((uint16)(yp - 203) <= 0x56u) { + if (xp > _vm->_graphicsManager.ofscroll + 189 && xp < _vm->_graphicsManager.ofscroll + 318) + slotNumber = 3; + if ((uint16)(yp - 203) <= 0x56u && xp > _vm->_graphicsManager.ofscroll + 322 && xp < _vm->_graphicsManager.ofscroll + 452) + slotNumber = 4; + } + if ((uint16)(yp - 294) <= 0x56u) { + if (xp > _vm->_graphicsManager.ofscroll + 189 && xp < _vm->_graphicsManager.ofscroll + 318) + slotNumber = 5; + if ((uint16)(yp - 294) <= 0x56u && xp > _vm->_graphicsManager.ofscroll + 322 && xp < _vm->_graphicsManager.ofscroll + 452) + slotNumber = 6; + } + if ((uint16)(yp - 388) <= 0x10u && xp > _vm->_graphicsManager.ofscroll + 273 && xp < _vm->_graphicsManager.ofscroll + 355) + slotNumber = 7; + if (slotNumber == 1) { + _vm->_objectsManager.SL_X = 189; + _vm->_objectsManager.SL_Y = 111; + } + if (slotNumber == 2) { + _vm->_objectsManager.SL_X = 322; + _vm->_objectsManager.SL_Y = 111; + } + if (slotNumber == 3) { + _vm->_objectsManager.SL_X = 189; + _vm->_objectsManager.SL_Y = 202; + } + if (slotNumber == 4) { + _vm->_objectsManager.SL_X = 322; + _vm->_objectsManager.SL_Y = 202; + } + if (slotNumber == 5) { + _vm->_objectsManager.SL_X = 189; + _vm->_objectsManager.SL_Y = 293; + } + if (slotNumber == 6) { + _vm->_objectsManager.SL_X = 322; + _vm->_objectsManager.SL_Y = 293; + } + if (slotNumber == 7 || !slotNumber) { + _vm->_objectsManager.SL_X = 0; + _vm->_objectsManager.SL_Y = 0; + } + return slotNumber; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/dialogs.h b/engines/hopkins/dialogs.h new file mode 100644 index 0000000000..3f4cdfadbb --- /dev/null +++ b/engines/hopkins/dialogs.h @@ -0,0 +1,67 @@ +/* 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. + * + */ + +#ifndef HOPKINS_DIALOGS_H +#define HOPKINS_DIALOGS_H + +#include "common/scummsys.h" +#include "common/system.h" +#include "common/error.h" + +namespace Hopkins { + +class HopkinsEngine; + +/** + * Class for manging game dialogs + */ +class DialogsManager { +private: + HopkinsEngine *_vm; +public: + bool DESACTIVE_INVENT; + bool INVENTFLAG; + bool AFFINVEN; + bool VIRE_INVENT; + int inventairex, inventairey; + int inventairel, inventaireh; + byte *Winventaire; + byte *inventaire2; +public: + DialogsManager(); + ~DialogsManager(); + void setParent(HopkinsEngine *vm); + + void showOptionsDialog(); + void showInventory(); + + void INVENT_ANIM(); + void TestForDialogOpening(); + void CHARGE_PARTIE(); + void SAUVE_PARTIE(); + void LOAD_SAUVE(int a1); + int CHERCHE_PARTIE(); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_MENU_H */ diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp new file mode 100644 index 0000000000..0b3d252f57 --- /dev/null +++ b/engines/hopkins/events.cpp @@ -0,0 +1,501 @@ +/* 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/system.h" +#include "common/textconsole.h" +#include "hopkins/events.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/hopkins.h" +#include "hopkins/sound.h" + +namespace Hopkins { + +EventsManager::EventsManager() { + souris_flag = false; + mouse_linux = false; + souris_sizex = souris_sizey = 0; + ofset_souris_x = ofset_souris_y = 0; + start_x = start_y = 0; + CASSE = false; + souris_n = 0; + souris_bb = 0; + souris_b = 0; + pointeur_souris = NULL; + _gameCounter = 0; + lItCounter = 0; + ESC_KEY = false; + GAME_KEY = KEY_NONE; + btsouris = 0; + OLD_ICONE = 0; + + _priorCounterTime = 0; + _priorFrameTime = 0; +} + +void EventsManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +// Install Mouse +void EventsManager::INSTALL_SOURIS() { + // No implementation in original +} + +// Mouse On +void EventsManager::souris_on() { + souris_flag = true; + + if (mouse_linux) { + souris_sizex = 52; + souris_sizey = 32; + } else { + souris_sizex = 34; + souris_sizey = 20; + } + + ofset_souris_x = 0; + ofset_souris_y = 0; + + if (!CASSE) + souris_xy(300, 200); + else + souris_xy(150, 100); +} + +// Set Mouse position +void EventsManager::souris_xy(int xp, int yp) { + g_system->warpMouse(xp, yp); +} + +// Mouse Max +void EventsManager::souris_max() { + // No implementation in original +} + +// Get Mouse X +int EventsManager::XMOUSE() { + souris_x = start_x + g_system->getEventManager()->getMousePos().x; + souris_y = g_system->getEventManager()->getMousePos().y; + + return souris_x + ofset_souris_x; +} + +// Get Mouse Y +int EventsManager::YMOUSE() { + souris_x = start_x + g_system->getEventManager()->getMousePos().x; + souris_y = g_system->getEventManager()->getMousePos().y; + + return souris_y + ofset_souris_y; +} + +// Get Mouse Button +int EventsManager::BMOUSE() { + CONTROLE_MES(); + return souris_bb; +} + +// Mouse Off +void EventsManager::MOUSE_OFF() { + souris_flag = false; + g_system->showMouse(false); +} + +// Mouse On +void EventsManager::MOUSE_ON() { + souris_on(); + souris_flag = true; + g_system->showMouse(true); +} + +// Change Mouse Cursor +void EventsManager::CHANGE_MOUSE(int id) { + int cursorId = id; + + if (btsouris != 23) { + if (id == 4 && btsouris == 4 && _vm->_globals.NOMARCHE) + cursorId = 0; + if (cursorId == 25) + cursorId = 5; + + if (OLD_ICONE != cursorId || !cursorId) { + OLD_ICONE = cursorId; + souris_n = cursorId; + + // Backup the current sprite clipping bounds and reset them + Common::Rect clipBounds(_vm->_graphicsManager.min_x, _vm->_graphicsManager.min_y, + _vm->_graphicsManager.max_x, _vm->_graphicsManager.max_y); + _vm->_graphicsManager.min_x = _vm->_graphicsManager.min_y = 0; + _vm->_graphicsManager.max_x = _vm->_globals.OBJL; + _vm->_graphicsManager.max_y = _vm->_globals.OBJH; + int pitch = _vm->_graphicsManager.nbrligne2; + _vm->_graphicsManager.nbrligne2 = _vm->_globals.OBJL; + + // Draw the cursor onto a temporary surface + byte *cursorSurface = new byte[_vm->_globals.OBJH * _vm->_globals.OBJL]; + Common::fill(cursorSurface, cursorSurface + _vm->_globals.OBJH * _vm->_globals.OBJL, 0); + _vm->_graphicsManager.Sprite_Vesa(cursorSurface, pointeur_souris, 300, 300, cursorId); + + // Reset the clipping bounds + _vm->_graphicsManager.min_x = clipBounds.left; + _vm->_graphicsManager.min_y = clipBounds.top; + _vm->_graphicsManager.max_x = clipBounds.right; + _vm->_graphicsManager.max_y = clipBounds.bottom; + _vm->_graphicsManager.nbrligne2 = pitch; + + // Convert the cursor to the pixel format. At the moment, it's hardcoded + // to expect the game to be in 16-bit mode + uint16 *cursorPixels = new uint16[_vm->_globals.OBJH * _vm->_globals.OBJL]; + const byte *srcP = cursorSurface; + uint16 *destP = cursorPixels; + + for (int yp = 0; yp < _vm->_globals.OBJH; ++yp) { + const byte *lineSrcP = srcP; + uint16 *lineDestP = destP; + + for (int xp = 0; xp < _vm->_globals.OBJL; ++xp) + *lineDestP++ = *(uint16 *)&_vm->_graphicsManager.PAL_PIXELS[*lineSrcP++ * 2]; + + srcP += _vm->_globals.OBJL; + destP += _vm->_globals.OBJL; + } + + // Calculate the X offset within the pointer image to the actual cursor data + int xOffset = !mouse_linux ? 10 : 20; + + // Set the ScummVM cursor from the surface + Graphics::PixelFormat pixelFormat = g_system->getScreenFormat(); + g_system->setMouseCursor(cursorPixels, _vm->_globals.OBJL, _vm->_globals.OBJH, + xOffset, 0, 0, true, &pixelFormat); + + // Delete the cursor surface + delete[] cursorPixels; + delete[] cursorSurface; + } + } +} + +// Check Events +void EventsManager::CONTROLE_MES() { + pollEvents(); +} + +void EventsManager::checkForNextFrameCounter() { + // Check for whether to increment the game counter + uint32 milli = g_system->getMillis(); + while ((milli - _priorCounterTime) >= 10) { + _priorCounterTime += 10; + lItCounter += 3; + } + + // Check for next game frame + if ((milli - _priorFrameTime) >= GAME_FRAME_TIME) { + ++_gameCounter; + _priorFrameTime = milli; + g_system->updateScreen(); + + // Signal the ScummVM debugger + _vm->_debugger.onFrame(); + } +} + +void EventsManager::delay(int totalMilli) { + uint32 delayEnd = g_system->getMillis() + totalMilli; + + while (!g_system->getEventManager()->shouldQuit() && g_system->getMillis() < delayEnd) { + g_system->delayMillis(10); + } +} + +void EventsManager::pollEvents() { + checkForNextFrameCounter(); + + Common::Event event; + while (g_system->getEventManager()->pollEvent(event)) { + // Handle keypress + switch (event.type) { + case Common::EVENT_QUIT: + case Common::EVENT_RTL: + return; + + case Common::EVENT_KEYDOWN: + handleKey(event); + return; + + case Common::EVENT_LBUTTONDOWN: + souris_b = 1; + break; + case Common::EVENT_RBUTTONDOWN: + souris_b = 2; + break; + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONUP: + souris_b = 0; + return; + + default: + break; + } + } +} + +void EventsManager::handleKey(Common::Event &event) { + ESC_KEY = event.kbd.keycode == Common::KEYCODE_ESCAPE; + + if (event.kbd.keycode == Common::KEYCODE_i || event.kbd.keycode == Common::KEYCODE_TAB) + GAME_KEY = KEY_INVENTORY; + else if (event.kbd.keycode == Common::KEYCODE_F5) + GAME_KEY = KEY_SAVE; + else if (event.kbd.keycode == Common::KEYCODE_F7) + GAME_KEY = KEY_LOAD; + else if (event.kbd.keycode == Common::KEYCODE_F1 || event.kbd.keycode == Common::KEYCODE_o) + GAME_KEY = KEY_OPTIONS; + + // Check for debugger + if ((event.kbd.keycode == Common::KEYCODE_d) && (event.kbd.flags & Common::KBD_CTRL)) { + // Attach to the debugger + _vm->_debugger.attach(); + _vm->_debugger.onFrame(); + } + +} + +void EventsManager::VBL() { + int v1; + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + int v10; + signed int v11 = 0; + signed int v12 = 0; + int v13 = 0; + unsigned int v14 = 0; + int v15 = 0; + int yp = 0; + + if (_vm->_graphicsManager.REDRAW) { + _vm->_graphicsManager.DD_Lock(); + if (CASSE) { + _vm->_graphicsManager.CopyAsm(_vm->_graphicsManager.VESA_BUFFER); + _vm->_graphicsManager.REDRAW = 0; + } else { + if (_vm->_globals.iRegul == 3) + _vm->_graphicsManager.m_scroll(_vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.ofscroll, 50, 0x280u, 340, 0, 50); + else + _vm->_graphicsManager.m_scroll(_vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.ofscroll, 20, 0x280u, 440, 0, 20); + _vm->_fileManager.DMESS(); + --_vm->_graphicsManager.REDRAW; + } + _vm->_graphicsManager.DD_Unlock(); + } + if (souris_flag == true) { + v1 = 20; + if (!mouse_linux) + v1 = 10; + v2 = 20; + if (!mouse_linux) + v2 = 15; + v15 = souris_x - v1; + yp = souris_y; + v14 = souris_sizex; + v13 = souris_sizey; + if (btsouris == 23) { + v14 = _vm->_globals.OBJL; + v13 = _vm->_globals.OBJH; + goto LABEL_35; + } + if (CASSE) { + if (v15 < _vm->_graphicsManager.min_x) + v15 = _vm->_graphicsManager.min_x; + if (souris_y < _vm->_graphicsManager.min_y) + yp = _vm->_graphicsManager.min_y; + if (souris_sizex + v15 >= _vm->_graphicsManager.max_x) + v14 = souris_sizex - (souris_sizex + v15 - _vm->_graphicsManager.max_x); + if (yp + souris_sizey < _vm->_graphicsManager.max_y) + goto LABEL_34; + v3 = yp + souris_sizey - _vm->_graphicsManager.max_y; + } else { + if (v15 < _vm->_graphicsManager.min_x) + v15 = _vm->_graphicsManager.min_x - v1; + v2 = (int16)v2; + if (souris_y < _vm->_graphicsManager.min_y - (int16)v2) + yp = _vm->_graphicsManager.min_y - (int16)v2; + if (souris_sizex + v15 >= _vm->_graphicsManager.max_x) + v14 = souris_sizex - (souris_sizex + v15 - _vm->_graphicsManager.max_x - v1); + if (yp + souris_sizey < v2 + _vm->_graphicsManager.max_y) + goto LABEL_34; + v3 = v2 + yp + souris_sizey - _vm->_graphicsManager.max_y; + } + v13 = souris_sizey - v3; +LABEL_34: + v12 = v14 + v15; + v11 = yp + v13; + } +LABEL_35: + if (!_vm->_globals.PUBEXIT) + _vm->_objectsManager.AFF_SPRITES(); + if (souris_flag != true) + goto LABEL_54; + if (btsouris == 23) + goto LABEL_45; + if (yp >= _vm->_graphicsManager.max_y || v15 >= _vm->_graphicsManager.max_x || v14 <= 1 || v13 <= 1) { + if (btsouris != 23) + goto LABEL_54; +LABEL_45: + if (yp < _vm->_graphicsManager.max_y && v15 < _vm->_graphicsManager.max_x) { + if ((signed int)(v14 + v15) > _vm->_graphicsManager.max_x) + v14 -= v14 + v15 - _vm->_graphicsManager.max_x; + if (yp + v13 > _vm->_graphicsManager.max_y) + v13 -= yp + v13 - _vm->_graphicsManager.max_y; + if (v14 > 1 && v13 > 1) { +/* Commented out in favour of using ScummVM cursor display + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.cache_souris, v15, yp, v14, v13); +*/ + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.Bufferobjet, v15 + 300, yp + 300, 0, 0, 0, 0); + _vm->_graphicsManager.Ajoute_Segment_Vesa(v15, yp, v14 + v15, yp + v13); + } + } + goto LABEL_54; + } + +/* Commented out in favour of using ScummVM cursor display + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.cache_souris, v15, yp, v14, v13); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, pointeur_souris, v15 + 300, yp + 300, souris_n); +*/ + _vm->_graphicsManager.Ajoute_Segment_Vesa(v15, yp, v12, v11); +LABEL_54: + _vm->_globals.vitesse = 2; + do { + while (!_vm->shouldQuit()) { + checkForNextFrameCounter(); + + while (CASSE || _vm->_globals.iRegul != 1) { + if (CASSE != true) + goto LABEL_63; + if (lItCounter > 1) + goto LABEL_65; + } + if (_vm->_globals.vitesse != 2) + break; + if (lItCounter > 9) + goto LABEL_65; + } +LABEL_63: + ; + } while (!_vm->shouldQuit() && _vm->_globals.iRegul == 3 && lItCounter <= 15); +LABEL_65: + _vm->_globals.vitesse = 2; + lItCounter = 0; + if (_vm->_graphicsManager.DOUBLE_ECRAN != true || _vm->_graphicsManager.no_scroll == 1) { + _vm->_graphicsManager.Affiche_Segment_Vesa(); + } else { + if (_vm->_graphicsManager.no_scroll != 2) { + if (XMOUSE() > _vm->_graphicsManager.SCROLL + 620) + _vm->_graphicsManager.SCROLL += _vm->_graphicsManager.SPEED_SCROLL; + if (XMOUSE() < _vm->_graphicsManager.SCROLL + 10) + _vm->_graphicsManager.SCROLL -= _vm->_graphicsManager.SPEED_SCROLL; + } + if (_vm->_graphicsManager.SCROLL < 0) + _vm->_graphicsManager.SCROLL = 0; + if (_vm->_graphicsManager.SCROLL > 640) + _vm->_graphicsManager.SCROLL = 640; + if (_vm->_graphicsManager.SDL_ECHELLE) + v4 = _vm->_graphicsManager.Magic_Number(_vm->_graphicsManager.SCROLL); + else + v4 = _vm->_graphicsManager.SCROLL; + if (_vm->_graphicsManager.OLD_SCROLL == v4) { + _vm->_graphicsManager.Affiche_Segment_Vesa(); + } else { + _vm->_fontManager.TEXTE_OFF(9); + _vm->_graphicsManager.DD_Lock(); + if (_vm->_graphicsManager.SDL_ECHELLE) { + if (_vm->_graphicsManager.Winbpp == 2) { + v5 = _vm->_graphicsManager.Reel_Zoom(0x14u, _vm->_graphicsManager.SDL_ECHELLE); + _vm->_graphicsManager.m_scroll16A(_vm->_graphicsManager.VESA_BUFFER, v4, 20, 640, 440, 0, v5); + } else { + v6 = _vm->_graphicsManager.Reel_Zoom(0x14u, _vm->_graphicsManager.SDL_ECHELLE); + _vm->_graphicsManager.m_scroll2A(_vm->_graphicsManager.VESA_BUFFER, v4, 20, 640, 440, 0, v6); + } + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.dstrect[0].left = _vm->_graphicsManager.Reel_Zoom(0, _vm->_graphicsManager.SDL_ECHELLE); + _vm->_graphicsManager.dstrect[0].top = _vm->_graphicsManager.Reel_Zoom(0x14u, _vm->_graphicsManager.SDL_ECHELLE); + _vm->_graphicsManager.dstrect[0].setWidth(_vm->_graphicsManager.Reel_Zoom(0x280u, _vm->_graphicsManager.SDL_ECHELLE)); + _vm->_graphicsManager.dstrect[0].setHeight(_vm->_graphicsManager.Reel_Zoom(0x1B8u, _vm->_graphicsManager.SDL_ECHELLE)); + } else { + if (_vm->_graphicsManager.Winbpp == 2) + _vm->_graphicsManager.m_scroll16(_vm->_graphicsManager.VESA_BUFFER, v4, 20, 640, 440, 0, 20); + else + _vm->_graphicsManager.m_scroll2(_vm->_graphicsManager.VESA_BUFFER, v4, 20, 640, 440, 0, 20); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.dstrect[0] = Common::Rect(0, 20, 640, 460); + } + if (!_vm->_globals.BPP_NOAFF) { +// SDL_UpdateRects(LinuxScr, 1, dstrect); + } + if (_vm->_globals.NBBLOC) { + v7 = 1; + v10 = _vm->_globals.NBBLOC + 1; + do { + if (_vm->_globals.BLOC[v7].field0 == 1) + _vm->_globals.BLOC[v7].field0 = 0; + ++v7; + } while (v10 != v7); + } + _vm->_globals.NBBLOC = 0; + start_x = v4; + _vm->_graphicsManager.ofscroll = v4; + _vm->_graphicsManager.SCROLL = v4; + } + _vm->_graphicsManager.OLD_SCROLL = v4; + start_x = v4; + _vm->_graphicsManager.ofscroll = v4; + } + souris_bb = souris_b; + souris_b = 0; + if (souris_flag == true) { + if (btsouris != 23) { + if (yp < _vm->_graphicsManager.max_y && v15 < _vm->_graphicsManager.max_x && v14 > 1 && v13 > 1) { +/* Commented out in favour of using ScummVM cursor display + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.cache_souris, v15, yp, v14, v13); + _vm->_graphicsManager.Ajoute_Segment_Vesa(v15, yp, v12, v11); +*/ + goto LABEL_113; + } + if (btsouris != 23) + goto LABEL_113; + } + if (yp < _vm->_graphicsManager.max_y && v15 < _vm->_graphicsManager.max_x && v14 > 1 && v13 > 1) { +/* Commented out in favour of using ScummVM cursor display + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.cache_souris, v15, yp, v14, v13); + _vm->_graphicsManager.Ajoute_Segment_Vesa(v15, yp, v14 + v15, yp + v13); +*/ + } + } +LABEL_113: + _vm->_soundManager.VERIF_SOUND(); + CONTROLE_MES(); +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/events.h b/engines/hopkins/events.h new file mode 100644 index 0000000000..364a74fcf8 --- /dev/null +++ b/engines/hopkins/events.h @@ -0,0 +1,89 @@ +/* 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. + * + */ + +#ifndef HOPKINS_EVENTS_H +#define HOPKINS_EVENTS_H + +#include "common/scummsys.h" +#include "common/events.h" +#include "common/str.h" + +namespace Hopkins { + +#define GAME_FRAME_RATE 50 +#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE) + +class HopkinsEngine; + +enum DIALOG_KEY { KEY_NONE = 0, KEY_INVENTORY = 1, KEY_OPTIONS = 2, KEY_SAVE = 3, KEY_LOAD = 4 }; + +class EventsManager { +private: + HopkinsEngine *_vm; + + void pollEvents(); + void handleKey(Common::Event &event); + void checkForNextFrameCounter(); +public: + bool souris_flag; + bool mouse_linux; + int souris_sizex, souris_sizey; + int ofset_souris_x, ofset_souris_y; + int start_x, start_y; + int souris_x, souris_y; + bool CASSE; + int OLD_ICONE; + int souris_n; + int souris_bb; + int souris_b; + byte *pointeur_souris; + uint32 _gameCounter; + uint32 lItCounter; + uint32 _priorCounterTime; + uint32 _priorFrameTime; + bool ESC_KEY; + bool NOESC; + DIALOG_KEY GAME_KEY; + int btsouris; +public: + EventsManager(); + void setParent(HopkinsEngine *vm); + + void INSTALL_SOURIS(); + void souris_on(); + void souris_xy(int xp, int yp); + void souris_max(); + int XMOUSE(); + int YMOUSE(); + int BMOUSE(); + void MOUSE_ON(); + void MOUSE_OFF(); + void CHANGE_MOUSE(int id); + + void CONTROLE_MES(); + void delay(int delay); + void VBL(); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_EVENTS_H */ diff --git a/engines/hopkins/files.cpp b/engines/hopkins/files.cpp new file mode 100644 index 0000000000..79b672ca33 --- /dev/null +++ b/engines/hopkins/files.cpp @@ -0,0 +1,323 @@ +/* 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 "hopkins/files.h" +#include "hopkins/hopkins.h" +#include "hopkins/globals.h" +#include "common/system.h" +#include "common/debug.h" +#include "common/file.h" +#include "common/str.h" +#include "common/savefile.h" + +namespace Hopkins { + +FileManager::FileManager() { +} + +void FileManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +// Load INI File +void FileManager::Chage_Inifile(Common::StringMap &iniParams) { + // TODO: Review whether we can do something cleaner with ScummVM initialisation than + // just initialising the INI array as if it had read in the INI file + + iniParams["FULLSCREEN"] = "NO"; + iniParams["SETMODE"] = "1"; // 640x480 + iniParams["ZOOM"] = "100"; // No zooming + iniParams["VIDEOMEM"] = "YES"; + iniParams["FORCE8BITS"] = "NO"; + iniParams["FORCE16BITS"] = "YES"; + iniParams["SOUND"] = "YES"; +} + +// Load File +byte *FileManager::CHARGE_FICHIER(const Common::String &file) { + DMESS1(); + + Common::File f; + if (!f.open(file)) + error("Error opening %s", file.c_str()); + + // Allocate space for the file contents + size_t filesize = f.size(); + byte *data = _vm->_globals.dos_malloc2(filesize); + if (!data) + error("Error allocating space for file being loaded - %s", file.c_str()); + + bload_it(f, data, filesize); + f.close(); + + return data; +} + +// Load File 2 +void FileManager::CHARGE_FICHIER2(const Common::String &file, byte *buf) { + Common::File f; + size_t filesize; + + DMESS1(); + if (!f.open(file)) + error("Error opening file - %s", file.c_str()); + + filesize = f.size(); + _vm->_fileManager.bload_it(f, buf, filesize); + f.close(); +} + +// Guess: Debug Message +void FileManager::DMESS() { + // No implementation in original +} + +// Guess: Debug Message 1 +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(); + _vm->_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); +} + +// Censorship +void FileManager::F_Censure() { + _vm->_globals.CENSURE = false; + + CONSTRUIT_SYSTEM("BLOOD.DAT"); + char *data = (char *)CHARGE_FICHIER(_vm->_globals.NFICHIER); + + if (*(data + 6) == 'f' && *(data + 7) == 'r') + _vm->_globals.CENSURE = false; + if (*(data + 6) == 'F' && *(data + 7) == 'R') + _vm->_globals.CENSURE = false; + if (*(data + 6) == 'u' && *(data + 7) == 'k') + _vm->_globals.CENSURE = true; + if (*(data + 6) == 'U' && *(data + 7) == 'K') + _vm->_globals.CENSURE = true; + + free(data); +} + +// Build System +int FileManager::CONSTRUIT_SYSTEM(const Common::String &file) { + _vm->_globals.NFICHIER = Common::String::format("system/%s", file.c_str()); + return _vm->_globals.NFICHIER.size(); +} + +// Build File +void FileManager::CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file) { + // At this point, the original program did a big switch statement to determine + // whether to preprend the CD or installed directory path into REPJEU + + if (hop[0] == 'A' && hop[1] == 'N' && hop[2] == 'N') { + error("TODO: CONSTRUIT_FICHIER"); + } + + _vm->_globals.NFICHIER = Common::String::format("%s/%s", hop.c_str(), file.c_str()); +} + +// Free File +byte *FileManager::LIBERE_FICHIER(byte *ptr) { + free(ptr); + return g_PTRNUL; +} + +// Search Cat +byte *FileManager::RECHERCHE_CAT(const Common::String &file, int a2) { + byte *ptr = NULL; + Common::File f; + + Common::String filename = file; + filename.toUppercase(); + + switch (a2) { + case 1: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_INI.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_INI.RES"); + break; + + case 2: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_REP.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_REP.RES"); + break; + + case 3: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_LIN.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_LIN.RES"); + break; + + case 4: + CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_ANI.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_ANI.RES"); + break; + + case 5: + CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_PER.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_PER.RES"); + break; + + case 6: + CONSTRUIT_FICHIER(_vm->_globals.HOPIMAGE, "PIC.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + break; + + case 7: + CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_SAN.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + break; + + case 8: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_SLI.CAT"); + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + break; + + case 9: + switch (_vm->_globals.FR) { + case 0: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_VAN.CAT"); + break; + case 1: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_VFR.CAT"); + break; + case 2: + CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_VES.CAT"); + break; + } + + if (!f.exists(_vm->_globals.NFICHIER)) + return g_PTRNUL; + + ptr = CHARGE_FICHIER(_vm->_globals.NFICHIER); + break; + // Deliberate fall-through to + default: + break; + } + + // Scan for an entry in the catalogue + byte *result; + bool matchFlag = false; + int offsetVal = 0; + + do { + Common::String name = (const char *)ptr + offsetVal; + + if (name == filename) { + // Found entry for file, so get it's details from the catalogue entry + const byte *pData = ptr + offsetVal; + _vm->_globals.CAT_POSI = READ_LE_UINT32(pData + 15); + _vm->_globals.CAT_TAILLE = READ_LE_UINT32(pData + 19); + matchFlag = true; + } + + if (name == "FINIS") { + _vm->_globals.dos_free2(ptr); + return false; + } + + offsetVal += 23; + } while (!matchFlag); + + _vm->_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(_vm->_globals.NFICHIER)) + error("CHARGE_FICHIER"); + + f.seek(_vm->_globals.CAT_POSI); + + byte *catData = _vm->_globals.dos_malloc2(_vm->_globals.CAT_TAILLE); + if (catData == g_PTRNUL) + error("CHARGE_FICHIER"); + + bload_it(f, catData, _vm->_globals.CAT_TAILLE); + f.close(); + result = catData; + } else { + result = NULL; + } + + return result; +} + +// File Size +uint32 FileManager::FLONG(const Common::String &filename) { + Common::File f; + uint32 size; + + if (!f.open(filename)) + error("Could not find file %s", filename.c_str()); + + size = f.size(); + f.close(); + + return size; +} + +// Build Linux +Common::String FileManager::CONSTRUIT_LINUX(const Common::String &file) { + _vm->_globals.NFICHIER = file; + return file; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/files.h b/engines/hopkins/files.h new file mode 100644 index 0000000000..d9df4341ca --- /dev/null +++ b/engines/hopkins/files.h @@ -0,0 +1,64 @@ +/* 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. + * + */ + +#ifndef HOPKINS_FILES_H +#define HOPKINS_FILES_H + +#include "common/scummsys.h" +#include "common/hash-str.h" +#include "common/str.h" +#include "common/stream.h" + +namespace Hopkins { + +class HopkinsEngine; + +class FileManager { +public: + HopkinsEngine *_vm; +public: + FileManager(); + void setParent(HopkinsEngine *vm); + + void Chage_Inifile(Common::StringMap &iniParams); + byte *CHARGE_FICHIER(const Common::String &file); + void CHARGE_FICHIER2(const Common::String &file, byte *a2); + void DMESS(); + void DMESS1(); + void bload(const Common::String &file, byte *buf); + int bload_it(Common::ReadStream &stream, void *buf, size_t nbytes); + void F_Censure(); + int CONSTRUIT_SYSTEM(const Common::String &file); + void CONSTRUIT_FICHIER(const Common::String &hop, const Common::String &file); + byte *LIBERE_FICHIER(byte *ptr); + byte *RECHERCHE_CAT(const Common::String &file, int a2); + Common::String CONSTRUIT_LINUX(const Common::String &file); + + /** + * Returns the size of a file. Throws an error if the file can't be found + */ + uint32 FLONG(const Common::String &filename); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_GLOBALS_H */ diff --git a/engines/hopkins/font.cpp b/engines/hopkins/font.cpp new file mode 100644 index 0000000000..651d0d40f5 --- /dev/null +++ b/engines/hopkins/font.cpp @@ -0,0 +1,497 @@ +/* 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/system.h" +#include "common/file.h" +#include "common/textconsole.h" +#include "hopkins/font.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" +#include "hopkins/objects.h" + +namespace Hopkins { + +void FontManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void FontManager::clearAll() { + for (int idx = 0; idx < 11; ++idx) { + Txt[idx].textOn = false; + Txt[idx].lineCount = 0; + Txt[idx].field3FC = 0; + Txt[idx].field3FE = 0; + Txt[idx].textBlock = NULL; + Txt[idx].width = 0; + Txt[idx].height = 0; + Txt[idx].textLoaded = false; + + ListeTxt[idx].enabled = false; + } +} + +// Text On +void FontManager::TEXTE_ON(int idx) { + if ((idx - 5) > 11) + error("Attempted to display text > MAX_TEXT."); + + TxtItem &txt = Txt[idx - 5]; + txt.textOn = true; + txt.textLoaded = false; + + if (txt.textBlock != g_PTRNUL) { + _vm->_globals.dos_free2(txt.textBlock); + txt.textBlock = g_PTRNUL; + } +} + +// Text Off +void FontManager::TEXTE_OFF(int idx) { + if ((idx - 5) > 11) + error("Attempted to display text > MAX_TEXT."); + + TxtItem &txt = Txt[idx - 5]; + txt.textOn = false; + txt.textLoaded = false; + + if (txt.textBlock != g_PTRNUL) { + _vm->_globals.dos_free2(txt.textBlock); + txt.textBlock = g_PTRNUL; + } +} + +// Text Color +void FontManager::COUL_TXT(int idx, byte colByte) { + Txt[idx - 5].colour = colByte; +} + +// Text Optimal Color +void FontManager::OPTI_COUL_TXT(int idx1, int idx2, int idx3, int idx4) { + COUL_TXT(idx1, 255); + COUL_TXT(idx2, 255); + COUL_TXT(idx3, 255); + COUL_TXT(idx4, 253); +} + +// +void FontManager::DOS_TEXT(int idx, int messageId, const Common::String &filename, int xp, int yp, int a6, int a7, int a8, int a9, int colour) { + if ((idx - 5) > 11) + error("Attempted to display text > MAX_TEXT."); + + TxtItem &txt = Txt[idx - 5]; + txt.textOn = false; + txt.filename = filename; + txt.xp = xp; + txt.yp = yp; + txt.messageId = messageId; + txt.fieldE = a6; + txt.field10 = a7; + txt.field3FC = a8; + txt.field3FE = a9; + txt.colour = colour; +} + +// Box +void FontManager::BOITE(int idx, int messageId, const Common::String &filename, int xp, int yp) { + int filesize; + byte *v9; + const byte *v10; + int v11; + byte v13; + byte v14; + int v15; + byte v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + byte v24; + int v25; + int v27; + int v28; + int v29; + int v32; + int v34; + int v36; + int v37; + int ptrb; + int ptrc; + byte *ptrd; + byte *ptre; + Common::String s; + int v49; + int blockSize; + int v51; + int blockHeight; + int v53; + int blockWidth; + int v55; + int v56; + int lineSize; + int lineCount; + byte *v59; + byte *v60; + byte *v61; + int v62; + int v63; + int v64; + int v65; + int v66; + int v67; + int v68; + int v69; + int v70; + int v71; + int v73; + int i; + int v75; + Common::String file; + Common::File f; + + v73 = xp; + v70 = yp; + lineCount = 0; + if (idx < 0) + error("Bad number for text"); + _vm->_globals.police_l = 11; + + _vm->_globals.largeur_boite = 11 * Txt[idx].field3FE; + if (Txt[idx].textLoaded) { + v34 = Txt[idx].field3FC; + if (v34 != 6 && v34 != 1 && v34 != 3 && v34 != 5) { + int yCurrent = yp + 5; + if (Txt[idx].lineCount > 0) { + for (int lineNum = 0; lineNum < Txt[idx].lineCount; ++lineNum) { + TEXT_NOW1(xp + 5, yCurrent, Txt[idx].lines[lineNum], Txt[idx].colour); + yCurrent += _vm->_globals.police_h + 1; + } + } + } else { + v36 = Txt[idx].height; + v37 = Txt[idx].width; + _vm->_graphicsManager.Restore_Mem( + _vm->_graphicsManager.VESA_BUFFER, + Txt[idx].textBlock, + xp, + yp, + Txt[idx].width, + Txt[idx].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].textLoaded = true; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename); + + file = _vm->_globals.NFICHIER; + if (strncmp(file.c_str(), oldname.c_str(), strlen(file.c_str())) != 0) { + // Starting to access a new file, so read in the index file for the file + oldname = file; + nom_index = Common::String(file.c_str(), file.size() - 3); + nom_index += "IND"; + + if (!f.open(nom_index)) + error("Error opening file - %s", nom_index.c_str()); + filesize = f.size(); + for (i = 0; i < (filesize / 4); ++i) + Index[i] = f.readUint32LE(); + f.close(); + } + 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[messageId]); + + texte_tmp = _vm->_globals.dos_malloc2(0x80Au); + if (texte_tmp == g_PTRNUL) + error("Error allocating text"); + + Common::fill(&texte_tmp[0], &texte_tmp[0x80a], 0); + f.read(texte_tmp, 0x800u); + f.close(); + _vm->_globals.texte_long = 2048; + } else { + v69 = 100; + _vm->_globals.texte_long = 100; + v9 = _vm->_globals.dos_malloc2(0x6Eu); + Common::fill(&v9[0], &v9[0x6e], 0); + + texte_tmp = v9; + v10 = _vm->_globals.BUF_ZONE + Index[messageId]; + memcpy(v9, v10, 0x60u); + v11 = 0; + WRITE_LE_UINT16((uint16 *)v9 + 48, (int16)READ_LE_UINT16(v10 + 96)); + } + v59 = texte_tmp; + v63 = 0; + if (!v69) + goto LABEL_43; + do { + v13 = *v59; + if ((byte)(*v59 + 46) > 0x1Bu) { + if ((byte)(v13 + 80) > 0x1Bu) { + if ((byte)(v13 - 65) <= 0x19u || (byte)(v13 - 97) <= 0x19u) + v13 = 32; + } else { + v13 -= 79; + } + } else { + v13 += 111; + } + *v59 = v13; + v59 = v59 + 1; + ++v63; + } while (v63 < v69); + + v60 = texte_tmp; + v64 = 0; + if (v69) { + while (1) { + v14 = *(v60 + v64); + if (v14 == '\r' || v14 == '\n') { + *(v60 + v64) = 0; + if (!Txt[idx].field3FE) + break; + } + ++v64; + if (v69 <= v64) + goto LABEL_43; + } + Txt[idx].field3FE = v64; + _vm->_globals.largeur_boite = 0; + + v15 = 0; + if (v64 + 1 > 0) { + do { + v16 = *(v60 + v15); + if ((byte)v16 <= 0x1Fu) + v16 = 32; + _vm->_globals.largeur_boite += _vm->_objectsManager.Get_Largeur(_vm->_globals.police, (byte)v16 - 32); + ++v15; + } while (v15 < v64 + 1); + } + _vm->_globals.largeur_boite += 2; + v17 = _vm->_globals.largeur_boite / 2; + if (v17 < 0) + v17 = -v17; + Txt[idx].xp = 320 - v17; + v73 = _vm->_eventsManager.start_x + 320 - v17; + lineCount = 1; + v18 = 0; + if (v64 + 1 > 0) { + Txt[idx].lines[0] = Common::String((const char *)v60, v64); + } + } else { +LABEL_43: + if (!_vm->_globals.largeur_boite) + _vm->_globals.largeur_boite = 240; + v65 = 0; + v61 = texte_tmp; + do { + v19 = 0; + ptrb = _vm->_globals.largeur_boite - 4; + while (1) { + lineSize = v19; + do + v11 = *(v61 + v65 + v19++); + while (v11 != 32 && v11 != 37); + if (v19 >= ptrb / _vm->_globals.police_l) + break; + if (v11 == '%') { + if (v19 < ptrb / _vm->_globals.police_l) + goto LABEL_55; + break; + } + } + if (v11 != '%') + goto LABEL_57; + v11 = 32; +LABEL_55: + if (v11 == '%') + lineSize = v19; +LABEL_57: + v20 = lineCount; + v21 = v11; + + // WORKAROUND: Perhaps due to the usage of ScummVM strings here, recalculate what the + // actual length of the line to be copied will be. Otherwise, you can see artifacts, + // such as a single character beyond the end of string NULL. + int actualSize = 0; + while (actualSize < lineSize && *(v61 + v65 + actualSize)) + ++actualSize; + + Txt[idx].lines[v20] = Common::String((const char *)v61 + v65, actualSize); + TRIER_TEXT[lineCount++] = lineSize; + + v65 += lineSize; + v11 = v21; + } while (v21 != 37); + v66 = 0; + do { + v22 = TRIER_TEXT[v66]; + if (v22 <= 0) { + TRIER_TEXT[v66] = 0; + } else { + ptrc = 0; + v23 = 0; + if (v22 - 1 > 0) { + do { + Common::String &line = Txt[idx].lines[v66]; + v24 = (v23 >= (int)line.size()) ? '\0' : line[v23]; + if ((byte)v24 <= 0x1Fu) + 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; + do { + ++v25; + if (v25 == 20) + v25 = 0; + if (TRIER_TEXT[v67] < TRIER_TEXT[v25]) + TRIER_TEXT[v67] = 0; + } while (v25 != (int16)v67); + ++v67; + } while (v67 <= 19); + v68 = 0; + do { + if (TRIER_TEXT[v68]) + _vm->_globals.largeur_boite = TRIER_TEXT[v68]; + ++v68; + } while (v68 <= 19); + + if ((uint16)(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].xp = i; + v73 = _vm->_eventsManager.start_x + i; + } else { + if (_vm->_globals.nbrligne == (SCREEN_WIDTH - 1)) { + while (_vm->_globals.largeur_boite + v73 > 638 && v73 > -2) + v73 -= 2; + } + if (_vm->_globals.nbrligne == (SCREEN_WIDTH * 2)) { + while (_vm->_globals.largeur_boite + v73 > 1278 && v73 > -2) + v73 -= 2; + } + Txt[idx].xp = v73; + } + } + _vm->_globals.hauteur_boite = (_vm->_globals.police_h + 1) * lineCount + 2; + v56 = v73; + v55 = yp; + v53 = _vm->_globals.largeur_boite + 10; + v51 = (_vm->_globals.police_h + 1) * lineCount + 12; + if (Txt[idx].field3FC == 6) { + v27 = v53 / 2; + if (v27 < 0) + v27 = -v27; + Txt[idx].xp = 315 - v27; + v28 = _vm->_eventsManager.start_x + 315 - v27; + v73 = _vm->_eventsManager.start_x + 315 - v27; + Txt[idx].yp = 50; + v70 = 50; + v55 = 50; + v56 = v28; + } + v29 = Txt[idx].field3FC; + if (v29 == 1 || v29 == 3 || (uint16)(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); + + _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); + } + Txt[idx].lineCount = lineCount; + v75 = v73 + 5; + v71 = v70 + 5; + + if (lineCount > 0) { + for (int lineNum = 0; lineNum < lineCount; ++lineNum) { + TEXT_NOW1(v75, v71, Txt[idx].lines[lineNum], Txt[idx].colour); + v71 += _vm->_globals.police_h + 1; + } + } + + blockWidth = v53 + 1; + blockHeight = v51 + 1; + + Txt[idx].width = blockWidth; + Txt[idx].height = blockHeight; + v32 = Txt[idx].field3FC; + if (v32 == 6 || v32 == 1 || v32 == 3 || v32 == 5) { + if (Txt[idx].textBlock != g_PTRNUL) + Txt[idx].textBlock = _vm->_globals.dos_free2(Txt[idx].textBlock); + blockSize = blockHeight * blockWidth; + ptre = _vm->_globals.dos_malloc2(blockSize + 20); + if (ptre == g_PTRNUL) + error("Cutting a block for text box (%d)", blockSize); + + Txt[idx].textBlock = ptre; + Txt[idx].width = blockWidth; + Txt[idx].height = blockHeight; + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_BUFFER, Txt[idx].textBlock, v56, v55, Txt[idx].width, blockHeight); + } + texte_tmp = _vm->_globals.dos_free2(texte_tmp); + } +} + +void FontManager::TEXT_NOW1(int xp, int yp, const Common::String &message, int colour) { + for (uint idx = 0; idx < message.size(); ++idx) { + char currentChar = message[idx]; + + if (currentChar > 31) { + int characterIndex = currentChar - 32; + _vm->_graphicsManager.Affiche_Fonte(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.police, + xp, yp, characterIndex, colour); + xp += _vm->_objectsManager.Get_Largeur(_vm->_globals.police, characterIndex); + } + } +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/font.h b/engines/hopkins/font.h new file mode 100644 index 0000000000..90201902a6 --- /dev/null +++ b/engines/hopkins/font.h @@ -0,0 +1,88 @@ +/* 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. + * + */ + +#ifndef HOPKINS_FONT_H +#define HOPKINS_FONT_H + +#include "common/scummsys.h" +#include "common/str.h" + +namespace Hopkins { + +class HopkinsEngine; + +struct TxtItem { + bool textOn; + int field2; + Common::String filename; + int16 xp; + int16 yp; + int messageId; + int fieldE; + int field10; + int lineCount; + Common::String lines[10]; + int field3FC; + int field3FE; + byte *textBlock; + int16 width; + int16 height; + bool textLoaded; + int colour; +}; + +struct ListeTxtItem { + bool enabled; + int16 xp; + int16 yp; + int16 width; + int16 height; +}; + + +class FontManager { +private: + HopkinsEngine *_vm; +public: + TxtItem Txt[12]; + ListeTxtItem ListeTxt[12]; + int TRIER_TEXT[21]; + Common::String oldname; + Common::String nom_index; + int Index[4048]; + byte *texte_tmp; +public: + void setParent(HopkinsEngine *vm); + void clearAll(); + + void TEXTE_ON(int idx); + void TEXTE_OFF(int idx); + void COUL_TXT(int idx, byte colByte); + void OPTI_COUL_TXT(int idx1, int idx2, int idx3, int idx4); + void DOS_TEXT(int idx, int messageId, const Common::String &filename, int xp, int yp, int a6, int a7, int a8, int a9, int a10); + void BOITE(int idx, int messageId, const Common::String &filename, int xp, int yp); + void TEXT_NOW1(int xp, int yp, const Common::String &message, int colour); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_FONT_H */ 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 diff --git a/engines/hopkins/globals.h b/engines/hopkins/globals.h new file mode 100644 index 0000000000..26d219a816 --- /dev/null +++ b/engines/hopkins/globals.h @@ -0,0 +1,483 @@ +/* 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. + * + */ + +#ifndef HOPKINS_GLOBALS_H +#define HOPKINS_GLOBALS_H + +#include "common/scummsys.h" +#include "common/str.h" + +namespace Hopkins { + +struct ZonePItem { + int destX; + int destY; + int field4; + int field6; + int field7; + int field8; + int field9; + int fieldA; + int fieldB; + int fieldC; + int fieldD; + int fieldE; + int fieldF; + int field10; + int field12; + int field16; +}; + +struct CarreZoneItem { + int field0; + int field2; + int field4; + int field6; + int field8; + int fieldA; + int fieldC; + int fieldE; +}; + +struct BqeAnimItem { + byte *data; + int field4; +}; + +struct BankItem { + byte *data; + int8 field4; + Common::String filename1; + int fileHeader; + int field1A; + uint32 field1C; + Common::String filename2; +}; + +struct ListeItem { + int field0; + int field2; + int field4; + int width; + int height; + int fieldA; +}; + +struct Liste2Item { + int field0; + int xp; + int yp; + int width; + int height; +}; + +struct BobItem { + int field0; + byte *spriteData; + int xp; + int yp; + int frameIndex; + int fieldE; + int field10; + int field12; + int field14; + int field16; + byte *animData; + int field1C; + int field1E; + int field20; + int field22; + int offsetY; + int field26; + int field28; + int field2A; + int field2C; + byte *field30; + int field34; + int field36; + int field38; + bool isSprite; + bool isActive; + int oldX; + int oldY; + int oldWidth; + int oldHeight; + int oldX2; + int oldY2; + int field4A; +}; + +struct BlAnimItem { + uint32 v1; + uint32 v2; +}; + +struct VBobItem { + byte *spriteData; + int field4; + int xp; + int yp; + int frameIndex; + int fieldC; + int fieldE; + byte *surface; + int oldX; + int oldY; + int oldFrameIndex; + byte *oldSpriteData; +}; + +struct ObjetWItem { + byte field0; + byte field1; + byte field2; + byte field3; + byte field4; + byte field5; + byte field6; + byte field7; +}; + +struct BlocItem { + uint16 field0; + int x1; + int y1; + int x2; + int y2; +}; + +/** + * Mode for TriItem records + */ +enum TriMode { TRI_NONE = 0, TRI_BOB = 1, TRI_SPRITE = 2, TRI_CACHE = 3 }; + +/** + * Structure to represent a pending display of either a Bob, Sprite, or Cache Item. + */ +struct TriItem { + TriMode triMode; + int index; + int priority; + int unused; +}; + +struct CacheItem { + int field0; + int field2; + int field4; + int field6; + int field8; + int fieldA; + byte *fieldC; + int field10; + int field12; + int field14; +}; + +struct SegmentItem { + int field0; + int field2; + int field4; +}; + +struct HopkinsItem { + int field0; + int field2; +}; + +struct Sauvegarde1 { + int field0; + int field1; + int field2; + int field3; + int field4; +}; + +enum SauvegardeOffset { + svField1 = 1 + , svField2 = 2 + , svField3 = 3 + , svField4 = 4 + , svField5 = 5 + , svField6 = 6 + , svField8 = 8 + , svField9 = 9 + , svField10 = 10 + , svField13 = 13 + , svField80 = 80 + , svField94 = 94 + , svField95 = 95 + , svField121 = 121 + , svField122 = 122 + , svField132 = 132 + , svField133 = 133 + , svField170 = 170 + , svField171 = 171 + , svField172 = 172 + , svField173 = 173 + , svField176 = 176 + , svField180 = 180 + , svField181 = 181 + , svField182 = 182 + , svField183 = 183 + , svField184 = 184 + , svField185 = 185 + , svField186 = 186 + , svField187 = 187 + , svField188 = 188 + , svField189 = 189 + , svField190 = 190 + , svField191 = 191 + , svField192 = 192 + , svField193 = 193 + , svField194 = 194 + , svField228 = 228 + , svField231 = 231 + , svField253 = 253 + , svField261 = 261 + , svField270 = 270 + , svField300 = 300 + , svField318 = 318 + , svField320 = 320 + , svField333 = 333 + , svField338 = 338 + , svField339 = 339 + , svField340 = 340 + , svField341 = 341 + , svField349 = 349 + , svField352 = 352 + , svField353 = 353 + , svField354 = 354 + , svField355 = 355 + , svField356 = 356 + , svField357 = 357 + , svField399 = 399 + , svField401 = 401 +}; + +// TODO: Sauvegrade1 fields should really be mapped into data array +struct Sauvegarde { + byte data[0x802]; + Sauvegarde1 field360; + Sauvegarde1 field370; + Sauvegarde1 field380; + int16 inventory[35]; // Originally at offset 1300 of data array +}; + +class HopkinsEngine; + +/** + * Engine Globals + */ +class Globals { +private: + HopkinsEngine *_vm; +public: + byte *CACHE_BANQUE[6]; + ZonePItem ZONEP[106]; + CarreZoneItem CarreZone[101]; + BqeAnimItem Bqe_Anim[35]; + BankItem Bank[8]; + BobItem Bob[36]; + ListeItem Liste[6]; + Liste2Item Liste2[35]; + BlAnimItem BL_ANIM[30]; + VBobItem VBob[30]; + ObjetWItem ObjetW[300]; + BlocItem BLOC[250]; + CacheItem Cache[25]; + SegmentItem Segment[101]; + int BOBZONE[105]; + bool BOBZONE_FLAG[105]; + int STAILLE[500]; + int16 super_parcours[32002]; + int Param[2100]; + HopkinsItem Hopkins[70]; + int INVENTAIRE[36]; + TriItem Tri[51]; + int FR; + int SVGA; + int internet; + int PUBEXIT; + bool XFULLSCREEN; + int XSETMODE; + int XZOOM; + bool XFORCE16; + bool XFORCE8; + bool CARD_SB; + int PERSO_TYPE; + int vitesse; + int INSTALL_TYPE; + Common::String HOPIMAGE; + Common::String HOPANIM; + Common::String HOPLINK; + Common::String HOPSAVE; + Common::String HOPSOUND; + Common::String HOPMUSIC; + Common::String HOPVOICE; + Common::String HOPANM; + Common::String HOPSEQ; + Common::String FICH_ZONE; + Common::String FICH_TEXTE; + Common::String NFICHIER; + Common::String REP_SPR; + int SOUNDVOL; + int MUSICVOL; + int VOICEVOL; + bool SOUNDOFF; + bool MUSICOFF; + bool VOICEOFF; + bool CENSURE; + int lItCounter; + int lOldItCounter; + int g_old_anim; + int g_old_sens, g_old_sens2; + int last_sens; + byte *police; + int police_l; + int police_h; + byte *TETE; + byte *ICONE; + byte *BUF_ZONE; + byte *texte_tmp; + int texte_long; + int TEXTE_FORMATE; + byte *SPRITE_ECRAN; + Sauvegarde *SAUVEGARDE; + byte *BUFFERTAPE; + int16 *essai0; + int16 *essai1; + int16 *essai2; + byte *Bufferobjet; + byte *inventaire2; + byte *GESTE; + int OBJET_EN_COURS; + int NUM_FICHIER_OBJ; + int nbrligne; + int largeur_boite; + byte *INVENTAIRE_OBJET; + int hauteur_boite; + int GESTE_FLAG; + byte *FORETSPR; + int FORET; + byte *COUCOU; + int16 *chemin; + byte *cache_souris; + int16 *BufLig; + byte *Bufferdecor; + byte *ADR_FICHIER_OBJ; + byte *PERSO; + int OBJL, OBJH; + int Nouv_objet; + 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; + int OLD_ECRAN; + int Max_Propre; + int Max_Propre_Gen; + int Max_Ligne_Long; + int Max_Perso_Y; + bool DESACTIVE_INVENT; + bool FLAG_VISIBLE; + bool netscape; + bool NOMARCHE; + int NBBLOC; + bool NO_VISU; + byte *OPTION_SPR; + bool OPTION_FLAG; + int opt_anm; + int opt_vitesse; + int opt_scrtype; + int opt_scrspeed; + int opt_sound; + int opt_voice; + int opt_music; + int opt_txt; + int NBTRI; + int AFFLI; + int AFFIVBL; + int NOT_VERIF; + bool CACHEFLAG; + bool NOPARLE; + bool PLAN_FLAG; + int GOACTION; + int NECESSAIRE; + int Compteur; + int ACTION_SENS; + int SegmentEnCours; + + int STOP_BUG; + bool NO_OFFSET; + int MAX_COMPTE; + + int force_to_data_0; + int oldzone_46; + int old_x1_65; + int old_y1_66; + int old_x2_67; + int old_zone_68; + int old_x_69, old_y_70; + int compteur_71; + int zozo_73; + int old_y2_68; + int old_z_69; + int j_104; + + Globals(); + ~Globals(); + void setParent(HopkinsEngine *vm); + + void setConfig(); + void clearAll(); + void HOPKINS_DATA(); + void INIT_ANIM(); + void INIT_VBOB(); + void CLEAR_VBOB(); + void CHARGE_OBJET(); + byte *dos_malloc2(int count); + byte *dos_free2(byte *p); + byte *LIBERE_FICHIER(byte *p); + + void RESET_CACHE(); + void CACHE_ON(); + void CACHE_OFF(int v1 = 0); + void CACHE_SUB(int idx); + void CACHE_ADD(int idx); + void CHARGE_CACHE(const Common::String &file); + void B_CACHE_OFF(int idx); +}; + +// Global null pointer +extern byte *g_PTRNUL; + +} // End of namespace Hopkins + +#endif /* HOPKINS_GLOBALS_H */ diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp new file mode 100644 index 0000000000..718a428ba6 --- /dev/null +++ b/engines/hopkins/graphics.cpp @@ -0,0 +1,2507 @@ +/* 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/system.h" +#include "graphics/palette.h" +#include "common/file.h" +#include "common/rect.h" +#include "engines/util.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +GraphicsManager::GraphicsManager() { + _lockCtr = 0; + SDL_MODEYES = false; + SDL_ECHELLE = 0; + XSCREEN = YSCREEN = 0; + WinScan = 0; + Winbpp = 0; + PAL_PIXELS = NULL; + nbrligne = 0; + Linear = false; + VideoPtr = NULL; + ofscroll = 0; + SCROLL = 0; + PCX_L = PCX_H = 0; + DOUBLE_ECRAN = false; + OLD_SCROLL = 0; + MANU_SCROLL = 1; + SPEED_SCROLL = 16; + nbrligne2 = 0; + Agr_x = Agr_y = 0; + Agr_Flag_x = Agr_Flag_y = 0; + FADESPD = 15; + FADE_LINUX = 0; + NOLOCK = false; + no_scroll = 0; + REDRAW = false; + min_x = 0; + min_y = 20; + max_x = SCREEN_WIDTH * 2; + max_y = SCREEN_HEIGHT - 20; + clip_x = clip_y = 0; + clip_x1 = clip_y1 = 0; + clip_flag = false; + SDL_NBLOCS = 0; + Red_x = Red_y = 0; + Red = 0; + Largeur = 0; + Compteur_y = 0; + spec_largeur = 0; + + Common::fill(&SD_PIXELS[0], &SD_PIXELS[PALETTE_SIZE * 2], 0); + Common::fill(&TABLE_COUL[0], &TABLE_COUL[PALETTE_EXT_BLOCK_SIZE], 0); + Common::fill(&cmap[0], &cmap[PALETTE_BLOCK_SIZE], 0); + Common::fill(&Palette[0], &Palette[PALETTE_EXT_BLOCK_SIZE], 0); + Common::fill(&OLD_PAL[0], &OLD_PAL[PALETTE_EXT_BLOCK_SIZE], 0); +} + +GraphicsManager::~GraphicsManager() { + _vm->_globals.dos_free2(VESA_SCREEN); + _vm->_globals.dos_free2(VESA_BUFFER); +} + +void GraphicsManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void GraphicsManager::SET_MODE(int width, int height) { + if (!SDL_MODEYES) { + SDL_ECHELLE = 0; + + if (_vm->_globals.XSETMODE == 1) + SDL_ECHELLE = 0; + if (_vm->_globals.XSETMODE == 2) + SDL_ECHELLE = 25; + if (_vm->_globals.XSETMODE == 3) + SDL_ECHELLE = 50; + if (_vm->_globals.XSETMODE == 4) + SDL_ECHELLE = 75; + if (_vm->_globals.XSETMODE == 5) + SDL_ECHELLE = _vm->_globals.XZOOM; + + int bpp = 8; + if (_vm->_globals.XFORCE8 == true) + bpp = 8; + if (_vm->_globals.XFORCE16 == true) + bpp = 16; + + if (SDL_ECHELLE) { + width = Reel_Zoom(width, SDL_ECHELLE); + height = Reel_Zoom(height, SDL_ECHELLE); + } + + Graphics::PixelFormat pixelFormat16(2, 5, 6, 5, 0, 11, 5, 0, 0); + + if (bpp == 8) { + initGraphics(width, height, true); + } else { + initGraphics(width, height, true, &pixelFormat16); + } + + // Init surfaces + VESA_SCREEN = _vm->_globals.dos_malloc2(SCREEN_WIDTH * 2 * SCREEN_HEIGHT); + VESA_BUFFER = _vm->_globals.dos_malloc2(SCREEN_WIDTH * 2 * SCREEN_HEIGHT); + + VideoPtr = NULL; + XSCREEN = width; + YSCREEN = height; + + Linear = true; + Winbpp = bpp / 8; + WinScan = width * Winbpp; + + PAL_PIXELS = SD_PIXELS; + nbrligne = width; + + Common::fill(&cmap[0], &cmap[256 * 3], 0); + SDL_MODEYES = true; + } else { + error("Called SET_MODE multiple times"); + } +} + +void GraphicsManager::DD_Lock() { + if (!NOLOCK) { + if (_lockCtr++ == 0) + VideoPtr = g_system->lockScreen(); + } +} + +void GraphicsManager::DD_Unlock() { + assert(VideoPtr); + if (--_lockCtr == 0) { + g_system->unlockScreen(); + VideoPtr = NULL; + } +} + +// Clear Screen +void GraphicsManager::Cls_Video() { + assert(VideoPtr); + + VideoPtr->fillRect(Common::Rect(0, 0, XSCREEN, YSCREEN), 0); +} + +void GraphicsManager::LOAD_IMAGE(const Common::String &file) { + Common::String filename = Common::String::format("%s.PCX", file.c_str()); + CHARGE_ECRAN(filename); + INIT_TABLE(165, 170, Palette); +} + +// Load Screen +void GraphicsManager::CHARGE_ECRAN(const Common::String &file) { + bool flag; + Common::File f; + + _vm->_fileManager.DMESS1(); + + flag = true; + if (_vm->_fileManager.RECHERCHE_CAT(file, 6)) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPIMAGE, file); + if (!f.open(_vm->_globals.NFICHIER)) + error("CHARGE_ECRAN - %s", file.c_str()); + + f.seek(0, SEEK_END); + f.close(); + flag = false; + } + + SCROLL_ECRAN(0); + A_PCX640_480((byte *)VESA_SCREEN, file, Palette, flag); + + SCROLL = 0; + OLD_SCROLL = 0; + Cls_Pal(); + + if (!DOUBLE_ECRAN) { + _vm->_eventsManager.souris_max(); + SCANLINE(SCREEN_WIDTH); + max_x = SCREEN_WIDTH; + DD_Lock(); + Cls_Video(); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } else if (Winbpp == 1) { + if (!SDL_ECHELLE) + m_scroll2(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll2A(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + + DD_Unlock(); + } else { + SCANLINE(SCREEN_WIDTH * 2); + max_x = SCREEN_WIDTH * 2; + DD_Lock(); + Cls_Video(); + DD_Unlock(); + + if (MANU_SCROLL == 1) { + DD_Lock(); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + if (Winbpp == 1) { + if (!SDL_ECHELLE) + m_scroll2(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll2A(VESA_SCREEN, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + } + + DD_Unlock(); + } + } + + memcpy(VESA_BUFFER, VESA_SCREEN, SCREEN_WIDTH * 2 * SCREEN_HEIGHT); +} + +void GraphicsManager::INIT_TABLE(int minIndex, int maxIndex, byte *palette) { + for (int idx = 0; idx < 256; ++idx) + TABLE_COUL[idx] = idx; + + Trans_bloc(TABLE_COUL, palette, 256, minIndex, maxIndex); + + for (int idx = 0; idx < 256; ++idx) { + byte v = TABLE_COUL[idx]; + if (v > 27) + TABLE_COUL[idx] = 0; + if (!v) + TABLE_COUL[idx] = 0; + } + + TABLE_COUL[0] = 1; +} + +// Scroll Screen +int GraphicsManager::SCROLL_ECRAN(int amount) { + int result = CLIP(amount, 0, SCREEN_WIDTH); + _vm->_eventsManager.start_x = result; + ofscroll = result; + SCROLL = result; + return result; +} + +void GraphicsManager::Trans_bloc(byte *destP, const byte *srcP, int count, int minThreshold, int maxThreshold) { + byte *destPosP; + int palIndex; + int srcOffset; + int col1, col2; + + destPosP = destP; + for (int idx = 0; idx < count; ++idx) { + palIndex = *(byte *)destPosP++; + srcOffset = 3 * palIndex; + col1 = *(srcP + srcOffset) + *(srcP + srcOffset + 1) + *(srcP + srcOffset + 2); + + for (int idx2 = 0; idx2 < 38; ++idx2) { + srcOffset = 3 * idx2; + col2 = *(srcP + srcOffset) + *(srcP + srcOffset + 1) + *(srcP + srcOffset + 2); + + col2 += minThreshold; + if (col2 < col1) + continue; + + col2 -= maxThreshold; + if (col2 > col1) + continue; + + *(destPosP - 1) = (idx2 == 0) ? 1 : idx2; + break; + } + } +} + +void GraphicsManager::Trans_bloc2(byte *surface, byte *col, int size) { + byte *dataP; + int count; + byte dataVal; + + dataP = surface; + count = size - 1; + do { + dataVal = *dataP++; + *(dataP - 1) = *(dataVal + col); + --count; + } while (count); +} + +// 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; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + byte v12; + int v13; + int v14; + char v15; + int v18; + int v19; + int v20; + unsigned int v21; + int v22; + int32 v23; + byte *ptr; + Common::File f; + + // Clear the passed surface + memset(surface, 0, SCREEN_WIDTH * 2 * SCREEN_HEIGHT); + + if (typeFlag) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPIMAGE, "PIC.RES"); + if (!f.open(_vm->_globals.NFICHIER)) + error("(nom)Erreur en cours de lecture."); + f.seek(_vm->_globals.CAT_POSI); + + v7 = _vm->_globals.CAT_TAILLE - 896; + v8 = f.read(HEADER_PCX, 128); + + v6 = (int16)READ_LE_UINT16(&HEADER_PCX[8]) + 1; + v20 = (int16)READ_LE_UINT16(&HEADER_PCX[10]) + 1; + if (((int16)READ_LE_UINT16(&HEADER_PCX[8]) + 1) <= SCREEN_WIDTH) { + DOUBLE_ECRAN = false; + } else { + v6 = SCREEN_WIDTH * 2; + DOUBLE_ECRAN = true; + } + if (v20 > SCREEN_HEIGHT) + v20 = SCREEN_HEIGHT; + PCX_L = v6; + PCX_H = v20; + if (v8 == -1) + error("Erreur en cours de lecture."); + } else { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPIMAGE, file); + if (!f.open(_vm->_globals.NFICHIER)) + error("(nom)Erreur en cours de lecture."); + + filesize = f.size(); + int bytesRead = f.read(HEADER_PCX, 128); + if (bytesRead < 128) + error("Erreur en cours de lecture."); + + v6 = (int16)READ_LE_UINT16(&HEADER_PCX[8]) + 1; + v20 = (int16)READ_LE_UINT16(&HEADER_PCX[10]) + 1; + if (v6 <= SCREEN_WIDTH) { + DOUBLE_ECRAN = false; + } else { + v6 = SCREEN_WIDTH * 2; + DOUBLE_ECRAN = true; + } + if (v20 > SCREEN_HEIGHT) + v20 = SCREEN_HEIGHT; + PCX_L = v6; + PCX_H = v20; + v7 = filesize - 896; + } + + ptr = _vm->_globals.dos_malloc2(0xEE60u); + if (v7 >= 60000) { + v21 = v7 / 60000 + 1; + v23 = 60000 * (v7 / 60000) - v7; + + if (((uint32)v23 & 0x80000000u) != 0) + v23 = -v23; + f.read(ptr, 60000); + v7 = 60000; + } else { + v21 = 1; + v23 = v7; + f.read(ptr, v7); + } + v22 = v21 - 1; + v18 = 0; + v9 = 0; + v10 = 0; + v19 = v6; + + do { + if (v9 == v7) { + v9 = 0; + --v22; + v7 = 60000; + if ( !v22 ) + v7 = v23; + v11 = v10; + f.read(ptr, v7); + v10 = v11; + } + + v12 = *((byte *)ptr + v9++); + if (v12 > 0xC0u) { + v13 = v12 - 192; + if (v9 == v7) { + v9 = 0; + --v22; + v7 = 60000; + if ( v22 == 1 ) + v7 = v23; + v14 = v10; + f.read(ptr, v7); + v10 = v14; + } + v15 = *((byte *)ptr + v9++); + + do { + *((byte *)surface + v10++) = v15; + ++v18; + --v13; + } while (v13); + } else { + *((byte *)surface + v10++) = v12; + ++v18; + } + } while (v18 < v19 * v20); + + if (typeFlag) { + f.seek(_vm->_globals.CAT_TAILLE + _vm->_globals.CAT_POSI - 768); + } else { + filesize = f.size(); + f.seek(filesize - 768); + } + + if (f.read(palette, PALETTE_BLOCK_SIZE) != (PALETTE_BLOCK_SIZE)) + error("A_PCX640_480"); + + f.close(); + _vm->_globals.dos_free2(ptr); +} + +// Clear Palette +void GraphicsManager::Cls_Pal() { + Common::fill(&cmap[0], &cmap[PALETTE_BLOCK_SIZE], 0); + SD_PIXELS[0] = 0; + + if (Winbpp == 1) { + g_system->getPaletteManager()->setPalette(cmap, 0, 256); + } +} + +void GraphicsManager::SCANLINE(int pitch) { + nbrligne = nbrligne2 = pitch; +} + +void GraphicsManager::m_scroll(const byte *surface, int xs, int ys, int width, int height, int destX, int destY) { + const byte *srcP; + byte *destP; + int yNext; + int yCtr; + byte *dest2P; + const byte *src2P; + unsigned int widthRemaining; + + assert(VideoPtr); + srcP = xs + nbrligne2 * ys + surface; + destP = destX + WinScan * destY + (byte *)VideoPtr->pixels; + yNext = height; + do { + yCtr = yNext; + memcpy((byte *)destP, (const byte *)srcP, 4 * (width >> 2)); + src2P = (const byte *)(srcP + 4 * (width >> 2)); + dest2P = (byte *)(destP + 4 * (width >> 2)); + widthRemaining = width - 4 * (width >> 2); + memcpy(dest2P, src2P, widthRemaining); + destP = dest2P + widthRemaining + WinScan - width; + srcP = src2P + widthRemaining + nbrligne2 - width; + yNext = yCtr - 1; + } while (yCtr != 1); +} + +void GraphicsManager::m_scroll2(const byte *surface, int xs, int ys, int width, int height, int destX, int destY) { + const byte *srcP; + byte *destP; + int destPitch; + int srcPitch; + int yCtr; + + assert(VideoPtr); + srcP = xs + nbrligne2 * ys + surface; + destP = destX + WinScan * destY + (byte *)VideoPtr->pixels; + destPitch = WinScan - SCREEN_WIDTH; + srcPitch = nbrligne2 - SCREEN_WIDTH; + yCtr = height; + + do { + memcpy(destP, srcP, SCREEN_WIDTH); + destP = destP + destPitch + SCREEN_WIDTH; + srcP = srcP + srcPitch + SCREEN_WIDTH; + --yCtr; + } while (yCtr); +} + +void GraphicsManager::m_scroll2A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY) { + const byte *srcP; + byte *destP; + int yCtr; + int xCtr; + byte srcByte; + const byte *srcCopyP; + byte *destCopyP; + + assert(VideoPtr); + srcP = xs + nbrligne2 * ys + surface; + destP = destX + WinScan * destY + (byte *)VideoPtr->pixels; + yCtr = height; + Agr_x = 0; + Agr_y = 0; + Agr_Flag_y = 0; + do { + for (;;) { + destCopyP = destP; + srcCopyP = srcP; + xCtr = width; + Agr_x = 0; + do { + srcByte = *srcP; + *destP++ = *srcP++; + Agr_x += SDL_ECHELLE; + if ((unsigned int)Agr_x >= 100) { + Agr_x -= 100; + *destP++ = srcByte; + } + --xCtr; + } while ( xCtr ); + + srcP = srcCopyP; + destP = WinScan + destCopyP; + if (Agr_Flag_y) + break; + + Agr_y += SDL_ECHELLE; + if ((unsigned int)Agr_y < 100) + break; + + Agr_y -= 100; + Agr_Flag_y = 1; + } + + Agr_Flag_y = 0; + srcP = nbrligne2 + srcCopyP; + --yCtr; + } while (yCtr); +} + +/** + * Copies data from a 8-bit palette surface into the 16-bit screen + */ +void GraphicsManager::m_scroll16(const byte *surface, int xs, int ys, int width, int height, int destX, int destY) { + DD_Lock(); + + assert(VideoPtr); + const byte *srcP = xs + nbrligne2 * ys + surface; + uint16 *destP = (uint16 *)((byte *)VideoPtr->pixels + destX * 2 + WinScan * destY); + + for (int yp = 0; yp < height; ++yp) { + // Copy over the line, using the source pixels as lookups into the pixels palette + const byte *lineSrcP = srcP; + uint16 *lineDestP = destP; + + for (int xp = 0; xp < width; ++xp) + *lineDestP++ = *(uint16 *)&PAL_PIXELS[*lineSrcP++ * 2]; + + // Move to the start of the next line + srcP += nbrligne2; + destP += WinScan / 2; + } + + DD_Unlock(); +} + +// TODO: See if PAL_PIXELS can be converted to a uint16 array +void GraphicsManager::m_scroll16A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY) { + const byte *srcP; + const byte *destP; + int yNext; + int xCtr; + const byte *palette; + int pixelWord; + int yCtr; + const byte *srcCopyP; + const byte *destCopyP; + + assert(VideoPtr); + srcP = xs + nbrligne2 * ys + surface; + destP = destX + destX + WinScan * destY + (byte *)VideoPtr->pixels; + yNext = height; + Agr_x = 0; + Agr_y = 0; + Agr_Flag_y = 0; + + do { + for (;;) { + destCopyP = destP; + srcCopyP = srcP; + xCtr = width; + yCtr = yNext; + palette = PAL_PIXELS; + Agr_x = 0; + + do { + pixelWord = *(uint16 *)(palette + 2 * *srcP); + *(uint16 *)destP = pixelWord; + ++srcP; + destP += 2; + Agr_x += SDL_ECHELLE; + if ((unsigned int)Agr_x >= 100) { + Agr_x -= 100; + *(uint16 *)destP = pixelWord; + destP += 2; + } + + --xCtr; + } while (xCtr); + + yNext = yCtr; + srcP = srcCopyP; + destP = WinScan + destCopyP; + if (Agr_Flag_y == 1) + break; + + Agr_y += SDL_ECHELLE; + + if ((unsigned int)Agr_y < 100) + break; + + Agr_y -= 100; + Agr_Flag_y = 1; + } + + Agr_Flag_y = 0; + srcP = nbrligne2 + srcCopyP; + yNext = yCtr - 1; + } while (yCtr != 1); +} + +void GraphicsManager::Copy_Vga(const byte *surface, int xp, int yp, int width, int height, int destX, int destY) { + const byte *srcP; + byte *destP; + int yCount; + int xCount; + byte srcByte; + byte *loopDestP; + byte *loopSrcP; + byte *loopSrc2P; + byte *tempDestP; + const byte *tempSrcP; + int yCtr; + + assert(VideoPtr); + srcP = xp + 320 * yp + surface; + destP = 30 * WinScan + destX + destX + WinScan * 2 * destY + (byte *)VideoPtr->pixels; + yCount = height; + + do { + yCtr = yCount; + xCount = width; + tempSrcP = srcP; + tempDestP = destP; + do { + srcByte = *srcP; + *destP = *srcP; + loopDestP = WinScan + destP; + *loopDestP = srcByte; + loopSrcP = loopDestP - WinScan + 1; + *loopSrcP = srcByte; + loopSrc2P = WinScan + loopSrcP; + *loopSrc2P = srcByte; + ++srcP; + destP = loopSrc2P - WinScan + 1; + --xCount; + } while (xCount); + + destP = WinScan + WinScan + tempDestP; + srcP = tempSrcP + 320; + yCount = yCtr - 1; + } while (yCtr != 1); +} + +void GraphicsManager::Copy_Vga16(const byte *surface, int xp, int yp, int width, int height, int destX, int destY) { + const byte *srcP; + uint16 *destP; + int yCount; + int xCount; + int xCtr; + const byte *palette; + uint16 *tempSrcP; + uint16 srcByte; + uint16 *tempDestP; + int savedXCount; + uint16 *loopDestP; + const byte *loopSrcP; + int yCtr; + + assert(VideoPtr); + srcP = xp + 320 * yp + surface; + destP = (uint16 *)(30 * WinScan + destX + destX + destX + destX + WinScan * 2 * destY + (byte *)VideoPtr->pixels); + yCount = height; + xCount = width; + + do { + yCtr = yCount; + xCtr = xCount; + loopSrcP = srcP; + loopDestP = destP; + savedXCount = xCount; + palette = PAL_PIXELS; + + do { + tempSrcP = (uint16 *)(palette + 2 * *srcP); + srcByte = *tempSrcP; + *destP = *tempSrcP; + *(destP + 1) = srcByte; + + tempDestP = (uint16 *)((byte *)destP + WinScan); + *tempDestP = srcByte; + *(tempDestP + 1) = srcByte; + ++srcP; + destP = (uint16 *)((byte *)tempDestP - WinScan + 4); + --xCtr; + } while (xCtr); + + xCount = savedXCount; + destP = (uint16 *)((byte *)loopDestP + WinScan * 2); + srcP = loopSrcP + 320; + yCount = yCtr - 1; + } while (yCtr != 1); +} + +void GraphicsManager::fade_in(const byte *palette, int step, const byte *surface) { + uint16 palData1[PALETTE_BLOCK_SIZE * 2]; + byte palData2[PALETTE_BLOCK_SIZE]; + + // Initialise temporary palettes + Common::fill(&palData1[0], &palData1[PALETTE_BLOCK_SIZE], 0); + Common::fill(&palData2[0], &palData2[PALETTE_BLOCK_SIZE], 0); + + // Set current palette to black + setpal_vga256(palData2); + + // Loop through fading in the palette + uint16 *pTemp1 = &palData1[1]; + for (int fadeIndex = 0; fadeIndex < FADESPD; ++fadeIndex) { + uint16 *pTemp2 = &palData1[2]; + + for (int palOffset = 0; palOffset < PALETTE_BLOCK_SIZE; palOffset += 3) { + if (palData2[palOffset] < palette[palOffset]) { + uint16 v = (palette[palOffset] & 0xff) * 256 / FADESPD; + palData1[palOffset] = v; + palData2[palOffset] = (v >> 8) & 0xff; + } + + if (palData2[palOffset + 1] < palette[palOffset + 1]) { + uint16 *pDest = &pTemp1[palOffset]; + uint16 v = (palette[palOffset] & 0xff) * 256 / FADESPD + *pDest; + *pDest = v; + palData2[palOffset + 1] = (v >> 8) & 0xff; + } + + if (palData2[palOffset + 2] < palette[palOffset + 2]) { + uint16 *pDest = &pTemp2[palOffset]; + uint16 v = (palette[palOffset] & 0xff) * 256 / FADESPD + *pDest; + *pDest = v; + palData2[palOffset + 2] = (v >> 8) & 0xff; + } + } + + setpal_vga256(palData2); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + DD_VBL(); + } + } + + // Set the final palette + setpal_vga256(palette); + + // Refresh the screen + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + DD_VBL(); + } +} + +void GraphicsManager::fade_out(const byte *palette, int step, const byte *surface) { + int palByte; + int palIndex; + int palDataIndex; + int palCtr3; + int palCtr4; + int palCtr5; + int palValue; + int palCtr2; + int palCtr1; + uint16 palMax; + byte palData[PALETTE_BLOCK_SIZE]; + int tempPalette[PALETTE_BLOCK_SIZE]; + + palMax = palByte = FADESPD; + if (palette) { + palIndex = 0; + do { + palDataIndex = palIndex; + palByte = *(palIndex + palette); + palByte <<= 8; + tempPalette[palDataIndex] = palByte; + palData[palDataIndex] = *(palIndex++ + palette); + } while (palIndex < PALETTE_BLOCK_SIZE); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + DD_VBL(); + } + + palCtr3 = 0; + if (palMax > 0) { + do { + palCtr4 = 0; + do { + palCtr5 = palCtr4; + palValue = tempPalette[palCtr4] - (*(palCtr4 + palette) << 8) / palMax; + tempPalette[palCtr5] = palValue; + palData[palCtr5] = (palValue >> 8) & 0xff; + ++palCtr4; + } while (palCtr4 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + + DD_VBL(); + } + ++palCtr3; + } while (palMax > palCtr3); + } + + palCtr2 = 0; + do { + palData[palCtr2++] = 0; + } while (palCtr2 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + + if (Winbpp == 2) { + if (!SDL_ECHELLE) { + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + return DD_VBL(); + } + goto LABEL_28; + } + } else { + palCtr1 = 0; + do { + palData[palCtr1++] = 0; + } while (palCtr1 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (!SDL_ECHELLE) { + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + return DD_VBL(); + } + +LABEL_28: + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + return DD_VBL(); + } + } +} + +void GraphicsManager::FADE_INS() { + FADESPD = 1; + fade_in(Palette, 1, (const byte *)VESA_BUFFER); +} + +void GraphicsManager::FADE_OUTS() { + FADESPD = 1; + fade_out(Palette, 1, (const byte *)VESA_BUFFER); +} + +void GraphicsManager::FADE_INW() { + FADESPD = 15; + fade_in(Palette, 20, (const byte *)VESA_BUFFER); +} + +void GraphicsManager::FADE_OUTW() { + FADESPD = 15; + fade_out(Palette, 20, (const byte *)VESA_BUFFER); +} + +void GraphicsManager::setpal_vga256(const byte *palette) { + CHANGE_PALETTE(palette); +} + +void GraphicsManager::setpal_vga256_linux(const byte *palette, const byte *surface) { + CHANGE_PALETTE(palette); + + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + else + m_scroll16(surface, _vm->_eventsManager.start_x, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); + + DD_VBL(); + } +} + +void GraphicsManager::SETCOLOR(int palIndex, int r, int g, int b) { + _vm->_graphicsManager.Palette[palIndex * 3] = 255 * r / 100; + _vm->_graphicsManager.Palette[palIndex * 3 + 1] = 255 * g / 100; + _vm->_graphicsManager.Palette[palIndex * 3 + 2] = 255 * b / 100; + + setpal_vga256(Palette); +} + +void GraphicsManager::SETCOLOR2(int palIndex, int r, int g, int b) { + return SETCOLOR(palIndex, r, g, b); +} + +void GraphicsManager::SETCOLOR3(int palIndex, int r, int g, int b) { + Palette[palIndex * 3] = 255 * r / 100; + Palette[palIndex * 3 + 1] = 255 * g / 100; + Palette[palIndex * 3 + 2] = 255 * b / 100; +} + +void GraphicsManager::SETCOLOR4(int palIndex, int r, int g, int b) { + int rv, gv, bv; + int palOffset; + int v8; + + rv = 255 * r / 100; + gv = 255 * g / 100; + bv = 255 * b / 100; + palOffset = 3 * palIndex; + Palette[palOffset] = 255 * r / 100; + Palette[palOffset + 1] = gv; + Palette[palOffset + 2] = bv; + + v8 = 4 * palIndex; + cmap[v8] = rv; + cmap[v8 + 1] = gv; + cmap[v8 + 2] = bv; + + WRITE_LE_UINT16(&SD_PIXELS[2 * palIndex], MapRGB(rv, gv, bv)); + + if (Winbpp == 1) + g_system->getPaletteManager()->setPalette(cmap, palIndex, 1); +} + +void GraphicsManager::CHANGE_PALETTE(const byte *palette) { + // Copy the palette into the PALPCX block +// TODO: Likely either one or both of the destination arrays can be removed, +// since PALPCX is only used in SAVE_IMAGE, and cmap in the original was a RGBA +// array specifically intended just for passing to the SDL palette setter + Common::copy(&palette[0], &palette[PALETTE_BLOCK_SIZE], &PALPCX[0]); + Common::copy(&palette[0], &palette[PALETTE_BLOCK_SIZE], &cmap[0]); + + const byte *srcP = &palette[0]; + for (int idx = 0; idx < PALETTE_SIZE; ++idx, srcP += 3) { + *(uint16 *)&SD_PIXELS[2 * idx] = MapRGB(*srcP, *(srcP + 1), *(srcP + 2)); + } + + if (Winbpp == 1) + g_system->getPaletteManager()->setPalette(cmap, 0, PALETTE_SIZE); +} + +uint16 GraphicsManager::MapRGB(byte r, byte g, byte b) { + if (Winbpp == 1) { + error("TODO: Support in 8-bit graphics mode"); + } else { + Graphics::PixelFormat format = g_system->getScreenFormat(); + + return (r >> format.rLoss) << format.rShift + | (g >> format.gLoss) << format.gShift + | (b >> format.bLoss) << format.bShift; + } +} + +void GraphicsManager::DD_VBL() { + // TODO: Is this okay here? + g_system->updateScreen(); +} + +void GraphicsManager::FADE_OUTW_LINUX(const byte *surface) { + assert(surface); + fade_out(Palette, FADESPD, surface); +} + +void GraphicsManager::FADE_INW_LINUX(const byte *surface) { + assert(surface); + fade_in(Palette, FADESPD, surface); +} + +void GraphicsManager::Copy_WinScan_Vbe3(const byte *srcData, byte *destSurface) { + int rleValue; + int destOffset; + const byte *srcP; + byte srcByte; + byte destLen1; + byte *destSlice1P; + byte destLen2; + byte *destSlice2P; + + rleValue = 0; + destOffset = 0; + srcP = srcData; + for (;;) { + srcByte = *srcP; + if (*srcP < 0xDEu) + goto Video_Cont3_wVbe; + if (srcByte == (byte)-4) + return; + + if (srcByte < 0xFBu) { + destOffset += (byte)(*srcP + 35); + srcByte = *(srcP++ + 1); + } else if (srcByte == (byte)-3) { + destOffset += *(srcP + 1); + srcByte = *(srcP + 2); + srcP += 2; + } else if (srcByte == (byte)-2) { + destOffset += READ_LE_UINT16(srcP + 1); + srcByte = *(srcP + 3); + srcP += 3; + } else { + destOffset += READ_LE_UINT32(srcP + 1); + srcByte = *(srcP + 5); + srcP += 5; + } +Video_Cont3_wVbe: + if (srcByte > 0xD2u) { + if (srcByte == (byte)-45) { + destLen1 = *(srcP + 1); + rleValue = *(srcP + 2); + destSlice1P = destOffset + destSurface; + destOffset += destLen1; + memset(destSlice1P, rleValue, destLen1); + srcP += 3; + } else { + destLen2 = (byte)(*srcP + 45); + rleValue = *(srcP + 1); + destSlice2P = destOffset + destSurface; + destOffset += destLen2; + memset(destSlice2P, rleValue, destLen2); + srcP += 2; + } + } else { + *(destOffset + destSurface) = srcByte; + ++srcP; + ++destOffset; + } + }} + +void GraphicsManager::Copy_Video_Vbe3(const byte *srcData) { + int rleValue; + int destOffset; + const byte *srcP; + uint8 srcByte; + int destLen1; + byte *destSlice1P; + int destLen2; + byte *destSlice2P; + + assert(VideoPtr); + rleValue = 0; + destOffset = 0; + srcP = srcData; + for (;;) { + srcByte = *srcP; + if (*srcP < 222) + goto Video_Cont3_Vbe; + + if (srcByte == 252) + return; + if (srcByte < 251) { + destOffset += *srcP + 35; + srcByte = *(srcP++ + 1); + } else if (srcByte == (byte)-3) { + destOffset += *(srcP + 1); + srcByte = *(srcP + 2); + srcP += 2; + } else if (srcByte == (byte)-2) { + destOffset += READ_LE_UINT16(srcP + 1); + srcByte = *(srcP + 3); + srcP += 3; + } else { + destOffset += READ_LE_UINT32(srcP + 1); + srcByte = *(srcP + 5); + srcP += 5; + } +Video_Cont3_Vbe: + if (srcByte > 210) { + if (srcByte == 211) { + destLen1 = *(srcP + 1); + rleValue = *(srcP + 2); + destSlice1P = destOffset + (byte *)VideoPtr->pixels; + destOffset += destLen1; + memset(destSlice1P, rleValue, destLen1); + srcP += 3; + } else { + destLen2 = (byte)(*srcP + 45); + rleValue = *(srcP + 1); + destSlice2P = (byte *)(destOffset + (byte *)VideoPtr->pixels); + destOffset += destLen2; + memset(destSlice2P, rleValue, destLen2); + srcP += 2; + } + } else { + *(destOffset + (byte *)VideoPtr->pixels) = srcByte; + ++srcP; + ++destOffset; + } + } +} + +void GraphicsManager::Copy_Video_Vbe16(const byte *srcData) { + const byte *srcP = srcData; + int destOffset = 0; + assert(VideoPtr); + + for (;;) { + byte srcByte = *srcP; + if (srcByte >= 222) { + if (srcByte == 252) + return; + if (srcByte < 251) { + destOffset += srcByte - 221; + srcByte = *++srcP; + } else if (srcByte == 253) { + destOffset += *(const byte *)(srcP + 1); + srcByte = *(const byte *)(srcP + 2); + srcP += 2; + } else if (srcByte == 254) { + destOffset += READ_LE_UINT16(srcP + 1); + srcByte = *(const byte *)(srcP + 3); + srcP += 3; + } else { + destOffset += READ_LE_UINT32(srcP + 1); + srcByte = *(const byte *)(srcP + 5); + srcP += 5; + } + } + + if (srcByte > 210) { + if (srcByte == 211) { + int pixelCount = *(srcP + 1); + int pixelIndex = *(srcP + 2); + uint16 *destP = (uint16 *)((byte *)VideoPtr->pixels + destOffset * 2); + uint16 pixelValue = *(uint16 *)(PAL_PIXELS + 2 * pixelIndex); + destOffset += pixelCount; + + while (pixelCount--) + *destP++ = pixelValue; + + srcP += 3; + } else { + int pixelCount = srcByte - 211; + int pixelIndex = *(srcP + 1); + uint16 *destP = (uint16 *)((byte *)VideoPtr->pixels + destOffset * 2); + uint16 pixelValue = *(uint16 *)(PAL_PIXELS + 2 * pixelIndex); + destOffset += pixelCount; + + while (pixelCount--) + *destP++ = pixelValue; + + srcP += 2; + } + } else { + *((uint16 *)VideoPtr->pixels + destOffset) = *(uint16 *)(PAL_PIXELS + 2 * srcByte); + ++srcP; + ++destOffset; + } + } +} + +void GraphicsManager::Copy_Video_Vbe16a(const byte *srcData) { + int destOffset; + const byte *srcP; + byte pixelIndex; + + destOffset = 0; + srcP = srcData; + for (;;) { + pixelIndex = *srcP; + if (*srcP < 0xFCu) + goto Video_Cont_Vbe16a; + if (pixelIndex == (byte)-4) + return; + if (pixelIndex == (byte)-3) { + destOffset += *(srcP + 1); + pixelIndex = *(srcP + 2); + srcP += 2; + } else if (pixelIndex == (byte)-2) { + destOffset += READ_LE_UINT16(srcP + 1); + pixelIndex = *(srcP + 3); + srcP += 3; + } else { + destOffset += READ_LE_UINT32(srcP + 1); + pixelIndex = *(srcP + 5); + srcP += 5; + } +Video_Cont_Vbe16a: + WRITE_LE_UINT16((byte *)VideoPtr->pixels + destOffset * 2, READ_LE_UINT16(PAL_PIXELS + 2 * pixelIndex)); + ++srcP; + ++destOffset; + } +} + +void GraphicsManager::Capture_Mem(const byte *srcSurface, byte *destSurface, int xs, int ys, int width, int height) { + const byte *srcP; + byte *destP; + int rowCount; + int i; + int rowCount2; + + // TODO: This code in the original is potentially dangerous, as it doesn't clip the area to within + // the screen, and so thus can read areas outside of the allocated surface buffer + srcP = xs + nbrligne2 * ys + srcSurface; + destP = destSurface; + rowCount = height; + do { + rowCount2 = rowCount; + if (width & 1) { + memcpy(destP, srcP, width); + srcP += width; + destP += width; + } else if (width & 2) { + for (i = width >> 1; i; --i) { + *(uint16 *)destP = *(uint16 *)srcP; + srcP += 2; + destP += 2; + } + } else { + memcpy(destP, srcP, 4 * (width >> 2)); + srcP += 4 * (width >> 2); + destP += 4 * (width >> 2); + } + srcP = nbrligne2 + srcP - width; + rowCount = rowCount2 - 1; + } while (rowCount2 != 1); +} + +void GraphicsManager::Sprite_Vesa(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex) { + // Get a pointer to the start of the desired sprite + const byte *spriteP = spriteData + 3; + for (int i = spriteIndex; i; --i) + spriteP += READ_LE_UINT32(spriteP) + 16; + + clip_x = 0; + clip_y = 0; + clip_flag = false; + + spriteP += 4; + int width = READ_LE_UINT16(spriteP); + spriteP += 2; + int height = READ_LE_UINT16(spriteP); + + // Clip X + clip_x1 = width; + if ((xp + width) <= (min_x + 300)) + return; + if (xp < (min_x + 300)) { + clip_x = min_x + 300 - xp; + clip_flag = true; + } + + // Clip Y + // TODO: This is weird, but it's that way in the original. Original game bug? + if ((yp + height) <= height) + return; + if (yp < (min_y + 300)) { + clip_y = min_y + 300 - yp; + clip_flag = true; + } + + // Clip X1 + if (xp >= (max_x + 300)) + return; + if ((xp + width) > (max_x + 300)) { + int xAmount = width + 10 - (xp + width - (max_x + 300)); + if (xAmount <= 10) + return; + + clip_x1 = xAmount - 10; + clip_flag = true; + } + + // Clip Y1 + if (yp >= (max_y + 300)) + return; + if ((yp + height) > (max_y + 300)) { + int yAmount = height + 10 - (yp + height - (max_y + 300)); + if (yAmount <= 10) + return; + + clip_y1 = yAmount - 10; + clip_flag = true; + } + + // Sprite display + + // Set up source + spriteP += 6; + int srcOffset = READ_LE_UINT16(spriteP); + spriteP += 4; + const byte *srcP = spriteP; + spriteP += srcOffset; + + // Set up surface destination + byte *destP = surface + (yp - 300) * nbrligne2 + (xp - 300); + + // Handling for clipped versus non-clipped + if (clip_flag) { + // Clipped version + for (int yc = 0; yc < height; ++yc, destP += nbrligne2) { + byte *tempDestP = destP; + byte byteVal; + int xc = 0; + + while ((byteVal = *srcP) != 253) { + ++srcP; + width = READ_LE_UINT16(srcP); + srcP += 2; + + if (byteVal == 254) { + // Copy pixel range + for (int xv = 0; xv < width; ++xv, ++xc, ++spriteP, ++tempDestP) { + if (clip_y == 0 && xc >= clip_x && xc < clip_x1) + *tempDestP = *spriteP; + } + } else { + // Skip over bytes + tempDestP += width; + xc += width; + } + } + + if (clip_y > 0) + --clip_y; + srcP += 3; + } + } else { + // Non-clipped + for (int yc = 0; yc < height; ++yc, destP += nbrligne2) { + byte *tempDestP = destP; + byte byteVal; + + while ((byteVal = *srcP) != 253) { + ++srcP; + width = READ_LE_UINT16(srcP); + srcP += 2; + + if (byteVal == 254) { + // Copy pixel range + Common::copy(spriteP, spriteP + width, tempDestP); + spriteP += width; + } + + tempDestP += width; + } + + // Skip over control byte and width + srcP += 3; + } + } +} + +void GraphicsManager::FIN_VISU() { + for (int idx = 1; idx <= 20; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_OFF(idx); + } + + _vm->_eventsManager.VBL(); + _vm->_eventsManager.VBL(); + + for (int idx = 1; idx <= 20; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_ZERO(idx); + } + + for (int idx = 1; idx <= 29; ++idx) { + _vm->_globals.BL_ANIM[idx].v1 = 0; + } + + for (int idx = 1; idx <= 20; ++idx) { + _vm->_globals.Bqe_Anim[idx].field4 = 0; + } +} + +void GraphicsManager::VISU_ALL() { + for (int idx = 1; idx <= 20; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_VISU(idx); + } +} + +void GraphicsManager::RESET_SEGMENT_VESA() { + int idx; + int blocCount; + + if (_vm->_globals.NBBLOC > 0) { + idx = 0; + blocCount = _vm->_globals.NBBLOC; + do { + _vm->_globals.BLOC[idx++].field0 = 0; + } while (idx != blocCount); + + _vm->_globals.NBBLOC = 0; + } +} + +// Add VESA Segment +void GraphicsManager::Ajoute_Segment_Vesa(int x1, int y1, int x2, int y2) { + int tempX; + int blocCount; + int16 blocIndex; + bool addFlag; + + tempX = x1; + addFlag = true; + if (x2 > max_x) + x2 = max_x; + if (y2 > max_y) + y2 = max_y; + if (x1 < min_x) + tempX = min_x; + if (y1 < min_y) + y1 = min_y; + + blocCount = _vm->_globals.NBBLOC; + if (_vm->_globals.NBBLOC > 1) { + + blocIndex = 0; + do { + BlocItem &bloc = _vm->_globals.BLOC[blocIndex]; + + if (bloc.field0 == 1 + && tempX >= bloc.x1 && x2 <= bloc.x2 + && y1 >= bloc.y1 && y2 <= bloc.y2) + addFlag = false; + ++blocIndex; + blocCount = blocIndex; + } while (_vm->_globals.NBBLOC + 1 != blocIndex); + } + + if (addFlag) { + assert(_vm->_globals.NBBLOC < 50); + BlocItem &bloc = _vm->_globals.BLOC[++_vm->_globals.NBBLOC]; + + bloc.field0 = 1; + bloc.x1 = tempX; + bloc.x2 = x2; + bloc.y1 = y1; + bloc.y2 = y2; + } +} + +int GraphicsManager::Magic_Number(signed int v) { + int result = v; + + if (!v) + result = 4; + if (result & 1) + ++result; + if (result & 2) + result += 2; + + return result; +} + +// Display VESA Segment +void GraphicsManager::Affiche_Segment_Vesa() { + if (_vm->_globals.NBBLOC == 0) + return; + + SDL_NBLOCS = _vm->_globals.NBBLOC; + DD_Lock(); + + for (int idx = 1; idx <= _vm->_globals.NBBLOC; ++idx) { + BlocItem &bloc = _vm->_globals.BLOC[idx]; + Common::Rect &dstRect = dstrect[idx - 1]; + if (bloc.field0 != 1) + continue; + + if (_vm->_eventsManager.CASSE != false) { + if (Winbpp == 1) { + Copy_Vga(VESA_BUFFER, bloc.x1, bloc.y1, bloc.x2 - bloc.x1, bloc.y2 - bloc.y1, bloc.x1, bloc.y1); + } else if (Winbpp == 2) { + Copy_Vga16(VESA_BUFFER, bloc.x1, bloc.y1, bloc.x2 - bloc.x1, bloc.y2 - bloc.y1, bloc.x1, bloc.y1); + } + + dstRect.left = bloc.x1 * 2; + dstRect.top = bloc.y1 * 2 + 30; + dstRect.setWidth((bloc.x2 - bloc.x1) * 2); + dstRect.setHeight((bloc.y2 - bloc.y1) * 2); + } 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 < _vm->_eventsManager.start_x) + xp = _vm->_eventsManager.start_x; + int yp = Magic_Number(bloc.y1) - 4; + if (yp < 0) + yp = 0; + int width = Magic_Number(bloc.x2) + 4 - xp; + if (width < 4) + width = 4; + int height = Magic_Number(bloc.y2) + 4 - yp; + if (height < 4) + height = 4; + + if ((xp - _vm->_eventsManager.start_x + width) > SCREEN_WIDTH) + xp -= 4; + if ((height - yp) > (SCREEN_HEIGHT - 40)) + yp -= 4; + + // WORKAROUND: Original didn't lock the screen for access + DD_Lock(); + + if (Winbpp == 2) { + m_scroll16A(VESA_BUFFER, xp, yp, width, height, + 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 - _vm->_eventsManager.start_x, SDL_ECHELLE), Reel_Zoom(yp, SDL_ECHELLE)); + } + + DD_Unlock(); + + 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 { + // WORKAROUND: Original didn't lock the screen for access + DD_Lock(); + + if (Winbpp == 2) { + m_scroll16(VESA_BUFFER, bloc.x1, bloc.y1, bloc.x2 - bloc.x1, bloc.y2 - 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 - _vm->_eventsManager.start_x, bloc.y1); + } + + dstRect.left = bloc.x1 - _vm->_eventsManager.start_x; + dstRect.top = bloc.y1; + dstRect.setWidth(bloc.x2 - bloc.x1); + dstRect.setHeight(bloc.y2 - bloc.y1); + + DD_Unlock(); + } + } + + _vm->_globals.BLOC[idx].field0 = 0; + } + + _vm->_globals.NBBLOC = 0; + DD_Unlock(); + if (!_vm->_globals.BPP_NOAFF) { +// SDL_UpdateRects(LinuxScr, SDL_NBLOCS, dstrect); + } + SDL_NBLOCS = 0; +} + +void GraphicsManager::CopyAsm(const byte *surface) { + const byte *srcP; + byte srcByte; + byte *destP; + int yCtr; + int xCtr; + byte *dest1P; + byte *dest2P; + byte *dest3P; + byte *destPitch; + const byte *srcPitch; + + assert(VideoPtr); + srcP = surface; + srcByte = 30 * WinScan; + destP = (byte *)VideoPtr->pixels + 30 * WinScan; + yCtr = 200; + do { + srcPitch = srcP; + destPitch = destP; + xCtr = 320; + + do { + srcByte = *srcP; + *destP = *srcP; + dest1P = WinScan + destP; + *dest1P = srcByte; + dest2P = dest1P - WinScan + 1; + *dest2P = srcByte; + dest3P = WinScan + dest2P; + *dest3P = srcByte; + destP = dest3P - WinScan + 1; + ++srcP; + --xCtr; + } while (xCtr); + + srcP = srcPitch + 320; + destP = WinScan + WinScan + destPitch; + --yCtr; + } while (yCtr); +} + +void GraphicsManager::Restore_Mem(byte *destSurface, const byte *src, int xp, int yp, int width, int height) { + byte *destP; + int yNext; + const byte *srcP; + int i; + int yCtr; + + destP = xp + nbrligne2 * yp + destSurface; + yNext = height; + srcP = src; + do { + yCtr = yNext; + if (width & 1) { + memcpy(destP, srcP, width); + srcP += width; + destP += width; + } else if (width & 2) { + for (i = width >> 1; i; --i) { + *(uint16 *)destP = *(uint16 *)srcP; + srcP += 2; + destP += 2; + } + } else { + memcpy(destP, srcP, 4 * (width >> 2)); + srcP += 4 * (width >> 2); + destP += 4 * (width >> 2); + } + destP = nbrligne2 + destP - width; + yNext = yCtr - 1; + } while (yCtr != 1); +} + +int GraphicsManager::Reel_Zoom(int v, int percentage) { + return Asm_Zoom(v, percentage); +} + +int GraphicsManager::Asm_Zoom(int v, int percentage) { + if (v) + v += percentage * (long int)v / 100; + + return v; +} + +int GraphicsManager::Reel_Reduc(int v, int percentage) { + return Asm_Reduc(v, percentage); +} + +int GraphicsManager::Asm_Reduc(int v, int percentage) { + if (v) + v -= percentage * (long int)v / 100; + + return v; +} + +// Display 'Perfect?' +void GraphicsManager::Affiche_Perfect(byte *surface, const byte *srcData, int xp300, int yp300, int frameIndex, int a6, int a7, int a8) { + const byte *spriteStartP; + int i; + const byte *spriteSizeP; + int spriteWidth; + int spriteHeight1; + const byte *spritePixelsP; + byte *dest1P; + int xCtr1; + byte *dest2P; + int xLeft; + int clippedWidth; + int xCtr2; + int v20; + int v21 = 0; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + byte *v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35; + int spriteHeight2; + int v37; + int v38; + uint16 v39; + byte *v40; + int v41; + uint16 v42; + const byte *spritePixelsCopyP; + const byte *spritePixelsCopy2P; + const byte *v45; + const byte *v46; + byte *dest1CopyP; + byte *destCopy2P; + int v49; + int v50; + byte *v51; + int v52; + byte *v53; + byte *v54; + byte *v55; + int yCtr1; + int yCtr2; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + + spriteStartP = srcData + 3; + for (i = frameIndex; i; --i) + spriteStartP += READ_LE_UINT32(spriteStartP) + 16; + + spriteWidth = 0; + spriteHeight1 = 0; + spriteSizeP = spriteStartP + 4; + spriteWidth = (int16)READ_LE_UINT16(spriteSizeP); + spriteSizeP += 2; + spriteHeight1 = spriteHeight2 = (int16)READ_LE_UINT16(spriteSizeP); + spritePixelsP = spriteSizeP + 10; + clip_x = 0; + clip_y = 0; + clip_x1 = 0; + clip_y1 = 0; + if ((uint16)xp300 > min_x) { + if ((uint16)xp300 < (uint16)(min_x + 300)) + clip_x = min_x + 300 - xp300; + if ((uint16)yp300 > min_y) { + if ((uint16)yp300 < (uint16)(min_y + 300)) + clip_y = min_y + 300 - yp300; + if ((uint16)xp300 < (uint16)(max_x + 300)) { + clip_x1 = max_x + 300 - xp300; + if ((uint16)yp300 < (uint16)(max_y + 300)) { + clip_y1 = max_y + 300 - yp300; + dest1P = xp300 + nbrligne2 * (yp300 - 300) - 300 + surface; + if (a7) { + Compteur_y = 0; + Agr_x = 0; + Agr_y = 0; + Agr_Flag_y = 0; + Agr_Flag_x = 0; + Largeur = spriteWidth; + v20 = Asm_Zoom(spriteWidth, a7); + v22 = Asm_Zoom(v21, a7); + if (a8) { + v29 = v20 + dest1P; + if (clip_y) { + if ((uint16)clip_y >= v22) + return; + v61 = v22; + v52 = v20; + v30 = 0; + v31 = (uint16)clip_y; + while (Asm_Zoom(v30 + 1, a7) < v31) + ; + v20 = v52; + spritePixelsP += Largeur * v30; + v29 += nbrligne2 * (uint16)clip_y; + v22 = v61 - (uint16)clip_y; + } + if (v22 > (uint16)clip_y1) + v22 = (uint16)clip_y1; + if (clip_x) { + if ((uint16)clip_x >= v20) + return; + v20 -= (uint16)clip_x; + } + if (v20 > (uint16)clip_x1) { + v32 = v20 - (uint16)clip_x1; + v29 -= v32; + v62 = v22; + v33 = 0; + while (Asm_Zoom(v33 + 1, a7) < v32) + ; + v34 = v33; + v22 = v62; + spritePixelsP += v34; + v20 = (uint16)clip_x1; + } + do { + while (1) { + v63 = v22; + v53 = v29; + v46 = spritePixelsP; + Agr_Flag_x = 0; + Agr_x = 0; + v35 = v20; + do { + while (1) { + if (*spritePixelsP) + *v29 = *spritePixelsP; + --v29; + ++spritePixelsP; + if (!Agr_Flag_x) + Agr_x = a7 + Agr_x; + if ((uint16)Agr_x < 0x64u) + break; + Agr_x = Agr_x - 100; + --spritePixelsP; + Agr_Flag_x = 1; + --v35; + if (!v35) + goto R_Aff_Zoom_Larg_Cont1; + } + Agr_Flag_x = 0; + --v35; + } while (v35); +R_Aff_Zoom_Larg_Cont1: + spritePixelsP = Largeur + v46; + v29 = nbrligne2 + v53; + ++Compteur_y; + if (!Agr_Flag_y) + Agr_y = a7 + Agr_y; + if ((uint16)Agr_y < 0x64u) + break; + Agr_y = Agr_y - 100; + spritePixelsP = v46; + Agr_Flag_y = 1; + v22 = v63 - 1; + if (v63 == 1) + return; + } + Agr_Flag_y = 0; + v22 = v63 - 1; + } while (v63 != 1); + } else { + if (clip_y) { + if ((uint16)clip_y >= v22) + return; + v58 = v22; + v49 = v20; + v23 = 0; + v24 = (uint16)clip_y; + while (Asm_Zoom(v23 + 1, a7) < v24) + ; + v20 = v49; + spritePixelsP += Largeur * v23; + dest1P += nbrligne2 * (uint16)clip_y; + v22 = v58 - (uint16)clip_y; + } + if (v22 > (uint16)clip_y1) + v22 = (uint16)clip_y1; + if (clip_x) { + if ((uint16)clip_x >= v20) + return; + v59 = v22; + v50 = v20; + v25 = (uint16)clip_x; + v26 = 0; + while (Asm_Zoom(v26 + 1, a7) < v25) + ; + v27 = v26; + v22 = v59; + spritePixelsP += v27; + dest1P += (uint16)clip_x; + v20 = v50 - (uint16)clip_x; + } + if (v20 > (uint16)clip_x1) + v20 = (uint16)clip_x1; + do { + while (1) { + v60 = v22; + v51 = dest1P; + v45 = spritePixelsP; + v28 = v20; + Agr_Flag_x = 0; + Agr_x = 0; + do { + while (1) { + if (*spritePixelsP) + *dest1P = *spritePixelsP; + ++dest1P; + ++spritePixelsP; + if (!Agr_Flag_x) + Agr_x = a7 + Agr_x; + if ((uint16)Agr_x < 0x64u) + break; + Agr_x = Agr_x - 100; + --spritePixelsP; + Agr_Flag_x = 1; + --v28; + if (!v28) + goto Aff_Zoom_Larg_Cont1; + } + Agr_Flag_x = 0; + --v28; + } while (v28); +Aff_Zoom_Larg_Cont1: + spritePixelsP = Largeur + v45; + dest1P = nbrligne2 + v51; + if (!Agr_Flag_y) + Agr_y = a7 + Agr_y; + if ((uint16)Agr_y < 0x64u) + break; + Agr_y = Agr_y - 100; + spritePixelsP = v45; + Agr_Flag_y = 1; + v22 = v60 - 1; + if (v60 == 1) + return; + } + Agr_Flag_y = 0; + v22 = v60 - 1; + } while (v60 != 1); + } + } else if (a6) { + Compteur_y = 0; + Red_x = 0; + Red_y = 0; + Largeur = spriteWidth; + Red = a6; + if (a6 < 100) { + v37 = Asm_Reduc(spriteWidth, Red); + if (a8) { + v40 = v37 + dest1P; + do { + v65 = spriteHeight2; + v55 = v40; + Red_y = Red + Red_y; + if ((uint16)Red_y < 0x64u) { + Red_x = 0; + v41 = Largeur; + v42 = v37; + do { + Red_x = Red + Red_x; + if ((uint16)Red_x < 0x64u) { + if (v42 >= clip_x && v42 < clip_x1 && *spritePixelsP) + *v40 = *spritePixelsP; + --v40; + ++spritePixelsP; + --v42; + } else { + Red_x = Red_x - 100; + ++spritePixelsP; + } + --v41; + } while (v41); + spriteHeight2 = v65; + v40 = nbrligne2 + v55; + } else { + Red_y = Red_y - 100; + spritePixelsP += Largeur; + } + --spriteHeight2; + } while (spriteHeight2); + } else { + do { + v64 = spriteHeight2; + v54 = dest1P; + Red_y = Red + Red_y; + if ((uint16)Red_y < 0x64u) { + Red_x = 0; + v38 = Largeur; + v39 = 0; + do { + Red_x = Red + Red_x; + if ((uint16)Red_x < 0x64u) { + if (v39 >= clip_x && v39 < clip_x1 && *spritePixelsP) + *dest1P = *spritePixelsP; + ++dest1P; + ++spritePixelsP; + ++v39; + } else { + Red_x = Red_x - 100; + ++spritePixelsP; + } + --v38; + } while (v38); + spriteHeight2 = v64; + dest1P = nbrligne2 + v54; + } else { + Red_y = Red_y - 100; + spritePixelsP += Largeur; + } + --spriteHeight2; + } while (spriteHeight2); + } + } + } else { + Largeur = spriteWidth; + Compteur_y = 0; + if (a8) { + dest2P = spriteWidth + dest1P; + spec_largeur = spriteWidth; + if (clip_y) { + if ((uint16)clip_y >= (unsigned int)spriteHeight1) + return; + spritePixelsP += spriteWidth * (uint16)clip_y; + dest2P += nbrligne2 * (uint16)clip_y; + spriteHeight1 -= (uint16)clip_y; + } + xLeft = (uint16)clip_y1; + if (spriteHeight1 > clip_y1) + spriteHeight1 = clip_y1; + xLeft = clip_x; + if (clip_x) { + if (xLeft >= spriteWidth) + return; + spriteWidth -= xLeft; + } + if (spriteWidth > (uint16)clip_x1) { + clippedWidth = spriteWidth - (uint16)clip_x1; + spritePixelsP += clippedWidth; + dest2P -= clippedWidth; + spriteWidth = (uint16)clip_x1; + } + do { + yCtr2 = spriteHeight1; + destCopy2P = dest2P; + spritePixelsCopy2P = spritePixelsP; + xCtr2 = spriteWidth; + do { + if (*spritePixelsP) + *dest2P = *spritePixelsP; + ++spritePixelsP; + --dest2P; + --xCtr2; + } while (xCtr2); + spritePixelsP = spec_largeur + spritePixelsCopy2P; + dest2P = nbrligne2 + destCopy2P; + spriteHeight1 = yCtr2 - 1; + } while (yCtr2 != 1); + } else { + spec_largeur = spriteWidth; + if (clip_y) { + if ((uint16)clip_y >= (unsigned int)spriteHeight1) + return; + spritePixelsP += spriteWidth * (uint16)clip_y; + dest1P += nbrligne2 * (uint16)clip_y; + spriteHeight1 -= (uint16)clip_y; + } + if (spriteHeight1 > clip_y1) + spriteHeight1 = clip_y1; + if (clip_x) { + if ((uint16)clip_x >= spriteWidth) + return; + spritePixelsP += (uint16)clip_x; + dest1P += (uint16)clip_x; + spriteWidth -= (uint16)clip_x; + } + if (spriteWidth > (uint16)clip_x1) + spriteWidth = (uint16)clip_x1; + do { + yCtr1 = spriteHeight1; + dest1CopyP = dest1P; + spritePixelsCopyP = spritePixelsP; + xCtr1 = spriteWidth; + do { + if (*spritePixelsP) + *dest1P = *spritePixelsP; + ++dest1P; + ++spritePixelsP; + --xCtr1; + } while (xCtr1); + spritePixelsP = spec_largeur + spritePixelsCopyP; + dest1P = nbrligne2 + dest1CopyP; + spriteHeight1 = yCtr1 - 1; + } while (yCtr1 != 1); + } + } + } + } + } + } +} + +// Display Speed +void GraphicsManager::AFFICHE_SPEED(const byte *spriteData, int xp, int yp, int spriteIndex) { + int width, height; + + width = _vm->_objectsManager.Get_Largeur(spriteData, spriteIndex); + height = _vm->_objectsManager.Get_Hauteur(spriteData, spriteIndex); + if (*spriteData == 78) { + Affiche_Perfect(VESA_SCREEN, spriteData, xp + 300, yp + 300, spriteIndex, 0, 0, 0); + Affiche_Perfect(VESA_BUFFER, spriteData, xp + 300, yp + 300, spriteIndex, 0, 0, 0); + } else { + Sprite_Vesa(VESA_BUFFER, spriteData, xp + 300, yp + 300, spriteIndex); + Sprite_Vesa(VESA_SCREEN, spriteData, xp + 300, yp + 300, spriteIndex); + } + if (!_vm->_globals.NO_VISU) + Ajoute_Segment_Vesa(xp, yp, xp + width, yp + height); +} + +void GraphicsManager::SCOPY(const byte *surface, int x1, int y1, int width, int height, byte *destSurface, int destX, int destY) { + int top; + int croppedWidth; + int croppedHeight; + int xRight; + int height2; + int top2; + int left; + + left = x1; + top = y1; + croppedWidth = width; + croppedHeight = height; + + if (x1 < min_x) { + croppedWidth = width - (min_x - x1); + left = min_x; + } + if (y1 < min_y) { + croppedHeight = height - (min_y - y1); + top = min_y; + } + top2 = top; + if (top + croppedHeight > max_y) + croppedHeight = max_y - top; + xRight = left + croppedWidth; + if (xRight > max_x) + croppedWidth = max_x - left; + + 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); + } +} + +void GraphicsManager::Copy_Mem(const byte *srcSurface, int x1, int y1, unsigned int width, int height, byte *destSurface, int destX, int destY) { + const byte *srcP; + byte *destP; + int yp; + int yCurrent; + byte *dest2P; + const byte *src2P; + unsigned int pitch; + + srcP = x1 + nbrligne2 * y1 + srcSurface; + destP = destX + nbrligne2 * destY + destSurface; + yp = height; + do { + yCurrent = yp; + memcpy(destP, srcP, 4 * (width >> 2)); + src2P = (srcP + 4 * (width >> 2)); + dest2P = (destP + 4 * (width >> 2)); + pitch = width - 4 * (width >> 2); + memcpy(dest2P, src2P, pitch); + destP = (dest2P + pitch + nbrligne2 - width); + srcP = (src2P + pitch + nbrligne2 - width); + yp = yCurrent - 1; + } while (yCurrent != 1); +} + +// Display Font +void GraphicsManager::Affiche_Fonte(byte *surface, const byte *spriteData, int xp, int yp, + int characterIndex, int colour) { + const byte *spriteDataP; + int i; + const byte *spriteSizeP; + int spriteWidth; + int spriteHeight; + const byte *spritePixelsP; + byte *destP; + int xCtr; + byte destByte; + byte *destLineP; + int yCtr; + + spriteDataP = spriteData + 3; + for (i = characterIndex; i; --i) + spriteDataP += READ_LE_UINT32(spriteDataP) + 16; + + spriteWidth = 0; + spriteHeight = 0; + spriteSizeP = spriteDataP + 4; + spriteWidth = (int16)READ_LE_UINT16(spriteSizeP); + spriteSizeP += 2; + spriteHeight = (int16)READ_LE_UINT16(spriteSizeP); + spritePixelsP = spriteSizeP + 10; + destP = surface + xp + nbrligne2 * yp; + Largeur = spriteWidth; + + do { + yCtr = spriteHeight; + destLineP = destP; + xCtr = spriteWidth; + do { + destByte = *spritePixelsP; + if (*spritePixelsP) { + if (destByte == (byte)-4) + destByte = colour; + *destP = destByte; + } + + ++destP; + ++spritePixelsP; + --xCtr; + } while (xCtr); + destP = nbrligne2 + destLineP; + spriteHeight = yCtr - 1; + } while (yCtr != 1); +} + +// Init Screen +void GraphicsManager::INI_ECRAN(const Common::String &file) { + OPTI_INI(file, 0); +} + +// Init Screen 2 +void GraphicsManager::INI_ECRAN2(const Common::String &file) { + OPTI_INI(file, 2); +} + +void GraphicsManager::OPTI_INI(const Common::String &file, int mode) { + int dataOffset; + int dataVal1; + bool doneFlag; + byte *ptr; + Common::String filename; + + dataOffset = 1; + + filename = file + ".ini"; + ptr = _vm->_fileManager.RECHERCHE_CAT(filename, 1); + if (ptr == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename); + ptr = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (!mode) { + filename = file + ".spr"; + if (g_PTRNUL != _vm->_globals.SPRITE_ECRAN) + _vm->_globals.SPRITE_ECRAN = _vm->_fileManager.LIBERE_FICHIER(_vm->_globals.SPRITE_ECRAN); + if (!_vm->_globals.NOSPRECRAN) { + _vm->_globals.SPRITE_ECRAN = _vm->_fileManager.RECHERCHE_CAT(filename, 8); + if (_vm->_globals.SPRITE_ECRAN) { + _vm->_globals.CAT_FLAG = false; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename); + } else { + _vm->_globals.CAT_FLAG = true; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_SLI.RES"); + } + _vm->_globals.SPRITE_ECRAN = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + _vm->_globals.CAT_FLAG = false; + } + } + if (*ptr != 'I' || *(ptr + 1) != 'N' || *(ptr + 2) != 'I') { + error("Error, file not ini"); + } else { + doneFlag = false; + do { + dataVal1 = _vm->_scriptManager.Traduction(ptr + 20 * dataOffset); + if (_vm->shouldQuit()) + return; + + if (dataVal1 == 2) + dataOffset = _vm->_scriptManager.Control_Goto((ptr + 20 * dataOffset)); + if (dataVal1 == 3) + dataOffset = _vm->_scriptManager.Control_If(ptr, dataOffset); + if (dataOffset == -1) + error("Error, defective IFF"); + if (dataVal1 == 1 || dataVal1 == 4) + ++dataOffset; + if (!dataVal1 || dataVal1 == 5) + doneFlag = true; + } while (!doneFlag); + } + _vm->_globals.dos_free2(ptr); + if (mode != 1) { + if (g_PTRNUL != _vm->_globals.COUCOU) + _vm->_globals.COUCOU = _vm->_globals.dos_free2(_vm->_globals.COUCOU); + + filename = file + ".rep"; + byte *dataP = _vm->_fileManager.RECHERCHE_CAT(filename, 2); + _vm->_globals.COUCOU = dataP; + if (g_PTRNUL == dataP) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename); + dataP = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + _vm->_globals.COUCOU = dataP; + } + } + _vm->_objectsManager.FORCEZONE = 1; + _vm->_objectsManager.CHANGEVERBE = 0; +} + +void GraphicsManager::NB_SCREEN() { + byte *destP; + const byte *srcP; + + 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(); + + destP = VESA_SCREEN; + srcP = VESA_BUFFER; + memcpy(VESA_SCREEN, VESA_BUFFER, 0x95FFCu); + srcP = srcP + 614396; + destP = destP + 614396; + *destP = *srcP; + *(destP + 2) = *(srcP + 2); + DD_VBL(); +} + +void GraphicsManager::SHOW_PALETTE() { + setpal_vga256(Palette); +} + +void GraphicsManager::videkey() { + // Empty in original +} + +void GraphicsManager::Copy_WinScan_Vbe(const byte *src, byte *dest) { + int result; + int destOffset; + const byte *srcPtr; + byte byteVal; + + result = 0; + destOffset = 0; + srcPtr = src; + while (1) { + byteVal = *srcPtr; + if (*srcPtr < 0xFCu) + goto Video_Cont_wVbe; + if (byteVal == (byte)-4) + return; + if (byteVal == (byte)-3) { + destOffset += *(srcPtr + 1); + byteVal = *(srcPtr + 2); + srcPtr += 2; + } else if (byteVal == (byte)-2) { + destOffset += READ_LE_UINT16(srcPtr + 1); + byteVal = *(srcPtr + 3); + srcPtr += 3; + } else { + destOffset += READ_LE_UINT32(srcPtr + 1); + byteVal = *(srcPtr + 5); + srcPtr += 5; + } +Video_Cont_wVbe: + *(dest + destOffset) = byteVal; + ++srcPtr; + ++destOffset; + } +} + +void GraphicsManager::Copy_Video_Vbe(const byte *src) { + int destOffset; + const byte *srcP; + byte byteVal; + + assert(VideoPtr); + destOffset = 0; + srcP = src; + while (1) { + byteVal = *srcP; + if (*srcP < 0xFCu) + goto Video_Cont_Vbe; + if (byteVal == (byte)-4) + return; + if (byteVal == (byte)-3) { + destOffset += *(srcP + 1); + byteVal = *(srcP + 2); + srcP += 2; + } else if (byteVal == (byte)-2) { + destOffset += READ_LE_UINT16(srcP + 1); + byteVal = *(srcP + 3); + srcP += 3; + } else { + destOffset += READ_LE_UINT32(srcP + 1); + byteVal = *(srcP + 5); + srcP += 5; + } +Video_Cont_Vbe: + *((byte *)VideoPtr->pixels + destOffset) = byteVal; + ++srcP; + ++destOffset; + } +} + +// Reduce Screen +void GraphicsManager::Reduc_Ecran(const byte *srcSurface, byte *destSurface, int xp, int yp, int width, int height, int zoom) { + const byte *srcP; + byte *destP; + const byte *lineSrcP; + + srcP = xp + nbrligne2 * yp + srcSurface; + destP = destSurface; + Red = zoom; + Largeur = width; + Red_x = 0; + Red_y = 0; + if (zoom < 100) { + Reduc_Ecran_L = Asm_Reduc(width, Red); + Reduc_Ecran_H = Asm_Reduc(height, Red); + + for (int yCtr = 0; yCtr < height; ++yCtr, srcP += nbrligne2) { + Red_y += Red; + if (Red_y < 100) { + Red_x = 0; + lineSrcP = srcP; + + for (int xCtr = 0; xCtr < Largeur; ++xCtr) { + Red_x += Red; + if (Red_x < 100) { + *destP++ = *lineSrcP++; + } else { + Red_x -= 100; + ++lineSrcP; + } + } + } else { + Red_y -= 100; + } + } + } +} + +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, byte col) { + byte *destP; + int yCtr; + + destP = surface + xp + nbrligne2 * yp; + yCtr = height; + do { + *destP = col; + destP += nbrligne2; + --yCtr; + } while (yCtr); +} + + +} // End of namespace Hopkins diff --git a/engines/hopkins/graphics.h b/engines/hopkins/graphics.h new file mode 100644 index 0000000000..8b93efcbc6 --- /dev/null +++ b/engines/hopkins/graphics.h @@ -0,0 +1,192 @@ +/* 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. + * + */ + +#ifndef HOPKINS_GRAPHICS_H +#define HOPKINS_GRAPHICS_H + +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/rect.h" +#include "common/str.h" +#include "graphics/surface.h" + +namespace Hopkins { + +#define PALETTE_SIZE 256 +#define PALETTE_BLOCK_SIZE (PALETTE_SIZE * 3) +#define PALETTE_EXT_BLOCK_SIZE 800 + +struct RGB8 { + byte r; + byte g; + byte b; +}; + +class HopkinsEngine; + +class GraphicsManager { +private: + HopkinsEngine *_vm; + + void CHARGE_ECRAN(const Common::String &file); + int Asm_Zoom(int v, int percentage); + int Asm_Reduc(int v, int percentage); +public: + int _lockCtr; + bool SDL_MODEYES; + int SDL_ECHELLE; + int XSCREEN; + int YSCREEN; + int WinScan; + int Winbpp; + byte SD_PIXELS[PALETTE_SIZE * 2]; + byte *PAL_PIXELS; + int nbrligne; + byte TABLE_COUL[PALETTE_EXT_BLOCK_SIZE]; + byte cmap[PALETTE_BLOCK_SIZE]; + byte Palette[PALETTE_EXT_BLOCK_SIZE]; + byte OLD_PAL[PALETTE_EXT_BLOCK_SIZE]; + bool Linear; + Graphics::Surface *VideoPtr; + byte *VESA_SCREEN; + byte *VESA_BUFFER; + int ofscroll; + int SCROLL; + byte HEADER_PCX[128]; + int PCX_L, PCX_H; + bool DOUBLE_ECRAN; + int OLD_SCROLL; + int MANU_SCROLL; + int SPEED_SCROLL; + int nbrligne2; + int Agr_x, Agr_y; + int Agr_Flag_x, Agr_Flag_y; + int FADESPD; + byte PALPCX[PALETTE_EXT_BLOCK_SIZE]; + int FADE_LINUX; + bool NOLOCK; + int no_scroll; + Common::Rect dstrect[50]; + int REDRAW; + int min_x, min_y; + int max_x, max_y; + int clip_x, clip_y; + int clip_x1, clip_y1; + bool clip_flag; + int SDL_NBLOCS; + int Red_x, Red_y; + int Red; + int Largeur; + int Compteur_y; + int spec_largeur; + bool NOFADE; + int Reduc_Ecran_L, Reduc_Ecran_H; +public: + GraphicsManager(); + ~GraphicsManager(); + void setParent(HopkinsEngine *vm); + + void SET_MODE(int width, int height); + void DD_Lock(); + void DD_Unlock(); + void DD_LOCK() { DD_Lock(); } + void DD_UNLOCK() { DD_Unlock(); } + void Cls_Video(); + void LOAD_IMAGE(const Common::String &file); + void INIT_TABLE(int minIndex, int maxIndex, byte *palette); + int SCROLL_ECRAN(int amount); + void Trans_bloc(byte *destP, const byte *srcP, int count, int minThreshold, int maxThreshold); + 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 SCANLINE(int pitch); + void m_scroll(const byte *surface, int xs, int ys, int width, int height, int destX, int destY); + void m_scroll2(const byte *surface, int xs, int ys, int width, int height, int destX, int destY); + void m_scroll2A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY); + void m_scroll16(const byte *surface, int xs, int ys, int width, int height, int destX, int destY); + void m_scroll16A(const byte *surface, int xs, int ys, int width, int height, int destX, int destY); + void Copy_Vga(const byte *surface, int xp, int yp, int width, int height, int destX, int destY); + void Copy_Vga16(const byte *surface, int xp, int yp, int width, int height, int destX, int destY); + void fade_in(const byte *palette, int step, const byte *surface); + void fade_out(const byte *palette, int step, const byte *surface); + void FADE_INS(); + void FADE_OUTS(); + void FADE_INW(); + void FADE_OUTW(); + void FADE_OUTW_LINUX(const byte *surface); + void FADE_INW_LINUX(const byte *surface); + void setpal_vga256(const byte *palette); + void setpal_vga256_linux(const byte *palette, const byte *surface); + void SETCOLOR(int palIndex, int r, int g, int b); + void SETCOLOR2(int palIndex, int r, int g, int b); + void SETCOLOR3(int palIndex, int r, int g, int b); + void SETCOLOR4(int palIndex, int r, int g, int b); + void CHANGE_PALETTE(const byte *palette); + uint16 MapRGB(byte r, byte g, byte b); + void DD_VBL(); + void Copy_WinScan_Vbe3(const byte *srcData, byte *destSurface); + void Copy_Video_Vbe3(const byte *srcData); + void Copy_Video_Vbe16(const byte *srcData); + void Copy_Video_Vbe16a(const byte *srcData); + void Capture_Mem(const byte *srcSurface, byte *destSurface, int xs, int ys, int width, int height); + + /** + * Draws a sprite onto the screen + * @param surface Destination surface + * @param spriteData The raw data for a sprite set + * @param xp X co-ordinate. For some reason, starts from 300 = first column + * @param yp Y co-ordinate. FOr some reason, starts from 300 = top row + * @param spriteIndex Index of the sprite to draw + */ + void Sprite_Vesa(byte *surface, const byte *spriteData, int xp, int yp, int spriteIndex); + + void FIN_VISU(); + void VISU_ALL(); + void RESET_SEGMENT_VESA(); + void Ajoute_Segment_Vesa(int x1, int y1, int x2, int y2); + int Magic_Number(int v); + void Affiche_Segment_Vesa(); + void CopyAsm(const byte *surface); + void Restore_Mem(byte *destSurface, const byte *src, int xp, int yp, int width, int height); + int Reel_Zoom(int v, int percentage); + int Reel_Reduc(int v, int percentage); + void Affiche_Perfect(byte *surface, const byte *srcData, int xp300, int yp300, int frameIndex, 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 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 colour); + void INI_ECRAN(const Common::String &file); + void INI_ECRAN2(const Common::String &file); + void OPTI_INI(const Common::String &file, int mode); + void NB_SCREEN(); + void SHOW_PALETTE(); + void videkey(); + void Copy_WinScan_Vbe(const byte *srcP, byte *destP); + void Copy_Video_Vbe(const byte *src); + void Reduc_Ecran(const byte *srcSruface, byte *destSurface, int xp, int yp, int width, int height, int zoom); + 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, byte col); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_GRAPHICS_H */ diff --git a/engines/hopkins/hopkins.cpp b/engines/hopkins/hopkins.cpp new file mode 100644 index 0000000000..ba3c1da752 --- /dev/null +++ b/engines/hopkins/hopkins.cpp @@ -0,0 +1,1015 @@ +/* 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/scummsys.h" +#include "common/config-manager.h" +#include "common/debug-channels.h" +#include "common/events.h" +#include "common/file.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" +#include "hopkins/files.h" +#include "hopkins/saveload.h" +#include "hopkins/sound.h" +#include "hopkins/talk.h" + +namespace Hopkins { + +HopkinsEngine *g_vm; + +HopkinsEngine::HopkinsEngine(OSystem *syst, const HopkinsGameDescription *gameDesc) : Engine(syst), + _gameDescription(gameDesc), _randomSource("Hopkins"), _animationManager() { + g_vm = this; + _debugger.setParent(this); + _animationManager.setParent(this); + _dialogsManager.setParent(this); + _eventsManager.setParent(this); + _fileManager.setParent(this); + _fontManager.setParent(this); + _globals.setParent(this); + _graphicsManager.setParent(this); + _linesManager.setParent(this); + _menuManager.setParent(this); + _objectsManager.setParent(this); + _saveLoadManager.setParent(this); + _scriptManager.setParent(this); + _soundManager.setParent(this); + _talkManager.setParent(this); +} + +HopkinsEngine::~HopkinsEngine() { +} + +Common::String HopkinsEngine::generateSaveName(int slot) { + return Common::String::format("%s.%03d", _targetName.c_str(), slot); +} + +/** + * Returns true if it is currently okay to restore a game + */ +bool HopkinsEngine::canLoadGameStateCurrently() { + return !_globals.SORTIE && !_globals.PLAN_FLAG; +} + +/** + * Returns true if it is currently okay to save the game + */ +bool HopkinsEngine::canSaveGameStateCurrently() { + return !_globals.SORTIE && !_globals.PLAN_FLAG; +} + +/** + * Load the savegame at the specified slot index + */ +Common::Error HopkinsEngine::loadGameState(int slot) { + return _saveLoadManager.restore(slot); +} + +/** + * Save the game to the given slot index, and with the given name + */ +Common::Error HopkinsEngine::saveGameState(int slot, const Common::String &desc) { + return _saveLoadManager.save(slot, desc); +} + +Common::Error HopkinsEngine::run() { + _saveLoadManager.initSaves(); + + Common::StringMap iniParams; + _fileManager.Chage_Inifile(iniParams); + processIniParams(iniParams); + + _globals.setConfig(); + _fileManager.F_Censure(); + INIT_SYSTEM(); + + _soundManager.WSOUND_INIT(); + + _globals.CHARGE_OBJET(); + _objectsManager.CHANGE_OBJET(14); + _objectsManager.AJOUTE_OBJET(14); + + _globals.HELICO = 0; + _eventsManager.MOUSE_OFF(); + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + + _graphicsManager.LOAD_IMAGE("LINUX"); + + _graphicsManager.FADE_INW(); + _eventsManager.delay(1500); + _graphicsManager.FADE_OUTW(); + + if (!_globals.internet) { + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("MP.ANM", 10, 16, 200); + } + + _graphicsManager.LOAD_IMAGE("H2"); + _graphicsManager.FADE_INW(); + _eventsManager.delay(500); + _graphicsManager.FADE_OUTW(); + + if (!_eventsManager.ESC_KEY) + INTRORUN(); + + _globals.iRegul = 0; + _fileManager.CONSTRUIT_SYSTEM("PERSO.SPR"); + _globals.PERSO = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + _globals.PERSO_TYPE = 0; + _globals.PLANX = _globals.PLANY = 0; + memset(_globals.SAUVEGARDE, 0, 2000); + _globals.SORTIE = 0; + _globals.PASSWORD = 1; + +LABEL_12: + if (_globals.SORTIE == 300) +LABEL_13: + _globals.SORTIE = 0; + + if (!_globals.SORTIE) { + _globals.SORTIE = _menuManager.MENU(); + if (_globals.SORTIE == -1) { + if (!g_system->getEventManager()->shouldQuit()) + PUBQUIT(); + _globals.PERSO = _globals.dos_free2(_globals.PERSO); + REST_SYSTEM(); + } + } + + for (;;) { + for (;;) { + for (;;) { + for (;;) { + for (;;) { + for (;;) { + for (;;) { + for (;;) { + if (g_system->getEventManager()->shouldQuit()) + return Common::kNoError; + + if (_globals.SORTIE == 300) + goto LABEL_13; + if (_globals.SORTIE == 18) + PASS(); + if (_globals.SORTIE == 23) + PASS(); + if (_globals.SORTIE == 22) + PASS(); + if (_globals.SORTIE == 19) + PASS(); + if (_globals.SORTIE == 20) + PASS(); + if (_globals.SORTIE != 1) + break; + + _globals.Max_Propre = 50; + _globals.Max_Ligne_Long = 40; + _globals.Max_Propre_Gen = 20; + _globals.Max_Perso_Y = 435; + _objectsManager.PERSONAGE2("IM01", "IM01", "ANIM01", "IM01", 1); + } + + if (_globals.SORTIE != 3) + break; + + if (!*((byte *)_globals.SAUVEGARDE + 170)) { + _soundManager.WSOUND(3); + if (_globals.FR == 1) + _graphicsManager.LOAD_IMAGE("fondfr"); + if (!_globals.FR) + _graphicsManager.LOAD_IMAGE("fondan"); + if (_globals.FR == 2) + _graphicsManager.LOAD_IMAGE("fondes"); + _graphicsManager.FADE_INW(); + _eventsManager.delay(500); + _graphicsManager.FADE_OUTW(); + _globals.iRegul = 1; + _soundManager.SPECIAL_SOUND = 2; + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + _graphicsManager.FADE_LINUX = 2; + + if (!_globals.CENSURE) + _animationManager.PLAY_ANM("BANQUE.ANM", 200, 28, 200); + if (_globals.CENSURE == 1) + _animationManager.PLAY_ANM("BANKUK.ANM", 200, 28, 200); + _soundManager.SPECIAL_SOUND = 0; + _soundManager.DEL_SAMPLE(1); + _soundManager.DEL_SAMPLE(2); + _soundManager.DEL_SAMPLE(3); + _soundManager.DEL_SAMPLE(4); + *((byte *)_globals.SAUVEGARDE + 170) = 1; + } + + _globals.Max_Propre = 5; + _globals.Max_Ligne_Long = 5; + _globals.Max_Propre_Gen = 5; + _globals.Max_Perso_Y = 450; + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE2("IM03", "IM03", "ANIM03", "IM03", 2); + } + + if (_globals.SORTIE != 4) + break; + _globals.DESACTIVE_INVENT = true; + _objectsManager.PLAN_BETA(); + _globals.DESACTIVE_INVENT = false; + } + + if (_globals.SORTIE != 5) + break; + _globals.Max_Propre = 5; + _globals.Max_Ligne_Long = 5; + _globals.Max_Propre_Gen = 5; + _globals.Max_Perso_Y = 455; + _globals.NOSPRECRAN = 1; + byte v1 = *((byte *)_globals.SAUVEGARDE + 80); + if (v1) { + if (v1 == 1) + _objectsManager.PERSONAGE2("IM05", "IM05A", "ANIM05B", "IM05", 3); + } else { + _objectsManager.PERSONAGE2("IM05", "IM05", "ANIM05", "IM05", 3); + } + + _globals.NOSPRECRAN = 0; + } + + if (_globals.SORTIE != 8) + break; + + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 15; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 450; + _objectsManager.PERSONAGE2("IM08", "IM08", "ANIM08", "IM08", 2); + } + + if (_globals.SORTIE != 6) + break; + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 20; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 460; + _objectsManager.PERSONAGE2("IM06", "IM06", "ANIM06", "IM06", 2); + } + + if (_globals.SORTIE != 7) + break; + if (*((byte *)_globals.SAUVEGARDE + 220)) + _objectsManager.PERSONAGE("BOMBEB", "BOMBE", "BOMBE", "BOMBE", 2); + else + _objectsManager.PERSONAGE("BOMBEA", "BOMBE", "BOMBE", "BOMBE", 2); + } + + if (_globals.SORTIE == 9) { + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 20; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 440; + + if (!*((byte *)_globals.SAUVEGARDE + 225)) + goto LABEL_109; + _objectsManager.PERSONAGE2("IM09", "IM09", "ANIM09", "IM09", 10); + } else { + if (_globals.SORTIE == 10) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE("IM10", "IM10", "ANIM10", "IM10", 9); + goto LABEL_124; + } + + if (_globals.SORTIE == 11) { + _globals.NOSPRECRAN = 1; + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 20; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 450; + _objectsManager.PERSONAGE2("IM11", "IM11", "ANIM11", "IM11", 2); + goto LABEL_124; + } + + switch (_globals.SORTIE) { + case 12: + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 20; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 450; + if (*((byte *)_globals.SAUVEGARDE + 225)) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE2("IM12", "IM12", "ANIM12", "IM12", 1); + } else { +LABEL_109: + BOOM(); + } + break; + case 13: + _globals.Max_Propre = 50; + _globals.Max_Ligne_Long = 40; + _globals.Max_Propre_Gen = 20; + _globals.Max_Perso_Y = 440; + _objectsManager.PERSONAGE2("IM13", "IM13", "ANIM13", "IM13", 1); + break; + case 14: + _globals.Max_Propre = 50; + _globals.Max_Ligne_Long = 40; + _globals.Max_Propre_Gen = 20; + _globals.Max_Perso_Y = 440; + _objectsManager.PERSONAGE2("IM14", "IM14", "ANIM14", "IM14", 1); + break; + default: + if (_globals.SORTIE == 15) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE("IM15", "IM15", "ANIM15", "IM15", 29); + goto LABEL_124; + } + if (_globals.SORTIE == 16) { + _globals.Max_Propre = 5; + _globals.Max_Ligne_Long = 5; + _globals.Max_Propre_Gen = 5; + _globals.Max_Perso_Y = 450; + + byte v2 = *((byte *)_globals.SAUVEGARDE + 113); + if (v2 == 1) { + _objectsManager.PERSONAGE2("IM16", "IM16A", "ANIM16", "IM16", 7); + } else if (!v2) { + _objectsManager.PERSONAGE2("IM16", "IM16", "ANIM16", "IM16", 7); + } + } else { + if (_globals.SORTIE == 17) + PASS(); + if (_globals.SORTIE == 24) + PASS(); + if (_globals.SORTIE == 25) { + _globals.Max_Propre = 15; + _globals.Max_Ligne_Long = 20; + _globals.Max_Propre_Gen = 10; + _globals.Max_Perso_Y = 445; + _objectsManager.PERSONAGE2("IM25", "IM25", "ANIM25", "IM25", 30); + } else { + if (_globals.SORTIE == 33) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE("IM33", "IM33", "ANIM33", "IM33", 8); + goto LABEL_124; + } + + if (_globals.SORTIE == 26) { + _globals.Max_Propre = 50; + _globals.Max_Ligne_Long = 40; + _globals.Max_Propre_Gen = 20; + _globals.Max_Perso_Y = 435; + _objectsManager.PERSONAGE2("IM26", "IM26", "ANIM26", "IM26", 30); + } else { + if (_globals.SORTIE == 27) + PASS(); + if (_globals.SORTIE == 28) + PASS(); + if (_globals.SORTIE == 29) + PASS(); + if (_globals.SORTIE == 30) + PASS(); + if (_globals.SORTIE == 31) + PASS(); + if (_globals.SORTIE == 35) + ENDEMO(); + if (_globals.SORTIE == 32) + PASS(); + if (_globals.SORTIE == 34) + PASS(); + + if ((uint16)(_globals.SORTIE - 51) <= 38) + PASS(); + if (_globals.SORTIE == 111) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE("IM111", "IM111", "ANIM111", "IM111", 10); + goto LABEL_124; + } + + if (_globals.SORTIE == 112) { + _globals.NOSPRECRAN = 1; + _objectsManager.PERSONAGE("IM112", "IM112", "ANIM112", "IM112", 10); +LABEL_124: + _globals.NOSPRECRAN = 0; + } else if (_globals.SORTIE == 113) { + _globals.SORTIE = 0; + _globals.OLD_ECRAN = _globals.ECRAN; + *((byte *)_globals.SAUVEGARDE + 6) = _globals.ECRAN; + _globals.ECRAN = 113; + *((byte *)_globals.SAUVEGARDE + 5) = 113; + _menuManager.COMPUT_HOPKINS(1); + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.DD_VBL(); + memset(_graphicsManager.VESA_BUFFER, 0, 0x4B000u); + memset(_graphicsManager.VESA_SCREEN, 0, 0x4B000u); + _graphicsManager.Cls_Pal(); + _graphicsManager.RESET_SEGMENT_VESA(); + } else { + if (_globals.SORTIE == 114) { + _globals.SORTIE = 0; + _globals.OLD_ECRAN = _globals.ECRAN; + *((byte *)_globals.SAUVEGARDE + 6) = _globals.ECRAN; + _globals.ECRAN = 114; + *((byte *)_globals.SAUVEGARDE + 5) = 114; + _menuManager.COMPUT_HOPKINS(2); + goto LABEL_128; + } + if (_globals.SORTIE == 115) { + _globals.SORTIE = 0; + _globals.OLD_ECRAN = _globals.ECRAN; + *((byte *)_globals.SAUVEGARDE + 6) = _globals.ECRAN; + _globals.ECRAN = 115; + *((byte *)_globals.SAUVEGARDE + 5) = 115; + _menuManager.COMPUT_HOPKINS(3); + +LABEL_128: + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + } else if ((uint16)(_globals.SORTIE - 194) > 5) { + if (_globals.SORTIE == 151) { + _soundManager.WSOUND(16); + _globals.iRegul = 1; + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("JOUR3A.anm", 12, 12, 2000); + _globals.iRegul = 0; + _globals.SORTIE = 300; + } + + if (_globals.SORTIE == 150) { + _soundManager.WSOUND(16); + _globals.iRegul = 1; + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("JOUR1A.anm", 12, 12, 2000); + _globals.iRegul = 0; + _globals.SORTIE = 300; + } + + if (_globals.SORTIE == 152) { + _soundManager.WSOUND(16); + _globals.iRegul = 1; + + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("JOUR4A.anm", 12, 12, 2000); + _globals.iRegul = 0; + _globals.SORTIE = 300; + } + goto LABEL_12; + } + } + } + } + } + break; + } + } + } + + // Stub event loop + Common::Event evt; + while (!g_system->getEventManager()->shouldQuit()) { + while (g_system->getEventManager()->pollEvent(evt)) + g_system->updateScreen(); + } + + return Common::kNoError; +} + +bool HopkinsEngine::shouldQuit() const { + return g_system->getEventManager()->shouldQuit(); +} + +int HopkinsEngine::getRandomNumber(int maxNumber) { + return _randomSource.getRandomNumber(maxNumber); +} + +void HopkinsEngine::processIniParams(Common::StringMap &iniParams) { + _globals.XFULLSCREEN = iniParams["FULLSCREEN"] == "YES"; + + _globals.XSETMODE = 1; + if (iniParams.contains("SETMODE")) { + int setMode = atoi(iniParams["SETMODE"].c_str()); + _globals.XSETMODE = CLIP(setMode, 1, 5); + } + + _globals.XZOOM = 0; + if (_globals.XSETMODE == 5 && iniParams.contains("ZOOM")) { + int zoom = atoi(iniParams["ZOOM"].c_str()); + _globals.XZOOM = CLIP(zoom, 25, 100); + } + + _globals.XFORCE16 = iniParams["FORCE16BITS"] == "YES"; + _globals.XFORCE8 = iniParams["FORCE8BITS"] == "YES"; + _globals.CARD_SB = iniParams["SOUND"] == "YES"; +} + +void HopkinsEngine::INIT_SYSTEM() { + // Set graphics mode + _graphicsManager.SET_MODE(640, 480); + + if (getPlatform() == Common::kPlatformLinux) + _eventsManager.mouse_linux = true; + else + _eventsManager.mouse_linux = false; + + switch (_globals.FR) { + case 0: + if (!_eventsManager.mouse_linux) + _fileManager.CONSTRUIT_SYSTEM("SOUAN.SPR"); + else + _fileManager.CONSTRUIT_SYSTEM("LSOUAN.SPR"); + break; + case 1: + if (!_eventsManager.mouse_linux) + _fileManager.CONSTRUIT_SYSTEM("SOUFR.SPR"); + else + _fileManager.CONSTRUIT_SYSTEM("LSOUFR.SPR"); + break; + case 2: + _fileManager.CONSTRUIT_SYSTEM("SOUES.SPR"); + break; + } + + if (_eventsManager.mouse_linux) { + _eventsManager.souris_sizex = 52; + _eventsManager.souris_sizey = 32; + } else { + _eventsManager.souris_sizex = 34; + _eventsManager.souris_sizey = 20; + } + _eventsManager.pointeur_souris = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + + _globals.clearAll(); + + _fileManager.CONSTRUIT_SYSTEM("FONTE3.SPR"); + _globals.police = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + _globals.police_l = 12; + _globals.police_h = 21; + _fileManager.CONSTRUIT_SYSTEM("ICONE.SPR"); + _globals.ICONE = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + _fileManager.CONSTRUIT_SYSTEM("TETE.SPR"); + _globals.TETE = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + + switch (_globals.FR) { + case 0: + _fileManager.CONSTRUIT_FICHIER(_globals.HOPLINK, "ZONEAN.TXT"); + _globals.BUF_ZONE = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + break; + case 1: + _fileManager.CONSTRUIT_FICHIER(_globals.HOPLINK, "ZONE01.TXT"); + _globals.BUF_ZONE = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + break; + case 2: + _fileManager.CONSTRUIT_FICHIER(_globals.HOPLINK, "ZONEES.TXT"); + _globals.BUF_ZONE = _fileManager.CHARGE_FICHIER(_globals.NFICHIER); + break; + } + + _eventsManager.INSTALL_SOURIS(); + _eventsManager.souris_on(); + _eventsManager.souris_flag = false; + _eventsManager.souris_max(); + + _globals.HOPKINS_DATA(); + + _eventsManager.ofset_souris_x = 0; + _eventsManager.ofset_souris_y = 0; + _globals.lItCounter = 0; + _globals.lOldItCounter = 0; +} + +void HopkinsEngine::INTRORUN() { + signed int v2; + signed int v3; + uint16 v4; + signed int v5; + int i; + int v7; + signed int v8; + signed int v9; + signed int v11; + int v12; + signed int v13; + signed int v14; + int j; + int k; + int l; + int m; + int v21; + char v22; + char v23; + byte paletteData[PALETTE_EXT_BLOCK_SIZE]; + byte paletteData2[PALETTE_EXT_BLOCK_SIZE]; + + memset(&paletteData, 0, PALETTE_EXT_BLOCK_SIZE); + _eventsManager.VBL(); + _eventsManager.souris_flag = false; + _globals.iRegul = 1; + _eventsManager.VBL(); + _soundManager.WSOUND(16); + _animationManager.CLS_ANM = true; + _animationManager.PLAY_ANM("J1.anm", 12, 12, 50); + if (!_eventsManager.ESC_KEY) { + _soundManager.VOICE_MIX(1, 3); + _animationManager.PLAY_ANM("J2.anm", 12, 12, 50); + + if (!_eventsManager.ESC_KEY) { + _soundManager.VOICE_MIX(2, 3); + _animationManager.PLAY_ANM("J3.anm", 12, 12, 50); + + if (!_eventsManager.ESC_KEY) { + _soundManager.VOICE_MIX(3, 3); + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + _graphicsManager.DD_VBL(); + _soundManager.WSOUND(11); + _graphicsManager.LOAD_IMAGE("intro1"); + _graphicsManager.SCROLL_ECRAN(0); + _graphicsManager.ofscroll = 0; + _graphicsManager.SETCOLOR3(252, 100, 100, 100); + _graphicsManager.SETCOLOR3(253, 100, 100, 100); + _graphicsManager.SETCOLOR3(251, 100, 100, 100); + _graphicsManager.SETCOLOR3(254, 0, 0, 0); + _globals.BPP_NOAFF = true; + v2 = 0; + do { + _eventsManager.VBL(); + ++v2; + } while (v2 <= 4); + + _globals.BPP_NOAFF = false; + _globals.iRegul = 1; + _graphicsManager.FADE_INW(); + if (_graphicsManager.DOUBLE_ECRAN == true) { + _graphicsManager.no_scroll = 2; + v3 = 0; + _graphicsManager.SCROLL = 0; + + do { + _graphicsManager.SCROLL += 2; + if (_graphicsManager.SCROLL > (SCREEN_WIDTH - 2)) { + _graphicsManager.SCROLL = SCREEN_WIDTH; + v3 = 1; + } + + if (_eventsManager.XMOUSE() < _graphicsManager.SCROLL + 10) { + v4 = _eventsManager.YMOUSE(); + _eventsManager.souris_xy(_eventsManager.souris_x + 4, v4); + } + _eventsManager.VBL(); + } while (!shouldQuit() && v3 != 1 && _graphicsManager.SCROLL != SCREEN_WIDTH); + + _eventsManager.VBL(); + _graphicsManager.no_scroll = 0; + + if (shouldQuit()) + return; + } + + _soundManager.VOICE_MIX(4, 3); + _graphicsManager.FADE_OUTW(); + _graphicsManager.no_scroll = 0; + _graphicsManager.LOAD_IMAGE("intro2"); + _graphicsManager.SCROLL_ECRAN(0); + _animationManager.CHARGE_ANIM("INTRO2"); + _graphicsManager.VISU_ALL(); + _soundManager.WSOUND(23); + _objectsManager.BOBANIM_OFF(3); + _objectsManager.BOBANIM_OFF(5); + _graphicsManager.ofscroll = 0; + _graphicsManager.SETCOLOR3(252, 100, 100, 100); + _graphicsManager.SETCOLOR3(253, 100, 100, 100); + _graphicsManager.SETCOLOR3(251, 100, 100, 100); + _graphicsManager.SETCOLOR3(254, 0, 0, 0); + _globals.BPP_NOAFF = true; + v5 = 0; + + do { + _eventsManager.VBL(); + ++v5; + } while (v5 <= 4); + + _globals.BPP_NOAFF = false; + _globals.iRegul = 1; + _graphicsManager.FADE_INW(); + for (i = 0; i < 200 / _globals.vitesse; ++i) + _eventsManager.VBL(); + + _objectsManager.BOBANIM_ON(3); + _soundManager.VOICE_MIX(5, 3); + _objectsManager.BOBANIM_OFF(3); + _eventsManager.VBL(); + memcpy(&paletteData2, _graphicsManager.Palette, 796); + v21 = *(uint16 *)&_graphicsManager.Palette[796]; + v22 = _graphicsManager.Palette[798]; + v7 = (int)&v23; + _graphicsManager.setpal_vga256_linux(paletteData, _graphicsManager.VESA_BUFFER); + _graphicsManager.FIN_VISU(); + + if (shouldQuit()) + return; + + _soundManager.SPECIAL_SOUND = 5; + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("ELEC.ANM", 10, 26, 200); + if (shouldQuit()) + return; + + _soundManager.SPECIAL_SOUND = 0; + + if (!_eventsManager.ESC_KEY) { + _graphicsManager.LOAD_IMAGE("intro2"); + _graphicsManager.SCROLL_ECRAN(0); + _animationManager.CHARGE_ANIM("INTRO2"); + _graphicsManager.VISU_ALL(); + _soundManager.WSOUND(23); + _objectsManager.BOBANIM_OFF(3); + _objectsManager.BOBANIM_OFF(5); + _objectsManager.BOBANIM_OFF(1); + _graphicsManager.ofscroll = 0; + _graphicsManager.SETCOLOR3(252, 100, 100, 100); + _graphicsManager.SETCOLOR3(253, 100, 100, 100); + _graphicsManager.SETCOLOR3(251, 100, 100, 100); + _graphicsManager.SETCOLOR3(254, 0, 0, 0); + _globals.BPP_NOAFF = true; + v8 = 0; + + do { + _eventsManager.VBL(); + ++v8; + } while (v8 <= 3); + + _globals.BPP_NOAFF = false; + _globals.iRegul = 1; + _graphicsManager.setpal_vga256_linux(paletteData2, _graphicsManager.VESA_BUFFER); + v9 = 0; + + while (!shouldQuit() && !_eventsManager.ESC_KEY) { + if (v9 == 12) { + _objectsManager.BOBANIM_ON(3); + _eventsManager.VBL(); + _soundManager.VOICE_MIX(6, 3); + _eventsManager.VBL(); + _objectsManager.BOBANIM_OFF(3); + } + + Common::copy(&paletteData2[0], &paletteData2[PALETTE_BLOCK_SIZE], &_graphicsManager.Palette[0]); + + v11 = 1; + v12 = 4 * v9; + do { + if (_graphicsManager.Palette[v11] > v12) + _graphicsManager.Palette[v11] -= v12; + ++v11; + } while ( v11 <= PALETTE_BLOCK_SIZE); + + _graphicsManager.setpal_vga256_linux(_graphicsManager.Palette, _graphicsManager.VESA_BUFFER); + v13 = 1; + + if (2 * v9 > 1) { + v7 = 2 * v9; + + do { + _eventsManager.VBL(); + ++v13; + } while (v13 < v7); + } + + _graphicsManager.setpal_vga256_linux(paletteData2, _graphicsManager.VESA_BUFFER); + v14 = 1; + if (20 - v9 > 1) { + v7 = 20 - v9; + + do { + _eventsManager.VBL(); + ++v14; + } while (v14 < v7); + } + + v9 += 2; + if (v9 > 15) { + _graphicsManager.setpal_vga256_linux(paletteData, _graphicsManager.VESA_BUFFER); + for (j = 1; j < 100 / _globals.vitesse; ++j) + _eventsManager.VBL(); + + _objectsManager.BOBANIM_ON(3); + _soundManager.VOICE_MIX(7, 3); + _objectsManager.BOBANIM_OFF(3); + + for (k = 1; k < 60 / _globals.vitesse; ++k) + _eventsManager.VBL(); + _objectsManager.BOBANIM_ON(5); + for (l = 0; l < 20 / _globals.vitesse; ++l) + _eventsManager.VBL(); + + Common::copy(&paletteData2[0], &paletteData2[PALETTE_BLOCK_SIZE], &_graphicsManager.Palette[0]); + _graphicsManager.setpal_vga256_linux(_graphicsManager.Palette, _graphicsManager.VESA_BUFFER); + + for (m = 0; m < 50 / _globals.vitesse; ++m) { + if (m == 30 / _globals.vitesse) { + _objectsManager.BOBANIM_ON(3); + _soundManager.VOICE_MIX(8, 3); + _objectsManager.BOBANIM_OFF(3); + } + + _eventsManager.VBL(); + } + + _graphicsManager.FADE_OUTW(); + _graphicsManager.FIN_VISU(); + _animationManager.CLS_ANM = true; + _soundManager.WSOUND(3); + _soundManager.SPECIAL_SOUND = 1; + _animationManager.PLAY_ANM("INTRO1.anm", 10, 24, 18); + if (shouldQuit()) + return; + + _soundManager.SPECIAL_SOUND = 0; + + if (!_eventsManager.ESC_KEY) { + _animationManager.PLAY_ANM("INTRO2.anm", 10, 24, 18); + if (shouldQuit()) + return; + + if (!_eventsManager.ESC_KEY) { + _animationManager.PLAY_ANM("INTRO3.anm", 10, 24, 200); + if (shouldQuit()) + return; + + if (!_eventsManager.ESC_KEY) { + _animationManager.CLS_ANM = false; + _graphicsManager.FADE_LINUX = 2; + _animationManager.PLAY_ANM("J4.anm", 12, 12, 1000); + } + } + } + break; + } + } + } + } + } + } + + _eventsManager.ESC_KEY = false; +} + +void HopkinsEngine::PASS() { + if (_globals.FR == 1) + _graphicsManager.LOAD_IMAGE("ndfr"); + else + _graphicsManager.LOAD_IMAGE("nduk"); + + _graphicsManager.FADE_INW(); + if (_soundManager.VOICEOFF) + _eventsManager.delay(500); + else + _soundManager.VOICE_MIX(628, 4); + + _graphicsManager.FADE_OUTW(); + _globals.SORTIE = 4; +} + +void HopkinsEngine::ENDEMO() { + _soundManager.WSOUND(28); + if (_globals.FR == 1) + _graphicsManager.LOAD_IMAGE("endfr"); + else + _graphicsManager.LOAD_IMAGE("enduk"); + + _graphicsManager.FADE_INW(); + _eventsManager.delay(1500); + _graphicsManager.FADE_OUTW(); + _globals.SORTIE = 0; +} + +void HopkinsEngine::BOOM() { + _graphicsManager.nbrligne = 640; + _graphicsManager.SCANLINE(640); + _graphicsManager.DD_Lock(); + _graphicsManager.Cls_Video(); + _graphicsManager.DD_Unlock(); + _graphicsManager.Cls_Pal(); + + _globals.iRegul = 1; + _soundManager.SPECIAL_SOUND = 199; + _graphicsManager.FADE_LINUX = 2; + if (_globals.SVGA == 1) + _animationManager.PLAY_ANM("BOMBE2.ANM", 50, 14, 500); + if (_globals.SVGA == 2) + _animationManager.PLAY_ANM("BOMBE2A.ANM", 50, 14, 500); + + _soundManager.SPECIAL_SOUND = 0; + _graphicsManager.LOAD_IMAGE("IM15"); + _animationManager.CHARGE_ANIM("ANIM15"); + _graphicsManager.VISU_ALL(); + _objectsManager.BOBANIM_OFF(7); + _globals.BPP_NOAFF = true; + + for (int idx = 0; idx < 5; ++idx) { + _eventsManager.VBL(); + } + + _globals.BPP_NOAFF = false; + _graphicsManager.FADE_INW(); + _eventsManager.MOUSE_OFF(); + + for (int idx = 0; idx < 20; ++idx) { + _eventsManager.VBL(); + } + + _globals.NOPARLE = true; + _talkManager.PARLER_PERSO2("vire.pe2"); + _globals.NOPARLE = false; + _objectsManager.BOBANIM_ON(7); + + for (int idx = 0; idx < 100; ++idx) { + _eventsManager.VBL(); + } + + _graphicsManager.FADE_OUTW(); + _graphicsManager.FIN_VISU(); + _globals.iRegul = 0; + _globals.SORTIE = 151; +} + +void HopkinsEngine::REST_SYSTEM() { + quitGame(); + _eventsManager.CONTROLE_MES(); +} + +void HopkinsEngine::PUBQUIT() { + _globals.PUBEXIT = 1; + _graphicsManager.RESET_SEGMENT_VESA(); + _globals.FORET = 0; + _eventsManager.CASSE = false; + _globals.DESACTIVE_INVENT = true; + _globals.FLAG_VISIBLE = false; + _graphicsManager.LOAD_IMAGE("BOX"); + _soundManager.WSOUND(28); + _graphicsManager.FADE_INW(); + _eventsManager.MOUSE_ON(); + _eventsManager.CHANGE_MOUSE(0); + _eventsManager.btsouris = 0; + _eventsManager.souris_n = 0; + _globals.netscape = true; + + bool mouseClicked = false; + int xp, yp; + do { + xp = _eventsManager.XMOUSE(); + yp = _eventsManager.YMOUSE(); + _eventsManager.VBL(); + + if (_eventsManager.BMOUSE() == 1) + mouseClicked = true; + } while (!mouseClicked && !g_system->getEventManager()->shouldQuit()); + + // Original tried to open a web browser link here. Since ScummVM doesn't support + // that, it's being skipped in favour of simply exitting + + _graphicsManager.FADE_OUTW(); +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/hopkins.h b/engines/hopkins/hopkins.h new file mode 100644 index 0000000000..1399a80498 --- /dev/null +++ b/engines/hopkins/hopkins.h @@ -0,0 +1,147 @@ +/* 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. + * + */ + +#ifndef HOPKINS_H +#define HOPKINS_H + +#include "common/scummsys.h" +#include "common/system.h" +#include "common/error.h" +#include "common/random.h" +#include "common/hash-str.h" +#include "common/util.h" +#include "engines/engine.h" +#include "graphics/surface.h" +#include "hopkins/anim.h" +#include "hopkins/debugger.h" +#include "hopkins/dialogs.h" +#include "hopkins/events.h" +#include "hopkins/files.h" +#include "hopkins/font.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/lines.h" +#include "hopkins/menu.h" +#include "hopkins/objects.h" +#include "hopkins/saveload.h" +#include "hopkins/script.h" +#include "hopkins/sound.h" +#include "hopkins/talk.h" + +/** + * This is the namespace of the Hopkins engine. + * + * Status of this engine: In Development + * + * Games using this engine: + * - Hopkins FBI + */ +namespace Hopkins { + +enum { + kHopkinsDebugAnimations = 1 << 0, + kHopkinsDebugActions = 1 << 1, + kHopkinsDebugSound = 1 << 2, + kHopkinsDebugMusic = 1 << 3, + kHopkinsDebugScripts = 1 << 4 +}; + +#define DEBUG_BASIC 1 +#define DEBUG_INTERMEDIATE 2 +#define DEBUG_DETAILED 3 + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 480 + +struct HopkinsGameDescription; + +class HopkinsEngine : public Engine { +private: + const HopkinsGameDescription *_gameDescription; + Common::RandomSource _randomSource; + + /** + * Processes the loaded list of ini file parameters + */ + void processIniParams(Common::StringMap &iniParams); + + void INIT_SYSTEM(); + + void PASS(); + void REST_SYSTEM(); + void PUBQUIT(); + void ENDEMO(); + void BOOM(); +protected: + // Engine APIs + virtual Common::Error run(); + virtual bool hasFeature(EngineFeature f) const; + +public: + Debugger _debugger; + AnimationManager _animationManager; + DialogsManager _dialogsManager; + EventsManager _eventsManager; + FontManager _fontManager; + Globals _globals; + FileManager _fileManager; + GraphicsManager _graphicsManager; + LinesManager _linesManager; + MenuManager _menuManager; + ObjectsManager _objectsManager; + SaveLoadManager _saveLoadManager; + ScriptManager _scriptManager; + SoundManager _soundManager; + TalkManager _talkManager; +public: + HopkinsEngine(OSystem *syst, const HopkinsGameDescription *gameDesc); + virtual ~HopkinsEngine(); + void GUIError(const Common::String &msg); + + uint32 getFeatures() const; + Common::Language getLanguage() const; + Common::Platform getPlatform() const; + uint16 getVersion() const; + bool getIsDemo() const; + bool shouldQuit() const; + + int getRandomNumber(int maxNumber); + Common::String generateSaveName(int slotNumber); + virtual bool canLoadGameStateCurrently(); + virtual bool canSaveGameStateCurrently(); + virtual Common::Error loadGameState(int slot); + virtual Common::Error saveGameState(int slot, const Common::String &desc); + + /** + * Run the introduction sequence + */ + void INTRORUN(); +}; + +// Global reference to the HopkinsEngine object +extern HopkinsEngine *g_vm; + +#define GLOBALS g_vm->_globals + +} // End of namespace Hopkins + +#endif /* HOPKINS_H */ diff --git a/engines/hopkins/lines.cpp b/engines/hopkins/lines.cpp new file mode 100644 index 0000000000..2ba89962d7 --- /dev/null +++ b/engines/hopkins/lines.cpp @@ -0,0 +1,3927 @@ +/* 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/system.h" +#include "common/textconsole.h" +#include "hopkins/lines.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +LinesManager::LinesManager() { + for (int i = 0; i < 400; ++i) { + Common::fill((byte *)&LigneZone[i], (byte *)&LigneZone[i] + sizeof(LigneZoneItem), 0); + Common::fill((byte *)&Ligne[i], (byte *)&Ligne[i] + sizeof(LigneItem), 0); + } + for (int i = 0; i < 4000; ++i) { + Common::fill((byte *)&SMOOTH[i], (byte *)&SMOOTH[i] + sizeof(SmoothItem), 0); + } + + next_ligne = 0; + TOTAL_LIGNES = 0; + NV_LIGNEDEP = 0; + NV_LIGNEOFS = 0; + NV_POSI = 0; + NVPX = 0; + NVPY = 0; + SMOOTH_SENS = 0; + SMOOTH_X = SMOOTH_Y = 0; +} + +void LinesManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +void LinesManager::CLEAR_ZONE() { + for (int idx = 0; idx < 400; ++idx) + RETIRE_LIGNE_ZONE(idx); + + next_ligne = 0; +} + +// Object Zone +int LinesManager::ZONE_OBJET(int a1, int a2) { + int v2; + + v2 = 0; + if ((uint)(a2 - 120) <= 0x21u) + v2 = OPTI_ZONE(a1, 1, 0); + if ((uint)(a2 - 154) <= 0x25u) + v2 = OPTI_ZONE(a1, 7, 0); + if ((uint)(a2 - 192) <= 0x25u) + v2 = OPTI_ZONE(a1, 13, 0); + if ((uint)(a2 - 230) <= 0x25u) + v2 = OPTI_ZONE(a1, 19, 0); + if ((uint)(a2 - 268) <= 0x25u) + v2 = OPTI_ZONE(a1, 25, 1); + if ((uint)(a2 - 268) <= 0x14u && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) + v2 = 30; + if ((uint)(a2 - 290) <= 0x10u && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) + v2 = 31; + if (a1 < _vm->_graphicsManager.ofscroll + 152 || a1 > _vm->_graphicsManager.ofscroll + 484) + v2 = 32; + if ((uint)(a2 - 114) > 0xC0u) + v2 = 32; + return v2; +} + +int LinesManager::OPTI_ZONE(int a1, int a2, int a3) { + int v3; + signed int v4; + + v3 = a2; + v4 = 0; + if (a1 >= _vm->_graphicsManager.ofscroll + 158 && a1 <= _vm->_graphicsManager.ofscroll + 208) + v4 = 1; + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 208 && a1 <= _vm->_graphicsManager.ofscroll + 266) { + v3 = a2 + 1; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 266 && a1 <= _vm->_graphicsManager.ofscroll + 320) { + v3 += 2; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 320 && a1 <= _vm->_graphicsManager.ofscroll + 370) { + v3 += 3; + v4 = 1; + } + if (!v4) { + if (a1 >= _vm->_graphicsManager.ofscroll + 370 && a1 <= _vm->_graphicsManager.ofscroll + 424) { + v3 += 4; + v4 = 1; + } + if (!v4) { + if (!a3 && a1 >= _vm->_graphicsManager.ofscroll + 424 && a1 <= _vm->_graphicsManager.ofscroll + 478) { + v3 += 5; + v4 = 1; + } + if (!v4) + v3 = 0; + } + } + } + } + } + return v3; +} + +// Remove Line Zone +void LinesManager::RETIRE_LIGNE_ZONE(int idx) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (_vm->_linesManager.LigneZone[idx].zoneData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)_vm->_linesManager.LigneZone[idx].zoneData); + + _vm->_linesManager.LigneZone[idx].zoneData = (int16 *)g_PTRNUL; +} + +// Add Line Zone +void LinesManager::AJOUTE_LIGNE_ZONE(int idx, int a2, int a3, int a4, int a5, int a6) { + int v8; + int v9; + int16 *zoneData; + int16 *dataP; + int v11; + int v13; + int v14; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + + if (a2 != a3 || a3 != a4 || a3 != a5) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + + if (LigneZone[idx].zoneData != (int16 *)g_PTRNUL) + LigneZone[idx].zoneData = (int16 *)_vm->_globals.dos_free2((byte *)LigneZone[idx].zoneData); + v8 = a2 - a4; + if (a2 - a4 < 0) + v8 = -v8; + v19 = v8; + v9 = a3 - a5; + if (a3 - a5 < 0) + v9 = -v9; + v18 = v9; + if (v19 <= v9) + v20 = v9 + 1; + else + v20 = v19 + 1; + + zoneData = (int16 *)_vm->_globals.dos_malloc2(2 * sizeof(int16) * v20 + (4 * sizeof(int16))); + v11 = idx; + LigneZone[v11].zoneData = zoneData; + if (zoneData == (int16 *)g_PTRNUL) + error("AJOUTE LIGNE ZONE"); + + dataP = zoneData; + v23 = 1000 * v19 / v20; + v22 = 1000 * v18 / v20; + if (a4 < a2) + v23 = -v23; + if (a5 < a3) + v22 = -v22; + v13 = 1000 * a2; + v16 = 1000 * a3; + v17 = 1000 * a2 / 1000; + v21 = 1000 * a3 / 1000; + v14 = 0; + if (v20 > 0) { + do { + *dataP++ = v17; + *dataP++ = v21; + + v13 += v23; + v16 += v22; + v17 = v13 / 1000; + v21 = v16 / 1000; + ++v14; + } while (v20 > v14); + } + *dataP++ = -1; + *dataP++ = -1; + + LigneZone[idx].count = v20; + LigneZone[idx].field2 = a6; + } else { + _vm->_globals.BOBZONE_FLAG[a6] = true; + _vm->_globals.BOBZONE[a6] = a3; + } +} + + +void LinesManager::RESET_OBSTACLE() { + for (int idx =0; idx < 400; ++idx) { + RETIRE_LIGNE(idx); + Ligne[idx].field0 = 0; + Ligne[idx].lineData = (int16 *)g_PTRNUL; + } +} + +// Remove Line +void LinesManager::RETIRE_LIGNE(int idx) { + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (Ligne[idx].lineData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)Ligne[idx].lineData); + Ligne[idx].lineData = (int16 *)g_PTRNUL; +} + +// Add Line +void LinesManager::AJOUTE_LIGNE(int idx, int a2, int a3, int a4, int a5, int a6, int a7) { + int v7; + int v8; + int v9; + byte *v10; + int v11; + int v12; + int v13; + int v24; + int v25; + int v26; + int16 *v27; + int v30; + int v31; + int16 *v32; + int v33; + int v34; + int v35; + int v36; + int v37; + int v38; + int v39; + int v40; + + if (idx > 400) + error("Attempting to add a line obstacle > MAX_LIGNE."); + if (TOTAL_LIGNES < idx) + TOTAL_LIGNES = idx; + + if (Ligne[idx].lineData != (int16 *)g_PTRNUL) + _vm->_globals.dos_free2((byte *)Ligne[idx].lineData); + v7 = a3 - a5; + if (a3 - a5 < 0) + v7 = -v7; + v8 = v7 + 1; + v9 = a4 - a6; + if (a4 - a6 < 0) + v9 = -v9; + v34 = v9 + 1; + v33 = v9 + 1; + if (v8 > (int)(v9 + 1)) + v34 = v8; + + v10 = _vm->_globals.dos_malloc2(4 * v34 + 8); + if (v10 == g_PTRNUL) + error("AJOUTE LIGNE OBSTACLE"); + + Common::fill(v10, v10 + 4 * v34 + 8, 0); + Ligne[idx].lineData = (int16 *)v10; + + v32 = Ligne[idx].lineData; + v36 = 1000 * v8; + v39 = 1000 * v8 / (v34 - 1); + v37 = 1000 * v33 / (v34 - 1); + if (a5 < a3) + v39 = -v39; + if (a6 < a4) + v37 = -v37; + v11 = (int)v39 / 1000; + v12 = (int)v37 / 1000; + v13 = (int)v37 / 1000; + if (!((int)v39 / 1000)) { + if (v12 == -1) { + Ligne[idx].field6 = 1; + Ligne[idx].field8 = 5; + } + if (v12 == 1) { + Ligne[idx].field6 = 5; + Ligne[idx].field8 = 1; + } + } + if (v11 == 1) { + if (v12 == -1) { + Ligne[idx].field6 = 2; + Ligne[idx].field8 = 6; + } + if (!v13) { + Ligne[idx].field6 = 3; + Ligne[idx].field8 = 7; + } + if (v13 == 1) { + Ligne[idx].field6 = 4; + Ligne[idx].field8 = 8; + } + } + if (v11 == -1) { + if (v13 == 1) { + Ligne[idx].field6 = 6; + Ligne[idx].field8 = 2; + } + if (!v13) { + Ligne[idx].field6 = 7; + Ligne[idx].field8 = 3; + } + if (v13 == -1) { + Ligne[idx].field6 = 8; + Ligne[idx].field8 = 4; + } + } + if (v11 == 1 && (unsigned int)(v37 - 251) <= 0x2EC) { + Ligne[idx].field6 = 4; + Ligne[idx].field8 = 8; + } + if (v11 == -1 && (unsigned int)(v37 - 251) <= 0x2EC) { + Ligne[idx].field6 = 6; + Ligne[idx].field8 = 2; + } + if (v11 == 1 && (unsigned int)(v37 + 999) <= 0x2EC) { + Ligne[idx].field6 = 2; + Ligne[idx].field8 = 6; + } + if (v11 == -1 && v37 <= 249 && v37 > 1000) { + Ligne[idx].field6 = 8; + Ligne[idx].field8 = 4; + } + v40 = v36 / v34; + v38 = 1000 * v33 / v34; + if (a5 < a3) + v40 = -v40; + if (a6 < a4) + v38 = -v38; + v24 = 1000 * a3; + v25 = 1000 * a4; + v31 = 1000 * a3 / 1000; + v30 = 1000 * a4 / 1000; + v35 = v34 - 1; + v26 = 0; + if (v35 > 0) { + do { + v32[0] = v31; + v32[1] = v30; + v32 += 2; + + v24 += v40; + v25 += v38; + v31 = v24 / 1000; + v30 = v25 / 1000; + ++v26; + } while (v35 > v26); + } + v32[0] = a5; + v32[1] = a6; + + v27 = v32 + 2; + v27[0] = -1; + v27[1] = -1; + + Ligne[idx].field0 = v35 + 1; + Ligne[idx].field2 = a7; + Ligne[idx].field4 = a2; +} + +// Line Collision 2 +int LinesManager::colision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6) { + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int16 *v13; + int v14; + int result; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + + v24 = a5; + v6 = a5; + if (a5 >= a6 + 1) { +LABEL_29: + result = 0; + } else { + v22 = a1 + 4; + v21 = a1 - 4; + v20 = a2 + 4; + v19 = a2 - 4; + while (1) { + v7 = Ligne[v6].lineData; + + if (v7 != (int16 *)g_PTRNUL) { + v23 = 1; + v8 = 2 * Ligne[v6].field0; + v9 = v7[0]; + v16 = v7[1]; + v10 = v7[v8 - 2]; + v18 = v7[v8 - 1]; + if (v7[0] >= v10) + goto LABEL_32; + if (v22 < v9 || v21 > v10) + v23 = 0; + if (v9 >= v10) { +LABEL_32: + if (v21 > v9 || v22 < v10) + v23 = 0; + } + if (v16 >= v18) + goto LABEL_33; + if (v20 < v16 || v19 > v18) + v23 = 0; + if (v16 >= v18) { +LABEL_33: + if (v19 > v16 || v20 < v18) + v23 = 0; + } + if (v23 == 1) { + v11 = 0; + v17 = Ligne[v24].field0; + if (v17 > 0) + break; + } + } +LABEL_28: + ++v24; + v6 = v24; + if (v24 >= a6 + 1) + goto LABEL_29; + } + while (1) { + v12 = v7[0]; + + v13 = v7 + 1; + v14 = v13[0]; + v7 = v13 + 1; + + if (a1 == v12 || a1 + 1 == v12) { + if (a2 == v14 || a2 + 1 == v14) + break; + } + ++v11; + if (v17 <= v11) + goto LABEL_28; + } + *a3 = v11; + *a4 = v24; + result = 1; + } + return result; +} + +int LinesManager::Scolision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6) { + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int16 *v13; + int result; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + + v24 = a5; + v6 = a5; + if (a5 >= a6 + 1) { +LABEL_47: + result = 0; + } else { + v22 = a1 + 10; + v21 = a1 - 10; + v20 = a2 + 10; + v19 = a2 - 10; + for (;;) { + v7 = Ligne[v6].lineData; + + if (v7 != (int16 *)g_PTRNUL) { + v23 = 1; + v8 = 2 * Ligne[v6].field0; + v9 = v7[0]; + v15 = v7[1]; + v10 = v7[v8 - 2]; + v17 = v7[v8 - 1]; + if (v7[0] >= v10) + goto LABEL_50; + if (v22 < v9 || v21 > v10) + v23 = 0; + if (v9 >= v10) { +LABEL_50: + if (v21 > v9 || v22 < v10) + v23 = 0; + } + if (v15 >= v17) + goto LABEL_51; + if (v20 < v15 || v19 > v17) + v23 = 0; + if (v15 >= v17) { +LABEL_51: + if (v19 > v15 || v20 < v17) + v23 = 0; + } + if (v23 == 1) { + v11 = 0; + v18 = Ligne[v24].field0; + if (v18 > 0) + break; + } + } +LABEL_46: + ++v24; + v6 = v24; + if (v24 >= a6 + 1) + goto LABEL_47; + } + while (1) { + v12 = v7[0]; + v13 = v7 + 1; + v16 = v13[0]; + v7 = v13 + 1; + if (a1 == v12 + || v12 == a1 + 1 + || v12 == a1 + 2 + || v12 == a1 + 3 + || v12 == a1 + 4 + || v12 == a1 + 5 + || v12 == a1 + 6 + || v12 == a1 + 7 + || v12 == a1 + 8 + || v12 == a1 + 9 + || a1 + 10 == v12) { + if (v16 == a2 + || v16 == a2 + 1 + || v16 == a2 + 2 + || v16 == a2 + 3 + || v16 == a2 + 4 + || v16 == a2 + 5 + || v16 == a2 + 6 + || v16 == a2 + 7 + || v16 == a2 + 8 + || v16 == a2 + 9 + || a2 + 10 == v16) + break; + } + ++v11; + if (v18 <= v11) + goto LABEL_46; + } + *a3 = v11; + *a4 = v24; + result = 1; + } + return result; +} + +// Init route +void LinesManager::INIPARCOURS() { + int v0; + int v1; + int v2; + int16 *v3; + int v4; + int v5; + int v6; + int16 *v7; + int v8; + int v9; + int v11; + int v12; + int v13; + int v14; + int v15; + + v15 = Ligne[0].lineData[0]; + v14 = Ligne[0].lineData[1]; + + v0 = 1; + v1 = 0; + do { + v2 = Ligne[v0].field0; + v3 = Ligne[v0].lineData; + + v4 = v3[2 * v2 - 2]; + v5 = v3[2 * v2 - 1]; + if (_vm->_graphicsManager.max_x == v4 || _vm->_graphicsManager.max_y == v5 || _vm->_graphicsManager.min_x == v4 + || _vm->_graphicsManager.min_y == v5) + v1 = 1; + if (v15 == v4 && v14 == v5) + v1 = 1; + if (v0 == 400) { + v6 = v1; + error("ERROR - LAST LINE NOT FOUND"); + v1 = v6; + } + v7 = Ligne[v0 + 1].lineData; + if (v7[0] != v4 && v7[1] != v5) + v1 = 1; + if (!v1) + ++v0; + } while (v1 != 1); + + _vm->_objectsManager.DERLIGNE = v0; + v8 = 1; + v13 = _vm->_globals.Max_Ligne_Long; + v9 = _vm->_objectsManager.DERLIGNE + 1; + do { + v11 = v8; + if (Ligne[v11].field0 < v13) { + if (v8 != v9) { + v12 = v8 - 1; + Ligne[v11].field6 = Ligne[v12].field6; + Ligne[v11].field8 = Ligne[v12].field8; + } + } + ++v8; + } while (v8 != 400); +} + +// Avoid +int LinesManager::CONTOURNE(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7) { + int v7; + int v8; + int i; + int16 *v10; + int v11; + int v12; + int v13; + int16 *v14; + int v15; + int v16; + int j; + int16 *v18; + int v19; + int v20; + int k; + int16 *v22; + int v23; + int v24; + int v25; + int16 *v26; + int v27; + int v28; + int v29; + int16 *v30; + int v31; + int v32; + int v34; + int v35; + int v36; + int v50; + + v36 = a1; + v7 = a2; + v8 = a3; + if (a1 < a4) { + for (i = a2; Ligne[a1].field0 > i; ++i) { + v10 = Ligne[a1].lineData; + v11 = v10[2 * i]; + v50 = v10[2 * i + 1]; + + v12 = v8; + a6[v12] = v11; + a6[v12 + 1] = v50; + a6[v12 + 2] = Ligne[a1].field6; + v8 += a7; + } + v34 = a1 + 1; + if ((int)(a1 + 1) < a4) { + do { + v13 = 0; + if (Ligne[v34].field0 > 0) { + do { + v14 = Ligne[v34].lineData; + v15 = v14[2 * v13]; + v50 = v14[2 * v13 + 1]; + v16 = v8; + + a6[v16] = v15; + a6[v16 + 1] = v50; + a6[v16 + 2] = Ligne[v34].field6; + v8 += a7; + ++v13; + } while (Ligne[v34].field0 > v13); + } + ++v34; + } while (v34 < a4); + } + v7 = 0; + v36 = a4; + } + if (v36 > a4) { + for (j = v7; j > 0; --j) { + v18 = Ligne[v36].lineData; + v19 = v18[2 * j]; + v50 = v18[2 * j + 1]; + + v20 = v8; + a6[v20] = v19; + a6[v20 + 1] = v50; + a6[v20 + 2] = Ligne[v36].field8; + v8 += a7; + } + v35 = v36 - 1; + if ((int)(v36 - 1) > a4) { + do { + for (k = Ligne[v35].field0 - 1; k > 0; --k) { + v22 = Ligne[v35].lineData; + v23 = v22[2 * k]; + v50 = v22[2 * k + 1]; + + v24 = v8; + a6[v24] = v23; + a6[v24 + 1] = v50; + a6[v24 + 2] = Ligne[v35].field8; + v8 += a7; + } + --v35; + } while (v35 > a4); + } + v7 = Ligne[a4].field0 - 1; + v36 = a4; + } + if (v36 == a4) { + if (a5 >= v7) { + if (a5 > v7) { + v29 = v7; + do { + v30 = Ligne[a4].lineData; + v31 = v30[2 * v29]; + v50 = v30[2 * v29 + 1]; + + v32 = v8; + a6[v32] = v31; + a6[v32 + 1] = v50; + a6[v32 + 2] = Ligne[a4].field6; + v8 += a7; + ++v29; + } while (a5 > v29); + } + } else { + v25 = v7; + do { + v26 = Ligne[a4].lineData; + v27 = v26[2 * v25]; + v50 = v26[2 * v25 + 1]; + + v28 = v8; + a6[v28] = v27; + a6[v28 + 1] = v50; + a6[v28 + 2] = Ligne[a4].field8; + v8 += a7; + --v25; + } while (a5 < v25); + } + } + return v8; +} + +// Avoid 1 +int LinesManager::CONTOURNE1(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7, int a8, int a9) { + int v9; + int v10; + int i; + int16 *v12; + int v13; + int v14; + int v15; + int v16; + int16 *v17; + int v18; + int v19; + int j; + int16 *v21; + int v22; + int v23; + int v24; + int k; + int16 *v26; + int v27; + int v28; + int v29; + int16 *v30; + int v31; + int v32; + int v33; + int16 *v34; + int v35; + int v36; + int v38; + int v39; + int v40; + int v50; + + v9 = a1; + v10 = a2; + v40 = a3; + if (a4 < a1) { + for (i = a2; Ligne[a1].field0 > i; ++i) { + v12 = Ligne[a1].lineData; + v13 = v12[2 * i]; + v50 = v12[2 * i + 1]; + + v14 = v40; + a6[v14] = v13; + a6[v14 + 1] = v50; + a6[v14 + 2] = Ligne[a1].field6; + v40 += a7; + } + v15 = a1 + 1; + if ((int)(a1 + 1) == a9 + 1) + v15 = a8; + while (a4 != v15) { + v16 = 0; + if (Ligne[v15].field0 > 0) { + do { + v17 = Ligne[v15].lineData; + v18 = v17[2 * v16]; + v50 = v17[2 * v16 + 1]; + + v19 = v40; + a6[v19] = v18; + a6[v19 + 1] = v50; + a6[v19 + 2] = Ligne[v15].field6; + v40 += a7; + ++v16; + } while (Ligne[v15].field0 > v16); + } + ++v15; + if (a9 + 1 == v15) + v15 = a8; + } + v10 = 0; + v9 = a4; + } + if (a4 > v9) { + for (j = v10; j > 0; --j) { + v21 = Ligne[v9].lineData; + v22 = v21[2 * j]; + v50 = v21[2 * j + 1]; + + v23 = v40; + a6[v23] = v22; + a6[v23 + 1] = v50; + a6[v23 + 2] = Ligne[v9].field8; + v40 += a7; + } + v24 = v9 - 1; + if (v24 == a8 - 1) + v24 = a9; + while (a4 != v24) { + for (k = Ligne[v24].field0 - 1; k > 0; --k) { + v26 = Ligne[v24].lineData; + v27 = v26[2 * k]; + v50 = v26[2 * k + 1]; + + v28 = v40; + a6[v28] = v27; + a6[v28 + 1] = v50; + a6[v28 + 2] = Ligne[v24].field8; + v40 += a7; + } + --v24; + if (a8 - 1 == v24) + v24 = a9; + } + v10 = Ligne[a4].field0 - 1; + v9 = a4; + } + if (a4 == v9) { + if (a5 >= v10) { + if (a5 > v10) { + v33 = v10; + v39 = a4; + do { + v34 = Ligne[v39].lineData; + v35 = v34[2 * v33]; + v50 = v34[2 * v33 + 1]; + + v36 = v40; + a6[v36] = v35; + a6[v36 + 1] = v50; + a6[v36 + 2] = Ligne[v39].field6; + v40 += a7; + ++v33; + } while (a5 > v33); + } + } else { + v29 = v10; + v38 = a4; + do { + v30 = Ligne[v38].lineData; + v31 = v30[2 * v29]; + v50 = v30[2 * v29 + 1]; + + v32 = v40; + a6[v32] = v31; + a6[v32 + 1] = v50; + a6[v32 + 2] = Ligne[v38].field8; + v40 += a7; + --v29; + } while (a5 < v29); + } + } + return v40; +} + +int LinesManager::MIRACLE(int a1, int a2, int a3, int a4, int a5) { + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int i; + int v12; + int v13; + int j; + int v15; + int v16; + int k; + int v18; + int v19; + int l; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v35 = 0; + int v36 = 0; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42 = 0; + int v43 = 0; + int v44 = 0; + int v45 = 0; + int v46 = 0; + int v47 = 0; + int v48 = 0; + int v49 = 0; + int v50; + int v51; + + v5 = a1; + v6 = a2; + v50 = a3; + v7 = a5; + if (colision2_ligne(a1, a2, &v51, &v50, 0, TOTAL_LIGNES) == 1) { + v8 = Ligne[v50].field4; + if (v8 == 1) + v6 = a2 - 2; + if (v8 == 2) { + v6 -= 2; + v5 = a1 + 2; + } + if (v8 == 3) + v5 += 2; + if (v8 == 4) { + v6 += 2; + v5 += 2; + } + if (v8 == 5) + v6 += 2; + if (v8 == 6) { + v6 += 2; + v5 -= 2; + } + if (v8 == 7) + v5 -= 2; + if (v8 == 8) { + v6 -= 2; + v5 -= 2; + } + } + v41 = v5; + v40 = v6; + v9 = 0; + v10 = v40; + for (i = v40; v40 + 200 > v10; i = v10) { + if (colision2_ligne(v41, i, &v49, &v48, 0, _vm->_objectsManager.DERLIGNE) == 1 && v48 <= _vm->_objectsManager.DERLIGNE) + break; + v49 = 0; + v48 = -1; + ++v9; + ++v10; + } + v37 = v9; + v12 = 0; + v13 = v40; + for (j = v40; v40 - 200 < v13; j = v13) { + if (colision2_ligne(v41, j, &v47, &v46, 0, _vm->_objectsManager.DERLIGNE) == 1 && v46 <= _vm->_objectsManager.DERLIGNE) + break; + v47 = 0; + v46 = -1; + ++v12; + --v13; + } + v39 = v12; + v15 = 0; + v16 = v41; + for (k = v41; v41 + 200 > v16; k = v16) { + if (colision2_ligne(k, v40, &v45, &v44, 0, _vm->_objectsManager.DERLIGNE) == 1 && v44 <= _vm->_objectsManager.DERLIGNE) + break; + v45 = 0; + v44 = -1; + ++v15; + ++v16; + } + v38 = v15; + v18 = 0; + v19 = v41; + for (l = v41; v41 - 200 < v19; l = v19) { + if (colision2_ligne(l, v40, &v43, &v42, 0, _vm->_objectsManager.DERLIGNE) == 1 && v42 <= _vm->_objectsManager.DERLIGNE) + break; + v43 = 0; + v42 = -1; + ++v18; + --v19; + } + if (a4 > v50) { + if (v46 != -1 && v46 <= v50) + v46 = -1; + if (v44 != -1 && v50 >= v44) + v44 = -1; + if (v48 != -1 && v50 >= v48) + v48 = -1; + if (v42 != -1 && v50 >= v42) + v42 = -1; + if (v46 != -1 && a4 < v46) + v46 = -1; + if (v44 != -1 && a4 < v44) + v44 = -1; + if (v48 != -1 && a4 < v48) + v48 = -1; + if (v42 != -1 && a4 < v42) + v42 = -1; + } + if (a4 < v50) { + if (v46 != -1 && v46 >= v50) + v46 = -1; + if (v44 != -1 && v50 <= v44) + v44 = -1; + if (v48 != -1 && v50 <= v48) + v48 = -1; + if (v42 != -1 && v50 <= v42) + v42 = -1; + if (v46 != -1 && a4 > v46) + v46 = -1; + if (v44 != -1 && a4 > v44) + v44 = -1; + if (v48 != -1 && a4 > v48) + v48 = -1; + if (v42 != -1 && a4 > v42) + v42 = -1; + } + if (v46 != -1 || v44 != -1 || v48 != -1 || v42 != -1) { + v21 = 0; + if (a4 > v50) { + if (v48 <= v46 && v44 <= v46 && v42 <= v46 && v46 > v50) + v21 = 1; + if (v48 <= v44 && v46 <= v44 && v42 <= v44 && v50 < v44) + v21 = 3; + if (v46 <= v48 && v44 <= v48 && v42 <= v48 && v50 < v48) + v21 = 5; + if (v48 <= v42 && v44 <= v42 && v46 <= v42 && v50 < v42) + v21 = 7; + } + if (a4 < v50) { + if (v46 == -1) + v46 = 1300; + if (v44 == -1) + v44 = 1300; + if (v48 == -1) + v48 = 1300; + if (v42 == -1) + v42 = 1300; + if (v46 != 1300 && v48 >= v46 && v44 >= v46 && v42 >= v46 && v46 < v50) + v21 = 1; + if (v44 != 1300 && v48 >= v44 && v46 >= v44 && v42 >= v44 && v50 > v44) + v21 = 3; + if (v48 != 1300 && v46 >= v48 && v44 >= v48 && v42 >= v48 && v50 > v48) + v21 = 5; + if (v42 != 1300 && v48 >= v42 && v44 >= v42 && v46 >= v42 && v50 > v42) + v21 = 7; + } + if (v21) { + if (v21 == 1) { + v36 = v46; + v35 = v47; + } + if (v21 == 3) { + v36 = v44; + v35 = v45; + } + if (v21 == 5) { + v36 = v48; + v35 = v49; + } + if (v21 == 7) { + v36 = v42; + v35 = v43; + } + if (v21 == 1) { + v22 = 0; + if (v39 > 0) { + do { + if (colision2_ligne(v41, v40 - v22, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v23 = GENIAL(v46, v47, v41, v40 - v22, v41, v40 - v39, v7, &_vm->_globals.super_parcours[0], 4); + if (v23 == -1) + return 0; + v7 = v23; + if (NVPY != -1) + v22 = NVPY - v40; + } + v24 = v7; + _vm->_globals.super_parcours[v24] = v41; + _vm->_globals.super_parcours[v24 + 1] = v40 - v22; + _vm->_globals.super_parcours[v24 + 2] = 1; + _vm->_globals.super_parcours[v24 + 3] = 0; + v7 += 4; + ++v22; + } while (v39 > v22); + } +LABEL_186: + NV_LIGNEDEP = v36; + NV_LIGNEOFS = v35; + NV_POSI = v7; + return 1; + } + if (v21 == 5) { + v25 = 0; + if (v37 > 0) { + do { + if (colision2_ligne(v41, v25 + v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v26 = GENIAL(v46, v47, v41, v25 + v40, v41, v37 + v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v26 == -1) + return 0; + v7 = v26; + if (NVPY != -1) + v25 = v40 - NVPY; + } + v27 = v7; + _vm->_globals.super_parcours[v27] = v41; + _vm->_globals.super_parcours[v27 + 1] = v25 + v40; + _vm->_globals.super_parcours[v27 + 2] = 5; + _vm->_globals.super_parcours[v27 + 3] = 0; + v7 += 4; + ++v25; + } while (v37 > v25); + } + goto LABEL_186; + } + if (v21 == 7) { + v28 = 0; + if (v18 > 0) { + do { + if (colision2_ligne(v41 - v28, v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v29 = GENIAL(v46, v47, v41 - v28, v40, v41 - v18, v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v29 == -1) + return 0; + v7 = v29; + if (NVPX != -1) + v28 = v41 - NVPX; + } + v30 = v7; + _vm->_globals.super_parcours[v30] = v41 - v28; + _vm->_globals.super_parcours[v30 + 1] = v40; + _vm->_globals.super_parcours[v30 + 2] = 7; + _vm->_globals.super_parcours[v30 + 3] = 0; + v7 += 4; + ++v28; + } while (v18 > v28); + } + goto LABEL_186; + } + if (v21 == 3) { + v31 = 0; + if (v38 > 0) { + do { + if (colision2_ligne(v31 + v41, v40, &v47, &v46, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v46) { + v32 = GENIAL(v46, v47, v31 + v41, v40, v38 + v41, v40, v7, &_vm->_globals.super_parcours[0], 4); + if (v32 == -1) + return 0; + v7 = v32; + if (NVPX != -1) + v31 = NVPX - v41; + } + v33 = v7; + _vm->_globals.super_parcours[v33] = v31 + v41; + _vm->_globals.super_parcours[v33 + 1] = v40; + _vm->_globals.super_parcours[v33 + 2] = 3; + _vm->_globals.super_parcours[v33 + 3] = 0; + v7 += 4; + ++v31; + } while (v38 > v31); + } + goto LABEL_186; + } + } + } + return 0; +} + +int LinesManager::GENIAL(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int16 *a8, int a9) { + int v9; + int16 *v10; + int v11; + int16 *v12; + int16 *v13; + int v14; + int v15; + int16 *v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int16 *v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35 = 0; + int v36 = 0; + int v37; + int v38; + int v40; + int v41; + int v42 = 0; + int v43 = 0; + int v44 = 0; + int v45 = 0; + int v46 = 0; + int v47 = 0; + int v48 = 0; + int v49 = 0; + int v50; + int16 *v51; + int v52; + int v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + int v66 = 0; + int v67; + int v68 = 0; + int v69; + int v70 = 0; + int v71; + int v72 = 0; + int v73; + int v74; + int v75; + int v76; + int v77 = 0; + int v78 = 0; + int v79 = 0; + int v80; + int v81; + int v82; + int v83; + int v84; + int v85; + int v86; + int v87; + int v88; + int v89; + int i; + int v91; + int v92; + int v93; + int v94; + int v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + + v99 = a7; + v80 = -1; + ++_vm->_globals.STOP_BUG; + if (_vm->_globals.STOP_BUG > 10) { + v9 = a7; +LABEL_112: + a8[v9] = -1; + a8[v9 + 1] = -1; + a8[v9 + 2] = -1; + return -1; + } + v10 = Ligne[a1].lineData; + v98 = v10[0]; + v97 = v10[1]; + v92 = a1; + + while (1) { + v86 = v92 - 1; + v11 = 2 * Ligne[v92 - 1].field0; + + v12 = Ligne[v92 - 1].lineData; + if (v12 == (int16 *)g_PTRNUL) + break; + while (v12[v11 - 2] != v98 || v97 != v12[v11 - 1]) { + --v86; + if (_vm->_objectsManager.DERLIGNE - 1 != v86) { + v11 = 2 * Ligne[v86].field0; + v12 = Ligne[v86].lineData; + if (v12 != (int16 *)g_PTRNUL) + continue; + } + goto LABEL_11; + } + + v92 = v86; + v98 = v12[0]; + v97 = v12[1]; + } +LABEL_11: + v13 = Ligne[a1].lineData; + v14 = 2 * Ligne[a1].field0; + v95 = v13[v14 - 2]; + v93 = v13[v14 - 1]; + v91 = a1; + + for (;;) { + v87 = v91 + 1; + v15 = 2 * Ligne[v91 + 1].field0; + v16 = Ligne[v91 + 1].lineData; + if (v16 == (int16 *)g_PTRNUL) + break; + while (1) { + v65 = v15; + v17 = v16[v15 - 2]; + if (v16[0] == v95) { + if (v93 == v16[1]) + break; + } + ++v87; + if (v87 != TOTAL_LIGNES + 1) { + v15 = 2 * Ligne[v87].field0; + v16 = Ligne[v87].lineData; + if (v16 != (int16 *)g_PTRNUL) + continue; + } + goto LABEL_17; + } + v91 = v87; + v95 = v17; + v93 = v16[v65 - 1]; + } +LABEL_17: + v18 = a3 - a5; + if (a3 - a5 < 0) + v18 = -v18; + v58 = v18 + 1; + v19 = a4 - a6; + if (a4 - a6 < 0) + v19 = -v19; + v85 = v19 + 1; + v20 = v19 + 1; + if (v58 > v20) + v85 = v18 + 1; + v84 = 1000 * v58 / v85; + v83 = 1000 * v20 / v85; + v21 = 1000 * a3; + v22 = 1000 * a4; + v82 = v21 / 1000; + v81 = v22 / 1000; + if (a5 < a3) + v84 = -v84; + if (a6 < a4) + v83 = -v83; + if (v85 > 800) + v85 = 800; + + Common::fill(&_vm->_globals.BufLig[0], &_vm->_globals.BufLig[1000], 0); + v23 = 0; + v88 = 0; + if (v85 + 1 > 0) { + v51 = _vm->_globals.BufLig; + do { + v24 = v23; + v51[v24] = v82; + v51[v24 + 1] = v81; + v21 += v84; + v22 += v83; + v82 = v21 / 1000; + v81 = v22 / 1000; + v23 += 2; + ++v88; + } while (v88 < v85 + 1); + } + v25 = v23 - 2; + v26 = 0; + v89 = v85 + 1; + if ((int)(v85 + 1) > 0) { + do { + v96 = _vm->_globals.BufLig[v25]; + v94 = _vm->_globals.BufLig[v25 + 1]; + if (colision2_ligne(v96, v94, &v101, &v100, v92, v91) == 1 && _vm->_objectsManager.DERLIGNE < v100) { + v80 = v100; + v77 = v101; + v78 = v96; + v79 = v94; + v26 = 1; + } + if (v26 == 1) + break; + v25 -= 2; + --v89; + } while (v89 > 0); + } + for (i = v92; i < v91 + 1; ++i) { + v27 = 2 * Ligne[i].field0; + v28 = Ligne[i].lineData; + if (v28 == (int16 *)g_PTRNUL) + error("error in genial routine"); + v29 = v28[0]; + v30 = v28[1]; + v59 = v28[1]; + v31 = v27; + v32 = v28[v27 - 2]; + v33 = v28[v31 - 1]; + if (i == v92) { + v72 = v33; + if (v30 <= v33) + v72 = v30; + v70 = v33; + if (v59 >= v33) + v70 = v59; + v68 = v32; + if (v29 <= v32) + v68 = v29; + v66 = v32; + if (v29 >= v32) + v66 = v29; + } else { + if (v59 < v33 && v59 < v72) + v72 = v59; + if (v33 < v59 && v33 < v72) + v72 = v33; + if (v59 > v33 && v59 > v70) + v70 = v59; + if (v33 > v59 && v33 > v70) + v70 = v33; + if (v29 < v32 && v68 > v29) + v68 = v29; + if (v32 < v29 && v68 > v32) + v68 = v32; + if (v29 > v32 && v66 < v29) + v66 = v29; + if (v32 > v29 && v66 < v32) + v66 = v32; + } + } + v69 = v68 - 2; + v73 = v72 - 2; + v67 = v66 + 2; + v71 = v70 + 2; + if (a5 >= v69 && a5 <= v67 && a6 >= v73 && a6 <= v71) { + v34 = a6; + v76 = -1; + do { + --v34; + v60 = colision2_ligne(a5, v34, &v101, &v100, v92, v91); + if (v60 == 1) + v76 = v100; + if (!v34 || v73 > v34) + v60 = 1; + } while (v60 != 1); + v35 = a6; + v75 = -1; + do { + ++v35; + v61 = colision2_ligne(a5, v35, &v101, &v100, v92, v91); + if (v61 == 1) + v75 = v100; + if (_vm->_globals.Max_Perso_Y <= v35 || v71 <= v35) + v61 = 1; + } while (v61 != 1); + v36 = a5; + v74 = -1; + do { + ++v36; + v62 = colision2_ligne(v36, a6, &v101, &v100, v92, v91); + if (v62 == 1) + v74 = v100; + if (_vm->_graphicsManager.max_x <= v36 || v67 <= v36) + v62 = 1; + } while (v62 != 1); + v37 = a5; + v38 = -1; + do { + --v37; + v63 = colision2_ligne(v37, a6, &v101, &v100, v92, v91); + if (v63 == 1) + v38 = v100; + if (v37 <= 0 || v69 >= v37) + v63 = 1; + } while (v63 != 1); + if (v74 != -1 && v38 != -1 && v76 != -1 && v75 != -1) { + v9 = a7; + goto LABEL_112; + } + } + if (v78 < a3 - 1 || v78 > a3 + 1 || v79 < a4 - 1 || v79 > a4 + 1) { + NVPX = v78; + NVPY = v79; + if (a1 < v80) { + v40 = v80 - a1; + if (v80 - a1 < 0) + v40 = -v40; + v41 = v40; + v42 = a1; + v43 = 0; + v52 = v92 - 1; + do { + if (v52 == v42) + v42 = v91; + ++v43; + --v42; + if (v52 == v42) + v42 = v91; + } while (v80 != v42); + if (v41 == v43) { + v44 = Ligne[a1].field0 / 2; + v54 = Ligne[a1].field0 / 2; + if (v44 < 0) + v54 = -v44; + if (a2 > v54) { + v55 = Ligne[a1].field0 / 2; + if (v44 < 0) + v55 = -v44; + if (a2 >= v55) + v99 = CONTOURNE(a1, a2, a7, v80, v77, a8, a9); + } else { + v99 = CONTOURNE1(a1, a2, a7, v80, v77, a8, a9, v92, v91); + } + } + if (v41 < v43) + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + if (v43 < v41) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } + if (a1 > v80) { + v45 = a1 - v80; + if (a1 - v80 < 0) + v45 = -v45; + v46 = v45; + v47 = a1; + v48 = 0; + v53 = v91 + 1; + do { + if (v53 == v47) + v47 = v92; + ++v48; + ++v47; + if (v53 == v47) + v47 = v92; + } while (v80 != v47); + if (v46 == v48) { + v49 = Ligne[a1].field0 / 2; + v56 = Ligne[a1].field0 / 2; + if (v49 < 0) + v56 = -v49; + if (a2 > v56) { + v57 = Ligne[a1].field0 / 2; + if (v49 < 0) + v57 = -v49; + if (a2 >= v57) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } else { + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + } + } + if (v46 < v48) + v99 = CONTOURNE(a1, a2, v99, v80, v77, a8, a9); + if (v48 < v46) + v99 = CONTOURNE1(a1, a2, v99, v80, v77, a8, a9, v92, v91); + } + if (a1 == v80) + v99 = CONTOURNE(a1, a2, v99, a1, v77, a8, a9); + do { + v64 = colision2_ligne(NVPX, NVPY, &v101, &v100, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES); + if (v64 == 1) { + v50 = v100; + if (Ligne[v50].field4 == 1) + --NVPY; + if (Ligne[v50].field4 == 2) { + --NVPY; + ++NVPX; + } + if (Ligne[v50].field4 == 3) + ++NVPX; + if (Ligne[v50].field4 == 4) { + ++NVPY; + ++NVPX; + } + if (Ligne[v50].field4 == 5) + ++NVPY; + if (Ligne[v50].field4 == 6) { + ++NVPY; + --NVPX; + } + if (Ligne[v50].field4 == 7) + --NVPX; + if (Ligne[v50].field4 == 8) { + --NVPY; + --NVPX; + } + } + } while (v64); + } else { + NVPX = -1; + NVPY = -1; + } + return v99; +} + +// Avoid 2 +int16 *LinesManager::PARCOURS2(int a1, int a2, int destX, int destY) { + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v31; + int v32; + int v33; + int v34; + int v35; + int v36; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42; + int v43; + int v44; + int v45; + int v46; + int v47; + int v48; + int v49; + int v50; + int v51; + int v52; + int v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + int v66; + int v67; + int v68; + int i; + int16 *v70; + int v71; + int v72; + int j; + int16 *v74; + int v75; + int v76; + int v77; + int v78; + int v79; + int v80; + int16 *v81; + int v82; + int v83; + int16 *v84; + int v85; + int v86; + int v87; + int v88; + int v89; + int v90; + int16 *v91; + int v92; + int v93; + int v94; + int16 *v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + int v102; + int v103; + int v104; + int v105; + int v106; + int v107; + int v108; + int v109; + int v110; + int v111; + int v112; + int v113; + int v114; + int v115; + int v116; + int v117; + int v118 = 0; + int v119 = 0; + int v120; + int v121; + int v122; + int v123; + int v124; + int v125; + int v126[10]; + int v131[10]; + int v136[10]; + int v141[10]; + + v123 = destX; + v122 = destY; + v121 = 0; + v120 = 0; + v115 = 0; + v114 = 0; + v113 = 0; + v111 = 0; + if (destY <= 24) + v122 = 25; + if (!_vm->_globals.NOT_VERIF) { + v4 = a1 - _vm->_globals.old_x1_65; + if (v4 < 0) + v4 = -v4; + if (v4 <= 4) { + v5 = a2 - _vm->_globals.old_y1_66; + if (v5 < 0) + v5 = -v5; + if (v5 <= 4) { + v6 = _vm->_globals.old_x2_67 - destX; + if (v6 < 0) + v6 = -v6; + if (v6 <= 4) { + v7 = _vm->_globals.old_y2_68 - v122; + if (v7 < 0) + v7 = -v7; + if (v7 <= 4) + return (int16 *)g_PTRNUL; + } + } + } + v8 = a1 - destX; + if (v8 < 0) + v8 = -v8; + if (v8 <= 4) { + v9 = a2 - v122; + if (v9 < 0) + v9 = -v9; + if (v9 <= 4) + return (int16 *)g_PTRNUL; + } + if (_vm->_globals.old_z_69 > 0 && _vm->_objectsManager.NUMZONE > 0 && _vm->_globals.old_z_69 == _vm->_objectsManager.NUMZONE) + return (int16 *)g_PTRNUL; + } + _vm->_globals.NOT_VERIF = 0; + _vm->_globals.old_z_69 = _vm->_objectsManager.NUMZONE; + _vm->_globals.old_x1_65 = a1; + _vm->_globals.old_x2_67 = destX; + _vm->_globals.old_y1_66 = a2; + _vm->_globals.old_y2_68 = v122; + _vm->_globals.STOP_BUG = 0; + v112 = 0; + if (destX <= 19) + v123 = 20; + if (v122 <= 19) + v122 = 20; + if (v123 > _vm->_graphicsManager.max_x - 10) + v123 = _vm->_graphicsManager.max_x - 10; + if (v122 > _vm->_globals.Max_Perso_Y) + v122 = _vm->_globals.Max_Perso_Y; + v10 = a1 - v123; + if (v10 < 0) + v10 = -v10; + if (v10 <= 3) { + v11 = a2 - v122; + if (v11 < 0) + v11 = -v11; + if (v11 <= 3) + return (int16 *)g_PTRNUL; + } + + for (v12 = 0; v12 <= 8; ++v12) { + v141[v12] = -1; + v136[v12] = 0; + v131[v12] = 1300; + v126[v12] = 1300; + ++v12; + } + + if (PARC_PERS(a1, a2, v123, v122, -1, -1, 0) != 1) { + v14 = 0; + v15 = v122; + if (_vm->_graphicsManager.max_y > v122) { + v16 = 5; + do { + v101 = v16; + v17 = colision2_ligne(v123, v15, &v136[3], &v141[3], 0, _vm->_objectsManager.DERLIGNE); + v16 = v101; + if (v17 == 1 && v141[v101] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v101] = 0; + v141[v101] = -1; + ++v14; + ++v15; + } while (_vm->_graphicsManager.max_y > v15); + } + v131[3] = v14; + v18 = 0; + v19 = v122; + if (_vm->_graphicsManager.min_y < v122) { + v20 = 1; + do { + v102 = v20; + v21 = colision2_ligne(v123, v19, &v136[1], &v141[1], 0, _vm->_objectsManager.DERLIGNE); + v20 = v102; + if (v21 == 1 && v141[v102] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v102] = 0; + v141[v102] = -1; + if (v131[3] < v18) { + if (v141[3] != -1) + break; + } + ++v18; + --v19; + } while (_vm->_graphicsManager.min_y < v19); + } + v131[1] = v18; + v22 = 0; + v23 = v123; + if (_vm->_graphicsManager.max_x > v123) { + v24 = 3; + do { + v103 = v24; + v25 = colision2_ligne(v23, v122, &v136[2], &v141[2], 0, _vm->_objectsManager.DERLIGNE); + v24 = v103; + if (v25 == 1 && v141[v103] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v103] = 0; + v141[v103] = -1; + ++v22; + if (v131[1] < v22) { + if (v141[1] != -1) + break; + } + if (v131[3] < v22 && v141[3] != -1) + break; + ++v23; + } while (_vm->_graphicsManager.max_x > v23); + } + v131[2] = v22; + v26 = 0; + v27 = v123; + if (_vm->_graphicsManager.min_x < v123) { + v28 = 7; + do { + v104 = v28; + v29 = colision2_ligne(v27, v122, &v136[4], &v141[4], 0, _vm->_objectsManager.DERLIGNE); + v28 = v104; + if (v29 == 1 && v141[v104] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v104] = 0; + v141[v104] = -1; + ++v26; + if (v131[1] < v26) { + if (v141[1] != -1) + break; + } + if (v131[3] < v26 && v141[3] != -1) + break; + if (v131[2] < v26 && v141[2] != -1) + break; + --v27; + } while (_vm->_graphicsManager.min_x < v27); + } + v131[4] = v26; + if (v141[1] < 0 || _vm->_objectsManager.DERLIGNE < v141[1]) + v141[1] = -1; + if (v141[2] < 0 || _vm->_objectsManager.DERLIGNE < v141[2]) + v141[2] = -1; + if (v141[3] < 0 || _vm->_objectsManager.DERLIGNE < v141[3]) + v141[3] = -1; + if (v141[4] < 0 || _vm->_objectsManager.DERLIGNE < v141[4]) + v141[4] = -1; + if (v141[1] < 0) + v131[1] = 1300; + if (v141[2] < 0) + v131[2] = 1300; + if (v141[3] < 0) + v131[3] = 1300; + if (v141[4] < 0) + v131[4] = 1300; + if (v141[1] == -1 && v141[2] == -1 && v141[3] == -1 && v141[4] == -1) + return (int16 *)g_PTRNUL; + v31 = 0; + if (v141[3] != -1 && v131[1] >= v131[3] && v131[2] >= v131[3] && v131[4] >= v131[3]) { + v121 = v141[3]; + v120 = v136[3]; + v31 = 1; + } + if (v141[1] != -1 && !v31 && v131[3] >= v131[1] && v131[2] >= v131[1] && v131[4] >= v131[1]) { + v121 = v141[1]; + v120 = v136[1]; + v31 = 1; + } + if (v141[2] != -1 && !v31 && v131[1] >= v131[2] && v131[3] >= v131[2] && v131[4] >= v131[2]) { + v121 = v141[2]; + v120 = v136[2]; + v31 = 1; + } + if (v141[4] != -1 && !v31 && v131[3] >= v131[4] && v131[2] >= v131[4] && v131[1] >= v131[4]) { + v121 = v141[4]; + v120 = v136[4]; + } + v32 = 0; + do { + v33 = v32; + v141[v33] = -1; + v136[v33] = 0; + v131[v33] = 1300; + v126[v33] = 1300; + ++v32; + } while (v32 <= 8); + + v34 = 0; + v35 = a2; + if (_vm->_graphicsManager.max_y > a2) { + v36 = 5; + do { + v105 = v36; + v37 = colision2_ligne(a1, v35, &v136[3], &v141[3], 0, _vm->_objectsManager.DERLIGNE); + v36 = v105; + if (v37 == 1 && v141[v105] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v105] = 0; + v141[v105] = -1; + ++v34; + ++v35; + } while (_vm->_graphicsManager.max_y > v35); + } + v131[3] = v34 + 1; + v38 = 0; + v39 = a2; + if (_vm->_graphicsManager.min_y < a2) { + v40 = 1; + do { + v106 = v40; + v41 = colision2_ligne(a1, v39, &v136[1], &v141[1], 0, _vm->_objectsManager.DERLIGNE); + v40 = v106; + if (v41 == 1 && v141[v106] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v106] = 0; + v141[v106] = -1; + ++v38; + if (v141[3] != -1) { + if (v38 > 80) + break; + } + --v39; + } while (_vm->_graphicsManager.min_y < v39); + } + v131[1] = v38 + 1; + v42 = 0; + v43 = a1; + if (_vm->_graphicsManager.max_x > a1) { + v44 = 3; + do { + v107 = v44; + v45 = colision2_ligne(v43, a2, &v136[2], &v141[2], 0, _vm->_objectsManager.DERLIGNE); + v44 = v107; + if (v45 == 1 && v141[v107] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v107] = 0; + v141[v107] = -1; + ++v42; + if (v141[3] != -1 || v141[1] != -1) { + if (v42 > 100) + break; + } + ++v43; + } while (_vm->_graphicsManager.max_x > v43); + } + v131[2] = v42 + 1; + v46 = 0; + v47 = a1; + if (_vm->_graphicsManager.min_x < a1) { + v48 = 7; + do { + v108 = v48; + v49 = colision2_ligne(v47, a2, &v136[4], &v141[4], 0, _vm->_objectsManager.DERLIGNE); + v48 = v108; + if (v49 == 1 && v141[v108] <= _vm->_objectsManager.DERLIGNE) + break; + v136[v108] = 0; + v141[v108] = -1; + ++v46; + if (v141[3] != -1 || v141[1] != -1 || v141[2] != -1) { + if (v46 > 100) + break; + } + --v47; + } while (_vm->_graphicsManager.min_x < v47); + } + v131[4] = v46 + 1; + if (v141[1] != -1) { + v50 = v141[1] - v121; + if (v50 < 0) + v50 = -v50; + v126[1] = v50; + } + if (v141[2] != -1) { + v51 = v141[2] - v121; + if (v51 < 0) + v51 = -v51; + v126[2] = v51; + } + if (v141[3] != -1) { + v52 = v141[3] - v121; + if (v52 < 0) + v52 = -v52; + v126[3] = v52; + } + if (v141[4] != -1) { + v53 = v141[4] - v121; + if (v53 < 0) + v53 = -v53; + v126[4] = v53; + } + if (v141[1] == -1 && v141[2] == -1 && v141[3] == -1 && v141[4] == -1) + error("ERREUR POINT PLUS PROCHE Du perso NON TROUVE"); + v54 = 0; + if (v141[1] != -1 && v126[2] >= v126[1] && v126[3] >= v126[1] && v126[4] >= v126[1]) { + v54 = 1; + v115 = v141[1]; + v111 = v131[1]; + v113 = 1; + v114 = v136[1]; + } + if (!v54) { + if (v141[3] != -1 && v126[2] >= v126[3] && v126[1] >= v126[3] && v126[4] >= v126[3]) { + v54 = 1; + v115 = v141[3]; + v111 = v131[3]; + v113 = 5; + v114 = v136[3]; + } + if (!v54) { + if (v141[2] != -1 && v126[1] >= v126[2] && v126[3] >= v126[2] && v126[4] >= v126[2]) { + v54 = 1; + v115 = v141[2]; + v111 = v131[2]; + v113 = 3; + v114 = v136[2]; + } + if (!v54 && v141[4] != -1 && v126[1] >= v126[4] && v126[3] >= v126[4] && v126[2] >= v126[4]) { + v115 = v141[4]; + v111 = v131[4]; + v113 = 7; + v114 = v136[4]; + } + } + } + v55 = PARC_PERS(a1, a2, v123, v122, v115, v121, 0); + if (v55 != 1) { + if (v55 == 2) { +LABEL_201: + v115 = NV_LIGNEDEP; + v114 = NV_LIGNEOFS; + v112 = NV_POSI; + } else { + if (v113 == 1) { + v56 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1, a2 - v56, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v58 = GENIAL(v124, v125, a1, a2 - v56, a1, a2 - v111, v112, &_vm->_globals.super_parcours[0], 4); + if (v58 == -1) + goto LABEL_282; + v112 = v58; + if (NVPY != -1) + v56 = a2 - NVPY; + } + v59 = v112; + _vm->_globals.super_parcours[v59] = a1; + _vm->_globals.super_parcours[v59 + 1] = a2 - v56; + _vm->_globals.super_parcours[v59 + 2] = 1; + _vm->_globals.super_parcours[v59 + 3] = 0; + v112 += 4; + ++v56; + } while (v111 > v56); + } + } + if (v113 == 5) { + v60 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1, v60 + a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v61 = GENIAL(v124, v125, a1, v60 + a2, a1, v111 + a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v61 == -1) + goto LABEL_282; + v112 = v61; + if (NVPY != -1) + v60 = NVPY - a2; + } + v62 = v112; + _vm->_globals.super_parcours[v62] = a1; + _vm->_globals.super_parcours[v62 + 1] = v60 + a2; + _vm->_globals.super_parcours[v62 + 2] = 5; + _vm->_globals.super_parcours[v62 + 3] = 0; + v112 += 4; + ++v60; + } while (v111 > v60); + } + } + if (v113 == 7) { + v63 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(a1 - v63, a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v64 = GENIAL(v124, v125, a1 - v63, a2, a1 - v111, a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v64 == -1) + goto LABEL_282; + v112 = v64; + if (NVPX != -1) + v63 = a1 - NVPX; + } + v65 = v112; + _vm->_globals.super_parcours[v65] = a1 - v63; + _vm->_globals.super_parcours[v65 + 1] = a2; + _vm->_globals.super_parcours[v65 + 2] = 7; + _vm->_globals.super_parcours[v65 + 3] = 0; + v112 += 4; + ++v63; + } while (v111 > v63); + } + } + if (v113 == 3) { + v66 = 0; + if (v111 > 0) { + do { + if ((uint16)colision2_ligne(v66 + a1, a2, &v125, &v124, _vm->_objectsManager.DERLIGNE + 1, TOTAL_LIGNES) == 1 + && _vm->_objectsManager.DERLIGNE < v124) { + v57 = v112; + v67 = GENIAL(v124, v125, v66 + a1, a2, v111 + a1, a2, v112, &_vm->_globals.super_parcours[0], 4); + if (v67 == -1) + goto LABEL_282; + v112 = v67; + if (NVPX != -1) + v66 = NVPX - a1; + } + v68 = v112; + _vm->_globals.super_parcours[v68] = v66 + a1; + _vm->_globals.super_parcours[v68 + 1] = a2; + _vm->_globals.super_parcours[v68 + 2] = 3; + _vm->_globals.super_parcours[v68 + 3] = 0; + v112 += 4; + ++v66; + } while (v111 > v66); + } + } + } +LABEL_234: + if (v115 < v121) { + for (i = v114; Ligne[v115].field0 > i; ++i) { + v70 = Ligne[v115].lineData; + v119 = v70[2 * i]; + v118 = v70[2 * i + 1]; + v71 = v112; + _vm->_globals.super_parcours[v71] = v119; + _vm->_globals.super_parcours[v71 + 1] = v118; + _vm->_globals.super_parcours[v71 + 2] = Ligne[v115].field6; + _vm->_globals.super_parcours[v71 + 3] = 0; + v112 += 4; + } + v116 = v115 + 1; + if ((v115 + 1) < v121) { + do { + v72 = 0; + v110 = v116; + for (j = v116; Ligne[j].field0 > v72; j = v116) { + v74 = Ligne[v110].lineData; + v119 = v74[2 * v72]; + v118 = v74[2 * v72 + 1]; + v75 = v112; + _vm->_globals.super_parcours[v75] = v119; + _vm->_globals.super_parcours[v75 + 1] = v118; + _vm->_globals.super_parcours[v75 + 2] = Ligne[v110].field6; + _vm->_globals.super_parcours[v75 + 3] = 0; + v112 += 4; + v76 = Ligne[v110].field0; + if (v76 > 30) { + v77 = v76 / 2; + if (v77 < 0) + v77 = -v77; + if (v72 == v77) { + v78 = PARC_PERS(v119, v118, v123, v122, v110, v121, v112); + if (v78 == 1) + return &_vm->_globals.super_parcours[0]; + if (v78 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v110, v121, v112) == 1) + goto LABEL_201; + } + } + ++v72; + v110 = v116; + } + v79 = PARC_PERS(v119, v118, v123, v122, v116, v121, v112); + if (v79 == 1) + return &_vm->_globals.super_parcours[0]; + if (v79 == 2) { +LABEL_200: + v115 = NV_LIGNEDEP; + v114 = NV_LIGNEOFS; + v112 = NV_POSI; + goto LABEL_234; + } + if (MIRACLE(v119, v118, v116, v121, v112) == 1) + goto LABEL_201; + ++v116; + } while (v116 < v121); + } + v114 = 0; + v115 = v121; + } + if (v115 > v121) { + v80 = v114; + if (v114 > 0) { + v98 = v115; + do { + v81 = Ligne[v98].lineData; + v119 = v81[2 * v80]; + v118 = v81[2 * v80 + 1]; + + v82 = v112; + _vm->_globals.super_parcours[v82] = v119; + _vm->_globals.super_parcours[v82 + 1] = v118; + _vm->_globals.super_parcours[v82 + 2] = Ligne[v98].field8; + _vm->_globals.super_parcours[v82 + 3] = 0; + v112 += 4; + --v80; + } while (v80 > 0); + } + v117 = v115 - 1; + if ((v115 - 1) > v121) { + do { + v83 = Ligne[v117].field0 - 1; + if (v83 > -1) { + v109 = v117; + do { + v84 = Ligne[v109].lineData; + v119 = v84[2 * v83]; + v118 = v84[2 * v83 + 1]; + v85 = v112; + _vm->_globals.super_parcours[v85] = v119; + _vm->_globals.super_parcours[v85 + 1] = v118; + _vm->_globals.super_parcours[v85 + 2] = Ligne[v109].field8; + _vm->_globals.super_parcours[v85 + 3] = 0; + v112 += 4; + v86 = Ligne[v109].field0; + if (v86 > 30) { + v87 = v86 / 2; + if (v87 < 0) + v87 = -v87; + if (v83 == v87) { + v88 = PARC_PERS(v119, v118, v123, v122, v117, v121, v112); + if (v88 == 1) + return &_vm->_globals.super_parcours[0]; + if (v88 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v117, v121, v112) == 1) + goto LABEL_201; + } + } + --v83; + } while (v83 > -1); + } + v89 = PARC_PERS(v119, v118, v123, v122, v117, v121, v112); + if (v89 == 1) + return &_vm->_globals.super_parcours[0]; + if (v89 == 2) + goto LABEL_200; + if (MIRACLE(v119, v118, v117, v121, v112) == 1) + goto LABEL_201; + --v117; + } while (v117 > v121); + } + v114 = Ligne[v121].field0 - 1; + v115 = v121; + } + if (v115 == v121) { + if (v114 <= v120) { + if (v114 < v120) { + v94 = v114; + v100 = v121; + do { + v95 = Ligne[v100].lineData; + v96 = v95[2 * v94 + 1]; + v97 = v112; + _vm->_globals.super_parcours[v97] = v95[2 * v94]; + _vm->_globals.super_parcours[v97 + 1] = v96; + _vm->_globals.super_parcours[v97 + 2] = Ligne[v100].field6; + _vm->_globals.super_parcours[v97 + 3] = 0; + v112 += 4; + ++v94; + } while (v120 > v94); + } + } else { + v90 = v114; + v99 = v121; + do { + v91 = Ligne[v99].lineData; + v92 = v91[2 * v90 + 1]; + v93 = v112; + _vm->_globals.super_parcours[v93] = v91[2 * v90]; + _vm->_globals.super_parcours[v93 + 1] = v92; + _vm->_globals.super_parcours[v93 + 2] = Ligne[v99].field8; + _vm->_globals.super_parcours[v93 + 3] = 0; + v112 += 4; + --v90; + } while (v120 < v90); + } + } + v57 = v112; + if (PARC_PERS( + _vm->_globals.super_parcours[v112 - 4], + _vm->_globals.super_parcours[v112 - 3], + v123, + v122, + -1, + -1, + v112) != 1) { +LABEL_282: + _vm->_globals.super_parcours[v57] = -1; + _vm->_globals.super_parcours[v57 + 1] = -1; + _vm->_globals.super_parcours[v57 + 2] = -1; + _vm->_globals.super_parcours[v57 + 3] = -1; + } + return &_vm->_globals.super_parcours[0]; + } + } + return &_vm->_globals.super_parcours[0]; +} + +int LinesManager::PARC_PERS(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int16 *v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int16 *v26; + int v27; + int16 *v28; + int16 *v29; + int v30; + int v31; + int16 *v32; + int v33; + int v34; + int16 *v35; + int v36; + int v37; + int16 *v38; + int v39; + int v40; + int v41; + int16 *v42; + int v43; + int v44; + int v45; + int v46; + int16 *v47; + int v48; + int16 *v49; + int16 *v50; + int v51; + int v52; + int16 *v53; + int v54; + int v55; + int v56; + int16 *v57; + int v58; + int v59; + int16 *v60; + int v61; + int v62; + int v63; + int16 *v64; + int v65; + int v66; + int v67; + int v68; + int16 *v69; + int v70; + int16 *v71; + int16 *v72; + int v73; + int v74; + int v76; + int16 *v77; + int16 *v78; + int v79; + int16 *v80; + int v81; + int16 *v82; + int v83; + int16 *v84; + int v85; + int16 *v86; + int v87; + int16 *v88; + int v89; + int v90; + int v91; + int v92; + int v93; + int v94; + int v95; + int v96; + int v97; + int v98; + int v99; + int v100; + int v101; + int v102; + int v103; + int v104; + int v105; + int v106; + int v107; + int v108; + int v109; + int v110; + int v111; + int v112; + int v113; + int v114; + int v115; + int v116; + int v117; + int v118; + int v119; + int v120; + int v121; + int v122; + int v123; + int v124; + int v125; + int v126 = 0; + int v127; + int v128; + int v129; + int v130; + int v131; + int v132; + int v133; + int v134; + int v135; + int v136; + int v137; + int v138; + int v139; + int v140; + int v141; + int v142; + int v143; + int v144; + int v145; + int colResult = 0; + + v7 = a1; + v90 = a2; + v137 = a7; + v136 = 0; + if (a5 == -1 && a6 == -1) + v136 = 1; + v144 = a5; + if (colision2_ligne(a1, a2, &v145, &v144, 0, TOTAL_LIGNES) == 1) { + v8 = Ligne[v144].field4; + if (v8 == 1) + v90 = a2 - 2; + if (v8 == 2) { + v90 -= 2; + v7 = a1 + 2; + } + if (v8 == 3) + v7 += 2; + if (v8 == 4) { + v90 += 2; + v7 += 2; + } + if (v8 == 5) + v90 += 2; + if (v8 == 6) { + v90 += 2; + v7 -= 2; + } + if (v8 == 7) + v7 -= 2; + if (v8 == 8) { + v90 -= 2; + v7 -= 2; + } + } + v98 = v7; + v97 = v90; + v115 = 0; + v142 = -1; + v140 = -1; + v138 = -1; + + for (;;) { + v111 = v7; + v109 = v90; + if (a3 >= v7 - 2 && a3 <= v7 + 2 && a4 >= v90 - 2 && a4 <= v90 + 2) { +LABEL_149: + v27 = v115; + v28 = _vm->_globals.essai0; + v28[v27] = -1; + v28[v27 + 1] = -1; + v28[v27 + 2] = -1; + +LABEL_150: + if (v115) { + v127 = 0; + v116 = 0; + v29 = _vm->_globals.essai0; + do { + v30 = v137; + _vm->_globals.super_parcours[v30] = v29[v116]; + _vm->_globals.super_parcours[v30 + 1] = v29[v116 + 1]; + _vm->_globals.super_parcours[v30 + 2] = v29[v116 + 2]; + _vm->_globals.super_parcours[v30 + 3] = 0; + v116 += 3; + v137 += 4; + + if (v29[v116] == -1) { + if (v29[v116 + 1] == -1) + v127 = 1; + } + } while (v127 != 1); + } + goto LABEL_248; + } + v9 = v7 - a3; + if (v7 - a3 < 0) + v9 = -v9; + v10 = v9 + 1; + v11 = v90 - a4; + if (v90 - a4 < 0) + v11 = -v11; + v107 = v11 + 1; + if (v10 > (int16)(v11 + 1)) + v107 = v10; + v12 = v107 - 1; + v101 = 1000 * v10 / v12; + v99 = 1000 * (int16)(v11 + 1) / v12; + if (a3 < v7) + v101 = -v101; + if (a4 < v90) + v99 = -v99; + v13 = (int16)v101 / 1000; + v94 = (int16)v99 / 1000; + v91 = -1; + if ((int16)v99 / 1000 == -1 && (unsigned int)v101 <= 0x96) + v91 = 1; + if (v13 == 1) { + if ((unsigned int)(v99 + 1) <= 0x97) + v91 = 3; + if ((unsigned int)v99 <= 0x96) + v91 = 3; + } + if (v94 == 1) { + if ((unsigned int)v101 <= 0x96) + v91 = 5; + if ((unsigned int)(v101 + 150) <= 0x96) + v91 = 5; + } + if (v13 == -1) { + if ((unsigned int)v99 <= 0x96) + v91 = 7; + if ((unsigned int)(v99 + 150) <= 0x96) + v91 = 7; + } + if (v94 == -1 && (unsigned int)(v101 + 150) <= 0x96) + v91 = 1; + if (v91 == -1 && !VERIF_SMOOTH(v7, v109, a3, a4) && SMOOTH_MOVE(v7, v109, a3, a4) != -1) + break; +LABEL_72: + v19 = v111 - a3; + if (v111 - a3 < 0) + v19 = -v19; + v20 = v19 + 1; + v95 = v109 - a4; + if (v95 < 0) + v95 = -(v109 - a4); + v108 = v95 + 1; + if (v20 > (int16)(v95 + 1)) + v108 = v20; + if (v108 <= 10) + goto LABEL_149; + v21 = v108 - 1; + v102 = 1000 * v20 / v21; + v100 = 1000 * (int16)(v95 + 1) / v21; + if (a3 < v111) + v102 = -v102; + if (a4 < v109) + v100 = -v100; + v22 = (int16)v102 / 1000; + v96 = (int16)v100 / 1000; + v106 = 1000 * v111; + v105 = 1000 * v109; + v104 = 1000 * v111 / 1000; + v103 = v105 / 1000; + if (!((int16)v102 / 1000) && v96 == -1) + v91 = 1; + if (v22 == 1) { + if (v96 == -1) + v91 = 2; + if (!v96) + v91 = 3; + if (v96 == 1) + v91 = 4; + } + if (!v22 && v96 == 1) + v91 = 5; + if (v22 != -1) + goto LABEL_103; + if (v96 == 1) + v91 = 6; + if (!v96) + v91 = 7; + if (v96 == -1) { + v91 = 8; +LABEL_103: + if (v96 == -1) { + if ((unsigned int)v102 <= 0x1FE) + v91 = 1; + if ((unsigned int)(v102 - 510) <= 0x1EA) + v91 = 2; + } + } + if (v22 == 1) { + if ((unsigned int)(v100 + 1) <= 0x1FF) + v91 = 2; + if ((unsigned int)(v100 + 510) <= 0x1FE) + v91 = 3; + if ((unsigned int)v100 <= 0x1FE) + v91 = 3; + if ((unsigned int)(v100 - 510) <= 0x1EA) + v91 = 4; + } + if (v96 == 1) { + if ((unsigned int)(v102 - 510) <= 0x1EA) + v91 = 4; + if ((unsigned int)v102 <= 0x1FE) + v91 = 5; + if (v102 >= -1 && v102 <= -510) + v91 = 6; + if ((unsigned int)(v102 + 510) <= 0x1FE) + v91 = 5; + } + if (v22 == -1) { + if ((unsigned int)(v100 - 510) <= 0x1EA) + v91 = 6; + if ((unsigned int)v100 <= 0x1FE) + v91 = 7; + if ((unsigned int)(v100 + 1000) <= 0x1EA) + v91 = 8; + if ((unsigned int)(v100 + 510) <= 0x1FE) + v91 = 7; + } + if (v96 == -1) { + if ((unsigned int)(v102 + 1000) <= 0x1EA) + v91 = 8; + if ((unsigned int)(v102 + 510) <= 0x1FE) + v91 = 1; + } + v23 = 0; + if (v108 + 1 <= 0) + goto LABEL_149; + while (colision2_ligne(v104, v103, &v143, &v142, 0, TOTAL_LIGNES) != 1) { + v25 = v115; + v26 = _vm->_globals.essai0; + v26[v25] = v104; + v26[v25 + 1] = v103; + v26[v25 + 2] = v91; + v106 += v102; + v105 += v100; + v104 = v106 / 1000; + v103 = v105 / 1000; + v115 += 3; + ++v23; + if (v23 >= v108 + 1) + goto LABEL_149; + } + if (_vm->_objectsManager.DERLIGNE >= v142) + goto LABEL_157; + v24 = GENIAL(v142, v143, v104, v103, a3, a4, v115, _vm->_globals.essai0, 3); + if (v24 == -1) + goto LABEL_150; + v115 = v24; + if (NVPX != -1 || NVPY != -1) { +LABEL_67: + v142 = -1; + goto LABEL_157; + } + v7 = -1; + v90 = -1; + } + v91 = SMOOTH_SENS; + v14 = 0; + while (1) { + v15 = SMOOTH[v14].field0; + v112 = v15; + v110 = SMOOTH[v14].field2; + if (v15 == -1 || SMOOTH[v14].field2 == -1) { + v126 = 1; + goto LABEL_70; + } + if (colision2_ligne(v15, v110, &v143, &v142, 0, TOTAL_LIGNES) == 1) + break; + v16 = v115; + + v17 = _vm->_globals.essai0; + v17[v16] = v112; + v17[v16 + 1] = v110; + v17[v16 + 2] = v91; + v115 += 3; + ++v14; +LABEL_70: + if (v126 == 1) { + v18 = v14 - 1; + v111 = SMOOTH[v18].field0; + v109 = SMOOTH[v18].field2; + goto LABEL_72; + } + } + if (v142 > _vm->_objectsManager.DERLIGNE) + goto LABEL_67; +LABEL_157: + v31 = v115; + v32 = _vm->_globals.essai0; + v32[v31] = -1; + v32[v31 + 1] = -1; + v32[v31 + 2] = -1; + + v117 = 0; + v33 = v98; + v92 = v97; +LABEL_158: + v113 = v33; + if (a3 >= v33 - 2 && a3 <= v33 + 2 && a4 >= v92 - 2 && a4 <= v92 + 2) + goto LABEL_194; + if (v33 >= a3) { +LABEL_165: + if (v113 > a3) { + v36 = v113; + while (colision2_ligne(v36, v92, &v141, &v140, 0, TOTAL_LIGNES) != 1) { + v37 = v117; + v38 = _vm->_globals.essai1; + v38[v37] = v36; + v38[v37 + 1] = v92; + v38[v37 + 2] = 7; + v117 += 3; + --v36; + if (a3 >= v36) + goto LABEL_171; + } + goto LABEL_168; + } +LABEL_171: + if (v92 >= a4) { +LABEL_181: + if (v92 > a4) { + v43 = v92; + do { + if (colision2_ligne(a3, v43, &v141, &v140, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v140) { + v44 = GENIAL(v140, v141, a3, v43, a3, a4, v117, _vm->_globals.essai1, 3); + if (v44 == -1) + goto LABEL_195; + v117 = v44; + if (NVPX != -1) { + if (NVPY != -1) { + v33 = NVPX; + v92 = NVPY; + v45 = colision2_ligne(NVPX, NVPY, &v141, &v140, 0, _vm->_objectsManager.DERLIGNE); + goto LABEL_189; + } + } + } + if (v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + } + v46 = v117; + v47 = _vm->_globals.essai1; + v47[v46] = a3; + v47[v46 + 1] = v43; + v47[v46 + 2] = 1; + v117 += 3; + --v43; + } while (a4 < v43); + } +LABEL_194: + v48 = v117; + v49 = _vm->_globals.essai1; + v49[v48] = -1; + v49[v48 + 1] = -1; + v49[v48 + 2] = -1; +LABEL_195: + if (v117) { + v128 = 0; + v118 = 0; + v50 = _vm->_globals.essai1; + do { + v51 = v137; + _vm->_globals.super_parcours[v51] = v50[v118]; + _vm->_globals.super_parcours[v51 + 1] = v50[v118 + 1]; + _vm->_globals.super_parcours[v51 + 2] = v50[v118 + 2]; + _vm->_globals.super_parcours[v51 + 3] = 0; + v118 += 3; + v137 += 4; + if (v50[v118] == -1 && v50[v118 + 1] == -1) + v128 = 1; + } while (v128 != 1); + } + goto LABEL_248; + } + v39 = v92; + while (1) { + if (colision2_ligne(a3, v39, &v141, &v140, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v140) { + v40 = GENIAL(v140, v141, a3, v39, a3, a4, v117, _vm->_globals.essai1, 3); + if (v40 == -1) + goto LABEL_195; + v117 = v40; + if (NVPX != -1) { + if (NVPY != -1) { + v33 = NVPX; + v92 = NVPY; + v45 = colision2_ligne(NVPX, NVPY, &v141, &v140, 0, _vm->_objectsManager.DERLIGNE); +LABEL_189: + if (v45 == 1 && v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + goto LABEL_158; + } + } + } + if (v140 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_202; + } + v41 = v117; + + v42 = _vm->_globals.essai1; + v42[v41] = a3; + v42[v41 + 1] = v39; + v42[v41 + 2] = 5; + v117 += 3; + ++v39; + if (a4 <= v39) + goto LABEL_181; + } + } + while (colision2_ligne(v33, v92, &v141, &v140, 0, TOTAL_LIGNES) != 1) { + v34 = v117; + v35 = _vm->_globals.essai1; + v35[v34] = v33; + v35[v34 + 1] = v92; + v35[v34 + 2] = 3; + v117 += 3; + ++v33; + if (a3 <= v33) + goto LABEL_165; + } +LABEL_168: + if (v140 > _vm->_objectsManager.DERLIGNE) + v140 = -1; +LABEL_202: + v52 = v117; + v53 = _vm->_globals.essai1; + v53[v52] = -1; + v53[v52 + 1] = -1; + v53[v52 + 2] = -1; + v117 = 0; + v54 = v98; + v93 = v97; +LABEL_203: + v114 = v54; + if (a3 >= v54 - 2 && a3 <= v54 + 2 && a4 >= v93 - 2 && a4 <= v93 + 2) + goto LABEL_241; + if (v93 < a4) { + v55 = v93; + while (colision2_ligne(v114, v55, &v139, &v138, 0, TOTAL_LIGNES) != 1) { + v56 = v117; + v57 = _vm->_globals.essai2; + v57[v56] = v114; + v57[v56 + 1] = v55; + v57[v56 + 2] = 5; + v117 += 3; + ++v55; + if (a4 <= v55) + goto LABEL_211; + } + goto LABEL_214; + } +LABEL_211: + if (v93 > a4) { + v58 = v93; + while (colision2_ligne(v114, v58, &v139, &v138, 0, TOTAL_LIGNES) != 1) { + v59 = v117; + v60 = _vm->_globals.essai2; + v60[v59] = v114; + v60[v59 + 1] = v58; + v60[v59 + 2] = 1; + v117 += 3; + --v58; + if (a4 >= v58) + goto LABEL_217; + } +LABEL_214: + if (v138 > _vm->_objectsManager.DERLIGNE) + v138 = -1; +LABEL_249: + v76 = v117; + v77 = _vm->_globals.essai2; + v77[v76] = -1; + v77[v76 + 1] = -1; + v77[v76 + 2] = -1; + + if (v136 != 1) { + if (a6 > v144) { + if (_vm->_globals.essai0[0] != -1 && v142 > v144 && v140 <= v142 && v138 <= v142 && a6 >= v142) { + NV_LIGNEDEP = v142; + NV_LIGNEOFS = v143; + v130 = 0; + v120 = 0; + v78 = _vm->_globals.essai0; + do { + v79 = v137; + _vm->_globals.super_parcours[v79] = v78[v120]; + _vm->_globals.super_parcours[v79 + 1] = v78[v120 + 1]; + _vm->_globals.super_parcours[v79 + 2] = v78[v120 + 2]; + _vm->_globals.super_parcours[v79 + 3] = 0; + v120 += 3; + v137 += 4; + if (v78[v120] == -1 && v78[v120 + 1] == -1) + v130 = 1; + } while (v130 != 1); +LABEL_323: + NV_POSI = v137; + return 2; + } + v80 = _vm->_globals.essai1; + if (_vm->_globals.essai1[0] != -1 && v144 < v140 && v138 <= v140 && v142 <= v140 && a6 >= v140) { + NV_LIGNEDEP = v140; + NV_LIGNEOFS = v141; + v131 = 0; + v121 = 0; + do { + assert(137 <= 32000); + v81 = v137; + _vm->_globals.super_parcours[v81] = v80[v121]; + _vm->_globals.super_parcours[v81 + 1] = v80[v121 + 1]; + _vm->_globals.super_parcours[v81 + 2] = v80[v121 + 2]; + _vm->_globals.super_parcours[v81 + 3] = 0; + v121 += 3; + v137 += 4; + if (v80[v121] == -1 && v80[v121 + 1] == -1) + v131 = 1; + } while (v131 != 1); +LABEL_301: + NV_POSI = v137; + return 2; + } + v82 = _vm->_globals.essai2; + if (_vm->_globals.essai2[0] != -1) { + if (v144 < v138 && v140 < v138 && v142 < v138 && a6 >= v138) { + NV_LIGNEDEP = v138; + NV_LIGNEOFS = v139; + v132 = 0; + v122 = 0; + do { + assert(v137 <= 32000); + v83 = v137; + _vm->_globals.super_parcours[v83] = v82[v122]; + _vm->_globals.super_parcours[v83 + 1] = v82[v122 + 1]; + _vm->_globals.super_parcours[v83 + 2] = v82[v122 + 2]; + _vm->_globals.super_parcours[v83 + 3] = 0; + v122 += 3; + v137 += 4; + if (v82[v122] == -1 && v82[v122 + 1] == -1) + v132 = 1; + } while (v132 != 1); +LABEL_312: + NV_POSI = v137; + return 2; + } + } + } + if (a6 < v144) { + if (v142 == -1) + v142 = 1300; + if (v140 == -1) + v142 = 1300; + if (v138 == -1) + v142 = 1300; + if (_vm->_globals.essai1[0] != -1 && v140 < v144 && v138 >= v140 && v142 >= v140 && a6 <= v140) { + NV_LIGNEDEP = v140; + NV_LIGNEOFS = v141; + v133 = 0; + v123 = 0; + v84 = _vm->_globals.essai1; + do { + assert(137 <= 32000); + v85 = v137; + _vm->_globals.super_parcours[v85] = v84[v123]; + _vm->_globals.super_parcours[v85 + 1] = v84[v123 + 1]; + _vm->_globals.super_parcours[v85 + 2] = v84[v123 + 2]; + _vm->_globals.super_parcours[v85 + 3] = 0; + v123 += 3; + v137 += 4; + if (v84[v123] == -1 && v84[v123 + 1] == -1) + v133 = 1; + } while (v133 != 1); + goto LABEL_301; + } + v86 = _vm->_globals.essai2; + if (_vm->_globals.essai2[0] != -1 && v144 > v138 && v140 >= v138 && v142 >= v138 && a6 <= v138) { + NV_LIGNEDEP = v138; + NV_LIGNEOFS = v139; + v134 = 0; + v124 = 0; + do { + assert(137 <= 32000); + v87 = v137; + _vm->_globals.super_parcours[v87] = v86[v124]; + _vm->_globals.super_parcours[v87 + 1] = v86[v124 + 1]; + _vm->_globals.super_parcours[v87 + 2] = v86[v124 + 2]; + _vm->_globals.super_parcours[v87 + 3] = 0; + v124 += 3; + v137 += 4; + if (v86[v124] == -1 && v86[v124 + 1] == -1) + v134 = 1; + } while (v134 != 1); + goto LABEL_312; + } + if (_vm->_globals.essai1[0] != -1 && v144 > v142 && v140 >= v142 && v138 >= v142 && a6 <= v142) { + NV_LIGNEDEP = v142; + NV_LIGNEOFS = v143; + v135 = 0; + v125 = 0; + v88 = _vm->_globals.essai0; + do { + assert(137 <= 32000); + v89 = v137; + _vm->_globals.super_parcours[v89] = v88[v125]; + _vm->_globals.super_parcours[v89 + 1] = v88[v125 + 1]; + _vm->_globals.super_parcours[v89 + 2] = v88[v125 + 2]; + _vm->_globals.super_parcours[v89 + 3] = 0; + v125 += 3; + v137 += 4; + if (v88[v125] == -1 && v88[v125 + 1] == -1) + v135 = 1; + } while (v135 != 1); + goto LABEL_323; + } + } + } + return 0; + } +LABEL_217: + if (v114 < a3) { + v61 = v114; + do { + if (colision2_ligne(v61, a4, &v139, &v138, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v138) { + v62 = GENIAL(v138, v139, v61, a4, a3, a4, v117, _vm->_globals.essai2, 3); + if (v62 == -1) + goto LABEL_195; + v117 = v62; + if (NVPX != -1) { + if (NVPY != -1) { + v54 = NVPX; + v93 = NVPY; + colResult = colision2_ligne(NVPX, NVPY, &v139, &v138, 0, _vm->_objectsManager.DERLIGNE); +LABEL_235: + if (colResult == 1 && v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + goto LABEL_203; + } + } + } + if (v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + } + v63 = v117; + + v64 = _vm->_globals.essai2; + v64[v63] = v61; + v64[v63 + 1] = a4; + v64[v63 + 2] = 3; + v117 += 3; + ++v61; + } while (a3 > v61); + } + if (v114 > a3) { + v65 = v114; + do { + if (colision2_ligne(v65, a4, &v139, &v138, 0, TOTAL_LIGNES) == 1) { + if (_vm->_objectsManager.DERLIGNE < v138) { + v66 = GENIAL(v138, v139, v65, a4, a3, a4, v117, _vm->_globals.essai2, 3); + if (v66 == -1) + goto LABEL_242; + v117 = v66; + if (NVPX != -1) { + if (NVPY != -1) { + v54 = NVPX; + v93 = NVPY; + v67 = colision2_ligne(NVPX, NVPY, &v139, &v138, 0, _vm->_objectsManager.DERLIGNE); + goto LABEL_235; + } + } + } + if (v138 <= _vm->_objectsManager.DERLIGNE) + goto LABEL_249; + } + v68 = v117; + v69 = _vm->_globals.essai2; + v69[v68] = v65; + v69[v68 + 1] = a4; + v69[v68 + 2] = 7; + v117 += 3; + --v65; + } while (a3 < v65); + } + v138 = -1; +LABEL_241: + v70 = v117; + v71 = _vm->_globals.essai2; + v71[v70] = -1; + v71[v70 + 1] = -1; + v71[v70 + 2] = -1; +LABEL_242: + if (v117) { + v129 = 0; + v119 = 0; + v72 = _vm->_globals.essai2; + do { + v73 = v137; + _vm->_globals.super_parcours[v73] = v72[v119]; + _vm->_globals.super_parcours[v73 + 1] = v72[v119 + 1]; + _vm->_globals.super_parcours[v73 + 2] = v72[v119 + 2]; + _vm->_globals.super_parcours[v73 + 3] = 0; + v119 += 3; + v137 += 4; + if (v72[v119] == -1 && v72[v119 + 1] == -1) + v129 = 1; + } while (v129 != 1); + } +LABEL_248: + v74 = v137; + _vm->_globals.super_parcours[v74] = -1; + _vm->_globals.super_parcours[v74 + 1] = -1; + _vm->_globals.super_parcours[v74 + 2] = -1; + _vm->_globals.super_parcours[v74 + 3] = -1; + return 1; +} + +int LinesManager::VERIF_SMOOTH(int a1, int a2, int a3, int a4) { + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + + v4 = a1 - a3; + if (a1 - a3 < 0) + v4 = -v4; + v5 = v4 + 1; + v11 = a2 - a4; + if (a2 - a4 < 0) + v11 = -(a2 - a4); + v13 = v11 + 1; + if (v5 > (int)(v11 + 1)) + v13 = v5; + if (v13 <= 10) + return -1; + v6 = v13 - 1; + v16 = 1000 * v5 / v6; + v15 = 1000 * (int)(v11 + 1) / v6; + if (a3 < a1) + v16 = -v16; + if (a4 < a2) + v15 = -v15; + v7 = 1000 * a1; + v8 = 1000 * a2; + v9 = 1000 * a1 / 1000; + v12 = 1000 * a2 / 1000; + v14 = 0; + if (v13 + 1 > 0) { + while (colision2_ligne(v9, v12, &v18, &v17, 0, TOTAL_LIGNES) != 1 || v17 > _vm->_objectsManager.DERLIGNE) { + v7 += v16; + v8 += v15; + v9 = v7 / 1000; + v12 = v8 / 1000; + ++v14; + if (v14 >= v13 + 1) + return 0; + } + return -1; + } + return 0; +} + +int LinesManager::SMOOTH_MOVE(int a3, int a4, int a5, int a6) { + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42; + int v43; + int v44; + int v45; + int v46; + int v47; + int v48; + int v49 = 0; + int v50; + int v51; + int v52; + int v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v61; + int v62; + int v63; + + v62 = a3; + v63 = a4; + if (a3 >= a5 || a6 >= a4) { + if (a3 <= a5 || a6 >= a4) { + if (a3 >= a5 || a6 <= a4) { + if (a3 > a5 && a6 > a4) { + v53 = 36; + v61 = 0; + v57 = 0; + do { + v25 = _vm->_globals.Hopkins[v53].field0; + v40 = _vm->_globals.Hopkins[v53].field2; + v26 = _vm->_globals.STAILLE[v63]; + if (v26 < 0) { + v27 = v26; + v28 = v26; + if (v26 < 0) + v28 = -v26; + v48 = _vm->_globals.STAILLE[v63]; + v45 = v63; + v25 = _vm->_graphicsManager.Reel_Reduc(v25, v28); + v29 = v27; + if ((v27 & 0x80000000u) != 0) + v29 = -v27; + v40 = _vm->_graphicsManager.Reel_Reduc(v40, v29); + v63 = v45; + v26 = v48; + } + if (v26 > 0) { + v30 = v26; + v31 = v26; + if (v26 < 0) + v31 = -v26; + v46 = v63; + v25 = _vm->_graphicsManager.Reel_Zoom(v25, v31); + v32 = v30; + if ((v30 & 0x80000000u) != 0) + v32 = -v30; + v40 = _vm->_graphicsManager.Reel_Zoom(v40, v32); + v63 = v46; + } + v33 = v63 + v40; + v34 = 0; + if (v25 > 0) { + do { + --v62; + SMOOTH[v61].field0 = v62; + if (v63 != v33) + v63 = v63 + 1; + SMOOTH[v61++].field2 = v63; + ++v34; + } while (v34 < v25); + } + ++v53; + if (v53 == 48) + v53 = 36; + ++v57; + if (v62 <= a5 || a6 <= v63) + v49 = 1; + } while (v49 != 1); + if (v57 > 5) { + v35 = v61; + SMOOTH[v35].field0 = -1; + SMOOTH[v35].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 6; + goto LABEL_85; + } + } + } else { + v52 = 36; + v60 = 0; + v56 = 0; + do { + v14 = _vm->_globals.Hopkins[v52].field0; + v39 = _vm->_globals.Hopkins[v52].field2; + v15 = _vm->_globals.STAILLE[v63]; + if (v15 < 0) { + v16 = v15; + v17 = v15; + if (v15 < 0) + v17 = -v15; + v47 = _vm->_globals.STAILLE[v63]; + v43 = v63; + v14 = _vm->_graphicsManager.Reel_Reduc(v14, v17); + v18 = v16; + if ((v16 & 0x80000000u) != 0) + v18 = -v16; + v39 = _vm->_graphicsManager.Reel_Reduc(v39, v18); + v63 = v43; + v15 = v47; + } + if (v15 > 0) { + v19 = v15; + v20 = v15; + if (v15 < 0) + v20 = -v15; + v44 = v63; + v14 = _vm->_graphicsManager.Reel_Zoom(v14, v20); + v21 = v19; + if ((v19 & 0x80000000u) != 0) + v21 = -v19; + v39 = _vm->_graphicsManager.Reel_Zoom(v39, v21); + v63 = v44; + } + v22 = v63 + v39; + v23 = 0; + if (v14 > 0) { + do { + ++v62; + SMOOTH[v60].field0 = v62; + if (v63 != v22) + v63 = v63 + 1; + SMOOTH[v60++].field2 = v63; + ++v23; + } while (v23 < v14); + } + ++v52; + if (v52 == 48) + v52 = 36; + ++v56; + if (v62 >= a5 || a6 <= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v56 > 5) { + v24 = v60; + SMOOTH[v24].field0 = -1; + SMOOTH[v24].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 4; + goto LABEL_85; + } + } + } else { + v51 = 12; + v59 = 0; + v55 = 0; + do { + v10 = _vm->_globals.Hopkins[v51].field2; + v42 = v63; + v11 = _vm->_graphicsManager.Reel_Reduc(_vm->_globals.Hopkins[v51].field0, 0x19u); + v38 = _vm->_graphicsManager.Reel_Reduc(v10, 0x19u); + v63 = v42; + v12 = 0; + if (v11 > 0) { + do { + --v62; + SMOOTH[v59].field0 = v62; + if ((uint16)v63 != (uint16)v42 + v38) + v63 = v63 - 1; + SMOOTH[v59++].field2 = v63; + ++v12; + } while (v12 < v11); + } + ++v51; + if (v51 == 24) + v51 = 12; + ++v55; + if (v62 <= a5 || a6 >= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v55 > 5) { + v13 = 4 * v59; + SMOOTH[v13].field0 = -1; + SMOOTH[v13].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 8; + goto LABEL_85; + } + } + } else { + v50 = 12; + v58 = 0; + v54 = 0; + do { + v6 = _vm->_globals.Hopkins[v50].field2; + v41 = v63; + v7 = _vm->_graphicsManager.Reel_Reduc(_vm->_globals.Hopkins[v50].field0, 0x19u); + v37 = _vm->_graphicsManager.Reel_Reduc(v6, 0x19u); + v63 = v41; + v8 = 0; + if (v7 > 0) { + do { + ++v62; + SMOOTH[v58].field0 = v62; + if ((uint16)v63 != (uint16)v41 + v37) + v63 = v63 - 1; + SMOOTH[v58++].field2 = v63; + ++v8; + } while (v8 < v7); + } + ++v50; + if (v50 == 24) + v50 = 12; + ++v54; + if (v62 >= a5 || a6 >= (int)v63) + v49 = 1; + } while (v49 != 1); + if (v54 > 5) { + v9 = v58; + SMOOTH[v9].field0 = -1; + SMOOTH[v9].field2 = -1; + _vm->_linesManager.SMOOTH_SENS = 2; +LABEL_85: + SMOOTH_X = v62; + SMOOTH_Y = v63; + return 0; + } + } + return -1; +} + +int LinesManager::PLAN_TEST(int a1, int a2, int a3, int a4, int a5, int a6) { + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int16 *v15; + int v16; + int v17; + int v18; + int v19; + int16 *v20; + int v21; + int v22; + int v23; + int16 *v25; + int16 *v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33 = 0; + int v34 = 0; + int v35; + int v36; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42; + int v43; + int v44; + int v45; + int v46; + int v47; + int v48; + int v49; + int v50; + int v51; + int v52; + int v53; + + v41 = a3; + v40 = TEST_LIGNE(a1, a2 - 2, &v42, &v50, &v46); + v39 = TEST_LIGNE(a1, a2 + 2, &v43, &v51, &v47); + v38 = TEST_LIGNE(a1 - 2, a2, &v44, &v52, &v48); + v6 = TEST_LIGNE(a1 + 2, a2, &v45, &v53, &v49); + v37 = v6; + if (v40 == -1 && v39 == -1 && v38 == -1 && v6 == -1) + return -1; + if (a4 == -1 || a5 == -1) { + v8 = 0; + if (v40 != -1) + v8 = 1; + if (v8) + goto LABEL_60; + if (v39 != -1) + v8 = 2; + if (v8) + goto LABEL_60; + if (v38 != -1) + v8 = 3; + if (v8) + goto LABEL_60; + if (v6 != -1) + v8 = 4; + goto LABEL_59; + } + v28 = 100; + v7 = 100; + v35 = 100; + v27 = 100; + v8 = 0; + v9 = a4 - a5; + if (a4 - a5 < 0) + v9 = -v9; + v36 = v9; + if (v40 != -1) { + v10 = v50 - a5; + if (v50 - a5 < 0) + v10 = -v10; + v28 = v10; + } + if (v39 != -1) { + v11 = v51 - a5; + if (v11 < 0) + v11 = -v11; + v7 = v11; + } + if (v38 != -1) { + v12 = v52 - a5; + if (v12 < 0) + v12 = -v12; + v35 = v12; + } + if (v37 != -1) { + v13 = v53 - a5; + if (v13 < 0) + v13 = -v13; + v27 = v13; + } + if (v28 < v36 && v28 <= v7 && v28 <= v35 && v28 <= v27) + v8 = 1; + if (v8) + goto LABEL_60; + if (v36 > v7 && v28 >= v7 && v35 >= v7 && v27 >= v7) + v8 = 2; + if (v8) + goto LABEL_60; + if (v35 < v36 && v35 <= v28 && v35 <= v7 && v35 <= v27) + v8 = 3; + if (v8) + goto LABEL_60; + if (v27 >= v36 || v27 > v28 || v27 > v7 || v27 > v35) { +LABEL_59: + if (v8) + goto LABEL_60; + return -1; + } + v8 = 4; +LABEL_60: + if (v8 == 1) { + v34 = v40; + v33 = v42; + NV_LIGNEDEP = v50; + NV_LIGNEOFS = v46; + } + if (v8 == 2) { + v34 = v39; + v33 = v43; + NV_LIGNEDEP = v51; + NV_LIGNEOFS = v47; + } + if (v8 == 3) { + v34 = v38; + v33 = v44; + NV_LIGNEDEP = v52; + NV_LIGNEOFS = v48; + } + if (v8 == 4) { + v34 = v37; + v33 = v45; + NV_LIGNEDEP = v53; + NV_LIGNEOFS = v49; + } + if (v33 == 1) { + v14 = 0; + if (Ligne[v34].field0 > 0) { + v32 = v34; + v25 = _vm->_globals.essai0; + do { + v15 = Ligne[v32].lineData; + v16 = v15[2 * v14]; + v29 = v15[2 * v14 + 1]; + if (!a6) { + v17 = v41; + _vm->_globals.super_parcours[v17] = v16; + _vm->_globals.super_parcours[v17 + 1] = v29; + _vm->_globals.super_parcours[v17 + 2] = Ligne[v32].field6; + _vm->_globals.super_parcours[v17 + 3] = 0; + } + if (a6 == 1) { + v18 = v41; + v25[v18] = v16; + v25[v18 + 1] = v29; + v25[v18 + 2] = Ligne[v32].field6; + v25[v18 + 3] = 0; + } + v41 += 4; + ++v14; + } while (Ligne[v32].field0 > v14); + } + } + if (v33 == 2) { + v19 = Ligne[v34].field0 - 1; + if (v19 > -1) { + v31 = v34; + v26 = _vm->_globals.essai0; + do { + v20 = Ligne[v31].lineData; + v21 = v20[2 * v19]; + v30 = v20[2 * v19 + 1]; + if (a6) { + v23 = v41; + v26[v23] = v21; + v26[v23 + 1] = v30; + v26[v23 + 2] = Ligne[v31].field8; + v26[v23 + 3] = 0; + } else { + v22 = v41; + _vm->_globals.super_parcours[v22] = v21; + _vm->_globals.super_parcours[v22 + 1] = v30; + _vm->_globals.super_parcours[v22 + 2] = Ligne[v31].field8; + _vm->_globals.super_parcours[v22 + 3] = 0; + } + v41 += 4; + --v19; + } while (v19 > -1); + } + } + NV_POSI = v41; + return 1; +} + +// Test line +int LinesManager::TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5) { + int i; + int v6; + int16 *v7; + int v8; + int v9; + int v10; + int v11; + int16 *v12; + int v13; + int v14; + int v15; + int v16; + int16 *v17; + int v18; + int v19; + int v20; + int v21; + int result; + int v23; + int v24 = 0; + int v25; + int v26; + int v27; + int v28; + + v26 = 0; + v25 = _vm->_objectsManager.DERLIGNE + 1; + for (i = (int)(_vm->_objectsManager.DERLIGNE + 1); i < _vm->_linesManager.TOTAL_LIGNES + 1; i = v25) { + v6 = i; + v7 = Ligne[i].lineData; + v8 = Ligne[v6].field0; + v23 = v7[2 * v8 - 2]; + v9 = v7[2 * v8 - 1]; + if (v7[0] == a1 && a2 == v7[1]) { + v24 = v25; + v26 = 1; + *a3 = 1; + } + if (v23 == a1 && a2 == v9) { + v24 = v25; + v26 = 1; + *a3 = 2; + } + if (v26 == 1) + goto LABEL_12; + ++v25; + } + if (v26 != 1) + goto LABEL_33; +LABEL_12: + if (*a3 == 1) { + v10 = v24; + v11 = Ligne[v10].field0; + v12 = Ligne[v10].lineData; + v13 = v12[2 * v11 - 2]; + v14 = v12[2 * v11 - 1]; + v15 = Ligne[v10].field6; + if (v15 == 5 || v15 == 1) + v14 += 2; + v16 = v24; + if (Ligne[v16].field6 == 3 || Ligne[v16].field8 == 7) + v13 += 2; + if (!colision2_ligne(v13, v14, &v28, &v27, 0, _vm->_objectsManager.DERLIGNE)) + error("error"); + *a4 = v27; + *a5 = v28; + } + if (v26 == 1 && *a3 == 2) { + v17 = Ligne[v25].lineData; + v18 = v17[0]; + v19 = v17[1]; + v20 = Ligne[v24].field6; + if (v20 == 5 || v20 == 1) + v19 -= 2; + v21 = v24; + if (Ligne[v21].field6 == 3 || Ligne[v21].field8 == 7) + v18 -= 2; + if (!colision2_ligne(v18, v19, &v28, &v27, 0, _vm->_objectsManager.DERLIGNE)) + error("erreure"); + *a4 = v27; + *a5 = v28; + } +LABEL_33: + if (v26) + result = v24; + else + result = -1; + return result; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/lines.h b/engines/hopkins/lines.h new file mode 100644 index 0000000000..20a1bccb65 --- /dev/null +++ b/engines/hopkins/lines.h @@ -0,0 +1,98 @@ +/* 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. + * + */ + +#ifndef HOPKINS_LINES_H +#define HOPKINS_LINES_H + +#include "common/scummsys.h" +#include "common/str.h" + +namespace Hopkins { + +class HopkinsEngine; + +struct LigneZoneItem { + int count; + int field2; + int16 *zoneData; +}; + +struct LigneItem { + int field0; + int field2; + int field4; + int field6; + int field8; + int16 *lineData; +}; + +struct SmoothItem { + int field0; + int field2; +}; + +class LinesManager { +private: + HopkinsEngine *_vm; +public: + LigneZoneItem LigneZone[401]; + LigneItem Ligne[400]; + SmoothItem SMOOTH[4000]; + int next_ligne; + int TOTAL_LIGNES; + int NV_LIGNEDEP; + int NV_LIGNEOFS; + int NV_POSI; + int NVPX; + int NVPY; + int SMOOTH_SENS; + int SMOOTH_X, SMOOTH_Y; +public: + LinesManager(); + void setParent(HopkinsEngine *vm); + + void CLEAR_ZONE(); + int ZONE_OBJET(int a1, int a2); + int OPTI_ZONE(int a1, int a2, int a3); + void RETIRE_LIGNE_ZONE(int idx); + void AJOUTE_LIGNE_ZONE(int idx, int a2, int a3, int a4, int a5, int a6); + void RESET_OBSTACLE(); + void RETIRE_LIGNE(int idx); + void AJOUTE_LIGNE(int idx, int a2, int a3, int a4, int a5, int a6, int a7); + int colision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6); + int Scolision2_ligne(int a1, int a2, int *a3, int *a4, int a5, int a6); + void INIPARCOURS(); + int CONTOURNE1(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7, int a8, int a9); + int CONTOURNE(int a1, int a2, int a3, int a4, int a5, int16 *a6, int a7); + int MIRACLE(int a1, int a2, int a3, int a4, int a5); + int GENIAL(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int16 *a8, int a9); + int16 *PARCOURS2(int a1, int a2, int a3, int a4); + int PARC_PERS(int a1, int a2, int a3, int a4, int a5, int a6, int a7); + int VERIF_SMOOTH(int a1, int a2, int a3, int a4); + int SMOOTH_MOVE(int a3, int a4, int a5, int a6); + int PLAN_TEST(int a1, int a2, int a3, int a4, int a5, int a6); + int TEST_LIGNE(int a1, int a2, int *a3, int *a4, int *a5); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_FONT_H */ diff --git a/engines/hopkins/menu.cpp b/engines/hopkins/menu.cpp new file mode 100644 index 0000000000..56b73c1fa1 --- /dev/null +++ b/engines/hopkins/menu.cpp @@ -0,0 +1,434 @@ +/* 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/scummsys.h" +#include "common/events.h" +#include "common/file.h" +#include "common/util.h" +#include "hopkins/menu.h" +#include "hopkins/dialogs.h" +#include "hopkins/files.h" +#include "hopkins/hopkins.h" +#include "hopkins/globals.h" +#include "hopkins/events.h" +#include "hopkins/graphics.h" +#include "hopkins/sound.h" + +namespace Hopkins { + +void MenuManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +enum MenuSelection { MENU_NONE = 0, PLAY_GAME = 1, LOAD_GAME = 2, OPTIONS = 3, INTRODUCTION = 4, QUIT = 5 }; + +int MenuManager::MENU() { + byte *spriteData = NULL; + MenuSelection menuIndex; + Common::Point mousePos; + signed int result; + int frame5Index; + int frame4Index; + int frame3Index; + int frame2Index; + int frame1Index; + + result = 0; + while (!g_system->getEventManager()->shouldQuit()) { + _vm->_globals.FORET = 0; + _vm->_eventsManager.CASSE = false; + _vm->_globals.DESACTIVE_INVENT = true; + _vm->_globals.FLAG_VISIBLE = false; + _vm->_globals.SORTIE = 0; + + for (int idx = 0; idx < 31; ++idx) + _vm->_globals.INVENTAIRE[idx] = 0; + + memset(_vm->_globals.SAUVEGARDE, 0, 2000); + _vm->_objectsManager.AJOUTE_OBJET(14); + frame5Index = 0; + frame4Index = 0; + frame3Index = 0; + frame2Index = 0; + frame1Index = 0; + + + if (_vm->_globals.FR == 0) + _vm->_graphicsManager.LOAD_IMAGE("MENUAN"); + else if (_vm->_globals.FR == 1) + _vm->_graphicsManager.LOAD_IMAGE("MENUFR"); + else if (_vm->_globals.FR == 2) + _vm->_graphicsManager.LOAD_IMAGE("MENUES"); + + _vm->_graphicsManager.FADE_INW(); + if (_vm->_globals.FR == 0) + _vm->_fileManager.CONSTRUIT_SYSTEM("MENUAN.SPR"); + if (_vm->_globals.FR == 1) + _vm->_fileManager.CONSTRUIT_SYSTEM("MENUFR.SPR"); + if (_vm->_globals.FR == 2) + _vm->_fileManager.CONSTRUIT_SYSTEM("MENUES.SPR"); + + spriteData = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER); + _vm->_eventsManager.MOUSE_ON(); + _vm->_eventsManager.CHANGE_MOUSE(0); + _vm->_eventsManager.btsouris = 0; + _vm->_eventsManager.souris_n = 0; + + for (;;) { + for (;;) { + _vm->_soundManager.WSOUND(28); + + // Loop to make menu selection + bool selectionMade = false; + do { + if (g_system->getEventManager()->shouldQuit()) + return -1; + + menuIndex = MENU_NONE; + mousePos = Common::Point(_vm->_eventsManager.XMOUSE(), _vm->_eventsManager.YMOUSE()); + + if ((uint16)(mousePos.x - 232) <= 176) { + if ((uint16)(mousePos.y - 261) <= 23) + menuIndex = PLAY_GAME; + if ((uint16)(mousePos.y - 293) <= 23) + menuIndex = LOAD_GAME; + if ((uint16)(mousePos.y - 325) <= 22) + menuIndex = OPTIONS; + if ((uint16)(mousePos.y - 356) <= 23) + menuIndex = INTRODUCTION; + + if ((uint16)(mousePos.y - 388) <= 23) + menuIndex = QUIT; + } + + switch (menuIndex) { + case MENU_NONE: + frame1Index = 0; + frame2Index = 0; + frame3Index = 0; + frame4Index = 0; + frame5Index = 0; + break; + case PLAY_GAME: + frame1Index = 1; + frame2Index = 0; + frame3Index = 0; + frame4Index = 0; + frame5Index = 0; + break; + case LOAD_GAME: + frame1Index = 0; + frame2Index = 1; + frame3Index = 0; + frame4Index = 0; + frame5Index = 0; + break; + case OPTIONS: + frame1Index = 0; + frame2Index = 0; + frame3Index = 1; + frame4Index = 0; + frame5Index = 0; + break; + case INTRODUCTION: + frame1Index = 0; + frame2Index = 0; + frame3Index = 0; + frame4Index = 1; + frame5Index = 0; + break; + case QUIT: + frame1Index = 0; + frame2Index = 0; + frame3Index = 0; + frame4Index = 0; + frame5Index = 1; + } + + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 259, frame1Index); + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 291, frame2Index + 2); + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 322, frame3Index + 4); + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 354, frame4Index + 6); + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 386, frame5Index + 8); + _vm->_eventsManager.VBL(); + + if (_vm->_eventsManager.BMOUSE() == 1 && menuIndex != MENU_NONE) + selectionMade = 1; + } while (!selectionMade); + + if (menuIndex == PLAY_GAME) { + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 259, 10); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.delay(200); + result = 1; + } + if (menuIndex != LOAD_GAME) + break; + + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 291, 11); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.delay(200); + + _vm->_globals.SORTIE = -1; + _vm->_dialogsManager.CHARGE_PARTIE(); + + if (_vm->_globals.SORTIE != -1) { + result = _vm->_globals.SORTIE; + break; + } + _vm->_globals.SORTIE = 0; + } + + if (menuIndex != OPTIONS) + break; + + // Options menu item selected + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 322, 12); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.delay(200); + + // Show the options dialog + _vm->_dialogsManager.showOptionsDialog(); + } + if (menuIndex == INTRODUCTION) { + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 354, 13); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.delay(200); + _vm->INTRORUN(); + continue; + } + + if ( menuIndex == QUIT) { + _vm->_graphicsManager.AFFICHE_SPEED(spriteData, 230, 386, 14); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.delay(200); + result = -1; + } + break; + } + + _vm->_globals.LIBERE_FICHIER(spriteData); + _vm->_globals.DESACTIVE_INVENT = false; + _vm->_globals.FLAG_VISIBLE = false; + _vm->_graphicsManager.FADE_OUTW(); + return result; +} + +void MenuManager::COMPUT_HOPKINS(int idx) { + // This is a text mode display? + warning("TODO: COMPUT_HOPKINS"); + /* + int v2; + char *v3; + int v4; + char v5; + char *v6; + int v7; + char v8; + char *v9; + int v10; + char v11; + int v12; + Common::String s; + Common::String s2; + + _vm->_eventsManager.ESC_KEY = 0; + v2 = 0; + _vm->_graphicsManager.RESET_SEGMENT_VESA(); + setvideomode(); + settextcolor(4); + _vm->_graphicsManager.videkey(); + settextposition(2, 4); + if (idx == 1) + outtext((const char *)&MenuText[10]); + if (idx == 2) + outtext((const char *)&MenuText[0xDE]); + if (idx == 3) + outtext((const char *)&MenuText[0x1B2]); + settextcolor(1); + if (idx == 3) { + settextposition(10, 8); + outtext((const char *)&MenuText[0x286]); + } + settextposition(12, 28); + outtext((const char *)&MenuText[0x35A]); + settextposition(14, 35); + v3 = &s; + memset(&s, 0, 8u); + TXT4(280, 224, 8); + s = Sup_string; + if (idx == 1) { + s2 = "HOPKINS"; + v4 = 8; + v5 = 1; + do { + if (!v4) + break; + v5 = *v3++ == *s2++; + --v4; + } while (v5); + if (v5) + v2 = 1; + } + if (idx == 2) { + v6 = &s; + s2 = "328MHZA"; + v7 = 8; + v8 = 1; + do { + if (!v7) + break; + v8 = *v6++ == *s2++; + --v7; + } while (v8); + if (v8) + v2 = 1; + } + if (idx == 3) { + v9 = &s; + s2 = "ALLFREE"; + v10 = 8; + v11 = 1; + do { + if (!v10) + break; + v11 = *v9++ == *s2++; + --v10; + } while (v11); + if (v11) + v2 = 1; + } + if (v2) { + while (1) { + ESC_KEY = 0; + _vm->_graphicsManager.videkey(); + clearscreen(); + settextcolor(4); + settextposition(2, 4); + if (idx == 1) + outtext((const char *)&MenuText[10]); + if (idx == 2) + outtext((const char *)&MenuText[0xDE]); + if (idx == 3) + outtext((const char *)&MenuText[0x1B2]); + settextcolor(15); + settextposition(8, 25); + settextcolor(15); + outtext2((const char *)&MenuText[0x502]); + settextposition(20, 25); + outtext2((const char *)&MenuText[0x5D6]); + if (idx == 1) { + settextposition(10, 25); + outtext2((const char *)&MenuText[0x6AA]); + settextposition(12, 25); + outtext2((const char *)&MenuText[0x77E]); + settextposition(14, 25); + outtext2((const char *)&MenuText[0x852]); + settextposition(16, 25); + outtext2((const char *)&MenuText[0x926]); + } + if (idx == 2) { + _vm->_graphicsManager.videkey(); + settextposition(10, 25); + outtext2((const char *)&MenuText[0x95A]); + settextposition(12, 25); + outtext2((const char *)&MenuText[0xACE]); + settextposition(14, 25); + outtext2((const char *)&MenuText[0xBA2]); + settextposition(16, 25); + outtext2((const char *)&MenuText[0xC76]); + settextposition(18, 25); + outtext2((const char *)&MenuText[0xD4A]); + } + do { + v12 = (byte)keywin(v2, s2); + v2 = 0; + if ((uint16)(v12 - 48) <= 8u) + v2 = 1; + } while (v2 != 1); + if (v12 == 48) + break; + if (v12 == 49) { + GAMES(s2); + } else if (idx == 1) { + _vm->_graphicsManager.videkey(); + clearscreen(); + settextcolor(4); + settextposition(2, 4); + outtext((const char *)&MenuText[10]); + settextcolor(15); + if (v12 == 50) + LIT_TEXTE(1); + if (v12 == 51) + LIT_TEXTE(2); + if (v12 == 52) + LIT_TEXTE(3); + if (v12 == 53) + LIT_TEXTE(4); + } else if (idx == 2) { + clearscreen(); + settextcolor(4); + settextposition(2, 4); + outtext((const char *)&MenuText[0xDE]); + settextcolor(15); + if (v12 == 50) + LIT_TEXTE(6); + if (v12 == 51) + LIT_TEXTE(7); + if (v12 == 52) + LIT_TEXTE(8); + if (v12 == 53) + LIT_TEXTE(9); + if (v12ii == 54) { + LIT_TEXTE(10); + _vm->_globals.SAUVEGARDE->data[svField270] = 4; + } + } + } + _vm->_graphicsManager.DD_Lock(); + Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + RESTORE_POLICE(); + } else { + settextcolor(4); + settextposition(16, 25); + outtext((const char *)&MenuText[0x42E]); + _vm->_eventsManager.VBL(); + memset(_vm->_graphicsManager.VESA_BUFFER, 0, 0x4AFFFu); + _vm->_graphicsManager.DD_Lock(); + Cls_Video(); + _vm->_graphicsManager.DD_Unlock(); + _vm->_graphicsManager.DD_VBL(); + RESTORE_POLICE(); + _vm->_eventsManager.MOUSE_OFF(); + } + if (idx == 1) + _vm->_globals.SORTIE = 13; + if ((uint16)(idx - 2) <= 1u) + _vm->_globals.SORTIE = 14; + return _vm->_graphicsManager.RESET_SEGMENT_VESA(); + */ +} + + +} // End of namespace Hopkins diff --git a/engines/hopkins/menu.h b/engines/hopkins/menu.h new file mode 100644 index 0000000000..58788fca46 --- /dev/null +++ b/engines/hopkins/menu.h @@ -0,0 +1,48 @@ +/* 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. + * + */ + +#ifndef HOPKINS_MENU_H +#define HOPKINS_MENU_H + +#include "common/scummsys.h" +#include "common/system.h" +#include "common/error.h" + +namespace Hopkins { + +class HopkinsEngine; + +class MenuManager { +private: + HopkinsEngine *_vm; + + byte MenuTxt[10600]; +public: + void setParent(HopkinsEngine *vm); + + int MENU(); + void COMPUT_HOPKINS(int a1); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_MENU_H */ diff --git a/engines/hopkins/module.mk b/engines/hopkins/module.mk new file mode 100644 index 0000000000..109104f229 --- /dev/null +++ b/engines/hopkins/module.mk @@ -0,0 +1,28 @@ +MODULE := engines/hopkins + +MODULE_OBJS := \ + anim.o \ + debugger.o \ + detection.o \ + dialogs.o \ + events.o \ + files.o \ + font.o \ + graphics.o \ + globals.o \ + hopkins.o \ + lines.o \ + menu.o \ + objects.o \ + saveload.o \ + script.o \ + sound.o \ + talk.o + +# This module can be built as a plugin +ifeq ($(ENABLE_HOPKINS), DYNAMIC_PLUGIN) +PLUGIN := 1 +endif + +# Include common rules +include $(srcdir)/rules.mk diff --git a/engines/hopkins/objects.cpp b/engines/hopkins/objects.cpp new file mode 100644 index 0000000000..bc592b34ce --- /dev/null +++ b/engines/hopkins/objects.cpp @@ -0,0 +1,5824 @@ +/* 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/system.h" +#include "graphics/palette.h" +#include "common/file.h" +#include "common/rect.h" +#include "engines/util.h" +#include "hopkins/objects.h" +#include "hopkins/dialogs.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +ObjectsManager::ObjectsManager() { + for (int i = 0; i < 6; ++i) { + Common::fill((byte *)&Sprite[i], (byte *)&Sprite[i] + sizeof(SpriteItem), 0); + } + + PRIORITY = 0; + old_cadx = old_cady = old_cadi = 0; + cadx = cady = cadi = 0; + SL_X = SL_Y = 0; + I_old_x = I_old_y = 0; + g_old_x = g_old_y = 0; + FLAG_VISIBLE_EFFACE = 0; + SL_SPR = g_PTRNUL; + SL_SPR2 = g_PTRNUL; + sprite_ptr = g_PTRNUL; + S_old_spr = g_PTRNUL; + PERSO_ON = false; + SL_FLAG = false; + SL_MODE = false; + FLAG_VISIBLE = false; + DESACTIVE_CURSOR = 0; + BOBTOUS = false; + my_anim = 0; + NUMZONE = 0; + ARRET_PERSO_FLAG = 0; + ARRET_PERSO_NUM = 0; + FORCEZONE = 0; + CHANGEVERBE = 0; + verbe = 0; + Vold_taille = 0; + SPEED_FLAG = false; + SPEED_X = SPEED_Y = 0; + SPEED_IMAGE = 0; + SPEED_PTR = g_PTRNUL; + DERLIGNE = 0; + A_ANIM = 0; + MA_ANIM = 0; + MA_ANIM1 = 0; + A_DEPA = 0; + MAX_DEPA = 0; + MAX_DEPA1 = 0; + CH_TETE = 0; + T_RECTIF = 0; + DESACTIVE = false; + DEUXPERSO = false; + PERX = PERY = 0; + PERI = 0; + RECALL = 0; + PTAILLE = 0; + PEROFX = 0; + PEROFY = 0; + OBSSEUL = 0; + NVVERBE = 0; + NVZONE = 0; + S_old_ani = 0; + S_old_ret = 0; + nouveau_x = nouveau_y = 0; + nouveau_sens = 0; + nouveau_anim = 0; +} + +void ObjectsManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +// Change Object +byte *ObjectsManager::CHANGE_OBJET(int objIndex) { + byte *result = CAPTURE_OBJET(objIndex, 1); + _vm->_globals.Bufferobjet = result; + _vm->_globals.Nouv_objet = 1; + _vm->_globals.OBJET_EN_COURS = objIndex; + return result; +} + +byte *ObjectsManager::CAPTURE_OBJET(int objIndex, int mode) { + byte *dataP; + + dataP = 0; + int val1 = _vm->_globals.ObjetW[objIndex].field0; + int val2 = _vm->_globals.ObjetW[objIndex].field1; + + if (mode == 1) + ++val2; + if (val1 != _vm->_globals.NUM_FICHIER_OBJ) { + if (_vm->_globals.ADR_FICHIER_OBJ != g_PTRNUL) + ObjectsManager::DEL_FICHIER_OBJ(); + if (val1 == 1) { + _vm->_fileManager.CONSTRUIT_SYSTEM("OBJET1.SPR"); + _vm->_globals.ADR_FICHIER_OBJ = ObjectsManager::CHARGE_SPRITE(_vm->_globals.NFICHIER); + } + _vm->_globals.NUM_FICHIER_OBJ = val1; + } + + int width = ObjectsManager::Get_Largeur(_vm->_globals.ADR_FICHIER_OBJ, val2); + int height = ObjectsManager::Get_Hauteur(_vm->_globals.ADR_FICHIER_OBJ, val2); + _vm->_globals.OBJL = width; + _vm->_globals.OBJH = height; + + switch (mode) { + case 0: + dataP = _vm->_globals.dos_malloc2(height * width); + if (dataP == g_PTRNUL) + error("CAPTURE_OBJET"); + + capture_mem_sprite(_vm->_globals.ADR_FICHIER_OBJ, dataP, val2); + break; + + case 1: + sprite_alone(_vm->_globals.ADR_FICHIER_OBJ, _vm->_globals.Bufferobjet, val2); + dataP = _vm->_globals.Bufferobjet; + break; + + case 3: + capture_mem_sprite(_vm->_globals.ADR_FICHIER_OBJ, _vm->_globals.INVENTAIRE_OBJET, val2); + dataP = _vm->_globals.INVENTAIRE_OBJET; + break; + + default: + break; + } + + return dataP; +} + +// Delete Object +void ObjectsManager::DELETE_OBJET(int objIndex) { + int v1; + int v2; + int i; + + v1 = 0; + v2 = 0; + do { + ++v2; + if (_vm->_globals.INVENTAIRE[v2] == objIndex) + v1 = 1; + if (v2 > 32) + v1 = 1; + } while (v1 != 1); + if (v2 <= 32) { + if (v2 == 32) { + _vm->_globals.INVENTAIRE[32] = 0; + } else { + for (i = v2; i < 32; ++i) + _vm->_globals.INVENTAIRE[i] = _vm->_globals.INVENTAIRE[i + 1]; + } + } + CHANGE_OBJET(14); + +} + +void ObjectsManager::set_offsetxy(byte *data, int idx, int xp, int yp, bool isSize) { + byte *startP = data + 3; + for (int i = idx; i; --i) + startP += READ_LE_UINT32(startP) + 16; + + byte *rectP = startP + 8; + if (isSize == 1) { + // Set size + byte *pointP = rectP + 4; + WRITE_LE_UINT16(pointP, xp); + WRITE_LE_UINT16(pointP + 2, yp); + } else { + // Set position + WRITE_LE_UINT16(rectP, xp); + WRITE_LE_UINT16(rectP + 2, yp); + } +} + +int ObjectsManager::get_offsetx(const byte *spriteData, int spriteIndex, bool isSize) { + const byte *v3 = spriteData + 3; + for (int i = spriteIndex; i; --i) + v3 += READ_LE_UINT32(v3) + 16; + + const byte *v5 = v3 + 8; + int result = (int16)READ_LE_UINT16(v5); + if (isSize) + result = (int16)READ_LE_UINT16(v5 + 4); + + return result; +} + +int ObjectsManager::get_offsety(const byte *spriteData, int spriteIndex, bool isSize) { + const byte *v3 = spriteData + 3; + for (int i = spriteIndex; i; --i) + v3 += READ_LE_UINT32(v3) + 16; + + const byte *v5 = v3 + 10; + int result = (int16)READ_LE_UINT16(v5); + if (isSize) + result = (int16)READ_LE_UINT16(v5 + 4); + + return result; +} + +// Get Width +int ObjectsManager::Get_Largeur(const byte *objectData, int idx) { + const byte *rectP = objectData + 3; + for (int i = idx; i; --i) + rectP += READ_LE_UINT32(rectP) + 16; + + return (int16)READ_LE_UINT16(rectP + 4); +} + +// Get height +int ObjectsManager::Get_Hauteur(const byte *objectData, int idx) { + const byte *rectP = objectData + 3; + for (int i = idx; i; --i) + rectP += READ_LE_UINT32(rectP) + 16; + + return (int16)READ_LE_UINT16(rectP + 6); +} + +int ObjectsManager::sprite_alone(const byte *objectData, byte *sprite, int objIndex) { + const byte *objP = objectData + 3; + for (int i = objIndex; i; --i) { + objP += READ_LE_UINT32(objP) + 16; + } + + objP += 4; + int result = (int16)READ_LE_UINT16(objP) * (int16)READ_LE_UINT16(objP + 2); + + memcpy(sprite + 3, objP - 4, result + 16); + return result; +} + +byte *ObjectsManager::DEL_FICHIER_OBJ() { + _vm->_globals.NUM_FICHIER_OBJ = 0; + if (_vm->_globals.ADR_FICHIER_OBJ != g_PTRNUL) + _vm->_globals.ADR_FICHIER_OBJ = _vm->_fileManager.LIBERE_FICHIER(_vm->_globals.ADR_FICHIER_OBJ); + + byte *result = g_PTRNUL; + _vm->_globals.ADR_FICHIER_OBJ = g_PTRNUL; + return result; +} + +// Load Sprite +byte *ObjectsManager::CHARGE_SPRITE(const Common::String &file) { + _vm->_fileManager.DMESS1(); + return _vm->_fileManager.CHARGE_FICHIER(file); +} + +int ObjectsManager::capture_mem_sprite(const byte *objectData, byte *sprite, int objIndex) { + const byte *objP = objectData + 3; + for (int i = objIndex; i; --i) { + objP += READ_LE_UINT32(objP) + 16; + } + + objP += 4; + int result = (int16)READ_LE_UINT16(objP) * (int16)READ_LE_UINT16(objP + 2); + + memcpy(sprite, objP + 12, result); + return result; +} + +// Add Object +int ObjectsManager::AJOUTE_OBJET(int objIndex) { + bool flag = false; + int arrIndex = 0; + do { + ++arrIndex; + if (!_vm->_globals.INVENTAIRE[arrIndex]) + flag = true; + if (arrIndex == 32) + flag = true; + } while (!flag); + + _vm->_globals.INVENTAIRE[arrIndex] = objIndex; + return arrIndex; +} + +// Display Sprite +void ObjectsManager::AFF_SPRITES() { + int v1; + int v2; + int destX; + int destY; + int v6; + int v7; + int v8; + int v9; + int v11; + uint16 *v12; + int v13; + int v20; + int v21; + int y1_1; + int y1_2; + int v25; + int v26; + int v27; + int x1_1; + int x1_2; + int v33; + int v34; + int v35; + uint16 arr[50]; + + // Handle copying any background areas that text are going to be drawn on + _vm->_globals.NBTRI = 0; + for (int idx = 0; idx <= 10; ++idx) { + if (_vm->_fontManager.ListeTxt[idx].enabled && _vm->_fontManager.Txt[idx].field3FC != 2) { + v1 = _vm->_fontManager.ListeTxt[idx].xp; + x1_1 = v1 - 2; + + if ((int16)(v1 - 2) < _vm->_graphicsManager.min_x) + x1_1 = _vm->_graphicsManager.min_x; + v2 = _vm->_fontManager.ListeTxt[idx].yp; + y1_1 = v2 - 2; + + if ((int16)(v2 - 2) < _vm->_graphicsManager.min_y) + y1_1 = _vm->_graphicsManager.min_y; + destX = v1 - 2; + if (destX < _vm->_graphicsManager.min_x) + destX = _vm->_graphicsManager.min_x; + destY = v2 - 2; + if (destY < _vm->_graphicsManager.min_y) + destY = _vm->_graphicsManager.min_y; + + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, x1_1, y1_1, + _vm->_fontManager.ListeTxt[idx].width + 4, _vm->_fontManager.ListeTxt[idx].height + 4, + _vm->_graphicsManager.VESA_BUFFER, + destX, destY); + _vm->_fontManager.ListeTxt[idx].enabled = false; + } + } + + if (!PERSO_ON) { + for (int idx = 0; idx < 5; ++idx) { + if (_vm->_globals.Liste[idx].field0) { + v6 = _vm->_globals.Liste[idx].field2; + x1_2 = v6 - 2; + if ((int16)(v6 - 2) < _vm->_graphicsManager.min_x) + x1_2 = _vm->_graphicsManager.min_x; + v7 = _vm->_globals.Liste[idx].field4; + y1_2 = v7 - 2; + if ((int16)(v7 - 2) < _vm->_graphicsManager.min_y) + y1_2 = _vm->_graphicsManager.min_y; + v8 = v6 - 2; + if (v8 < _vm->_graphicsManager.min_x) + v8 = _vm->_graphicsManager.min_x; + v9 = v7 - 2; + if (v9 < _vm->_graphicsManager.min_y) + v9 = _vm->_graphicsManager.min_y; + + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, x1_2, y1_2, + _vm->_globals.Liste[idx].width + 4, _vm->_globals.Liste[idx].height + 4, + _vm->_graphicsManager.VESA_BUFFER, v8, v9); + _vm->_globals.Liste[idx].field0 = 0; + } + } + } + + AFF_BOB_ANIM(); + AFF_VBOB(); + + if (!PERSO_ON) { + // Handle drawing characters on the screen + for (int idx = 0; idx < 5; ++idx) { + _vm->_globals.Liste[idx].field0 = 0; + if (Sprite[idx].field0 == 1) { + CALCUL_SPRITE(idx); + if (Sprite[idx].field2A == 1) + AvantTri(TRI_SPRITE, idx, Sprite[idx].field32 + Sprite[idx].field2E); + } + } + + if (_vm->_globals.CACHEFLAG) + VERIFCACHE(); + } + + if (PRIORITY == 1 && _vm->_globals.NBTRI) { + v33 = 1; + do { + arr[v33] = v33; + ++v33; + } while (v33 <= 48); + + v25 = _vm->_globals.NBTRI; + do { + v27 = 0; + v34 = 1; + if (v25 > 1) { + v26 = _vm->_globals.NBTRI; + + do { + v11 = arr[v34]; + v12 = &arr[v34 + 1]; + if (_vm->_globals.Tri[arr[v34]].priority > _vm->_globals.Tri[*v12].priority) { + arr[v34] = *v12; + *v12 = v11; + ++v27; + } + ++v34; + } while (v34 < v26); + } + } while (v27); + + v35 = 1; + if (_vm->_globals.NBTRI + 1 > 1) { + do { + v13 = arr[v35]; + switch (_vm->_globals.Tri[v13].triMode) { + case TRI_BOB: + DEF_BOB(_vm->_globals.Tri[v13].index); + break; + case TRI_SPRITE: + DEF_SPRITE(_vm->_globals.Tri[v13].index); + break; + case TRI_CACHE: + DEF_CACHE(_vm->_globals.Tri[v13].index); + break; + default: + break; + } + _vm->_globals.Tri[v13].triMode = TRI_NONE; + ++v35; + } while (v35 < _vm->_globals.NBTRI + 1); + } + } else { + if (_vm->_globals.NBTRI + 1 > 1) { + for (int idx = 1; idx < (_vm->_globals.NBTRI + 1); ++idx) { + switch (_vm->_globals.Tri[idx].triMode) { + case TRI_BOB: + DEF_BOB(_vm->_globals.Tri[idx].index); + break; + case TRI_SPRITE: + DEF_SPRITE(_vm->_globals.Tri[idx].index); + break; + case TRI_CACHE: + DEF_CACHE(_vm->_globals.Tri[idx].index); + break; + default: + break; + } + _vm->_globals.Tri[idx].triMode = TRI_NONE; + } + } + } + + // Reset the Tri array + for (int idx = 0; idx < 50; ++idx) { + _vm->_globals.Tri[idx].triMode = TRI_NONE; + _vm->_globals.Tri[idx].index = 0; + _vm->_globals.Tri[idx].priority = 0; + _vm->_globals.Tri[idx].unused = 0; + } + + _vm->_globals.NBTRI = 0; + if (_vm->_dialogsManager.AFFINVEN) { + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, _vm->_dialogsManager.Winventaire, _vm->_dialogsManager.inventairex, _vm->_dialogsManager.inventairey, _vm->_dialogsManager.inventairel, _vm->_dialogsManager.inventaireh); + if (old_cadx && old_cady) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_dialogsManager.inventaire2, old_cadx + 300, old_cady + 300, old_cadi + 1); + if (cadx && cady) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_dialogsManager.inventaire2, cadx + 300, cady + 300, cadi); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_dialogsManager.inventairex, _vm->_dialogsManager.inventairey, _vm->_dialogsManager.inventairex + _vm->_dialogsManager.inventairel, _vm->_dialogsManager.inventairey + _vm->_dialogsManager.inventaireh); + } + + if (SL_FLAG == true) { + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, SL_SPR, _vm->_eventsManager.start_x + 183, 60, 0x112u, 353); + if (SL_X && SL_Y) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, SL_SPR2, SL_X + _vm->_eventsManager.start_x + 300, SL_Y + 300, 0); + + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_eventsManager.start_x + 183, 60, _vm->_eventsManager.start_x + 457, 413); + } + + // If the Options dialog is activated, draw the elements + if (_vm->_globals.OPTION_FLAG) { + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 464, 407, 0); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 657, 556, _vm->_globals.opt_vitesse); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 731, 495, _vm->_globals.opt_txt); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 731, 468, _vm->_globals.opt_voice); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 731, 441, _vm->_globals.opt_sound); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 731, 414, _vm->_globals.opt_music); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 600, 522, _vm->_globals.opt_anm); + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.OPTION_SPR, + _vm->_eventsManager.start_x + 611, 502, _vm->_globals.opt_scrspeed); + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_eventsManager.start_x + 164, 107, _vm->_eventsManager.start_x + 498, 320); + } + + // Loop to draw any on-screen text + for (int idx = 0; idx <= 10; ++idx) { + if (_vm->_fontManager.Txt[idx].textOn) { + if ((uint16)(_vm->_fontManager.Txt[idx].field3FC - 2) > 1) + _vm->_fontManager.BOITE(idx, + _vm->_fontManager.Txt[idx].messageId, _vm->_fontManager.Txt[idx].filename, + _vm->_eventsManager.start_x + _vm->_fontManager.Txt[idx].xp, _vm->_fontManager.Txt[idx].yp); + else + _vm->_fontManager.BOITE( + idx, + _vm->_fontManager.Txt[idx].messageId, + _vm->_fontManager.Txt[idx].filename, + _vm->_fontManager.Txt[idx].xp, + _vm->_fontManager.Txt[idx].yp); + _vm->_fontManager.ListeTxt[idx].enabled = true; + + if ((uint16)(_vm->_fontManager.Txt[idx].field3FC - 2) > 1) + _vm->_fontManager.ListeTxt[idx].xp = _vm->_eventsManager.start_x + _vm->_fontManager.Txt[idx].xp; + else + _vm->_fontManager.ListeTxt[idx].xp = _vm->_fontManager.Txt[idx].xp; + + _vm->_fontManager.ListeTxt[idx].yp = _vm->_fontManager.Txt[idx].yp; + _vm->_fontManager.ListeTxt[idx].width = _vm->_fontManager.Txt[idx].width; + _vm->_fontManager.ListeTxt[idx].height = _vm->_fontManager.Txt[idx].height; + + if (_vm->_fontManager.ListeTxt[idx].xp < _vm->_graphicsManager.min_x) + _vm->_fontManager.ListeTxt[idx].xp = _vm->_graphicsManager.min_x - 1; + if (_vm->_fontManager.ListeTxt[idx].yp < _vm->_graphicsManager.min_y) + _vm->_fontManager.ListeTxt[idx].yp = _vm->_graphicsManager.min_y - 1; + + v20 = _vm->_fontManager.ListeTxt[idx].xp; + if (_vm->_fontManager.ListeTxt[idx].width + v20 > _vm->_graphicsManager.max_x) + _vm->_fontManager.ListeTxt[idx].width = _vm->_graphicsManager.max_x - v20; + v21 = _vm->_fontManager.ListeTxt[idx].yp; + if (_vm->_fontManager.ListeTxt[idx].height + v21 > _vm->_graphicsManager.max_y) + _vm->_fontManager.ListeTxt[idx].height = _vm->_graphicsManager.max_y - v21; + if (_vm->_fontManager.ListeTxt[idx].width <= 0 || _vm->_fontManager.ListeTxt[idx].height <= 0) + _vm->_fontManager.ListeTxt[idx].enabled = false; + } + } + + _vm->_dialogsManager.INVENT_ANIM(); +} + +void ObjectsManager::INIT_BOB() { + for (int idx = 0; idx < 35; ++idx) { + BOB_ZERO(idx); + } +} + +void ObjectsManager::BOB_ZERO(int idx) { + BobItem &bob = _vm->_globals.Bob[idx]; + Liste2Item &item = _vm->_globals.Liste2[idx]; + + bob.field0 = 0; + bob.spriteData = g_PTRNUL; + bob.xp = 0; + bob.yp = 0; + bob.frameIndex = 0; + bob.fieldE = 0; + bob.field10 = 0; + bob.field12 = 0; + bob.field14 = 0; + bob.field16 = 0; + bob.animData = g_PTRNUL; + bob.field1C = 0; + bob.field1E = 0; + bob.field20 = 0; + bob.field22 = 0; + bob.offsetY = 0; + bob.field26 = 0; + bob.field28 = 0; + bob.field2A = 0; + bob.field2C = 0; + bob.field30 = g_PTRNUL; + bob.field34 = 0; + bob.field36 = 0; + bob.field38 = 0; + bob.oldX2 = 0; + + item.field0 = 0; + item.xp = 0; + item.yp = 0; + item.width = 0; + item.height = 0; +} + +void ObjectsManager::DEF_BOB(int idx) { + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int xp; + int yp; + + if (_vm->_globals.Bob[idx].isActive) { + xp = _vm->_globals.Bob[idx].oldX; + yp = _vm->_globals.Bob[idx].oldY; + + if (_vm->_globals.Bob[idx].isSprite) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.Bob[idx].spriteData, + xp + 300, yp + 300, _vm->_globals.Bob[idx].frameIndex); + else + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, + _vm->_globals.Bob[idx].spriteData, xp + 300, yp + 300, _vm->_globals.Bob[idx].frameIndex, + _vm->_globals.Bob[idx].field4A, _vm->_globals.Bob[idx].oldY2, + _vm->_globals.Bob[idx].field38); + + _vm->_globals.Liste2[idx].field0 = 1; + _vm->_globals.Liste2[idx].xp = xp; + _vm->_globals.Liste2[idx].yp = yp; + + _vm->_globals.Liste2[idx].width = _vm->_globals.Bob[idx].oldWidth; + _vm->_globals.Liste2[idx].height = _vm->_globals.Bob[idx].oldHeight; + + v5 = _vm->_globals.Liste2[idx].xp; + v6 = _vm->_graphicsManager.min_x; + if (v5 < _vm->_graphicsManager.min_x) { + _vm->_globals.Liste2[idx].width -= _vm->_graphicsManager.min_x - v5; + _vm->_globals.Liste2[idx].xp = v6; + } + + v7 = _vm->_globals.Liste2[idx].yp; + v8 = _vm->_graphicsManager.min_y; + if (v7 < _vm->_graphicsManager.min_y) { + _vm->_globals.Liste2[idx].height -= _vm->_graphicsManager.min_y - v7; + _vm->_globals.Liste2[idx].yp = v8; + } + + v9 = _vm->_globals.Liste2[idx].xp; + if (_vm->_globals.Liste2[idx].width + v9 > _vm->_graphicsManager.max_x) + _vm->_globals.Liste2[idx].width = _vm->_graphicsManager.max_x - v9; + v10 = _vm->_globals.Liste2[idx].yp; + if (_vm->_globals.Liste2[idx].height + v10 > _vm->_graphicsManager.max_y) + _vm->_globals.Liste2[idx].height = _vm->_graphicsManager.max_y - v10; + + if (_vm->_globals.Liste2[idx].width <= 0 || _vm->_globals.Liste2[idx].height <= 0) + _vm->_globals.Liste2[idx].field0 = 0; + + if (_vm->_globals.Liste2[idx].field0 == 1) + _vm->_graphicsManager.Ajoute_Segment_Vesa( + _vm->_globals.Liste2[idx].xp, + _vm->_globals.Liste2[idx].yp, + _vm->_globals.Liste2[idx].xp + _vm->_globals.Liste2[idx].width, + _vm->_globals.Liste2[idx].yp + _vm->_globals.Liste2[idx].height); + } +} + +void ObjectsManager::BOB_VISU(int idx) { + int v1; + const byte *data; + int16 v6; + int16 offsetY; + int16 v8; + int16 v9; + + PRIORITY = 1; + + if (!_vm->_globals.Bob[idx].field0) { + BOB_ZERO(idx); + + data = _vm->_globals.Bqe_Anim[idx].data; + v1 = (int16)READ_LE_UINT16(data); + v9 = (int16)READ_LE_UINT16(data + 2); + v8 = (int16)READ_LE_UINT16(data + 4); + offsetY = (int16)READ_LE_UINT16(data + 6); + v6 = (int16)READ_LE_UINT16(data + 8); + if ((int16)READ_LE_UINT16(data)) { + if (_vm->_globals.Bank[v1].field4) { + if (!v9) + v9 = 1; + if (!v6) + v6 = -1; + + if ((int16)READ_LE_UINT16(data + 24)) { + _vm->_globals.Bob[idx].isSprite = false; + + if (_vm->_globals.Bank[v1].fileHeader == 1) { + _vm->_globals.Bob[idx].isSprite = true; + _vm->_globals.Bob[idx].field36 = 0; + _vm->_globals.Bob[idx].field38 = 0; + } + + _vm->_globals.Bob[idx].animData = _vm->_globals.Bqe_Anim[idx].data; + _vm->_globals.Bob[idx].field0 = 10; + _vm->_globals.Bob[idx].spriteData = _vm->_globals.Bank[v1].data; + + _vm->_globals.Bob[idx].field1E = v9; + _vm->_globals.Bob[idx].field20 = v6; + _vm->_globals.Bob[idx].field22 = v8; + _vm->_globals.Bob[idx].offsetY = offsetY; + } + } + } + } +} + +void ObjectsManager::BOB_OFF(int idx) { + if (_vm->_globals.Bob[idx].field0 == 3) + _vm->_globals.Bob[idx].field0 = 4; + else if (_vm->_globals.Bob[idx].field0 == 10) + _vm->_globals.Bob[idx].field0 = 11; +} + +void ObjectsManager::BOB_OFFSET(int idx, int v) { + _vm->_globals.Bob[idx].oldX2 = v; +} + +void ObjectsManager::BOB_ADJUST(int idx, int v) { + _vm->_globals.Bob[idx].oldX2 = v; +} + +void ObjectsManager::BOB_OFFSETY(int idx, int v) { + _vm->_globals.Bob[idx].offsetY = v; +} + +void ObjectsManager::SCBOB(int idx) { + int v1; + int v2; + int v3; + int v4; + int v6; + int v7; + int v8; + int v9; + + v1 = idx; + if (_vm->_globals.Cache[idx].fieldA > 0) { + v8 = 0; + do { + v1 = v8; + if (_vm->_globals.Bob[v1].field0) { + if (!_vm->_globals.Bob[v8].field16) { + if (!_vm->_globals.Bob[v8].field34) { + if ( _vm->_globals.Bob[v8].frameIndex != 250) { + v2 = _vm->_globals.Bob[v8].oldWidth; + v9 = _vm->_globals.Bob[v8].oldX + _vm->_globals.Bob[v8].oldWidth; + v6 = _vm->_globals.Bob[v8].oldY + _vm->_globals.Bob[v8].oldHeight; + v3 =_vm->_globals.Cache[idx].field0; + v4 =_vm->_globals.Cache[idx].field4; + v7 =_vm->_globals.Cache[idx].field6 + v3; + v1 =_vm->_globals.Cache[idx].field14 +_vm->_globals.Cache[idx].field8 + v4; + + if (v6 > v4) { + if (v6 < v1) { + v1 = 0; + if (v9 >= v3 && v9 <= (_vm->_globals.Cache[idx].field6 + v3)) { + ++_vm->_globals.Cache[idx].fieldA; + v1 = 1; + } + + if (!(uint16)v1) { + if (v2 >= v3 && v7 >= v2) { + ++_vm->_globals.Cache[idx].fieldA; + v1 = 1; + } + if (!(uint16)v1) { + if ( v7 >= v2 && v2 >= v3 ) { + ++_vm->_globals.Cache[idx].fieldA; + v1 = 1; + } + if (!(uint16)v1) { + if (v2 >= v3 && v9 <= v7) { + ++_vm->_globals.Cache[idx].fieldA; + v1 = 1; + } + if (!(uint16)v1 && v2 <= v3 && v9 >= v7) + ++_vm->_globals.Cache[idx].fieldA; + } + } + } + } + } + } + } + } + } + ++v8; + } while (v8 <= 20); + } +} + +void ObjectsManager::CALCUL_BOB(int idx) { + int result; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v13; + int v14; + int v15; + int v17; + int v20; + int v21; + int v22; + + _vm->_globals.Bob[idx].isActive = false; + if (_vm->_globals.Bob[idx].isSprite) { + _vm->_globals.Bob[idx].field38 = 0; + _vm->_globals.Bob[idx].field36 = 0; + } + + result = _vm->_globals.Bob[idx].frameIndex; + if (result != 250) { + if (_vm->_globals.Bob[idx].field38) { + v4 = get_offsetx(_vm->_globals.Bob[idx].spriteData, result, 1); + v22 = v4; + v15 = v4; + v5 = get_offsety(_vm->_globals.Bob[idx].spriteData, _vm->_globals.Bob[idx].frameIndex, 1); + } else { + v3 = get_offsetx(_vm->_globals.Bob[idx].spriteData, result, 0); + v22 = v3; + v15 = v3; + v5 = get_offsety(_vm->_globals.Bob[idx].spriteData, _vm->_globals.Bob[idx].frameIndex, 0); + } + + v17 = v5; + v6 = v5; + v21 = 0; + v20 = 0; + v7 = _vm->_globals.Bob[idx].field36; + + if (v7 < 0) { + v7 = v7; + if (v7 < 0) + v7 = -v7; + v20 = v7; + if (v7 > 95) + v20 = 95; + } + if (_vm->_globals.Bob[idx].field36 > 0) + v21 = _vm->_globals.Bob[idx].field36; + if (v21) { + if (v15 >= 0) { + v22 = _vm->_graphicsManager.Reel_Zoom(v15, v21); + } else { + v8 = v15; + if (v15 < 0) + v8 = -v15; + v15 = v8; + v22 = -_vm->_graphicsManager.Reel_Zoom(v8, v21); + } + if (v6 >= 0) { + v17 = _vm->_graphicsManager.Reel_Zoom(v6, v21); + } else { + v9 = v15; + if (v15 < 0) + v9 = -v15; + v6 = v9; + v17 = -_vm->_graphicsManager.Reel_Zoom(v9, v21); + } + } + + if (v20) { + if (v15 >= 0) { + v22 = _vm->_graphicsManager.Reel_Reduc(v15, v20); + } else { + v10 = v15; + if (v15 < 0) + v10 = -v15; + v15 = v10; + v22 = -_vm->_graphicsManager.Reel_Reduc(v10, v20); + } + if (v6 >= 0) { + v17 = _vm->_graphicsManager.Reel_Reduc(v6, v20); + } else { + v11 = v15; + if (v15 < 0) + v11 = -v15; + v17 = -_vm->_graphicsManager.Reel_Reduc(v11, v20); + } + } + + v13 = _vm->_globals.Bob[idx].xp - v22; + v14 = _vm->_globals.Bob[idx].yp - v17; + _vm->_globals.Bob[idx].isActive = true; + _vm->_globals.Bob[idx].oldX = v13; + _vm->_globals.Bob[idx].oldY = v14; + _vm->_globals.Bob[idx].oldY2 = v21; + _vm->_globals.Bob[idx].field4A = v20; + + _vm->_globals.Liste2[idx].field0 = 1; + _vm->_globals.Liste2[idx].xp = v13; + _vm->_globals.Liste2[idx].yp = v14; + + int width = Get_Largeur(_vm->_globals.Bob[idx].spriteData, _vm->_globals.Bob[idx].frameIndex); + int height = Get_Hauteur(_vm->_globals.Bob[idx].spriteData, _vm->_globals.Bob[idx].frameIndex); + + if (v21) { + width = _vm->_graphicsManager.Reel_Zoom(width, v21); + height = _vm->_graphicsManager.Reel_Zoom(height, v21); + } + if (v20) { + height = _vm->_graphicsManager.Reel_Reduc(height, v20); + width = _vm->_graphicsManager.Reel_Reduc(width, v20); + } + + _vm->_globals.Liste2[idx].width = width; + _vm->_globals.Liste2[idx].height = height; + _vm->_globals.Bob[idx].oldWidth = width; + _vm->_globals.Bob[idx].oldHeight = height; + } +} + +void ObjectsManager::VERIFCACHE() { + int v1; + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + + v8 = 0; + do { + if (_vm->_globals.Cache[v8].fieldA > 0) { + v7 = _vm->_globals.Cache[v8].fieldA; + v10 = 0; + do { + if (Sprite[v10].field0 == 1) { + if (Sprite[v10].spriteIndex != 250) { + v1 = Sprite[v10].field2C; + v11 = Sprite[v10].field30 + v1; + v2 = Sprite[v10].field32 + Sprite[v10].field2E; + v6 = _vm->_globals.Cache[v8].field0; + v3 = _vm->_globals.Cache[v8].field4; + v9 = _vm->_globals.Cache[v8].field6 + v6; + + if (v2 > v3) { + if (v2 < (_vm->_globals.Cache[v8].field14 + _vm->_globals.Cache[v8].field8 + v3)) { + v4 = 0; + if (v11 >= v6 && v11 <= v9) { + ++_vm->_globals.Cache[v8].fieldA; + v4 = 1; + } + if (!v4) { + if (v6 <= v1 && v9 >= v1) { + ++_vm->_globals.Cache[v8].fieldA; + v4 = 1; + } + if (!v4) { + if (v9 >= v1 && v6 <= v1) { + ++_vm->_globals.Cache[v8].fieldA; + v4 = 1; + } + if (!v4) { + if (v6 <= v1 && v11 <= v9) { + ++_vm->_globals.Cache[v8].fieldA; + v4 = 1; + } + if (!v4 && v6 >= v1 && v11 >= v9) + ++_vm->_globals.Cache[v8].fieldA; + } + } + } + } + } + } + } + + ++v10; + } while (v10 <= 4); + + SCBOB(v8); + if (_vm->_globals.Cache[v8].fieldA == v7) { + if (_vm->_globals.Cache[v8].field10 == 1) { + _vm->_globals.Cache[v8].field10 = 0; + _vm->_globals.Cache[v8].fieldA = 1; + } + } else { + v5 = _vm->_globals.Cache[v8].field14 + _vm->_globals.Cache[v8].field8 + + _vm->_globals.Cache[v8].field4; + if (v5 > 440) + v5 = 500; + + AvantTri(TRI_CACHE, v8, v5); + _vm->_globals.Cache[v8].fieldA = 1; + _vm->_globals.Cache[v8].field10 = 1; + } + } + ++v8; + } while (v8 <= 19); +} + +void ObjectsManager::DEF_SPRITE(int idx) { + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + + v2 = idx; + if (Sprite[v2].field2A) { + v3 = Sprite[v2].field2C; + v4 = Sprite[v2].field2E; + if (Sprite[v2].field28) + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, Sprite[v2].spriteData, + v3 + 300, v4 + 300, Sprite[v2].spriteIndex); + else + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, Sprite[v2].spriteData, + v3 + 300, v4 + 300, Sprite[v2].spriteIndex, Sprite[v2].field36, Sprite[v2].field34, Sprite[v2].fieldE); + + v5 = idx; + v6 = idx; + _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].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].height -= _vm->_graphicsManager.min_y - v9; + _vm->_globals.Liste[v5].field4 = v10; + } + v11 = _vm->_globals.Liste[v5].field2; + 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].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; + if (_vm->_globals.Liste[v13].field0 == 1) + _vm->_graphicsManager.Ajoute_Segment_Vesa( + _vm->_globals.Liste[v13].field2, + _vm->_globals.Liste[v13].field4, + _vm->_globals.Liste[v13].field2 + _vm->_globals.Liste[v13].width, + _vm->_globals.Liste[v13].field4 + _vm->_globals.Liste[v13].height); + } +} + +void ObjectsManager::DEF_CACHE(int idx) { + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, _vm->_globals.CACHE_BANQUE[1], + _vm->_globals.Cache[idx].field0 + 300, _vm->_globals.Cache[idx].field4 + 300, + _vm->_globals.Cache[idx].field2); + + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_globals.Cache[idx].field0, + _vm->_globals.Cache[idx].field4, + _vm->_globals.Cache[idx].field0 + _vm->_globals.Cache[idx].field6, + _vm->_globals.Cache[idx].field4 + _vm->_globals.Cache[idx].field8); +} + +// Compute Sprite +void ObjectsManager::CALCUL_SPRITE(int idx) { + int width, height; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v15; + int v16; + int v17; + int v22; + + Sprite[idx].field2A = 0; + int spriteIndex = Sprite[idx].spriteIndex; + if (spriteIndex != 250) { + if (Sprite[idx].fieldE) { + v5 = get_offsetx(Sprite[idx].spriteData, spriteIndex, 1); + v22 = Sprite[idx].field12 + v5; + v4 = Sprite[idx].field12 + v5; + v6 = get_offsety(Sprite[idx].spriteData, Sprite[idx].spriteIndex, 1); + } else { + v3 = get_offsetx(Sprite[idx].spriteData, spriteIndex, 0); + v22 = Sprite[idx].field12 + v3; + v4 = Sprite[idx].field12 + v3; + v6 = get_offsety(Sprite[idx].spriteData, Sprite[idx].spriteIndex, 0); + } + + v9 = Sprite[idx].field14 + v6; + v7 = v9; + v8 = v9; + int zoomPercent = 0; + int reducePercent = 0; + + v9 = Sprite[idx].fieldC; + if (v9 < 0) { + v9 = v9; + if (v9 < 0) + v9 = -v9; + reducePercent = v9; + if (v9 > 95) + reducePercent = 95; + } + if (Sprite[idx].fieldC > 0) + zoomPercent = Sprite[idx].fieldC; + + if (zoomPercent) { + if (v4 >= 0) { + v22 = _vm->_graphicsManager.Reel_Zoom(v4, zoomPercent); + } else { + v10 = v4; + + if (v4 < 0) + v10 = -v4; + v4 = v10; + v22 = -_vm->_graphicsManager.Reel_Zoom(v10, zoomPercent); + } + + if (v8 >= 0) { + v7 = _vm->_graphicsManager.Reel_Zoom(v8, zoomPercent); + } else { + v11 = v4; + if (v4 < 0) + v11 = -v4; + v8 = v11; + v7 = -_vm->_graphicsManager.Reel_Zoom(v11, zoomPercent); + } + } + if (reducePercent) { + if (v4 >= 0) { + v22 = _vm->_graphicsManager.Reel_Reduc(v4, reducePercent); + } else { + v12 = v4; + if (v4 < 0) + v12 = -v4; + v4 = v12; + v22 = -_vm->_graphicsManager.Reel_Reduc(v12, reducePercent); + } + if (v8 >= 0) { + v7 = _vm->_graphicsManager.Reel_Reduc(v8, reducePercent); + } else { + v13 = v4; + if (v4 < 0) + v13 = -v4; + v7 = -_vm->_graphicsManager.Reel_Reduc(v13, reducePercent); + } + } + + v15 = Sprite[idx].spritePos.x - v22; + v16 = Sprite[idx].spritePos.y - v7; + Sprite[idx].field2C = v15; + Sprite[idx].field2E = v16; + Sprite[idx].field2A = 1; + Sprite[idx].field34 = zoomPercent; + Sprite[idx].field36 = reducePercent; + + v17 = idx; + _vm->_globals.Liste[v17].field0 = 1; + _vm->_globals.Liste[v17].field2 = v15; + _vm->_globals.Liste[v17].field4 = v16; + width = Get_Largeur(Sprite[idx].spriteData, Sprite[idx].spriteIndex); + height = Get_Hauteur(Sprite[idx].spriteData, Sprite[idx].spriteIndex); + + if (zoomPercent) { + width = _vm->_graphicsManager.Reel_Zoom(width, zoomPercent); + height = _vm->_graphicsManager.Reel_Zoom(height, zoomPercent); + } + + if (reducePercent) { + height = _vm->_graphicsManager.Reel_Reduc(height, reducePercent); + width = _vm->_graphicsManager.Reel_Reduc(width, reducePercent); + } + + Sprite[idx].field30 = width; + Sprite[idx].field32 = height; + } +} + +// Before Sort +int ObjectsManager::AvantTri(TriMode triMode, int index, int priority) { + int result; + + ++_vm->_globals.NBTRI; + if (_vm->_globals.NBTRI > 48) + error("NBTRI too high"); + + result = _vm->_globals.NBTRI; + _vm->_globals.Tri[result].triMode = triMode; + _vm->_globals.Tri[result].index = index; + _vm->_globals.Tri[result].priority = priority; + + return result; +} + +// Display BOB Anim +void ObjectsManager::AFF_BOB_ANIM() { + int v1; + int v2; + int v5; + int v6; + int v7; + int v8; + int v10; + int v11; + int v12; + int v13; + int v14; + int v18; + int v19; + byte *v20; + byte *v21; + int v22; + int v24; + int v26; + int v27; + int v28; + + int idx = 0; + do { + ++idx; + if (idx <= 20 && PERSO_ON == true) { + _vm->_globals.Bob[idx].field1C = 0; + continue; + } + + if (_vm->_globals.Bob[idx].field0 == 10) { + _vm->_globals.Bob[idx].field1C = 0; + v1 = _vm->_globals.Bob[idx].field20; + if (v1 == -1) + v1 = 50; + if (_vm->_globals.Bob[idx].animData == g_PTRNUL || _vm->_globals.Bob[idx].field16 || v1 <= 0) + goto LABEL_38; + + v2 = _vm->_globals.Bob[idx].field14; + if (_vm->_globals.Bob[idx].field12 == v2) { + _vm->_globals.Bob[idx].field1C = 1; + } else { + _vm->_globals.Bob[idx].field14 = v2 + 1; + _vm->_globals.Bob[idx].field1C = 0; + } + + if (_vm->_globals.Bob[idx].field1C != 1) + goto LABEL_38; + + v20 = _vm->_globals.Bob[idx].animData + 20; + v24 = _vm->_globals.Bob[idx].field10; + _vm->_globals.Bob[idx].xp = (int16)READ_LE_UINT16(v20 + 2 * v24); + if (_vm->_globals.BL_ANIM[idx].v1 == 1) + _vm->_globals.Bob[idx].xp = _vm->_globals.BL_ANIM[idx].v2; + if ( PERSO_ON == true && idx > 20 ) + _vm->_globals.Bob[idx].xp += _vm->_eventsManager.start_x; + + _vm->_globals.Bob[idx].yp = (int16)READ_LE_UINT16(v20 + 2 * v24 + 2); + _vm->_globals.Bob[idx].field12 = (int16)READ_LE_UINT16(v20 + 2 * v24 + 4); + _vm->_globals.Bob[idx].field36 = (int16)READ_LE_UINT16(v20 + 2 * v24 + 6); + _vm->_globals.Bob[idx].frameIndex = *(v20 + 2 * v24 + 8); + _vm->_globals.Bob[idx].field38 = *(v20 + 2 * v24 + 9); + _vm->_globals.Bob[idx].field10 += 5; + v5 = _vm->_globals.Bob[idx].field12; + + if (v5 > 0) { + v6 = v5 / _vm->_globals.vitesse; + _vm->_globals.Bob[idx].field12 = v5 / _vm->_globals.vitesse; + if (v6 > 0) { +LABEL_37: + _vm->_globals.Bob[idx].field14 = 1; +LABEL_38: + v12 = idx; + + if ((unsigned int)(_vm->_globals.Bob[v12].field1E - 1) <= 1u) + _vm->_globals.Bob[v12].field1C = 1; + continue; + } + + _vm->_globals.Bob[idx].field12 = 1; + } + if (!_vm->_globals.Bob[idx].field12) { + v7 = _vm->_globals.Bob[idx].field20; + if (v7 > 0) + _vm->_globals.Bob[idx].field20 = v7 - 1; + v8 = _vm->_globals.Bob[idx].field20; + if (v8 != -1 && v8 <= 0) { + _vm->_globals.Bob[idx].field0 = 11; + } else { + _vm->_globals.Bob[idx].field10 = 0; + v21 = _vm->_globals.Bob[idx].animData + 20; + _vm->_globals.Bob[idx].xp = (int16)READ_LE_UINT16(v21); + + if (_vm->_globals.BL_ANIM[idx].v1 == 1) + _vm->_globals.Bob[idx].xp = _vm->_globals.BL_ANIM[idx].v2; + if (PERSO_ON == true && idx > 20) + _vm->_globals.Bob[idx].xp += _vm->_eventsManager.start_x; + + _vm->_globals.Bob[idx].yp = (int16)READ_LE_UINT16(v21 + 2); + _vm->_globals.Bob[idx].field12 = (int16)READ_LE_UINT16(v21 + 4); + _vm->_globals.Bob[idx].field36 = (int16)READ_LE_UINT16(v21 + 6); + _vm->_globals.Bob[idx].frameIndex = *(v21 + 8); + _vm->_globals.Bob[idx].field38 = *(v21 + 9); + _vm->_globals.Bob[idx].field10 += 5; + v10 = _vm->_globals.Bob[idx].field12; + + if (v10 > 0) { + v11 = v10 / _vm->_globals.vitesse; + _vm->_globals.Bob[idx].field12 = v10 / _vm->_globals.vitesse; + if (v11 <= 0) + _vm->_globals.Bob[idx].field12 = 1; + } + } + } + + goto LABEL_37; + } + } while (idx != 35); + + if (!PERSO_ON && BOBTOUS == true) { + v26 = 0; + do { + v13 = v26; + if (_vm->_globals.Bob[v13].field0 == 10 && !_vm->_globals.Bob[v13].field16) + _vm->_globals.Bob[v13].field1C = 1; + ++v26; + } while (v26 != 35); + } + + BOBTOUS = false; + v27 = 0; + + do { + ++v27; + if (v27 > 20 || PERSO_ON != true) { + if (_vm->_globals.Bob[v27].field0 == 10) { + if (_vm->_globals.Bob[v27].field1C == 1) { + v14 = _vm->_globals.Bob[v27].field1E; + + if (v14 != 2) { + if (v14 != 4) { + if (_vm->_globals.Liste2[v27].field0) { + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, + _vm->_globals.Liste2[v27].xp, _vm->_globals.Liste2[v27].yp, + _vm->_globals.Liste2[v27].width, _vm->_globals.Liste2[v27].height, + _vm->_graphicsManager.VESA_BUFFER, _vm->_globals.Liste2[v27].xp, + _vm->_globals.Liste2[v27].yp); + _vm->_globals.Liste2[v27].field0 = 0; + } + } + } + } + } + + v22 = v27; + if (_vm->_globals.Bob[v22].field0 == 11) { + if (_vm->_globals.Liste2[v27].field0) { + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, + _vm->_globals.Liste2[v27].xp, _vm->_globals.Liste2[v27].yp, + _vm->_globals.Liste2[v27].width, _vm->_globals.Liste2[v27].height, + _vm->_graphicsManager.VESA_BUFFER, + _vm->_globals.Liste2[v27].xp, _vm->_globals.Liste2[v27].yp); + _vm->_globals.Liste2[v27].field0 = 0; + } + + _vm->_globals.Bob[v22].field0 = 0; + } + } + } while (v27 != 35); + + v28 = 0; + do { + ++v28; + v18 = v28; + _vm->_globals.Bob[v18].oldY = 0; + if (_vm->_globals.Bob[v18].field0 == 10 && !_vm->_globals.Bob[v18].field16 && _vm->_globals.Bob[v18].field1C == 1) { + CALCUL_BOB(v28); + int v = _vm->_globals.Bob[v18].oldHeight + _vm->_globals.Bob[v18].oldY; + v19 = _vm->_globals.Bob[v18].oldX2 + v; + + if (v19 > 450) + v19 = 600; + + if (_vm->_globals.Bob[v18].isActive) + AvantTri(TRI_BOB, v28, v19); + } + } while (v28 != 35); +} + +// Display VBOB +void ObjectsManager::AFF_VBOB() { + int width, height; + + int idx = 0; + do { + if (_vm->_globals.VBob[idx].field4 == 4) { + width = Get_Largeur(_vm->_globals.VBob[idx].spriteData, _vm->_globals.VBob[idx].frameIndex); + height = Get_Hauteur(_vm->_globals.VBob[idx].spriteData, _vm->_globals.VBob[idx].frameIndex); + + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_SCREEN, + _vm->_globals.VBob[idx].surface, _vm->_globals.VBob[idx].xp, + _vm->_globals.VBob[idx].yp, width, height); + + _vm->_graphicsManager.Restore_Mem( + _vm->_graphicsManager.VESA_BUFFER, _vm->_globals.VBob[idx].surface, + _vm->_globals.VBob[idx].xp, _vm->_globals.VBob[idx].yp, + width, height); + + _vm->_graphicsManager.Ajoute_Segment_Vesa( + _vm->_globals.VBob[idx].xp, _vm->_globals.VBob[idx].yp, + _vm->_globals.VBob[idx].xp + width, height + _vm->_globals.VBob[idx].yp); + + if (_vm->_globals.VBob[idx].surface != g_PTRNUL) + _vm->_globals.dos_free2(_vm->_globals.VBob[idx].surface); + + _vm->_globals.VBob[idx].field4 = 0; + _vm->_globals.VBob[idx].surface = g_PTRNUL; + _vm->_globals.VBob[idx].spriteData = g_PTRNUL; + _vm->_globals.VBob[idx].xp = 0; + _vm->_globals.VBob[idx].yp = 0; + _vm->_globals.VBob[idx].oldX = 0; + _vm->_globals.VBob[idx].oldY = 0; + _vm->_globals.VBob[idx].frameIndex = 0; + _vm->_globals.VBob[idx].oldFrameIndex = 0; + _vm->_globals.VBob[idx].oldSpriteData = g_PTRNUL; + } + + if (_vm->_globals.VBob[idx].field4 == 3) { + width = Get_Largeur(_vm->_globals.VBob[idx].oldSpriteData, _vm->_globals.VBob[idx].oldFrameIndex); + height = Get_Hauteur(_vm->_globals.VBob[idx].oldSpriteData, _vm->_globals.VBob[idx].oldFrameIndex); + + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_SCREEN, + _vm->_globals.VBob[idx].surface, _vm->_globals.VBob[idx].oldX, + _vm->_globals.VBob[idx].oldY, + width, height); + + _vm->_graphicsManager.Restore_Mem(_vm->_graphicsManager.VESA_BUFFER, + _vm->_globals.VBob[idx].surface, _vm->_globals.VBob[idx].oldX, + _vm->_globals.VBob[idx].oldY, width, height); + + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_globals.VBob[idx].oldX, + _vm->_globals.VBob[idx].oldY, _vm->_globals.VBob[idx].oldX + width, + _vm->_globals.VBob[idx].oldY + height); + + _vm->_globals.VBob[idx].field4 = 1; + _vm->_globals.VBob[idx].oldSpriteData = _vm->_globals.VBob[idx].spriteData; + + if (_vm->_globals.VBob[idx].surface != g_PTRNUL) + _vm->_globals.dos_free2(_vm->_globals.VBob[idx].surface); + + _vm->_globals.VBob[idx].surface = g_PTRNUL; + _vm->_globals.VBob[idx].oldX = _vm->_globals.VBob[idx].xp; + _vm->_globals.VBob[idx].oldY = _vm->_globals.VBob[idx].yp; + _vm->_globals.VBob[idx].oldFrameIndex = _vm->_globals.VBob[idx].frameIndex; + } + + if (_vm->_globals.VBob[idx].field4 == 1) { + width = Get_Largeur(_vm->_globals.VBob[idx].spriteData, _vm->_globals.VBob[idx].frameIndex); + height = Get_Hauteur(_vm->_globals.VBob[idx].spriteData, _vm->_globals.VBob[idx].frameIndex); + + if (_vm->_globals.VBob[idx].surface != g_PTRNUL) + _vm->_globals.dos_free2(_vm->_globals.VBob[idx].surface); + + byte *surface = _vm->_globals.dos_malloc2(height * width); + _vm->_globals.VBob[idx].surface = surface; + + _vm->_graphicsManager.Capture_Mem(_vm->_graphicsManager.VESA_SCREEN, surface, + _vm->_globals.VBob[idx].xp, _vm->_globals.VBob[idx].yp, width, height); + + byte *v10 = _vm->_globals.VBob[idx].spriteData; + if (*v10 == 78) { + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_SCREEN, v10, + _vm->_globals.VBob[idx].xp + 300, _vm->_globals.VBob[idx].yp + 300, + _vm->_globals.VBob[idx].frameIndex, + 0, 0, 0); + + _vm->_graphicsManager.Affiche_Perfect(_vm->_graphicsManager.VESA_BUFFER, + _vm->_globals.VBob[idx].spriteData, + _vm->_globals.VBob[idx].xp + 300, _vm->_globals.VBob[idx].yp + 300, + _vm->_globals.VBob[idx].frameIndex, + 0, 0, 0); + } else { + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_BUFFER, + v10, _vm->_globals.VBob[idx].xp + 300, _vm->_globals.VBob[idx].yp + 300, + _vm->_globals.VBob[idx].frameIndex); + + _vm->_graphicsManager.Sprite_Vesa(_vm->_graphicsManager.VESA_SCREEN, _vm->_globals.VBob[idx].spriteData, + _vm->_globals.VBob[idx].xp + 300, _vm->_globals.VBob[idx].yp + 300, + _vm->_globals.VBob[idx].frameIndex); + } + + _vm->_graphicsManager.Ajoute_Segment_Vesa(_vm->_globals.VBob[idx].xp, + _vm->_globals.VBob[idx].yp , _vm->_globals.VBob[idx].xp + width, + _vm->_globals.VBob[idx].yp + height); + _vm->_globals.VBob[idx].field4 = 2; + } + ++idx; + } while ( idx <= 29 ); +} + +int ObjectsManager::XSPR(int idx) { + if (idx > 5) + error("request of the Coord. x a sprite > MAX_SPRITE."); + return Sprite[idx].spritePos.x; +} + +int ObjectsManager::YSPR(int idx) { + if (idx > 5) + error("request of the Coord. y a sprite > MAX_SPRITE."); + return Sprite[idx].spritePos.y; +} + +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 = g_PTRNUL; + Sprite[idx].spriteData = g_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("Attempt to display a sprite > MAX_SPRITE."); + + Sprite[idx].field0 = 1; +} + +void ObjectsManager::SPRITE(const byte *spriteData, int xp, int yp, int idx, int spriteIndex, int a6, int a7, int a8, int a9) { + if (idx > 5) + error("Attempt to display a sprite > MAX_SPRITE."); + Sprite[idx].spriteData = spriteData; + Sprite[idx].spritePos = Common::Point(xp, yp); + Sprite[idx].spriteIndex = spriteIndex; + Sprite[idx].fieldC = a6; + Sprite[idx].field12 = a8; + Sprite[idx].field14 = a9; + Sprite[idx].field1C = g_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 != g_PTRNUL) + _vm->_globals.dos_free2(Sprite[idx].field1C); + Sprite[idx].field1C = g_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].spriteIndex); +} + +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].spriteIndex); +} + +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].spritePos.x = xp; +} + +void ObjectsManager::SETANISPR(int idx, int spriteIndex) { + if (idx > 5) + error("Set the Coord. x a sprite> MAX_SPRITE."); + + Sprite[idx].spriteIndex = spriteIndex; +} + +void ObjectsManager::SETYSPR(int idx, int yp) { + if ( idx > 5 ) + error("Set the Coord. y a sprite> MAX_SPRITE."); + Sprite[idx].spritePos.y = yp; +} + +// Set Sprite Size +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() { + int v0; + int v1; + int v2; + uint16 v3; + int v4; + + v0 = _vm->_eventsManager.XMOUSE(); + v1 = _vm->_eventsManager.YMOUSE(); + v2 = v1; + if (_vm->_globals.PLAN_FLAG + || _vm->_eventsManager.start_x >= v0 + || (v1 = _vm->_graphicsManager.ofscroll + 54, v0 >= v1) + || (v1 = v2 - 1, (uint16)(v2 - 1) > 0x3Bu)) { + if (FLAG_VISIBLE == true) + FLAG_VISIBLE_EFFACE = 4; + FLAG_VISIBLE = false; + } else { + FLAG_VISIBLE = true; + } + if (FORCEZONE == 1) { + _vm->_globals.compteur_71 = 100; + _vm->_globals.old_zone_68 = -1; + _vm->_globals.old_x_69 = -200; + _vm->_globals.old_y_70 = -220; + FORCEZONE = 0; + } + v3 = _vm->_globals.compteur_71 + 1; + _vm->_globals.compteur_71 = v3; + if (v3 > 1u) { + if (_vm->_globals.NOMARCHE || (_vm->_globals.chemin == (int16 *)g_PTRNUL) || v3 > 4u) { + _vm->_globals.compteur_71 = 0; + if (_vm->_globals.old_x_69 != v0 || _vm->_globals.old_y_70 != v2) { + v4 = MZONE(); + } else { + v4 = _vm->_globals.old_zone_68; + } + if (_vm->_globals.old_zone_68 != v4) { + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(4); + if (_vm->_globals.zozo_73 == 1) { + _vm->_fontManager.TEXTE_OFF(5); + _vm->_globals.zozo_73 = 0; + return; + } + if (_vm->_globals.old_zone_68 != v4) + goto LABEL_54; + } + if (v4 != -1) { +LABEL_54: + if (v4 != -1 + && ((_vm->_globals.ZONEP[v4].field6) + || _vm->_globals.ZONEP[v4].field7 + || _vm->_globals.ZONEP[v4].field8 + || _vm->_globals.ZONEP[v4].field9 + || _vm->_globals.ZONEP[v4].fieldA + || _vm->_globals.ZONEP[v4].fieldB + || _vm->_globals.ZONEP[v4].fieldC + || _vm->_globals.ZONEP[v4].fieldD + || _vm->_globals.ZONEP[v4].fieldE + || _vm->_globals.ZONEP[v4].fieldF)) { + if (_vm->_globals.old_zone_68 != v4) { + _vm->_fontManager.DOS_TEXT(5, _vm->_globals.ZONEP[v4].field12, _vm->_globals.FICH_ZONE, 0, 430, 20, 25, 0, 0, 252); + _vm->_fontManager.TEXTE_ON(5); + _vm->_globals.zozo_73 = 1; + } + _vm->_globals.force_to_data_0 += 25; + if (_vm->_globals.force_to_data_0 > 100) + _vm->_globals.force_to_data_0 = 0; + _vm->_graphicsManager.SETCOLOR4(251, _vm->_globals.force_to_data_0, _vm->_globals.force_to_data_0, + _vm->_globals.force_to_data_0); + if (_vm->_eventsManager.btsouris == 4) { + v1 = 5 * v4; + if (_vm->_globals.ZONEP[v4].field6 == 2) { + _vm->_eventsManager.CHANGE_MOUSE(16); + _vm->_eventsManager.btsouris = 16; + verbe = 16; + } + } + } else { + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(4); + } + } + NUMZONE = v4; + _vm->_globals.old_x_69 = v0; + _vm->_globals.old_y_70 = v2; + _vm->_globals.old_zone_68 = v4; + if (_vm->_globals.NOMARCHE == true) { + if (_vm->_eventsManager.btsouris == 4) { + v1 = v4 + 1; + if ((uint16)(v4 + 1) > 1u) + BTDROITE(); + } + } + if ((_vm->_globals.PLAN_FLAG == true && v4 == -1) || !v4) { + verbe = 0; + _vm->_eventsManager.btsouris = 0; + _vm->_eventsManager.CHANGE_MOUSE(0); + } + } + } +} + +void ObjectsManager::GOHOME() { + int16 v0; + int16 v1; + int16 v3; + int16 v4; + unsigned int v5; + unsigned int v6; + unsigned int v7; + unsigned int v8; + int16 v9; + int16 v10; + unsigned int v11; + unsigned int v12; + unsigned int v13; + unsigned int v14; + int v15; + int16 v16; + unsigned int v17; + unsigned int v18; + int v19; + int16 v20; + unsigned int v21; + unsigned int v22; + int16 v23; + int16 v24; + unsigned int v25; + unsigned int v26; + unsigned int v27; + unsigned int v28; + int16 v29; + int16 v30; + unsigned int v31; + unsigned int v32; + unsigned int v33; + unsigned int v34; + int16 v35; + int16 v36; + unsigned int v37; + unsigned int v38; + unsigned int v39; + unsigned int v40; + int16 v41; + int16 v42; + unsigned int v43; + unsigned int v44; + unsigned int v45; + unsigned int v46; + int16 v47; + int16 v48; + int16 v49; + int v50; + int16 v51; + int16 v52; + int16 v54; + int v55; + int16 v56; + int16 v57; + int16 v58; + + v0 = 0; + v58 = 0; + v1 = 0; + + if (_vm->_globals.chemin == (int16 *)g_PTRNUL) + return; + if (_vm->_globals.Compteur > 1) { + --_vm->_globals.Compteur; + return; + } + _vm->_globals.Compteur = 0; + if (_vm->_globals.g_old_sens == -1) { + VERIFTAILLE(); + nouveau_x = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + nouveau_y = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + nouveau_sens = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + nouveau_anim = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + if (nouveau_x != -1 || nouveau_y != -1) { + _vm->_globals.g_old_sens = nouveau_sens; + _vm->_globals.g_old_sens2 = nouveau_sens; + _vm->_globals.g_old_anim = 0; + g_old_x = nouveau_x; + g_old_y = nouveau_y; + } else { + SETANISPR(0, _vm->_globals.g_old_sens + 59); + _vm->_globals.ACTION_SENS = 0; + if (_vm->_globals.GOACTION == 1) + v54 = _vm->_globals.SAUVEGARDE->data[svField2]; + else + v54 = NUMZONE; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + VERIFTAILLE(); + SETFLIPSPR(0, 0); + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.g_old_sens = -1; + if (v54 > 0) { + v55 = v54; + if (_vm->_globals.ZONEP[v55].destX) { + v56 = _vm->_globals.ZONEP[v55].destY; + if (v56) { + if (v56 != 31) { + v57 = _vm->_globals.ZONEP[v55].field4; + if (v57 == -1) { + _vm->_globals.ZONEP[v55].destX = 0; + _vm->_globals.ZONEP[v55].destY = 0; + _vm->_globals.ZONEP[v55].field4 = 0; + } else { + SETANISPR(0, v57); + _vm->_globals.ACTION_SENS = _vm->_globals.ZONEP[v55].field4 - 59; + } + } + } + } + } + } +LABEL_241: + _vm->_globals.Compteur = 0; + return; + } + if (_vm->_globals.g_old_sens == 3) { + if ((uint16)(_vm->_globals.g_old_anim - 24) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v3 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v4 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + + if (Sprite[0].fieldC < 0) { + v5 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v5 = -Sprite[0].fieldC; + v3 = _vm->_graphicsManager.Reel_Reduc(v3, v5); + v6 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v6 = -Sprite[0].fieldC; + v4 = _vm->_graphicsManager.Reel_Reduc(v4, v6); + } + if (Sprite[0].fieldC > 0) { + v7 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v7 = -Sprite[0].fieldC; + v3 = _vm->_graphicsManager.Reel_Zoom(v3, v7); + v8 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v8 = -Sprite[0].fieldC; + v4 = _vm->_graphicsManager.Reel_Zoom(v4, v8); + } + v0 = v3 + g_old_x; + v58 = g_old_y + v4; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 35) + goto LABEL_23; + } + v1 = 24; +LABEL_23: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; + } + if (_vm->_globals.g_old_sens != 7) + goto LABEL_43; + if ((uint16)(_vm->_globals.g_old_anim - 24) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v9 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v10 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (Sprite[0].fieldC < 0) { + v11 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v11 = -Sprite[0].fieldC; + v9 = _vm->_graphicsManager.Reel_Reduc(v9, v11); + v12 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v12 = -Sprite[0].fieldC; + v10 = _vm->_graphicsManager.Reel_Reduc(v10, v12); + } + if (Sprite[0].fieldC > 0) { + v13 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v13 = -Sprite[0].fieldC; + v9 = _vm->_graphicsManager.Reel_Zoom(v9, v13); + v14 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v14 = -Sprite[0].fieldC; + v10 = _vm->_graphicsManager.Reel_Zoom(v10, v14); + } + v0 = g_old_x - v9; + v58 = g_old_y - v10; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 35) + goto LABEL_42; + } + v1 = 24; +LABEL_42: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; +LABEL_43: + if (_vm->_globals.g_old_sens != 1) + goto LABEL_60; + if (_vm->_globals.g_old_anim > 11) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v15 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (v15 < 0) + v15 = -v15; + v16 = v15; + if (Sprite[0].fieldC < 0) { + v17 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v17 = -Sprite[0].fieldC; + v16 = _vm->_graphicsManager.Reel_Reduc(v16, v17); + } + if (Sprite[0].fieldC > 0) { + v18 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v18 = -Sprite[0].fieldC; + v16 = _vm->_graphicsManager.Reel_Zoom(v16, v18); + } + v0 = g_old_x; + v58 = g_old_y - v16; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 11) + goto LABEL_59; + } + v1 = 0; +LABEL_59: + _vm->_globals.Compteur = 4 / _vm->_globals.vitesse; +LABEL_60: + if (_vm->_globals.g_old_sens != 5) + goto LABEL_77; + if ((uint16)(_vm->_globals.g_old_anim - 48) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v19 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (v19 < 0) + v19 = -v19; + v20 = v19; + if (Sprite[0].fieldC < 0) { + v21 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v21 = -Sprite[0].fieldC; + v20 = _vm->_graphicsManager.Reel_Reduc(v20, v21); + } + if (Sprite[0].fieldC > 0) { + v22 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v22 = -Sprite[0].fieldC; + v20 = _vm->_graphicsManager.Reel_Zoom(v20, v22); + } + v0 = g_old_x; + v58 = v20 + g_old_y; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 59) + goto LABEL_76; + } + v1 = 48; +LABEL_76: + _vm->_globals.Compteur = 4 / _vm->_globals.vitesse; +LABEL_77: + if (_vm->_globals.g_old_sens != 2) + goto LABEL_96; + if ((uint16)(_vm->_globals.g_old_anim - 12) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v23 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v24 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (Sprite[0].fieldC < 0) { + v25 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v25 = -Sprite[0].fieldC; + v23 = _vm->_graphicsManager.Reel_Reduc(v23, v25); + v26 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v26 = -Sprite[0].fieldC; + v24 = _vm->_graphicsManager.Reel_Reduc(v24, v26); + } + if (Sprite[0].fieldC > 0) { + v27 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v27 = -Sprite[0].fieldC; + v23 = _vm->_graphicsManager.Reel_Zoom(v23, v27); + v28 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v28 = -Sprite[0].fieldC; + v24 = _vm->_graphicsManager.Reel_Zoom(v24, v28); + } + v0 = v23 + g_old_x; + v58 = g_old_y + v24; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 23) + goto LABEL_95; + } + v1 = 12; +LABEL_95: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; +LABEL_96: + if (_vm->_globals.g_old_sens != 8) + goto LABEL_115; + if ((uint16)(_vm->_globals.g_old_anim - 12) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v29 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v30 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (Sprite[0].fieldC < 0) { + v31 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v31 = -Sprite[0].fieldC; + v29 = _vm->_graphicsManager.Reel_Reduc(v29, v31); + v32 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v32 = -Sprite[0].fieldC; + v30 = _vm->_graphicsManager.Reel_Reduc(v30, v32); + } + if (Sprite[0].fieldC > 0) { + v33 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v33 = -Sprite[0].fieldC; + v29 = _vm->_graphicsManager.Reel_Zoom(v29, v33); + v34 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v34 = -Sprite[0].fieldC; + v30 = _vm->_graphicsManager.Reel_Zoom(v30, v34); + } + v0 = g_old_x - v29; + v58 = g_old_y + v30; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 23) + goto LABEL_114; + } + v1 = 12; +LABEL_114: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; +LABEL_115: + if (_vm->_globals.g_old_sens != 4) + goto LABEL_134; + if ((uint16)(_vm->_globals.g_old_anim - 36) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v35 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v36 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (Sprite[0].fieldC < 0) { + v37 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v37 = -Sprite[0].fieldC; + v35 = _vm->_graphicsManager.Reel_Reduc(v35, v37); + v38 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v38 = -Sprite[0].fieldC; + v36 = _vm->_graphicsManager.Reel_Reduc(v36, v38); + } + if (Sprite[0].fieldC > 0) { + v39 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v39 = -Sprite[0].fieldC; + v35 = _vm->_graphicsManager.Reel_Zoom(v35, v39); + v40 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v40 = -Sprite[0].fieldC; + v36 = _vm->_graphicsManager.Reel_Zoom(v36, v40); + } + v0 = v35 + g_old_x; + v58 = g_old_y + v36; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 47) + goto LABEL_133; + } + v1 = 36; +LABEL_133: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; +LABEL_134: + if (_vm->_globals.g_old_sens != 6) + goto LABEL_153; + if ((uint16)(_vm->_globals.g_old_anim - 36) > 0xBu) { + v0 = g_old_x; + v58 = g_old_y; + } else { + v41 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field0; + v42 = _vm->_globals.Hopkins[_vm->_globals.g_old_anim].field2; + if (Sprite[0].fieldC < 0) { + v43 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v43 = -Sprite[0].fieldC; + v41 = _vm->_graphicsManager.Reel_Reduc(v41, v43); + v44 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v44 = -Sprite[0].fieldC; + v42 = _vm->_graphicsManager.Reel_Reduc(v42, v44); + } + if (Sprite[0].fieldC > 0) { + v45 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v45 = -Sprite[0].fieldC; + v41 = _vm->_graphicsManager.Reel_Zoom(v41, v45); + v46 = Sprite[0].fieldC; + if (Sprite[0].fieldC < 0) + v46 = -Sprite[0].fieldC; + v42 = _vm->_graphicsManager.Reel_Zoom(v42, v46); + } + v0 = g_old_x - v41; + v58 = g_old_y + v42; + v1 = _vm->_globals.g_old_anim + 1; + if (_vm->_globals.g_old_anim != 47) + goto LABEL_152; + } + v1 = 36; +LABEL_152: + _vm->_globals.Compteur = 5 / _vm->_globals.vitesse; +LABEL_153: + v47 = 0; + do { + nouveau_x = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + v48 = *_vm->_globals.chemin; + nouveau_y = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + nouveau_sens = *_vm->_globals.chemin; + _vm->_globals.chemin++; + nouveau_anim = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + if (nouveau_x == -1 && v48 == -1) { + if (_vm->_globals.GOACTION == 1) + v49 = _vm->_globals.SAUVEGARDE->data[svField2]; + else + v49 = NUMZONE; + SETANISPR(0, _vm->_globals.g_old_sens + 59); + _vm->_globals.ACTION_SENS = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + VERIFTAILLE(); + SETFLIPSPR(0, 0); + _vm->_globals.Compteur = 0; + _vm->_globals.g_old_sens = -1; + g_old_x = XSPR(0); + g_old_y = YSPR(0); + + if (v49 > 0) { + v50 = v49; + if (_vm->_globals.ZONEP[v50].destX) { + v51 = _vm->_globals.ZONEP[v50].destY; + if (v51) { + if (v51 != 31) { + v52 = _vm->_globals.ZONEP[v50].field4; + if (v52 == -1) { + _vm->_globals.ZONEP[v50].destX = 0; + _vm->_globals.ZONEP[v50].destY = 0; + _vm->_globals.ZONEP[v50].field4 = 0; + } else { + SETANISPR(0, v52); + _vm->_globals.ACTION_SENS = _vm->_globals.ZONEP[v50].field4 - 59; + } + } + } + } + } + goto LABEL_241; + } + if (_vm->_globals.g_old_sens != nouveau_sens) + break; + if (nouveau_sens == 3 && nouveau_x >= v0) + v47 = 1; + if (_vm->_globals.g_old_sens == 7 && nouveau_x <= v0) + v47 = 1; + if (_vm->_globals.g_old_sens == 1 && nouveau_y <= v58) + v47 = 1; + if (_vm->_globals.g_old_sens == 5 && nouveau_y >= v58) + v47 = 1; + if (_vm->_globals.g_old_sens == 2 && nouveau_x >= v0) + v47 = 1; + if (_vm->_globals.g_old_sens == 8 && nouveau_x <= v0) + v47 = 1; + if (_vm->_globals.g_old_sens == 4 && nouveau_x >= v0) + v47 = 1; + if (_vm->_globals.g_old_sens == 6 && nouveau_x <= v0) + v47 = 1; + } while (v47 != 1); + if (v47 == 1) { + VERIFTAILLE(); + if (_vm->_globals.g_old_sens == 7) + SETFLIPSPR(0, 1); + if (_vm->_globals.g_old_sens == 3) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 1) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 5) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 2) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 8) + SETFLIPSPR(0, 1); + if (_vm->_globals.g_old_sens == 4) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 6) + SETFLIPSPR(0, 1); + SETXSPR(0, nouveau_x); + SETYSPR(0, nouveau_y); + SETANISPR(0, v1); + } else { + if (_vm->_globals.g_old_sens == 7) + SETFLIPSPR(0, 1); + if (_vm->_globals.g_old_sens == 3) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 1) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 5) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 2) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 8) + SETFLIPSPR(0, 1); + if (_vm->_globals.g_old_sens == 4) + SETFLIPSPR(0, 0); + if (_vm->_globals.g_old_sens == 6) + SETFLIPSPR(0, 1); + _vm->_globals.Compteur = 0; + } + _vm->_globals.g_old_sens = nouveau_sens; + _vm->_globals.g_old_sens2 = nouveau_sens; + _vm->_globals.g_old_anim = v1; + g_old_x = nouveau_x; + g_old_y = nouveau_y; +} + +void ObjectsManager::GOHOME2() { + signed int v0; + int16 v2; + + v0 = 2; + if (_vm->_globals.chemin != (int16 *)g_PTRNUL) { + if (_vm->_globals.vitesse == 2) + v0 = 4; + if (_vm->_globals.vitesse == 3) + v0 = 6; + _vm->_globals.j_104 = 0; + if (v0) { + while (1) { + nouveau_x = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + v2 = *_vm->_globals.chemin; + nouveau_y = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + nouveau_sens = *_vm->_globals.chemin; + _vm->_globals.chemin++; + nouveau_anim = *_vm->_globals.chemin; + _vm->_globals.chemin++; + + if (nouveau_x == -1) { + if (v2 == -1) + break; + } + ++_vm->_globals.j_104; + if (_vm->_globals.j_104 >= v0) + goto LABEL_19; + } + if (_vm->_globals.last_sens == 1) + SETANISPR(0, 0); + if (_vm->_globals.last_sens == 3) + SETANISPR(0, 1); + if (_vm->_globals.last_sens == 5) + SETANISPR(0, 2); + if (_vm->_globals.last_sens == 7) + SETANISPR(0, 3); + + _vm->_globals.chemin = (int16 *)g_PTRNUL; + my_anim = 0; + A_ANIM = 0; + A_DEPA = 0; + } else { +LABEL_19: + _vm->_globals.last_sens = nouveau_sens; + SETXSPR(0, nouveau_x); + SETYSPR(0, nouveau_y); + if (_vm->_globals.last_sens == 1) + SETANISPR(0, 4); + if (_vm->_globals.last_sens == 3) + SETANISPR(0, 5); + if (_vm->_globals.last_sens == 5) + SETANISPR(0, 6); + if (_vm->_globals.last_sens == 7) + SETANISPR(0, 7); + + if (my_anim++ > 1) + my_anim = 0; + } + } +} + +// Load Obstacle +void ObjectsManager::CHARGE_OBSTACLE(const Common::String &file) { + int16 v1; + byte *ptr; + int16 v4; + int16 v5; + + _vm->_linesManager.RESET_OBSTACLE(); + _vm->_linesManager.TOTAL_LIGNES = 0; + DERLIGNE = 0; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, file); + ptr = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + v4 = 0; + v5 = 0; + do { + v1 = (int16)READ_LE_UINT16((uint16 *)ptr + v4); + if (v1 != -1) { + _vm->_linesManager.AJOUTE_LIGNE( + v5, + v1, + (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 1), + (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 2), + (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 3), + (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 4), + 1); + ++_vm->_linesManager.TOTAL_LIGNES; + } + v4 += 5; + ++v5; + } while (v1 != -1); + _vm->_linesManager.INIPARCOURS(); + _vm->_globals.dos_free2(ptr); +} + +// Load Zone +void ObjectsManager::CHARGE_ZONE(const Common::String &file) { + signed int v1; + int v2; + int v3; + int v4; + int v5; + int v6; + int16 v7; + int v8; + byte *v9; + int v10; + signed int v11; + int v12; + byte *v13; + int v14; + signed int v15; + int16 v17; + int16 v18; + byte *ptr; + + v1 = 1; + do { + v2 = v1; + _vm->_globals.ZONEP[v2].destX = 0; + _vm->_globals.ZONEP[v2].destY = 0; + _vm->_globals.ZONEP[v2].field4 = 0; + _vm->_globals.ZONEP[v2].field6 = 0; + _vm->_globals.ZONEP[v2].field7 = 0; + _vm->_globals.ZONEP[v2].field8 = 0; + _vm->_globals.ZONEP[v2].field9 = 0; + _vm->_globals.ZONEP[v2].fieldA = 0; + _vm->_globals.ZONEP[v2].fieldB = 0; + _vm->_globals.ZONEP[v2].fieldC = 0; + _vm->_globals.ZONEP[v2].fieldD = 0; + _vm->_globals.ZONEP[v2].fieldE = 0; + _vm->_globals.ZONEP[v2].fieldF = 0; + _vm->_globals.ZONEP[v2].field12 = 0; + _vm->_globals.ZONEP[v2].field10 = 0; + ++v1; + } while (v1 <= 100); + + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, file); + + Common::File f; + if (!f.exists(_vm->_globals.NFICHIER)) + error("File not found : %s", _vm->_globals.NFICHIER.c_str()); + + ptr = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + v4 = 0; + v18 = 0; + v17 = 0; + do { + v3 = (int16)READ_LE_UINT16((uint16 *)ptr + v4); + if (v3 != -1) { + v5 = v3; + v6 = v3; + _vm->_linesManager.AJOUTE_LIGNE_ZONE( + v18, + READ_LE_UINT16((uint16 *)ptr + v4 + 1), + READ_LE_UINT16((uint16 *)ptr + v4 + 2), + READ_LE_UINT16((uint16 *)ptr + v4 + 3), + READ_LE_UINT16((uint16 *)ptr + v4 + 4), + v3); + _vm->_globals.ZONEP[v5].field10 = 1; + v3 = v6; + } + v4 += 5; + ++v18; + ++v17; + } while (v3 != -1); + v7 = 1; + do { + v8 = v7; + _vm->_globals.ZONEP[v8].destX = (int16)READ_LE_UINT16((uint16 *)ptr + v4); + _vm->_globals.ZONEP[v8].destY = (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 1); + _vm->_globals.ZONEP[v8].field4 = (int16)READ_LE_UINT16((uint16 *)ptr + v4 + 2); + v4 += 3; + ++v7; + } while (v7 <= 100); + + v9 = (ptr + 10 * v17 + 606); + v10 = 0; + v11 = 1; + do { + v12 = v11; + + _vm->_globals.ZONEP[v12].field6 = *(v10 + v9); + _vm->_globals.ZONEP[v12].field7 = *(v9 + v10 + 1); + _vm->_globals.ZONEP[v12].field8 = *(v9 + v10 + 2); + _vm->_globals.ZONEP[v12].field9 = *(v9 + v10 + 3); + _vm->_globals.ZONEP[v12].fieldA = *(v9 + v10 + 4); + _vm->_globals.ZONEP[v12].fieldB = *(v9 + v10 + 5); + _vm->_globals.ZONEP[v12].fieldC = *(v9 + v10 + 6); + _vm->_globals.ZONEP[v12].fieldD = *(v9 + v10 + 7); + _vm->_globals.ZONEP[v12].fieldE = *(v9 + v10 + 8); + _vm->_globals.ZONEP[v12].fieldF = *(v9 + v10 + 9); + + v10 += 10; + ++v11; + } while (v11 <= 100); + v13 = v9 + 1010; + v14 = 0; + v15 = 1; + do + _vm->_globals.ZONEP[v15++].field12 = READ_LE_UINT16(v13 + 2 * v14++); + while (v15 <= 100); + + _vm->_globals.dos_free2(ptr); + CARRE_ZONE(); +} + +// Square Zone +void ObjectsManager::CARRE_ZONE() { + int16 *dataP; + int v4; + int v5; + int v7; + int v8; + int v10; + int v11; + int v12; + int v13; + int v14; + + for (int idx = 0; idx < 100; ++idx) { + _vm->_globals.CarreZone[idx].field0 = 0; + _vm->_globals.CarreZone[idx].fieldE = 0; + _vm->_globals.CarreZone[idx].field2 = 1280; + _vm->_globals.CarreZone[idx].field4 = 0; + _vm->_globals.CarreZone[idx].field6 = 460; + _vm->_globals.CarreZone[idx].field8 = 0; + _vm->_globals.CarreZone[idx].fieldA = 401; + _vm->_globals.CarreZone[idx].fieldC = 0; + } + + for (int idx = 0; idx < 400; ++idx) { + dataP = _vm->_linesManager.LigneZone[idx].zoneData; + if (dataP != (int16 *)g_PTRNUL) { + v4 = _vm->_linesManager.LigneZone[idx].field2; + _vm->_globals.CarreZone[v4].field0 = 1; + if (_vm->_globals.CarreZone[v4].fieldC < idx) + _vm->_globals.CarreZone[v4].fieldC = idx; + if (_vm->_globals.CarreZone[v4].fieldA > idx) + _vm->_globals.CarreZone[v4].fieldA = idx; + + v13 = 0; + v12 = _vm->_linesManager.LigneZone[idx].count; + if (v12 > 0) { + do { + v5 = *dataP++; + v11 = *dataP++; + + if (_vm->_globals.CarreZone[v4].field2 >= v5) + _vm->_globals.CarreZone[v4].field2 = v5; + if (_vm->_globals.CarreZone[v4].field4 <= v5) + _vm->_globals.CarreZone[v4].field4 = v5; + if (_vm->_globals.CarreZone[v4].field6 >= v11) + _vm->_globals.CarreZone[v4].field6 = v11; + if (_vm->_globals.CarreZone[v4].field8 <= v11) + _vm->_globals.CarreZone[v4].field8 = v11; + ++v13; + } while (v13 < v12); + } + } + } + + v7 = 0; + do { + v8 = v7; + v10 = _vm->_globals.CarreZone[v8].field2 - _vm->_globals.CarreZone[v8].field4; + if (v10 < 0) + v10 = -v10; + v14 = _vm->_globals.CarreZone[v8].field6 - _vm->_globals.CarreZone[v8].field8; + if (v14 < 0) + v14 = -v14; + if (v10 == v14) + _vm->_globals.CarreZone[v8].fieldE = 1; + ++v7; + } while (v7 <= 99); +} + +void ObjectsManager::PLAN_BETA() { + int v1; + int v2; + int v3; + int v4; + int v5; + + v1 = 0; + _vm->_dialogsManager.INVENTFLAG = false; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + _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 = true; + _vm->_graphicsManager.NOFADE = false; + _vm->_globals.NOMARCHE = false; + sprite_ptr = g_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"); + _vm->_globals.CHARGE_CACHE("PLAN.CA2"); + CHARGE_ZONE("PLAN.ZO2"); + _vm->_fileManager.CONSTRUIT_SYSTEM("VOITURE.SPR"); + sprite_ptr = _vm->_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.CACHE_OFF(v2++); + } while (v2 <= 15); + _vm->_globals.CACHE_OFF(19); + _vm->_globals.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 = (int16 *)g_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 = true; + + v4 = 0; + do { + _vm->_eventsManager.VBL(); + ++v4; + } while (v4 <= 4); + + _vm->_globals.BPP_NOAFF = false; + _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->data[svField170] == 1 && !_vm->_globals.SAUVEGARDE->data[svField171]) { + _vm->_globals.SAUVEGARDE->data[svField171] = 1; + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("APPEL1.pe2"); + _vm->_globals.NOPARLE = false; + v5 = 0; + } + if (_vm->_globals.SAUVEGARDE->data[svField180] == 1 && !_vm->_globals.SAUVEGARDE->data[svField172]) { + _vm->_globals.SAUVEGARDE->data[svField172] = 1; + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("APPEL2.pe2"); + _vm->_globals.NOPARLE = false; + v5 = 0; + _vm->_eventsManager.souris_bb = false; + } + if (v5 == 1) + BTGAUCHE(); + } + + VERIFZONE(); + GOHOME2(); + + if (_vm->_globals.chemin == (int16 *)g_PTRNUL && _vm->_globals.GOACTION == 1) + PARADISE(); + _vm->_eventsManager.VBL(); + + if (_vm->_globals.SORTIE) + v1 = 1; + } while (!_vm->shouldQuit() && 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 = false; +} + +// Left Button +void ObjectsManager::BTGAUCHE() { + int srcX, srcY; + int destX, destY; + int v1; + int v2; + int16 *v3; + int16 *v4; + int16 *v5; + int zoneCount; + int zoneX; + int zoneY; + int16 *v9; + int v10; + int v11; + int v12; + int16 *v13; + int16 *v16; + int v17; + int v18; + + _vm->_fontManager.TEXTE_OFF(9); + destX = _vm->_eventsManager.XMOUSE(); + destY = _vm->_eventsManager.YMOUSE(); + + if (!_vm->_dialogsManager.INVENTFLAG && !_vm->_globals.PLAN_FLAG && destX > _vm->_graphicsManager.ofscroll - 30 && destX < _vm->_graphicsManager.ofscroll + 50 && (uint16)(destY + 29) <= 0x4Eu) { + v1 = _vm->_eventsManager.btsouris; + _vm->_dialogsManager.INVENTFLAG = true; + _vm->_dialogsManager.showInventory(); + _vm->_dialogsManager.INVENTFLAG = false; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + if (!_vm->_globals.SORTIE) { + _vm->_dialogsManager.INVENTFLAG = false; + _vm->_eventsManager.btsouris = v1; + } + return; + } + if (_vm->_globals.SAUVEGARDE->data[svField354] == 1 + && !_vm->_globals.PLAN_FLAG + && (uint16)(destX - 533) <= 0x1Au + && (uint16)(destY - 26) <= 0x21u) { + CHANGE_TETE(1, 0); + return; + } + if (_vm->_globals.SAUVEGARDE->data[svField356] == 1 + && !_vm->_globals.PLAN_FLAG + && (uint16)(destX - 533) <= 0x1Au + && (uint16)(destY - 26) <= 0x21u) { + CHANGE_TETE(2, 0); + return; + } + if (_vm->_globals.SAUVEGARDE->data[svField357] == 1) { + if (_vm->_globals.SAUVEGARDE->data[svField353] == 1 + && !_vm->_globals.PLAN_FLAG + && (uint16)(destX - 533) <= 0x1Au + && (uint16)(destY - 26) <= 0x21u) { + CHANGE_TETE(0, 1); + return; + } + if (_vm->_globals.SAUVEGARDE->data[svField355] == 1 + && !_vm->_globals.PLAN_FLAG + && (uint16)(destX - 567) <= 0x1Au + && (uint16)(destY - 26) <= 0x21u) { + CHANGE_TETE(0, 2); + return; + } + } + if (_vm->_globals.PLAN_FLAG == true) { + if (_vm->_globals.GOACTION != 1) + goto LABEL_38; + VERIFZONE(); + if (NUMZONE <= 0) + return; + v2 = 0; + v3 = _vm->_globals.essai2; + v4 = _vm->_globals.chemin; + do { + v3[v2] = v4[v2]; + ++v2; + } while (v4[v2] != -1); + + v5 = _vm->_globals.essai2; + v5[v2] = -1; + v5[v2 + 1] = -1; + v5[v2 + 2] = -1; + v5[v2 + 3] = -1; + } + if (_vm->_globals.GOACTION == 1) { + VERIFZONE(); + _vm->_globals.GOACTION = 0; + _vm->_globals.SAUVEGARDE->data[svField1] = 0; + _vm->_globals.SAUVEGARDE->data[svField2] = 0; + } +LABEL_38: + if (_vm->_globals.PLAN_FLAG == true && (_vm->_eventsManager.btsouris != 4 || NUMZONE <= 0)) + return; + if ((uint16)(NUMZONE + 1) > 1u) { + zoneCount = NUMZONE; + zoneX = _vm->_globals.ZONEP[zoneCount].destX; + if (zoneX) { + zoneY = _vm->_globals.ZONEP[zoneCount].destY; + if (zoneY) { + if (zoneY != 31) { + destX = zoneX; + destY = zoneY; + } + } + } + } + _vm->_globals.GOACTION = 0; + v9 = _vm->_globals.chemin; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + if (_vm->_globals.FORET && ((uint16)(NUMZONE - 20) <= 1u || (uint16)(NUMZONE - 22) <= 1u)) { + if (YSPR(0) <= 374 || YSPR(0) > 410) { + v10 = XSPR(0); + v11 = YSPR(0); + v12 = XSPR(0); + v13 = _vm->_linesManager.PARCOURS2(v12, v11, v10, 390); + _vm->_globals.chemin = v13; + if (v13 != (int16 *)g_PTRNUL) + PACOURS_PROPRE(v13); + g_old_x = XSPR(0); + g_old_y = YSPR(0); + _vm->_globals.Compteur = 0; + if (_vm->_globals.chemin != (int16 *)g_PTRNUL || v9 == _vm->_globals.chemin) { +LABEL_64: + _vm->_globals.g_old_sens = -1; + goto LABEL_65; + } + goto LABEL_63; + } + _vm->_globals.chemin = (int16 *)g_PTRNUL; + SETANISPR(0, _vm->_globals.g_old_sens2 + 59); + _vm->_globals.ACTION_SENS = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + VERIFTAILLE(); + SETFLIPSPR(0, 0); + _vm->_globals.Compteur = 0; + _vm->_globals.g_old_sens = -1; + goto LABEL_65; + } + if (!_vm->_globals.NOMARCHE) { + if (!_vm->_globals.PLAN_FLAG) { + srcY = YSPR(0); + srcX = XSPR(0); + v16 = _vm->_linesManager.PARCOURS2(srcX, srcY, destX, destY); + _vm->_globals.chemin = v16; + if (v16 != (int16 *)g_PTRNUL) + PACOURS_PROPRE(v16); + g_old_x = XSPR(0); + g_old_y = YSPR(0); + _vm->_globals.Compteur = 0; + if (_vm->_globals.chemin != (int16 *)g_PTRNUL || v9 == _vm->_globals.chemin) + goto LABEL_64; +LABEL_63: + _vm->_globals.chemin = v9; + } +LABEL_65: + if (!_vm->_globals.NOMARCHE && _vm->_globals.PLAN_FLAG == true) { + v17 = YSPR(0); + v18 = XSPR(0); + _vm->_globals.chemin = PARC_VOITURE(v18, v17, destX, destY); + } + } + if ((uint16)(NUMZONE + 1) > 1u) { + // TODO: Reformat the weird if statement generated by the decompiler + if (_vm->_eventsManager.btsouris == 23 || (_vm->_globals.SAUVEGARDE->data[svField1] = _vm->_eventsManager.btsouris, _vm->_eventsManager.btsouris == 23)) + _vm->_globals.SAUVEGARDE->data[svField1] = 5; + if (_vm->_globals.PLAN_FLAG == true) + _vm->_globals.SAUVEGARDE->data[svField1] = 6; + _vm->_globals.SAUVEGARDE->data[svField2] = NUMZONE; + _vm->_globals.SAUVEGARDE->data[svField3] = _vm->_globals.OBJET_EN_COURS; + _vm->_globals.GOACTION = 1; + } + _vm->_fontManager.TEXTE_OFF(5); + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + ARRET_PERSO_FLAG = 0; + if (_vm->_eventsManager.btsouris == 21 && _vm->_globals.BOBZONE[NUMZONE]) { + ARRET_PERSO_FLAG = 1; + ARRET_PERSO_NUM = _vm->_globals.BOBZONE[NUMZONE]; + } + if (_vm->_globals.ECRAN == 20 && _vm->_globals.SAUVEGARDE->data[svField13] == 1 && _vm->_globals.OBJET_EN_COURS == 20 && NUMZONE == 12 + && _vm->_eventsManager.btsouris == 23) { + _vm->_globals.chemin = (int16 *)g_PTRNUL; + XSPR(0); + YSPR(0); + } +} + +void ObjectsManager::PARADISE() { + int v1; + char result; + int v3; + uint16 v4; + int v5; + uint16 v6; + + v1 = 0; + ARRET_PERSO_FLAG = 0; + ARRET_PERSO_NUM = 0; + result = _vm->_globals.SAUVEGARDE->data[svField1]; + if (result && _vm->_globals.SAUVEGARDE->data[svField2] && result != 4 && result > 3) { + _vm->_fontManager.TEXTE_OFF(5); + if (_vm->_globals.FORET != 1 || ((uint16)(NUMZONE - 20) > 1u && (uint16)(NUMZONE - 22) > 1u)) { + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) { + _vm->_graphicsManager.no_scroll = 2; + if (_vm->_eventsManager.start_x >= XSPR(0) - 320) + goto LABEL_64; + v3 = _vm->_eventsManager.start_x + 320 - XSPR(0); + if (v3 < 0) + v3 = -v3; + if (v3 <= 160) { +LABEL_64: + if (_vm->_eventsManager.start_x > XSPR(0) - 320) { + v5 = _vm->_eventsManager.start_x + 320 - XSPR(0); + if (v5 < 0) + v5 = -v5; + if (v5 > 160) { + _vm->_graphicsManager.no_scroll = 2; + do { + _vm->_graphicsManager.SCROLL -= _vm->_graphicsManager.SPEED_SCROLL; + if (_vm->_graphicsManager.SCROLL < 0) { + _vm->_graphicsManager.SCROLL = 0; + v1 = 1; + } + if (_vm->_graphicsManager.SCROLL > 640) { + _vm->_graphicsManager.SCROLL = 640; + v1 = 1; + } + if (_vm->_eventsManager.XMOUSE() > _vm->_graphicsManager.SCROLL + 620) { + v6 = _vm->_eventsManager.YMOUSE(); + _vm->_eventsManager.souris_xy(_vm->_eventsManager.souris_x - 4, v6); + } + _vm->_eventsManager.VBL(); + } while (v1 != 1 && _vm->_eventsManager.start_x > XSPR(0) - 320); + } + } + } else { + do { + _vm->_graphicsManager.SCROLL += _vm->_graphicsManager.SPEED_SCROLL; + if (_vm->_graphicsManager.SCROLL < 0) { + _vm->_graphicsManager.SCROLL = 0; + v1 = 1; + } + if (_vm->_graphicsManager.SCROLL > 640) { + _vm->_graphicsManager.SCROLL = 640; + v1 = 1; + } + if (_vm->_eventsManager.XMOUSE() < _vm->_graphicsManager.SCROLL + 10) { + v4 = _vm->_eventsManager.YMOUSE(); + _vm->_eventsManager.souris_xy(_vm->_eventsManager.souris_x + 4, v4); + } + _vm->_eventsManager.VBL(); + } while (v1 != 1 && _vm->_eventsManager.start_x < XSPR(0) - 320); + } + if (_vm->_eventsManager.XMOUSE() > _vm->_graphicsManager.SCROLL + 620) + _vm->_eventsManager.souris_xy(_vm->_graphicsManager.SCROLL + 610, 0); + if (_vm->_eventsManager.XMOUSE() < _vm->_graphicsManager.SCROLL + 10) + _vm->_eventsManager.souris_xy(_vm->_graphicsManager.SCROLL + 10, 0); + _vm->_eventsManager.VBL(); + _vm->_graphicsManager.no_scroll = 0; + } + _vm->_talkManager.REPONSE(_vm->_globals.SAUVEGARDE->data[svField2], _vm->_globals.SAUVEGARDE->data[svField1]); + } else { + _vm->_talkManager.REPONSE2(_vm->_globals.SAUVEGARDE->data[svField2], _vm->_globals.SAUVEGARDE->data[svField1]); + } + _vm->_eventsManager.CHANGE_MOUSE(4); + if ((uint16)(NUMZONE + 1) > 1u && !_vm->_globals.ZONEP[NUMZONE].field16) { + NUMZONE = -1; + FORCEZONE = 1; + } + if (NUMZONE != _vm->_globals.SAUVEGARDE->data[svField2] || (uint16)(NUMZONE + 1) <= 1u) { + _vm->_eventsManager.btsouris = 4; + CHANGEVERBE = 0; + } else { + _vm->_eventsManager.btsouris = _vm->_globals.SAUVEGARDE->data[svField1]; + if (CHANGEVERBE == 1) { + VERBEPLUS(); + CHANGEVERBE = 0; + } + if (_vm->_eventsManager.btsouris == 5) + _vm->_eventsManager.btsouris = 4; + } + if (_vm->_eventsManager.btsouris != 23) + _vm->_eventsManager.CHANGE_MOUSE(_vm->_eventsManager.btsouris); + NUMZONE = 0; + _vm->_globals.SAUVEGARDE->data[svField1] = 0; + _vm->_globals.SAUVEGARDE->data[svField2] = 0; + } + if (_vm->_globals.PLAN_FLAG == true) { + _vm->_eventsManager.btsouris = 0; + _vm->_eventsManager.CHANGE_MOUSE(0); + } + if (_vm->_globals.NOMARCHE == true) { + if (_vm->_eventsManager.btsouris == 4) { + result = NUMZONE + 1; + if ((uint16)(NUMZONE + 1) > 1u) + BTDROITE(); + } + } + _vm->_globals.GOACTION = 0; +} + +// Clear Screen +void ObjectsManager::CLEAR_ECRAN() { + int v1; + int v2; + + CLEAR_SPR(); + _vm->_graphicsManager.FIN_VISU(); + _vm->_fontManager.TEXTE_OFF(5); + _vm->_fontManager.TEXTE_OFF(9); + _vm->_globals.CLEAR_VBOB(); + _vm->_animationManager.CLEAR_ANIM(); + _vm->_linesManager.CLEAR_ZONE(); + _vm->_linesManager.RESET_OBSTACLE(); + _vm->_globals.RESET_CACHE(); + + v1 = 0; + do { + v2 = v1; + _vm->_globals.BOBZONE[v2] = 0; + _vm->_globals.BOBZONE_FLAG[v2] = false; + ++v1; + } while (v1 <= 48); + _vm->_eventsManager.btsouris = 4; + verbe = 4; + NUMZONE = 0; + Vold_taille = 0; + SPEED_FLAG = false; + SPEED_PTR = g_PTRNUL; + SPEED_X = 0; + SPEED_Y = 0; + SPEED_IMAGE = 0; + FORCEZONE = 1; + _vm->_linesManager.TOTAL_LIGNES = 0; + DERLIGNE = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + if (_vm->_globals.COUCOU != g_PTRNUL) + _vm->_globals.COUCOU = _vm->_fileManager.LIBERE_FICHIER(_vm->_globals.COUCOU); + if (g_PTRNUL != _vm->_globals.SPRITE_ECRAN) + _vm->_globals.SPRITE_ECRAN = _vm->_fileManager.LIBERE_FICHIER(_vm->_globals.SPRITE_ECRAN); + _vm->_eventsManager.start_x = 0; + _vm->_eventsManager.souris_n = 0; + Vold_taille = 200; + _vm->_globals.SAUVEGARDE->data[svField1] = 0; + _vm->_globals.SAUVEGARDE->data[svField2] = 0; + _vm->_globals.GOACTION = 0; + FORCEZONE = 1; + CHANGEVERBE = 0; + _vm->_globals.NOSPRECRAN = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.g_old_sens = -1; + my_anim = 1; + A_ANIM = 0; + MA_ANIM = 0; + MA_ANIM1 = 0; + A_DEPA = 0; + MAX_DEPA = 0; + MAX_DEPA1 = 0; + _vm->_graphicsManager.RESET_SEGMENT_VESA(); +} + +// Change Face/Head +void ObjectsManager::CHANGE_TETE(int a1, int a2) { + int v2; + Sauvegarde1 *v3; + Sauvegarde1 *v4; + Sauvegarde1 *v5; + Sauvegarde1 *v6; + Sauvegarde1 *v7; + Sauvegarde1 *v8; + Sauvegarde1 *v9; + + CH_TETE = 1; + _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, 532, 25, 65, 40, _vm->_graphicsManager.VESA_BUFFER, 532, 25); + _vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 597, 65); + _vm->_globals.NOT_VERIF = 1; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + if (a1 == 2) { + if (!a2) { + if (_vm->_globals.SAUVEGARDE->data[svField188] == _vm->_globals.ECRAN) { + CH_TETE = 0; + v3 = &_vm->_globals.SAUVEGARDE->field380; + v3->field0 = XSPR(0); + v3->field1 = YSPR(0); + v3->field2 = 64; + v3->field3 = _vm->_globals.ECRAN; + v3->field4 = Sprite[0].field0; + SPRITE_OFF(1); + SPRITE(_vm->_globals.TETE, v3->field0, v3->field1, 1, 3, v3->field4, 0, 20, 127); + SPRITE_ON(1); + SPRITE_OFF(0); + _vm->_globals.SAUVEGARDE->data[svField354] = 0; + _vm->_globals.SAUVEGARDE->data[svField356] = 0; + _vm->_globals.SAUVEGARDE->data[svField357] = 1; + T_RECTIF = 0; + v4 = &_vm->_globals.SAUVEGARDE->field370; + _vm->_fileManager.CONSTRUIT_SYSTEM("PERSO.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 0; + SPRITE(_vm->_globals.PERSO, v4->field0, v4->field1, 0, 64, v4->field4, 0, 34, 190); +LABEL_9: + SPRITE_ON(0); + return; + } + } + } + if (!a1) { + if (a2 == 2 && _vm->_globals.SAUVEGARDE->data[svField193] == _vm->_globals.ECRAN) { + CH_TETE = 0; + v5 = &_vm->_globals.SAUVEGARDE->field370; + v5->field0 = XSPR(0); + v5->field1 = YSPR(0); + v5->field2 = 64; + v5->field3 = _vm->_globals.ECRAN; + v5->field4 = Sprite[0].fieldC; + SPRITE_OFF(1); + SPRITE(_vm->_globals.TETE, v5->field0, v5->field1, 1, 2, v5->field4, 0, 34, 190); + SPRITE_ON(1); + SPRITE_OFF(0); + _vm->_globals.SAUVEGARDE->data[svField354] = 0; + _vm->_globals.SAUVEGARDE->data[svField356] = 1; + _vm->_globals.SAUVEGARDE->data[svField357] = 0; + v6 = &_vm->_globals.SAUVEGARDE->field380; + _vm->_fileManager.CONSTRUIT_SYSTEM("PSAMAN.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 2; + SPRITE(_vm->_globals.PERSO, v6->field0, v6->field1, 0, 64, v6->field4, 0, 20, 127); + goto LABEL_9; + } + v7 = &_vm->_globals.SAUVEGARDE->field370; + v7->field0 = XSPR(0); + v7->field1 = YSPR(0); + v7->field2 = 64; + v7->field3 = _vm->_globals.ECRAN; + v7->field4 = Sprite[0].fieldC; + } + if (a1 == 1) { + v8 = &_vm->_globals.SAUVEGARDE->field360; + v8->field0 = XSPR(0); + v8->field1 = YSPR(0); + v8->field2 = 64; + v8->field3 = _vm->_globals.ECRAN; + v8->field4 = Sprite[0].fieldC; + } + if (a1 == 2) { + v9 = &_vm->_globals.SAUVEGARDE->field380; + v9->field0 = XSPR(0); + v9->field1 = YSPR(0); + v9->field2 = 64; + v9->field3 = _vm->_globals.ECRAN; + v9->field4 = Sprite[0].fieldC; + } + if (!a2) { + _vm->_globals.SAUVEGARDE->data[svField121] = 0; + _vm->_globals.SAUVEGARDE->data[svField354] = 0; + _vm->_globals.SAUVEGARDE->data[svField356] = 0; + _vm->_globals.SAUVEGARDE->data[svField357] = 1; + _vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField188]; + } + if (a2 == 1) { + _vm->_globals.SAUVEGARDE->data[svField121] = 1; + _vm->_globals.SAUVEGARDE->data[svField354] = 1; + _vm->_globals.SAUVEGARDE->data[svField356] = 0; + _vm->_globals.SAUVEGARDE->data[svField357] = 0; + _vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField183]; + } + if (a2 == 2) { + _vm->_globals.SAUVEGARDE->data[svField121] = 0; + _vm->_globals.SAUVEGARDE->data[svField354] = 0; + _vm->_globals.SAUVEGARDE->data[svField356] = 1; + _vm->_globals.SAUVEGARDE->data[svField357] = 0; + v2 = _vm->_globals.SAUVEGARDE->data[svField193]; + _vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField193]; + } +} + +// Check Size +void ObjectsManager::VERIFTAILLE() { + int v0; + int v1; + int v2; + + v0 = _vm->_globals.STAILLE[YSPR(0)]; + if (_vm->_globals.PERSO_TYPE == 1) { + v1 = v0; + if (v0 < 0) + v1 = -v0; + v0 = 20 * (5 * v1 - 100) / -80; + } + if (_vm->_globals.PERSO_TYPE == 2) { + v2 = v0; + if (v0 < 0) + v2 = -v0; + v0 = 20 * (5 * v2 - 165) / -67; + } + SETTAILLESPR(0, v0); +} + +void ObjectsManager::PACOURS_PROPRE(int16 *a1) { + int v1; + int v2; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + + v1 = 0; + v13 = 0; + v14 = -1; + v2 = a1[1]; + v15 = a1[2]; + if (a1[0] != -1 || v2 != -1) { + for (;;) { + if (v14 != -1 && v15 != v14) { + v11 = v1; + v12 = 0; + v10 = CALC_PROPRE(v2); + v4 = a1[v1]; + v9 = a1[v1]; + v5 = a1[v1 + 1]; + v6 = 0; + while (v4 != -1 || v5 != -1) { + int idx = v1; + v1 += 4; + ++v12; + if (a1[idx + 2] != v15) + v6 = 1; + if (v6 == 1) + break; + v4 = a1[v1]; + v9 = a1[v1]; + v5 = a1[v1 + 1]; + } + if (v12 < v10) { + v7 = v11; + v8 = 0; + if (v12 > 0) { + do { + a1[v7 + 2] = v14; + v7 += 4; + ++v8; + } while (v12 > v8); + } + v15 = v14; + } + v1 = v11; + if (v9 == -1 && v5 == -1) + v13 = 1; + } + v1 += 4; + if (v13 == 1) + break; + v14 = v15; + v2 = a1[v1 + 1]; + v15 = a1[v1 + 2]; + if (a1[v1] == -1) { + if (v2 == -1) + break; + } + } + } +} + +int16 *ObjectsManager::PARC_VOITURE(int a1, int a2, int a3, int a4) { + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int16 *result; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int16 *v33; + int v34; + int v35; + int i; + int16 *v37; + int v39; + int v40; + int16 *v41; + int v43; + int k; + int16 *v45; + int v47; + int v48; + int v49; + int16 *v50; + int v52; + int v53; + int16 *v54; + int v56; + int v57; + int16 *v58; + int v60; + int v61; + int v62; + int v63; + int v64; + int v65; + int v66; + int v67; + int v68; + int v69; + int j; + int l; + int v72; + int v73; + int v74; + int v75; + int v76[10]; + int v77[10]; + int v82[10]; + int v87[10]; + + v4 = a3; + v5 = a4; + v67 = 0; + if (a3 <= 14) + v4 = 15; + if (a4 <= 14) + v5 = 15; + if (v4 > _vm->_graphicsManager.max_x - 10) + v4 = _vm->_graphicsManager.max_x - 10; + if (v5 > 445) + v5 = 440; + v75 = v4; + v74 = v5; + v6 = 0; + v7 = v74; + if (_vm->_graphicsManager.max_y > v74) { + v8 = 5; + do { + v62 = v8; + v9 = _vm->_linesManager.colision2_ligne(v75, v7, &v82[5], &v87[5], 0, DERLIGNE); + v8 = v62; + if (v9 == 1 && v87[v62] <= DERLIGNE) + break; + v82[v62] = 0; + v87[v62] = -1; + ++v6; + ++v7; + } while (_vm->_graphicsManager.max_y > v7); + } + v77[5] = v6; + v10 = 0; + v11 = v74; + if (_vm->_graphicsManager.min_y < v74) { + v12 = 1; + do { + v63 = v12; + v13 = _vm->_linesManager.colision2_ligne(v75, v11, &v82[1], &v87[1], 0, DERLIGNE); + v12 = v63; + if (v13 == 1 && v87[v63] <= DERLIGNE) + break; + v82[v63] = 0; + v87[v63] = -1; + if (v77[5] < v10) { + if (v87[5] != -1) + break; + } + ++v10; + --v11; + } while (_vm->_graphicsManager.min_y < v11); + } + v77[1] = v10; + v14 = 0; + v15 = v75; + if (_vm->_graphicsManager.max_x > v75) { + v16 = 3; + do { + v64 = v16; + v17 = _vm->_linesManager.colision2_ligne(v15, v74, &v82[3], &v87[3], 0, DERLIGNE); + v16 = v64; + if (v17 == 1 && v87[v64] <= DERLIGNE) + break; + v82[v64] = 0; + v87[v64] = -1; + ++v14; + if (v77[1] < v14) { + if (v87[1] != -1) + break; + } + if (v77[5] < v14 && v87[5] != -1) + break; + ++v15; + } while (_vm->_graphicsManager.max_x > v15); + } + v77[3] = v14; + v18 = 0; + v19 = v75; + if (_vm->_graphicsManager.min_x < v75) { + v20 = 7; + do { + v65 = v20; + v21 = _vm->_linesManager.colision2_ligne(v19, v74, &v82[7], &v87[7], 0, DERLIGNE); + v20 = v65; + if (v21 == 1 && v87[v65] <= DERLIGNE) + break; + v82[v65] = 0; + v87[v65] = -1; + ++v18; + if (v77[1] < v18) { + if (v87[1] != -1) + break; + } + if (v77[5] < v18 && v87[5] != -1) + break; + if (v77[3] < v18 && v87[3] != -1) + break; + --v19; + } while (_vm->_graphicsManager.min_x < v19); + } + v77[7] = v18; + if (v87[1] == -1) + v77[1] = 1300; + if (v87[3] == -1) + v77[3] = 1300; + if (v87[5] == -1) + v77[5] = 1300; + if (v87[7] == -1) + v77[7] = 1300; + if (v87[1] != -1 || v87[3] != -1 || v87[5] != -1 || v87[7] != -1) { + v23 = 0; + if (v87[5] != -1 && v77[1] >= v77[5] && v77[3] >= v77[5] && v77[7] >= v77[5]) { + v73 = v87[5]; + v72 = v82[5]; + v23 = 1; + } + if (v87[1] != -1 && !v23 && v77[5] >= v77[1] && v77[3] >= v77[1] && v77[7] >= v77[1]) { + v73 = v87[1]; + v72 = v82[1]; + v23 = 1; + } + if (v87[3] != -1 && !v23 && v77[1] >= v77[3] && v77[5] >= v77[3] && v77[7] >= v77[3]) { + v73 = v87[3]; + v72 = v82[3]; + v23 = 1; + } + if (v87[7] != -1 && !v23 && v77[5] >= v77[7] && v77[3] >= v77[7] && v77[1] >= v77[7]) { + v73 = v87[7]; + v72 = v82[7]; + } + v24 = 0; + do { + v25 = v24; + v87[v25] = -1; + v82[v25] = 0; + v77[v25] = 1300; + v76[v25] = 1300; + ++v24; + } while (v24 <= 8); + v26 = _vm->_linesManager.colision2_ligne(a1, a2, &v82[1], &v87[1], 0, DERLIGNE); + if (v26 == 1) { + v69 = v87[1]; + v68 = v82[1]; + } + if (!v26) { + if (_vm->_linesManager.colision2_ligne(a1, a2, &v82[1], &v87[1], 0, _vm->_linesManager.TOTAL_LIGNES) == 1) { + v27 = 0; + for (;;) { + v28 = _vm->_globals.essai2[v27]; + v29 = _vm->_globals.essai2[v27 + 1]; + v66 = _vm->_globals.essai2[v27 + 2]; + v27 = v27 + 4; + v30 = v27; + v31 = _vm->_linesManager.colision2_ligne(v28, v29, &v82[1], &v87[1], 0, DERLIGNE); + v27 = v30; + if (v31) + break; + v32 = v67; + _vm->_globals.super_parcours[v32] = v28; + _vm->_globals.super_parcours[v32 + 1] = v29; + _vm->_globals.super_parcours[v32 + 2] = v66; + _vm->_globals.super_parcours[v32 + 3] = 0; + + v33 = _vm->_globals.essai0; + _vm->_globals.essai0[v32] = v28; + v33[v32 + 1] = v29; + v33[v32 + 2] = v66; + v33[v32 + 3] = 0; + v67 += 4; + if (v28 == -1) + goto LABEL_90; + } + v69 = v87[1]; + v68 = v82[1]; + } else { + v69 = 1; + v68 = 1; + v67 = 0; + } + } +LABEL_90: + if (v69 < v73) { + v34 = v68; + v35 = v68; + for (i = _vm->_linesManager.Ligne[v69].field0; v35 < i - 2; i = _vm->_linesManager.Ligne[v69].field0) { + v37 = _vm->_linesManager.Ligne[v69].lineData; + v39 = v67; + _vm->_globals.super_parcours[v39] = v37[2 * v35]; + _vm->_globals.super_parcours[v39 + 1] = v37[2 * v35 + 1]; + _vm->_globals.super_parcours[v39 + 2] = _vm->_linesManager.Ligne[v69].field6; + _vm->_globals.super_parcours[v39 + 3] = 0; + v67 += 4; + ++v34; + v35 = v34; + } + for (j = v69 + 1; j < v73; ++j) { + if (_vm->_linesManager.PLAN_TEST( + _vm->_linesManager.Ligne[j].lineData[0], + _vm->_linesManager.Ligne[j].lineData[1], + v67, + j, + v73, + 0) == 1) { +LABEL_88: + v69 = _vm->_linesManager.NV_LIGNEDEP; + v68 = _vm->_linesManager.NV_LIGNEOFS; + v67 = _vm->_linesManager.NV_POSI; + goto LABEL_90; + } + v40 = 0; + if (_vm->_linesManager.Ligne[j].field0 - 2 > 0) { + do { + v41 = _vm->_linesManager.Ligne[j].lineData; + v43 = v67; + _vm->_globals.super_parcours[v43] = v41[2 * v40]; + _vm->_globals.super_parcours[v43 + 1] = v41[2 * v40 + 1]; + _vm->_globals.super_parcours[v43 + 2] = _vm->_linesManager.Ligne[j].field6; + _vm->_globals.super_parcours[v43 + 3] = 0; + v67 += 4; + ++v40; + } while (v40 < _vm->_linesManager.Ligne[j].field0 - 2); + } + } + v68 = 0; + v69 = v73; + } + if (v69 > v73) { + for (k = v68; k > 0; --k) { + v45 = _vm->_linesManager.Ligne[v69].lineData; + v47 = v67; + _vm->_globals.super_parcours[v47] = v45[2 * k]; + _vm->_globals.super_parcours[v47 + 1] = v45[2 * k + 1]; + _vm->_globals.super_parcours[v47 + 2] = _vm->_linesManager.Ligne[v69].field8; + _vm->_globals.super_parcours[v47 + 3] = 0; + v67 += 4; + } + for (l = v69 - 1; l > v73; --l) { + v48 = l; + if (_vm->_linesManager.PLAN_TEST( + _vm->_linesManager.Ligne[l].lineData[2 * _vm->_linesManager.Ligne[v48].field0 - 2], + _vm->_linesManager.Ligne[l].lineData[2 * _vm->_linesManager.Ligne[v48].field0 - 1], + v67, + l, + v73, + 0) == 1) + goto LABEL_88; + v49 = _vm->_linesManager.Ligne[v48].field0 - 2; + if ((_vm->_linesManager.Ligne[v48].field0 - 2) > 0) { + do { + v50 = _vm->_linesManager.Ligne[l].lineData; + v52 = v67; + _vm->_globals.super_parcours[v52] = v50[2 * v49]; + _vm->_globals.super_parcours[v52 + 1] = v50[2 * v49 + 1]; + _vm->_globals.super_parcours[v52 + 2] = _vm->_linesManager.Ligne[l].field8; + _vm->_globals.super_parcours[v52 + 3] = 0; + v67 += 4; + --v49; + } while (v49 > 0); + } + } + v68 = _vm->_linesManager.Ligne[v73].field0 - 1; + v69 = v73; + } + if (v69 == v73) { + if (v68 <= v72) { + if (v68 < v72) { + v57 = v68; + do { + v58 = _vm->_linesManager.Ligne[v73].lineData; + v60 = v67; + _vm->_globals.super_parcours[v60] = v58[2 * v57]; + _vm->_globals.super_parcours[v60 + 1] = v58[2 * v57 + 1]; + _vm->_globals.super_parcours[v60 + 2] = _vm->_linesManager.Ligne[v73].field6; + _vm->_globals.super_parcours[v60 + 3] = 0; + v67 += 4; + ++v57; + } while (v72 > v57); + } + } else { + v53 = v68; + do { + v54 = _vm->_linesManager.Ligne[v73].lineData; + v56 = v67; + _vm->_globals.super_parcours[v56] = v54[2 * v53]; + _vm->_globals.super_parcours[v56 + 1] = v54[2 * v53 + 1]; + _vm->_globals.super_parcours[v56 + 2] = _vm->_linesManager.Ligne[v73].field8; + _vm->_globals.super_parcours[v56 + 3] = 0; + v67 += 4; + --v53; + } while (v72 < v53); + } + } + v61 = v67; + _vm->_globals.super_parcours[v61] = -1; + _vm->_globals.super_parcours[v61 + 1] = -1; + _vm->_globals.super_parcours[v61 + 2] = -1; + _vm->_globals.super_parcours[v61 + 3] = -1; + result = &_vm->_globals.super_parcours[0]; + } else { + result = (int16 *)g_PTRNUL; + } + return result; +} + +void ObjectsManager::VERBEPLUS() { + int v; + + v = _vm->_eventsManager.btsouris + 1; + _vm->_eventsManager.btsouris = v; + if (v == 4) + goto LABEL_24; + if (v == 5) + goto LABEL_28; + if (v == 6) + goto LABEL_29; + if (v == 7) + goto LABEL_31; + if (v == 8) + goto LABEL_33; + if (v == 9) + goto LABEL_35; + if (v == 10) + goto LABEL_37; + if (v == 11) + goto LABEL_39; + if (v == 12) + goto LABEL_41; + if (v == 13) + goto LABEL_43; + if (v == 14) + goto LABEL_45; + if (v == 15) + goto LABEL_47; + if (v == 16) + goto LABEL_49; + if (v == 17) + goto LABEL_51; + if (v == 18) + goto LABEL_53; + if (v == 19) + goto LABEL_55; + if (v == 20) + goto LABEL_57; + if (v == 21) + goto LABEL_59; + if (v == 22) + goto LABEL_61; + if (v == 23) + goto LABEL_63; + if (v == 24) + goto LABEL_65; + if (v == 25) + goto LABEL_67; + do { + do { + _vm->_eventsManager.btsouris = 4; +LABEL_24: + if (_vm->_globals.NOMARCHE != true || (v = NUMZONE + 1, (uint16)(NUMZONE + 1) <= 1u)) { + if (_vm->_eventsManager.btsouris == 4) + return; + } else { + _vm->_eventsManager.btsouris = 5; + } +LABEL_28: + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 6) { +LABEL_29: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field6 == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 7) { +LABEL_31: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field7 == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 8) { +LABEL_33: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field8 == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 9) { +LABEL_35: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field9 == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 10) { +LABEL_37: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldA == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 11) { +LABEL_39: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldB == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 12) { +LABEL_41: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldC == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 13) { +LABEL_43: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldD == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 14) { +LABEL_45: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldE == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 15) { +LABEL_47: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldF == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 16) { +LABEL_49: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field6 == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 17) { +LABEL_51: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field9 == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 18) { +LABEL_53: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldA == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 19) { +LABEL_55: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldB == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 20) { +LABEL_57: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldC == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 21) { +LABEL_59: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldF == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 22) { +LABEL_61: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].fieldD == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 23) { +LABEL_63: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field8 == 2) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 24) { +LABEL_65: + v = 5 * NUMZONE; + if (_vm->_globals.ZONEP[NUMZONE].field9 == 3) + return; + } + v = _vm->_eventsManager.btsouris + 1; + _vm->_eventsManager.btsouris = v; + } while (v != 25); +LABEL_67: + v = 5 * NUMZONE; + } while (_vm->_globals.ZONEP[NUMZONE].fieldE != 2); +} + +void ObjectsManager::BTDROITE() { + if ((uint16)(NUMZONE + 1) > 1u) { + VERBEPLUS(); + if (_vm->_eventsManager.btsouris != 23) + _vm->_eventsManager.CHANGE_MOUSE(_vm->_eventsManager.btsouris); + verbe = _vm->_eventsManager.btsouris; + } +} + +int ObjectsManager::MZONE() { + signed int result; + int16 v1; + int16 v2; + int v3; + int16 v4; + int16 v5; + int v6; + int16 v7; + int v8; + int v9; + int16 yCurrent; + int16 v11; + int16 j; + int16 k; + int16 xCurrent; + int v15; + int16 v16; + int16 v17; + int16 v18; + int16 v19; + int16 yp; + int16 xp; + + v19 = 0; + v18 = 0; + v17 = 0; + v16 = 0; + xp = _vm->_eventsManager.souris_x + _vm->_eventsManager.ofset_souris_x; + yp = _vm->_eventsManager.souris_y + _vm->_eventsManager.ofset_souris_y; + if ((_vm->_eventsManager.souris_y + _vm->_eventsManager.ofset_souris_y) > 19) { + v1 = 0; + do { + v2 = _vm->_globals.BOBZONE[v1]; + if (v2) { + if (_vm->_globals.BOBZONE_FLAG[v1]) { + v3 = v2; + v15 = v3; + if (_vm->_globals.Bob[v3].field0) { + if (_vm->_globals.Bob[v3].frameIndex != 250) { + if (!_vm->_globals.Bob[v3].field16) { + v4 = _vm->_globals.Bob[v3].oldX; + if (xp > v4) { + if (xp < _vm->_globals.Bob[v3].oldWidth + v4) { + v5 = _vm->_globals.Bob[v3].oldY; + if (yp > v5) { + if (yp < _vm->_globals.Bob[v3].oldHeight + v5) { + v6 = v1; + if (_vm->_globals.ZONEP[v1].field4 == -1) { + _vm->_globals.ZONEP[v6].destX = 0; + _vm->_globals.ZONEP[v1].destY = 0; + } + if (!_vm->_globals.ZONEP[v6].destX) { + if (!_vm->_globals.ZONEP[v1].destY) { + _vm->_globals.ZONEP[v6].destX = _vm->_globals.Bob[v15].oldWidth + _vm->_globals.Bob[v15].oldX; + _vm->_globals.ZONEP[v1].destY = _vm->_globals.Bob[v15].oldHeight + _vm->_globals.Bob[v15].oldY + 6; + _vm->_globals.ZONEP[v1].field4 = -1; + } + } + return v1; + } + } + } + } + } + } + } + } + } + ++v1; + } while (v1 <= 48); + _vm->_globals.SegmentEnCours = 0; + v7 = 0; + do { + if (_vm->_globals.ZONEP[v7].field10 == 1) { + v8 = v7; + if (_vm->_globals.CarreZone[v8].field0 == 1) { + if (_vm->_globals.CarreZone[v7].field2 <= xp + && _vm->_globals.CarreZone[v7].field4 >= xp + && _vm->_globals.CarreZone[v7].field6 <= yp + && _vm->_globals.CarreZone[v7].field8 >= yp) { + if (_vm->_globals.CarreZone[v7].fieldE == 1) { + _vm->_globals.oldzone_46 = _vm->_linesManager.LigneZone[_vm->_globals.CarreZone[v7].fieldA].field2; + return _vm->_globals.oldzone_46; + } + v9 = _vm->_globals.SegmentEnCours; + _vm->_globals.Segment[v9].field2 = _vm->_globals.CarreZone[v7].fieldA; + _vm->_globals.Segment[v9].field4 = _vm->_globals.CarreZone[v7].fieldC; + ++_vm->_globals.SegmentEnCours; + } + } + } + ++v7; + } while (v7 <= 99); + if (!_vm->_globals.SegmentEnCours) + goto LABEL_58; + + for (yCurrent = yp; yCurrent >= 0; --yCurrent) { + v11 = colision(xp, yCurrent); + v19 = v11; + if (v11 != -1 && _vm->_globals.ZONEP[v11].field10 == 1) + break; + } + if (v19 == -1) + goto LABEL_58; + for (j = yp; j < _vm->_graphicsManager.max_y; ++j) { + v18 = colision(xp, j); + if (v18 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + break; + } + if (v18 == -1) + goto LABEL_58; + for (k = xp; k >= 0; --k) { + v16 = colision(k, yp); + if (v16 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + break; + } + if (v16 == -1) + goto LABEL_58; + + for (xCurrent = xp; _vm->_graphicsManager.max_x > xCurrent; ++xCurrent) { + v17 = colision(xCurrent, yp); + if (v17 != -1 && _vm->_globals.ZONEP[v19].field10 == 1) + break; + } + if (v19 == v18 && v19 == v16 && v19 == v17) { + _vm->_globals.oldzone_46 = v19; + result = v19; + } else { +LABEL_58: + _vm->_globals.oldzone_46 = -1; + result = -1; + } + } else { + result = 0; + } + return result; +} + +void ObjectsManager::PARAMCADRE(int a1) { + old_cadx = cadx; + old_cady = cady; + old_cadi = cadi; + if ((uint16)(a1 - 1) <= 5u) + cady = 120; + if ((uint16)(a1 - 7) <= 5u) + cady = 158; + if ((uint16)(a1 - 13) <= 5u) + cady = 196; + if ((uint16)(a1 - 19) <= 5u) + cady = 234; + if ((uint16)(a1 - 25) <= 4u) + cady = 272; + if (a1 == 1 || a1 == 7 || a1 == 13 || a1 == 19 || a1 == 25) + cadx = _vm->_graphicsManager.ofscroll + 158; + if (a1 == 2 || a1 == 8 || a1 == 14 || a1 == 20 || a1 == 26) + cadx = _vm->_graphicsManager.ofscroll + 212; + if (a1 == 3 || a1 == 9 || a1 == 15 || a1 == 21 || a1 == 27) + cadx = _vm->_graphicsManager.ofscroll + 266; + if (a1 == 4 || a1 == 10 || a1 == 16 || a1 == 22 || a1 == 28) + cadx = _vm->_graphicsManager.ofscroll + 320; + if (a1 == 5 || a1 == 11 || a1 == 17 || a1 == 23 || a1 == 29) + cadx = _vm->_graphicsManager.ofscroll + 374; + if (a1 == 6 || a1 == 12 || a1 == 18 || a1 == 24 || (uint16)(a1 - 30) <= 1u) + cadx = _vm->_graphicsManager.ofscroll + 428; + if ((uint16)(a1 - 1) <= 0x1Cu) + cadi = 0; + if ((uint16)(a1 - 30) <= 1u) + cadi = 2; + if (a1 == 30) + cady = 272; + if (a1 == 31) + cady = 290; + if (!a1 || a1 == 32) { + cadx = 0; + cady = 0; + cadi = 0; + } + if (!a1) + _vm->_eventsManager.btsouris = 0; + if (a1 == 32) + _vm->_eventsManager.btsouris = 16; + if (a1 == 30) + _vm->_eventsManager.btsouris = 2; + if (a1 == 31) + _vm->_eventsManager.btsouris = 3; + if ((uint16)(a1 - 1) <= 0x1Cu) + _vm->_eventsManager.btsouris = 8; + if (a1 == 29) + _vm->_eventsManager.btsouris = 1; + if ((uint16)(a1 - 1) <= 0x1Bu && !_vm->_globals.INVENTAIRE[a1]) { + _vm->_eventsManager.btsouris = 0; + cadx = 0; + cady = 0; + cadi = 0; + } + if (_vm->_eventsManager.btsouris != 23) + _vm->_eventsManager.CHANGE_MOUSE(_vm->_eventsManager.btsouris); + _vm->_eventsManager.XMOUSE(); + _vm->_eventsManager.YMOUSE(); +} + +void ObjectsManager::OBJETPLUS(int idx) { + int v1; + int v2; + int v3; + + v1 = _vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris && _vm->_eventsManager.btsouris != 16 && (uint16)(_vm->_eventsManager.btsouris - 2) > 1u) { + v2 = _vm->_eventsManager.btsouris++ + 1; + if (v1 == 5) + goto LABEL_24; + if (v2 == 7) + goto LABEL_26; + if (v2 != 8) { + if (v2 == 9) + _vm->_eventsManager.btsouris = 10; + if (_vm->_eventsManager.btsouris == 10) + goto LABEL_29; + if (_vm->_eventsManager.btsouris == 11) + goto LABEL_31; + if (_vm->_eventsManager.btsouris == 12) + _vm->_eventsManager.btsouris = 13; + if (_vm->_eventsManager.btsouris == 13) + goto LABEL_33; + if (_vm->_eventsManager.btsouris == 14) + _vm->_eventsManager.btsouris = 15; + if (_vm->_eventsManager.btsouris == 15) + goto LABEL_35; + if ((uint16)(_vm->_eventsManager.btsouris - 16) <= 6u) + _vm->_eventsManager.btsouris = 23; + if (_vm->_eventsManager.btsouris == 23) + goto LABEL_37; + if (_vm->_eventsManager.btsouris == 24) + _vm->_eventsManager.btsouris = 25; + if (_vm->_eventsManager.btsouris == 25) + goto LABEL_39; + do { + _vm->_eventsManager.btsouris = 6; +LABEL_24: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field2 == 1) + break; + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 7) { +LABEL_26: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field3 == 1) + return; + } + v3 = _vm->_eventsManager.btsouris++; + if (_vm->_eventsManager.btsouris == 8) + break; + _vm->_eventsManager.btsouris = v3 + 3; + if (v3 == 7) { +LABEL_29: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field7 == 1) + return; + } + ++_vm->_eventsManager.btsouris; + if (_vm->_eventsManager.btsouris == 11) { +LABEL_31: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field4 == 1) + return; + } + _vm->_eventsManager.btsouris += 2; + if (_vm->_eventsManager.btsouris == 13) { +LABEL_33: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field5 == 1) + return; + } + _vm->_eventsManager.btsouris += 2; + if (_vm->_eventsManager.btsouris == 15) { +LABEL_35: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field6 == 1) + return; + } + _vm->_eventsManager.btsouris = 23; +LABEL_37: + if (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field6 == 2) + break; + _vm->_eventsManager.btsouris = 25; +LABEL_39: + ; + } while (_vm->_globals.ObjetW[_vm->_globals.INVENTAIRE[idx]].field7 != 2); + } + } +} + +void ObjectsManager::VALID_OBJET(int a1) { + if (_vm->_eventsManager.btsouris == 8) + CHANGE_OBJET(a1); +} + +void ObjectsManager::OPTI_OBJET() { + byte *data; + Common::String file; + int v0 = 1; + int v5; + int v7; + + file = "OBJET1.ini"; + data = _vm->_fileManager.RECHERCHE_CAT(file, 1); + if (data == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, file); + data = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + + if ((data == g_PTRNUL) || *data != 'I' || *(data + 1) != 'N' || *(data + 2) != 'I') { + error("Not an INI file"); + } else { + v7 = 0; + do { + v5 = _vm->_scriptManager.Traduction(data + 20 * v0); + if (_vm->shouldQuit()) + return; + + if (v5 == 2) + v0 = _vm->_scriptManager.Control_Goto(data + 20 * v0); + if (v5 == 3) + v0 = _vm->_scriptManager.Control_If(data, v0); + if (v0 == -1) + error("defective IFF function"); + if (v5 == 1 || v5 == 4) + ++v0; + if (!v5 || v5 == 5) + v7 = 1; + } while (v7 != 1); + } + _vm->_globals.dos_free2(data); +} + +void ObjectsManager::SPECIAL_JEU() { + byte *v1; + byte *v2; + byte *v3; + + if ((uint16)(_vm->_globals.ECRAN - 35) <= 6u) { + if (_vm->_globals.OLD_ECRAN == 16 && _vm->_globals.ECRAN == 35) + TEST_FORET(35, 500, 555, 100, 440, 1); + if (_vm->_globals.OLD_ECRAN == 36 && _vm->_globals.ECRAN == 35) + TEST_FORET(35, 6, 84, 100, 440, 4); + if (_vm->_globals.OLD_ECRAN == 35 && _vm->_globals.ECRAN == 36) + TEST_FORET(36, 551, 633, 100, 440, 2); + if (_vm->_globals.OLD_ECRAN == 37 && _vm->_globals.ECRAN == 36) + TEST_FORET(36, 6, 84, 100, 440, 4); + if (_vm->_globals.OLD_ECRAN == 36 && _vm->_globals.ECRAN == 37) + TEST_FORET(37, 551, 633, 100, 440, 1); + if (_vm->_globals.OLD_ECRAN == 38 && _vm->_globals.ECRAN == 37) + TEST_FORET(37, 392, 529, 100, 440, 2); + if (_vm->_globals.OLD_ECRAN == 37 && _vm->_globals.ECRAN == 38) + TEST_FORET(38, 133, 252, 100, 440, 4); + if (_vm->_globals.OLD_ECRAN == 39 && _vm->_globals.ECRAN == 38) + TEST_FORET(38, 6, 84, 100, 440, 3); + if (_vm->_globals.OLD_ECRAN == 38 && _vm->_globals.ECRAN == 39) + TEST_FORET(39, 551, 633, 100, 440, 2); + if (_vm->_globals.OLD_ECRAN == 40 && _vm->_globals.ECRAN == 39) + TEST_FORET(39, 6, 84, 100, 440, 3); + if (_vm->_globals.OLD_ECRAN == 39 && _vm->_globals.ECRAN == 40) + TEST_FORET(40, 133, 252, 100, 440, 4); + if (_vm->_globals.OLD_ECRAN == 41 && _vm->_globals.ECRAN == 40) + TEST_FORET(40, 392, 529, 100, 440, 2); + if (_vm->_globals.OLD_ECRAN == 40 && _vm->_globals.ECRAN == 41) + TEST_FORET(41, 551, 633, 100, 440, 1); + if (_vm->_globals.OLD_ECRAN == 17 && _vm->_globals.ECRAN == 41) + TEST_FORET(41, 6, 84, 100, 440, 3); + } + if (_vm->_globals.ECRAN == 5) { + if (YSPR(0) <= 399) { + if (!_vm->_globals.SAUVEGARDE->data[svField173]) { + _vm->_globals.SAUVEGARDE->data[svField173] = 1; + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("flicspe1.pe2"); + _vm->_globals.NOPARLE = false; + if (!_vm->_globals.CENSURE) { + v1 = _vm->_globals.dos_malloc2(0x3E8u); + memcpy(v1, _vm->_graphicsManager.Palette, 0x301u); + + _vm->_saveLoadManager.SAUVE_FICHIER("TEMP1.SCR", _vm->_graphicsManager.VESA_SCREEN, 0x4B000u); + + if (!_vm->_graphicsManager.nbrligne) + _vm->_graphicsManager.ofscroll = 0; + _vm->_graphicsManager.NB_SCREEN(); + _vm->_soundManager.SPECIAL_SOUND = 198; + PERSO_ON = true; + _vm->_animationManager.NO_SEQ = true; + _vm->_animationManager.CLS_ANM = false; + _vm->_animationManager.PLAY_ANM("otage.ANM", 1, 24, 500); + _vm->_animationManager.NO_SEQ = false; + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_globals.NECESSAIRE = 1; + _vm->_graphicsManager.NB_SCREEN(); + _vm->_globals.NECESSAIRE = 0; + + _vm->_saveLoadManager.bload("TEMP1.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP1.SCR"); + + PERSO_ON = false; + memcpy(_vm->_graphicsManager.Palette, v1, 0x301u); + _vm->_graphicsManager.SHOW_PALETTE(); + _vm->_globals.dos_free2(v1); + _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(); + v2 = _vm->_graphicsManager.VESA_BUFFER; + v3 = _vm->_graphicsManager.VESA_SCREEN; + memcpy(_vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.VESA_SCREEN, 0x95FFCu); + v3 = v3 + 614396; + v2 = v2 + 614396; + *v2 = *v3; + v2 = v2 + 2; + *v2 = *(v3 + 2); + + _vm->_graphicsManager.no_scroll = 0; + _vm->_graphicsManager.DD_VBL(); + } + } + } + } + if (_vm->_globals.ECRAN == 20) + _vm->_globals.SAUVEGARDE->data[svField132] = XSPR(0) > 65 + && XSPR(0) <= 124 + && YSPR(0) > 372 + && YSPR(0) <= 398; + if (_vm->_globals.ECRAN == 57) { + _vm->_globals.DESACTIVE_INVENT = true; + if (_vm->_globals.SAUVEGARDE->data[svField261] == 1 && BOBPOSI(5) == 37) { + BOBANIM_OFF(5); + SET_BOBPOSI(5, 0); + BOBANIM_ON(6); + _vm->_globals.SAUVEGARDE->data[svField261] = 2; + ZONE_OFF(15); + _vm->_soundManager.PLAY_SOUND("SOUND75.WAV"); + } + if (_vm->_globals.SAUVEGARDE->data[svField261] == 2 && BOBPOSI(6) == 6) { + BOBANIM_OFF(6); + SET_BOBPOSI(6, 0); + BOBANIM_ON(7); + ZONE_ON(14); + _vm->_globals.SAUVEGARDE->data[svField261] = 3; + } + _vm->_globals.DESACTIVE_INVENT = false; + } + if (_vm->_globals.ECRAN == 93 && !_vm->_globals.SAUVEGARDE->data[svField333]) { + _vm->_globals.DESACTIVE_INVENT = true; + do + _vm->_eventsManager.VBL(); + while (BOBPOSI(8) != 3); + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("GM3.PE2"); + BOBANIM_OFF(8); + _vm->_globals.SAUVEGARDE->data[svField333] = 1; + _vm->_globals.DESACTIVE_INVENT = false; + } +} + +void ObjectsManager::BOB_VIVANT(int idx) { + int v1; + int v2; + int v3; + int v4; + + v1 = 5 * idx; + v2 = (int16)READ_LE_UINT16(_vm->_talkManager.ADR_ANIM + 2 * v1); + v3 = (int16)READ_LE_UINT16(_vm->_talkManager.ADR_ANIM + 2 * v1 + 2); + v4 = *(_vm->_talkManager.ADR_ANIM + 2 * v1 + 8); + if ((int16)READ_LE_UINT16(_vm->_talkManager.ADR_ANIM + 2 * v1 + 4)) { + if (!_vm->_globals.NO_OFFSET) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_talkManager.PERSOSPR, + _vm->_graphicsManager.ofscroll + v2, v3, + *(_vm->_talkManager.ADR_ANIM + 2 * v1 + 8)); + if (_vm->_globals.NO_OFFSET) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_talkManager.PERSOSPR, v2, v3, v4); + } +} + +void ObjectsManager::VBOB(byte *src, int idx, int xp, int yp, int frameIndex) { + if (idx > 29) + error("MAX_VBOB exceeded"); + + if (_vm->_globals.VBob[idx].field4 <= 1) { + _vm->_globals.VBob[idx].field4 = 1; + _vm->_globals.VBob[idx].xp = xp; + _vm->_globals.VBob[idx].yp = yp; + _vm->_globals.VBob[idx].frameIndex = frameIndex; + _vm->_globals.VBob[idx].oldX = xp; + _vm->_globals.VBob[idx].oldY = yp; + _vm->_globals.VBob[idx].oldFrameIndex = frameIndex; + _vm->_globals.VBob[idx].spriteData = src; + _vm->_globals.VBob[idx].oldSpriteData = src; + if (_vm->_globals.VBob[idx].surface != g_PTRNUL) + _vm->_globals.VBob[idx].surface = _vm->_globals.dos_free2(_vm->_globals.VBob[idx].surface); + } + + int f4 = _vm->_globals.VBob[idx].field4; + if (f4 == 2 || f4 == 4) { + _vm->_globals.VBob[idx].field4 = 3; + _vm->_globals.VBob[idx].oldX = _vm->_globals.VBob[idx].xp; + _vm->_globals.VBob[idx].oldY = _vm->_globals.VBob[idx].yp; + _vm->_globals.VBob[idx].oldSpriteData = _vm->_globals.VBob[idx].spriteData; + _vm->_globals.VBob[idx].oldFrameIndex = _vm->_globals.VBob[idx].frameIndex; + _vm->_globals.VBob[idx].xp = xp; + _vm->_globals.VBob[idx].yp = yp; + _vm->_globals.VBob[idx].frameIndex = frameIndex; + _vm->_globals.VBob[idx].spriteData = src; + } +} + +void ObjectsManager::VBOB_OFF(int idx) { + if (idx > 29) + error("MAX_VBOB exceeded"); + + if (_vm->_globals.VBob[idx].field4 <= 1) + _vm->_globals.VBob[idx].field4 = 0; + else + _vm->_globals.VBob[idx].field4 = 4; +} + +void ObjectsManager::ACTION_DOS(int idx) { + if (_vm->_globals.GESTE_FLAG != 1) { + if (g_PTRNUL != _vm->_globals.GESTE) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 1; + + _vm->_fileManager.CONSTRUIT_SYSTEM("DOS.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,8,8,8,8,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 0); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,9,10,11,12,13,-1,", 0, 0, 8, 0); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "12,11,10,9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8); + if (idx == 4) + ACTION( + _vm->_globals.GESTE, + "0,1,2,3,4,5,6,7,8,8,8,8,8,8,9,10,11,12,13,12,11,12,13,12,11,12,13,12,11,10,9,8,7,6,5,4,3,2,1,0,-1,", + 0, + 0, + 8, + 0); + if (idx == 5) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20,21,-1,", 0, 0, 8, 0); + if (idx == 6) + SPACTION1(_vm->_globals.GESTE, "20,19,18,17,16,15,-1,", 0, 0, 8); + if (idx == 7) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20,21,22,23,24,-1,", 0, 0, 8, 0); + if (idx == 8) + SPACTION1(_vm->_globals.GESTE, "23,22,21,20,19,18,17,16,15,-1,", 0, 0, 8); + if (idx == 9) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20,21,22,23,24,-1,", 0, 0, 8, 0); + if (idx == 10) + SPACTION1(_vm->_globals.GESTE, "23,22,21,20,19,18,17,16,15,-1,", 0, 0, 8); +} + +void ObjectsManager::ACTION_DROITE(int idx) { + if (_vm->_globals.GESTE_FLAG != 3) { + if (_vm->_globals.GESTE != g_PTRNUL) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 3; + _vm->_fileManager.CONSTRUIT_SYSTEM("PROFIL.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "20,19,18,17,16,15,14,13,13,13,13,13,14,15,16,17,18,19,20,-1,", 0, 0, 8, 0); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "1,2,3,4,5,6,7,8,-1,", 0, 0, 8, 0); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "9,10,11,12,13,14,15,16,17,18,19,20,-1,", 0, 0, 8); + if (idx == 4) + ACTION(_vm->_globals.GESTE, "1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,-1,", 0, 0, 8, 0); + if (idx == 5) + SPACTION(_vm->_globals.GESTE, "23,24,25,-1,", 0, 0, 8, 0); + if (idx == 6) + SPACTION1(_vm->_globals.GESTE, "24,,23,-1,", 0, 0, 8); + if (idx == 7) + SPACTION(_vm->_globals.GESTE, "23,24,25,26,27,-1,", 0, 0, 8, 0); + if (idx == 8) + SPACTION1(_vm->_globals.GESTE, "26,25,24,23,-1,", 0, 0, 8); + if (idx == 9) + SPACTION(_vm->_globals.GESTE, "23,24,25,26,27,28,29,-1,", 0, 0, 8, 0); + if (idx == 10) + SPACTION1(_vm->_globals.GESTE, "28,27,26,25,24,23,-1,", 0, 0, 8); +} + +void ObjectsManager::Q_DROITE(int idx) { + if (_vm->_globals.GESTE_FLAG != 4) { + if (_vm->_globals.GESTE != g_PTRNUL) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 4; + _vm->_fileManager.CONSTRUIT_SYSTEM("3Q.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,8,8,8,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 0); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,9,10,11,12,-1,", 0, 0, 8, 0); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "11,10,9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8); + if (idx == 4) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,9,10,11,12,11,12,11,12,11,12,11,10,9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 0); + if (idx == 5) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,-1,", 0, 0, 8, 0); + if (idx == 6) + SPACTION1(_vm->_globals.GESTE, "17,16,15,-1,", 0, 0, 8); + if (idx == 7) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20-1,", 0, 0, 8, 0); + if (idx == 8) + SPACTION1(_vm->_globals.GESTE, "19,18,17,16,15,-1,", 0, 0, 8); + if (idx == 9) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20,21,-1,", 0, 0, 8, 0); + if (idx == 10) + SPACTION1(_vm->_globals.GESTE, "20,19,18,17,15,-1,", 0, 0, 8); +} + +void ObjectsManager::ACTION_FACE(int idx) { + if (_vm->_globals.GESTE_FLAG != 2) { + if (_vm->_globals.GESTE != g_PTRNUL) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 2; + _vm->_fileManager.CONSTRUIT_SYSTEM("FACE.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,9,9,9,9,9,9,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 0); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,-1,", 0, 0, 8, 0); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "14,13,12,11,10,9,7,6,5,4,3,2,1,0,-1,", 0, 0, 8); + if (idx == 4) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,9,10,11,12,13,14,13,12,11,10,9,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 0); +} + +void ObjectsManager::Q_GAUCHE(int idx) { + if (_vm->_globals.GESTE_FLAG != 4) { + if (_vm->_globals.GESTE != g_PTRNUL) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 4; + _vm->_fileManager.CONSTRUIT_SYSTEM("3Q.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,8,8,8,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 1); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,9,10,11,12,-1,", 0, 0, 8, 1); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "11,10,9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8); + if (idx == 4) + ACTION(_vm->_globals.GESTE, "0,1,2,3,4,5,6,7,8,9,10,11,12,11,12,11,12,11,12,11,10,9,8,7,6,5,4,3,2,1,0,-1,", 0, 0, 8, 1); + if (idx == 5) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,-1,", 0, 0, 8, 1); + if (idx == 6) + SPACTION1(_vm->_globals.GESTE, "17,16,15,-1,", 0, 0, 8); + if (idx == 7) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20-1,", 0, 0, 8, 1); + if (idx == 8) + SPACTION1(_vm->_globals.GESTE, "19,18,17,16,15,-1,", 0, 0, 8); + if (idx == 9) + SPACTION(_vm->_globals.GESTE, "15,16,17,18,19,20,21,-1,", 0, 0, 8, 1); + if (idx == 10) + SPACTION1(_vm->_globals.GESTE, "20,19,18,17,15,-1,", 0, 0, 8); +} + +void ObjectsManager::ACTION_GAUCHE(int idx) { + if (_vm->_globals.GESTE_FLAG != 3) { + if (_vm->_globals.GESTE != g_PTRNUL) + _vm->_globals.GESTE = _vm->_globals.dos_free2(_vm->_globals.GESTE); + _vm->_globals.GESTE_FLAG = 3; + _vm->_fileManager.CONSTRUIT_SYSTEM("PROFIL.SPR"); + _vm->_globals.GESTE = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + } + if (idx == 1) + ACTION(_vm->_globals.GESTE, "20,19,18,17,16,15,14,13,13,13,13,13,14,15,16,17,18,19,20,-1,", 0, 0, 8, 1); + if (idx == 2) + SPACTION(_vm->_globals.GESTE, "1,2,3,4,5,6,7,8,-1,", 0, 0, 8, 1); + if (idx == 3) + SPACTION1(_vm->_globals.GESTE, "9,10,11,12,13,14,15,16,17,18,19,20,-1,", 0, 0, 8); + if (idx == 4) + ACTION(_vm->_globals.GESTE, "1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,-1,", 0, 0, 8, 1); + if (idx == 5) + SPACTION(_vm->_globals.GESTE, "23,24,25,-1,", 0, 0, 8, 1); + if (idx == 6) + SPACTION1(_vm->_globals.GESTE, "24,,23,-1,", 0, 0, 8); + if (idx == 7) + SPACTION(_vm->_globals.GESTE, "23,24,25,26,27,-1,", 0, 0, 8, 1); + if (idx == 8) + SPACTION1(_vm->_globals.GESTE, "26,25,24,23,-1,", 0, 0, 8); + if (idx == 9) + SPACTION(_vm->_globals.GESTE, "23,24,25,26,27,28,29,-1,", 0, 0, 8, 1); + if (idx == 10) + SPACTION1(_vm->_globals.GESTE, "28,27,26,25,24,23,-1,", 0, 0, 8); +} + +void ObjectsManager::ZONE_ON(int idx) { + if (_vm->_globals.BOBZONE[idx]) { + _vm->_globals.BOBZONE_FLAG[idx] = true; + } else { + _vm->_globals.ZONEP[idx].field10 = 1; + } +} + +void ObjectsManager::ZONE_OFF(int idx) { + if (_vm->_globals.BOBZONE[idx]) { + _vm->_globals.BOBZONE_FLAG[idx] = false; + } else { + _vm->_globals.ZONEP[idx].field10 = 0; + } + +} + +void ObjectsManager::OPTI_ONE(int idx, int a2, int a3, int a4) { + if (a4 != 3) { + BOBANIM_ON(idx); + SET_BOBPOSI(idx, a2); + } + + do { + _vm->_eventsManager.VBL(); + } while (a3 != BOBPOSI(idx)); + + if (!a4) + BOBANIM_OFF(idx); + if (a4 == 4) { + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.Bob[idx].spriteData, + _vm->_globals.Bob[idx].oldX, _vm->_globals.Bob[idx].oldY, _vm->_globals.Bob[idx].frameIndex); + BOBANIM_OFF(idx); + _vm->_eventsManager.VBL(); + } +} + + +void ObjectsManager::AFFICHE_SPEED1(byte *speedData, int xp, int yp, int img) { + SPEED_FLAG = true; + SPEED_PTR = speedData; + SPEED_X = xp; + SPEED_Y = yp; + SPEED_IMAGE = img; +} + +int ObjectsManager::BOBPOSI(int idx) { + return _vm->_globals.Bob[idx].field10 / 5; +} + +void ObjectsManager::BOBANIM_ON(int idx) { + if (_vm->_globals.Bob[idx].field16) { + _vm->_globals.Bob[idx].field16 = 0; + _vm->_globals.Bob[idx].field10 = 5; + _vm->_globals.Bob[idx].frameIndex = 250; + _vm->_globals.Bob[idx].field12 = 0; + _vm->_globals.Bob[idx].field14 = 0; + } +} + +void ObjectsManager::BOBANIM_OFF(int idx) { + _vm->_globals.Bob[idx].field16 = 1; + +} + +void ObjectsManager::SET_BOBPOSI(int idx, int a2) { + _vm->_globals.Bob[idx].field10 = 5 * a2; + _vm->_globals.Bob[idx].field12 = 0; + _vm->_globals.Bob[idx].field14 = 0; +} + +int ObjectsManager::BOBX(int idx) { + return _vm->_globals.Bob[idx].xp; +} + +int ObjectsManager::BOBY(int idx) { + return _vm->_globals.Bob[idx].yp; +} + +int ObjectsManager::BOBA(int idx) { + return _vm->_globals.Bob[idx].frameIndex; +} + +void ObjectsManager::INILINK(const Common::String &file) { + int v1; + int v2; + int v8; + int v9; + int v10; + int v11; + int v12; + byte *v13; + int v14; + int v15; + byte *v16; + byte *v17; + int v18; + int v19; + int v20; + int v21; + byte *v22; + int v23; + int v24; + int v25; + int16 v27; + int16 v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35; + int v36; + byte *v37; + int v40; + size_t v41; + size_t v42; + size_t nbytes; + byte *ptr; + Common::String filename, filename2; + Common::File f; + + v1 = 0; + v2 = 0; + + filename = file + ".LNK"; + ptr = _vm->_fileManager.RECHERCHE_CAT(filename, 3); + nbytes = _vm->_globals.CAT_TAILLE; + if (ptr == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename); + + if (!f.open(_vm->_globals.NFICHIER)) + error("Error opening file - %s", _vm->_globals.NFICHIER.c_str()); + + nbytes = f.size(); + ptr = _vm->_globals.dos_malloc2(nbytes); + if (g_PTRNUL == ptr) + error("INILINK"); + _vm->_fileManager.bload_it(f, ptr, nbytes); + f.close(); + } + if (!OBSSEUL) { + for (int idx = 0; idx < 500; ++idx) + _vm->_globals.STAILLE[idx] = (int16)READ_LE_UINT16((uint16 *)ptr + idx); + + _vm->_globals.RESET_CACHE(); + + filename2 = Common::String((const char *)ptr + 1000); + if (!filename2.empty()) { + _vm->_globals.CACHE_BANQUE[1] = _vm->_fileManager.RECHERCHE_CAT(filename2, 8); + + if (_vm->_globals.CACHE_BANQUE[1] || _vm->_globals.CACHE_BANQUE[1] == g_PTRNUL) { + _vm->_globals.CAT_FLAG = false; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, filename2); + } else { + _vm->_globals.CAT_FLAG = true; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, "RES_SLI.RES"); + } + + _vm->_globals.CACHE_BANQUE[1] = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + _vm->_globals.CAT_FLAG = false; + v36 = 60; + v37 = ptr + 1000; + v40 = 0; + + do { + v8 = (int16)READ_LE_UINT16(v37 + 2 * v36); + v9 = (int16)READ_LE_UINT16(v37 + 2 * v36 + 2); + v10 = (int16)READ_LE_UINT16(v37 + 2 * v36 + 4); + v11 = v40; + + _vm->_globals.Cache[v11].field14 = (int16)READ_LE_UINT16(v37 + 2 * v36 + 8); + _vm->_globals.Cache[v11].field2 = v8; + _vm->_globals.Cache[v11].field0 = v9; + _vm->_globals.Cache[v11].field4 = v10; + _vm->_globals.Cache[v11].field12 = 1; + + if (!_vm->_globals.CACHE_BANQUE[1]) { + _vm->_globals.Cache[v40].fieldA = 0; + } else { + v12 = v8; + v13 = _vm->_globals.CACHE_BANQUE[1]; + v14 = Get_Largeur(v13, v8); + v15 = Get_Hauteur(v13, v12); + _vm->_globals.Cache[v40].fieldC = v13; + _vm->_globals.Cache[v40].field6 = v14; + _vm->_globals.Cache[v40].field8 = v15; + _vm->_globals.Cache[v40].fieldA = 1; + } + if (!_vm->_globals.Cache[v40].field0 && !_vm->_globals.Cache[v40].field4 + && !_vm->_globals.Cache[v40].field2) + _vm->_globals.Cache[v40].fieldA = 0; + + v36 += 5; + ++v40; + } while (v40 <= 21); + _vm->_globals.CACHE_ON(); + } + } + + _vm->_linesManager.RESET_OBSTACLE(); + v41 = 0; + if (nbytes) { + do { + if (*(ptr + v41) == 'O' && *(ptr + v41 + 1) == 'B' && *(ptr + v41 + 2) == '2') { + v16 = ptr + v41 + 4; + v32 = 0; + v34 = 0; + _vm->_linesManager.TOTAL_LIGNES = 0; + do { + v27 = (int16)READ_LE_UINT16(v16 + 2 * v32); + if (v27 != -1) { + _vm->_linesManager.AJOUTE_LIGNE( + v34, + v27, + (int16)READ_LE_UINT16(v16 + 2 * v32 + 2), + (int16)READ_LE_UINT16(v16 + 2 * v32 + 4), + (int16)READ_LE_UINT16(v16 + 2 * v32 + 6), + (int16)READ_LE_UINT16(v16 + 2 * v32 + 8), + 1); + ++_vm->_linesManager.TOTAL_LIGNES; + } + v32 += 5; + ++v34; + } while (v27 != -1); + _vm->_linesManager.INIPARCOURS(); + } + ++v41; + } while (nbytes > v41); + } + if (!OBSSEUL) { + v42 = 0; + if (nbytes) { + do { + if (*(ptr + v42) == 'Z' && *(ptr + v42 + 1) == 'O' && *(ptr + v42 + 2) == '2') { + v17 = ptr + v42 + 4; + v33 = 0; + v35 = 0; + v18 = 1; + do { + v19 = v18; + _vm->_globals.ZONEP[v19].destX = 0; + _vm->_globals.ZONEP[v19].destY = 0; + _vm->_globals.ZONEP[v19].field4 = 0; + _vm->_globals.ZONEP[v19].field6 = 0; + _vm->_globals.ZONEP[v19].field7 = 0; + _vm->_globals.ZONEP[v19].field8 = 0; + _vm->_globals.ZONEP[v19].field9 = 0; + _vm->_globals.ZONEP[v19].fieldA = 0; + _vm->_globals.ZONEP[v19].fieldB = 0; + _vm->_globals.ZONEP[v19].fieldC = 0; + _vm->_globals.ZONEP[v19].fieldD = 0; + _vm->_globals.ZONEP[v19].fieldE = 0; + _vm->_globals.ZONEP[v19].fieldF = 0; + _vm->_globals.ZONEP[v19].field12 = 0; + ++v18; + } while (v18 <= 100); + + v31 = 0; + do { + v28 = (int16)READ_LE_UINT16(v17 + 2 * v33); + if (v28 != -1) { + _vm->_linesManager.AJOUTE_LIGNE_ZONE( + v35, + (int16)READ_LE_UINT16(v17 + 2 * v33 + 2), + (int16)READ_LE_UINT16(v17 + 2 * v33 + 4), + (int16)READ_LE_UINT16(v17 + 2 * v33 + 6), + (int16)READ_LE_UINT16(v17 + 2 * v33 + 8), + v28); + _vm->_globals.ZONEP[v28].field10 = 1; + } + v33 += 5; + ++v35; + ++v31; + } while (v28 != -1); + v20 = 1; + do { + v21 = v20; + _vm->_globals.ZONEP[v21].destX = (int16)READ_LE_UINT16(v17 + 2 * v33); + _vm->_globals.ZONEP[v21].destY = (int16)READ_LE_UINT16(v17 + 2 * v33 + 2); + _vm->_globals.ZONEP[v21].field4 = (int16)READ_LE_UINT16(v17 + 2 * v33 + 4); + v33 += 3; + ++v20; + } while (v20 <= 100); + + v22 = ptr + v42 + (10 * v31 + 606) + 4; + v29 = 0; + v23 = 1; + do { + v24 = v23; + _vm->_globals.ZONEP[v24].field6 = *(v29 + v22); + _vm->_globals.ZONEP[v24].field7 = *(v22 + v29 + 1); + _vm->_globals.ZONEP[v24].field8 = *(v22 + v29 + 2); + _vm->_globals.ZONEP[v24].field9 = *(v22 + v29 + 3); + _vm->_globals.ZONEP[v24].fieldA = *(v22 + v29 + 4); + _vm->_globals.ZONEP[v24].fieldB = *(v22 + v29 + 5); + _vm->_globals.ZONEP[v24].fieldC = *(v22 + v29 + 6); + _vm->_globals.ZONEP[v24].fieldD = *(v22 + v29 + 7); + _vm->_globals.ZONEP[v24].fieldE = *(v22 + v29 + 8); + _vm->_globals.ZONEP[v24].fieldF = *(v22 + v29 + 9); + v29 += 10; + ++v23; + } while (v23 <= 100); + v30 = 0; + v25 = 1; + do + _vm->_globals.ZONEP[v25].field12 = (int16)READ_LE_UINT16(v22 + 1010 + 2 * v30++); + while (++v25 <= 100); + CARRE_ZONE(); + } + ++v42; + } while (nbytes > v42); + } + } + _vm->_globals.dos_free2(ptr); +} + +void ObjectsManager::SPECIAL_INI(const Common::String &a1) { + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + + if (_vm->_globals.ECRAN == 73 && !_vm->_globals.SAUVEGARDE->data[svField318]) { + _vm->_globals.CACHE_SUB(0); + _vm->_globals.CACHE_SUB(1); + } + if ((uint16)(_vm->_globals.ECRAN - 35) <= 6u) { + _vm->_globals.BOBZONE[20] = 1; + _vm->_globals.BOBZONE[21] = 2; + _vm->_globals.BOBZONE[22] = 3; + _vm->_globals.BOBZONE[23] = 4; + _vm->_globals.BOBZONE_FLAG[20] = true; + _vm->_globals.BOBZONE_FLAG[21] = true; + _vm->_globals.BOBZONE_FLAG[22] = true; + _vm->_globals.BOBZONE_FLAG[23] = true; + VERBE_ON(20, 5); + VERBE_ON(21, 5); + VERBE_ON(22, 5); + VERBE_ON(23, 5); + _vm->_globals.ZONEP[20].field12 = 30; + _vm->_globals.ZONEP[21].field12 = 30; + _vm->_globals.ZONEP[22].field12 = 30; + _vm->_globals.ZONEP[23].field12 = 30; + v2 = 200; + do { + if (_vm->_globals.SAUVEGARDE->data[v2] != 2) + _vm->_globals.SAUVEGARDE->data[v2] = 0; + ++v2; + } while (v2 <= 214); + } + if (_vm->_globals.ECRAN == 93) { + if (!_vm->_globals.SAUVEGARDE->data[svField333]) + BOBANIM_ON(8); + } + if (_vm->_globals.ECRAN == 18 && _vm->_globals.OLD_ECRAN == 17) { + _vm->_eventsManager.souris_n = 4; + _vm->_globals.BPP_NOAFF = true; + v3 = 0; + do { + _vm->_eventsManager.VBL(); + ++v3; + } while (v3 <= 4); + _vm->_globals.BPP_NOAFF = false; + _vm->_graphicsManager.FADE_INW(); + _vm->_globals.iRegul = 1; + _vm->_globals.DESACTIVE_INVENT = false; + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("MAGE1.pe2"); + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.DESACTIVE_INVENT = false; + } + if (_vm->_globals.ECRAN == 17 && _vm->_globals.OLD_ECRAN == 20) { + _vm->_globals.DESACTIVE_INVENT = true; + _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 = true; + v4 = 0; + do { + _vm->_eventsManager.VBL(); + ++v4; + } while (v4 <= 4); + _vm->_globals.BPP_NOAFF = false; + _vm->_graphicsManager.FADE_INW(); + SPRITE_ON(0); + v5 = 0; + do { + _vm->_eventsManager.VBL(); + ++v5; + } while (v5 <= 4); + VBOB(_vm->_globals.SPRITE_ECRAN, 5, 15, 28, 1); + _vm->_fontManager.TEXTE_OFF(9); + if (!_vm->_soundManager.TEXTOFF) { + _vm->_fontManager.DOS_TEXT(9, 383, _vm->_globals.FICH_TEXTE, 220, 72, 20, 25, 6, 36, 253); + if (!_vm->_soundManager.TEXTOFF) + _vm->_fontManager.TEXTE_ON(9); + } + if (!_vm->_soundManager.VOICEOFF) + _vm->_soundManager.VOICE_MIX(383, 4); + _vm->_globals.SAUVEGARDE->data[svField270] = 1; + _vm->_globals.SAUVEGARDE->data[svField300] = 1; + _vm->_globals.SAUVEGARDE->data[svField320] = 1; + if (_vm->_soundManager.VOICEOFF == 1) { + v6 = 0; + do { + _vm->_eventsManager.VBL(); + ++v6; + } while (v6 <= 199); + } + _vm->_fontManager.TEXTE_OFF(9); + VBOB_OFF(5); + v7 = 0; + do { + _vm->_eventsManager.VBL(); + ++v7; + } while (v7 <= 3); + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.DESACTIVE_INVENT = false; + } +} + +void ObjectsManager::OPTI_BOBON(int a1, int a2, int a3, int a4, int a5, int a6, int a7) { + if (a1 != -1) + BOBANIM_ON(a1); + if (a2 != -1) + BOBANIM_ON(a2); + if (a3 != -1) + BOBANIM_ON(a3); + if (!a7) { + if (a1 != -1) + SET_BOBPOSI(a1, a4); + if (a2 != -1) + SET_BOBPOSI(a2, a5); + if (a3 != -1) + SET_BOBPOSI(a3, a6); + } +} + +void ObjectsManager::SCI_OPTI_ONE(int a1, int a2, int a3, int a4) { + _vm->_eventsManager.souris_bb = 0; + _vm->_eventsManager.souris_b = 0; + + if (a4 != 3) { + BOBANIM_ON(a1); + SET_BOBPOSI(a1, a2); + } + + do { + _vm->_eventsManager.VBL(); + if (_vm->_eventsManager.souris_bb) + break; + } while (a3 != BOBPOSI(a1)); + if (!a4) + BOBANIM_OFF(a1); +} + +void ObjectsManager::VERBE_OFF(int idx, int a2) { + if (a2 == 6) { + _vm->_globals.ZONEP[idx].field6 = 0; + } + if (a2 == 7) { + _vm->_globals.ZONEP[idx].field7 = 0; + } + if (a2 == 8) { + _vm->_globals.ZONEP[idx].field8 = 0; + } + if (a2 == 9) { + _vm->_globals.ZONEP[idx].field9 = 0; + } + if (a2 == 10) { + _vm->_globals.ZONEP[idx].fieldA = 0; + } + if (a2 == 11) { + _vm->_globals.ZONEP[idx].fieldB = 0; + } + if (a2 == 12) { + _vm->_globals.ZONEP[idx].fieldC = 0; + } + if (a2 == 13) { + _vm->_globals.ZONEP[idx].fieldD = 0; + } + if (a2 == 14 || a2 == 25) { + _vm->_globals.ZONEP[idx].fieldE = 0; + } + if (a2 == 15) { + _vm->_globals.ZONEP[idx].fieldF = 0; + } + if (a2 == 16) { + _vm->_globals.ZONEP[idx].field6 = 0; + } + if (a2 == 5) { + _vm->_globals.ZONEP[idx].field8 = 0; + } + if (a2 == 17) { + _vm->_globals.ZONEP[idx].field9 = 0; + } + if (a2 == 18) { + _vm->_globals.ZONEP[idx].fieldA = 0; + } + if (a2 == 19) { + _vm->_globals.ZONEP[idx].fieldB = 0; + } + if (a2 == 20) { + _vm->_globals.ZONEP[idx].fieldC = 0; + } + if (a2 == 22) { + _vm->_globals.ZONEP[idx].fieldD = 0; + } + if (a2 == 21) { + _vm->_globals.ZONEP[idx].fieldE = 0; + } + if (a2 == 24) { + _vm->_globals.ZONEP[idx].field9 = 0; + } + CHANGEVERBE = 1; +} + +void ObjectsManager::VERBE_ON(int idx, int a2) { + if (a2 == 6) { + _vm->_globals.ZONEP[idx].field6 = 1; + } + if (a2 == 7) { + _vm->_globals.ZONEP[idx].field7 = 1; + } + if (a2 == 8) { + _vm->_globals.ZONEP[idx].field8 = 1; + } + if (a2 == 9) { + _vm->_globals.ZONEP[idx].field9 = 1; + } + if (a2 == 10) { + _vm->_globals.ZONEP[idx].fieldA = 1; + } + if (a2 == 11) { + _vm->_globals.ZONEP[idx].fieldB = 1; + } + if (a2 == 12) { + _vm->_globals.ZONEP[idx].fieldC = 1; + } + if (a2 == 13) { + _vm->_globals.ZONEP[idx].fieldD = 1; + } + if (a2 == 14) { + _vm->_globals.ZONEP[idx].fieldD = 1; + } + if (a2 == 15) { + _vm->_globals.ZONEP[idx].fieldE = 1; + } + if (a2 == 16) { + _vm->_globals.ZONEP[idx].field6 = 2; + } + if (a2 == 5) { + _vm->_globals.ZONEP[idx].field8 = 2; + } + if (a2 == 17) { + _vm->_globals.ZONEP[idx].field9 = 2; + } + if (a2 == 18) { + _vm->_globals.ZONEP[idx].fieldA = 2; + } + if (a2 == 19) { + _vm->_globals.ZONEP[idx].fieldB = 2; + } + if (a2 == 20) { + _vm->_globals.ZONEP[idx].fieldC = 2; + } + if (a2 == 22) { + _vm->_globals.ZONEP[idx].fieldD = 2; + } + if (a2 == 21) { + _vm->_globals.ZONEP[idx].fieldE = 2; + } + if (a2 == 24) { + _vm->_globals.ZONEP[idx].field9 = 3; + } + if (a2 == 25) { + _vm->_globals.ZONEP[idx].fieldE = 2; + } +} + +int ObjectsManager::CALC_PROPRE(int idx) { + int v1; + int v2; + int v3; + int v4; + + v1 = 25; + v2 = _vm->_globals.STAILLE[idx]; + if (_vm->_globals.PERSO_TYPE == 1) { + v3 = _vm->_globals.STAILLE[idx]; + if (v2 < 0) + v3 = -v2; + v2 = 20 * (5 * v3 - 100) / -80; + } + if (_vm->_globals.PERSO_TYPE == 2) { + v4 = v2; + if (v2 < 0) + v4 = -v2; + v2 = 20 * (5 * v4 - 165) / -67; + } + if (v2 < 0) + return _vm->_graphicsManager.Reel_Reduc(0x19u, -v2); + if (v2 > 0) + return _vm->_graphicsManager.Reel_Zoom(0x19u, v2); + + return v1; +} + +int ObjectsManager::colision(int xp, int yp) { + if (_vm->_globals.SegmentEnCours <= 0) + return -1; + + int xMax = xp + 4; + int xMin = xp - 4; + + for (int idx = 0; idx <= _vm->_globals.SegmentEnCours; ++idx) { + int field2 = _vm->_globals.Segment[idx].field2; + if (_vm->_globals.Segment[idx].field4 < field2) + continue; + + int yMax = yp + 4; + int yMin = yp - 4; + + do { + int16 *dataP = _vm->_linesManager.LigneZone[field2].zoneData; + if (dataP != (int16 *)g_PTRNUL) { + int count = _vm->_linesManager.LigneZone[field2].count; + int v1 = *dataP; + int v2 = *(dataP + 1); + int v3 = *(dataP + count * 2 - 2); + int v4 = *(dataP + count * 2 - 1); + + bool flag = true; + if (v1 < v3 && (xMax < v1 || xMin > v3)) + flag = false; + if (v1 >= v3 && (xMin > v1 || xMax < v3)) + flag = false; + if (v2 < v4 && (yMax < v2 || yMin > v4)) + flag = false; + if (v2 >= v4 && (yMin > v2 || yMax < v4)) + flag = false; + + if (flag && _vm->_linesManager.LigneZone[field2].count > 0) { + for (int v5 = 0; v5 < count; ++v5) { + int xCheck = *dataP++; + int yCheck = *dataP++; + + if ((xp == xCheck || (xp + 1) == xCheck) && (yp == yCheck)) + return _vm->_linesManager.LigneZone[field2].field2; + } + } + } + } while (++field2 <= _vm->_globals.Segment[idx].field4); + } + + return -1; +} + +void ObjectsManager::ACTION(const byte *spriteData, const Common::String &a2, int a3, int a4, int a5, int a6) { + int v6; + int v7; + char v8; + int v9; + int v10; + int v11; + int v13; + const byte *v14; + char v15; + int v16; + int spriteIndex; + int v18; + Common::String v19; + + v18 = 0; + v6 = 0; + v13 = 0; + v15 = a5; + v19 = " "; + if (_vm->_globals.vitesse == 2) + v15 = a5 / 2; + if (_vm->_globals.vitesse == 3) + v15 = a5 / 3; + v14 = Sprite[0].spriteData; + spriteIndex = Sprite[0].spriteIndex; + v16 = Sprite[0].fieldE; + Sprite[0].field12 += a3; + Sprite[0].field14 += a4; + Sprite[0].fieldE = a6; + + for (;;) { + v7 = 0; + v8 = a2[v18]; + if (v8 == ',') { + v9 = atoi(v19.c_str()); + v13 = v9; + v6 = 0; + v19 = " "; + v7 = 1; + } else { + v9 = v6; + v19 += v8; + v6 = v6 + 1; + } + ++v18; + if (v7 == 1) { + if (v13 == -1) { + Sprite[0].spriteData = v14; + Sprite[0].spriteIndex = spriteIndex; + Sprite[0].field12 -= a3; + Sprite[0].field14 -= a4; + Sprite[0].fieldE = v16; + } else { + Sprite[0].spriteData = spriteData; + Sprite[0].spriteIndex = v13; + } + v10 = 0; + v9 = v15; + if (v15 > 0) { + do { + v11 = v9; + _vm->_eventsManager.VBL(); + ++v10; + v9 = v11; + } while (v10 < v11); + } + if (v13 == -1) + break; + } + } +} + +void ObjectsManager::SPACTION(byte *a1, const Common::String &a2, int a3, int a4, int a5, int a6) { + int v6; + int16 v7; + char v8; + int v9; + int16 v10; + int v11; + int spriteIndex; + char v14; + int16 v15; + Common::String v16; + + v15 = 0; + v6 = 0; + spriteIndex = 0; + v16 = " "; + v14 = a5; + if (_vm->_globals.vitesse == 2) + v14 = a5 / 2; + if (_vm->_globals.vitesse == 3) + v14 = a5 / 3; + S_old_spr = Sprite[0].spriteData; + S_old_ani = Sprite[0].spriteIndex; + S_old_ret = Sprite[0].fieldE; + Sprite[0].field12 += a3; + Sprite[0].field14 += a4; + Sprite[0].fieldE = a6; + do { + do { + v7 = 0; + v8 = a2[v15]; + if (v8 == ',') { + v9 = atoi(v16.c_str()); + spriteIndex = v9; + v6 = 0; + v16 = " "; + v7 = 1; + } else { + v9 = v6; + v16.setChar(v8, v6); + v6 = v6 + 1; + } + ++v15; + } while (v7 != 1); + if (spriteIndex != -1) { + Sprite[0].spriteData = a1; + Sprite[0].spriteIndex = spriteIndex; + } + v10 = 0; + v9 = v14; + if (v14 > 0) { + do { + v11 = v9; + _vm->_eventsManager.VBL(); + ++v10; + v9 = v11; + } while (v10 < v11); + } + } while (spriteIndex != -1); +} + +void ObjectsManager::SPACTION1(byte *a1, const Common::String &a2, int a3, int a4, int a5) { + int v5; + int v6; + char v7; + int v8; + int v9; + int v10; + int spriteIndex; + int v13; + int v14; + Common::String v15; + int v16; + + v14 = 0; + v5 = 0; + spriteIndex = 0; + v15 = " "; + v13 = a5; + if (_vm->_globals.vitesse == 2) + v13 = a5 / 2; + if (_vm->_globals.vitesse == 3) + v13 = a5 / 3; + while (1) { + v6 = 0; + v7 = a2[v14]; + if (v7 == 44) { + v8 = atoi(v15.c_str()); + spriteIndex = v8; + v5 = 0; + v15 = " "; + v6 = 1; + } else { + v8 = v5; + v15.setChar(v7, v5); + v5 = v5 + 1; + } + ++v14; + if (v6 == 1) { + if (spriteIndex == -1) { + Sprite[0].spriteData = S_old_spr; + Sprite[0].spriteIndex = S_old_ani; + Sprite[0].field12 -= a3; + Sprite[0].field14 -= a4; + Sprite[0].fieldE = S_old_ret; + } else { + Sprite[0].spriteData = a1; + Sprite[0].spriteIndex = spriteIndex; + } + + v9 = 0; + v16 = v13; + if (v13 > 0) { + do { + v10 = v8; + _vm->_eventsManager.VBL(); + ++v9; + v16 = v10; + } while (v9 < v10); + } + if (spriteIndex == -1) + break; + } + } +} + +void ObjectsManager::TEST_FORET(int a1, int a2, int a3, int a4, int a5, int a6) { + signed int v6; + char v7; + + v6 = a1; + if (_vm->_globals.ECRAN == a1) { + if (a1 == 35) { + if (a6 > 2 || (v6 = 200, a6 > 2)) + v6 = 201; + } + if (_vm->_globals.ECRAN == 36) { + if (a6 > 2 || (v6 = 202, a6 > 2)) + v6 = 203; + } + if (_vm->_globals.ECRAN == 37) { + if (a6 > 2 || (v6 = 204, a6 > 2)) + v6 = 205; + } + if (_vm->_globals.ECRAN == 38) { + if (a6 > 2 || (v6 = 206, a6 > 2)) + v6 = 207; + } + if (_vm->_globals.ECRAN == 39) { + if (a6 > 2 || (v6 = 208, a6 > 2)) + v6 = 209; + } + if (_vm->_globals.ECRAN == 40) { + if (a6 > 2 || (v6 = 210, a6 > 2)) + v6 = 211; + } + if (_vm->_globals.ECRAN == 41) { + if (a6 > 2 || (v6 = 212, a6 > 2)) + v6 = 213; + } + v7 = _vm->_globals.SAUVEGARDE->data[v6]; + if (v7 != 2) { + if (v7) { + if (v7 == 1) { + if (a6 == 1 && BOBPOSI(1) == 26) { + _vm->_dialogsManager.VIRE_INVENT = true; + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_globals.SAUVEGARDE->data[v6] = 4; + } + if (a6 == 2 && BOBPOSI(2) == 26) { + _vm->_dialogsManager.VIRE_INVENT = true; + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_globals.SAUVEGARDE->data[v6] = 4; + } + if (a6 == 3 && BOBPOSI(3) == 27) { + _vm->_dialogsManager.VIRE_INVENT = true; + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_globals.SAUVEGARDE->data[v6] = 4; + } + if (a6 == 4 && BOBPOSI(4) == 27) { + _vm->_dialogsManager.VIRE_INVENT = true; + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_dialogsManager.VIRE_INVENT = true; + _vm->_globals.SAUVEGARDE->data[v6] = 4; + } + } + if (_vm->_globals.SAUVEGARDE->data[v6] == 4) { + if (a6 == 1 && (signed int)BOBPOSI(1) > 30) + _vm->_globals.SAUVEGARDE->data[v6] = 3; + if (a6 == 2 && (signed int)BOBPOSI(2) > 30) + _vm->_globals.SAUVEGARDE->data[v6] = 3; + if (a6 == 3 && (signed int)BOBPOSI(3) > 30) + _vm->_globals.SAUVEGARDE->data[v6] = 3; + if (a6 == 4 && (signed int)BOBPOSI(4) > 30) + _vm->_globals.SAUVEGARDE->data[v6] = 3; + } + if (_vm->_globals.SAUVEGARDE->data[v6] == 3) { + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_ANM("CREVE2.ANM", 100, 24, 500); + _vm->_globals.SORTIE = 150; + _vm->_graphicsManager.NOFADE = true; + BOB_OFF(1); + BOB_OFF(2); + BOB_OFF(3); + BOB_OFF(4); + } + } else if (a2 < XSPR(0) + && a3 > XSPR(0) + && a4 < YSPR(0) + && a5 > YSPR(0)) { + if (a6 == 1) + BOBANIM_ON(1); + if (a6 == 2) + BOBANIM_ON(2); + if (a6 == 3) + BOBANIM_ON(3); + if (a6 == 4) + BOBANIM_ON(4); + _vm->_globals.SAUVEGARDE->data[v6] = 1; + } + } + } +} + +void ObjectsManager::BLOQUE_ANIMX(int idx, int a2) { + _vm->_globals.BL_ANIM[idx].v1 = 1; + _vm->_globals.BL_ANIM[idx].v2 = a2; +} + +void ObjectsManager::PERSONAGE(const Common::String &s1, const Common::String &s2, const Common::String &s3, + const Common::String &s4, int v) { + int v5; + int v6; + int v7; + int v8; + int v9; + + v5 = 0; + _vm->_dialogsManager.INVENTFLAG = false; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + _vm->_dialogsManager.VIRE_INVENT = false; + _vm->_graphicsManager.ofscroll = 0; + _vm->_globals.PLAN_FLAG = false; + _vm->_globals.iRegul = 1; + _vm->_soundManager.WSOUND(v); + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.NOMARCHE = true; + _vm->_globals.SORTIE = 0; + _vm->_globals.AFFLI = 0; + _vm->_globals.AFFIVBL = 0; + if (!s1.empty()) + _vm->_graphicsManager.LOAD_IMAGE(s1); + if (!s2.empty()) + INILINK(s2); + if (!s3.empty()) + _vm->_animationManager.CHARGE_ANIM(s3); + _vm->_graphicsManager.VISU_ALL(); + if (!s4.empty()) { + if (!_vm->_globals.NOSPRECRAN) + _vm->_graphicsManager.INI_ECRAN(s4); + if (!s4.empty() && _vm->_globals.NOSPRECRAN == 1) + _vm->_graphicsManager.INI_ECRAN2(s4); + } + _vm->_eventsManager.MOUSE_ON(); + if (_vm->_globals.ECRAN == 61) { + SPRITE(_vm->_globals.PERSO, 330, 418, 0, 60, 0, 0, 34, 190); + SPRITE_ON(0); + _vm->_globals.chemin = (int16 *)g_PTRNUL; + VERIFTAILLE(); + } + _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->_eventsManager.CHANGE_MOUSE(4); + _vm->_globals.BPP_NOAFF = true; + v6 = 0; + do { + _vm->_eventsManager.VBL(); + ++v6; + } while (v6 <= 4); + _vm->_globals.BPP_NOAFF = false; + _vm->_graphicsManager.FADE_INW(); + if (_vm->_globals.ECRAN == 61) { + _vm->_animationManager.PLAY_SEQ(0, "OUVRE.SEQ", 10, 4, 10); + BOBANIM_OFF(3); + _vm->_globals.NOT_VERIF = 1; + g_old_x = XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + v7 = YSPR(0); + v8 = XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v8, v7, 330, 345); + _vm->_globals.NOT_VERIF = 1; + do { + GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + SETANISPR(0, 64); + } + do { + v9 = _vm->_eventsManager.BMOUSE(); + if (v9 == 1) { + BTGAUCHE(); + v9 = 1; + } + if (v9 == 2) + BTDROITE(); + _vm->_dialogsManager.TestForDialogOpening(); + VERIFZONE(); + if (_vm->_globals.GOACTION == 1) + PARADISE(); + if (!_vm->_globals.SORTIE) { + _vm->_eventsManager.VBL(); + if (!_vm->_globals.SORTIE) + continue; + } + v5 = 1; + } while (!_vm->shouldQuit() && v5 != 1); + if (_vm->shouldQuit()) + return; + + _vm->_graphicsManager.FADE_OUTW(); + if (!s3.empty()) + _vm->_graphicsManager.FIN_VISU(); + if (_vm->_globals.ECRAN == 61) + SPRITE_OFF(0); + CLEAR_ECRAN(); + _vm->_globals.iRegul = 0; +} + +void ObjectsManager::PERSONAGE2(const Common::String &s1, const Common::String &s2, const Common::String &s3, + const Common::String &s4, int v) { + int mouseButtons; + bool breakFlag; + int xp, yp; + + _vm->_dialogsManager.INVENTFLAG = false; + _vm->_eventsManager.GAME_KEY = KEY_NONE; + verbe = 4; + _vm->_globals.MAX_COMPTE = 6; + _vm->_graphicsManager.ofscroll = 0; + _vm->_dialogsManager.VIRE_INVENT = false; + _vm->_globals.PLAN_FLAG = false; + _vm->_graphicsManager.NOFADE = false; + _vm->_globals.NOMARCHE = false; + _vm->_globals.SORTIE = 0; + _vm->_globals.AFFLI = 0; + _vm->_globals.AFFIVBL = 0; + _vm->_globals.NOT_VERIF = 1; + _vm->_soundManager.WSOUND(v); + _vm->_globals.iRegul = 1; + if (!s1.empty()) + _vm->_graphicsManager.LOAD_IMAGE(s1); + if (!s2.empty()) + INILINK(s2); + if (!s3.empty()) { + _vm->_animationManager.CHARGE_ANIM(s3); + _vm->_graphicsManager.VISU_ALL(); + } + if (!s4.empty()) { + if (!_vm->_globals.NOSPRECRAN) + _vm->_graphicsManager.INI_ECRAN(s4); + if (!s4.empty() && _vm->_globals.NOSPRECRAN == 1) + _vm->_graphicsManager.INI_ECRAN2(s4); + } + _vm->_eventsManager.MOUSE_ON(); + _vm->_eventsManager.btsouris = 4; + _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); + if (!_vm->_globals.PERSO_TYPE) + goto LABEL_70; + if (!_vm->_globals.SAUVEGARDE->data[svField122] && !_vm->_globals.SAUVEGARDE->data[svField356]) { + _vm->_fileManager.CONSTRUIT_SYSTEM("PERSO.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 0; + } + if (!_vm->_globals.PERSO_TYPE) { +LABEL_70: + if (_vm->_globals.SAUVEGARDE->data[svField122] == 1) { + _vm->_fileManager.CONSTRUIT_SYSTEM("HOPFEM.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 1; + } + } + if (_vm->_globals.PERSO_TYPE != 2 && _vm->_globals.SAUVEGARDE->data[svField356] == 1) { + _vm->_fileManager.CONSTRUIT_SYSTEM("PSAMAN.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 2; + } + _vm->_globals.HOPKINS_DATA(); + if (!_vm->_globals.PERSO_TYPE) + SPRITE(_vm->_globals.PERSO, PERX, PERY, 0, PERI, 0, 0, 34, 190); + if (_vm->_globals.PERSO_TYPE == 1) + SPRITE(_vm->_globals.PERSO, PERX, PERY, 0, PERI, 0, 0, 28, 155); + if (_vm->_globals.PERSO_TYPE == 2) + SPRITE(_vm->_globals.PERSO, PERX, PERY, 0, PERI, 0, 0, 20, 127); + _vm->_eventsManager.souris_xy(PERX, PERY); + if (_vm->_graphicsManager.DOUBLE_ECRAN == true) + _vm->_graphicsManager.SCROLL = (int16)XSPR(0) - 320; + VERIFTAILLE(); + SPRITE_ON(0); + _vm->_globals.CACHE_ON(); + _vm->_globals.chemin = (int16 *)g_PTRNUL; + VERIFTAILLE(); + SPECIAL_INI(s2); + _vm->_eventsManager.souris_n = 4; + g_old_x = PERX; + g_old_y = PERY; + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.BPP_NOAFF = true; + + for (int idx = 0; idx < 5; ++idx) { + _vm->_eventsManager.VBL(); + } + + _vm->_globals.BPP_NOAFF = false; + _vm->_globals.iRegul = 1; + if (!_vm->_graphicsManager.NOFADE) + _vm->_graphicsManager.FADE_INW(); + _vm->_graphicsManager.NOFADE = false; + _vm->_eventsManager.CHANGE_MOUSE(4); + + int xCheck = 0; + int yCheck = 0; + + breakFlag = false; + while (!_vm->shouldQuit() && !breakFlag) { + mouseButtons = _vm->_eventsManager.BMOUSE(); + if (mouseButtons) { + if (mouseButtons == 1) { + if (verbe == 16 && _vm->_eventsManager.btsouris == 16) { + xp = _vm->_eventsManager.XMOUSE(); + yp = _vm->_eventsManager.YMOUSE(); + + if (xCheck == xp) { + if (yCheck == yp) { + _vm->_globals.chemin = (int16 *)g_PTRNUL; + PARADISE(); + if (_vm->_globals.SORTIE) + breakFlag = true; + } + } + xCheck = xp; + yCheck = yp; + } + BTGAUCHE(); + } else if (mouseButtons == 2) { + BTDROITE(); + } + } + if (!_vm->_globals.SORTIE) { + _vm->_dialogsManager.TestForDialogOpening(); + VERIFZONE(); + if (_vm->_globals.chemin == (int16 *)g_PTRNUL + || (GOHOME(), _vm->_globals.chemin == (int16 *)g_PTRNUL)) { + if (_vm->_globals.GOACTION == 1) + PARADISE(); + } + SPECIAL_JEU(); + _vm->_eventsManager.VBL(); + if (!_vm->_globals.SORTIE) + continue; + } + breakFlag = true; + } + + if (_vm->_globals.SORTIE != 8 || _vm->_globals.ECRAN != 5 || _vm->_globals.HELICO != 1) { + if (!_vm->_graphicsManager.NOFADE) + _vm->_graphicsManager.FADE_OUTW(); + _vm->_graphicsManager.NOFADE = false; + SPRITE_OFF(0); + _vm->_globals.AFFLI = 0; + if (DEUXPERSO == true) { + SPRITE_OFF(1); + DEUXPERSO = false; + } + if (!s3.empty()) + _vm->_graphicsManager.FIN_VISU(); + CLEAR_ECRAN(); + } else { + _vm->_globals.HELICO = 0; + } + _vm->_globals.iRegul = 0; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/objects.h b/engines/hopkins/objects.h new file mode 100644 index 0000000000..60ace316da --- /dev/null +++ b/engines/hopkins/objects.h @@ -0,0 +1,248 @@ +/* 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. + * + */ + +#ifndef HOPKINS_OBJECTS_H +#define HOPKINS_OBJECTS_H + +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/str.h" +#include "hopkins/globals.h" + +namespace Hopkins { + +struct SpriteItem { + int field0; + const byte *spriteData; + Common::Point spritePos; + int spriteY; + int fieldC; + int fieldE; + int spriteIndex; + int field12; + int field14; + byte *field1C; + int field20; + int field22; + int field24; + int field26; + int field28; + int field2A; + int field2C; + int field2E; + int field30; + int field32; + int field34; + int field36; +}; + +class HopkinsEngine; + +class ObjectsManager { +private: + HopkinsEngine *_vm; + +public: + SpriteItem Sprite[6]; + int PRIORITY; + int old_cadx, old_cady, old_cadi; + int cadx, cady, cadi; + int SL_X, SL_Y; + int I_old_x, I_old_y; + int g_old_x, g_old_y; + int FLAG_VISIBLE_EFFACE; + byte *SL_SPR; + byte *SL_SPR2; + byte *sprite_ptr; + const byte *S_old_spr; + bool PERSO_ON; + bool SL_FLAG; + int SL_MODE; + bool FLAG_VISIBLE; + int DESACTIVE_CURSOR; + bool BOBTOUS; + int my_anim; + int NUMZONE; + int ARRET_PERSO_FLAG; + int ARRET_PERSO_NUM; + int FORCEZONE; + int CHANGEVERBE; + int verbe; + int Vold_taille; + bool SPEED_FLAG; + int SPEED_X, SPEED_Y; + int SPEED_IMAGE; + byte *SPEED_PTR; + int DERLIGNE; + int A_ANIM; + int MA_ANIM; + int MA_ANIM1; + int A_DEPA; + int MAX_DEPA; + int MAX_DEPA1; + int CH_TETE; + int T_RECTIF; + bool DESACTIVE; + bool DEUXPERSO; + int PERX, PERY; + int PERI; + int RECALL; + int PTAILLE; + int PEROFX; + int PEROFY; + int OBSSEUL; + int NVVERBE; + int NVZONE; + int S_old_ani; + int S_old_ret; + int nouveau_x, nouveau_y; + int nouveau_sens; + int nouveau_anim; +public: + ObjectsManager(); + void setParent(HopkinsEngine *vm); + + byte *CHANGE_OBJET(int objIndex); + byte *CAPTURE_OBJET(int objIndex, int mode); + void DELETE_OBJET(int objIndex); + + int Get_Largeur(const byte *objectData, int idx); + int Get_Hauteur(const byte *objectData, int idx); + int sprite_alone(const byte *objectData, byte *sprite, int objIndex); + byte *DEL_FICHIER_OBJ(); + + byte *CHARGE_SPRITE(const Common::String &file); + void set_offsetxy(byte *data, int idx, int xp, int yp, bool isSize); + int get_offsetx(const byte *spriteData, int spriteIndex, bool isSize); + int get_offsety(const byte *spriteData, int spriteIndex, bool isSize); + void AFF_SPRITES(); + + int capture_mem_sprite(const byte *objectData, byte *sprite, int objIndex); + int AJOUTE_OBJET(int objIndex); + + void INIT_BOB(); + void BOB_ZERO(int idx); + void DEF_BOB(int idx); + void BOB_VISU(int idx); + void BOB_OFF(int idx); + void BOB_OFFSET(int idx, int v); + void BOB_ADJUST(int idx, int v); + void BOB_OFFSETY(int idx, int v); + void SCBOB(int idx); + void CALCUL_BOB(int idx); + + void VERIFCACHE(); + void DEF_SPRITE(int idx); + void DEF_CACHE(int idx); + void CALCUL_SPRITE(int idx); + int AvantTri(TriMode triMode, int index, int priority); + 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 xp, int yp, int idx, int spriteIndex, 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 spriteIndex); + void SETYSPR(int idx, int yp); + void SETTAILLESPR(int idx, int a2); + void SETFLIPSPR(int idx, int a2); + + void VERIFZONE(); + void GOHOME(); + void GOHOME2(); + void CHARGE_OBSTACLE(const Common::String &file); + void CHARGE_ZONE(const Common::String &file); + void CARRE_ZONE(); + void PLAN_BETA(); + void BTGAUCHE(); + void PARADISE(); + void CLEAR_ECRAN(); + + void CHANGE_TETE(int a1, int a2); + void VERIFTAILLE(); + void PACOURS_PROPRE(int16 *a1); + int16 *PARC_VOITURE(int a1, int a2, int a3, int a4); + void VERBEPLUS(); + void BTDROITE(); + int MZONE(); + void PARAMCADRE(int a1); + void OBJETPLUS(int a1); + void VALID_OBJET(int a1); + void OPTI_OBJET(); + void SPECIAL_JEU(); + void BOB_VIVANT(int a1); + void VBOB(byte *src, int idx, int xp, int yp, int frameIndex); + void VBOB_OFF(int idx); + void ACTION_DOS(int idx); + void ACTION_DROITE(int idx); + void Q_DROITE(int idx); + void ACTION_FACE(int idx); + void Q_GAUCHE(int idx); + void ACTION_GAUCHE(int idx); + + void ZONE_ON(int idx); + void ZONE_OFF(int idx); + void OPTI_ONE(int a1, int a2, int a3, int a4); + void AFFICHE_SPEED1(byte *speedData, int xp, int yp, int img); + int BOBPOSI(int idx); + void BOBANIM_ON(int idx); + void BOBANIM_OFF(int idx); + void SET_BOBPOSI(int idx, int a2); + int BOBX(int idx); + int BOBY(int idx); + int BOBA(int idx); + + void INILINK(const Common::String &file); + void SPECIAL_INI(const Common::String &a1); + void OPTI_BOBON(int a1, int a2, int a3, int a4, int a5, int a6, int a7); + void SCI_OPTI_ONE(int a1, int a2, int a3, int a4); + void VERBE_OFF(int idx, int a2); + void VERBE_ON(int idx, int a2); + int CALC_PROPRE(int idx); + int colision(int xp, int yp); + + void ACTION(const byte *spriteData, const Common::String &a2, int a3, int a4, int a5, int a6); + void SPACTION(byte *a1, const Common::String &a2, int a3, int a4, int a5, int a6); + void SPACTION1(byte *a1, const Common::String &a2, int a3, int a4, int a5); + void TEST_FORET(int a1, int a2, int a3, int a4, int a5, int a6); + void BLOQUE_ANIMX(int idx, int a2); + 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, + const Common::String &s4, int v); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_OBJECTS_H */ diff --git a/engines/hopkins/saveload.cpp b/engines/hopkins/saveload.cpp new file mode 100644 index 0000000000..cd7c32c345 --- /dev/null +++ b/engines/hopkins/saveload.cpp @@ -0,0 +1,254 @@ +/* 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/system.h" +#include "common/savefile.h" +#include "graphics/surface.h" +#include "graphics/scaler.h" +#include "graphics/thumbnail.h" +#include "hopkins/saveload.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +const char *SAVEGAME_STR = "HOPKINS"; +#define SAVEGAME_STR_SIZE 13 + +void SaveLoadManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +bool SaveLoadManager::bsave(const Common::String &file, const void *buf, size_t n) { + Common::OutSaveFile *f = g_system->getSavefileManager()->openForSaving(file); + + if (f) { + size_t bytesWritten = f->write(buf, n); + f->finalize(); + delete f; + + return bytesWritten == n; + } else + return false; +} + +// Save File +bool SaveLoadManager::SAUVE_FICHIER(const Common::String &file, const void *buf, size_t n) { + return bsave(file, buf, n); +} + +void SaveLoadManager::initSaves() { + Common::String dataFilename = "HISCORE.DAT"; + byte data[100]; + Common::fill(&data[0], &data[100], 0); + + SAUVE_FICHIER(dataFilename, data, 100); +} + +void SaveLoadManager::bload(const Common::String &file, byte *buf) { + Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(file); + if (f == NULL) + error("Error openinig file - %s", file.c_str()); + + int32 filesize = f->size(); + f->read(buf, filesize); + delete f; +} + +bool SaveLoadManager::readSavegameHeader(Common::InSaveFile *in, hopkinsSavegameHeader &header) { + char saveIdentBuffer[SAVEGAME_STR_SIZE + 1]; + header.thumbnail = NULL; + + // Validate the header Id + in->read(saveIdentBuffer, SAVEGAME_STR_SIZE + 1); + if (strncmp(saveIdentBuffer, SAVEGAME_STR, SAVEGAME_STR_SIZE)) + return false; + + header.version = in->readByte(); + if (header.version > HOPKINS_SAVEGAME_VERSION) + return false; + + // Read in the string + header.saveName.clear(); + char ch; + while ((ch = (char)in->readByte()) != '\0') header.saveName += ch; + + // Get the thumbnail + header.thumbnail = Graphics::loadThumbnail(*in); + if (!header.thumbnail) + return false; + + // Read in save date/time + header.saveYear = in->readSint16LE(); + header.saveMonth = in->readSint16LE(); + header.saveDay = in->readSint16LE(); + header.saveHour = in->readSint16LE(); + header.saveMinutes = in->readSint16LE(); + header.totalFrames = in->readUint32LE(); + + return true; +} + +void SaveLoadManager::writeSavegameHeader(Common::OutSaveFile *out, hopkinsSavegameHeader &header) { + // Write out a savegame header + out->write(SAVEGAME_STR, SAVEGAME_STR_SIZE + 1); + + out->writeByte(HOPKINS_SAVEGAME_VERSION); + + // Write savegame name + out->write(header.saveName.c_str(), header.saveName.size() + 1); + + // Create a thumbnail and save it + Graphics::Surface *thumb = new Graphics::Surface(); + createThumbnail(thumb); + Graphics::saveThumbnail(*out, *thumb); + thumb->free(); + delete thumb; + + // Write out the save date/time + TimeDate td; + g_system->getTimeAndDate(td); + out->writeSint16LE(td.tm_year + 1900); + out->writeSint16LE(td.tm_mon + 1); + out->writeSint16LE(td.tm_mday); + out->writeSint16LE(td.tm_hour); + out->writeSint16LE(td.tm_min); + out->writeUint32LE(_vm->_eventsManager._gameCounter); +} + +Common::Error SaveLoadManager::save(int slot, const Common::String &saveName) { + /* Pack any necessary data into the savegame data structure */ + // Set the selected slot number + _vm->_globals.SAUVEGARDE->data[svField10] = slot; + + // Set up the inventory + for (int i = 0; i < 35; ++i) + _vm->_globals.SAUVEGARDE->inventory[i] = _vm->_globals.INVENTAIRE[i]; + + /* Create the savegame */ + Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving( + _vm->generateSaveName(slot)); + if (!saveFile) + return Common::kCreatingFileFailed; + + // Set up the serializer + Common::Serializer serializer(NULL, saveFile); + + // Write out the savegame header + hopkinsSavegameHeader header; + header.saveName = saveName; + header.version = HOPKINS_SAVEGAME_VERSION; + writeSavegameHeader(saveFile, header); + + // Write out the savegame data + syncSavegameData(serializer); + + // Save file complete + saveFile->finalize(); + delete saveFile; + + return Common::kNoError; +} + +Common::Error SaveLoadManager::restore(int slot) { + // Try and open the save file for reading + Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( + _vm->generateSaveName(slot)); + if (!saveFile) + return Common::kReadingFailed; + + // Set up the serializer + Common::Serializer serializer(saveFile, NULL); + + // Read in the savegame header + hopkinsSavegameHeader header; + readSavegameHeader(saveFile, header); + if (header.thumbnail) + header.thumbnail->free(); + delete header.thumbnail; + + // Read in the savegame data + syncSavegameData(serializer); + + // Loading save file complete + delete saveFile; + + // Unpack the inventory + for (int i = 0; i < 35; ++i) + _vm->_globals.INVENTAIRE[i] = _vm->_globals.SAUVEGARDE->inventory[i]; + + // Set variables from loaded data as necessary + _vm->_globals.SAUVEGARDE->data[svField10] = slot; + _vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField5]; + _vm->_globals.SAUVEGARDE->data[svField6] = 0; + _vm->_globals.ECRAN = 0; + + return Common::kNoError; +} + +bool SaveLoadManager::readSavegameHeader(int slot, hopkinsSavegameHeader &header) { + // Try and open the save file for reading + Common::InSaveFile *saveFile = g_system->getSavefileManager()->openForLoading( + g_vm->generateSaveName(slot)); + if (!saveFile) + return false; + + bool result = readSavegameHeader(saveFile, header); + delete saveFile; + return result; +} + +#define REDUCE_AMOUNT 80 + +void SaveLoadManager::createThumbnail(Graphics::Surface *s) { + int w = _vm->_graphicsManager.Reel_Reduc(SCREEN_WIDTH, REDUCE_AMOUNT); + int h = _vm->_graphicsManager.Reel_Reduc(SCREEN_HEIGHT - 40, REDUCE_AMOUNT); + + s->create(w, h, Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); + + _vm->_graphicsManager.Reduc_Ecran(_vm->_graphicsManager.VESA_BUFFER, (byte *)s->pixels, + _vm->_eventsManager.start_x, 20, SCREEN_WIDTH, SCREEN_HEIGHT - 40, 80); + _vm->_graphicsManager.INIT_TABLE(45, 80, _vm->_graphicsManager.Palette); +// _vm->_graphicsManager.Trans_bloc2((byte *)s->pixels, _vm->_graphicsManager.TABLE_COUL, 11136); +} + +void SaveLoadManager::syncSavegameData(Common::Serializer &s) { + s.syncBytes(&_vm->_globals.SAUVEGARDE->data[0], 0x802); + syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field360); + syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field370); + syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field380); + + for (int i = 0; i < 35; ++i) + s.syncAsSint16LE(_vm->_globals.SAUVEGARDE->inventory[i]); +} + +void SaveLoadManager::syncSauvegarde1(Common::Serializer &s, Sauvegarde1 &item) { + s.syncAsSint16LE(item.field0); + s.syncAsSint16LE(item.field1); + s.syncAsSint16LE(item.field2); + s.syncAsSint16LE(item.field3); + s.syncAsSint16LE(item.field4); +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/saveload.h b/engines/hopkins/saveload.h new file mode 100644 index 0000000000..647c64d2e7 --- /dev/null +++ b/engines/hopkins/saveload.h @@ -0,0 +1,71 @@ +/* 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. + * + */ + +#ifndef HOPKINS_SAVELOAD_H +#define HOPKINS_SAVELOAD_H + +#include "common/scummsys.h" +#include "common/savefile.h" +#include "common/serializer.h" +#include "common/str.h" +#include "hopkins/globals.h" + +namespace Hopkins { + +class HopkinsEngine; + +#define HOPKINS_SAVEGAME_VERSION 1 + +struct hopkinsSavegameHeader { + uint8 version; + Common::String saveName; + Graphics::Surface *thumbnail; + int saveYear, saveMonth, saveDay; + int saveHour, saveMinutes; + int totalFrames; +}; + +class SaveLoadManager { +private: + HopkinsEngine *_vm; + + void createThumbnail(Graphics::Surface *s); + void syncSavegameData(Common::Serializer &s); + void syncSauvegarde1(Common::Serializer &s, Sauvegarde1 &item); +public: + void setParent(HopkinsEngine *vm); + + void initSaves(); + bool bsave(const Common::String &file, const void *buf, size_t n); + bool SAUVE_FICHIER(const Common::String &file, const void *buf, size_t n); + void bload(const Common::String &file, byte *buf); + + static bool readSavegameHeader(Common::InSaveFile *in, hopkinsSavegameHeader &header); + void writeSavegameHeader(Common::OutSaveFile *out, hopkinsSavegameHeader &header); + static bool readSavegameHeader(int slot, hopkinsSavegameHeader &header); + Common::Error save(int slot, const Common::String &saveName); + Common::Error restore(int slot); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_SAVELOAD_H */ diff --git a/engines/hopkins/script.cpp b/engines/hopkins/script.cpp new file mode 100644 index 0000000000..57b691a129 --- /dev/null +++ b/engines/hopkins/script.cpp @@ -0,0 +1,2586 @@ +/* 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/system.h" +#include "graphics/palette.h" +#include "common/file.h" +#include "common/rect.h" +#include "engines/util.h" +#include "hopkins/objects.h" +#include "hopkins/dialogs.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/sound.h" +#include "hopkins/hopkins.h" + +namespace Hopkins { + +ScriptManager::ScriptManager() { + TRAVAILOBJET = 0; +} + +void ScriptManager::setParent(HopkinsEngine *vm) { + _vm = vm; +} + +int ScriptManager::Traduction(byte *a1) { + int v1; + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + int v26; + int v27; + int v28; + int v29; + int v30; + int v31; + int v32; + int v33; + int v34; + int v35; + int v36; + int v37; + int v38; + int v39; + int v40; + int v41; + int v42; + int v43; + int v44; + int v45; + int v46; + char v47; + char v48; + char v49; + int v50; + Sauvegarde1 *v51; + int v52; + Sauvegarde1 *v53; + int v54; + int v55; + int v56; + int v57; + int v58; + int v59; + int v60; + int v65; + int v66; + int v67; + int v68; + int v69; + int v70; + int v71; + int v72; + int v73; + int v74; + int v75; + int v76; + Common::String v77; + Common::String s; + + v1 = 0; + v70 = 0; + if (*a1 != 'F' || *(a1 + 1) != 'C') + return 0; + if (*(a1 + 2) == 'T' && *(a1 + 3) == 'X' && *(a1 + 4) == 'T') { + v70 = *(a1 + 6); + v2 = *(a1 + 7); + v69 = *(a1 + 8); + v67 = (int16)READ_LE_UINT16(a1 + 9); + v65 = (int16)READ_LE_UINT16(a1 + 11); + v3 = (int16)READ_LE_UINT16(a1 + 13); + v1 = 1; + if (!TRAVAILOBJET) { + if (_vm->_globals.SAUVEGARDE->data[svField356] == 1) { + if (v3 == 53) + v3 = 644; + if (v3 == 624) + v3 = 639; + if (v3 == 627) + v3 = 630; + if (v3 == 625) + v3 = 639; + if (v3 == 8) + v3 = 637; + if (v3 == 53) + v3 = 644; + if (v3 == 557) + v3 = 636; + if (v3 == 51) + v3 = 644; + if (v3 == 287) + v3 = 636; + if (v3 == 619) + v3 = 633; + if (v3 == 620) + v3 = 634; + if (v3 == 622) + v3 = 644; + if (v3 == 297) + v3 = 636; + if (v3 == 612) + v3 = 636; + if ((uint16)(v3 - 613) <= 1u || v3 == 134) + v3 = 636; + if (v3 == 615) + v3 = 635; + if (v3 == 618) + v3 = 632; + if (v3 == 611) + v3 = 642; + if (v3 == 610) + v3 = 641; + if (v3 == 18) + v3 = 643; + if (v3 == 602) + v3 = 645; + if (v3 == 603) + v3 = 646; + if (v3 == 604) + v3 = 647; + if (v3 == 51) + v3 = 644; + if (v3 == 607) + v3 = 650; + if (v3 == 605) + v3 = 648; + if (v3 == 606) + v3 = 649; + if (v3 == 601) + v3 = 652; + if (v3 == 37) + v3 = 636; + if (v3 == 595) + v3 = 633; + if (v3 == 596) + v3 = 634; + if (v3 == 532) + v3 = 636; + if (v3 == 599) + v3 = 636; + if (v3 == 363) + v3 = 636; + } + if (!_vm->_soundManager.SOUNDOFF && _vm->_soundManager.SOUND_FLAG == 1) { + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + _vm->_eventsManager.VBL(); + } while (_vm->_soundManager.SOUND_FLAG); + } + if (!_vm->_soundManager.TEXTOFF) { + _vm->_fontManager.DOS_TEXT(9, v3, _vm->_globals.FICH_TEXTE, 2 * v67, 2 * v65 + 40, 20, 25, 6, v2, 253); + if (!_vm->_soundManager.TEXTOFF) + _vm->_fontManager.TEXTE_ON(9); + } + if (!_vm->_soundManager.VOICEOFF) + _vm->_soundManager.VOICE_MIX(v3, 4); + } + if (TRAVAILOBJET == 1) { + if (_vm->_globals.SAUVEGARDE->data[svField356]) { + _vm->_fontManager.DOS_TEXT(9, 635, _vm->_globals.FICH_TEXTE, 55, 20, 20, 25, v69, 35, 253); + if (!_vm->_soundManager.TEXTOFF) + _vm->_fontManager.TEXTE_ON(9); + if (!_vm->_soundManager.VOICEOFF) + _vm->_soundManager.VOICE_MIX(635, 4); + goto LABEL_104; + } + if (_vm->_globals.FR == 1 && !_vm->_soundManager.TEXTOFF) + _vm->_fontManager.DOS_TEXT(9, v3, "OBJET1.TXT", 2 * v67, 60, 20, 25, 6, v2, 253); + if (!_vm->_globals.FR && !_vm->_soundManager.TEXTOFF) + _vm->_fontManager.DOS_TEXT(9, v3, "OBJETAN.TXT", 2 * v67, 60, 20, 25, 6, v2, 253); + if (_vm->_globals.FR == 2) { + if (_vm->_soundManager.TEXTOFF) { +LABEL_98: + if (!_vm->_soundManager.VOICEOFF) + _vm->_soundManager.VOICE_MIX(v3, 5); + goto LABEL_104; + } + _vm->_fontManager.DOS_TEXT(9, v3, "OBJETES.TXT", 2 * v67, 60, 20, 25, 6, v2, 253); + } + if (!_vm->_soundManager.TEXTOFF) + _vm->_fontManager.TEXTE_ON(9); + goto LABEL_98; + } + } +LABEL_104: + if (*(a1 + 2) == 'B' && *(a1 + 3) == 'O' && *(a1 + 4) == 'B') { + if (_vm->_objectsManager.DESACTIVE != true) { + v72 = *(a1 + 5); + v70 = *(a1 + 6); + v4 = *(a1 + 7); + v68 = (int16)READ_LE_UINT16(a1 + 8); + v66 = (int16)READ_LE_UINT16(a1 + 10); + if (v72 == 52) { + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, v68, (int16)READ_LE_UINT16(a1 + 10), v70); + } else if (v72 == 51) { + _vm->_objectsManager.BOB_VIVANT(v70); + } else { + if (v72 == 50) + goto LABEL_1141; + _vm->_objectsManager.VBOB(_vm->_globals.SPRITE_ECRAN, v72, v68, v66, v70); + if (v4) + v4 /= _vm->_globals.vitesse; + if (v4 > 1) { + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + --v4; + _vm->_eventsManager.VBL(); + } while (v4); + } + if (v72 == 50) +LABEL_1141: + _vm->_objectsManager.AFFICHE_SPEED1(_vm->_globals.SPRITE_ECRAN, v68, v66, v70); + } + } + v1 = 1; + } + if (*(a1 + 2) == 'S') { + if (*(a1 + 3) == 'T' && *(a1 + 4) == 'P') { + if (_vm->_objectsManager.DESACTIVE != true) { + _vm->_objectsManager.DEUXPERSO = false; + v5 = *(a1 + 5); + v6 = (int16)READ_LE_UINT16(a1 + 8); + _vm->_objectsManager.PERX = (int16)READ_LE_UINT16(a1 + 6); + _vm->_objectsManager.PERY = v6; + _vm->_objectsManager.PERI = v5; + if (_vm->_objectsManager.CH_TETE == 1) { + if (_vm->_globals.SAUVEGARDE->data[svField354] == 1 + && _vm->_globals.SAUVEGARDE->data[svField180] + && _vm->_globals.SAUVEGARDE->data[svField181] + && _vm->_globals.SAUVEGARDE->data[svField182] + && _vm->_globals.SAUVEGARDE->data[svField183]) { + _vm->_objectsManager.PERX = _vm->_globals.SAUVEGARDE->data[svField180]; + _vm->_objectsManager.PERY = _vm->_globals.SAUVEGARDE->data[svField181]; + _vm->_objectsManager.PERI = _vm->_globals.SAUVEGARDE->data[svField182]; + } + if (_vm->_globals.SAUVEGARDE->data[svField356] == 1 + && _vm->_globals.SAUVEGARDE->data[svField190] + && _vm->_globals.SAUVEGARDE->data[svField191] + && _vm->_globals.SAUVEGARDE->data[svField192] + && _vm->_globals.SAUVEGARDE->data[svField193]) { + _vm->_objectsManager.PERX = _vm->_globals.SAUVEGARDE->data[svField190]; + _vm->_objectsManager.PERY = _vm->_globals.SAUVEGARDE->data[svField191]; + _vm->_objectsManager.PERI = _vm->_globals.SAUVEGARDE->data[svField192]; + } + if (_vm->_globals.SAUVEGARDE->data[svField357] == 1 + && _vm->_globals.SAUVEGARDE->data[svField185] + && _vm->_globals.SAUVEGARDE->data[svField186] + && _vm->_globals.SAUVEGARDE->data[svField187] + && _vm->_globals.SAUVEGARDE->data[svField188]) { + _vm->_objectsManager.PERX = _vm->_globals.SAUVEGARDE->data[svField185]; + _vm->_objectsManager.PERY = _vm->_globals.SAUVEGARDE->data[svField186]; + _vm->_objectsManager.PERI = _vm->_globals.SAUVEGARDE->data[svField187]; + } + } + if (_vm->_globals.SAUVEGARDE->data[svField356] == 1 && _vm->_globals.SAUVEGARDE->data[svField188] == _vm->_globals.ECRAN) { + _vm->_objectsManager.SPRITE( + _vm->_globals.TETE, + _vm->_globals.SAUVEGARDE->data[svField185], + _vm->_globals.SAUVEGARDE->data[svField186], + 1, + 2, + _vm->_globals.SAUVEGARDE->data[svField189], + 0, + 34, + 190); + _vm->_objectsManager.SPRITE_ON(1); + _vm->_objectsManager.DEUXPERSO = true; + } + if (_vm->_globals.SAUVEGARDE->data[svField357] == 1 + && _vm->_globals.SAUVEGARDE->data[svField355] == 1 + && _vm->_globals.SAUVEGARDE->data[svField193] == _vm->_globals.ECRAN) { + _vm->_objectsManager.SPRITE( + _vm->_globals.TETE, + _vm->_globals.SAUVEGARDE->data[svField190], + _vm->_globals.SAUVEGARDE->data[svField191], + 1, + 3, + _vm->_globals.SAUVEGARDE->data[svField194], + 0, + 20, + 127); + _vm->_objectsManager.SPRITE_ON(1); + _vm->_objectsManager.DEUXPERSO = true; + } + } + v1 = 1; + _vm->_objectsManager.CH_TETE = 0; + } + if (*(a1 + 2) == 'S' && *(a1 + 3) == 'T' && *(a1 + 4) == 'E') { + if (_vm->_objectsManager.DESACTIVE != true) { + v7 = *(a1 + 5); + v70 = *(a1 + 6); + v8 = *(a1 + 7); + v9 = *(a1 + 8); + _vm->_objectsManager.RECALL = 0; + _vm->_globals.OLD_ECRAN = _vm->_globals.ECRAN; + _vm->_globals.SAUVEGARDE->data[svField6] = _vm->_globals.ECRAN; + _vm->_globals.ECRAN = v7; + _vm->_globals.SAUVEGARDE->data[svField5] = v7; + _vm->_objectsManager.PTAILLE = v70; + _vm->_objectsManager.PEROFX = v8; + _vm->_objectsManager.PEROFY = v9; + } + v1 = 1; + } + } + if (*(a1 + 2) == 'B' && *(a1 + 3) == 'O' && *(a1 + 4) == 'F') { + if (_vm->_objectsManager.DESACTIVE != true) + _vm->_objectsManager.VBOB_OFF((int16)READ_LE_UINT16(a1 + 5)); + v1 = 1; + } + if (*(a1 + 2) == 'P' && *(a1 + 3) == 'E' && *(a1 + 4) == 'R') { + v73 = (int16)READ_LE_UINT16(a1 + 5); + if (!_vm->_globals.SAUVEGARDE->data[svField122] && !_vm->_globals.SAUVEGARDE->data[svField356]) { + v70 = 0; + if ((int16)READ_LE_UINT16(a1 + 5) == 14) + v73 = 1; + if (v73 == 17) + v73 = 7; + if (v73 == 18) + v73 = 8; + if (v73 == 19) + v73 = 4; + if (v73 == 15) + v73 = 11; + if (v73 == 16) + v73 = 12; + if (v73 == 1) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(4); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(4); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(4); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(4); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(4); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(4); + } + if (v73 == 2) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(7); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(7); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(7); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(7); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(7); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(7); + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(8); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(8); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(8); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(8); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(8); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(8); + } + if (v73 == 4) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(1); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(1); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(1); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(1); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(1); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(1); + } + if (v73 == 5) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(5); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(5); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(5); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(5); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(5); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(5); + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(6); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(6); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(6); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(6); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(6); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(6); + } + if (v73 == 7) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(2); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(2); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(2); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(2); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(2); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(2); + } + if (v73 == 8) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(3); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(3); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(3); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(3); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(3); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(3); + } + if (v73 == 9) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(5); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(5); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(5); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(5); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(5); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(5); + } + if (v73 == 10) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(6); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(6); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(6); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(6); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(6); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(6); + } + if (v73 == 11) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(7); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(7); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(7); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(7); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(7); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(7); + } + if (v73 == 12) { + if (_vm->_globals.ACTION_SENS == 1) + _vm->_objectsManager.ACTION_DOS(8); + if (_vm->_globals.ACTION_SENS == 3) + _vm->_objectsManager.ACTION_DROITE(8); + if (_vm->_globals.ACTION_SENS == 2) + _vm->_objectsManager.Q_DROITE(8); + if (_vm->_globals.ACTION_SENS == 5) + _vm->_objectsManager.ACTION_FACE(8); + if (_vm->_globals.ACTION_SENS == 8) + _vm->_objectsManager.Q_GAUCHE(8); + if (_vm->_globals.ACTION_SENS == 7) + _vm->_objectsManager.ACTION_GAUCHE(8); + } + } + v1 = 1; + } + if (*(a1 + 2) == 'M' && *(a1 + 3) == 'U' && *(a1 + 4) == 'S') + v1 = 1; + if (*(a1 + 2) == 'W' && *(a1 + 3) == 'A' && *(a1 + 4) == 'I') { + v74 = (int16)READ_LE_UINT16(a1 + 5) / _vm->_globals.vitesse; + if (!v74) + v74 = 1; + v10 = 0; + if (v74 + 1 > 0) { + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + ++v10; + } while (v10 < v74 + 1); + } + v1 = 1; + } + if (*(a1 + 2) == 'O') { + if (*(a1 + 3) == 'B' && *(a1 + 4) == 'P') { + v1 = 1; + _vm->_objectsManager.AJOUTE_OBJET((int16)READ_LE_UINT16(a1 + 5)); + } + if (*(a1 + 2) == 'O' && *(a1 + 3) == 'B' && *(a1 + 4) == 'M') { + v1 = 1; + _vm->_objectsManager.DELETE_OBJET((int16)READ_LE_UINT16(a1 + 5)); + } + } + if (*(a1 + 2) == 'G' && *(a1 + 3) == 'O' && *(a1 + 4) == 'T') + v1 = 2; + if (*(a1 + 2) == 'Z') { + if (*(a1 + 3) == 'O' && *(a1 + 4) == 'N') { + _vm->_objectsManager.ZONE_ON((int16)READ_LE_UINT16(a1 + 5)); + v1 = 1; + } + if (*(a1 + 2) == 'Z' && *(a1 + 3) == 'O' && *(a1 + 4) == 'F') { + _vm->_objectsManager.ZONE_OFF((int16)READ_LE_UINT16(a1 + 5)); + v1 = 1; + } + } + if (*(a1 + 2) == 'E' && *(a1 + 3) == 'X' && *(a1 + 4) == 'I') + v1 = 5; + if (*(a1 + 2) == 'S' && *(a1 + 3) == 'O' && *(a1 + 4) == 'R') { + _vm->_globals.SORTIE = (int16)READ_LE_UINT16(a1 + 5); + v1 = 5; + } + if (*(a1 + 2) == 'B' && *(a1 + 3) == 'C' && *(a1 + 4) == 'A') { + _vm->_globals.CACHE_OFF((int16)READ_LE_UINT16(a1 + 5)); + v1 = 1; + } + if (*(a1 + 2) == 'A' && *(a1 + 3) == 'N' && *(a1 + 4) == 'I') { + v75 = (int16)READ_LE_UINT16(a1 + 5); + if (v75 <= 100) + _vm->_objectsManager.BOBANIM_ON(v75); + else + _vm->_objectsManager.BOBANIM_OFF(v75 - 100); + v1 = 1; + } + if (*(a1 + 2) == 'S' && *(a1 + 3) == 'P' && *(a1 + 4) == 'E') { + v76 = (int16)READ_LE_UINT16(a1 + 5); + if (v76 == 7) + _vm->_talkManager.PARLER_PERSO("rueh1.pe2"); + if (v76 == 8) + _vm->_talkManager.PARLER_PERSO("ruef1.pe2"); + if (v76 == 6) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.OPTI_ONE(20, 0, 14, 4); + } + if (v76 == 12) { + _vm->_fontManager.TEXTE_OFF(9); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.VBL(); + _vm->_talkManager.PARLER_PERSO("bqetueur.pe2"); + } + if (v76 == 600) { + if (!_vm->_globals.internet) { + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_graphicsManager.FADESPD = 1; + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM("BOMBE1A.ANM", 100, 18, 100); + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM("BOMBE1.ANM", 100, 18, 100); + } + _vm->_graphicsManager.LOAD_IMAGE("BOMBEB"); + _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->_graphicsManager.OPTI_INI("BOMBE", 2); + _vm->_graphicsManager.FADE_INS(); + } + if (v76 == 601) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(2, 0, 16, 4); + } + if (v76 == 602) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(4, 0, 16, 4); + } + if (v76 == 603) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(3, 0, 16, 4); + _vm->_soundManager.SPECIAL_SOUND = 199; + _vm->_graphicsManager.FADE_LINUX = 2; + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM("BOMBE2.ANM", 50, 14, 500); + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM("BOMBE2A.ANM", 50, 14, 500); + _vm->_soundManager.SPECIAL_SOUND = 0; + memset(_vm->_graphicsManager.VESA_BUFFER, 0, 0x96000u); + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.SORTIE = 151; + } + if (v76 == 604) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(1, 0, 16, 4); + _vm->_soundManager.SPECIAL_SOUND = 199; + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM("BOMBE2.ANM", 50, 14, 500); + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM("BOMBE2A.ANM", 50, 14, 500); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_graphicsManager.NOFADE = true; + memset(_vm->_graphicsManager.VESA_BUFFER, 0, 0x96000u); + _vm->_globals.SORTIE = 151; + } + if (v76 == 605) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(5, 0, 16, 4); + _vm->_graphicsManager.FADE_OUTS(); + _vm->_soundManager.SPECIAL_SOUND = 199; + _vm->_graphicsManager.FADE_LINUX = 2; + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM("BOMBE2.ANM", 50, 14, 500); + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM("BOMBE2A.ANM", 50, 14, 500); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_graphicsManager.NOFADE = true; + memset(_vm->_graphicsManager.VESA_BUFFER, 0, 0x96000u); + _vm->_globals.SORTIE = 151; + } + if (v76 == 606) { + _vm->_globals.NO_VISU = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 163, 7); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.OPTI_ONE(6, 0, 16, 4); + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM("BOMBE3.ANM", 50, 14, 500); + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM("BOMBE3A.ANM", 50, 14, 500); + memset(_vm->_graphicsManager.VESA_BUFFER, 0, 0x96000u); + _vm->_globals.SORTIE = 6; + } + if (v76 == 607) { + if (!_vm->_globals.internet) { + memcpy(_vm->_graphicsManager.OLD_PAL, _vm->_graphicsManager.Palette, 0x301u); + v1 = _vm->_graphicsManager.OLD_PAL[769]; + _vm->_animationManager.PLAY_ANM2("plan.ANm", 50, 10, 800); + } + _vm->_globals.NBBLOC = 0; + } + if (v76 == 608) { + _vm->_objectsManager.BOBANIM_OFF(2); + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.BOBANIM_OFF(6); + _vm->_objectsManager.BOBANIM_OFF(11); + _vm->_objectsManager.BOBANIM_OFF(10); + } + if (v76 == 609) { + _vm->_objectsManager.BOBANIM_ON(2); + _vm->_objectsManager.BOBANIM_ON(3); + _vm->_objectsManager.BOBANIM_ON(4); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_objectsManager.BOBANIM_ON(11); + _vm->_objectsManager.BOBANIM_ON(10); + } + if (v76 == 611) { + _vm->_objectsManager.BOBANIM_ON(5); + _vm->_objectsManager.BOBANIM_ON(7); + _vm->_objectsManager.BOBANIM_ON(8); + _vm->_objectsManager.BOBANIM_ON(9); + _vm->_objectsManager.BOBANIM_ON(12); + _vm->_objectsManager.BOBANIM_ON(13); + } + if (v76 == 610) { + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.BOBANIM_OFF(7); + _vm->_objectsManager.BOBANIM_OFF(8); + _vm->_objectsManager.BOBANIM_OFF(9); + _vm->_objectsManager.BOBANIM_OFF(12); + _vm->_objectsManager.BOBANIM_OFF(13); + } + if (v76 == 10) + _vm->_talkManager.PARLER_PERSO("bqeflic1.pe2"); + if (v76 == 11) + _vm->_talkManager.PARLER_PERSO("bqeflic2.pe2"); + if (v76 == 16) + _vm->_talkManager.PARLER_PERSO("ftoubib.pe2"); + if (v76 == 17) + _vm->_talkManager.PARLER_PERSO("flic2b.pe2"); + if (v76 == 18) + _vm->_talkManager.PARLER_PERSO("fjour.pe2"); + if (v76 == 13) { + _vm->_eventsManager.souris_b = _vm->_eventsManager.souris_bb; + _vm->_globals.DESACTIVE_INVENT = true; + _vm->_graphicsManager.FADE_OUTW(); + _vm->_globals.CACHE_OFF(); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_fontManager.TEXTE_OFF(5); + _vm->_fontManager.TEXTE_OFF(9); + _vm->_graphicsManager.FIN_VISU(); + _vm->_objectsManager.CLEAR_ECRAN(); + _vm->_soundManager.PLAY_SOUND("SOUND17.WAV"); + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_SEQ2("HELICO.SEQ", 10, 4, 10); + _vm->_animationManager.CHARGE_ANIM("otage"); + _vm->_graphicsManager.LOAD_IMAGE("IM05"); + _vm->_graphicsManager.VISU_ALL(); + v11 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + ++v11; + } while (v11 <= 4); + _vm->_eventsManager.MOUSE_OFF(); + _vm->_graphicsManager.FADE_INW_LINUX(_vm->_graphicsManager.VESA_BUFFER); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(3) != 100); + _vm->_graphicsManager.FADE_OUTW_LINUX(_vm->_graphicsManager.VESA_BUFFER); + _vm->_graphicsManager.FIN_VISU(); + if (!_vm->_globals.CENSURE) { + _vm->_soundManager.SPECIAL_SOUND = 16; + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_ANM("EGORGE.ANM", 50, 28, 500); + _vm->_soundManager.SPECIAL_SOUND = 0; + } + _vm->_animationManager.CHARGE_ANIM("ASCEN"); + _vm->_eventsManager.MOUSE_OFF(); + _vm->_graphicsManager.LOAD_IMAGE("ASCEN"); + _vm->_graphicsManager.VISU_ALL(); + v12 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + ++v12; + } while (v12 <= 4); + _vm->_eventsManager.MOUSE_OFF(); + _vm->_graphicsManager.FADE_INW_LINUX(_vm->_graphicsManager.VESA_BUFFER); + _vm->_objectsManager.SCI_OPTI_ONE(1, 0, 17, 3); + _vm->_graphicsManager.FADE_OUTW_LINUX(_vm->_graphicsManager.VESA_BUFFER); + _vm->_graphicsManager.FIN_VISU(); + _vm->_soundManager.SPECIAL_SOUND = 14; + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_SEQ2("ASSOM.SEQ", 10, 4, 500); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_globals.DESACTIVE_INVENT = false; + _vm->_globals.HELICO = 1; + } + if (v76 == 36) { + if (_vm->_globals.SAUVEGARDE->data[svField270] == 2 && _vm->_globals.SAUVEGARDE->data[svField94] == 1 && _vm->_globals.SAUVEGARDE->data[svField95] == 1) + _vm->_globals.SAUVEGARDE->data[svField270] = 3; + if (!_vm->_globals.SAUVEGARDE->data[svField270]) + _vm->_talkManager.PARLER_PERSO2("PATRON0.pe2"); + if (_vm->_globals.SAUVEGARDE->data[svField270] == 1) + _vm->_talkManager.PARLER_PERSO2("PATRON1.pe2"); + if (_vm->_globals.SAUVEGARDE->data[svField270] == 2) + _vm->_talkManager.PARLER_PERSO2("PATRON2.pe2"); + if (_vm->_globals.SAUVEGARDE->data[svField270] == 3) + _vm->_talkManager.PARLER_PERSO2("PATRON3.pe2"); + if (_vm->_globals.SAUVEGARDE->data[svField270] > 3) { + _vm->_talkManager.PARLER_PERSO2("PATRON4.pe2"); + _vm->_globals.SAUVEGARDE->data[svField270] = 5; + } + } + if (v76 == 37) { + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_SEQ2("corde.SEQ", 32, 32, 100); + _vm->_graphicsManager.NOFADE = true; + } + if (v76 == 38) { + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND44.WAV"); + _vm->_soundManager.CHARGE_SAMPLE(2, "SOUND42.WAV"); + _vm->_soundManager.CHARGE_SAMPLE(3, "SOUND41.WAV"); + _vm->_soundManager.SPECIAL_SOUND = 17; + _vm->_animationManager.PLAY_SEQ(v1, "grenade.SEQ", 1, 32, 100); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_graphicsManager.FADE_LINUX = 2; + _vm->_animationManager.PLAY_ANM("CREVE17.ANM", 24, 24, 200); + _vm->_soundManager.DEL_SAMPLE(1); + _vm->_soundManager.DEL_SAMPLE(2); + _vm->_soundManager.DEL_SAMPLE(3); + _vm->_graphicsManager.NOFADE = true; + } + if (v76 == 29) { + _vm->_globals.DESACTIVE_INVENT = true; + _vm->_talkManager.OBJET_VIVANT("TELEP.pe2"); + _vm->_globals.DESACTIVE_INVENT = false; + } + if (v76 == 22) + _vm->_talkManager.OBJET_VIVANT("CADAVRE1.pe2"); + if (v76 == 20) + _vm->_talkManager.PARLER_PERSO("PUNK.pe2"); + if (v76 == 23) + _vm->_talkManager.PARLER_PERSO2("CHERCHE1.pe2"); + if (v76 == 35) { + if (!_vm->_soundManager.SOUNDOFF) { + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_soundManager.SOUND_FLAG); + } + _vm->_talkManager.PARLER_PERSO("PTLAB.pe2"); + } + if (v76 == 46) { + _vm->_globals.NOT_VERIF = 1; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + v13 = _vm->_objectsManager.YSPR(0); + v14 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v14, v13, 564, 420); + _vm->_objectsManager.NUMZONE = -1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_globals.NOT_VERIF = 1; + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND44.WAV"); + _vm->_soundManager.CHARGE_SAMPLE(2, "SOUND45.WAV"); + _vm->_objectsManager.OPTI_BOBON(9, 10, -1, 0, 0, 0, 0); + v15 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(9) == 4 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(9) == 5) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(9) == 16 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(9) == 17) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(9) == 28 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(9) == 29) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(10) == 10 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(2); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(10) == 11) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(10) == 22 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(2); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(10) == 23) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(10) == 33 && !v15) { + _vm->_soundManager.PLAY_SAMPLE2(2); + v15 = 1; + } + if (_vm->_objectsManager.BOBPOSI(10) == 34) + v15 = 0; + if (_vm->_objectsManager.BOBPOSI(10) == 12) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 249, 1); + if (_vm->_objectsManager.BOBPOSI(10) == 23) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 249, 2); + if (_vm->_objectsManager.BOBPOSI(10) == 34) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 513, 249, 3); + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(9) != 36); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.BOBANIM_OFF(9); + _vm->_objectsManager.BOBANIM_OFF(10); + _vm->_soundManager.DEL_SAMPLE(1); + _vm->_soundManager.DEL_SAMPLE(2); + } + if (v76 == 59) { + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + v16 = _vm->_objectsManager.YSPR(0); + v17 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v17, v16, 445, 332); + _vm->_globals.NOT_VERIF = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(7); + _vm->_objectsManager.SET_BOBPOSI(7, 0); + v18 = 0; + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND40.WAV"); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(7) == 10 && !v18) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v18 = 1; + } + if (_vm->_objectsManager.BOBPOSI(7) == 11) + v18 = 0; + if (_vm->_objectsManager.BOBPOSI(7) == 18 && !v18) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v18 = 1; + } + if (_vm->_objectsManager.BOBPOSI(7) == 19) + v18 = 0; + if (_vm->_objectsManager.BOBPOSI(7) == 19) + _vm->_objectsManager.BOBANIM_ON(3); + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(3) != 48); + _vm->_soundManager.DEL_SAMPLE(1); + _vm->_objectsManager.SETANISPR(0, 62); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_objectsManager.BOBANIM_OFF(7); + _vm->_objectsManager.BOBANIM_OFF(3); + } + if (v76 == 50) { + _vm->_soundManager.PLAY_SOUND("SOUND46.WAv"); + _vm->_objectsManager.OPTI_ONE(11, 0, 23, 0); + } + if (v76 == 49) { + _vm->_globals.CACHE_OFF(); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.OPTI_BOBON(9, 10, -1, 0, 0, 0, 0); + v19 = 12; + if (_vm->_globals.SAUVEGARDE->data[svField133] == 1) + v19 = 41; + v20 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(9) == 4 && !v20) { + _vm->_soundManager.PLAY_SOUND2("SOUND44.WAV"); + v20 = 1; + } + if (_vm->_objectsManager.BOBPOSI(9) == 5) + v20 = 0; + if (_vm->_objectsManager.BOBPOSI(9) == 18 && !v20) { + _vm->_soundManager.PLAY_SOUND2("SOUND46.WAV"); + v20 = 1; + } + if (_vm->_objectsManager.BOBPOSI(9) == 19) + v20 = 0; + if (_vm->_objectsManager.BOBPOSI(10) == 11 && !v20) { + _vm->_soundManager.PLAY_SOUND2("SOUND45.WAV"); + v20 = 1; + } + if (_vm->_objectsManager.BOBPOSI(10) == 12) + v20 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(9) != v19); + if (v19 == 12) { + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.BOBANIM_OFF(9); + } + _vm->_globals.CACHE_ON(); + } + if (v76 == 80) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(12); + _vm->_objectsManager.BOBANIM_ON(13); + _vm->_objectsManager.SET_BOBPOSI(12, 0); + _vm->_objectsManager.SET_BOBPOSI(13, 0); + v21 = 0; + _vm->_soundManager.LOAD_WAV("SOUND44.WAV", 1); + _vm->_soundManager.LOAD_WAV("SOUND71.WAV", 2); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(12) == 4 && !v21) { + _vm->_soundManager.PLAY_WAV(1); + v21 = 1; + } + if (_vm->_objectsManager.BOBPOSI(12) == 5) + v21 = 0; + if (_vm->_objectsManager.BOBPOSI(4) == 5 && !v21) { + _vm->_soundManager.PLAY_WAV(2); + v21 = 1; + } + if (_vm->_objectsManager.BOBPOSI(4) == 6) + v21 = 0; + if (_vm->_objectsManager.BOBPOSI(13) == 8) { + _vm->_objectsManager.BOBANIM_OFF(13); + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.BOBANIM_ON(4); + _vm->_objectsManager.SET_BOBPOSI(4, 0); + _vm->_objectsManager.SET_BOBPOSI(13, 0); + } + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 16); + _vm->_objectsManager.BOBANIM_OFF(12); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM27a"); + _vm->_objectsManager.OBSSEUL = 0; + } + if (v76 == 81) { + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + v22 = _vm->_objectsManager.YSPR(0); + v23 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v23, v22, 119, 268); + _vm->_globals.NOT_VERIF = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(11); + _vm->_objectsManager.BOBANIM_ON(8); + _vm->_objectsManager.SET_BOBPOSI(11, 0); + _vm->_objectsManager.SET_BOBPOSI(8, 0); + _vm->_soundManager.LOAD_WAV("SOUND44.WAV", 1); + _vm->_soundManager.LOAD_WAV("SOUND48.WAV", 2); + _vm->_soundManager.LOAD_WAV("SOUND49.WAV", 3); + v24 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(11) == 4 && !v24) { + _vm->_soundManager.PLAY_WAV(1); + v24 = 1; + } + if (_vm->_objectsManager.BOBPOSI(11) == 5) + v24 = 0; + if (_vm->_objectsManager.BOBPOSI(8) == 11 && !v24) { + _vm->_soundManager.PLAY_WAV(2); + v24 = 1; + } + if (_vm->_objectsManager.BOBPOSI(8) == 12) + v24 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(8) != 32); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 201, 14, 1); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.BOBANIM_OFF(11); + _vm->_objectsManager.BOBANIM_OFF(8); + _vm->_objectsManager.BOBANIM_ON(5); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_objectsManager.SET_BOBPOSI(5, 0); + _vm->_objectsManager.SET_BOBPOSI(6, 0); + _vm->_soundManager.PLAY_WAV(3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 74); + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.BOBANIM_OFF(6); + _vm->_objectsManager.BOBANIM_ON(9); + _vm->_objectsManager.BOBANIM_ON(7); + } + if (v76 == 95) { + _vm->_objectsManager.BOBANIM_ON(9); + _vm->_objectsManager.BOBANIM_ON(10); + _vm->_objectsManager.BOBANIM_ON(12); + _vm->_objectsManager.SET_BOBPOSI(9, 0); + _vm->_objectsManager.SET_BOBPOSI(10, 0); + _vm->_objectsManager.SET_BOBPOSI(12, 0); + _vm->_objectsManager.SPRITE_OFF(0); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(9) != 15); + _vm->_objectsManager.BOBANIM_OFF(9); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_soundManager.PLAY_SOUND("SOUND50.WAV"); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(12) != 117); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 830, 122, 0); + _vm->_objectsManager.BOBANIM_OFF(12); + _vm->_objectsManager.BOBANIM_OFF(10); + _vm->_objectsManager.BOBANIM_ON(11); + } + if (v76 == 85) { + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.BOBANIM_ON(5); + _vm->_objectsManager.SET_BOBPOSI(5, 0); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 6); + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM24a"); + _vm->_objectsManager.OBSSEUL = 0; + } + if (v76 == 88) { + if (_vm->_globals.SAUVEGARDE->data[svField183] == 1) { + _vm->_objectsManager.SET_BOBPOSI(1, 0); + _vm->_objectsManager.SET_BOBPOSI(2, 0); + _vm->_objectsManager.BOBANIM_ON(1); + _vm->_objectsManager.BOBANIM_ON(2); + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND40.WAV"); + v25 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(1) == 1 && !v25) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v25 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 2) + v25 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 3 && !v25) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v25 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 4) + v25 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 5 && !v25) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v25 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 6) + v25 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 7 && !v25) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v25 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 8) + v25 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(1) != 9); + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_objectsManager.BOBANIM_OFF(2); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 283, 160, 6); + _vm->_soundManager.DEL_SAMPLE(1); + } + if (_vm->_globals.SAUVEGARDE->data[svField183] == 2) { + _vm->_objectsManager.SET_BOBPOSI(1, 0); + _vm->_objectsManager.SET_BOBPOSI(3, 0); + _vm->_objectsManager.BOBANIM_ON(1); + _vm->_objectsManager.BOBANIM_ON(3); + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND40.WAV"); + v26 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(1) == 1 && !v26) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v26 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 2) + v26 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 3 && !v26) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v26 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 4) + v26 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 5 && !v26) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v26 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 6) + v26 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 7 && !v26) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v26 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 8) + v26 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(1) != 9); + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 283, 161, 8); + _vm->_soundManager.DEL_SAMPLE(1); + } + } + if (v76 == 90) { + _vm->_soundManager.PLAY_SOUND("SOUND52.WAV"); + if (!_vm->_globals.SAUVEGARDE->data[svField186]) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB5A.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 0); + } + if (_vm->_globals.SAUVEGARDE->data[svField186] == 1) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB5C.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 329, 87, 2); + } + } + if (v76 == 91) { + _vm->_soundManager.PLAY_SOUND("SOUND52.WAV"); + if (!_vm->_globals.SAUVEGARDE->data[svField186]) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB5B.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 5); + } + if (_vm->_globals.SAUVEGARDE->data[svField186] == 1) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB5D.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 5); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 283, 160, 6); + } + } + if (v76 == 92) { + _vm->_soundManager.PLAY_SOUND("SOUND52.WAV"); + if (!_vm->_globals.SAUVEGARDE->data[svField184]) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB6A.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 0); + } + if (_vm->_globals.SAUVEGARDE->data[svField184] == 1) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB6C.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 293, 139, 3); + } + } + if (v76 == 93) { + _vm->_soundManager.PLAY_SOUND("SOUND52.WAV"); + if (!_vm->_globals.SAUVEGARDE->data[svField184]) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB6B.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 5); + } + if (_vm->_globals.SAUVEGARDE->data[svField184] == 1) { + _vm->_animationManager.PLAY_SEQ(v1, "CIB6D.SEQ", 1, 12, 1); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 155, 29, 5); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 283, 161, 8); + } + } + if (v76 == 62) + _vm->_talkManager.OBJET_VIVANT("SBCADA.pe2"); + if (v76 == 65) + _vm->_talkManager.OBJET_VIVANT("ScCADA.pe2"); + if (v76 == 105) { + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + if (_vm->_globals.SAUVEGARDE->data[svField253] == 1) { + v27 = _vm->_objectsManager.YSPR(0); + v28 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v28, v27, 201, 294); + } + if (_vm->_globals.SAUVEGARDE->data[svField253] == 2) { + v29 = _vm->_objectsManager.YSPR(0); + v30 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v30, v29, 158, 338); + } + if (_vm->_globals.SAUVEGARDE->data[svField253] > 2) { + v31 = _vm->_objectsManager.YSPR(0); + v32 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v32, v31, 211, 393); + } + _vm->_globals.NOT_VERIF = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.SETANISPR(0, 60); + _vm->_soundManager.CHARGE_SAMPLE(1, "SOUND63.WAV"); + if (_vm->_globals.SAUVEGARDE->data[svField253] > 2) { + _vm->_objectsManager.BOBANIM_ON(4); + v33 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(4) == 9 && !v33) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v33 = 1; + } + if (_vm->_objectsManager.BOBPOSI(4) == 10) + v33 = 0; + if (_vm->_objectsManager.BOBPOSI(4) == 32 && !v33) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v33 = 1; + } + if (_vm->_objectsManager.BOBPOSI(4) == 33) + v33 = 0; + if (_vm->_objectsManager.BOBPOSI(4) == 55 && !v33) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v33 = 1; + } + if (_vm->_objectsManager.BOBPOSI(4) == 56) + v33 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 72); + _vm->_objectsManager.BOBANIM_OFF(4); + } + if (_vm->_globals.SAUVEGARDE->data[svField253] == 1) { + _vm->_objectsManager.BOBANIM_ON(6); + v34 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(6) == 9 && !v34) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v34 = 1; + } + if (_vm->_objectsManager.BOBPOSI(6) == 10) + v34 = 0; + if (_vm->_objectsManager.BOBPOSI(6) == 32 && !v34) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v34 = 1; + } + if (_vm->_objectsManager.BOBPOSI(6) == 33) + v34 = 0; + if (_vm->_objectsManager.BOBPOSI(6) == 55 && !v34) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v34 = 1; + } + if (_vm->_objectsManager.BOBPOSI(6) == 56) + v34 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(6) != 72); + _vm->_objectsManager.BOBANIM_OFF(6); + } + if (_vm->_globals.SAUVEGARDE->data[svField253] == 2) { + _vm->_objectsManager.BOBANIM_ON(5); + v35 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(5) == 9 && !v35) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v35 = 1; + } + if (_vm->_objectsManager.BOBPOSI(5) == 10) + v35 = 0; + if (_vm->_objectsManager.BOBPOSI(5) == 32 && !v35) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v35 = 1; + } + if (_vm->_objectsManager.BOBPOSI(5) == 33) + v35 = 0; + if (_vm->_objectsManager.BOBPOSI(5) == 55 && !v35) { + _vm->_soundManager.PLAY_SAMPLE2(1); + v35 = 1; + } + if (_vm->_objectsManager.BOBPOSI(5) == 56) + v35 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 72); + _vm->_objectsManager.BOBANIM_OFF(5); + } + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.ACTION_DOS(1); + _vm->_soundManager.DEL_SAMPLE(1); + } + if (v76 == 106) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(4); + _vm->_objectsManager.SET_BOBPOSI(4, 0); + _vm->_soundManager.LOAD_WAV("SOUND61.WAV", 1); + _vm->_soundManager.LOAD_WAV("SOUND62.WAV", 2); + _vm->_soundManager.LOAD_WAV("SOUND61.WAV", 3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 10); + _vm->_soundManager.PLAY_WAV(1); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 18); + _vm->_soundManager.PLAY_WAV(2); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 62); + _vm->_soundManager.PLAY_WAV(3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 77); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 107) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(5); + _vm->_objectsManager.SET_BOBPOSI(5, 0); + _vm->_soundManager.LOAD_WAV("SOUND61.WAV", 1); + _vm->_soundManager.LOAD_WAV("SOUND62.WAV", 2); + _vm->_soundManager.LOAD_WAV("SOUND61.WAV", 3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 10); + _vm->_soundManager.PLAY_WAV(1); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 18); + _vm->_soundManager.PLAY_WAV(2); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 38); + _vm->_soundManager.PLAY_WAV(3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(5) != 53); + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 210) { + _vm->_animationManager.NO_SEQ = true; + _vm->_soundManager.SPECIAL_SOUND = 210; + _vm->_animationManager.PLAY_SEQ2("SECRET1.SEQ", 1, 12, 1); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 192, 152, 0); + _vm->_objectsManager.BOBANIM_ON(9); + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM73a"); + _vm->_objectsManager.OBSSEUL = 0; + _vm->_globals.CACHE_ON(); + _vm->_animationManager.NO_SEQ = false; + _vm->_globals.CACHE_ADD(0); + _vm->_globals.CACHE_ADD(1); + _vm->_graphicsManager.SETCOLOR4(252, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(253, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(254, 0, 0, 0); + } + if (v76 == 211) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_globals.CACHE_OFF(); + _vm->_animationManager.NO_SEQ = true; + _vm->_globals.NO_VISU = false; + _vm->_soundManager.SPECIAL_SOUND = 211; + _vm->_animationManager.PLAY_SEQ(v1, "SECRET2.SEQ", 1, 12, 100); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_animationManager.NO_SEQ = false; + _vm->_graphicsManager.NOFADE = true; + _vm->_graphicsManager.FADE_OUTW(); + v36 = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + ++v36; + } while (v36 <= 39); + _vm->_graphicsManager.SETCOLOR4(252, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(253, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(251, 100, 100, 100); + _vm->_graphicsManager.SETCOLOR4(254, 0, 0, 0); + } + if (v76 == 207) + _vm->_talkManager.OBJET_VIVANT("PANNEAU.PE2"); + if (v76 == 208) { + _vm->_globals.DESACTIVE_INVENT = true; + if (_vm->_globals.SAUVEGARDE->data[svField6] != _vm->_globals.SAUVEGARDE->data[svField401]) { + _vm->_soundManager.SPECIAL_SOUND = 208; + _vm->_eventsManager.NOESC = true; + _vm->_animationManager.PLAY_SEQ(v1, "SORT.SEQ", 10, 4, 10); + _vm->_eventsManager.NOESC = false; + _vm->_soundManager.SPECIAL_SOUND = 0; + } + _vm->_globals.NOT_VERIF = 1; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + v37 = _vm->_objectsManager.YSPR(0); + v38 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v38, v37, 330, 418); + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.NUMZONE = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SETANISPR(0, 64); + _vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField401]; + _vm->_globals.DESACTIVE_INVENT = false; + } + if (v76 == 209) { + _vm->_objectsManager.SET_BOBPOSI(1, 0); + _vm->_objectsManager.SET_BOBPOSI(2, 0); + _vm->_objectsManager.SETANISPR(0, 60); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.BOBANIM_ON(1); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(1) != 9); + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_globals.NO_VISU = true; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.NOT_VERIF = 1; + v39 = _vm->_objectsManager.YSPR(0); + v40 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v40, v39, 330, 314); + _vm->_objectsManager.NUMZONE = 0; + _vm->_globals.NOT_VERIF = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SETANISPR(0, 64); + _vm->_objectsManager.BOBANIM_ON(2); + _vm->_soundManager.PLAY_SOUND("SOUND66.WAV"); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(2) != 10); + _vm->_objectsManager.BOBANIM_OFF(2); + _vm->_objectsManager.BOBANIM_ON(4); + } + if (v76 == 201) { + _vm->_objectsManager.BOBANIM_ON(3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(3) != 18); + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.BOBANIM_ON(4); + } + if (v76 == 203) { + _vm->_globals.NO_VISU = true; + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(4); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + if (_vm->_objectsManager.BOBPOSI(4) == 18) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 18, 334, 0); + } while (_vm->_objectsManager.BOBPOSI(4) != 26); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_globals.NO_VISU = false; + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 204) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(3); + _vm->_soundManager.LOAD_WAV("SOUND67.WAV", 1); + v41 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(3) == 10 && !v41) { + _vm->_soundManager.PLAY_WAV(1); + v41 = 1; + } + if (_vm->_objectsManager.BOBPOSI(3) == 11) + v41 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(3) != 50); + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 205) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(4); + _vm->_soundManager.LOAD_WAV("SOUND69.WAV", 1); + v42 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(4) == 10 && !v42) { + _vm->_soundManager.PLAY_WAV(1); + v42 = 1; + } + if (_vm->_objectsManager.BOBPOSI(4) == 11) + v42 = 0; + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(4) != 24); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 175) { + _vm->_objectsManager.SETANISPR(0, 55); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(9); + _vm->_objectsManager.BOBANIM_ON(10); + _vm->_objectsManager.BOB_OFFSET(10, 300); + _vm->_soundManager.PLAY_SOUND("SOUND44.WAV"); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(10) != 7); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_objectsManager.BOBANIM_OFF(3); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(6) != 10); + _vm->_soundManager.PLAY_SOUND("SOUND71.WAV"); + _vm->_objectsManager.BOBANIM_ON(7); + _vm->_objectsManager.BOBANIM_OFF(4); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(7) != 15); + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.BOBANIM_ON(8); + _vm->_soundManager.PLAY_SOUND("SOUND70.WAV"); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(8) != 76); + _vm->_objectsManager.BOBANIM_OFF(6); + _vm->_objectsManager.BOBANIM_OFF(7); + _vm->_objectsManager.BOBANIM_OFF(8); + _vm->_objectsManager.BOBANIM_OFF(9); + _vm->_objectsManager.BOBANIM_OFF(10); + _vm->_objectsManager.SPRITE_ON(0); + } + if (v76 == 229) { + _vm->_soundManager.SPECIAL_SOUND = 229; + _vm->_animationManager.PLAY_SEQ(v1, "MUR.SEQ", 1, 12, 1); + _vm->_soundManager.SPECIAL_SOUND = 0; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 340, 157, 2); + } + if (v76 == 230) { + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM93a"); + _vm->_objectsManager.OBSSEUL = 0; + _vm->_globals.CACHE_ON(); + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.NOT_VERIF = 1; + v43 = _vm->_objectsManager.YSPR(0); + v44 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v44, v43, 488, 280); + _vm->_globals.NOT_VERIF = 1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_objectsManager.SPRITE_OFF(0); + v45 = 0; + _vm->_objectsManager.BOBANIM_ON(7); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(7) == 9 && !v45) { + v45 = 1; + _vm->_soundManager.PLAY_SOUND("SOUND81.WAV"); + } + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(7) != 15); + _vm->_objectsManager.BOBANIM_OFF(7); + _vm->_objectsManager.SETXSPR(0, 476); + _vm->_objectsManager.SETYSPR(0, 278); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 337, 154, 3); + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM93c"); + _vm->_objectsManager.OBSSEUL = 0; + _vm->_globals.CACHE_ON(); + } + if (v76 == 231) { + _vm->_globals.CACHE_OFF(); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(12); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(12) != 6); + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("PRMORT.pe2"); + _vm->_globals.NOPARLE = false; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(12) != 12); + _vm->_objectsManager.SPRITE_ON(0); + _vm->_objectsManager.BOBANIM_OFF(12); + _vm->_globals.CACHE_ON(); + } + if (v76 == 233) { + _vm->_globals.CACHE_OFF(); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.BOBANIM_ON(11); + v46 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + if (_vm->_objectsManager.BOBPOSI(11) == 10 && !v46) + v46 = 1; + } while (_vm->_objectsManager.BOBPOSI(11) != 13); + _vm->_objectsManager.BOBANIM_OFF(11); + _vm->_globals.CACHE_ON(); + _vm->_objectsManager.BOBANIM_ON(13); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(13) != 48); + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("HRADIO.PE2"); + _vm->_globals.NOPARLE = false; + _vm->_graphicsManager.FADE_OUTW(); + _vm->_objectsManager.BOBANIM_OFF(13); + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.SORTIE = 94; + } + if (v76 == 52) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("GARDE.PE2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 53) + _vm->_talkManager.PARLER_PERSO("GARDE1.pe2"); + if (v76 == 54) + _vm->_talkManager.PARLER_PERSO("GARDE2.pe2"); + if (v76 == 40) + _vm->_talkManager.PARLER_PERSO("MAGE.pe2"); + if (v76 == 236) { + v47 = _vm->_globals.SAUVEGARDE->data[svField341]; + if (v47) { + if (v47 == 2) + v70 = 5; + if (v47 == 3) + v70 = 4; + if (v47 == 1) + v70 = 6; + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(v70, 26, 50, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 27, 117, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 145, 166, 2); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 296, 212, 4); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_globals.SAUVEGARDE->data[svField338] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_globals.SAUVEGARDE->data[svField339] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_globals.SAUVEGARDE->data[svField340] = 0; + } + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(6, 0, 23, 0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 27, 117, 1); + } + if (v76 == 237) { + v48 = _vm->_globals.SAUVEGARDE->data[svField341]; + if (v48) { + if (v48 == 2) + v70 = 5; + if (v48 == 3) + v70 = 4; + if (v48 == 1) + v70 = 6; + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(v70, 26, 50, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 27, 117, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 145, 166, 2); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 296, 212, 4); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_globals.SAUVEGARDE->data[svField338] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_globals.SAUVEGARDE->data[svField339] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_globals.SAUVEGARDE->data[svField340] = 0; + } + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(5, 0, 23, 0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 145, 166, 3); + } + if (v76 == 238) { + v49 = _vm->_globals.SAUVEGARDE->data[svField341]; + if (v49) { + if (v49 == 2) + v70 = 5; + if (v49 == 3) + v70 = 4; + if (v49 == 1) + v70 = 6; + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(v70, 26, 50, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 27, 117, 0); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 145, 166, 2); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 296, 212, 4); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 1) + _vm->_globals.SAUVEGARDE->data[svField338] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) + _vm->_globals.SAUVEGARDE->data[svField339] = 0; + if (_vm->_globals.SAUVEGARDE->data[svField341] == 3) + _vm->_globals.SAUVEGARDE->data[svField340] = 0; + } + _vm->_soundManager.PLAY_SOUND("SOUND83.WAV"); + _vm->_objectsManager.OPTI_ONE(4, 0, 23, 0); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 296, 212, 5); + } + if (v76 == 239) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_soundManager.PLAY_SOUND("SOUND84.WAV"); + _vm->_objectsManager.OPTI_ONE(16, 0, 10, 0); + } + if (v76 == 240) { + _vm->_objectsManager.BOBANIM_ON(1); + v50 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + if (_vm->_objectsManager.BOBPOSI(1) == 12 && !v50) { + _vm->_soundManager.PLAY_SOUND("SOUND86.WAV"); + v50 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 13) + v50 = 0; + if (_vm->_objectsManager.BOBPOSI(1) == 25 && !v50) { + _vm->_soundManager.PLAY_SOUND("SOUND85.WAV"); + v50 = 1; + } + if (_vm->_objectsManager.BOBPOSI(1) == 25) + v50 = 0; + } while (_vm->_objectsManager.BOBPOSI(1) != 32); + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_objectsManager.BOBANIM_ON(2); + _vm->_fontManager.TEXTE_OFF(9); + if (!_vm->_soundManager.TEXTOFF) { + _vm->_fontManager.DOS_TEXT(9, 617, _vm->_globals.FICH_TEXTE, 91, 41, 20, 25, 3, 30, 253); + _vm->_fontManager.TEXTE_ON(9); + } + if (!_vm->_soundManager.VOICEOFF) + _vm->_soundManager.VOICE_MIX(617, 4); + v71 = 0; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_eventsManager.VBL(); + ++v71; + } while (v71 <= 29); + v51 = &_vm->_globals.SAUVEGARDE->field370; + v51->field0 = _vm->_objectsManager.XSPR(0); + v51->field1 = _vm->_objectsManager.YSPR(0); + v51->field2 = 57; + v51->field3 = 97; + _vm->_globals.SAUVEGARDE->data[svField121] = 1; + _vm->_globals.SAUVEGARDE->data[svField352] = 1; + _vm->_globals.SAUVEGARDE->data[svField353] = 1; + _vm->_globals.SAUVEGARDE->data[svField354] = 1; + } + if (v76 == 56) { + _vm->_fileManager.CONSTRUIT_SYSTEM("HOPFEM.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 1; + _vm->_globals.SAUVEGARDE->data[svField122] = 1; + _vm->_globals.HOPKINS_DATA(); + _vm->_objectsManager.Sprite[0].field12 = 28; + _vm->_objectsManager.Sprite[0].field14 = 155; + _vm->_objectsManager.VERIFTAILLE(); + } + if (v76 == 57) { + _vm->_fileManager.CONSTRUIT_SYSTEM("PERSO.SPR"); + _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO); + _vm->_globals.PERSO_TYPE = 0; + _vm->_globals.SAUVEGARDE->data[svField122] = 0; + _vm->_globals.HOPKINS_DATA(); + _vm->_objectsManager.Sprite[0].field12 = 34; + _vm->_objectsManager.Sprite[0].field14 = 190; + _vm->_objectsManager.VERIFTAILLE(); + } + if (v76 == 25) + _vm->_talkManager.PARLER_PERSO("AGENT1.pe2"); + if (v76 == 26) + _vm->_talkManager.PARLER_PERSO("AGENT2.pe2"); + if (v76 == 87) { + if (_vm->_globals.SAUVEGARDE->data[svField188]) + _vm->_talkManager.PARLER_PERSO("stand2.pe2"); + else + _vm->_talkManager.PARLER_PERSO("stand1.pe2"); + } + if (v76 == 86) { + if (_vm->_globals.SAUVEGARDE->data[svField231] == 1) { + _vm->_talkManager.PARLER_PERSO("chotess1.pe2"); + } else { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("chotesse.pe2"); + _vm->_globals.NOPARLE = false; + } + } + if (v76 == 51) { + _vm->_graphicsManager.FADE_OUTW(); + _vm->_globals.CACHE_OFF(); + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_fontManager.TEXTE_OFF(5); + _vm->_fontManager.TEXTE_OFF(9); + _vm->_graphicsManager.FIN_VISU(); + _vm->_graphicsManager.LOAD_IMAGE("IM20f"); + _vm->_animationManager.CHARGE_ANIM("ANIM20f"); + _vm->_graphicsManager.VISU_ALL(); + _vm->_eventsManager.MOUSE_OFF(); + _vm->_graphicsManager.FADE_INW(); + v52 = 0; + _vm->_soundManager.LOAD_WAV("SOUND46.WAV", 1); + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + if (_vm->_objectsManager.BOBPOSI(12) == 5 && !v52) { + _vm->_soundManager.PLAY_WAV(1); + v52 = 1; + } + _vm->_eventsManager.VBL(); + } while (_vm->_objectsManager.BOBPOSI(12) != 34); + _vm->_objectsManager.BOBANIM_OFF(2); + _vm->_graphicsManager.FADE_OUTW(); + _vm->_graphicsManager.NOFADE = true; + _vm->_globals.SORTIE = 20; + } + if (v76 == 41) + _vm->_talkManager.PARLER_PERSO("MORT3.pe2"); + if (v76 == 44) + _vm->_talkManager.PARLER_PERSO("MORT3A.pe2"); + if (v76 == 42) + _vm->_talkManager.PARLER_PERSO("MORT2.pe2"); + if (v76 == 43) + _vm->_talkManager.PARLER_PERSO("MORT1.pe2"); + if (v76 == 47) + _vm->_talkManager.PARLER_PERSO("BARMAN.pe2"); + if (v76 == 45) + _vm->_talkManager.PARLER_PERSO("FEM3.pe2"); + if (v76 == 48) + _vm->_talkManager.PARLER_PERSO("SAMAN2.pe2"); + if (v76 == 21) + _vm->_talkManager.PARLER_PERSO("MEDLEG.pe2"); + if (v76 == 94) { + if (!_vm->_globals.SAUVEGARDE->data[svField228]) + _vm->_talkManager.PARLER_PERSO("flicn.pe2"); + if (_vm->_globals.SAUVEGARDE->data[svField228] == 1) + _vm->_talkManager.PARLER_PERSO("flicn1.pe2"); + } + if (v76 == 27) { + if (_vm->_globals.SAUVEGARDE->data[svField94] != 1 || _vm->_globals.SAUVEGARDE->data[svField95] != 1) + _vm->_talkManager.PARLER_PERSO("STANDAR.pe2"); + else + _vm->_talkManager.PARLER_PERSO("STANDAR1.pe2"); + } + if (v76 == 58) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("Gm1.PE2"); + _vm->_globals.SAUVEGARDE->data[svField176] = 1; + _vm->_globals.SAUVEGARDE->data[svField270] = 2; + _vm->_globals.NOPARLE = false; + } + if (v76 == 200) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("Gm2.PE2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 84) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("CVIGIL1.PE2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 98) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("CVIGIL2.PE2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 83) + _vm->_talkManager.PARLER_PERSO("CVIGIL.pe2"); + if (v76 == 32) + _vm->_talkManager.PARLER_PERSO("SAMAN.pe2"); + if (v76 == 215) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("aviat.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 216) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("aviat1.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 170) + _vm->_talkManager.PARLER_PERSO("GRED.pe2"); + if (v76 == 172) + _vm->_talkManager.PARLER_PERSO("GBLEU.pe2"); + if (v76 == 100) + _vm->_talkManager.PARLER_PERSO("tourist.pe2"); + if (v76 == 103) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("tourist1.pe2"); + _vm->_globals.NOPARLE = false; + if (_vm->_globals.SVGA == 1) + _vm->_animationManager.PLAY_ANM2("T421.ANM", 100, 14, 500); + if (_vm->_globals.SVGA == 2) + _vm->_animationManager.PLAY_ANM2("T421a.ANM", 100, 14, 500); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.VBL(); + _vm->_eventsManager.VBL(); + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("tourist2.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 104) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("tourist3.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 108) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("peche1.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 109) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("peche2.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 110) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("peche3.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 111) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("peche4.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 112) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("teint1.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 176) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("gred2.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 177) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("gbleu2.pe2"); + _vm->_globals.NOPARLE = false; + } + if (v76 == 113) + _vm->_talkManager.PARLER_PERSO("teint.pe2"); + if (v76 == 114) + _vm->_talkManager.PARLER_PERSO("tahibar.pe2"); + if (v76 == 115) + _vm->_talkManager.PARLER_PERSO("ilebar.pe2"); + if (v76 == 116) + _vm->_talkManager.PARLER_PERSO("Profred.pe2"); + if (v76 == 101) + _vm->_talkManager.PARLER_PERSO("tahi1.pe2"); + if (v76 == 243) { + _vm->_soundManager.PLAY_SOUND("SOUND88.WAV"); + if (_vm->_globals.SAUVEGARDE->data[svField341] == 2) { + _vm->_animationManager.NO_SEQ = true; + _vm->_animationManager.PLAY_SEQ(v1, "RESU.SEQ", 2, 24, 2); + _vm->_animationManager.NO_SEQ = false; + } else { + _vm->_objectsManager.OPTI_ONE(7, 0, 14, 0); + } + } + if (v76 == 242) { + _vm->_soundManager.PLAY_SOUND("SOUND87.WAV"); + _vm->_animationManager.NO_SEQ = true; + _vm->_animationManager.PLAY_SEQ(v1, "RESUF.SEQ", 1, 24, 1); + _vm->_animationManager.NO_SEQ = false; + v53 = &_vm->_globals.SAUVEGARDE->field380; + v53->field0 = 404; + v53->field1 = 395; + v53->field2 = 64; + v53->field3 = _vm->_globals.ECRAN; + + v54 = _vm->_globals.STAILLE[790 / 2]; + if (_vm->_globals.STAILLE[790 / 2] < 0) + v54 = -_vm->_globals.STAILLE[790 / 2]; + v76 = -(100 * (67 - (100 - v54)) / 67); + v53->field4 = v76; + _vm->_globals.SAUVEGARDE->data[svField357] = 1; + _vm->_globals.SAUVEGARDE->data[svField354] = 0; + _vm->_globals.SAUVEGARDE->data[svField356] = 0; + _vm->_globals.SAUVEGARDE->data[svField355] = 1; + _vm->_objectsManager.DEUXPERSO = true; + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 373, 191, 3); + _vm->_objectsManager.SPRITE(_vm->_globals.TETE, v53->field0, v53->field1, 1, 3, v53->field4, 0, 20, 127); + _vm->_objectsManager.SPRITE_ON(1); + } + if (v76 == 245) { + _vm->_soundManager.PLAY_SOUND("SOUND89.WAV"); + _vm->_objectsManager.OPTI_ONE(5, 0, 6, 0); + _vm->_globals.ZONEP[4].destX = 276; + _vm->_objectsManager.VERBE_ON(4, 19); + _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 285, 379, 0); + _vm->_globals.SAUVEGARDE->data[svField399] = 1; + } + if (v76 == 246) { + _vm->_objectsManager.SPRITE_OFF(0); + _vm->_objectsManager.OPTI_ONE(6, 0, 15, 0); + _vm->_objectsManager.PERSO_ON = true; + _vm->_graphicsManager.NB_SCREEN(); + _vm->_animationManager.NO_SEQ = true; + _vm->_animationManager.PLAY_SEQ2("TUNNEL.SEQ", 1, 18, 20); + _vm->_animationManager.NO_SEQ = false; + _vm->_graphicsManager.NOFADE = true; + _vm->_graphicsManager.FADE_OUTW(); + _vm->_objectsManager.PERSO_ON = false; + _vm->_globals.SORTIE = 100; + } + if (v76 == 55) { + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_objectsManager.OPTI_ONE(15, 0, 12, 0); + _vm->_objectsManager.BOBANIM_OFF(15); + _vm->_objectsManager.OBSSEUL = 1; + _vm->_objectsManager.INILINK("IM19a"); + _vm->_objectsManager.OBSSEUL = 0; + } + if (v76 == 241) + _vm->_talkManager.PARLER_PERSO("RECEP.PE2"); + if (v76 == 171) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("gred1.pe2"); + _vm->_globals.NOPARLE = false; + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.NOT_VERIF = 1; + v55 = _vm->_objectsManager.YSPR(0); + v56 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v56, v55, 361, 325); + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.NUMZONE = -1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_globals.SORTIE = 59; + } + if (v76 == 173) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("gbleu1.pe2"); + _vm->_globals.NOPARLE = false; + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.g_old_x = _vm->_objectsManager.XSPR(0); + _vm->_globals.g_old_sens = -1; + _vm->_globals.Compteur = 0; + _vm->_globals.chemin = (int16 *)g_PTRNUL; + _vm->_globals.NOT_VERIF = 1; + v57 = _vm->_objectsManager.YSPR(0); + v58 = _vm->_objectsManager.XSPR(0); + _vm->_globals.chemin = _vm->_linesManager.PARCOURS2(v58, v57, 361, 325); + _vm->_globals.NOT_VERIF = 1; + _vm->_objectsManager.NUMZONE = -1; + do { + if (_vm->shouldQuit()) + return -1; // Exiting game + + _vm->_objectsManager.GOHOME(); + _vm->_eventsManager.VBL(); + } while (_vm->_globals.chemin != (int16 *)g_PTRNUL); + _vm->_globals.SORTIE = 59; + } + if (v76 == 174) + _vm->_talkManager.PARLER_PERSO("Profbl.pe2"); + if (v76 == 202) { + _vm->_globals.NOPARLE = true; + _vm->_talkManager.PARLER_PERSO("SVGARD2.PE2"); + _vm->_globals.NOPARLE = false; + } + v1 = 1; + } + if (*(a1 + 2) == 'E' && *(a1 + 3) == 'I' && *(a1 + 4) == 'F') + v1 = 4; + if (*(a1 + 2) == 'V' && *(a1 + 3) == 'A' && *(a1 + 4) == 'L') { + v1 = 1; + _vm->_globals.SAUVEGARDE->data[(int16)READ_LE_UINT16(a1 + 5)] = (int16)READ_LE_UINT16(a1 + 7); + } + if (*(a1 + 2) == 'A' && *(a1 + 3) == 'D' && *(a1 + 4) == 'D') { + v1 = 1; + _vm->_globals.SAUVEGARDE->data[(int16)READ_LE_UINT16(a1 + 5)] += *(a1 + 7); + } + if (*(a1 + 2) == 'B' && *(a1 + 3) == 'O' && *(a1 + 4) == 'S') { + v1 = 1; + _vm->_objectsManager.BOB_OFFSET((int16)READ_LE_UINT16(a1 + 5), (int16)READ_LE_UINT16(a1 + 7)); + } + if (*(a1 + 2) == 'V' && *(a1 + 3) == 'O' && *(a1 + 4) == 'N') { + _vm->_objectsManager.VERBE_ON((int16)READ_LE_UINT16(a1 + 5), (int16)READ_LE_UINT16(a1 + 7)); + v1 = 1; + } + if (*(a1 + 2) == 'Z' && *(a1 + 3) == 'C' && *(a1 + 4) == 'H') { + _vm->_globals.ZONEP[(int16)READ_LE_UINT16(a1 + 5)].field12 = (int16)READ_LE_UINT16(a1 + 7); + v1 = 1; + } + if (*(a1 + 2) == 'J' && *(a1 + 3) == 'U' && *(a1 + 4) == 'M') { + v59 = (int16)READ_LE_UINT16(a1 + 7); + _vm->_objectsManager.NVZONE = (int16)READ_LE_UINT16(a1 + 5); + _vm->_objectsManager.NVVERBE = v59; + v1 = 6; + } + if (*(a1 + 2) == 'S' && *(a1 + 3) == 'O' && *(a1 + 4) == 'U') { + v60 = (int16)READ_LE_UINT16(a1 + 5); + memset(&s, 0, 0x13u); + + v77 = Common::String::format("SOUND%d.WAV", v60); + _vm->_soundManager.PLAY_SOUND(s); + v1 = 1; + } + if (*(a1 + 2) == 'V' && *(a1 + 3) == 'O' && *(a1 + 4) == 'F') { + _vm->_objectsManager.VERBE_OFF((int16)READ_LE_UINT16(a1 + 5), (int16)READ_LE_UINT16(a1 + 7)); + v1 = 1; + } + if (*(a1 + 2) == 'I' && *(a1 + 3) == 'I' && *(a1 + 4) == 'F') { + v1 = 3; + } + + return v1; +} + + +int ScriptManager::Control_Goto(const byte *dataP) { + return (int16)READ_LE_UINT16(dataP + 5); +} + +int ScriptManager::Control_If(const byte *dataP, int a2) { + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + const byte *v8; + int v9; + int v10; + int v11; + int v12; + int v14; + int v15; + int v16; + int v17; + int v18; + int v19; + int v20; + + v2 = a2; +LABEL_2: + v3 = v2; + do { + if (_vm->shouldQuit()) + return 0; // Exiting game + + ++v3; + v4 = Traduction2(dataP + 20 * v3); + if (v3 > 400) { + v5 = v4; + error("Control if failed"); + v4 = v5; + } + } while (v4 != 4); + v20 = v3; + v6 = v2; + v7 = 0; + do { + if (_vm->shouldQuit()) + return 0; // Exiting game + + ++v6; + if (Traduction2(dataP + 20 * v6) == 3) + v7 = 1; + if (v6 > 400) + error("Control if failed "); + if (v7 == 1) { + v2 = v20; + goto LABEL_2; + } + } while (v20 != v6); + v8 = dataP + 20 * a2; + v9 = *(v8 + 13); + v17 = *(v8 + 14); + v16 = *(v8 + 15); + v10 = (int16)READ_LE_UINT16(v8 + 5); + v11 = (int16)READ_LE_UINT16(v8 + 7); + v19 = (int16)READ_LE_UINT16(v8 + 9); + v18 = (int16)READ_LE_UINT16(v8 + 11); + v14 = 0; + v15 = 0; + if (v9 == 1 && _vm->_globals.SAUVEGARDE->data[v10] == v11) + v14 = 1; + if (v9 == 2 && _vm->_globals.SAUVEGARDE->data[v10] != v11) + v14 = 1; + if (v9 == 3 && _vm->_globals.SAUVEGARDE->data[v10] <= v11) + v14 = 1; + if (v9 == 4 && _vm->_globals.SAUVEGARDE->data[v10] >= v11) + v14 = 1; + if (v9 == 5 && _vm->_globals.SAUVEGARDE->data[v10] > v11) + v14 = 1; + if (v9 == 6 && _vm->_globals.SAUVEGARDE->data[v10] < v11) + v14 = 1; + if (v16 == 3) + goto LABEL_68; + if (v17 == 1 && v18 == _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v17 == 2 && v18 != _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v17 == 3 && v18 >= _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v17 == 4 && v18 <= _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v17 == 5 && v18 < _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v17 == 6 && v18 > _vm->_globals.SAUVEGARDE->data[v19]) + v15 = 1; + if (v16 == 3) { +LABEL_68: + if (v14 == 1) { + v12 = a2; + return (v12 + 1); + } + if (!v14) { +LABEL_63: + v12 = v20; + return (v12 + 1); + } + } + if (v16 == 1) { + if (v14 == 1 && v15 == 1) { + v12 = a2; + return (v12 + 1); + } + goto LABEL_63; + } + if (v16 == 2) { + if (v14 == 1 || v15 == 1) { + v12 = a2; + return (v12 + 1); + } + goto LABEL_63; + } + return -1; +} + +int ScriptManager::Traduction2(const byte *dataP) { + int16 result; + + result = 0; + if (*dataP != 'F' || *(dataP + 1) != 'C') { + result = 0; + } else { + if (*(dataP + 'T') == 84 && *(dataP + 3) == 'X' && *(dataP + 4) == 'T') + result = 1; + if (*(dataP + 2) == 'B') { + if (*(dataP + 3) == 'O' && *(dataP + 4) == 'B') + result = 1; + if (*(dataP + 2) == 'B' && *(dataP + 3) == 'O' && *(dataP + 4) == 'F') + result = 1; + } + if (*(dataP + 2) == 'P' && *(dataP + 3) == 'E' && *(dataP + 4) == 'R') + result = 1; + if (*(dataP + 2) == 'S' && *(dataP + 3) == 'O' && *(dataP + 4) == 'U') + result = 1; + if (*(dataP + 2) == 'M' && *(dataP + 3) == 'U' && *(dataP + 4) == 'S') + result = 1; + if (*(dataP + 2) == 'O') { + if (*(dataP + 3) == 'B' && *(dataP + 4) == 'P') + result = 1; + if (*(dataP + 2) == 'O' && *(dataP + 3) == 'B' && *(dataP + 4) == 'M') + result = 1; + } + if (*(dataP + 2) == 'G' && *(dataP + 3) == 'O' && *(dataP + 4) == 'T') + result = 2; + if (*(dataP + 2) == 'Z') { + if (*(dataP + 3) == 'O' && *(dataP + 4) == 'N') + result = 1; + if (*(dataP + 2) == 'Z' && *(dataP + 3) == 'O' && *(dataP + 4) == 'F') + result = 1; + } + if (*(dataP + 2) == 'E' && *(dataP + 3) == 'X' && *(dataP + 4) == 'I') + result = 5; + if (*(dataP + 2) == 'S' && *(dataP + 3) == 'O' && *(dataP + 4) == 'R') + result = 5; + if (*(dataP + 2) == 'A' && *(dataP + 3) == 'N' && *(dataP + 4) == 'I') + result = 1; + if (*(dataP + 2) == 'S' && *(dataP + 3) == 'P' && *(dataP + 4) == 'E') + result = 1; + if (*(dataP + 2) == 'E' && *(dataP + 3) == 'I' && *(dataP + 4) == 'F') + result = 4; + if (*(dataP + 2) == 'V') { + if (*(dataP + 3) == 'A' && *(dataP + 4) == 'L') + result = 1; + if (*(dataP + 2) == 'V') { + if (*(dataP + 3) == 'O' && *(dataP + 4) == 'N') + result = 1; + if (*(dataP + 2) == 'V' && *(dataP + 3) == 'O' && *(dataP + 4) == 'F') + result = 1; + } + } + if (*(dataP + 2) == 'I' && *(dataP + 3) == 'I' && *(dataP + 4) == 'F') + result = 3; + if (*(dataP + 2) == 'J' && *(dataP + 3) == 'U' && *(dataP + 4) == 'M') + result = 6; + if (*(dataP + 2) == 'B') { + if (*(dataP + 3) == 'C' && *(dataP + 4) == 'A') + result = 1; + if (*(dataP + 2) == 'B' && *(dataP + 3) == 'O' && *(dataP + 4) == 'S') + result = 1; + } + if (*(dataP + 2) == 'Z' && *(dataP + 3) == 'C') { + if (*(dataP + 4) == 'H') + result = 1; + } + } + return result; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/script.h b/engines/hopkins/script.h new file mode 100644 index 0000000000..27f167ae1b --- /dev/null +++ b/engines/hopkins/script.h @@ -0,0 +1,50 @@ +/* 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. + * + */ + +#ifndef HOPKINS_SCRIPT_H +#define HOPKINS_SCRIPT_H + +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/str.h" +#include "hopkins/globals.h" + +namespace Hopkins { + +class ScriptManager { +private: + HopkinsEngine *_vm; +public: + int TRAVAILOBJET; +public: + ScriptManager(); + void setParent(HopkinsEngine *vm); + + int Traduction(byte *a1); + int Traduction2(const byte *dataP); + int Control_Goto(const byte *dataP); + int Control_If(const byte *dataP, int a2); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_SCRIPT_H */ diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp new file mode 100644 index 0000000000..42eb98ec63 --- /dev/null +++ b/engines/hopkins/sound.cpp @@ -0,0 +1,114 @@ +/* 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/system.h" +#include "common/textconsole.h" +#include "hopkins/sound.h" + +namespace Hopkins { + +SoundManager::SoundManager() { + SPECIAL_SOUND = 0; + SOUNDVOL = 0; + VOICEVOL = 0; + MUSICVOL = 0; + OLD_SOUNDVOL = 0; + OLD_MUSICVOL = 0; + OLD_VOICEVOL = 0; + SOUNDOFF = true; + MUSICOFF = true; + VOICEOFF = true; + TEXTOFF = false; + SOUND_FLAG = false; +} + +void SoundManager::setParent(HopkinsEngine *vm) { + _vm = vm; + SPECIAL_SOUND = 0; +} + +void SoundManager::WSOUND_INIT() { + warning("TODO: WSOUND_INIT"); +} + +void SoundManager::VERIF_SOUND() { +// warning("TODO: VERIF_SOUND"); +} + +void SoundManager::LOAD_ANM_SOUND() { + warning("TODO: LOAD_ANIM_SOUND"); +} + +void SoundManager::LOAD_WAV(const Common::String &file, int a2) { + warning("TODO: LOAD_WAV"); +} + +void SoundManager::PLAY_ANM_SOUND(int soundNumber) { + warning("TODO: PLAAY_ANIM_SOUND"); +} + +void SoundManager::WSOUND(int soundNumber) { + warning("TODO: WSOUND"); +} + +bool SoundManager::VOICE_MIX(int a1, int a2) { + warning("TODO: VOICE_MIX"); + return false; +} + +void SoundManager::DEL_SAMPLE(int soundNumber) { + warning("TODO: DEL_SAMPLE"); +} + +void SoundManager::PLAY_SOUND(const Common::String &file) { + warning("TODO: PLAY_SOUND"); +} + +void SoundManager::PLAY_SOUND2(const Common::String &file) { + warning("TODO: PLAY_SOUND2"); +} + +void SoundManager::MODSetSampleVolume() { + warning("TODO MODSetSampleVolume"); +} + +void SoundManager::MODSetVoiceVolume() { + warning("TODO MODSetVoiceVolume"); +} + +void SoundManager::MODSetMusicVolume(int volume) { + warning("TODO MODSetMusicVolume"); +} + +void SoundManager::CHARGE_SAMPLE(int a1, const Common::String &file) { + warning("TODO: CHARGE_SAMPLE"); +} + +void SoundManager::PLAY_SAMPLE2(int idx) { + warning("PLAY_SAMPLE2"); +} + +void SoundManager::PLAY_WAV(int a1) { + warning("PLAY_WAV"); +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/sound.h b/engines/hopkins/sound.h new file mode 100644 index 0000000000..2dfdac7749 --- /dev/null +++ b/engines/hopkins/sound.h @@ -0,0 +1,73 @@ +/* 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. + * + */ + +#ifndef HOPKINS_SOUND_H +#define HOPKINS_SOUND_H + +#include "common/scummsys.h" +#include "common/str.h" + +namespace Hopkins { + +class HopkinsEngine; + +class SoundManager { +private: + HopkinsEngine *_vm; +public: + int SPECIAL_SOUND; + int SOUNDVOL; + int VOICEVOL; + int MUSICVOL; + int OLD_SOUNDVOL; + int OLD_MUSICVOL; + int OLD_VOICEVOL; + bool SOUNDOFF; + bool MUSICOFF; + bool VOICEOFF; + bool TEXTOFF; + bool SOUND_FLAG; +public: + SoundManager(); + void setParent(HopkinsEngine *vm); + + void WSOUND_INIT(); + void VERIF_SOUND(); + void LOAD_ANM_SOUND(); + void LOAD_WAV(const Common::String &file, int a2); + void PLAY_ANM_SOUND(int soundNumber); + void WSOUND(int soundNumber); + bool VOICE_MIX(int a1, int a2); + void DEL_SAMPLE(int soundNumber); + void PLAY_SOUND(const Common::String &file); + void PLAY_SOUND2(const Common::String &file2); + void MODSetSampleVolume(); + void MODSetVoiceVolume(); + void MODSetMusicVolume(int volume); + void CHARGE_SAMPLE(int a1, const Common::String &file); + void PLAY_SAMPLE2(int idx); + void PLAY_WAV(int a1); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_SOUND_H */ diff --git a/engines/hopkins/talk.cpp b/engines/hopkins/talk.cpp new file mode 100644 index 0000000000..3dc883c871 --- /dev/null +++ b/engines/hopkins/talk.cpp @@ -0,0 +1,1349 @@ +/* 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/system.h" +#include "common/endian.h" +#include "common/file.h" +#include "common/textconsole.h" +#include "hopkins/talk.h" +#include "hopkins/files.h" +#include "hopkins/globals.h" +#include "hopkins/graphics.h" +#include "hopkins/hopkins.h" +#include "hopkins/objects.h" + +namespace Hopkins { + +TalkManager::TalkManager() { + BUFFERPERSO = NULL; + PALPERSO = NULL; + PERSOSPR = NULL; + ADR_ANIM = NULL; + TAILLEPERSO = 0; + STATI = 0; + PLIGNE1 = PLIGNE2 = 0; + PLIGNE3 = PLIGNE4 = 0; + PCHERCHE = 0; +} + +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; + 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; + bool old_DESACTIVE_INVENT = _vm->_globals.DESACTIVE_INVENT; + _vm->_globals.DESACTIVE_INVENT = true; + BUFFERPERSO = _vm->_fileManager.RECHERCHE_CAT(filename, 5); + TAILLEPERSO = _vm->_globals.CAT_TAILLE; + if (BUFFERPERSO == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, filename); + BUFFERPERSO = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + TAILLEPERSO = _vm->_fileManager.FLONG(_vm->_globals.NFICHIER); + } + _vm->_globals.SAUVEGARDE->data[svField4] = 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 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 40); + v3 = 20 * (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110; + PCHERCHE = 20 * (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110; + PERSOSPR = _vm->_fileManager.RECHERCHE_CAT(v16, 7); + if (PERSOSPR) { + _vm->_globals.CAT_FLAG = false; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, v16); + } else { + _vm->_globals.CAT_FLAG = true; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_SAN.RES"); + } + PERSOSPR = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER); + _vm->_globals.CAT_FLAG = false; + + _vm->_fileManager.CONSTRUIT_LINUX("TEMP.SCR"); + if (_vm->_graphicsManager.nbrligne == SCREEN_WIDTH) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x4B000u); + if (_vm->_graphicsManager.nbrligne == (SCREEN_WIDTH * 2)) + _vm->_saveLoadManager.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 = true; + 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 (v5 != v4) + v15 = DIALOGUE_REP(v5); + if (v15 == -1) + v5 = v2 + 3; + _vm->_eventsManager.VBL(); + } while (v5 != v4); + } + if (_vm->_globals.NOPARLE == true) { + v6 = 1; + do + v7 = DIALOGUE_REP(v6++); + while (v7 != -1); + } + CLEAR_ANIM_PERSO(); + _vm->_globals.NOPARLE = false; + _vm->_globals.NECESSAIRE = 1; + BUFFERPERSO = _vm->_globals.LIBERE_FICHIER(BUFFERPERSO); + PERSOSPR = _vm->_globals.LIBERE_FICHIER(PERSOSPR); + _vm->_graphicsManager.NB_SCREEN(); + _vm->_globals.NECESSAIRE = 0; + + _vm->_saveLoadManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + _vm->_objectsManager.PERSO_ON = false; + _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 = old_DESACTIVE_INVENT; + _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; + int v3; + int v4; + int v5; + byte v7; + int v8; + int v9; + + v9 = 0; + _vm->_objectsManager.DESACTIVE_CURSOR = 1; + STATI = 1; + v7 = _vm->_dialogsManager.DESACTIVE_INVENT; + _vm->_dialogsManager.DESACTIVE_INVENT = 1; + BUFFERPERSO = _vm->_fileManager.RECHERCHE_CAT(filename, 5); + TAILLEPERSO = _vm->_globals.CAT_TAILLE; + if (BUFFERPERSO == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, filename); + BUFFERPERSO = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + TAILLEPERSO = _vm->_fileManager.FLONG(_vm->_globals.NFICHIER); + } + + _vm->_globals.SAUVEGARDE->data[svField4] = 0; + RENVOIE_FICHIER(0, FQUEST, (const char *)BUFFERPERSO); + RENVOIE_FICHIER(20, FREPON, (const char *)BUFFERPERSO); + + switch (_vm->_globals.FR) { + case 0: + FQUEST = "RUEAN.TXT"; + FREPON = "RUEAN.TXT"; + break; + case 1: + FQUEST = "RUE.TXT"; + FREPON = "RUE.TXT"; + break; + case 2: + FQUEST = "RUEES.TXT"; + FREPON = "RUEES.TXT"; + break; + } + + v1 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 40); + PCHERCHE = 20 * (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110; + CHERCHE_PAL(PCHERCHE, 0); + PLIGNE1 = v1; + PLIGNE2 = v1 + 1; + PLIGNE3 = v1 + 2; + PLIGNE4 = v1 + 3; + v8 = _vm->_eventsManager.btsouris; + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(0); + + if (!_vm->_globals.NOPARLE) { + v2 = v1 + 3; + do { + v3 = DIALOGUE(); + if (v3 != v2) + v9 = DIALOGUE_REP(v3); + + if (v9 == -1) + v3 = v1 + 3; + } while (v3 != v2); + } + + if (_vm->_globals.NOPARLE) { + v4 = 1; + do + v5 = DIALOGUE_REP(v4++); + while (v5 != -1); + } + + BUFFERPERSO = _vm->_globals.LIBERE_FICHIER(BUFFERPERSO); + _vm->_eventsManager.btsouris = v8; + + _vm->_eventsManager.CHANGE_MOUSE(v8); + _vm->_graphicsManager.INIT_TABLE(145, 150, _vm->_graphicsManager.Palette); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + _vm->_objectsManager.DESACTIVE_CURSOR = 0; + _vm->_dialogsManager.DESACTIVE_INVENT = v7; + STATI = 0; +} + +void TalkManager::RENVOIE_FICHIER(int srcStart, Common::String &dest, const char *srcData) { + dest = Common::String(srcData + srcStart); +} + +int TalkManager::DIALOGUE() { + byte *v0; + int v1; + int v2; + int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + byte *v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v18; + int v19; + int v20; + int v21; + + if (STATI) { + v0 = BUFFERPERSO; + v1 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 48); + if (v1) + _vm->_objectsManager.BOBANIM_ON(v1); + if ((int16)READ_LE_UINT16((uint16 *)v0 + 48) != 1) + _vm->_objectsManager.BOBANIM_ON((int16)READ_LE_UINT16((uint16 *)v0 + 49)); + if ((int16)READ_LE_UINT16((uint16 *)v0 + 48) != 2) + _vm->_objectsManager.BOBANIM_ON((int16)READ_LE_UINT16((uint16 *)v0 + 50)); + if ( (int16)READ_LE_UINT16((uint16 *)v0 + 48) != 3) + _vm->_objectsManager.BOBANIM_ON((int16)READ_LE_UINT16((uint16 *)v0 + 51)); + if ((int16)READ_LE_UINT16((uint16 *)v0 + 48) != 4) + _vm->_objectsManager.BOBANIM_ON((int16)READ_LE_UINT16((uint16 *)v0 + 52)); + } else { + VISU_WAIT(); + } + + v19 = VERIF_BOITE(PLIGNE1, FQUEST, 65); + v2 = VERIF_BOITE(PLIGNE2, FQUEST, 65); + v3 = VERIF_BOITE(PLIGNE3, FQUEST, 65); + v20 = 420 - 20 * VERIF_BOITE(PLIGNE4, FQUEST, 65); + v21 = v20 - 20 * v3; + v18 = v20 - 20 * v3 - 1; + v4 = v20 - 20 * v3 - 20 * v2; + _vm->_fontManager.DOS_TEXT(5, PLIGNE1, FQUEST, 5, v4 - 20 * v19, 0, 0, 0, 65, 255); + _vm->_fontManager.DOS_TEXT(6, PLIGNE2, FQUEST, 5, v4, 0, 0, 0, 65, 255); + _vm->_fontManager.DOS_TEXT(7, PLIGNE3, FQUEST, 5, v21, 0, 0, 0, 65, 255); + _vm->_fontManager.DOS_TEXT(8, PLIGNE4, FQUEST, 5, v20, 0, 0, 0, 65, 255); + _vm->_fontManager.TEXTE_ON(5); + _vm->_fontManager.TEXTE_ON(6); + _vm->_fontManager.TEXTE_ON(7); + _vm->_fontManager.TEXTE_ON(8); + + v5 = -1; + v6 = 0; + do { + v7 = _vm->_eventsManager.YMOUSE(); + if ((v4 - 20 * v19) < v7 && (v4 - 1) > v7) { + v8 = v7; + _vm->_fontManager.OPTI_COUL_TXT(6, 7, 8, 5); + v5 = PLIGNE1; + v7 = v8; + } + if (v7 > v4 && v18 > v7) { + v9 = v7; + _vm->_fontManager.OPTI_COUL_TXT(5, 7, 8, 6); + v5 = PLIGNE2; + v7 = v9; + } + if (v21 < v7 && (v20 - 1) > v7) { + v10 = v7; + _vm->_fontManager.OPTI_COUL_TXT(5, 6, 8, 7); + v5 = PLIGNE3; + v7 = v10; + } + if (v20 < v7 && v7 < 419) { + _vm->_fontManager.OPTI_COUL_TXT(5, 6, 7, 8); + v5 = PLIGNE4; + } + + _vm->_eventsManager.VBL(); + if (_vm->_eventsManager.BMOUSE()) + v6 = 1; + if (v5 == -1) + v6 = 0; + } while (!_vm->shouldQuit() && v6 != 1); + + _vm->_soundManager.VOICE_MIX(v5, 1); + _vm->_fontManager.TEXTE_OFF(5); + _vm->_fontManager.TEXTE_OFF(6); + _vm->_fontManager.TEXTE_OFF(7); + _vm->_fontManager.TEXTE_OFF(8); + + if (STATI) { + v11 = BUFFERPERSO; + v12 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 48); + if (v12) + _vm->_objectsManager.BOBANIM_OFF(v12); + v13 = (int16)READ_LE_UINT16((uint16 *)v11 + 49); + if (v13 != 1) + _vm->_objectsManager.BOBANIM_OFF(v13); + v14 = (int16)READ_LE_UINT16((uint16 *)v11 + 50); + if (v14 != 2) + _vm->_objectsManager.BOBANIM_OFF(v14); + v15 = (int16)READ_LE_UINT16((uint16 *)v11 + 51); + if (v15 != 3) + _vm->_objectsManager.BOBANIM_OFF(v15); + v16 = (int16)READ_LE_UINT16((uint16 *)v11 + 52); + if (v16 != 4) + _vm->_objectsManager.BOBANIM_OFF(v16); + } else { + FIN_VISU_WAIT(); + } + + _vm->_eventsManager.VBL(); + return v5; +} + +int TalkManager::DIALOGUE_REP(int idx) { + int v1; + int v2; + byte *v3; + int i; + int v6; + int v7; + byte *v8; + int v9; + int v10; + int v11; + int v12; + int v13; + int v14; + void *v15; + int v16; + int v17; + int v18; + int v19; + int v20; + int v21; + int v22; + int v23; + int v24; + int v25; + + v1 = 0; + v2 = 0; + v3 = BUFFERPERSO + 110; + for (i = idx; (int16)READ_LE_UINT16(v3) != idx; v3 = BUFFERPERSO + 20 * v1 + 110) { + ++v1; + if ((int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) < v1) + v2 = 1; + if (v2 == 1) + return -1; +// HIWORD(i) = HIWORD(BUFFERPERSO); + } + if (v2 == 1) + return -1; + + v22 = (int16)READ_LE_UINT16((uint16 *)v3 + 1); + v25 = (int16)READ_LE_UINT16((uint16 *)v3 + 2); + v24 = (int16)READ_LE_UINT16((uint16 *)v3 + 3); + i = (int16)READ_LE_UINT16((uint16 *)v3 + 4); + v23 = (int16)READ_LE_UINT16((uint16 *)v3 + 4); + PLIGNE1 = (int16)READ_LE_UINT16((uint16 *)v3 + 5); + PLIGNE2 = (int16)READ_LE_UINT16((uint16 *)v3 + 6); + PLIGNE3 = (int16)READ_LE_UINT16((uint16 *)v3 + 7); + v6 = (int16)READ_LE_UINT16((uint16 *)v3 + 8); + v7 = (int16)READ_LE_UINT16((uint16 *)v3 + 9); + + if (v7) + _vm->_globals.SAUVEGARDE->data[svField4] = v7; + + if (!v6) + v6 = 10; + if (STATI) { + v8 = BUFFERPERSO; + v9 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 43); + if (v9) + _vm->_objectsManager.BOBANIM_ON(v9); + v10 = (int16)READ_LE_UINT16((uint16 *)v8 + 44); + if (v10) + _vm->_objectsManager.BOBANIM_ON(v10); + v11 = (int16)READ_LE_UINT16((uint16 *)v8 + 45); + if (v11) + _vm->_objectsManager.BOBANIM_ON(v11); + v12 = (int16)READ_LE_UINT16((uint16 *)v8 + 46); + if (v12) + _vm->_objectsManager.BOBANIM_ON(v12); + v13 = (int16)READ_LE_UINT16((uint16 *)v8 + 47); + if (v13) + _vm->_objectsManager.BOBANIM_ON(v13); + } else { + VISU_PARLE(); + } + + if (!_vm->_soundManager.TEXTOFF) { + _vm->_fontManager.DOS_TEXT(9, v22, FREPON, v25, v24, 20, 25, 5, v23, 252); + _vm->_fontManager.TEXTE_ON(9); + } + if (!_vm->_soundManager.VOICE_MIX(v22, 1)) { + v14 = 0; + _vm->_eventsManager.souris_bb = false; + _vm->_eventsManager.souris_b = false; + + do { + _vm->_eventsManager.VBL(); + ++v14; + } while (v14 != v6); + } + + if (!_vm->_soundManager.TEXTOFF) + _vm->_fontManager.TEXTE_OFF(9); + if (STATI) { + v15 = BUFFERPERSO; + v16 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 43); + if (v16) + _vm->_objectsManager.BOBANIM_OFF(v16); + v17 = (int16)READ_LE_UINT16((uint16 *)v15 + 44); + if (v17) + _vm->_objectsManager.BOBANIM_OFF(v17); + v18 = (int16)READ_LE_UINT16((uint16 *)v15 + 45); + if (v18) + _vm->_objectsManager.BOBANIM_OFF(v18); + v19 = (int16)READ_LE_UINT16((uint16 *)v15 + 46); + if (v19) + _vm->_objectsManager.BOBANIM_OFF(v19); + v20 = (int16)READ_LE_UINT16((uint16 *)v15 + 47); + if (v20) + _vm->_objectsManager.BOBANIM_OFF(v20); + } else { + FIN_VISU_PARLE(); + } + v21 = 0; + if (!PLIGNE1) + v21 = -1; + + return v21; +} + +void TalkManager::CHERCHE_PAL(int a1, int a2) { + int v2; + size_t v4; + unsigned int v5; + byte *palette; + int v8; + + v2 = 0; + v8 = 0; + v4 = a1; + for (;;) { + if ( *(BUFFERPERSO + v4) == 'P' + && *(BUFFERPERSO + v4 + 1) == 'A' + && *(BUFFERPERSO + v4 + 2) == 'L') { + v8 = 1; + v2 = v4; + } + ++v4; + if (v8 == 1) + break; + if (TAILLEPERSO == v4) + return; + } + + v5 = v2 + 5; + palette = BUFFERPERSO + v5; + PALPERSO = BUFFERPERSO + v5; + if (a2 == 0) { + *(palette + 762) = 0; + *(palette + 763) = 0; + *(palette + 764) = 0; + *(palette + 765) = 0xe0; + *(palette + 766) = 0xe0; + *(palette + 767) = 0xff; + *(palette + 759) = 0xff; + *(palette + 760) = 0xff; + *(palette + 761) = 86; + *palette = 0; + *(palette + 1) = 0; + *(palette + 2) = 0; + } + if (a2 == 1) { + *(palette + 765) = 0xe0; + *(palette + 766) = 0xe0; + *(palette + 767) = 0xff; + *(palette + 759) = 0xff; + *(palette + 760) = 0xff; + *(palette + 761) = 0xff; + *palette = 0; + *(palette + 1) = 0; + *(palette + 2) = 0; + *(palette + 762) = 0; + *(palette + 763) = 0; + *(palette + 764) = 0; + } + + _vm->_graphicsManager.setpal_vga256(palette); + _vm->_graphicsManager.INIT_TABLE(145, 150, palette); +} + +void TalkManager::VISU_WAIT() { + for (int idx = 26; idx <= 30; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + BOB_VISU_PARLE(idx); + } +} + +void TalkManager::FIN_VISU_WAIT() { + for (int idx = 26; idx <= 30; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_OFF(idx); + } + + for (int idx = 26; idx <= 30; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_ZERO(idx); + } +} + +void TalkManager::FIN_VISU_PARLE() { + for (int idx = 21; idx <= 25; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_OFF(idx); + } + + _vm->_eventsManager.VBL(); + _vm->_eventsManager.VBL(); + + for (int idx = 21; idx <= 25; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + _vm->_objectsManager.BOB_ZERO(idx); + } +} + +int TalkManager::VERIF_BOITE(int idx, const Common::String &file, int a3) { + int v6; + int v7; + char v8; + int v9; + int v10; + char v11; + char v13; + char v14; + int v15; + byte *ptr; + int v17; + int v18; + byte *v19; + uint32 indexData[4047]; + Common::String filename; + Common::String dest; + Common::File f; + int filesize; + + v18 = 0; + _vm->_globals.police_l = 11; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPLINK, file); + + // Build up the filename + filename = dest = _vm->_globals.NFICHIER; + while (filename.lastChar() != '.') + filename.deleteLastChar(); + filename += "IND"; + + if (!f.open(filename)) + error("Could not open file - %s", filename.c_str()); + filesize = f.size(); + assert(filesize < 16188); + + for (int i = 0; i < (filesize / 4); ++i) + indexData[i] = f.readUint32LE(); + f.close(); + + if (!f.open(dest)) + error("Error opening file - %s", dest.c_str()); + + f.seek(indexData[idx]); + ptr = _vm->_globals.dos_malloc2(2058); + if (ptr == g_PTRNUL) + error("temporary TEXT"); + f.read(ptr, 2048); + f.close(); + + v19 = ptr; + v6 = 0; + do { + v13 = *v19; + if ((byte)(*v19 + 46) > 0x1Bu) { + if ((byte)(v13 + 80) > 0x1Bu) { + if ((byte)(v13 - 65) <= 0x19u || (byte)(v13 - 97) <= 0x19u) + v13 = 32; + } else { + v13 -= 79; + } + } else { + v13 = *v19 + 111; + } + *v19 = v13; + v19 = v19 + 1; + ++v6; + } while ((unsigned int)v6 < 0x800); + + v7 = 0; + do { + v8 = *(ptr + v7); + if ( v8 == 10 || v8 == 13 ) + *(ptr + v7) = 0; + ++v7; + } while ((unsigned int)v7 < 0x800); + + v9 = 0; + v15 = (11 * a3) - 4; + do { + v10 = 0; + for (;;) { + v17 = v10; + do { + v11 = *(ptr + v9 + v10); + v14 = v11; + ++v10; + } while (v11 != 32 && v11 != 37); + if (v10 >= v15 / _vm->_globals.police_l) + break; + if (v11 == 37) { + if (v10 < v15 / _vm->_globals.police_l) + goto LABEL_31; + break; + } + } + if (v11 != 37) + goto LABEL_33; + v14 = 32; +LABEL_31: + if (v14 == 37) + v17 = v10; +LABEL_33: + ++v18; + v9 += v17; + } while (v14 != 37); + free(ptr); + return v18; +} + +void TalkManager::VISU_PARLE() { + for (int idx = 21; idx <= 25; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].field4 == 1) + BOB_VISU_PARLE(idx); + } +} + +void TalkManager::BOB_VISU_PARLE(int idx) { + int v4; + byte *v5; + + _vm->_objectsManager.PRIORITY = 1; + if (!_vm->_globals.Bob[idx].field0) { + _vm->_objectsManager.BOB_ZERO(idx); + v5 = _vm->_globals.Bqe_Anim[idx].data; + v4 = (int16)READ_LE_UINT16(v5 + 2); + if (!v4) + v4 = 1; + if ((int16)READ_LE_UINT16(v5 + 24)) { + _vm->_globals.Bob[idx].isSprite = true; + _vm->_globals.Bob[idx].field36 = 0; + _vm->_globals.Bob[idx].field38 = 0; + _vm->_globals.Bob[idx].animData = _vm->_globals.Bqe_Anim[idx].data; + _vm->_globals.Bob[idx].field0 = 10; + v5 = PERSOSPR; + _vm->_globals.Bob[idx].spriteData = PERSOSPR; + _vm->_globals.Bob[idx].field1E = v4; + _vm->_globals.Bob[idx].field20 = -1; + _vm->_globals.Bob[idx].field22 = 0; + _vm->_globals.Bob[idx].offsetY = 0; + } + } +} + +void TalkManager::CHERCHE_ANIM0(int a1, int a2) { + size_t v2; + int v3; + size_t v4; + unsigned int v5; + unsigned int v6; + int v7; + byte *v8; + byte *v9; + + v2 = 0; + v3 = 0; + v4 = a1; + while (1) { + if (*(BUFFERPERSO + v4) == 'A' + && *(BUFFERPERSO + v4 + 1) == 'N' + && *(BUFFERPERSO + v4 + 2) == 'I' + && *(BUFFERPERSO + v4 + 3) == 'M' + && *(BUFFERPERSO + v4 + 4) == 1) { + v3 = 1; + v2 = v4; + } + ++v4; + if (v3 == 1) + break; + if (TAILLEPERSO == v4) + return; + } + v5 = v2 + 25; + v9 = BUFFERPERSO + v5; + v8 = BUFFERPERSO + v5; + ADR_ANIM = BUFFERPERSO + v5; + if (!a2) { + v6 = 0; + do { + v7 = (int16)READ_LE_UINT16(&v8[2 * v6 + 4]); + if (v7 && _vm->_globals.vitesse != 501) + _vm->_graphicsManager.AFFICHE_SPEED(PERSOSPR, _vm->_eventsManager.start_x + (int16)READ_LE_UINT16(&v8[2 * v6]), + (int16)READ_LE_UINT16(&v8[2 * v6 + 2]), v9[2 * v6 + 8]); + v6 += 5; + } while (_vm->_globals.vitesse != 501 && v7); + } +} + +void TalkManager::ANIM_PERSO_INIT() { + byte *v0; + byte *v1; + int v2; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + int v12; + + v0 = BUFFERPERSO; + v1 = BUFFERPERSO + 110; + v2 = (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 43); + if (v2) + RECHERCHE_ANIM_PERSO(21, (BUFFERPERSO + 110), v2, TAILLEPERSO); + v4 = (int16)READ_LE_UINT16((uint16 *)v0 + 44); + if (v4) + RECHERCHE_ANIM_PERSO(22, v1, v4, TAILLEPERSO); + v5 = (int16)READ_LE_UINT16((uint16 *)v0 + 45); + if (v5) + RECHERCHE_ANIM_PERSO(23, v1, v5, TAILLEPERSO); + v6 = (int16)READ_LE_UINT16((uint16 *)v0 + 46); + if (v6) + RECHERCHE_ANIM_PERSO(24, v1, v6, TAILLEPERSO); + v7 = (int16)READ_LE_UINT16((uint16 *)v0 + 47); + if (v7) + RECHERCHE_ANIM_PERSO(25, v1, v7, TAILLEPERSO); + v8 = (int16)READ_LE_UINT16((uint16 *)v0 + 48); + if (v8) + RECHERCHE_ANIM_PERSO(26, v1, v8, TAILLEPERSO); + v9 = (int16)READ_LE_UINT16((uint16 *)v0 + 49); + if (v9) + RECHERCHE_ANIM_PERSO(27, v1, v9, TAILLEPERSO); + v10 = (int16)READ_LE_UINT16((uint16 *)v0 + 50); + if (v10) + RECHERCHE_ANIM_PERSO(28, v1, v10, TAILLEPERSO); + v11 = (int16)READ_LE_UINT16((uint16 *)v0 + 51); + if (v11) + RECHERCHE_ANIM_PERSO(29, v1, v11, TAILLEPERSO); + v12 = (int16)READ_LE_UINT16((uint16 *)v0 + 52); + if (v12) + RECHERCHE_ANIM_PERSO(30, v1, v12, TAILLEPERSO); +} + +void TalkManager::CLEAR_ANIM_PERSO() { + for (int idx = 21; idx <= 34; ++idx) { + if (_vm->_globals.Bqe_Anim[idx].data != g_PTRNUL) + _vm->_globals.Bqe_Anim[idx].data = _vm->_globals.dos_free2(_vm->_globals.Bqe_Anim[idx].data); + + _vm->_globals.Bqe_Anim[idx].data = g_PTRNUL; + _vm->_globals.Bqe_Anim[idx].field4 = 0; + } +} + +bool TalkManager::RECHERCHE_ANIM_PERSO(int a1, const byte *bufPerso, int a3, int a4) { + bool result; + const byte *v5; + int v6; + int v7; + byte *v8; + byte *v9; + int v10; + int v11; + int v12; + char v13; + int v14; + int v15; + int v16; + char v17; + int v18; + int v19; + int v20; + int v22; + int v23; + const byte *v24; + + v22 = 0; + result = false; + + v20 = a1; + do { + if (*(v22 + bufPerso) == 'A' && *(bufPerso + v22 + 1) == 'N' && *(bufPerso + v22 + 2) == 'I' && *(bufPerso + v22 + 3) == 'M' + && *(bufPerso + v22 + 4) == a3) { + v5 = v22 + bufPerso + 5; + v18 = v22 + 5; + v6 = 0; + v7 = 0; + do { + if (*v5 == 'A' && *(v5 + 1) == 'N' && *(v5 + 2) == 'I' && *(v5 + 3) == 'M') + v7 = 1; + if (*v5 == 'F' && *(v5 + 1) == 'I' && *(v5 + 2) == 'N') + v7 = 1; + if (v18 > a4) { + _vm->_globals.Bqe_Anim[a1].field4 = 0; + result = g_PTRNUL; + _vm->_globals.Bqe_Anim[v20].data = g_PTRNUL; + } + ++v18; + ++v6; + ++v5; + } while (v7 != 1); + _vm->_globals.Bqe_Anim[v20].data = _vm->_globals.dos_malloc2(v6 + 50); + _vm->_globals.Bqe_Anim[a1].field4 = 1; + memcpy(_vm->_globals.Bqe_Anim[v20].data, (const byte *)(v22 + bufPerso + 5), 20); + v8 = _vm->_globals.Bqe_Anim[v20].data; + + v9 = v8 + 20; + v24 = v22 + bufPerso + 25; + v10 = (int16)READ_LE_UINT16(v22 + bufPerso + 25); + v11 = (int16)READ_LE_UINT16(v22 + bufPerso + 27); + v23 = (int16)READ_LE_UINT16(v22 + bufPerso + 29); + v12 = (int16)READ_LE_UINT16(v22 + bufPerso + 31); + v13 = *(v22 + bufPerso + 33); + *(v8 + 29) = *(v22 + bufPerso + 34); + WRITE_LE_UINT16(v8 + 20, v10); + WRITE_LE_UINT16(v8 + 22, v11); + WRITE_LE_UINT16(v8 + 24, v23); + WRITE_LE_UINT16(v8 + 26, v12); + *(v8 + 28) = v13; + v19 = 1; + do { + v9 += 10; + v24 += 10; + if (!v23) + break; + v14 = (int16)READ_LE_UINT16(v24); + v15 = (int16)READ_LE_UINT16(v24 + 2); + v23 = (int16)READ_LE_UINT16(v24 + 4); + v16 = (int16)READ_LE_UINT16(v24 + 6); + v17 = *(v24 + 8); + *(v9 + 9) = *(v24 + 9); + WRITE_LE_UINT16(v9, v14); + WRITE_LE_UINT16(v9 + 2, v15); + WRITE_LE_UINT16(v9 + 4, v23); + WRITE_LE_UINT16(v9 + 6, v16); + *(v9 + 8) = v17; + ++v19; + } while (v19 <= 4999); + result = 1; + } + if (*(bufPerso + v22) == 'F' && *(bufPerso + v22 + 1) == 'I' && *(bufPerso + v22 + 2) == 'N') + result = true; + ++v22; + } while (v22 <= a4 && result != 1); + + return result; +} + +void TalkManager::REPONSE(int a1, int a2) { + byte v2; + byte v3; + byte *v5; + byte *v6; + uint16 v7; + byte *v8; + int v9; + int v10; + uint16 v11; + int v12; + int v13; + int v14; + int v15; + int v16; + int v17; + byte *ptr; + + v2 = a1; + v3 = a2; +LABEL_2: + v15 = 0; + if (_vm->_globals.COUCOU != g_PTRNUL) { + v5 = _vm->_globals.COUCOU; + while (1) { + if (*v5 == 'C') { + if (*(v5 + 1) == 'O') { + if (*(v5 + 2) == 'D') { + if (*(v5 + 3) == v2) { + if (*(v5 + 4) == v3) + v15 = 1; + } + } + } + } + if (*v5 == 'F' && *(v5 + 1) == 'I' && *(v5 + 2) == 'N') + break; + if (!v15) + v5 = v5 + 1; + if (v15 == 1) { + v6 = v5 + 5; + ptr = _vm->_globals.dos_malloc2(620); + if (g_PTRNUL == ptr) + error("TRADUC"); + memset(ptr, 0, 620); + v7 = 0; + v12 = 0; + v14 = 0; + do { + v16 = 0; + if (*(v7 + v6) == 'F' && *(v6 + v7 + 1) == 'C') { + ++v12; + assert(v12 < (620 / 20)); + + v8 = (ptr + 20 * v12); + v11 = 0; + do { + assert(v11 < 20); + *(v11++ + v8) = *(v7++ + v6); + if (*(v7 + v6) == 'F' && *(v6 + v7 + 1) == 'F') { + v16 = 1; + v9 = v11; + *(v9 + v8) = 'F'; + *(v8 + v9 + 1) = 'F'; + ++v7; + } + } while (v16 != 1); + } + if (v16 != 1) { + if (*(v7 + v6) == 'C' && *(v6 + v7 + 1) == 'O' && *(v6 + v7 + 2) == 'D') + v14 = 1; + if (v16 != 1 && *(v7 + v6) == 'F' && *(v6 + v7 + 1) == 'I' && *(v6 + v7 + 2) == 'N') + v14 = 1; + } + v6 += v7 + 1; + v7 = 0; + } while (v14 != 1); + v17 = 0; + v13 = 1; + do { + v10 = _vm->_scriptManager.Traduction(ptr + 20 * v13); + if (_vm->shouldQuit()) + return; + + if (v10 == 2) + v13 = _vm->_scriptManager.Control_Goto(ptr + 20 * v13); + if (v10 == 3) + v13 = _vm->_scriptManager.Control_If(ptr, v13); + if (v13 == -1) + error("Invalid IFF function"); + if (v10 == 1 || v10 == 4) + ++v13; + if (!v10 || v10 == 5) + v17 = 1; + if (v10 == 6) { + _vm->_globals.dos_free2(ptr); + v2 = _vm->_objectsManager.NVZONE; + v3 = _vm->_objectsManager.NVVERBE; + goto LABEL_2; + } + } while (v17 != 1); + _vm->_globals.dos_free2(ptr); + _vm->_globals.SAUVEGARDE->data[svField2] = 0; + return; + } + } + } +} + +void TalkManager::REPONSE2(int a1, int a2) { + signed int v3; + int v4; + int v5; + int v6; + int v7; + int v8; + int v9; + int v10; + int v11; + + v3 = 0; + if (a2 == 5 && _vm->_globals.SAUVEGARDE->data[svField3] == 4) { + if ((uint16)(a1 - 22) <= 1u) { + _vm->_objectsManager.SETFLIPSPR(0, 0); + _vm->_objectsManager.SETANISPR(0, 62); + _vm->_objectsManager.SPACTION(_vm->_globals.FORETSPR, "2,3,4,5,6,7,8,9,10,11,12,-1,", 0, 0, 4, 0); + if (a1 == 22) { + v4 = _vm->_objectsManager.BOBX(3); + _vm->_objectsManager.BLOQUE_ANIMX(6, v4); + } + if (a1 == 23) { + v5 = _vm->_objectsManager.BOBX(4); + _vm->_objectsManager.BLOQUE_ANIMX(6, v5); + } + if (a1 == 22) { + v6 = _vm->_objectsManager.BOBX(3); + _vm->_objectsManager.BLOQUE_ANIMX(8, v6); + } + if (a1 == 23) { + v7 = _vm->_objectsManager.BOBX(4); + _vm->_objectsManager.BLOQUE_ANIMX(8, v7); + } + _vm->_objectsManager.BOBANIM_OFF(3); + _vm->_objectsManager.BOBANIM_OFF(4); + _vm->_objectsManager.BOBANIM_ON(6); + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_objectsManager.SPACTION1(_vm->_globals.FORETSPR, "13,14,15,14,13,12,13,14,15,16,-1,", 0, 0, 4); + do + _vm->_eventsManager.VBL(); + while (_vm->_objectsManager.BOBPOSI(6) <= 12 && _vm->_objectsManager.BOBPOSI(6) != 12); + _vm->_objectsManager.BOBANIM_OFF(6); + _vm->_objectsManager.BOBANIM_ON(8); + if (_vm->_globals.ECRAN == 35) + v3 = 201; + if (_vm->_globals.ECRAN == 36) + v3 = 203; + if (_vm->_globals.ECRAN == 37) + v3 = 205; + if (_vm->_globals.ECRAN == 38) + v3 = 207; + if (_vm->_globals.ECRAN == 39) + v3 = 209; + if (_vm->_globals.ECRAN == 40) + v3 = 211; + if (_vm->_globals.ECRAN == 41) + v3 = 213; + _vm->_globals.SAUVEGARDE->data[v3] = 2; + _vm->_objectsManager.ZONE_OFF(22); + _vm->_objectsManager.ZONE_OFF(23); + } + if ((uint16)(a1 - 20) <= 1u) { + _vm->_objectsManager.SETFLIPSPR(0, 1); + _vm->_objectsManager.SETANISPR(0, 62); + _vm->_objectsManager.SPACTION(_vm->_globals.FORETSPR, "2,3,4,5,6,7,8,9,10,11,12,-1,", 0, 0, 4, 1); + if (a1 == 20) { + v8 = _vm->_objectsManager.BOBX(1); + _vm->_objectsManager.BLOQUE_ANIMX(5, v8); + } + if (a1 == 21) { + v9 = _vm->_objectsManager.BOBX(2); + _vm->_objectsManager.BLOQUE_ANIMX(5, v9); + } + if (a1 == 20) { + v10 = _vm->_objectsManager.BOBX(1); + _vm->_objectsManager.BLOQUE_ANIMX(7, v10); + } + if (a1 == 21) { + v11 = _vm->_objectsManager.BOBX(2); + _vm->_objectsManager.BLOQUE_ANIMX(7, v11); + } + _vm->_objectsManager.BOBANIM_OFF(1); + _vm->_objectsManager.BOBANIM_OFF(2); + _vm->_objectsManager.BOBANIM_ON(5); + _vm->_soundManager.PLAY_SAMPLE2(1); + _vm->_objectsManager.SPACTION1(_vm->_globals.FORETSPR, "13,14,15,14,13,12,13,14,15,16,-1,", 0, 0, 4); + do + _vm->_eventsManager.VBL(); + while (_vm->_objectsManager.BOBPOSI(5) <= 12 && _vm->_objectsManager.BOBPOSI(5) != 12); + _vm->_objectsManager.BOBANIM_OFF(5); + _vm->_objectsManager.BOBANIM_ON(7); + if (_vm->_globals.ECRAN == 35) + v3 = 200; + if (_vm->_globals.ECRAN == 36) + v3 = 202; + if (_vm->_globals.ECRAN == 37) + v3 = 204; + if (_vm->_globals.ECRAN == 38) + v3 = 206; + if (_vm->_globals.ECRAN == 39) + v3 = 208; + if (_vm->_globals.ECRAN == 40) + v3 = 210; + if (_vm->_globals.ECRAN == 41) + v3 = 212; + _vm->_globals.SAUVEGARDE->data[v3] = 2; + _vm->_objectsManager.ZONE_OFF(21); + _vm->_objectsManager.ZONE_OFF(20); + } + } +} + +void TalkManager::OBJET_VIVANT(const Common::String &a2) { + int v2; + const char *v4; + int v5; + bool v6; + int v10; + byte *v11; + int v12; + int v13; + byte *v14; + byte *v15; + byte *v16; + int v17; + Common::String s; + Common::String v20; + Common::String v22; + Common::String v23; + + _vm->_fontManager.TEXTE_OFF(5); + _vm->_fontManager.TEXTE_OFF(9); + _vm->_eventsManager.VBL(); + _vm->_graphicsManager.no_scroll = 1; + _vm->_linesManager.CLEAR_ZONE(); + _vm->_linesManager.RESET_OBSTACLE(); + _vm->_globals.RESET_CACHE(); + v2 = 0; + do + _vm->_globals.BOBZONE[v2++] = 0; + while (v2 <= 44); + _vm->_objectsManager.NUMZONE = -1; + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(0); + BUFFERPERSO = _vm->_fileManager.RECHERCHE_CAT(a2, 5); + TAILLEPERSO = _vm->_globals.CAT_TAILLE; + if (BUFFERPERSO == g_PTRNUL) { + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, a2); + BUFFERPERSO = _vm->_fileManager.CHARGE_FICHIER(_vm->_globals.NFICHIER); + TAILLEPERSO = _vm->_fileManager.FLONG(_vm->_globals.NFICHIER); + } + RENVOIE_FICHIER(40, v23, (const char *)BUFFERPERSO); + RENVOIE_FICHIER(0, v22, (const char *)BUFFERPERSO); + RENVOIE_FICHIER(20, v20, (const char *)BUFFERPERSO); + v4 = "NULL"; + v5 = 5; + + v6 = v20 != v4; + if (!v6) { + v20 = Common::String::format("IM%d", _vm->_globals.ECRAN); + } + PERSOSPR = _vm->_fileManager.RECHERCHE_CAT(v23, 7); + if (PERSOSPR) { + _vm->_globals.CAT_FLAG = false; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, v23); + } else { + _vm->_globals.CAT_FLAG = true; + _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANIM, "RES_SAN.RES"); + } + PERSOSPR = _vm->_objectsManager.CHARGE_SPRITE(_vm->_globals.NFICHIER); + _vm->_globals.CAT_FLAG = false; + + _vm->_fileManager.CONSTRUIT_LINUX("TEMP.SCR"); + if (_vm->_graphicsManager.nbrligne == SCREEN_WIDTH) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x4B000u); + if (_vm->_graphicsManager.nbrligne == (SCREEN_WIDTH * 2)) + _vm->_saveLoadManager.SAUVE_FICHIER(_vm->_globals.NFICHIER, _vm->_graphicsManager.VESA_SCREEN, 0x96000u); + + if (!_vm->_graphicsManager.nbrligne) + _vm->_graphicsManager.ofscroll = 0; + _vm->_graphicsManager.NB_SCREEN(); + v10 = 20 * (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110; + PCHERCHE = 20 * (int16)READ_LE_UINT16((uint16 *)BUFFERPERSO + 42) + 110; + _vm->_graphicsManager.NB_SCREEN(); + _vm->_objectsManager.PERSO_ON = true; + CHERCHE_PAL(v10, 1); + CHERCHE_ANIM0(v10, 0); + v11 = _vm->_globals.COUCOU; + _vm->_globals.COUCOU = g_PTRNUL; + _vm->_globals.NOMARCHE = true; + _vm->_objectsManager.INILINK(v22); + _vm->_objectsManager.PERSO_ON = true; + _vm->_globals.GOACTION = 0; + _vm->_objectsManager.NUMZONE = -1; + ANIM_PERSO_INIT(); + VISU_PARLE(); + VISU_WAIT(); + _vm->_graphicsManager.INI_ECRAN2(v22); + _vm->_globals.NOMARCHE = true; + _vm->_objectsManager.FORCEZONE = 1; + _vm->_objectsManager.NUMZONE = -1; + do { + v12 = _vm->_eventsManager.BMOUSE(); + if (v12 == 1) { + _vm->_objectsManager.BTGAUCHE(); + v12 = 1; + } + if (v12 == 2) + _vm->_objectsManager.BTDROITE(); + _vm->_objectsManager.VERIFZONE(); + if (_vm->_globals.GOACTION == 1) + _vm->_objectsManager.PARADISE(); + _vm->_eventsManager.VBL(); + } while (!_vm->_globals.SORTIE); + FIN_VISU_PARLE(); + FIN_VISU_WAIT(); + CLEAR_ANIM_PERSO(); + CLEAR_ANIM_PERSO(); + _vm->_globals.NOPARLE = false; + _vm->_globals.NECESSAIRE = 1; + BUFFERPERSO = _vm->_globals.LIBERE_FICHIER(BUFFERPERSO); + PERSOSPR = _vm->_globals.LIBERE_FICHIER(PERSOSPR); + _vm->_graphicsManager.NB_SCREEN(); + _vm->_globals.NECESSAIRE = 0; + _vm->_linesManager.CLEAR_ZONE(); + _vm->_linesManager.RESET_OBSTACLE(); + _vm->_globals.RESET_CACHE(); + v13 = 0; + do + _vm->_globals.BOBZONE[v13++] = 0; + while (v13 <= 44); + _vm->_globals.LIBERE_FICHIER(_vm->_globals.COUCOU); + _vm->_globals.COUCOU = v11; + _vm->_objectsManager.DESACTIVE = true; + _vm->_objectsManager.INILINK(v20); + _vm->_graphicsManager.INI_ECRAN2(v20); + _vm->_objectsManager.DESACTIVE = false; + _vm->_globals.NOMARCHE = false; + if (_vm->_globals.SORTIE == 101) + _vm->_globals.SORTIE = 0; + + _vm->_saveLoadManager.bload("TEMP.SCR", _vm->_graphicsManager.VESA_SCREEN); + g_system->getSavefileManager()->removeSavefile("TEMP.SCR"); + + _vm->_objectsManager.PERSO_ON = false; + _vm->_eventsManager.btsouris = 4; + _vm->_eventsManager.CHANGE_MOUSE(4); + _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(); + _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); + v14 = _vm->_graphicsManager.VESA_BUFFER; + v15 = _vm->_graphicsManager.VESA_SCREEN; + memcpy(_vm->_graphicsManager.VESA_BUFFER, _vm->_graphicsManager.VESA_SCREEN, 0x95FFCu); + v15 = v15 + 614396; + v14 = v14 + 614396; + WRITE_LE_UINT16(v14, (int16)READ_LE_UINT16(v15)); + v14 = v14 + 2; + *v14 = *(v15 + 2); + v16 = v14 + 1; + _vm->_globals.DESACTIVE_INVENT = false; + _vm->_graphicsManager.DD_VBL(); + v17 = 0; + do { + _vm->_eventsManager.VBL(); + ++v17; + } while (v17 <= 4); + _vm->_graphicsManager.no_scroll = 0; +} + +} // End of namespace Hopkins diff --git a/engines/hopkins/talk.h b/engines/hopkins/talk.h new file mode 100644 index 0000000000..3c13bf81d4 --- /dev/null +++ b/engines/hopkins/talk.h @@ -0,0 +1,75 @@ +/* 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. + * + */ + +#ifndef HOPKINS_TALK_H +#define HOPKINS_TALK_H + +#include "common/scummsys.h" +#include "common/str.h" + +namespace Hopkins { + +class HopkinsEngine; + +class TalkManager { +private: + HopkinsEngine *_vm; +public: + Common::String FQUEST; + Common::String FREPON; + byte *BUFFERPERSO; + byte *PALPERSO; + byte *PERSOSPR; + byte *ADR_ANIM; + size_t TAILLEPERSO; + int STATI; + int PLIGNE1, PLIGNE2; + int PLIGNE3, PLIGNE4; + int PCHERCHE; +public: + TalkManager(); + 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); + void CHERCHE_PAL(int a1, int a2); + void VISU_WAIT(); + void FIN_VISU_WAIT(); + void FIN_VISU_PARLE(); + int VERIF_BOITE(int a1, const Common::String &a2, int 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(); + bool RECHERCHE_ANIM_PERSO(int a1, const byte *a2, int a3, int a4); + void REPONSE(int a1, int a2); + void REPONSE2(int a1, int a2); + void OBJET_VIVANT(const Common::String &a2); +}; + +} // End of namespace Hopkins + +#endif /* HOPKINS_TALK_H */ diff --git a/engines/plugins_table.h b/engines/plugins_table.h index 010de0d5e2..e5ac5efeb4 100644 --- a/engines/plugins_table.h +++ b/engines/plugins_table.h @@ -35,6 +35,9 @@ LINK_PLUGIN(GOB) #if PLUGIN_ENABLED_STATIC(GROOVIE) LINK_PLUGIN(GROOVIE) #endif +#if PLUGIN_ENABLED_STATIC(HOPKINS) +LINK_PLUGIN(HOPKINS) +#endif #if PLUGIN_ENABLED_STATIC(HUGO) LINK_PLUGIN(HUGO) #endif |