diff options
Diffstat (limited to 'scumm/insane/insane_iact.cpp')
-rw-r--r-- | scumm/insane/insane_iact.cpp | 607 |
1 files changed, 607 insertions, 0 deletions
diff --git a/scumm/insane/insane_iact.cpp b/scumm/insane/insane_iact.cpp new file mode 100644 index 0000000000..d0150a679c --- /dev/null +++ b/scumm/insane/insane_iact.cpp @@ -0,0 +1,607 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2004 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" + +#include "base/engine.h" + +#include "scumm/scumm.h" + +#include "scumm/smush/smush_player.h" +#include "scumm/smush/chunk_type.h" +#include "scumm/smush/chunk.h" +#include "scumm/smush/insane.h" + +namespace Scumm { + +void Insane::procIACT(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + if (_keyboardDisable || _val116w) + return; + + switch (_currSceneId) { + case 1: + iactScene1(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + case 3: + case 13: + iactScene3(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + case 4: + case 5: + iactScene4(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + case 6: + iactScene6(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + case 17: + iactScene17(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + case 21: + iactScene21(renderBitmap, codecparam, setupsan12, setupsan13, b, size, flags); + break; + } +} + +void Insane::iactScene1(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + _player->checkBlock(b, TYPE_IACT, 8); + + int16 par1, par2, par3, par4, par5, par6, par7, par9, par11, par13, tmp; + + par1 = b.getWord(); // cx + par2 = b.getWord(); // dx + par3 = b.getWord(); // si + par4 = b.getWord(); // bx + + switch (par1) { + case 2: + if (par3 != 1) + break; + + par5 = b.getWord(); // si + if (_actor[0].field_8 == 112) { + setBit(par5); + break; + } + + if (_val32d == -1) { + proc62(); + _val32d = _enemy[_currEnemy].field_34; + } + if (_val32d == par4) + clearBit(par5); + else + setBit(par5); + break; + case 3: + if (par3 == 1) { + setBit(b.getWord()); + _val32d = -1; + } + break; + case 4: + if (par3 == 1 || _val32d < 0 || _val32d > 4) + setBit(b.getWord()); + break; + case 5: + if (par2 != 13) + break; + + tmp = b.getWord(); // +8 + tmp = b.getWord(); // +10 + par7 = b.getWord(); // +12 dx + tmp = b.getWord(); // +14 + par9 = b.getWord(); // +16 bx + tmp = b.getWord(); // +18 + par11 = b.getWord(); // +20 cx + tmp = b.getWord(); // +12 + par13 = b.getWord(); // +24 ax + + if (par13 > _actor[0].x || par11 < _actor[0].x) { + _tiresRustle = true; + _actor[0].x1 = -_actor[0].x1; + _actor[0].damage++; + } + + if (par9 < _actor[0].x || par7 > _actor[0].x) { + _tiresRustle = true; + _actor[0].damage += 4; + } + break; + case 6: + switch (par2) { + case 38: + smlayer_drawSomething(renderBitmap, codecparam, 50, 20, 3, + _smush_iconsNut, 7, 0, 0); + _val119_ = true; + _iactSceneId = par4; + break; + case 7: + if (readArray(_numberArray, 4) != 0) + return; + + _val120_ = true; + smlayer_drawSomething(renderBitmap, codecparam, 160, 20, 3, + _smush_icons2Nut, 8, 0, 0); + break; + case 8: + if (readArray(_numberArray, 4) == 0 || readArray(_numberArray, 6) == 0) + return; + + setWordInString(_numberArray, 1, _val55d); + setWordInString(_numberArray, 3, _val57d); + smush_setToFinish(); + + break; + case 25: + _val121_ = true; + _actor[0].y1 = -_actor[0].y1; + break; + case 11: + if (_val32d >= 1 && _val32d <= 4 && !_needSceneSwitch) + queueSceneSwitch(13, _smush_minefiteFlu, "minefite.san", 64, 0, + _continueFrame1, 1300); + break; + case 9: + par5 = b.getWord(); // si + par6 = b.getWord(); // bx + smlayer_setFluPalette(_smush_roadrsh3Rip, 0); + if (par5 != par6 - 1) + smlayer_setFluPalette(_smush_roadrashRip, 0); + } + break; + case 7: + switch (par4) { + case 1: + _actor[0].x -= (b.getWord() - 160) / 10; + break; + case 2: + par5 = b.getWord(); + + if (par5 - 8 > _actor[0].x || par5 + 8 < _actor[0].x) { + if (smlayer_isSoundRunning(86)) + smlayer_stopSound(86); + } else { + if (!smlayer_isSoundRunning(86)) + smlayer_startSound1(86); + } + break; + } + break; + } + + if (_val32d < 0 || _val32d > 4) + if (readArray(_numberArray, 8)) { + smlayer_drawSomething(renderBitmap, codecparam, 270, 20, 3, + _smush_icons2Nut, 20, 0, 0); + _val122_ = true; + } +} + +void Insane::proc62(void) { + if (readArray(_numberArray, 58) == 0) + _enemy[EN_TORQUE].field_10 = 1; + + if (_enemy[EN_TORQUE].field_8 == 0) { + _currEnemy = EN_TORQUE; + _val215d++; + _val216d[_val215d] = EN_TORQUE; + _val214d = _currEnemy; + return; + } + + proc63(); + + // FIXME: someone, please, untaint this mess + + int32 en, edi, ebp, edx, esi, eax, ebx, ecx; + + for (en = 0; _enemy[en].field_10 == 0; en++); + en -= 4; + + ebp = 0; + edi = 0; + + _loop1: + edi++; + if (edi > 14) + goto loc5; + + edx = rand() / 11; + + esi = edx; + + if (edx == 9) + esi = 6; + else if (edx > 9) + esi = 7; + + eax = esi; + ebx = 1; + + if (_enemy[eax].field_10 != ebp) + goto _loop1; + + if (ebp < _val215d) { + edx = _val215d; + eax = ebp; + if (ebx) + goto loc1; + } + + goto loc4; + + loc1: + if (esi == _val216d[eax + 1]) + ebx = ebp; + + eax++; + + if (eax < edx) { + if (ebx) + goto loc1; + } + + loc4: + if (ebx == 0) + goto loc15; + + edx = _val215d; + edx++; + _val216d[edx] = esi; + _val215d = edx; + if (edx < en) + goto loc15; + goto loc14; + + loc5: + ecx = ebp; + + loc6: + ebx = 1; + esi = ecx; + if (ebp < _val215d) + goto loc9; + goto loc11; + + loc7: + if (esi == _val216d[eax + 1]) + ebx = ebp; + + eax++; + + if (eax < edx) + goto loc10; + + goto loc11; + + loc9: + edx = _val215d; + eax = ebp; + + loc10: + if (ebx != 0) + goto loc7; + + loc11: + ecx++; + if (ecx >= 9) + goto loc12; + + if (ebx == 0) + goto loc6; + + loc12: + if (ebx != 0) + goto loc13; + + _val215d = ebp; + edi = ebp; + goto _loop1; + + loc13: + edx = _val215d; + edx++; + _val216d[edx] = esi; + _val215d = edx; + + if (edx < en) + goto loc15; + + loc14: + proc64(ebp); + + loc15: + if (ebx == 0) + goto _loop1; + + _currEnemy = esi; + _val214d = _currEnemy; +} + +void Insane::proc63(void) { + int i; + + if (_val215d > 0) { + for (i = 0; i < _val215d; i++) + if (_enemy[i].field_10 == 1) + proc64(i); + } +} + +void Insane::proc64(int32 enemy1) { + _val215d--; + + for (int en = enemy1; en < _val215d; en++) + _val216d[en] = _val216d[en + 1]; +} + +void Insane::iactScene3(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + _player->checkBlock(b, TYPE_IACT, 8); + + int command, par1, par2, par3, tmp; + command = b.getWord(); + par1 = b.getWord(); + if (command == 6) { + if (par1 == 9) { + tmp = b.getWord(); // ptr + 4 + tmp = b.getWord(); // ptr + 6 + par2 = b.getWord(); // ptr + 8 + par3 = b.getWord(); // ptr + 10 + + if (!par2) + smlayer_setFluPalette(_smush_roadrsh3Rip, 0); + else { + if (par2 == par3 - 1) + smlayer_setFluPalette(_smush_roadrashRip, 0); + } + } else if (par1 == 25) { + _val121_ = true; + _actor[0].y1 = -_actor[0].y1; + _actor[1].y1 = -_actor[1].y1; + } + } +} + +void Insane::iactScene4(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + _player->checkBlock(b, TYPE_IACT, 8); + + int16 par1, par2, par3, par4, par5; + + par1 = b.getWord(); // edx + par2 = b.getWord(); // bx + par3 = b.getWord(); + par4 = b.getWord(); // cx + + switch (par1) { + case 2: + case 4: + par5 = b.getWord(); // si + switch (par3) { + case 1: + if (par4 == 1) { + if (readArray(_numberArray, 6)) + setBit(par5); + else + clearBit(par5); + } else { + if (readArray(_numberArray, 6)) + clearBit(par5); + else + setBit(par5); + } + break; + case 2: + if (readArray(_numberArray, 5)) + clearBit(par5); + else + setBit(par5); + break; + } + break; + case 6: + switch (par2) { + case 38: + smlayer_drawSomething(renderBitmap, codecparam, 270, 20, 3, + _smush_icons2Nut, 10, 0, 0); + _val119_ = true; + _iactSceneId = par4; + break; + case 7: + if (readArray(_numberArray, 4) != 0) + return; + + _val120_ = true; + smlayer_drawSomething(renderBitmap, codecparam, 160, 20, 3, + _smush_icons2Nut, 8, 0, 0); + break; + case 8: + if (readArray(_numberArray, 4) == 0 || readArray(_numberArray, 6) == 0) + return; + + setWordInString(_numberArray, 1, _val55d); + setWordInString(_numberArray, 3, _val57d); + smush_setToFinish(); + + break; + case 25: + if (readArray(_numberArray, 5) == 0) + return; + + _val212_ = true; + smlayer_drawSomething(renderBitmap, codecparam, 160, 20, 3, + _smush_icons2Nut, 8, 0, 0); + break; + case 11: + smlayer_drawSomething(renderBitmap, codecparam, 50, 20, 3, + _smush_icons2Nut, 9, 0, 0); + _val119_ = true; + _iactSceneId = par4; + break; + } + break; + } +} + +void Insane::iactScene6(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + _player->checkBlock(b, TYPE_IACT, 8); + + int16 par1, par2, par3, par4, par5; + + par1 = b.getWord(); + par2 = b.getWord(); // bx + par3 = b.getWord(); + par4 = b.getWord(); + + switch (par1) { + case 2: + case 4: + par5 = b.getWord(); // si + switch (par3) { + case 1: + if (par4 == 1) { + if (readArray(_numberArray, 6)) + setBit(par5); + else + clearBit(par5); + } else { + if (readArray(_numberArray, 6)) + clearBit(par5); + else + setBit(par5); + } + break; + case 2: + if (readArray(_numberArray, 5)) + clearBit(par5); + else + setBit(par5); + break; + } + break; + case 6: + switch (par2) { + case 38: + smlayer_drawSomething(renderBitmap, codecparam, 270, 20, 3, + _smush_icons2Nut, 10, 0, 0); + _val119_ = true; + _iactSceneId = par4; + break; + case 7: + if (readArray(_numberArray, 4) != 0) + return; + + _val120_ = true; + smlayer_drawSomething(renderBitmap, codecparam, 160, 20, 3, + _smush_icons2Nut, 8, 0, 0); + break; + case 8: + if (readArray(_numberArray, 4) == 0 || readArray(_numberArray, 6) == 0) + return; + + setWordInString(_numberArray, 1, _val55d); + setWordInString(_numberArray, 3, _val53d); + smush_setToFinish(); + + break; + case 25: + if (readArray(_numberArray, 5) == 0) + return; + + _val212_ = true; + smlayer_drawSomething(renderBitmap, codecparam, 160, 20, 3, + _smush_icons2Nut, 8, 0, 0); + break; + case 11: + smlayer_drawSomething(renderBitmap, codecparam, 50, 20, 3, + _smush_icons2Nut, 9, 0, 0); + _val119_ = true; + _iactSceneId = par4; + break; + } + break; + } +} + +void Insane::iactScene17(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + _player->checkBlock(b, TYPE_IACT, 8); + int16 par1, par2, par3, par4; + + par1 = b.getWord(); // dx + par2 = b.getWord(); // cx + par3 = b.getWord(); // di + par4 = b.getWord(); + + switch (par1) { + case 2: + case 3: + case 4: + if (par3 == 1) { + setBit(b.getWord()); + _val32d = -1; + } + break; + case 6: + switch (par2) { + case 38: + smlayer_drawSomething(renderBitmap, codecparam, 28, 48, 1, + _smush_iconsNut, 6, 0, 0); + _val119_ = true; + _iactSceneId = par4; + if (_counter1 <= 4) { + if (_counter1 == 4) + smlayer_startSound1(94); + + smlayer_showStatusMsg(-1, renderBitmap, codecparam, 24, 167, 1, + 2, 0, "%s", handleTrsTag(_trsFilePtr, 5000)); + } + _val124_ = true; + break; + case 11: + smlayer_drawSomething(renderBitmap, codecparam, 28, 48, 1, + _smush_iconsNut, 6, 0, 0); + if (_counter1 <= 4) { + if (_counter1 == 4) + smlayer_startSound1(94); + + smlayer_showStatusMsg(-1, renderBitmap, codecparam, 24, 167, 1, + 2, 0, "%s", handleTrsTag(_trsFilePtr, 5001)); + } + _val124_ = true; + _val123_ = true; + break; + } + break; + } +} + +void Insane::iactScene21(byte *renderBitmap, int32 codecparam, int32 setupsan12, + int32 setupsan13, Chunk &b, int32 size, int32 flags) { + // void implementation +} + +} |