HOPKINS: Reimplemented animation player method

This commit is contained in:
Paul Gilbert 2012-10-13 16:42:07 +11:00
parent cde057a582
commit ba4be24b18

View file

@ -39,250 +39,204 @@ AnimationManager::AnimationManager() {
} }
void AnimationManager::PLAY_ANM(const Common::String &filename, uint32 rate1, uint32 rate2, uint32 rate3) { void AnimationManager::PLAY_ANM(const Common::String &filename, uint32 rate1, uint32 rate2, uint32 rate3) {
int doneFlag; signed __int16 v4;
byte *screenCopy = NULL; signed __int16 v5;
uint16 v14, v15, v16, v17, v18, v19; bool hasScreenCopy;
byte *screenCopy = NULL;
byte *v10 = NULL;
int v13;
byte *ptr = NULL;
size_t nbytes; size_t nbytes;
byte *screenP;
Common::File f; Common::File f;
char strBuffer[20];
int idx = 0;
doneFlag = 0; hasScreenCopy = false;
for (;;) { while (!_vm->shouldQuit()) {
//MAIN_LOOP: LABEL_2:
v14 = v15 = v16 = v17 = 0; v10 = _vm->_graphicsManager.VESA_SCREEN;
v18 = 1; ptr = _vm->_globals.dos_malloc2(0x14u);
screenP = _vm->_graphicsManager.VESA_SCREEN;
_vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANM, filename); _vm->_fileManager.CONSTRUIT_FICHIER(_vm->_globals.HOPANM, filename);
if (!f.open(_vm->_globals.NFICHIER)) if (!f.open(_vm->_globals.NFICHIER))
error("Not Found file %s", _vm->_globals.NFICHIER.c_str()); error("File not found - %s", _vm->_globals.NFICHIER.c_str());
// TODO: Original above read seems to overlap the doneFlag
f.skip(6); f.skip(6);
//buf = read(4); doneFlag = f.readUint16LE() != 0; f.read(_vm->_graphicsManager.Palette, 0x320u);
f.read(_vm->_graphicsManager.Palette, PALETTE_EXT_BLOCK_SIZE);
f.skip(4); f.skip(4);
nbytes = f.readUint32LE(); nbytes = f.readUint32LE();
f.skip(14);
f.read(v10, nbytes);
// TODO: Original never seems to do anything with these. Or are these part of if (CLS_ANM == 1) {
// a bigger structure needed for sub-methods?
v19 = f.readUint32LE();
v18 = f.readUint16LE();
v17 = f.readUint16LE();
v16 = f.readUint16LE();
v15 = f.readUint16LE();
v14 = f.readUint16LE();
f.read(screenP, nbytes);
if (CLS_ANM) {
_vm->_graphicsManager.DD_Lock(); _vm->_graphicsManager.DD_Lock();
_vm->_graphicsManager.Cls_Video(); _vm->_graphicsManager.Cls_Video();
_vm->_graphicsManager.DD_Unlock(); _vm->_graphicsManager.DD_Unlock();
} }
if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > 640) {
if (_vm->_graphicsManager.WinScan / _vm->_graphicsManager.Winbpp > SCREEN_WIDTH) { hasScreenCopy = true;
doneFlag = 1; screenCopy = _vm->_globals.dos_malloc2(0x4B000u);
screenCopy = _vm->_globals.dos_malloc2(SCREEN_WIDTH * SCREEN_HEIGHT); memcpy(screenCopy, v10, 0x4B000u);
memcpy(screenCopy, screenP, SCREEN_WIDTH * SCREEN_HEIGHT);
} }
if (NO_SEQ) { if (NO_SEQ) {
if (doneFlag == 1) if (hasScreenCopy)
memcpy(screenCopy, _vm->_graphicsManager.VESA_BUFFER, SCREEN_WIDTH * SCREEN_HEIGHT); memcpy(screenCopy, _vm->_graphicsManager.VESA_BUFFER, 0x4B000u);
_vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette);
} else { } else {
_vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette); _vm->_graphicsManager.setpal_vga256(_vm->_graphicsManager.Palette);
_vm->_graphicsManager.DD_Lock(); _vm->_graphicsManager.DD_Lock();
if (_vm->_graphicsManager.Winbpp == 2) { if (_vm->_graphicsManager.Winbpp == 2) {
if (doneFlag) if (hasScreenCopy)
_vm->_graphicsManager.m_scroll16A(screenCopy, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); _vm->_graphicsManager.m_scroll16A(screenCopy, 0, 0, 640, 480, 0, 0);
else else
_vm->_graphicsManager.m_scroll16(screenP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); _vm->_graphicsManager.m_scroll16(v10, 0, 0, 640, 480, 0, 0);
} }
if (_vm->_graphicsManager.Winbpp == 1) { if (_vm->_graphicsManager.Winbpp == 1) {
if (doneFlag) if (hasScreenCopy)
_vm->_graphicsManager.m_scroll2A(screenCopy, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); _vm->_graphicsManager.m_scroll2A(screenCopy, 0, 0, 640, 480, 0, 0);
else else
_vm->_graphicsManager.m_scroll2(screenP, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); _vm->_graphicsManager.m_scroll2(v10, 0, 0, 640, 480, 0, 0);
} }
_vm->_graphicsManager.DD_Unlock(); _vm->_graphicsManager.DD_Unlock();
_vm->_graphicsManager.DD_VBL(); _vm->_graphicsManager.DD_VBL();
} }
_vm->_eventsManager.lItCounter = 0; _vm->_eventsManager.lItCounter = 0;
_vm->_eventsManager.ESC_KEY = 0; _vm->_eventsManager.ESC_KEY = 0;
_vm->_soundManager.LOAD_ANM_SOUND(); _vm->_soundManager.LOAD_ANM_SOUND();
if (_vm->_globals.iRegul == 1) { if (_vm->_globals.iRegul != 1)
do { break;
if (_vm->_eventsManager.ESC_KEY) while (!_vm->shouldQuit()) {
goto FINISH; if (_vm->_eventsManager.ESC_KEY == 1)
goto LABEL_58;
// TODO: Original REDRAW_ANIM always returns false, so this isn't needed? if (REDRAW_ANIM() == 1)
#if 0 break;
if (REDRAW_ANIM())
goto REDRAW_ANIM;
#endif
_vm->_eventsManager.CONTROLE_MES();
} while (_vm->_eventsManager.lItCounter < rate1);
}
_vm->_eventsManager.lItCounter = 0;
doneFlag = false;
idx = 0;
do {
_vm->_soundManager.PLAY_ANM_SOUND(idx);
// Get in string
Common::fill(&strBuffer[0], &strBuffer[20], 0);
if (f.read(strBuffer, 16) != 16)
doneFlag = true;
if (strncmp(strBuffer, "IMAGE=", 6) != 0)
doneFlag = true;
if (!doneFlag) {
f.read(screenP, READ_LE_UINT32(strBuffer + 8));
if (_vm->_globals.iRegul == 1) {
do {
if (_vm->_eventsManager.ESC_KEY)
goto FINISH;
// TODO: Original REDRAW_ANIM always returns false, so this isn't needed?
#if 0
if (REDRAW_ANIM()) {
if (_vm->_graphicsManager.NOLOCK == 1)
goto FINISH;
f.close();
if (doneFlag <= SCREEN_WIDTH)
goto MAIN_LOOP;
screenCopy = _vm->_globals.dos_free2(screenCopy);
goto MAIN_LOOP;
}
#endif
_vm->_eventsManager.CONTROLE_MES();
_vm->_soundManager._vm->_soundManager.VERIF_SOUND();
} while (_vm->_eventsManager.lItCounter < rate2 && !_vm->shouldQuit());
}
_vm->_eventsManager.lItCounter = 0;
_vm->_graphicsManager.DD_Lock();
if (!doneFlag) {
if (*screenP != 252) {
if (_vm->_graphicsManager.Winbpp == 1)
_vm->_graphicsManager.Copy_Video_Vbe3(screenP);
if (_vm->_graphicsManager.Winbpp == 2)
_vm->_graphicsManager.Copy_Video_Vbe16(screenP);
}
} else if (*screenP != 252) {
_vm->_graphicsManager.Copy_WinScan_Vbe3(screenP, screenCopy);
if (_vm->_graphicsManager.Winbpp == 2)
_vm->_graphicsManager.m_scroll16A(screenCopy, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
else
_vm->_graphicsManager.m_scroll2A(screenCopy, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
}
_vm->_graphicsManager.DD_Unlock();
_vm->_graphicsManager.DD_VBL();
_vm->_soundManager._vm->_soundManager.VERIF_SOUND();
}
} while (!doneFlag && !_vm->shouldQuit());
if (_vm->_globals.iRegul != 1) {
_vm->_eventsManager.lItCounter = 0;
goto FINISH;
}
do {
if (_vm->_eventsManager.ESC_KEY)
goto FINISH;
// TODO: Original REDRAW_ANIM always returns false, so this isn't needed?
#if 0
if (REDRAW_ANIM()) {
REDRAW_ANIM:
if (_vm->_graphicsManager.NOLOCK == 1)
goto FINISH;
f.close();
if (doneFlag != 1)
goto MAIN_LOOP;
screenCopy = _vm->_globals.dos_free2(screenCopy);
goto MAIN_LOOP;
}
#endif
_vm->_eventsManager.CONTROLE_MES(); _vm->_eventsManager.CONTROLE_MES();
_vm->_soundManager._vm->_soundManager.VERIF_SOUND(); if (_vm->_eventsManager.lItCounter >= rate1)
} while (_vm->_eventsManager.lItCounter < rate3 && !_vm->shouldQuit()); goto LABEL_25;
}
LABEL_53:
if (_vm->_graphicsManager.NOLOCK == 1)
goto LABEL_58;
_vm->_globals.dos_free2(ptr);
f.close();
_vm->_eventsManager.lItCounter = 0; if (hasScreenCopy == 1)
_vm->_soundManager._vm->_soundManager.VERIF_SOUND(); LABEL_55:
break; 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);
FINISH: if (f.read(ptr, 16) != 16)
if (_vm->_graphicsManager.FADE_LINUX == 2 && !doneFlag) { v4 = -1;
screenCopy = _vm->_globals.dos_malloc2(SCREEN_WIDTH * SCREEN_HEIGHT);
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 != 1) {
if (REDRAW_ANIM() == 1)
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 != 1) {
if (REDRAW_ANIM() == 1) {
if (_vm->_graphicsManager.NOLOCK == 1)
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.skip(6);
f.read(_vm->_graphicsManager.Palette, PALETTE_EXT_BLOCK_SIZE); f.read(_vm->_graphicsManager.Palette, 0x320u);
f.skip(4); f.skip(4);
nbytes = f.readUint32LE(); nbytes = f.readUint32LE();
v19 = f.readUint32LE(); f.skip(14);
v18 = f.readUint16LE(); f.read(v10, nbytes);
v17 = f.readUint16LE();
v16 = f.readUint16LE(); memcpy(screenCopy, v10, 0x4B000u);
v15 = f.readUint16LE();
v14 = f.readUint16LE();
f.read(screenCopy, nbytes); v5 = 0;
Common::copy(screenP, screenP + SCREEN_WIDTH * SCREEN_HEIGHT, screenCopy);
idx = 0;
doneFlag = false;
do { do {
// Get in string memset(ptr, 0, 0x13u);
Common::fill(&strBuffer[0], &strBuffer[20], 0); if (f.read(ptr, 16) != 16)
if (f.read(strBuffer, 16) != 16) v5 = -1;
doneFlag = true;
if (strncmp(strBuffer, "IMAGE=", 7) != 0) if (strncmp((char *)ptr, "IMAGE=", 6))
doneFlag = true; v5 = -1;
if (!v5) {
if (!doneFlag) { f.read(v10, READ_LE_UINT32(ptr + 8));
f.read(screenP, READ_LE_UINT32(strBuffer + 8)); if (*v10 != (byte)-4)
_vm->_graphicsManager.Copy_WinScan_Vbe3(v10, screenCopy);
if (*screenP != 252)
_vm->_graphicsManager.Copy_WinScan_Vbe3(screenP, screenCopy);
} }
} while (!doneFlag); } while (v5 != -1);
_vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy); _vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy);
screenCopy = _vm->_globals.dos_free2(screenCopy); screenCopy = _vm->_globals.dos_free2(screenCopy);
} }
if (hasScreenCopy == 1) {
if (doneFlag == 1) {
if (_vm->_graphicsManager.FADE_LINUX == 2) if (_vm->_graphicsManager.FADE_LINUX == 2)
_vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy); _vm->_graphicsManager.FADE_OUTW_LINUX(screenCopy);
_vm->_globals.dos_free2(screenCopy); _vm->_globals.dos_free2(screenCopy);
} }
_vm->_graphicsManager.FADE_LINUX = 0; _vm->_graphicsManager.FADE_LINUX = 0;
f.close(); f.close();
_vm->_globals.dos_free2(screenCopy); _vm->_globals.dos_free2(ptr);
_vm->_graphicsManager.NOLOCK = false; _vm->_graphicsManager.NOLOCK = 0;
} }
void AnimationManager::PLAY_ANM2(const Common::String &filename, uint32 a2, uint32 a3, uint32 a4) { void AnimationManager::PLAY_ANM2(const Common::String &filename, uint32 a2, uint32 a3, uint32 a4) {