/* ScummVM - Scumm Interpreter * Copyright (C) 2001 Ludvig Strigeus * Copyright (C) 2001-2003 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 "common/config-manager.h" #include "common/file.h" #include "scumm/scumm.h" #include "scumm/actor.h" #include "scumm/sound.h" #include "scumm/resource.h" #include "scumm/imuse.h" #include "scumm/imuse_digi.h" #include "scumm/smush/smush_player.h" #include "scumm/smush/chunk_type.h" #include "scumm/smush/chunk.h" #include "scumm/smush/insane.h" #ifdef INSANE // TODO (in no particular order): // o Ben's velocity don't get zeroed after crash // o TRS file support. Everything is in place, I just need to figure out function parameters // o Code review/cleanup // o DOS demo INSANE namespace Scumm { static const int scenePropIdx[58] = {0, 12, 14, 18, 20, 22, 24, 26, 28, 30, 34, 36, 38, 40, 42, 44, 46, 48, 50, 55, 57, 59, 61, 63, 65, 67, 71, 73, 75, 77, 79, 81, 83, 85, 89, 93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137}; static const int actorAnimationData[21] = {20, 21, 22, 23, 24, 25, 26, 13, 14, 15, 16, 17, 18, 19, 6, 7, 8, 9, 10, 11, 12}; Insane::Insane(ScummEngine *scumm) { _scumm = scumm; // Demo has different insane, so disable it now if (_scumm->_features & GF_DEMO) return; initvars(); readFileToMem("roadrash.rip", &_smush_roadrashRip); readFileToMem("roadrsh2.rip", &_smush_roadrsh2Rip); readFileToMem("roadrsh3.rip", &_smush_roadrsh3Rip); readFileToMem("goglpalt.rip", &_smush_goglpaltRip); readFileToMem("tovista1.flu", &_smush_tovista1Flu); readFileToMem("tovista2.flu", &_smush_tovista2Flu); readFileToMem("toranch.flu", &_smush_toranchFlu); readFileToMem("minedriv.flu", &_smush_minedrivFlu); readFileToMem("minefite.flu", &_smush_minefiteFlu); _smush_iconsNut = new NutRenderer(_scumm); _smush_iconsNut->loadFont("icons.nut", _scumm->getGameDataPath()); _smush_icons2Nut = new NutRenderer(_scumm); _smush_icons2Nut->loadFont("icons2.nut", _scumm->getGameDataPath()); _smush_bensgoggNut = new NutRenderer(_scumm); _smush_bensgoggNut->loadFont("bensgogg.nut", _scumm->getGameDataPath()); _smush_bencutNut = new NutRenderer(_scumm); _smush_bencutNut->loadFont("bencut.nut", _scumm->getGameDataPath()); // FIXME: implement // openManyResource(0, 4, "specfnt.nut", "titlfnt.nut", "techfnt.nut", "scummfnt.nut"); } Insane::~Insane(void) { free(_smush_roadrashRip); free(_smush_roadrsh2Rip); free(_smush_roadrsh3Rip); free(_smush_goglpaltRip); free(_smush_tovista1Flu); free(_smush_tovista2Flu); free(_smush_toranchFlu); free(_smush_minedrivFlu); free(_smush_minefiteFlu); delete _smush_bencutNut; delete _smush_bensgoggNut; delete _smush_iconsNut; delete _smush_icons2Nut; } void Insane::setSmushParams(int speed) { _speed = speed; } void Insane::initvars(void) { int i, j; _speed = 12; _insaneIsRunning = false; _numberArray = 0; _emulateInterrupt = 0; _flag1d = 0; _objArray1Idx = 0; _objArray1Idx2 = 0; _objArray2Idx = 0; _objArray2Idx2 = 0; _currSceneId = 1; _timer6Id = 0; _timerSpriteId = 0; _temp2SceneId = 0; _tempSceneId = 0; _currEnemy = -1; _currScenePropIdx = 0; _currScenePropSubIdx = 0; _currTrsMsg = 0; _sceneData2Loaded = 0; _sceneData1Loaded = 0; _keyboardDisable = 0; _needSceneSwitch = false; _idx2Exceeded = 0; _memoryAllocatedNotOK = 0; _lastKey = 0; _tiresRustle = false; _keybOldDx = 0; _keybOldDy = 0; _velocityX = 0; _velocityY = 0; _keybX = 0; _keybY = 0; _firstBattle = false; _battleScene = true; _kickBenProgress = false; _weaponBenJustSwitched = false; _kickEnemyProgress = false; _weaponEnemyJustSwitched = false; _beenCheated = 0; _val11d = 0; _val32d = -1; _val51d = 0; _val52d = 0; _val53d = 0; _val54d = 0; _val55d = 0; _val56d = 0; _val57d = 0; _val109w = 0x40; _val10b = 3; _val110w = 0x100; _val111w = 0x20; _val112w = 0x20; _val113d = 1; _val115w = 0; _val116w = 0; _val119_ = false; _val120_ = false; _val121_ = false; _val122_ = false; _val123_ = false; _val124_ = false; _val211d = 0; _val212_ = 0; _val213d = 0; _val214d = -1; _val215d = 0; _smlayer_room = 0; _smlayer_room2 = 0; _isBenCut = 0; _smush_isPauseImuse = false; _continueFrame = 0; _continueFrame1 = 0; _counter1 = 0; _iactSceneId = 0; _iactSceneId2 = 0; for (i = 0; i < 9; i++) for (j = 0; j < 9; j++) _enHdlVar[i][j] = 0; for (i = 0; i < 0x80; i++) _iactBits[i] = 0; init_enemyStruct(EN_ROTT1, EN_ROTT1, 0, 0, 160, 0, INV_MACE, 90, "wr2_rott.san", 26, 16, 17, 27, 11, 3); init_enemyStruct(EN_ROTT2, EN_ROTT2, 1, 0, 250, 0, INV_2X4, 90, "wr2_rott.san", 28, 16, 17, 42, 11, 3); init_enemyStruct(EN_ROTT3, EN_ROTT3, 2, 0, 120, 0, INV_HAND, 90, "wr2_rott.san", 15, 16, 17, 43, 11, 3); init_enemyStruct(EN_VULTF1, EN_VULTF1, 3, 0, 60, 0, INV_HAND, 91, "wr2_vltp.san", 29, 33, 32, 37, 12, 4); init_enemyStruct(EN_VULTM1, EN_VULTM1, 4, 0, 100, 0, INV_CHAIN, 91, "wr2_vltc.san", 30, 33, 32, 36, 12, 4); init_enemyStruct(EN_VULTF2, EN_VULTF2, 5, 0, 250, 0, INV_CHAINSAW, 91, "wr2_vlts.san", 31, 33, 32, 35, 12, 4); init_enemyStruct(EN_VULTM2, EN_VULTM2, 6, 0, 900, 0, INV_BOOT, 91, "wr2_rott.san", 34, 33, 32, 45, 16, 4); init_enemyStruct(EN_CAVEFISH, EN_CAVEFISH, 7, 0, 60, 0, INV_DUST, 92, "wr2_cave.san", 39, 0, 0, 41, 13, 2); init_enemyStruct(EN_TORQUE, EN_TORQUE, 8, 0, 900, 0, INV_HAND, 93, "wr2_vltp.san", 57, 0, 0, 37, 12, 1); init_fluConfStruct(1, 1, &_smush_minedrivFlu, "minedriv.san", 235, 1300); init_fluConfStruct(2, 1, &_smush_minedrivFlu, "minedriv.san", 355, 1300); init_fluConfStruct(3, 1, &_smush_minedrivFlu, "minedriv.san", 1255, 1300); init_fluConfStruct(4, 1, &_smush_minedrivFlu, "minedriv.san", 565, 1300); init_fluConfStruct(5, 1, &_smush_minedrivFlu, "minedriv.san", 1040, 1300); init_fluConfStruct(8, 1, &_smush_minedrivFlu, "minedriv.san", 1040, 1300); init_fluConfStruct(9, 1, &_smush_minedrivFlu, "minedriv.san", 655, 1300); init_fluConfStruct(10, 1, &_smush_minedrivFlu, "minedriv.san", 115, 1300); init_fluConfStruct(11, 1, &_smush_minedrivFlu, "minedriv.san", 315, 1300); init_fluConfStruct(12, 1, &_smush_minedrivFlu, "minedriv.san", 235, 1300); init_fluConfStruct(15, 6, &_smush_toranchFlu, "toranch.san", 115, 530); init_fluConfStruct(16, 5, &_smush_tovista2Flu, "tovista2.san", 235, 290); init_fluConfStruct(17, 4, &_smush_tovista1Flu, "tovista1.san", 175, 230); init_fluConfStruct(18, 4, &_smush_tovista1Flu, "tovista1.san", 175, 230); init_fluConfStruct(19, 6, &_smush_toranchFlu, "toranch.san", 115, 530); init_fluConfStruct(20, 6, &_smush_toranchFlu, "toranch.san", 115, 530); init_scenePropStruct( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1); init_scenePropStruct( 1, 0, 1, 128, 2001, 0, 0, 0, 0, 56, 2); init_scenePropStruct( 2, 0, 0, 125, 1002, 0, 0, 0, 0, 35, 3); init_scenePropStruct( 3, 0, 1, 129, 2002, 0, 0, 0, 0, 23, 4); init_scenePropStruct( 4, 0, 1, 130, 2003, 0, 0, 0, 0, 40, 5); init_scenePropStruct( 5, 0, 0, 126, 1005, 0, 0, 0, 0, 46, 6); init_scenePropStruct( 6, 0, 1, 131, 2004, 0, 0, 0, 0, 39, 7); init_scenePropStruct( 7, 0, 1, 132, 2005, 0, 0, 0, 0, 45, 8); init_scenePropStruct( 8, 0, 1, 133, 2006, 0, 0, 0, 0, 14, 9); init_scenePropStruct( 9, 0, 0, 127, 1009, 0, 0, 0, 0, 15, 10); init_scenePropStruct( 10, 0, 1, 134, 501, 0, 0, 0, 0, 25, 11); init_scenePropStruct( 11, 0, 1, 135, 502, 0, 0, 0, 0, 15, 0); init_scenePropStruct( 12, 1, -1, 0, 0, 0xFF, 0xFF, 0xFF, 0, 0, 1); init_scenePropStruct( 13, 1, 0, 291, 135, 0xFF, 0xFF, 0xFF, 0, 25, 0); init_scenePropStruct( 14, 2, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 15, 2, 1, 277, 17, 0xFC, 0, 0xFC, 0, 56, 2); init_scenePropStruct( 16, 2, 0, 288, 18, 0xFF, 0xFF, 0xFF, 0, 56, 3); init_scenePropStruct( 17, 2, 1, 278, 19, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 18, 3, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 19, 3, 1, 282, 23, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 20, 4, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 21, 4, 1, 283, 24, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 22, 5, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 23, 5, 1, 284, 25, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 24, 6, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 25, 6, 1, 285, 26, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 26, 7, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 27, 7, 1, 286, 27, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 28, 8, -1, 0, 0, 0xFC, 0, 0xFC, 0, 0, 1); init_scenePropStruct( 29, 8, 1, 287, 28, 0xFC, 0, 0xFC, 0, 56, 0); init_scenePropStruct( 30, 9, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 31, 9, 1, 261, 1, 0xFC, 0, 0, 0, 40, 2); init_scenePropStruct( 32, 9, 1, 262, 2, 0xFC, 0, 0, 0, 40, 3); init_scenePropStruct( 33, 9, 1, 263, 3, 0xFC, 0, 0, 0, 40, 0); init_scenePropStruct( 34, 10, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 35, 10, 1, 263, 3, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 36, 11, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 37, 11, 1, 264, 4, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 38, 12, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 39, 12, 1, 265, 5, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 40, 13, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 41, 13, 1, 266, 6, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 42, 14, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 43, 14, 1, 267, 7, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 44, 15, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 45, 15, 1, 268, 8, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 46, 16, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 47, 16, 1, 274, 14, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 48, 17, -1, 0, 0, 0xFC, 0, 0, 0, 0, 1); init_scenePropStruct( 49, 17, 1, 270, 10, 0xFC, 0, 0, 0, 30, 0); init_scenePropStruct( 50, 18, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 51, 18, 0, 289, 45, 0xFF, 0xFF, 0xFF, 0, 40, 2); init_scenePropStruct( 52, 18, 1, 177, 49, 0xFC, 0xFC, 0x54, 0, 40, 3); init_scenePropStruct( 53, 18, 1, 178, 50, 0xFC, 0xFC, 0x54, 0, 40, 4); init_scenePropStruct( 54, 18, 0, 290, 47, 0xFF, 0xFF, 0xFF, 0, 40, 0); init_scenePropStruct( 55, 19, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 56, 19, 1, 179, 51, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 57, 20, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 58, 20, 1, 183, 55, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 59, 21, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 60, 21, 1, 184, 56, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 61, 22, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 62, 22, 1, 186, 58, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 63, 23, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 64, 23, 1, 191, 63, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 65, 24, -1, 0, 0, 0xFC, 0xFC, 0x54, 0, 0, 1); init_scenePropStruct( 66, 24, 1, 192, 64, 0xFC, 0xFC, 0x54, 0, 40, 0); init_scenePropStruct( 67, 25, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 68, 25, 1, 220, 93, 0xBC, 0x78, 0x48, 0, 40, 2); init_scenePropStruct( 69, 25, 1, 221, 94, 0xBC, 0x78, 0x48, 0, 40, 3); init_scenePropStruct( 70, 25, 1, 222, 95, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 71, 26, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 72, 26, 1, 223, 96, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 73, 27, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 74, 27, 1, 224, 97, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 75, 28, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 76, 28, 1, 225, 98, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 77, 29, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 78, 29, 1, 226, 99, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 79, 30, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 80, 30, 1, 228, 101, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 81, 31, -1, 0, 0, 0xBC, 0x78, 0x48, 0, 0, 1); init_scenePropStruct( 82, 31, 1, 229, 102, 0xBC, 0x78, 0x48, 0, 40, 0); init_scenePropStruct( 83, 32, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 84, 32, 1, 233, 106, 0xA8, 0xA8, 0xA8, 0, 40, 2); init_scenePropStruct( 85, 32, 1, 234, 107, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 86, 33, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 87, 33, 1, 241, 114, 0xA8, 0xA8, 0xA8, 0, 40, 2); init_scenePropStruct( 88, 33, 1, 242, 115, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 89, 34, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 90, 34, 1, 237, 110, 0xA8, 0xA8, 0xA8, 0, 40, 2); init_scenePropStruct( 91, 34, 1, 238, 111, 0xA8, 0xA8, 0xA8, 0, 40, 3); init_scenePropStruct( 92, 34, 1, 239, 112, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 93, 35, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 94, 35, 1, 258, 131, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 95, 36, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 96, 36, 1, 260, 133, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 97, 37, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct( 98, 37, 1, 252, 125, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct( 99, 38, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct(100, 38, 1, 254, 127, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct(101, 39, -1, 0, 0, 0xA8, 0xA8, 0xA8, 0, 0, 1); init_scenePropStruct(102, 39, 1, 236, 109, 0xA8, 0xA8, 0xA8, 0, 40, 0); init_scenePropStruct(103, 40, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(104, 40, 1, 174, 42, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(105, 41, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(106, 41, 1, 167, 36, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(107, 42, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(108, 42, 1, 160, 29, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(109, 43, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(110, 43, 1, 161, 30, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(111, 44, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(112, 44, 1, 163, 32, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(113, 45, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(114, 45, 1, 164, 33, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(115, 46, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(116, 46, 1, 170, 39, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(117, 47, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(118, 47, 1, 166, 35, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(119, 48, -1, 0, 0, 4, 0xBC, 0, 0, 0, 1); init_scenePropStruct(120, 48, 1, 175, 43, 4, 0xBC, 0, 0, 40, 0); init_scenePropStruct(121, 49, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(122, 49, 1, 203, 75, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(123, 50, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(124, 50, 1, 194, 66, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(125, 51, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(126, 51, 1, 195, 67, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(127, 52, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(128, 52, 1, 199, 71, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(129, 53, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(130, 53, 1, 205, 77, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(131, 54, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(132, 54, 1, 212, 85, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(133, 55, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(134, 55, 1, 201, 73, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(135, 56, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(136, 56, 1, 198, 70, 0x40, 0x40, 0xFC, 0, 40, 0); init_scenePropStruct(137, 57, -1, 0, 0, 0x40, 0x40, 0xFC, 0, 0, 1); init_scenePropStruct(138, 57, 0, 59, 134, 0xFF, 0xFF, 0xFF, 0, 30, 0); _actor[0].damage = 0; _actor[0].maxdamage = 80; _actor[0].field_8 = 1; _actor[0].frame = 0; _actor[0].tilt = 0; _actor[0].cursorX = 0; _actor[0].speed = 0; _actor[0].x = 160; _actor[0].y = 0; _actor[0].y1 = -1; _actor[0].x1 = -1; _actor[0].weaponClass = 2; _actor[0].animWeaponClass = 0; _actor[0].field_34 = 2; _actor[0].field_38 = 0; _actor[0].lost = 0; _actor[0].kicking = 0; _actor[0].field_44 = 0; _actor[0].field_48 = 0; _actor[0].defunct = 0; _actor[0].scenePropSubIdx = 0; _actor[0].field_54 = 0; _actor[0].runningSound = 0; _actor[0].weapon = INV_HAND; _actor[0].inventory[INV_CHAIN] = 0; _actor[0].inventory[INV_CHAINSAW] = 0; _actor[0].inventory[INV_MACE] = 0; _actor[0].inventory[INV_2X4] = 0; _actor[0].inventory[INV_WRENCH] = 1; _actor[0].inventory[INV_BOOT] = 1; _actor[0].inventory[INV_HAND] = 1; _actor[0].inventory[INV_DUST] = 0; _actor[0].probability = 5; _actor[0].enemyHandler = EN_BEN; init_actStruct(0, 0, 11, 1, 1, 0, 0, 0); init_actStruct(0, 1, 12, 1, 1, 0, 0, 0); init_actStruct(0, 2, 1, 1, 1, 0, 0, 0); init_actStruct(0, 3, 1, 1, 1, 0, 0, 0); _actor[1].damage = 0; _actor[1].maxdamage = -1; _actor[1].field_8 = 1; _actor[1].frame = 0; _actor[1].tilt = 0; _actor[1].cursorX = 0; _actor[1].speed = 0; _actor[1].x = 160; _actor[1].y = 0; _actor[1].y1 = -1; _actor[1].x1 = -1; _actor[1].weaponClass = 2; _actor[1].animWeaponClass = 0; _actor[1].field_34 = 0; _actor[1].field_38 = 0; _actor[1].lost = 0; _actor[1].kicking = 0; _actor[1].field_44 = 0; _actor[1].field_48 = 0; _actor[1].defunct = 0; _actor[1].scenePropSubIdx = 0; _actor[1].field_54 = 0; _actor[1].runningSound = 0; _actor[1].weapon = INV_HAND; _actor[1].inventory[INV_CHAIN] = 0; _actor[1].inventory[INV_CHAINSAW] = 0; _actor[1].inventory[INV_MACE] = 1; _actor[1].inventory[INV_2X4] = 0; _actor[1].inventory[INV_WRENCH] = 0; _actor[1].inventory[INV_BOOT] = 0; _actor[1].inventory[INV_HAND] = 0; _actor[1].inventory[INV_DUST] = 0; _actor[1].probability = 5; _actor[1].enemyHandler = -1; init_actStruct(1, 0, 14, 1, 1, 0, 0, 0); init_actStruct(1, 1, 15, 1, 1, 0, 0, 0); init_actStruct(1, 2, 13, 1, 1, 0, 0, 0); init_actStruct(1, 3, 13, 1, 1, 0, 0, 0); for (i = 0; i < 9; i++) for (j = 0; j < 10; j++) _enemyState[i][j] = 0; } void Insane::init_actStruct(int actornum, int actnum, int32 actorval, byte state, int32 room, int32 animTilt, int32 tilt, int32 frame) { _actor[actornum].act[actnum].actor = actorval; _actor[actornum].act[actnum].state = state; _actor[actornum].act[actnum].room = room; _actor[actornum].act[actnum].animTilt = animTilt; _actor[actornum].act[actnum].tilt = tilt; _actor[actornum].act[actnum].frame = frame; } void Insane::init_enemyStruct(int n, int32 handler, int32 initializer, int32 field_8, int32 maxdamage, int32 field_10, int32 weapon, int32 sound, const char *filename, int32 costume4, int32 costume6, int32 costume5, int16 costumevar, int32 maxframe, int32 field_34) { assert(strlen(filename) < 20); _enemy[n].handler = handler; _enemy[n].initializer = initializer; _enemy[n].field_8 = field_8; _enemy[n].maxdamage = maxdamage; _enemy[n].field_10 = field_10; _enemy[n].weapon = weapon; _enemy[n].sound = sound; strncpy(_enemy[n].filename, filename, 20); _enemy[n].costume4 = costume4; _enemy[n].costume6 = costume6; _enemy[n].costume5 = costume5; _enemy[n].costumevar = costumevar; _enemy[n].maxframe = maxframe; _enemy[n].field_34 = field_34; } void Insane::init_fluConfStruct(int n, int sceneId, byte **fluPtr, const char *filenamePtr, int startFrame, int numFrames) { _fluConf[n].sceneId = sceneId; _fluConf[n].fluPtr = fluPtr; _fluConf[n].filenamePtr = filenamePtr; _fluConf[n].startFrame = startFrame; _fluConf[n].numFrames = numFrames; } void Insane::init_scenePropStruct(int32 n, int32 n1, int32 actornum, int32 sound, int32 trsId, byte r, byte g, byte b, int32 counter, int32 maxCounter, int32 index) { _sceneProp[n].actor = actornum; // main actor number, -1 if not applicable _sceneProp[n].sound = sound; _sceneProp[n].trsId = trsId; _sceneProp[n].r = r; _sceneProp[n].g = g; _sceneProp[n].b = b; _sceneProp[n].counter = counter; _sceneProp[n].maxCounter = maxCounter; _sceneProp[n].index = index; } int32 Insane::enemyInitializer(int num, int32 actor1, int32 actor2, int32 probability) { switch (num) { case EN_ROTT1: return enemy0initializer(actor1, actor2, probability); break; case EN_ROTT2: return enemy1initializer(actor1, actor2, probability); break; case EN_ROTT3: return enemy2initializer(actor1, actor2, probability); break; case EN_VULTF1: return enemy3initializer(actor1, actor2, probability); break; case EN_VULTM1: return enemy4initializer(actor1, actor2, probability); break; case EN_VULTF2: return enemy5initializer(actor1, actor2, probability); break; case EN_VULTM2: return enemy6initializer(actor1, actor2, probability); break; case EN_CAVEFISH: return enemy7initializer(actor1, actor2, probability); break; case EN_TORQUE: return enemy8initializer(actor1, actor2, probability); break; case -1: // nothing break; } return 0; } int32 Insane::enemyHandler(int num, int32 actor1, int32 actor2, int32 probability) { switch (num) { case EN_ROTT1: return enemy0handler(actor1, actor2, probability); break; case EN_ROTT2: return enemy1handler(actor1, actor2, probability); break; case EN_ROTT3: return enemy2handler(actor1, actor2, probability); break; case EN_VULTF1: return enemy3handler(actor1, actor2, probability); break; case EN_VULTM1: return enemy4handler(actor1, actor2, probability); break; case EN_VULTF2: return enemy5handler(actor1, actor2, probability); break; case EN_VULTM2: return enemy6handler(actor1, actor2, probability); break; case EN_CAVEFISH: return enemy7handler(actor1, actor2, probability); break; case EN_TORQUE: return enemy8handler(actor1, actor2, probability); break; case EN_BEN: return enemyBenHandler(actor1, actor2, probability); break; case -1: // nothing break; } return 0; } int32 Insane::enemy0handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act2damage = _actor[actor2].damage; // ebp act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (!_actor[actor1].defunct) { if (_enHdlVar[EN_ROTT1][1] > _enHdlVar[EN_ROTT1][2]) { if (act1damage - act2damage >= 30) { if (rand() % probability != 1) _enHdlVar[EN_ROTT1][0] = 0; else _enHdlVar[EN_ROTT1][0] = 1; } _enHdlVar[EN_ROTT1][1] = 0; _enHdlVar[EN_ROTT1][2] = rand() % (probability * 2); } dist = ABS(act1x - act2x); if (_enHdlVar[EN_ROTT1][3] > _enHdlVar[EN_ROTT1][4]) { if (_enHdlVar[EN_ROTT1][0] == 1) { if (weaponMaxRange(actor1) < dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { if (weaponMinRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } else { if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } _enHdlVar[EN_ROTT1][3] = 0; _enHdlVar[EN_ROTT1][4] = rand() % probability; } if (_enHdlVar[EN_ROTT1][5] > _enHdlVar[EN_ROTT1][6]) { if (weaponMaxRange(actor2) + 40 >= dist) { if (rand() % probability == 1) retval = 1; } if (_actor[actor2].kicking) { if (weaponMaxRange(actor2) <= dist) if (rand() % (probability * 2) <= 1) retval = 1; } _enHdlVar[EN_ROTT1][5] = 0; _enHdlVar[EN_ROTT1][6] = ABS(rand() % probability) * 2; } if (_actor[actor1].weapon == -1) retval = 2; if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { if (_actor[actor1].act[3].state == 54) { switch (rand() % 10) { case 3: if (!_enemyState[EN_ROTT1][6]) { _enemyState[EN_ROTT1][6] = 1; prepareScenePropScene(scenePropIdx[54], 0, 0); } break; case 8: if (!_enemyState[EN_ROTT1][4]) { _enemyState[EN_ROTT1][4] = 1; prepareScenePropScene(scenePropIdx[52], 0, 0); } break; } } else { switch(rand() % 15) { case 2: if (!_enemyState[EN_ROTT1][2]) { _enemyState[EN_ROTT1][2] = 1; prepareScenePropScene(scenePropIdx[50], 0, 0); } break; case 4: if (!_enemyState[EN_ROTT1][3]) { _enemyState[EN_ROTT1][3] = 1; prepareScenePropScene(scenePropIdx[51], 0, 0); } break; case 6: if (!_enemyState[EN_ROTT1][7]) { _enemyState[EN_ROTT1][7] = 1; if (_enemy[EN_ROTT1].field_8) prepareScenePropScene(scenePropIdx[55], 0, 0); } break; case 9: if (!_enemyState[EN_ROTT1][5]) { _enemyState[EN_ROTT1][5] = 1; prepareScenePropScene(scenePropIdx[53], 0, 0); } break; case 11: if (!_enemyState[EN_ROTT1][8]) { _enemyState[EN_ROTT1][8] = 1; prepareScenePropScene(scenePropIdx[56], 0, 0); } break; default: break; } } } _enHdlVar[EN_ROTT1][1]++; _enHdlVar[EN_ROTT1][3]++; _enHdlVar[EN_ROTT1][5]++; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; } return retval; } int32 Insane::enemy0initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 9; i++) _enemyState[EN_ROTT1][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_ROTT1][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy1handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act2damage = _actor[actor2].damage; // ebp act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (!_actor[actor1].defunct) { if (_enHdlVar[EN_ROTT2][1] > _enHdlVar[EN_ROTT2][2]) { if (act1damage - act2damage >= 30) { if (rand() % probability != 1) _enHdlVar[EN_ROTT2][0] = 0; else _enHdlVar[EN_ROTT2][0] = 1; } _enHdlVar[EN_ROTT2][1] = 0; _enHdlVar[EN_ROTT2][2] = rand() % (probability * 2); } dist = ABS(act1x - act2x); if (_enHdlVar[EN_ROTT2][3] > _enHdlVar[EN_ROTT2][4]) { if (_enHdlVar[EN_ROTT2][0] == 1) { if (weaponMaxRange(actor1) < dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { if (weaponMinRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } else { if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } _enHdlVar[EN_ROTT2][3] = 0; _enHdlVar[EN_ROTT2][4] = rand() % probability; } if (_enHdlVar[EN_ROTT2][5] > _enHdlVar[EN_ROTT2][6]) { if (weaponMaxRange(actor2) + 40 >= dist) { if (rand() % probability == 1) retval = 1; } if (_actor[actor2].kicking) { if (weaponMaxRange(actor2) <= dist) if (rand() % (probability * 2) <= 1) retval = 1; } _enHdlVar[EN_ROTT1][5] = 0; _enHdlVar[EN_ROTT1][6] = ABS(rand() % probability) * 2; } if (_actor[actor1].weapon == -1) retval = 2; if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { if (_actor[actor1].act[3].state == 54) { switch (rand() % 10) { case 3: if (!_enemyState[EN_ROTT2][6]) { _enemyState[EN_ROTT2][6] = 1; prepareScenePropScene(scenePropIdx[38], 0, 0); } break; case 8: if (!_enemyState[EN_ROTT2][5]) { _enemyState[EN_ROTT2][5] = 1; prepareScenePropScene(scenePropIdx[37], 0, 0); } break; } } else { switch(rand() % 15) { case 2: if (!_enemyState[EN_ROTT2][2]) { _enemyState[EN_ROTT2][2] = 1; prepareScenePropScene(scenePropIdx[34], 0, 0); } break; case 11: if (!_enemyState[EN_ROTT1][7]) { _enemyState[EN_ROTT1][7] = 1; prepareScenePropScene(scenePropIdx[39], 0, 0); } break; default: break; } } } _enHdlVar[EN_ROTT2][1]++; _enHdlVar[EN_ROTT2][3]++; _enHdlVar[EN_ROTT2][5]++; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; } return retval; } int32 Insane::enemy1initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 9; i++) _enemyState[EN_ROTT2][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_ROTT2][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy2handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act2damage = _actor[actor2].damage; // ebp act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (!_actor[actor1].defunct) { if (_enHdlVar[EN_ROTT3][1] > _enHdlVar[EN_ROTT3][2]) { if (act1damage - act2damage >= 30) { if (rand() % probability != 1) _enHdlVar[EN_ROTT3][0] = 0; else _enHdlVar[EN_ROTT3][0] = 1; } _enHdlVar[EN_ROTT3][1] = 0; _enHdlVar[EN_ROTT3][2] = rand() % (probability * 2); } dist = abs(act1x - act2x); if (_enHdlVar[EN_ROTT3][3] > _enHdlVar[EN_ROTT3][4]) { if (_enHdlVar[EN_ROTT3][0] == 1) { if (weaponMaxRange(actor1) < dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { if (weaponMinRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } else { if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } _enHdlVar[EN_ROTT3][3] = 0; _enHdlVar[EN_ROTT3][4] = rand() % probability; } if (_enHdlVar[EN_ROTT3][5] > _enHdlVar[EN_ROTT3][6]) { if (weaponMaxRange(actor2) + 40 >= dist) { if (rand() % probability == 1) retval = 1; } if (_actor[actor2].kicking) { if (weaponMaxRange(actor2) <= dist) if (rand() % (probability * 2) <= 1) retval = 1; } _enHdlVar[EN_ROTT3][5] = 0; _enHdlVar[EN_ROTT3][6] = ABS(rand() % probability) * 2; } if (_actor[actor1].weapon == -1) retval = 2; if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { if (_actor[actor1].act[3].state == 54) { switch (rand() % 10) { case 3: if (!_enemyState[EN_ROTT3][1]) { _enemyState[EN_ROTT3][1] = 1; prepareScenePropScene(scenePropIdx[26], 0, 0); } break; case 5: if (!_enemyState[EN_ROTT3][3]) { _enemyState[EN_ROTT3][3] = 1; prepareScenePropScene(scenePropIdx[28], 0, 0); } break; case 8: if (!_enemyState[EN_ROTT3][2]) { _enemyState[EN_ROTT3][2] = 1; prepareScenePropScene(scenePropIdx[27], 0, 0); } break; } } else { if (_actor[actor1].kicking) { if (rand() % 10 == 9) { if (!_enemyState[EN_ROTT3][6]) { _enemyState[EN_ROTT3][6] = 1; prepareScenePropScene(scenePropIdx[31], 0, 0); } } } else { if (rand() % 15 == 7) { if (!_enemyState[EN_ROTT3][5]) { _enemyState[EN_ROTT3][5] = 1; prepareScenePropScene(scenePropIdx[30], 0, 0); } } } } } _enHdlVar[EN_ROTT3][1]++; _enHdlVar[EN_ROTT3][3]++; _enHdlVar[EN_ROTT3][5]++; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; } return retval; } int32 Insane::enemy2initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 7; i++) _enemyState[EN_ROTT3][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_ROTT3][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy3handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act2damage = _actor[actor2].damage; // ebp act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (!_actor[actor1].defunct) { if (_enHdlVar[EN_VULTF1][1] > _enHdlVar[EN_VULTF1][2]) { if (act1damage - act2damage >= 30) { if (rand() % probability != 1) _enHdlVar[EN_VULTF1][0] = 0; else _enHdlVar[EN_VULTF1][0] = 1; } _enHdlVar[EN_VULTF1][1] = 0; _enHdlVar[EN_VULTF1][2] = rand() % (probability * 2); } dist = ABS(act1x - act2x); if (_enHdlVar[EN_VULTF1][3] > _enHdlVar[EN_VULTF1][4]) { if (_enHdlVar[EN_VULTF1][0] == 1) { if (weaponMaxRange(actor1) < dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { if (weaponMinRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } else { if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } _enHdlVar[EN_VULTF1][3] = 0; _enHdlVar[EN_VULTF1][4] = rand() % probability; } if (_enHdlVar[EN_VULTF1][5] > _enHdlVar[EN_VULTF1][6]) { if (_enHdlVar[EN_VULTF1][0] == 1) { if (weaponMaxRange(actor2) + 40 >= dist) if (rand() % probability == 1) retval = 1; } else { if (_actor[actor1].kicking) if (weaponMaxRange(actor2) <= dist) if (rand() % probability <= 1) retval = 1; } _enHdlVar[EN_VULTF1][5] = 0; _enHdlVar[EN_VULTF1][6] = ABS(rand() % probability) * 2; } if (_actor[actor1].weapon == -1) retval = 2; if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { _enHdlVar[EN_VULTF1][8] = rand() % 26; if (_enHdlVar[EN_VULTF1][8] != _enHdlVar[EN_VULTF1][7]) { switch (_enHdlVar[EN_VULTF1][8]) { case 0: if (!_enemyState[EN_VULTF1][4]) { _enemyState[EN_VULTF1][4] = 1; prepareScenePropScene(scenePropIdx[3], 0, 0); } break; case 1: if (!_enemyState[EN_VULTF1][1]) { _enemyState[EN_VULTF1][1] = 1; prepareScenePropScene(scenePropIdx[4], 0, 0); } break; case 2: if (!_enemyState[EN_VULTF1][2]) { _enemyState[EN_VULTF1][2] = 1; prepareScenePropScene(scenePropIdx[5], 0, 0); } break; case 3: if (!_enemyState[EN_VULTF1][3]) { _enemyState[EN_VULTF1][3] = 1; prepareScenePropScene(scenePropIdx[6], 0, 0); } break; case 4: if (!_enemyState[EN_VULTF1][4]) { _enemyState[EN_VULTF1][4] = 1; prepareScenePropScene(scenePropIdx[7], 0, 0); } break; case 5: if (!_enemyState[EN_VULTF1][5]) { _enemyState[EN_VULTF1][5] = 1; prepareScenePropScene(scenePropIdx[8], 0, 0); } break; } _enHdlVar[EN_VULTF1][7] = _enHdlVar[EN_VULTF1][8]; } } _enHdlVar[EN_VULTF1][1]++; _enHdlVar[EN_VULTF1][3]++; _enHdlVar[EN_VULTF1][5]++; } else { _actor[actor1].cursorX = 0; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; } return retval; } int32 Insane::enemy3initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 6; i++) _enemyState[EN_VULTF1][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_VULTF1][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy4handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act2damage = _actor[actor2].damage; // ebp act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (!_actor[actor1].defunct) { if (_enHdlVar[EN_VULTM1][1] > _enHdlVar[EN_VULTM1][2]) { if (act1damage - act2damage >= 30) { if (rand() % probability != 1) _enHdlVar[EN_VULTM1][0] = 0; else _enHdlVar[EN_VULTM1][0] = 1; } _enHdlVar[EN_VULTM1][1] = 0; _enHdlVar[EN_VULTM1][2] = rand() % (probability * 2); } dist = ABS(act1x - act2x); if (_enHdlVar[EN_VULTM1][3] > _enHdlVar[EN_VULTM1][4]) { if (_enHdlVar[EN_VULTM1][0] == 1) { if (weaponMaxRange(actor1) < dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { if (weaponMinRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } else { if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } _enHdlVar[EN_VULTM1][3] = 0; _enHdlVar[EN_VULTM1][4] = rand() % probability; } if (_enHdlVar[EN_VULTM1][5] > _enHdlVar[EN_VULTM1][6]) { if (weaponMaxRange(actor2) + 40 >= dist) { if (rand() % probability == 1) retval = 1; } if (_actor[actor2].kicking) { if (weaponMaxRange(actor2) >= dist) // that's weird but original is >= if (rand() % (probability * 2) <= 1) retval = 1; } _enHdlVar[EN_VULTM1][5] = 0; _enHdlVar[EN_VULTM1][6] = ABS(rand() % probability) * 2; } if (_actor[actor1].weapon == -1) retval = 2; if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { if (_actor[actor1].act[3].state == 54) { switch (rand() % 10) { case 4: if (!_enemyState[EN_VULTM1][7]) { _enemyState[EN_VULTM1][7] = 1; prepareScenePropScene(scenePropIdx[46], 0, 0); } break; case 8: if (!_enemyState[EN_VULTM1][8]) { _enemyState[EN_VULTM1][8] = 1; prepareScenePropScene(scenePropIdx[47], 0, 0); } break; } } else { if (_actor[actor1].kicking) { switch (rand() % 10) { case 3: prepareScenePropScene(scenePropIdx[44], 0, 0); break; case 9: prepareScenePropScene(scenePropIdx[45], 0, 0); break; } } else { if (weaponMaxRange(actor2) <= dist) { switch (rand() % 10) { case 3: if (!_enemyState[EN_VULTM1][3]) { _enemyState[EN_VULTM1][3] = 1; prepareScenePropScene(scenePropIdx[42], 0, 0); } break; case 9: if (!_enemyState[EN_VULTM1][4]) { _enemyState[EN_VULTM1][4] = 1; prepareScenePropScene(scenePropIdx[43], 0, 0); } break; } } else { switch (rand() % 15) { case 7: if (!_enemyState[EN_VULTM1][9]) { _enemyState[EN_VULTM1][9] = 1; prepareScenePropScene(scenePropIdx[48], 0, 0); } break; case 11: if (!_enemyState[EN_VULTM1][1]) { _enemyState[EN_VULTM1][1] = 1; prepareScenePropScene(scenePropIdx[40], 0, 0); } break; } } } } } _enHdlVar[EN_VULTM1][1]++; _enHdlVar[EN_VULTM1][3]++; _enHdlVar[EN_VULTM1][5]++; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; } return retval; } int32 Insane::enemy4initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 10; i++) _enemyState[EN_VULTM1][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_VULTM1][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy5handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // ebp dist = ABS(act1x - act2x); if (weaponMaxRange(actor1) >= dist) { if (!_enHdlVar[EN_VULTF2][2]) _enHdlVar[EN_VULTF2][3]++; _enHdlVar[EN_VULTF2][1] = 1; } else { _enHdlVar[EN_VULTF2][1] = 0; } if (!_actor[actor1].defunct) { if (_enHdlVar[EN_VULTF2][3] >= 2 || act1damage) { _actor[actor1].damage = 10; if (weaponMaxRange(actor2) >= dist) { if (act2x < act1x) _actor[actor1].cursorX = -101; else _actor[actor1].cursorX = 101; } else { _actor[actor1].cursorX = 0; } if (weaponMaxRange(actor1) + 20 <= dist) if (rand() % probability == 1) retval = 1; } else { if (weaponMaxRange(actor2) <= dist && _actor[actor2].weapon == 1) if (_actor[actor2].kicking) { if (rand() % probability <= 1) retval = 1; } else { retval = 1; } _actor[actor1].cursorX = 0; if (_enHdlVar[EN_VULTF2][0] >= 100) _enHdlVar[EN_VULTF2][3] = 3; } if ((_actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { if (_actor[actor1].act[3].state == 54) switch (rand() % 10) { case 4: if (!_enemyState[EN_VULTF2][6]) { _enemyState[EN_VULTF2][6] = 1; prepareScenePropScene(scenePropIdx[15], 0, 0); } break; case 8: if (!_enemyState[EN_VULTF2][3]) { _enemyState[EN_VULTF2][3] = 1; prepareScenePropScene(scenePropIdx[12], 0, 0); } break; } else { if (_actor[actor1].kicking) { switch (rand() % 10) { case 2: if (!_enemyState[EN_VULTF2][8]) { _enemyState[EN_VULTF2][8] = 1; prepareScenePropScene(scenePropIdx[17], 0, 0); } break; case 5: prepareScenePropScene(scenePropIdx[11], 0, 0); _enemyState[EN_VULTF2][2] = 1; break; case 9: _enemyState[EN_VULTF2][1] = 1; prepareScenePropScene(scenePropIdx[10], 0, 0); break; } } else { switch (rand() % 15) { case 3: if (!_enemyState[EN_VULTF2][4]) { _enemyState[EN_VULTF2][4] = 1; prepareScenePropScene(scenePropIdx[13], 0, 0); } break; case 11: if (!_enemyState[EN_VULTF2][5]) { _enemyState[EN_VULTF2][5] = 1; prepareScenePropScene(scenePropIdx[14], 0, 0); } break; } } } } } if (_actor[actor1].defunct) _actor[actor1].cursorX = 0; if (_actor[actor1].weapon == -1) retval = 2; if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; _enHdlVar[EN_VULTF2][2] = _enHdlVar[EN_VULTF2][1]; _enHdlVar[EN_VULTF2][0]++; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; _actor[1].act[2].state = 113; } return retval; } int32 Insane::enemy5initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 9; i++) _enemyState[EN_VULTF2][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_VULTF2][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy6handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act2damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx //ebx act2damage = _actor[actor2].damage; // ebp // edi act1x = _actor[actor1].x; // esi act2x = _actor[actor2].x; // edi if (_actor[actor2].weapon == 1) retval = 1; dist = ABS(act1x - act2x); if (!_actor[actor1].defunct) { if (_currScenePropIdx == scenePropIdx[18] && _currScenePropSubIdx == 3) retval = 1; } else { if (act1damage > 0 || _enHdlVar[EN_VULTM2][0] > 20) { _actor[actor1].damage = 10; if (!_enHdlVar[EN_VULTM2][1] && !_actor[actor1].lost) { if (!_actor[actor1].field_54) { switch (rand() % 4) { case 0: if (!_enemyState[EN_VULTM2][1]) { _enemyState[EN_VULTM2][1] = 1; prepareScenePropScene(scenePropIdx[19], 0, 0); } break; case 1: if (!_enemyState[EN_VULTM2][2]) { _enemyState[EN_VULTM2][2] = 1; prepareScenePropScene(scenePropIdx[20], 0, 0); } break; case 2: if (!_enemyState[EN_VULTM2][3]) { _enemyState[EN_VULTM2][3] = 1; prepareScenePropScene(scenePropIdx[21], 0, 0); } break; case 3: if (!_enemyState[EN_VULTM2][4]) { _enemyState[EN_VULTM2][4] = 1; prepareScenePropScene(scenePropIdx[22], 0, 0); } break; } _enHdlVar[EN_VULTM2][1] = 1; goto _label1; } } else { if (_actor[actor1].field_54 == 0 && _actor[actor1].lost == 0) { retval = 1; _enHdlVar[EN_VULTM2][0] = 0; } } } else { if (weaponMaxRange(actor1) <= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } if (_actor[actor1].weapon == -1) retval = 2; if ((_enHdlVar[EN_VULTM2][1] == 0) && ( _actor[actor1].field_54 == 0) && (_actor[actor2].lost == 0) && (_actor[actor1].lost == 0)) { switch (rand() % 15) { case 2: if (!_enemyState[EN_VULTM2][5]) { _enemyState[EN_VULTM2][5] = 1; prepareScenePropScene(scenePropIdx[23], 0, 0); } break; case 7: if (!_enemyState[EN_VULTF1][6]) { _enemyState[EN_VULTF1][6] = 1; prepareScenePropScene(scenePropIdx[24], 0, 0); } break; } } } _label1: if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 219) _actor[actor1].cursorX = 320; else if (act1x > 280) _actor[actor1].cursorX = -160; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[0].act[2].state = 97; smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].room = 0; _actor[0].act[1].room = 0; _actor[0].act[0].room = 0; smlayer_setActorLayer(1, 2, 25); smlayer_setActorCostume(1, 2, readArray(_numberArray, 45)); smlayer_setActorFacing(1, 2, 6, 180); _actor[1].act[2].state = 97; _actor[1].act[2].room = 1; _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; } if (_actor[actor1].lost) retval = 0; return retval; } int32 Insane::enemy6initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 7; i++) _enemyState[EN_VULTM2][i] = 0; for (i = 0; i < 9; i++) _enHdlVar[EN_VULTM2][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy7handler(int32 actor1, int32 actor2, int32 probability) { int32 act1damage, act1x, act2x, retval; int32 dist; retval = 0; act1damage = _actor[actor1].damage; // ebx act1x = _actor[actor1].x; // ebp act2x = _actor[actor2].x; // edi dist = ABS(act1x - act2x); if (_enHdlVar[EN_CAVEFISH][1] >= 600) { _enHdlVar[EN_CAVEFISH][2] = 1; _enHdlVar[EN_CAVEFISH][1] = 0; } else { if (!_enHdlVar[EN_CAVEFISH][2]) { if (weaponMaxRange(actor2) - 30 <= dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } } } if (weaponMaxRange(actor1) > dist) { if (act2x < act1x) _actor[actor1].cursorX = 101; else _actor[actor1].cursorX = -101; } else { _actor[actor1].cursorX = 0; } if (act1x > 310) _actor[actor1].cursorX = -320; else if (act1x < 10) _actor[actor1].cursorX = 320; if (dist <= 95) retval = 1; if (_actor[actor1].weapon == -1) retval = 2; _enHdlVar[EN_CAVEFISH][1]++; _enHdlVar[EN_CAVEFISH][0] = act1damage; // Shift+V cheat to win the battle if (_scumm->getKeyState(0x56) && !_beenCheated && !_actor[0].lost && !_actor[1].lost) { _beenCheated = 1; _actor[1].damage = _actor[1].maxdamage + 10; _actor[1].act[2].state = 102; } return retval; } int32 Insane::enemy7initializer(int32 actor1, int32 actor2, int32 probability) { int i; for (i = 0; i < 9; i++) _enHdlVar[EN_CAVEFISH][i] = 0; _beenCheated = 0; return 1; } int32 Insane::enemy8handler(int32 actor1, int32 actor2, int32 probability) { _actor[actor1].cursorX = 0; return 0; } int32 Insane::enemy8initializer(int32 actor1, int32 actor2, int32 probability) { return 1; } int32 Insane::enemyBenHandler(int32 actor1, int32 actor2, int32 probability) { int32 retval; int32 tmp; retval = processMouse(); // Joystick support is skipped retval |= processKeyboard(); tmp = _enemyState[EN_BEN][0] - 160; if (tmp < -160) tmp = -160; if (tmp > 160) tmp = 160; _actor[actor1].cursorX = tmp; smush_warpMouse(_enemyState[EN_BEN][0], _enemyState[EN_BEN][1], -1); return (retval & 3); } int32 Insane::processMouse(void) { int32 buttons = 0; _enemyState[EN_BEN][0] = _scumm->_mouse.x; _enemyState[EN_BEN][1] = _scumm->_mouse.y; buttons = _scumm->VAR(_scumm->VAR_LEFTBTN_HOLD) ? 1 : 0; buttons |= _scumm->VAR(_scumm->VAR_RIGHTBTN_HOLD) ? 2 : 0; return buttons; } int32 Insane::processKeyboard(void) { int32 retval = 0; int dx = 0, dy = 0; int tmpx, tmpy; if (_scumm->getKeyState(0x14f) || _scumm->getKeyState(0x14b) || _scumm->getKeyState(0x147)) dx--; if (_scumm->getKeyState(0x151) || _scumm->getKeyState(0x14d) || _scumm->getKeyState(0x149)) dx++; if (_scumm->getKeyState(0x147) || _scumm->getKeyState(0x148) || _scumm->getKeyState(0x149)) dy--; if (_scumm->getKeyState(0x14f) || _scumm->getKeyState(0x150) || _scumm->getKeyState(0x151)) dy++; if (dx == _keybOldDx) _velocityX += 4; else _velocityX = 3; if (dy == _keybOldDy) _velocityY += 4; else _velocityY = 2; _keybOldDx = dx; _keybOldDy = dy; if (_velocityX > 48) _velocityX = 48; if (_velocityY > 32) _velocityY = 32; _keybX += dx * _velocityX; _keybY += dy * _velocityY; tmpx = _keybX / 4; tmpy = _keybY / 4; _keybX -= tmpx * 4; _keybY -= tmpy * 4; if (tmpx || tmpy) { _enemyState[EN_BEN][0] += tmpx; _enemyState[EN_BEN][1] += tmpy; } if (_scumm->getKeyState(0x0d)) retval |= 1; if (_scumm->getKeyState(0x09)) retval |= 2; return retval; } void Insane::readFileToMem(const char *name, byte **buf) { File *in; uint32 len; in = new File(); in->open(name, _scumm->getGameDataPath()); len = in->size(); *buf = (byte *)malloc(len); in->read(*buf, len); in->close(); } void Insane::runScene(int arraynum) { // procPtr5 = &procPtr5Body; // procPtr6 = &procPtr6Body; // procIact = &handleIact; // ptrMainLoop = &ptrMainLoopBody; _insaneIsRunning = true; _player = new SmushPlayer(_scumm, _speed); _player->insanity(true); _numberArray = arraynum; // set4Values() _val109w = 114; _val110w = 256; _val111w = 4; _val112w = 256; // set1Value() _val113d = 0; // zeroValues1() _objArray2Idx = 0; _objArray2Idx2 = 0; // zeroValues2() _objArray1Idx = 0; _objArray1Idx2 = 0; // zeroValues3() _currScenePropIdx = 0; _currScenePropSubIdx = 0; _currTrsMsg = 0; smush_proc41(); smush_warpMouse(160, 100, -1); putActors(); readState(); _val10b = _val50d; // FIXME: seems to be unused setTrsFile(_trsFilePtr); // FIXME: we don't need it debug(0, "INSANE Arg: %d", readArray(_numberArray, 0)); switch (readArray(_numberArray, 0)) { case 1: initScene(1); setupValues(); smlayer_setActorCostume(0, 2, readArray(_numberArray, 10)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); startVideo("minedriv.san", 1, 32, 12, 0); break; case 2: setupValues(); smlayer_setActorCostume(0, 2, readArray(_numberArray, 11)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); _val8d = readArray(_numberArray, 2); if (_val55d) { initScene(5); startVideo("tovista2.san", 1, 32, 12, 0); } else if (_val56d) { initScene(5); startVideo("tovista2.san", 1, 32, 12, 0, _smush_tovista2Flu, 60); } else { initScene(4); startVideo("tovista1.san", 1, 32, 12, 0); } break; case 3: setupValues(); smlayer_setActorCostume(0, 2, readArray(_numberArray, 11)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); _val8d = readArray(_numberArray, 2); if (_val55d) { initScene(6); startVideo("toranch.san", 1, 32, 12, 0, _smush_toranchFlu, 300); } else if (_val56d) { initScene(6); startVideo("toranch.san", 1, 32, 12, 0, _smush_toranchFlu, 240); } else { initScene(6); startVideo("toranch.san", 1, 32, 12, 0); } break; case 4: _firstBattle = true; _currEnemy = EN_ROTT1; initScene(13); startVideo("minefite.san", 1, 32, 12, 0); break; case 5: setWordInString(_numberArray, 1, _val54d); initScene(24); startVideo("rottopen.san", 1, 32, 12, 0); break; case 6: initScene(1); setupValues(); smlayer_setFluPalette(_smush_roadrashRip, 1); smlayer_setActorCostume(0, 2, readArray(_numberArray, 10)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); startVideo("minedriv.san", 1, 32, 12, 0, _smush_minedrivFlu, 420); break; case 7: case 8: case 9: break; case 10: initScene(26); setWordInString(_numberArray, 1, _val54d); startVideo("credits.san", 1, 32, 12, 0); default: warning("Unknown FT_INSANE mode %d", readArray(_numberArray, 0)); break; } resetTrsFilePtr(); // FIXME: we don't need it smush_proc39(); putActors(); smush_proc40(); _scumm->_sound->pauseSounds(0); // IMUSE_Resume(); _enemy[EN_ROTT3].maxdamage = 120; _insaneIsRunning = false; setWordInString(_numberArray, 50, _actor[0].inventory[INV_CHAIN]); setWordInString(_numberArray, 51, _actor[0].inventory[INV_CHAINSAW]); setWordInString(_numberArray, 52, _actor[0].inventory[INV_MACE]); setWordInString(_numberArray, 53, _actor[0].inventory[INV_2X4]); setWordInString(_numberArray, 54, _actor[0].inventory[INV_WRENCH]); setWordInString(_numberArray, 55, _actor[0].inventory[INV_DUST]); setWordInString(_numberArray, 337, _enemy[EN_TORQUE].field_8); setWordInString(_numberArray, 329, _enemy[EN_ROTT1].field_8); setWordInString(_numberArray, 330, _enemy[EN_ROTT2].field_8); setWordInString(_numberArray, 331, _enemy[EN_ROTT3].field_8); setWordInString(_numberArray, 332, _enemy[EN_VULTF1].field_8); setWordInString(_numberArray, 333, _enemy[EN_VULTM1].field_8); setWordInString(_numberArray, 334, _enemy[EN_VULTF2].field_8); setWordInString(_numberArray, 335, _enemy[EN_VULTM2].field_8); setWordInString(_numberArray, 336, _enemy[EN_CAVEFISH].field_8); setWordInString(_numberArray, 339, _enemy[EN_VULTF2].field_10); setWordInString(_numberArray, 56, _enemy[EN_CAVEFISH].field_10); setWordInString(_numberArray, 340, _enemy[EN_VULTM2].field_10); // insane_unlock(); // FIXME _scumm->_sound->stopAllSounds(); // IMUSE_StopAllSounds(); if (_memoryAllocatedNotOK) { error("Memory Alloc Error in Mineroad (Heap Size?)"); } delete _player; } void Insane::startVideo(const char *filename, int num, int argC, int frameRate, int doMainLoop, byte *fluPtr, int32 numFrames) { // Demo has different insane, so disable it now if (_scumm->_features & GF_DEMO) return; _smush_curFrame = 0; _smush_isSanFileSetup = 0; _smush_setupsan4 = 0; _smush_smushState = 0; _smush_setupsan1 = 0; _smush_setupsan17 = 0; if (fluPtr) { smush_setupSanWithFlu(filename, 0, -1, -1, 0, fluPtr, numFrames); } else { smush_setupSanFromStart(filename, 0, -1, -1, 0); } _player->play(filename, _scumm->getGameDataPath()); } int Insane::smlayer_mainLoop(void) { // FIXME: implement warning("stub Insane::smlayer_mainLoop"); mainLoop(); return 1; } void Insane::smush_proc39(void) { // FIXME: implement warning("stub Insane::smush_proc39"); } void Insane::smush_proc40(void) { // FIXME: implement warning("stub Insane::smush_proc40"); } void Insane::smush_proc41(void) { // FIXME: implement warning("stub Insane::smush_proc41"); } void Insane::smush_warpMouse(int x, int y, int buttons) { _scumm->_system->warp_mouse(x, y); } void Insane::putActors(void) { smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1, _smlayer_room); smlayer_putActor(0, 0, _actor[0].x, _actor[0].y1, _smlayer_room); smlayer_putActor(0, 1, _actor[0].x, _actor[0].y1, _smlayer_room); smlayer_putActor(1, 2, _actor[0].x, _actor[0].y1, _smlayer_room); smlayer_putActor(1, 0, _actor[0].x, _actor[0].y1, _smlayer_room); smlayer_putActor(1, 1, _actor[0].x, _actor[0].y1, _smlayer_room); } void Insane::readState(void) { _actor[0].inventory[INV_CHAIN] = readArray(_numberArray, 50) != 0; _actor[0].inventory[INV_CHAINSAW] = readArray(_numberArray, 51) != 0; _actor[0].inventory[INV_MACE] = readArray(_numberArray, 52) != 0; _actor[0].inventory[INV_2X4] = readArray(_numberArray, 53) != 0; _actor[0].inventory[INV_WRENCH] = readArray(_numberArray, 54) != 0; _actor[0].inventory[INV_DUST] = readArray(_numberArray, 55) != 0; _actor[0].inventory[INV_HAND] = 1; // Boot _actor[0].inventory[INV_BOOT] = 1; // Hand _smlayer_room = readArray(_numberArray, 320); _smlayer_room2 = readArray(_numberArray, 321); _val55d = readArray(_numberArray, 322); _val53d = readArray(_numberArray, 323); _val57d = readArray(_numberArray, 324); _val52d = readArray(_numberArray, 325); _val56d = readArray(_numberArray, 326); _val54d = readArray(_numberArray, 327); _val51d = readArray(_numberArray, 328); _enemy[EN_TORQUE].field_8 = readArray(_numberArray, 337); _enemy[EN_ROTT1].field_8 = readArray(_numberArray, 329); _enemy[EN_ROTT2].field_8 = readArray(_numberArray, 330); _enemy[EN_ROTT3].field_8 = readArray(_numberArray, 331); _enemy[EN_VULTF1].field_8 = readArray(_numberArray, 332); _enemy[EN_VULTM1].field_8 = readArray(_numberArray, 333); _enemy[EN_VULTF2].field_8 = readArray(_numberArray, 334); _enemy[EN_VULTM2].field_8 = readArray(_numberArray, 335); _enemy[EN_CAVEFISH].field_8 = readArray(_numberArray, 336); _enemy[EN_VULTM2].field_10 = readArray(_numberArray, 340); _enemy[EN_CAVEFISH].field_10 = readArray(_numberArray, 56); _enemy[EN_VULTF2].field_10 = readArray(_numberArray, 339); } void Insane::setTrsFile(int file) { // FIXME: we don't need it } void Insane::resetTrsFilePtr(void) { // FIXME: we don't need it } int Insane::initScene(int sceneId) { debug(0, "initScene(%d)", sceneId); if (_needSceneSwitch) return 1; stopSceneSounds(_currSceneId); // do it for previous scene loadSceneData(sceneId, 0, 1); if (loadSceneData(sceneId, 0, 2)) { setSceneCostumes(sceneId); _sceneData2Loaded = 0; _sceneData1Loaded = 0; } else _sceneData2Loaded = 1; _currSceneId = sceneId; return 1; } void Insane::stopSceneSounds(int sceneId) { int flag = 0; debug(0, "stopSceneSounds(%d)", sceneId); switch (sceneId) { case 1: smlayer_stopSound(88); smlayer_stopSound(86); smlayer_stopSound(87); flag = 1; break; case 18: case 19: smlayer_stopSound(88); flag = 1; break; case 17: smlayer_stopSound(88); smlayer_stopSound(94); flag = 1; break; case 2: case 7: case 8: flag = 1; break; case 3: case 21: flag = 1; // break is omittted intentionally case 13: if (_actor[0].runningSound != 0) smlayer_stopSound(_actor[0].runningSound); _actor[0].runningSound = 0; if (_actor[1].runningSound != 0) smlayer_stopSound(_actor[1].runningSound); _actor[1].runningSound = 0; if (_currScenePropIdx != 0) shutCurrentScene(); _currScenePropSubIdx = 0; _currTrsMsg = 0; _actor[0].defunct = 0; _actor[0].scenePropSubIdx = 0; _actor[0].field_54 = 0; _actor[1].defunct = 0; _actor[1].scenePropSubIdx = 0; _actor[1].field_54 = 0; smlayer_stopSound(89); smlayer_stopSound(90); smlayer_stopSound(91); smlayer_stopSound(92); smlayer_stopSound(93); smlayer_stopSound(95); smlayer_stopSound(87); break; case 4: case 5: case 6: smlayer_stopSound(88); smlayer_stopSound(86); flag = 1; break; case 24: smlayer_stopSound(90); break; case 9: case 10: case 11: case 12: case 14: case 15: case 16: case 20: case 22: case 23: break; } smush_proc39(); if (!flag) return; smlayer_setActorCostume(0, 2, 0); smlayer_setActorCostume(0, 0, 0); smlayer_setActorCostume(0, 1, 0); smlayer_setActorCostume(1, 2, 0); smlayer_setActorCostume(1, 0, 0); smlayer_setActorCostume(1, 1, 0); return; } void Insane::shutCurrentScene(void) { debug(0, "shutCurrentScene()"); _currScenePropIdx = 0; _currTrsMsg = 0; _currScenePropSubIdx = 0; _actor[1].scenePropSubIdx = 0; _actor[1].defunct = 0; if (_actor[1].runningSound != 0) { smlayer_stopSound(_actor[1].runningSound); _actor[1].runningSound = 0; } _actor[0].scenePropSubIdx = 0; _actor[0].defunct = 0; if (_actor[0].runningSound != 0) { smlayer_stopSound(_actor[0].runningSound); _actor[0].runningSound = 0; } _battleScene = true; } // insane_loadSceneData1 & insane_loadSceneData2 int Insane::loadSceneData(int scene, int flag, int phase) { int retvalue = 1; debug(0, "Insane::loadSceneData(%d, %d, %d)", scene, flag, phase); //if (phase == 1) /// FIXME // insane_unlock(); switch (scene) { case 1: smlayer_loadSound(88, flag, phase); smlayer_loadSound(86, flag, phase); smlayer_loadSound(87, flag, phase); smlayer_loadCostume(10, phase); break; case 4: case 5: case 6: smlayer_loadSound(88, flag, phase); smlayer_loadCostume(11, phase); break; case 3: case 13: switch(_currEnemy) { case EN_TORQUE: smlayer_loadSound(59, flag, phase); smlayer_loadSound(93, flag, phase); smlayer_loadCostume(57, phase); smlayer_loadCostume(37, phase); break; case EN_ROTT1: smlayer_loadSound(201, flag, phase); smlayer_loadSound(194, flag, phase); smlayer_loadSound(195, flag, phase); smlayer_loadSound(199, flag, phase); smlayer_loadSound(205, flag, phase); smlayer_loadSound(212, flag, phase); smlayer_loadSound(198, flag, phase); smlayer_loadSound(203, flag, phase); smlayer_loadSound(213, flag, phase); smlayer_loadSound(215, flag, phase); smlayer_loadSound(216, flag, phase); smlayer_loadSound(217, flag, phase); smlayer_loadSound(218, flag, phase); smlayer_loadSound(90, flag, phase); smlayer_loadCostume(26, phase); smlayer_loadCostume(16, phase); smlayer_loadCostume(17, phase); smlayer_loadCostume(27, phase); break; case EN_ROTT2: smlayer_loadSound(242, flag, phase); smlayer_loadSound(244, flag, phase); smlayer_loadSound(236, flag, phase); smlayer_loadSound(238, flag, phase); smlayer_loadSound(239, flag, phase); smlayer_loadSound(240, flag, phase); smlayer_loadSound(258, flag, phase); smlayer_loadSound(259, flag, phase); smlayer_loadSound(260, flag, phase); smlayer_loadSound(243, flag, phase); smlayer_loadSound(244, flag, phase); smlayer_loadSound(245, flag, phase); smlayer_loadSound(246, flag, phase); smlayer_loadSound(233, flag, phase); smlayer_loadSound(234, flag, phase); smlayer_loadSound(241, flag, phase); smlayer_loadSound(242, flag, phase); smlayer_loadSound(90, flag, phase); smlayer_loadCostume(28, phase); smlayer_loadCostume(16, phase); smlayer_loadCostume(17, phase); smlayer_loadCostume(42, phase); break; case EN_ROTT3: smlayer_loadSound(223, flag, phase); smlayer_loadSound(224, flag, phase); smlayer_loadSound(225, flag, phase); smlayer_loadSound(226, flag, phase); smlayer_loadSound(228, flag, phase); smlayer_loadSound(229, flag, phase); smlayer_loadSound(230, flag, phase); smlayer_loadSound(232, flag, phase); smlayer_loadSound(220, flag, phase); smlayer_loadSound(221, flag, phase); smlayer_loadSound(222, flag, phase); smlayer_loadSound(90, flag, phase); smlayer_loadCostume(15, phase); smlayer_loadCostume(16, phase); smlayer_loadCostume(17, phase); smlayer_loadCostume(43, phase); smlayer_loadCostume(47, phase); break; case EN_VULTF1: smlayer_loadSound(282, flag, phase); smlayer_loadSound(283, flag, phase); smlayer_loadSound(284, flag, phase); smlayer_loadSound(285, flag, phase); smlayer_loadSound(286, flag, phase); smlayer_loadSound(287, flag, phase); smlayer_loadSound(279, flag, phase); smlayer_loadSound(280, flag, phase); smlayer_loadSound(281, flag, phase); smlayer_loadSound(277, flag, phase); smlayer_loadSound(288, flag, phase); smlayer_loadSound(278, flag, phase); smlayer_loadSound(91, flag, phase); smlayer_loadCostume(29, phase); smlayer_loadCostume(33, phase); smlayer_loadCostume(32, phase); smlayer_loadCostume(37, phase); break; case EN_VULTM1: smlayer_loadSound(160, flag, phase); smlayer_loadSound(161, flag, phase); smlayer_loadSound(174, flag, phase); smlayer_loadSound(167, flag, phase); smlayer_loadSound(163, flag, phase); smlayer_loadSound(164, flag, phase); smlayer_loadSound(170, flag, phase); smlayer_loadSound(166, flag, phase); smlayer_loadSound(175, flag, phase); smlayer_loadSound(162, flag, phase); smlayer_loadSound(91, flag, phase); smlayer_loadCostume(30, phase); smlayer_loadCostume(33, phase); smlayer_loadCostume(32, phase); smlayer_loadCostume(36, phase); break; case EN_VULTF2: smlayer_loadSound(263, flag, phase); smlayer_loadSound(264, flag, phase); smlayer_loadSound(265, flag, phase); smlayer_loadSound(266, flag, phase); smlayer_loadSound(267, flag, phase); smlayer_loadSound(268, flag, phase); smlayer_loadSound(270, flag, phase); smlayer_loadSound(271, flag, phase); smlayer_loadSound(275, flag, phase); smlayer_loadSound(276, flag, phase); smlayer_loadSound(261, flag, phase); smlayer_loadSound(262, flag, phase); smlayer_loadSound(263, flag, phase); smlayer_loadSound(274, flag, phase); smlayer_loadSound(91, flag, phase); smlayer_loadCostume(31, phase); smlayer_loadCostume(33, phase); smlayer_loadCostume(32, phase); smlayer_loadCostume(35, phase); smlayer_loadCostume(46, phase); break; case EN_VULTM2: smlayer_loadSound(179, flag, phase); smlayer_loadSound(183, flag, phase); smlayer_loadSound(184, flag, phase); smlayer_loadSound(186, flag, phase); smlayer_loadSound(191, flag, phase); smlayer_loadSound(192, flag, phase); smlayer_loadSound(180, flag, phase); smlayer_loadSound(101, flag, phase); smlayer_loadSound(289, flag, phase); smlayer_loadSound(177, flag, phase); smlayer_loadSound(178, flag, phase); smlayer_loadSound(290, flag, phase); smlayer_loadSound(102, flag, phase); smlayer_loadSound(91, flag, phase); smlayer_loadCostume(34, phase); smlayer_loadCostume(33, phase); smlayer_loadCostume(32, phase); smlayer_loadCostume(44, phase); smlayer_loadCostume(45, phase); break; case EN_CAVEFISH: smlayer_loadSound(291, flag, phase); smlayer_loadSound(100, flag, phase); smlayer_loadSound(92, flag, phase); smlayer_loadCostume(39, phase); smlayer_loadCostume(40, phase); smlayer_loadCostume(41, phase); break; default: retvalue = 0; break; } smlayer_loadSound(64, flag, phase); smlayer_loadSound(65, flag, phase); smlayer_loadSound(66, flag, phase); smlayer_loadSound(67, flag, phase); smlayer_loadSound(68, flag, phase); smlayer_loadSound(69, flag, phase); smlayer_loadSound(70, flag, phase); smlayer_loadSound(71, flag, phase); smlayer_loadSound(72, flag, phase); smlayer_loadSound(73, flag, phase); smlayer_loadSound(74, flag, phase); smlayer_loadSound(75, flag, phase); smlayer_loadSound(76, flag, phase); smlayer_loadSound(77, flag, phase); smlayer_loadSound(78, flag, phase); smlayer_loadSound(79, flag, phase); smlayer_loadSound(80, flag, phase); smlayer_loadSound(81, flag, phase); smlayer_loadSound(82, flag, phase); smlayer_loadSound(83, flag, phase); smlayer_loadSound(84, flag, phase); smlayer_loadSound(85, flag, phase); smlayer_loadSound(86, flag, phase); smlayer_loadSound(87, flag, phase); smlayer_loadSound(62, flag, phase); smlayer_loadSound(63, flag, phase); smlayer_loadSound(60, flag, phase); smlayer_loadSound(61, flag, phase); smlayer_loadSound(315, flag, phase); smlayer_loadSound(316, flag, phase); smlayer_loadSound(317, flag, phase); smlayer_loadSound(98, flag, phase); smlayer_loadSound(318, flag, phase); smlayer_loadSound(96, flag, phase); smlayer_loadSound(97, flag, phase); smlayer_loadSound(95, flag, phase); smlayer_loadSound(89, flag, phase); smlayer_loadCostume(12, phase); smlayer_loadCostume(13, phase); smlayer_loadCostume(14, phase); smlayer_loadCostume(18, phase); smlayer_loadCostume(22, phase); smlayer_loadCostume(19, phase); smlayer_loadCostume(38, phase); smlayer_loadCostume(20, phase); smlayer_loadCostume(21, phase); smlayer_loadCostume(23, phase); smlayer_loadCostume(24, phase); smlayer_loadCostume(25, phase); break; case 21: case 24: case 25: smlayer_loadSound(223, flag, phase); smlayer_loadSound(224, flag, phase); smlayer_loadSound(225, flag, phase); smlayer_loadSound(226, flag, phase); smlayer_loadSound(228, flag, phase); smlayer_loadSound(229, flag, phase); smlayer_loadSound(230, flag, phase); smlayer_loadSound(232, flag, phase); smlayer_loadSound(90, flag, phase); smlayer_loadCostume(15, phase); smlayer_loadCostume(16, phase); smlayer_loadCostume(17, phase); smlayer_loadCostume(43, phase); smlayer_loadSound(62, flag, phase); smlayer_loadSound(63, flag, phase); smlayer_loadSound(60, flag, phase); smlayer_loadSound(61, flag, phase); smlayer_loadSound(315, flag, phase); smlayer_loadSound(316, flag, phase); smlayer_loadSound(317, flag, phase); smlayer_loadSound(98, flag, phase); smlayer_loadSound(318, flag, phase); smlayer_loadSound(96, flag, phase); smlayer_loadSound(97, flag, phase); smlayer_loadSound(95, flag, phase); smlayer_loadSound(89, flag, phase); smlayer_loadCostume(12, phase); smlayer_loadCostume(13, phase); smlayer_loadCostume(14, phase); smlayer_loadCostume(18, phase); smlayer_loadCostume(22, phase); break; case 17: smlayer_loadSound(88, flag, phase); smlayer_loadSound(94, flag, phase); break; case 2: case 7: case 8: case 9: case 10: case 11: case 12: case 14: case 15: case 16: case 18: case 19: case 20: case 22: case 23: break; default: retvalue = 0; } if (phase == 1) { _sceneData1Loaded = 1; _val11d = 0; } return retvalue; } void Insane::setSceneCostumes(int sceneId) { debug(0, "Insane::setSceneCostumes(%d)", sceneId); switch (sceneId) { case 1: smlayer_setActorCostume(0, 2, readArray(_numberArray, 10)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); smlayer_setFluPalette(_smush_roadrashRip, 0); setupValues(); return; break; case 17: smlayer_setFluPalette(_smush_goglpaltRip, 0); setupValues(); return; break; case 2: smlayer_setActorCostume(0, 2, readArray(_numberArray, 10)); setupValues(); return; break; case 13: setEnemyCostumes(); smlayer_setFluPalette(_smush_roadrashRip, 0); return; break; case 21: _currEnemy = EN_ROTT3; // PATCH setEnemyCostumes(); _actor[1].y = 200; smlayer_setFluPalette(_smush_roadrashRip, 0); return; break; case 4: case 5: case 6: smlayer_setActorCostume(0, 2, readArray(_numberArray, 11)); smlayer_putActor(0, 2, _actor[0].x, _actor[0].y1+190, _smlayer_room2); setupValues(); return; break; case 7: case 8: setWordInString(_numberArray, 4, 0); return; } } void Insane::setupValues(void) { _actor[0].x = 160; _actor[0].y = 200; _actor[0].tilt = 0; _actor[0].field_8 = 1; _actor[0].frame = 0; _actor[0].act[2].state = 1; _actor[0].act[0].state = 1; _actor[0].act[1].state = 0; _actor[0].act[2].room = 1; _actor[0].act[1].room = 0; _actor[0].act[0].room = 0; _actor[0].cursorX = 0; _actor[0].lost = 0; _currEnemy = -1; _val32d = -1; smush_warpMouse(160, 100, -1); } void Insane::setEnemyCostumes (void) { int i; debug(0, "setEnemyCostumes(%d)", _currEnemy); smlayer_setActorCostume(0, 2, readArray(_numberArray, 12)); smlayer_setActorCostume(0, 0, readArray(_numberArray, 14)); smlayer_setActorCostume(0, 1, readArray(_numberArray, 13)); smlayer_setActorLayer(0, 1, 1); smlayer_setActorLayer(0, 2, 5); smlayer_setActorLayer(0, 0, 10); smlayer_putActor(0, 2, _actor[0].x+11, _actor[0].y1+102, _smlayer_room2); smlayer_putActor(0, 1, _actor[0].x, _actor[0].y1+200, _smlayer_room2); smlayer_putActor(0, 0, _actor[0].x, _actor[0].y1+200, _smlayer_room2); if (_currEnemy == EN_CAVEFISH) { smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4)); _actor[1].act[2].room = 1; _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; _actor[1].act[2].animTilt = 1; _actor[1].field_8 = 98; _actor[1].act[2].state = 98; _actor[1].act[0].state = 98; _actor[1].act[1].state = 98; smlayer_putActor(1, 2, _actor[1].x + _actor[1].act[2].tilt - 17, _actor[1].y + _actor[1].y1 - 98, _smlayer_room2); } else if (_currEnemy == EN_TORQUE) { smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4)); _actor[1].act[2].room = 1; _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; _actor[1].field_8 = 1; _actor[1].act[2].state = 1; _actor[1].act[0].state = 1; _actor[1].act[1].state = 1; smlayer_putActor(1, 2, _actor[1].x + _actor[1].act[2].tilt - 17, _actor[1].y + _actor[1].y1 - 98, _smlayer_room2); } else { _actor[1].act[2].room = 1; _actor[1].act[1].room = 1; _actor[1].act[0].room = 1; if (_enemy[_currEnemy].costume4) smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4)); if (_enemy[_currEnemy].costume5) smlayer_setActorCostume(1, 0, readArray(_numberArray, _enemy[_currEnemy].costume5)); if (_enemy[_currEnemy].costume6) smlayer_setActorCostume(1, 1, readArray(_numberArray, _enemy[_currEnemy].costume6)); _actor[1].field_8 = 1; _actor[1].act[2].state = 1; _actor[1].act[0].state = 1; _actor[1].act[1].state = 1; if (_actor[1].act[2].room != 0) smlayer_putActor(1, 2, _actor[1].x + _actor[1].act[2].tilt - 17, _actor[1].y + _actor[1].y1 - 98, _smlayer_room2); } if (_actor[1].act[1].room != 0) smlayer_putActor(1, 1, _actor[1].x, _actor[1].y + _actor[1].y1, _smlayer_room2); if (_actor[1].act[0].room != 0) smlayer_putActor(1, 0, _actor[1].x, _actor[1].y + _actor[1].y1, _smlayer_room2); smlayer_setActorLayer(1, 1, 1); smlayer_setActorLayer(1, 2, 5); smlayer_setActorLayer(1, 0, 10); _actor[1].damage = 0; _actor[1].x = 250; _actor[1].y = 300; _actor[1].cursorX = 0; _actor[1].tilt = 0; _actor[1].weapon = -1; _actor[1].weaponClass = 2; _enemy[_currEnemy].field_8++; _actor[1].maxdamage = _enemy[_currEnemy].maxdamage; _actor[1].enemyHandler = _enemy[_currEnemy].handler; _actor[1].animWeaponClass = 0; for (i = 0; i < 8; i++) _actor[1].inventory[i] = 0; _actor[0].damage = 0; _actor[0].x = 100; _actor[0].y = 200; _actor[0].weapon = INV_HAND; _actor[0].weaponClass = 2; _actor[0].animWeaponClass = 0; _actor[0].field_34 = 2; _actor[0].field_38 = 0; _actor[0].tilt = 0; _actor[0].field_8 = 1; _actor[0].act[2].state = 1; _actor[0].act[2].animTilt = 1; _actor[0].act[0].state = 0; _actor[0].act[1].state = 1; _actor[0].act[2].room = 1; _actor[0].act[1].room = 1; _actor[0].act[0].room = 1; _actor[0].cursorX = 0; _actor[0].defunct = 0; _actor[0].scenePropSubIdx = 0; _actor[0].field_54 = 0; _actor[0].runningSound = 0; _actor[0].lost = 0; _actor[0].kicking = 0; _actor[0].field_44 = 0; _actor[1].inventory[_enemy[_currEnemy].weapon] = 1; _actor[0].field_44 = 0; _actor[0].field_48 = 0; _actor[1].defunct = 0; _actor[1].scenePropSubIdx = 0; _actor[1].field_54 = 0; _actor[1].runningSound = 0; _actor[1].lost = 0; _actor[1].kicking = 0; _actor[1].field_44 = 0; _actor[1].field_48 = 0; if (_enemy[_currEnemy].initializer != -1) enemyInitializer(_enemy[_currEnemy].initializer, _actor[1].damage, _actor[0].damage, _actor[1].probability); smush_warpMouse(160, 100, -1); } // FIXME: it seems that in ScummVM it may be unused void Insane::mainLoop(void) { int32 resid; _val11d++; while (!idx2Compare()) { if(!(resid = idx2Tweak())) continue; _scumm->ensureResourceLoaded(rtSound, resid); _scumm->setResourceCounter(rtSound, resid, 1); } _scumm->increaseResourceCounter(); while (!idx1Compare()) { resid = idx1Tweak(); _scumm->ensureResourceLoaded(rtCostume, resid); _scumm->setResourceCounter(rtCostume, resid, 1); // smlayer_lock (rtCostume, resid); } if (loadSceneData(_currSceneId, 0, 2)) { _sceneData1Loaded = 0; _objArray2[0] = 0; return; } _sceneData1Loaded = 1; if (idx1Compare() || idx2Compare()) { _objArray2[0] = 0; return; } _objArray2[0]++; if (_objArray2[0] <= 5) { _objArray2[0] = 0; return; } smush_setToFinish(); loadSceneData(_currSceneId, 1, 2); _memoryAllocatedNotOK = 1; } bool Insane::idx1Compare(void) { return _objArray1Idx == _objArray1Idx2; } bool Insane::idx2Compare(void) { return _objArray2Idx == _objArray2Idx2; } int32 Insane::idx1Tweak(void) { _objArray1Idx++; if (_objArray1Idx >= 100) _objArray1Idx = 0; return _objArray1[_objArray1Idx]; } int32 Insane::idx2Tweak(void) { if (!_idx2Exceeded) if (_objArray2Idx >= _objArray2Idx2) return false; _objArray2Idx++; if (_objArray2Idx >= 100) { _idx2Exceeded = 0; _objArray2Idx = 0; } return _objArray2[_objArray2Idx]; } void Insane::smush_setToFinish(void) { debug(0, "Video is set to finish"); _scumm->_videoFinished = 1; } // smlayer_stopSound void Insane::smlayer_stopSound(int idx) { _scumm->_sound->stopSound(readArray(_numberArray, idx)); } void Insane::procPreRendering(void) { _smush_isSanFileSetup = 0; // FIXME: This shouldn't be here switchSceneIfNeeded(); if (_sceneData1Loaded) { if (!_keyboardDisable) { smush_changeState(1); _smush_isPauseImuse = true; IMUSE_shutVolume(); _keyboardDisable = 1; } } else { _val115w = 0; if (_keyboardDisable) { if (!_val116w) { smush_changeState(0); _smush_isPauseImuse = false; IMUSE_restoreVolume(); } _keyboardDisable = 0; } } _lastKey = getLastKey(1); } void Insane::switchSceneIfNeeded(void) { if (_needSceneSwitch && !_smush_isSanFileSetup) { putActors(); stopSceneSounds(_currSceneId); _tempSceneId = _currSceneId; _currSceneId = _temp2SceneId; _needSceneSwitch = false; loadSceneData(_temp2SceneId, 0, 1); if(loadSceneData(_temp2SceneId, 0, 2)) { setSceneCostumes(_temp2SceneId); _sceneData2Loaded = 0; _sceneData1Loaded = 0; return; } _sceneData2Loaded = 1; if (_temp2SceneId == 13 || _temp2SceneId == 3) _isBenCut = 1; } if (_sceneData2Loaded && !_sceneData1Loaded) { setSceneCostumes(_currSceneId); _sceneData2Loaded = 0; } } int Insane::smush_changeState(int state) { if (state == 2) { if (_smush_smushState == 0) _smush_smushState = 1; else _smush_smushState = 0; } else if (state == 4) { if (_smush_smushState) _smush_smushState = 3; } else if (state != 5) { _smush_smushState = state; } return _smush_smushState; } void Insane::procPostRendering(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { int32 tmpSnd; bool needMore = false; if(!_keyboardDisable && !_val116w) { switch (_currSceneId) { case 12: postCase11(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 1: postCase0(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); if(!smlayer_isSoundRunning(88)) smlayer_startSound1(88); smlayer_soundSetPan(88, ((_actor[0].x+160)>>2)+64); if(_tiresRustle) { if (!smlayer_isSoundRunning(87)) smlayer_startSound1(87); } else { smlayer_stopSound(87); } break; case 18: case 19: postCase17(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); smlayer_stopSound(95); smlayer_stopSound(87); smlayer_stopSound(88); if(!smlayer_isSoundRunning(88)) smlayer_startSound1(88); break; case 17: postCase16(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); if(!smlayer_isSoundRunning(88)) smlayer_startSound1(88); break; case 2: postCase1(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 3: postCase2(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); needMore = true; if(!smlayer_isSoundRunning(89)) { smlayer_startSound1(89); smlayer_soundSetPriority(89, 100); } tmpSnd = _enemy[_currEnemy].sound; if(!smlayer_isSoundRunning(tmpSnd)) { smlayer_startSound1(tmpSnd); smlayer_soundSetPriority(tmpSnd, 100); } smlayer_soundSetPan(89, ((_actor[0].x+160)>>2)+64); smlayer_soundSetPan(tmpSnd, ((_actor[1].x+160)>>2)+64); if(!_tiresRustle) { smlayer_stopSound(87); } else { if (!smlayer_isSoundRunning(87)) smlayer_startSound1(87); } break; case 21: postCase20(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); needMore = true; if(!smlayer_isSoundRunning(89)) { smlayer_startSound1(89); smlayer_soundSetPriority(89, 100); } tmpSnd = _enemy[_currEnemy].sound; if(!smlayer_isSoundRunning(tmpSnd)) { smlayer_startSound1(tmpSnd); smlayer_soundSetPriority(tmpSnd, 100); } smlayer_soundSetPan(89, ((_actor[0].x+160)>>2)+64); smlayer_soundSetPan(tmpSnd, ((_actor[1].x+160)>>2)+64); break; case 4: case 5: postCase3(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); if(!smlayer_isSoundRunning(88)) smlayer_startSound1(88); smlayer_soundSetPan(88, ((_actor[0].x+160)>>2)+64); break; case 6: postCase5(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); if(!smlayer_isSoundRunning(88)) smlayer_startSound1(88); smlayer_soundSetPan(88, ((_actor[0].x+160)>>2)+64); break; case 7: case 8: postCase6(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 9: case 23: postCase8(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 10: postCase9(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 11: case 20: case 22: postCase10(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 13: postCase12(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); needMore = true; if(!smlayer_isSoundRunning(89)) { smlayer_startSound1(89); smlayer_soundSetPriority(89, 100); } tmpSnd = _enemy[_currEnemy].sound; if(!smlayer_isSoundRunning(tmpSnd)) { smlayer_startSound1(tmpSnd); smlayer_soundSetPriority(tmpSnd, 100); } smlayer_soundSetPan(89, ((_actor[0].x+160)>>2)+64); smlayer_soundSetPan(tmpSnd, ((_actor[1].x+160)>>2)+64); break; case 24: if(!smlayer_isSoundRunning(90)) { smlayer_startSound1(90); smlayer_soundSetPriority(90, 100); } postCase23(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 15: case 16: postCase14(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); break; case 25: case 26: break; } if (_currScenePropIdx) postCaseAll(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); _actor[0].frame++; _actor[0].act[3].frame++; _actor[0].act[2].frame++; _actor[0].act[1].frame++; _actor[0].act[0].frame++; _actor[1].act[3].frame++; _actor[1].frame++; _actor[1].act[2].frame++; _actor[1].act[1].frame++; _actor[1].act[0].frame++; } if (!_val115w) { smlayer_overrideDrawActorAt(&renderBitmap[0], renderBitmap[2], renderBitmap[3]); _isBenCut = 0; } if (_isBenCut) smlayer_drawSomething(renderBitmap, codecparam, 89, 56, 1, _smush_bencutNut, 0, 0, 0); if (!_keyboardDisable && !_val116w) _scumm->processActors(); if (needMore) postCaseMore(renderBitmap, codecparam, setupsan12, setupsan13, curFrame, maxFrame); _lastKey = 0; _tiresRustle = false; } void Insane::postCase11(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame && !_needSceneSwitch) { if (_firstBattle) { smush_setToFinish(); } else { queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); } } _val119_ = false; _val120_ = false; } void Insane::postCase0(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { turnBen(true); if (!curFrame || curFrame == 420) smlayer_setFluPalette(_smush_roadrashRip, 0); if (curFrame >= maxFrame) smush_rewindCurrentSan(1088, -1, -1); _val121_ = false; _val119_ = false; _val120_ = false; _val122_ = false; _val123_ = false; _continueFrame1 = curFrame; } void Insane::postCase17(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame && !_needSceneSwitch) { if (_currSceneId == 18) { queueSceneSwitch(17, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); setWordInString(_numberArray, 9, 1); } else { queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); setWordInString(_numberArray, 9, 0); } } _val119_ = false; _val120_ = false; } void Insane::postCase16(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { char buf[12]; int32 tmp; turnBen(true); sprintf(buf, "^f01%02o", curFrame & 0x3f); smlayer_showStatusMsg(-1, renderBitmap, codecparam, 180, 168, 1, 2, 0, "%s", buf); tmp = 400-curFrame; if (tmp < 0) tmp += 1300; sprintf(buf, "^f01%04d", tmp); smlayer_showStatusMsg(-1, renderBitmap, codecparam, 202, 168, 1, 2, 0, "%s", buf); sprintf(buf, "^f01%02o", curFrame & 0xff); smlayer_showStatusMsg(-1, renderBitmap, codecparam, 140, 168, 1, 2, 0, "%s", buf); smlayer_showStatusMsg(-1, renderBitmap, codecparam, 170, 43, 1, 2, 0, "%s", buf); smlayer_drawSomething(renderBitmap, codecparam, 0, 0, 1, _smush_bensgoggNut, 0, 0, 0); if (!_val124_) smlayer_drawSomething(renderBitmap, codecparam, 24, 170, 1, _smush_iconsNut, 23, 0, 0); if (!curFrame) smlayer_setFluPalette(_smush_goglpaltRip, 0); if (curFrame >= maxFrame) { smush_rewindCurrentSan(1088, -1, -1); smlayer_setFluPalette(_smush_goglpaltRip, 0); } _val121_ = false; _val123_ = false; _val119_ = false; _val120_ = false; _val124_ = false; _counter1++; _continueFrame1 = curFrame; if (_counter1 >= 10) _counter1 = 0; } void Insane::postCase1(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { struct fluConf *flu; if ((curFrame >= maxFrame) && !_needSceneSwitch) { flu = &_fluConf[14 + _iactSceneId2]; queueSceneSwitch(flu->sceneId, *flu->fluPtr, flu->filenamePtr, 64, 0, flu->startFrame, flu->numFrames); } _val119_ = false; _val120_ = false; } void Insane::postCase2(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { turnBen(_battleScene != 0); turnEnemy(true); if (!curFrame) smlayer_setFluPalette(_smush_roadrashRip, 0); if (curFrame >= maxFrame) smush_rewindCurrentSan(1088, -1, -1); _val121_ = false; _val119_ = false; _val120_ = false; _continueFrame = curFrame; } void Insane::postCase20(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { turnBen(true); turnEnemy(true); if (curFrame >= maxFrame) smush_rewindCurrentSan(1088, -1, -1); _val121_ = false; _val119_ = false; _val120_ = false; _continueFrame = curFrame; } void Insane::postCase3(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { turnBen(true); if (_actor[0].x >= 158 && _actor[0].x <= 168) { if (!smlayer_isSoundRunning(86)) smlayer_startSound1(86); } else { if (!smlayer_isSoundRunning(86)) smlayer_stopSound(86); } if (curFrame >= maxFrame) { if (_currSceneId == 4) { if (!_needSceneSwitch) { if (readArray(_numberArray, 6)) { if (readArray(_numberArray, 4)) queueSceneSwitch(14, 0, "hitdust2.san", 64, 0, 0, 0); else queueSceneSwitch(14, 0, "hitdust4.san", 64, 0, 0, 0); } else { if (readArray(_numberArray, 4)) queueSceneSwitch(14, 0, "hitdust1.san", 64, 0, 0, 0); else queueSceneSwitch(14, 0, "hitdust3.san", 64, 0, 0, 0); } } } else { if (readArray(_numberArray, 4)) { if (!_needSceneSwitch) queueSceneSwitch(15, 0, "vistthru.san", 64, 0, 0, 0); } else { setWordInString(_numberArray, 1, _val53d); smush_setToFinish(); } } } _val212_ = false; _val120_ = false; _val119_ = false; _iactSceneId = 0; } void Insane::postCase5(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { turnBen(true); if (_actor[0].x >= 158 && _actor[0].x <= 168) { if (!smlayer_isSoundRunning(86)) smlayer_startSound1(86); } else { if (!smlayer_isSoundRunning(86)) smlayer_stopSound(86); } if (curFrame >= maxFrame) { if (readArray(_numberArray, 4)) { if (!_needSceneSwitch) queueSceneSwitch(15, 0, "chasthru.san", 64, 0, 0, 0); } else { if (readArray(_numberArray, 5)) { setWordInString(_numberArray, 1, _val57d); smush_setToFinish(); } else { queueSceneSwitch(15, 0, "chasout.san", 64, 0, 0, 0); } } } _val212_ = false; _val120_ = false; _val119_ = false; _iactSceneId = 0; } void Insane::postCase6(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { struct fluConf *flu; if ((curFrame >= maxFrame) && !_needSceneSwitch) { if (_currSceneId == 8) flu = &_fluConf[7 + _iactSceneId2]; else flu = &_fluConf[0 + _iactSceneId2]; queueSceneSwitch(flu->sceneId, *flu->fluPtr, flu->filenamePtr, 64, 0, flu->startFrame, flu->numFrames); } _val119_ = false; _val120_ = false; } void Insane::postCase8(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame && !_needSceneSwitch) { _actor[0].damage = 0; if (_firstBattle) { queueSceneSwitch(13, _smush_minefiteFlu, "minefite.san", 64, 0, _continueFrame, 1300); } else { if (_currSceneId == 23) { queueSceneSwitch(21, 0, "rottfite.san", 64, 0, 0, 0); } else { queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); } } } _val119_ = false; _val120_ = false; } void Insane::postCase9(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame && !_needSceneSwitch) { _actor[0].damage = 0; queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); } _val119_ = false; _val120_ = false; } void Insane::postCase10(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame && !_needSceneSwitch) { _actor[0].damage = 0; switch (_currSceneId) { case 20: setWordInString(_numberArray, 8, 1); queueSceneSwitch(12, 0, "liftgog.san", 0, 0, 0, 0); break; case 22: setWordInString(_numberArray, 1, _val54d); smush_setToFinish(); break; default: if (_actor[0].inventory[_enemy[_currEnemy].weapon]) { queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); break; } switch (_enemy[_currEnemy].weapon) { case INV_CHAIN: _actor[1].inventory[INV_CHAIN] = 1; queueSceneSwitch(12, 0, "liftchay.san", 0, 0, 0, 0); break; case INV_CHAINSAW: _actor[1].inventory[INV_CHAINSAW] = 1; queueSceneSwitch(12, 0, "liftsaw.san", 0, 0, 0, 0); break; case INV_MACE: _actor[1].inventory[INV_MACE] = 1; queueSceneSwitch(12, 0, "liftmace.san", 0, 0, 0, 0); break; case INV_2X4: _actor[1].inventory[INV_2X4] = 1; queueSceneSwitch(12, 0, "liftbord.san", 0, 0, 0, 0); break; default: queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); break; } } } _val119_ = false; _val120_ = false; } void Insane::postCase12(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (_actor[1].y <= 200) { initScene(3); _actor[1].y = 200; switch (_currEnemy) { case EN_ROTT2: turnBen(true); if (_enemy[1].field_8 <= 1) prepareScenePropScene(scenePropIdx[32], 0, 1); else prepareScenePropScene(scenePropIdx[33], 0, 1); break; case EN_ROTT3: turnBen(true); if (_enemy[1].field_8 <= 1) prepareScenePropScene(scenePropIdx[25], 0, 1); break; case EN_VULTF1: turnBen(true); if (_enemy[1].field_8 <= 1) prepareScenePropScene(scenePropIdx[2], 0, 1); break; case EN_VULTF2: turnBen(true); if (_enemy[1].field_8 <= 1) prepareScenePropScene(scenePropIdx[9], 0, 1); else prepareScenePropScene(scenePropIdx[16], 0, 1); break; case EN_VULTM2: turnBen(true); prepareScenePropScene(scenePropIdx[18], 0, 1); _battleScene = false; break; case EN_TORQUE: turnBen(false); setWordInString(_numberArray, 1, _val51d); smush_setToFinish(); break; case EN_ROTT1: case EN_VULTM1: case EN_CAVEFISH: default: turnBen(true); break; } } else { switch (_currEnemy) { case EN_VULTM2: if (_enemy[EN_VULTM2].field_8 <= 1) turnBen(false); else turnBen(true); break; case EN_TORQUE: turnBen(false); if (_actor[1].y != 300) prepareScenePropScene(scenePropIdx[57], 1, 0); break; default: turnBen(true); } _actor[1].y -= (_actor[1].y - 200) / 20 + 1; } turnEnemy(false); if (curFrame == 0) smlayer_setFluPalette(_smush_roadrashRip, 0); if (curFrame >= maxFrame) smush_rewindCurrentSan(1088, -1, -1); _val119_ = 0; _val120_ = 0; _continueFrame = curFrame; } void Insane::postCase23(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame) { if (_currSceneId == 24) queueSceneSwitch(21, 0, "rottfite.san", 64, 0, 0, 0); if (readArray(_numberArray, 6) && readArray(_numberArray, 4)) queueSceneSwitch(16, 0, "limocrsh.san", 64, 0, 0, 0); queueSceneSwitch(5, 0, "tovista2.san", 64, 0, 0, 290); } _val119_ = false; _val120_ = false; } void Insane::postCase14(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (curFrame >= maxFrame) { if (_currSceneId == 16) { setWordInString(_numberArray, 4, 0); setWordInString(_numberArray, 5, 1); setWordInString(_numberArray, 1, _val56d); setWordInString(_numberArray, 3, _val55d); smush_setToFinish(); } else { switch (_tempSceneId) { case 5: queueSceneSwitch(6, 0, "toranch.san", 64, 0, 0, 530); break; case 6: queueSceneSwitch(4, 0, "tovista1.san", 64, 0, 0, 230); break; } } } _val119_ = false; _val120_ = false; } void Insane::postCaseAll(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { struct sceneProp *tsceneProp; tsceneProp = &_sceneProp[_currScenePropIdx + _currScenePropSubIdx]; if (tsceneProp->actor != -1) { if (_actor[tsceneProp->actor].field_54) { tsceneProp->counter++; if (!_actor[tsceneProp->actor].runningSound || ConfMan.getBool("subtitles")) { if (_actor[tsceneProp->actor].act[3].state == 72 && _currTrsMsg) { smush_setPaletteValue(1, tsceneProp->r, tsceneProp->g, tsceneProp->b); smush_setPaletteValue(2, 0, 0, 0); smlayer_showStatusMsg(-1, renderBitmap, codecparam, 160, 20, 1, 2, 5, "^f00%s", _currTrsMsg); } } } else { _currScenePropSubIdx = tsceneProp->index; if (_currScenePropSubIdx && _currScenePropIdx) { tsceneProp = &_sceneProp[_currScenePropIdx + _currScenePropSubIdx]; tsceneProp->counter = 0; if (tsceneProp->trsId) _currTrsMsg = handleTrsTag(_trsFilePtr, tsceneProp->trsId); else _currTrsMsg = 0; if (tsceneProp->actor != -1) { _actor[tsceneProp->actor].field_54 = 1; _actor[tsceneProp->actor].act[3].state = 117; _actor[tsceneProp->actor].scenePropSubIdx = _currScenePropSubIdx; } } else { _currScenePropIdx = 0; _currTrsMsg = 0; _currScenePropSubIdx = 0; _actor[0].defunct = 0; _actor[1].defunct = 0; _battleScene = true; } } } _val119_ = 0; _val120_ = 0; _continueFrame = curFrame; } void Insane::postCaseMore(byte *renderBitmap, int32 codecparam, int32 setupsan12, int32 setupsan13, int32 curFrame, int32 maxFrame) { if (_actor[0].weapon <= 7) { smlayer_drawSomething(renderBitmap, codecparam, 5, 160, 1, _smush_iconsNut, _actor[0].weapon + 11, 0, 0); } } void Insane::queueSceneSwitch(int32 sceneId, byte *fluPtr, const char *filename, int32 arg_C, int32 arg_10, int32 startFrame, int32 numFrames) { int32 tmp; debug(0, "queueSceneSwitch(%d, *, %s, %d, %d, %d, %d)", sceneId, filename, arg_C, arg_10, startFrame, numFrames); if (_needSceneSwitch || _sceneData1Loaded) return; if (fluPtr) { tmp = ((int)startFrame/30+1)*30; if (tmp >= numFrames) tmp = 0; smush_setupSanWithFlu(filename, arg_C|32, -1, -1, 0, fluPtr, tmp); } else { smush_setupSanFromStart(filename, arg_C|32, -1, -1, 0); } _needSceneSwitch = true; _temp2SceneId = sceneId; } void Insane::turnBen(bool controllable) { int32 buttons; switch (_currSceneId) { case 21: case 25: case 3: case 13: if (_actor[0].damage < _actor[0].maxdamage) { _actor[0].lost = 0; } else { if (!_actor[0].lost && !_actor[1].lost) { _actor[0].lost = 1; _actor[0].act[2].state = 36; _actor[0].act[1].state = 36; _actor[0].act[1].room = 0; _actor[0].act[0].state = 36; _actor[0].act[0].room = 0; if (smlayer_isSoundRunning(95)) smlayer_stopSound(95); } } buttons = 0; if (!_actor[0].lost && controllable) { buttons = actionBen(); if (_currSceneId == 13) buttons &= 2; if (_currEnemy == EN_TORQUE) buttons = 0; } debug(1, "00:%d 01:%d 02:%d 03:%d", _actor[0].act[0].state, _actor[0].act[1].state, _actor[0].act[2].state, _actor[0].act[3].state); actor01Reaction(buttons); actor02Reaction(buttons); actor03Reaction(buttons); actor00Reaction(buttons); break; case 17: mineChooseRoad(processBenOnRoad(false)); break; default: if (_actor[0].damage < _actor[0].maxdamage) { _actor[0].lost = 0; } else { if (!_actor[0].lost && !_actor[1].lost) { queueSceneSwitch(10, 0, "wr2_ben.san", 64, 0, 0, 0); _actor[0].lost = 1; _actor[0].act[2].state = 36; _actor[0].act[2].room = 0; _actor[0].act[0].state = 36; _actor[0].act[0].room = 0; _actor[0].act[1].state = 36; _actor[0].act[1].room = 0; mineChooseRoad(0); return; } } if (!_actor[0].lost && controllable) mineChooseRoad(processBenOnRoad(true)); else mineChooseRoad(0); break; } } int32 Insane::actionBen(void) { int32 buttons, tmp; bool doDamage = false; if (_actor[0].enemyHandler != -1) buttons = enemyHandler(_actor[0].enemyHandler, 0, 1, _actor[0].probability); else buttons = enemyHandler(EN_TORQUE, 0, 1, _actor[0].probability); if (_actor[0].tilt) { _actor[0].speed += _actor[0].cursorX / 40; } else { if (_actor[0].speed < 0) _actor[0].speed++; else _actor[0].speed--; } if (_actor[0].speed > 8) _actor[0].speed = 8; if (_actor[0].speed < -8) _actor[0].speed = -8; _actor[0].x += _actor[0].speed; if (_actor[0].x > 100) _actor[0].x--; else if (_actor[0].x < 100) _actor[0].x++; if (_actor[0].x >= 0) { if (_actor[1].x - 90 <= _actor[0].x && !_actor[0].lost && !_actor[1].lost) { _val213d++; _actor[0].x = _actor[1].x - 90; tmp = _actor[1].speed; _actor[1].speed = _actor[0].speed; _actor[0].speed = tmp; if (_val213d > 50) { _actor[0].cursorX = -320; _val213d = 0; } if (!smlayer_isSoundRunning(95)) smlayer_startSound1(95); } else { if (smlayer_isSoundRunning(95)) smlayer_stopSound(95); _val213d = 0; } } else { _actor[0].x = 0; _actor[0].damage++; // FIXME: apparently it is a bug in original // and damage is doubled doDamage = true; } if (_actor[0].x > 320) { _actor[0].x = 320; doDamage = true; } if (_actor[0].x < 10 || _actor[0].x > 310 || doDamage) { _tiresRustle = 1; _actor[0].x1 = -_actor[0].x1; _actor[0].damage++; // PATCH } return buttons; } int32 Insane::processBenOnRoad(bool flag) { int32 buttons; if (_actor[0].enemyHandler != -1) buttons = enemyHandler(_actor[0].enemyHandler, 0, 1, _actor[0].probability); else buttons = enemyHandler(EN_TORQUE, 0, 1, _actor[0].probability); if (flag) { _actor[0].speed = _actor[0].tilt; if (_actor[0].speed > 8) _actor[0].speed = 8; if (_actor[0].speed < -8) _actor[0].speed = -8; // FIXME: is it abs(/2) ? // mov eax, insane_actor0.speed // mov edx, eax // sar edx, 1Fh // sub eax, edx // sar eax, 1 // add eax, insane_actor0.speed // add insane_actor0.x, eax _actor[0].x += _actor[0].speed / 2 + _actor[0].speed; if (_actor[0].x < 0) _actor[0].x = 0; if (_actor[0].x > 320) _actor[0].x = 320; } return buttons; } void Insane::mineChooseRoad(int32 buttons) { int16 tmp; if (_actor[0].field_8 < 1) return; if (_actor[0].field_8 == 112) { if (_actor[0].frame < 18 || !_needSceneSwitch) return; queueSceneSwitch(18, 0, "fishgogg.san", 64, 0, 0, 0); } else if (_actor[0].field_8 == 1) { tmp = _actor[0].cursorX / 22; switch (_currSceneId) { case 17: if (buttons & 1) { if (_val123_) { setWordInString(_numberArray, 1, _val52d); smush_setToFinish(); } if (_val119_ && !_needSceneSwitch) { _iactSceneId2 = _iactSceneId; queueSceneSwitch(2, 0, "mineexit.san", 64, 0, 0, 0); } } if ((buttons & 2) == 0 || _needSceneSwitch) return; queueSceneSwitch(19, 0, "fishgog2.san", 64, 0, 0, 0); break; case 1: _actor[0].tilt = tmp; if (tmp < -7) _actor[0].tilt = -7; if (tmp > 7) _actor[0].tilt = 7; drawSpeedyActor(buttons); if ((buttons & 1) && _currSceneId == 1 && _val119_ && !_needSceneSwitch) { _iactSceneId2 = _iactSceneId; queueSceneSwitch(2, 0, "mineexit.san", 64, 0, 0, 0); } if ((buttons & 2) == 0 || !_val122_) return; _actor[0].frame = 0; _actor[0].field_8 = 112; smlayer_setActorFacing(0, 2, 26, 180); break; case 5: _actor[0].tilt = tmp; if (tmp < -7) _actor[0].tilt = -7; if (tmp > 7) _actor[0].tilt = 7; drawSpeedyActor(buttons); if ((buttons & 1) == 0) return; if (_val119_ && !_needSceneSwitch) { _iactSceneId2 = _iactSceneId; if (readArray(_numberArray, 4) && _val211d < 3) { _val211d++; queueSceneSwitch(8, 0, "fishfear.san", 64, 0, 0, 0); } else { queueSceneSwitch(8, 0, "tomine.san", 64, 0, 0, 0); } } if (_val120_) { setWordInString(_numberArray, 1, _val55d); setWordInString(_numberArray, 3, _val57d); smush_setToFinish(); } if (!_val212_) return; setWordInString(_numberArray, 1, _val56d); setWordInString(_numberArray, 3, _val57d); smush_setToFinish(); break; case 6: _actor[0].tilt = tmp; if (tmp < -7) _actor[0].tilt = -7; if (tmp > 7) _actor[0].tilt = 7; drawSpeedyActor(buttons); if ((buttons & 1) == 0) return; if (_val119_ && !_needSceneSwitch) { _iactSceneId2 = _iactSceneId; if (readArray(_numberArray, 4) && _val211d < 3) { _val211d++; queueSceneSwitch(7, 0, "fishfear.san", 64, 0, 0, 0); } else { queueSceneSwitch(7, 0, "tomine.san", 64, 0, 0, 0); } } if (_val120_) { setWordInString(_numberArray, 1, _val55d); setWordInString(_numberArray, 3, _val53d); smush_setToFinish(); } if (!_val212_) return; setWordInString(_numberArray, 1, _val56d); setWordInString(_numberArray, 3, _val53d); smush_setToFinish(); break; default: break; } } } void Insane::drawSpeedyActor(int32 buttons) { switch (_actor[0].tilt) { case -7: if (_actor[0].act[2].state != 47) { smlayer_setActorFacing(0, 2, 13, 180); _actor[0].act[2].state = 47; } break; case -6: if (_actor[0].act[2].state != 44) { smlayer_setActorFacing(0, 2, 11, 180); _actor[0].act[2].state = 44; } break; case -5: if (_actor[0].act[2].state != 43) { smlayer_setActorFacing(0, 2, 10, 180); _actor[0].act[2].state = 43; } break; case -4: if (_actor[0].act[2].state != 42) { smlayer_setActorFacing(0, 2, 9, 180); _actor[0].act[2].state = 42; } break; case -3: if (_actor[0].act[2].state != 41) { smlayer_setActorFacing(0, 2, 8, 180); _actor[0].act[2].state = 41; } break; case -2: if (_actor[0].act[2].state != 40) { smlayer_setActorFacing(0, 2, 7, 180); _actor[0].act[2].state = 40; } break; case -1: if (_actor[0].act[2].state != 39) { smlayer_setActorFacing(0, 2, 6, 180); _actor[0].act[2].state = 39; } break; case 0: if (_actor[0].act[2].state != 1) { smlayer_setActorFacing(0, 2, 22, 180); _actor[0].act[2].state = 1; } break; case 1: if (_actor[0].act[2].state != 55) { smlayer_setActorFacing(0, 2, 14, 180); _actor[0].act[2].state = 55; } break; case 2: if (_actor[0].act[2].state != 56) { smlayer_setActorFacing(0, 2, 15, 180); _actor[0].act[2].state = 56; } break; case 3: if (_actor[0].act[2].state != 57) { smlayer_setActorFacing(0, 2, 16, 180); _actor[0].act[2].state = 57; } break; case 4: if (_actor[0].act[2].state != 58) { smlayer_setActorFacing(0, 2, 17, 180); _actor[0].act[2].state = 58; } break; case 5: if (_actor[0].act[2].state != 59) { smlayer_setActorFacing(0, 2, 18, 180); _actor[0].act[2].state = 59; } break; case 6: if (_actor[0].act[2].state != 60) { smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 60; } break; case 7: if (_actor[0].act[2].state != 50) { smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 50; } break; default: break; } if (!_actor[0].act[2].room) return; smlayer_putActor(0, 2, _actor[0].x + _actor[0].x1, _actor[0].y + _actor[0].y1, _smlayer_room2); } void Insane::smush_rewindCurrentSan(int arg_0, int arg_4, int arg_8) { debug(0, "smush_rewindCurrentSan(%d, %d, %d)", arg_0, arg_4, arg_8); _smush_setupsan2 = arg_0; smush_setupSanFile(0, 8, 0); _smush_isSanFileSetup = 1; smush_setFrameSteps(arg_4, arg_8); _smush_curFrame = 0; // HACK } // Ben void Insane::actor02Reaction(int32 buttons) { int32 tmp, tmp2; switch(_actor[0].act[2].state) { case 106: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; smlayer_setActorFacing(0, 2, 29, 180); _actor[0].act[2].state = 107; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 107: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 9) { _actor[0].act[2].state = 1; _actor[0].inventory[INV_MACE] = 0; smlayer_startSound2(318); switchBenWeapon(); } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 104: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; smlayer_setActorFacing(0, 2, 28, 180); _actor[0].act[2].state = 105; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 105: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 5) { _actor[0].act[2].state = 1; _actor[0].inventory[INV_MACE] = 0; smlayer_startSound2(318); switchBenWeapon(); } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 108: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; smlayer_setActorFacing(0, 2, 28, 180); _actor[0].act[2].state = 109; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 109: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 5) { _actor[0].act[2].state = 1; _actor[0].inventory[INV_CHAIN] = 0; // Chain smlayer_startSound2(318); switchBenWeapon(); } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 73: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) { smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 74; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 74: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 2) { smlayer_setActorFacing(0, 2, 9, 180); _actor[0].act[2].state = 1; _actor[0].weaponClass = 2; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 79: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 2) { smlayer_setActorFacing(0, 2, 23, 180); _actor[0].act[2].state = 80; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 80: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 6) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 63; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 81: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) { smlayer_setActorFacing(0, 2, 23, 180); _actor[0].act[2].state = 82; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 82: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 3) { smlayer_setActorFacing(0, 2, 26, 180); _actor[0].act[2].state = 64; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 77: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 2) { smlayer_setActorFacing(0, 2, 23, 180); _actor[0].act[2].state = 78; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 78: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 5) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 65; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 83: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 0; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) { smlayer_setActorFacing(0, 2, 23, 180); _actor[0].act[2].state = 84; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 84: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 0; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 5) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 66; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 75: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 1; if (_actor[0].act[2].frame >= 4 && !_kickBenProgress) { smlayer_setActorFacing(0, 2, 23, 180); _actor[0].act[2].state = 76; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 76: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].field_44 = 0; if (_actor[0].act[2].frame >= 4) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 62; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 2: smlayer_setActorLayer(0, 2, 4); smlayer_setActorFacing(0, 2, 17, 180); _actor[0].kicking = 1; _actor[0].weaponClass = 1; _actor[0].act[2].state = 3; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(63); break; case 3: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; if (_actor[0].act[2].frame == 2) { if (_currEnemy != EN_CAVEFISH) { tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(60); if (tmp == 1000) smlayer_startSound1(62); } else { if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0)) && !_actor[0].field_54) prepareScenePropScene(scenePropIdx[1], 0, 0); } } if (_actor[0].act[2].frame >= 4) { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 4; } _actor[0].kicking = 1; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 4: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 2) { smlayer_setActorFacing(0, 2, 9, 180); _actor[0].act[2].state = 1; _actor[0].act[2].animTilt = -1000; _actor[0].weaponClass = 2; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 5: smlayer_setActorLayer(0, 2, 5); break; case 10: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 11; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(75); break; case 11: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 2) { if (_currEnemy == EN_VULTM2) { if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0)) && calcBenDamage(0, 0)) { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 97; _actor[0].act[2].room = 0; _actor[0].act[1].room = 0; _actor[0].act[0].room = 0; smlayer_setActorLayer(0, 2, 25); smlayer_setActorCostume(1, 2, readArray(_numberArray, 45)); smlayer_setActorFacing(1, 2, 6, 180); smlayer_startSound1(101); _actor[1].act[2].state = 97; _actor[1].lost = 1; _actor[1].act[2].room = 1; _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; } else { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 12; } } else { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 12; } } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 97: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 5) { _actor[0].act[2].room = 1; _actor[0].act[1].room = 1; _actor[0].act[0].room = 1; smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 13; _actor[0].x = _actor[1].x - 116; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 12: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { if (_currEnemy != EN_CAVEFISH) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_DUST: tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(73); if (tmp == 1000) smlayer_startSound1(74); break; case INV_WRENCH: case INV_BOOT: case INV_HAND: if(calcBenDamage(1, 0) == 1) smlayer_startSound1(73); break; } } else { if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0)) && !_actor[0].field_54) prepareScenePropScene(scenePropIdx[1], 0, 0); } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 13; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 13: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 3) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 63; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 6: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 2; _actor[0].field_34 = 1; _actor[0].kicking = 0; smlayer_setActorCostume(0, 2, readArray(_numberArray, 22)); smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 7; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(66); break; case 7: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 2; _actor[0].field_34 = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 1) { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 8; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 8: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 2; _actor[0].field_34 = 1; _actor[0].kicking = 0; if ((_actor[0].act[2].frame == 3) && (calcBenDamage(0, 0) == 1)) { _actor[1].damage = weaponDamage(0); smlayer_startSound1(64); _actor[1].cursorX = 320; } if (_actor[0].act[2].frame >= 5) { smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 9; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 9: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 2; _actor[0].field_34 = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 3) { smlayer_setActorCostume(0, 2, readArray(_numberArray, 12)); _actor[0].field_34 = 2; _actor[0].act[2].state = 1; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 14: smlayer_setActorLayer(0, 2, 8); _actor[0].weaponClass = 1; _actor[0].kicking = 1; smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 15; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(78); break; case 15: smlayer_setActorLayer(0, 2, 8); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 2) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: if (weaponBenIsEffective()) { smlayer_setActorFacing(0, 2, 22, 180); _actor[0].act[2].state = 81; } else { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 16; } break; case INV_MACE: if (!_actor[1].kicking || _actor[1].field_44) if (actor1StateFlags(_actor[1].act[2].state)) { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 106; break; } default: smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 16; break; } } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 16: smlayer_setActorLayer(0, 2, 8); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(76); if (tmp == 1000) smlayer_startSound1(77); break; case INV_BOOT: calcBenDamage(0, 1); break; case INV_DUST: if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0))) { smlayer_startSound1(76); _actor[1].damage = weaponDamage(0); } break; default: if (calcBenDamage(1, 0)) smlayer_startSound1(76); break; } smlayer_setActorFacing(0, 2, 21,180); _actor[0].act[2].state = 17; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 17: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 2) { smlayer_setActorFacing(0, 2, 26, 180); _actor[0].act[2].state = 64; smlayer_stopSound(76); } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 18: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 19; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(69); break; case 19: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { switch (_actor[1].weapon) { case INV_CHAIN: if (_actor[1].kicking) { _actor[1].act[2].state = 108; _actor[0].act[2].state = 110; } else { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 20; } break; case INV_CHAINSAW: if (_actor[1].kicking || _actor[1].field_44) _actor[0].act[2].state = 106; else { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 20; } break; case INV_MACE: case INV_2X4: if (weaponBenIsEffective()) { smlayer_setActorFacing(0, 2, 22, 180); _actor[0].act[2].state = 77; break; } default: smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 19; break; } smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 20; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 20: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { if (_currEnemy != EN_CAVEFISH) { switch (_actor[1].weapon) { case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(67); if (tmp == 1000) smlayer_startSound1(68); break; default: smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 19; break; } } else { if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0)) && !_actor[0].field_54) prepareScenePropScene(scenePropIdx[1], 0, 0); } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 21; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 21: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 6) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 65; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 110: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 0; smlayer_setActorFacing(0, 2, 30, 180); _actor[0].act[2].state = 111; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 111: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 7) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 65; _actor[0].inventory[INV_CHAIN] = 1; // Chain } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 22: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 0; _actor[0].kicking = 1; smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 23; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(81); break; case 23: smlayer_setActorLayer(0, 2, 6); _actor[0].weaponClass = 0; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 4) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: case INV_DUST: if (weaponBenIsEffective()) { smlayer_setActorFacing(0, 2, 22, 180); _actor[0].act[2].state = 83; } break; default: smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 24; break; } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 21; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 24: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 0; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: case INV_DUST: tmp = calcBenDamage(1, 1); if (tmp == 1) { if (_currEnemy == EN_CAVEFISH) { _actor[1].lost = 1; _actor[1].act[2].state = 102; _actor[1].damage = _actor[1].maxdamage + 10; } smlayer_startSound1(79); } if (tmp == 1000) smlayer_startSound1(80); break; default: if (!calcBenDamage(1, 0)) smlayer_startSound1(79); break; } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 25; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 25: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 0; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 6) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 66; _actor[0].weaponClass = 1; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 26: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; smlayer_setActorFacing(0, 2, 19, 180); _actor[0].act[2].state = 27; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(72); break; case 27: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 1) { switch (_actor[1].weapon) { case INV_HAND: smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 28; break; case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: case INV_DUST: if (weaponBenIsEffective()) { smlayer_setActorFacing(0, 2, 22, 180); _actor[0].act[2].state = 75; break; } default: smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 28; break; } } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 28: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; _actor[0].kicking = 1; if (_actor[0].act[2].frame >= 3) { if (_currEnemy != EN_CAVEFISH) { switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: case INV_DUST: tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(70); if (tmp == 1000) smlayer_startSound1(71); break; case 6: if (!calcBenDamage(0, 1)) smlayer_startSound1(70); break; default: break; } } else { if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) && (_actor[1].x - _actor[0].x >= weaponMinRange(0)) && !_actor[0].field_54) prepareScenePropScene(scenePropIdx[1], 0, 0); } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 29; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 29: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 6) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].state = 62; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 30: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; smlayer_setActorCostume(0, 2, readArray(_numberArray, 21)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].act[2].state = 31; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); smlayer_startSound1(84); break; case 31: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; if (_actor[0].act[2].frame >= 6) { smlayer_setActorFacing(0, 2, 20, 180); _actor[0].act[2].state = 32; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 32: smlayer_setActorLayer(0, 2, 4); _actor[0].weaponClass = 1; if (_actor[0].act[2].frame >= 5) { switch (_currEnemy) { case EN_ROTT3: if (calcBenDamage(0, 0)) _actor[1].act[2].state = 115; break; case EN_VULTF2: if (calcBenDamage(0, 0)) _actor[1].act[2].state = 113; break; default: tmp = calcBenDamage(1, 1); if (tmp == 1) smlayer_startSound1(82); if (tmp == 1000) smlayer_startSound1(83); break; } smlayer_setActorFacing(0, 2, 21, 180); _actor[0].act[2].state = 33; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 33: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 1; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 5) { smlayer_setActorCostume(0, 2, readArray(_numberArray, 12)); _actor[0].act[2].state = 1; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 36: smlayer_setActorLayer(0, 2, 5); _actor[0].kicking = 0; smlayer_setActorCostume(0, 2, readArray(_numberArray, 18)); smlayer_setActorFacing(0, 2, 6, 180); smlayer_startSound1(96); switch (_currEnemy) { case EN_ROTT1: prepareScenePropScene(scenePropIdx[33], 0, 0); break; case EN_ROTT2: tmp = rand() % 5; if (!tmp) prepareScenePropScene(scenePropIdx[35], 0, 0); if (tmp == 3) prepareScenePropScene(scenePropIdx[36], 0, 0); break; case EN_VULTF1: prepareScenePropScene(scenePropIdx[6], 0, 0); break; case EN_VULTM1: tmp = rand() % 5; if (!tmp) prepareScenePropScene(scenePropIdx[40], 0, 0); if (tmp == 3) prepareScenePropScene(scenePropIdx[41], 0, 0); break; default: break; } _actor[0].act[2].state = 37; break; case 37: smlayer_setActorLayer(0, 2, 25); _actor[0].cursorX = 0; _actor[0].kicking = 0; if (_actor[0].act[2].frame >= 18 || (_actor[0].x < 50 && _actor[0].act[2].frame >= 10) || (_actor[0].x > 270 && _actor[0].act[2].frame >= 10)) { if (_currSceneId == 21) { queueSceneSwitch(23, 0, "benflip.san", 64, 0, 0, 0); } else { switch (_currEnemy) { case EN_ROTT1: case EN_ROTT2: case EN_ROTT3: queueSceneSwitch(9, 0, "wr2_benr.san", 64, 0, 0, 0); break; case EN_VULTF1: case EN_VULTM1: case EN_VULTF2: case EN_VULTM2: queueSceneSwitch(9, 0, "wr2_benv.san", 64, 0, 0, 0); break; case EN_CAVEFISH: queueSceneSwitch(9, 0, "wr2_benc.san", 64, 0, 0, 0); break; default: queueSceneSwitch(9, 0, "wr2_ben.san", 64, 0, 0, 0); break; } } _actor[0].act[2].state = 38; } break; case 38: if (_actor[0].act[2].frame >= 36) { _actor[0].act[2].frame = 0; if (_currSceneId == 21) { queueSceneSwitch(23, 0, "benflip.san", 64, 0, 0, 0); } else { switch (_currEnemy) { case EN_ROTT1: case EN_ROTT2: case EN_ROTT3: queueSceneSwitch(9, 0, "wr2_benr.san", 64, 0, 0, 0); break; case EN_VULTF1: case EN_VULTM1: case EN_VULTF2: case EN_VULTM2: queueSceneSwitch(9, 0, "wr2_benv.san", 64, 0, 0, 0); break; case EN_CAVEFISH: queueSceneSwitch(9, 0, "wr2_benc.san", 64, 0, 0, 0); break; default: queueSceneSwitch(9, 0, "wr2_ben.san", 64, 0, 0, 0); break; } } _actor[0].act[2].state = 38; } break; case 34: smlayer_setActorLayer(0, 2, 5); _actor[0].kicking = 0; if (!smlayer_actorNeedRedraw(0, 2)) { setBenState(); _actor[0].act[2].tilt = 0; // for some reason there is no break at this // place, so tilt gets overriden on next line } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 35: smlayer_setActorLayer(0, 2, 5); _actor[0].kicking = 0; if (!smlayer_actorNeedRedraw(0, 2)) { switchBenWeapon(); _actor[0].act[2].tilt = 0; } _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 63: smlayer_setActorLayer(0, 2, 5); if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].animTilt = 0; } _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 64: smlayer_setActorLayer(0, 2, 5); if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 26, 180); _actor[0].act[2].animTilt = 0; } _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 65: smlayer_setActorLayer(0, 2, 5); if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].animTilt = 0; } _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 66: smlayer_setActorLayer(0, 2, 5); if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].animTilt = 0; } _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 62: smlayer_setActorLayer(0, 2, 5); if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 25, 180); _actor[0].act[2].animTilt = 0; } _actor[0].weaponClass = 1; _actor[0].kicking = 0; _actor[0].act[2].tilt = calcTilt(_actor[0].tilt); break; case 1: smlayer_setActorLayer(0, 2, 5); _actor[0].weaponClass = 2; _actor[0].kicking = 0; switch (_actor[0].tilt) { case -3: if (_actor[0].act[2].animTilt != -3) { smlayer_setActorFacing(0, 2, 6, 180); _actor[0].act[2].animTilt = -3; } break; case -2: if (_actor[0].field_8 == 48) smlayer_setActorFacing(0, 2, 7, 180); _actor[0].act[2].animTilt = -2; break; case -1: if (_actor[0].field_8 == 46) smlayer_setActorFacing(0, 2, 8, 180); _actor[0].act[2].animTilt = -1; break; case 0: if (_actor[0].act[2].animTilt) { smlayer_setActorFacing(0, 2, 9, 180); _actor[0].act[2].animTilt = 0; } break; case 1: if (_actor[0].field_8 == 49) smlayer_setActorFacing(0, 2, 10, 180); _actor[0].act[2].animTilt = 1; break; case 2: if (_actor[0].field_8 == 51) smlayer_setActorFacing(0, 2, 11, 180); _actor[0].act[2].animTilt = 2; break; case 3: if (_actor[0].act[2].animTilt != 3) { smlayer_setActorFacing(0, 2, 12, 180); _actor[0].act[2].animTilt = 3; } break; default: break; } _actor[0].act[2].tilt = 0; break; default: break; } tmp = _actor[0].x + _actor[0].act[2].tilt + 17 + _actor[0].x1; tmp2 = _actor[0].y + _actor[0].y1 - 98; if (_actor[0].act[2].room) smlayer_putActor(0, 2, tmp, tmp2, _smlayer_room2); else smlayer_putActor(0, 2, tmp, tmp2, _smlayer_room); } // Bike void Insane::actor00Reaction(int32 buttons) { int32 tmpx, tmpy; switch (_actor[0].tilt) { case -3: if (_actor[0].act[0].state != 41) { smlayer_setActorFacing(0, 0, 6, 180); _actor[0].act[0].state = 41; } break; case -2: if (_actor[0].act[0].state != 40) { smlayer_setActorFacing(0, 0, 7, 180); _actor[0].act[0].state = 40; } break; case -1: if (_actor[0].act[0].state != 39) { smlayer_setActorFacing(0, 0, 8, 180); _actor[0].act[0].state = 39; } break; case 0: if (_actor[0].act[0].state != 1) { smlayer_setActorFacing(0, 0, 9, 180); _actor[0].act[0].state = 1; } break; case 1: if (_actor[0].act[0].state != 55) { smlayer_setActorFacing(0, 0, 10, 180); _actor[0].act[0].state = 55; } break; case 2: if (_actor[0].act[0].state != 56) { smlayer_setActorFacing(0, 0, 11, 180); _actor[0].act[0].state = 56; } break; case 3: if (_actor[0].act[0].state != 57) { smlayer_setActorFacing(0, 0, 12, 180); _actor[0].act[0].state = 57; } break; default: break; } tmpx = _actor[0].x + _actor[0].x1; tmpy = _actor[0].y + _actor[0].y1; if (_actor[0].act[0].room) smlayer_putActor(0, 0, tmpx, tmpy, _smlayer_room2); else smlayer_putActor(0, 0, tmpx, tmpy, _smlayer_room); } // Bike top void Insane::actor01Reaction(int32 buttons) { int32 tmpx, tmpy; chooseBenWeaponAnim(buttons); switch (_actor[0].tilt) { case -3: if (_actor[0].act[1].state != 41 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 6); _actor[0].act[1].state = 41; } if (_actor[0].cursorX >= -100) { setBenAnimation(0, 7); _actor[0].act[1].state = 40; _actor[0].field_8 = 48; _actor[0].tilt = -2; } break; case -2: if (_actor[0].act[1].state != 40 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 7); _actor[0].act[1].state = 40; } if (_actor[0].field_8 == 48) _actor[0].tilt = -1; else _actor[0].tilt = -3; break; case -1: if (_actor[0].act[1].state != 39 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 8); _actor[0].act[1].state = 39; } if (_actor[0].field_8 == 48) _actor[0].tilt = 0; else _actor[0].tilt = -2; break; case 0: if (_actor[0].act[1].state != 1 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 9); _actor[0].act[1].state = 1; } _actor[0].field_8 = 1; if (_actor[0].cursorX < -100) { setBenAnimation(0, 8); _actor[0].act[1].state = 39; _actor[0].field_8 = 46; _actor[0].tilt = -1; } else { if (_actor[0].cursorX > 100) { setBenAnimation(0, 10); _actor[0].act[1].state = 55; _actor[0].field_8 = 49; _actor[0].tilt = 1; } } break; case 1: if (_actor[0].act[1].state != 55 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 10); _actor[0].act[1].state = 55; } if (_actor[0].field_8 == 51) _actor[0].tilt = 0; else _actor[0].tilt = 2; break; case 2: if (_actor[0].act[1].state != 56 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 11); _actor[0].act[1].state = 56; } if (_actor[0].field_8 == 51) _actor[0].tilt = 1; else _actor[0].tilt = 3; break; case 3: if (_actor[0].act[1].state != 57 || _actor[0].weaponClass != _actor[0].animWeaponClass) { setBenAnimation(0, 12); _actor[0].act[1].state = 57; } if (_actor[0].cursorX <= 100) { setBenAnimation(0, 11); _actor[0].act[1].state = 56; _actor[0].field_8 = 51; _actor[0].tilt = 2; } break; } if (_actor[0].field_38 != _actor[0].field_34) { if (_actor[0].field_34 == 2) smlayer_setActorFacing(0, 1, 28, 180); else smlayer_setActorFacing(0, 1, 27, 180); } tmpx = _actor[0].x + _actor[0].x1; tmpy = _actor[0].y + _actor[0].y1; if (_actor[0].act[1].room) smlayer_putActor(0, 1, tmpx, tmpy, _smlayer_room2); else smlayer_putActor(0, 1, tmpx, tmpy, _smlayer_room); _actor[0].animWeaponClass = _actor[0].weaponClass; _actor[0].field_38 = _actor[0].field_34; } void Insane::actor03Reaction(int32 buttons) { int32 tmp; switch (_actor[0].act[3].state) { case 117: reinitActors(); smlayer_setActorFacing(0, 3, 13, 180); _actor[0].act[3].state = 69; break; case 69: if (_actor[0].act[3].frame >= 2) _actor[0].act[3].state = 70; break; case 70: if (_actor[0].scenePropSubIdx) { smlayer_setActorFacing(0, 3, 4, 180); tmp = _currScenePropIdx + _actor[0].scenePropSubIdx; if (!smlayer_startSound2(_sceneProp[tmp].sound)) _actor[0].runningSound = 0; else _actor[0].runningSound = _sceneProp[tmp].sound; _actor[0].act[3].state = 72; } else { _actor[0].act[3].state = 118; } break; case 72: if (_actor[0].runningSound) { if (!smlayer_isSoundRunning(_actor[0].runningSound)) { smlayer_setActorFacing(0, 3, 5, 180); _actor[0].act[3].state = 70; _actor[0].scenePropSubIdx = 0; } } else { tmp = _currScenePropIdx + _actor[0].scenePropSubIdx; if (_sceneProp[tmp].counter >= _sceneProp[tmp].maxCounter) { smlayer_setActorFacing(0, 3, 5, 180); _actor[0].act[3].state = 70; _actor[0].scenePropSubIdx = 0; _actor[0].runningSound = 0; } } break; case 118: smlayer_setActorFacing(0, 3, 14, 180); _actor[0].act[3].state = 71; break; case 71: _actor[0].field_54 = 0; if (_actor[0].act[3].frame >= 2) _actor[0].act[3].state = 1; break; case 52: if (_actor[0].runningSound) smlayer_stopSound(_actor[0].runningSound); if (_currScenePropIdx) shutCurrentScene(); _actor[0].runningSound = 0; _actor[0].defunct = 0; _actor[0].field_54 = 0; smlayer_setActorFacing(0, 3, 15, 180); _actor[0].act[3].state = 53; break; case 53: if (_actor[0].act[3].frame >= 2) { smlayer_setActorFacing(0, 3, 16, 180); _actor[0].act[3].state = 54; } break; case 54: break; case 1: _actor[0].field_54 = 0; break; default: break; } } void Insane::chooseBenWeaponAnim(int buttons) { // kick if ((buttons & 1) && (_currEnemy != EN_TORQUE)) { if (!_kickBenProgress && actor0StateFlags2(_actor[0].act[2].state + _actor[0].weapon * 238)) { switch (_actor[0].weapon) { case INV_CHAIN: _actor[0].act[2].state = 10; break; case INV_CHAINSAW: _actor[0].act[2].state = 14; break; case INV_MACE: _actor[0].act[2].state = 18; break; case INV_2X4: _actor[0].act[2].state = 22; break; case INV_WRENCH: _actor[0].act[2].state = 26; break; case INV_BOOT: _actor[0].act[2].state = 6; break; case INV_HAND: _actor[0].act[2].state = 2; break; case INV_DUST: _actor[0].act[2].state = 30; break; default: break; } _actor[0].kicking = 1; _kickBenProgress = true; } } else { _kickBenProgress = false; } // switch weapon if ((buttons & 2) && (_currEnemy != EN_TORQUE)) { if (_weaponBenJustSwitched) return; if (!actor0StateFlags1(_actor[0].act[2].state)) return; switch (_actor[0].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_WRENCH: _actor[0].act[2].state = 35; smlayer_setActorFacing(0, 2, 24, 180); break; case INV_BOOT: case INV_HAND: case INV_DUST: _actor[0].act[2].state = 0; switchBenWeapon(); } _weaponBenJustSwitched = true; } else { _weaponBenJustSwitched = false; } } void Insane::setBenAnimation(int32 actornum, int anim) { if (anim <= 12) smlayer_setActorFacing(actornum, 1, actorAnimationData[_actor[actornum].weaponClass * 7 + anim - 6], 180); } void Insane::switchBenWeapon(void) { do { _actor[0].weapon++; if (_actor[0].weapon > 7) _actor[0].weapon = INV_CHAIN; } while (!_actor[0].inventory[_actor[0].weapon]); switch (_actor[0].weapon) { case INV_CHAIN: smlayer_setActorCostume(0, 2, readArray(_numberArray, 20)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].weaponClass = 0; _actor[0].act[2].state = 34; break; case INV_CHAINSAW: smlayer_setActorCostume(0, 2, readArray(_numberArray, 24)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].weaponClass = 0; _actor[0].act[2].state = 34; break; case INV_MACE: smlayer_setActorCostume(0, 2, readArray(_numberArray, 23)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].weaponClass = 0; _actor[0].act[2].state = 34; break; case INV_2X4: if (_currEnemy == EN_CAVEFISH) smlayer_setActorCostume(0, 2, readArray(_numberArray, 38)); else smlayer_setActorCostume(0, 2, readArray(_numberArray, 19)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].weaponClass = 0; _actor[0].act[2].state = 34; break; case INV_WRENCH: smlayer_setActorCostume(0, 2, readArray(_numberArray, 25)); smlayer_setActorFacing(0, 2, 18, 180); _actor[0].weaponClass = 0; _actor[0].act[2].state = 34; break; case INV_BOOT: case INV_HAND: case INV_DUST: smlayer_setActorCostume(0, 2, readArray(_numberArray, 12)); _actor[0].weaponClass = 2; _actor[0].act[2].state = 1; break; default: break; } } int32 Insane::weaponMaxRange(int32 actornum) { static int map[8] = {135, 125, 130, 125, 120, 104, 104, 104}; if (_actor[actornum].weapon == -1) return 104; return map[_actor[actornum].weapon]; } int32 Insane::weaponMinRange(int32 actornum) { static int map[8] = {80, 40, 80, 40, 80, 80, 40, 50}; if (_actor[actornum].weapon == -1) return 40; return map[_actor[actornum].weapon]; } int32 Insane::weaponDamage(int32 actornum) { static int map[8] = {20, 300, 25, 40, 15, 10, 10, 5}; if (_actor[actornum].weapon == -1) return 10; return map[_actor[actornum].weapon]; } bool Insane::weaponBenIsEffective(void) { if ((_actor[1].x - _actor[0].x > weaponMaxRange(0)) || (_actor[1].x - _actor[0].x < weaponMinRange(0)) || !_actor[1].kicking) return false; return true; } void Insane::prepareScenePropScene(int32 scenePropNum, bool arg_4, bool arg_8) { int tmp; if (!loadScenePropSounds(scenePropNum)) return; _actor[0].defunct = arg_4; _actor[1].defunct = arg_8; _currScenePropIdx = scenePropNum; _sceneProp[scenePropNum + 1].counter = 0; _currScenePropSubIdx = 1; if (_sceneProp[scenePropNum + 1].trsId) _currTrsMsg = handleTrsTag(_trsFilePtr, _sceneProp[scenePropNum + 1].trsId); else _currTrsMsg = 0; tmp = _sceneProp[scenePropNum + 1].actor; if (tmp != -1) { _actor[tmp].field_54 = 1; _actor[tmp].act[3].state = 117; _actor[tmp].scenePropSubIdx = _currScenePropSubIdx; } } int32 Insane::calcBenDamage(bool arg_0, bool arg_4) { if ((_actor[1].x - _actor[0].x > weaponMaxRange(0)) || (_actor[1].x - _actor[0].x < weaponMinRange(0))) return 0; if (_actor[1].field_44 && arg_4) return 1000; if (!actor1StateFlags(_actor[1].act[2].state)) return 0; if (arg_0) { ouchSoundEnemy(); _actor[1].damage += weaponDamage(0); } return 1; } void Insane::ouchSoundEnemy(void) { int32 tmp; _actor[1].act[3].state = 52; switch (_currEnemy) { case EN_VULTF1: if (_actor[0].weapon == INV_DUST) { smlayer_startSound2(287); } else { if (rand() % 2) { smlayer_startSound2(279); } else { smlayer_startSound2(280); } } break; case EN_VULTF2: smlayer_startSound2(271); break; case EN_VULTM1: smlayer_startSound2(162); break; case EN_ROTT1: tmp = rand() % 3; if (!tmp) { smlayer_startSound2(216); } else if (tmp == 1) { smlayer_startSound2(217); } else { smlayer_startSound2(218); } break; case EN_ROTT2: tmp = rand() % 3; if (!tmp) { smlayer_startSound2(243); } else if (tmp == 1) { smlayer_startSound2(244); } else { smlayer_startSound2(245); } break; case EN_VULTM2: smlayer_startSound2(180); break; default: smlayer_startSound2(99); break; } } bool Insane::loadScenePropSounds(int32 scenePropNum) { int32 num = 0; int32 res = 1; if (_sceneProp[scenePropNum + num].index != 1) { while (num < 12) { res &= smlayer_loadSound(_sceneProp[scenePropNum + num].sound, 0, 2); num = _sceneProp[scenePropNum + num].index; if (!num) break; } } return res != 0; } int32 Insane::setBenState(void) { _actor[0].act[2].animTilt = -1000; switch (_actor[0].weapon) { case INV_CHAIN: _actor[0].weaponClass = 1; _actor[0].act[2].state = 63; break; case INV_CHAINSAW: _actor[0].weaponClass = 1; _actor[0].act[2].state = 64; break; case INV_MACE: _actor[0].weaponClass = 1; _actor[0].act[2].state = 65; break; case INV_2X4: _actor[0].weaponClass = 1; _actor[0].act[2].state = 66; break; case INV_WRENCH: _actor[0].weaponClass = 1; _actor[0].act[2].state = 62; break; case INV_BOOT: case INV_HAND: case INV_DUST: _actor[0].weaponClass = 2; _actor[0].act[2].state = 1; break; default: break; } return _actor[0].act[2].state; } void Insane::reinitActors(void) { smlayer_setActorCostume(0, 2, readArray(_numberArray, 12)); smlayer_setActorCostume(0, 0, readArray(_numberArray, 14)); smlayer_setActorCostume(0, 1, readArray(_numberArray, 13)); smlayer_setActorLayer(0, 1, 1); smlayer_setActorLayer(0, 2, 5); smlayer_setActorLayer(0, 0, 10); _actor[0].weapon = INV_HAND; _actor[0].weaponClass = 2; _actor[0].animWeaponClass = 0; _actor[0].field_34 = 2; _actor[0].field_38 = 0; _actor[0].tilt = 0; _actor[0].field_8 = 1; _actor[0].act[2].state = 1; _actor[0].act[2].animTilt = 1; _actor[0].act[0].state = 0; _actor[0].act[1].state = 1; _actor[0].act[2].room = 1; _actor[0].act[1].room = 1; _actor[0].act[0].room = 1; _actor[0].cursorX = 0; } int Insane::calcTilt(int speed) { const int tilt[7] = {-5, -4, -2, 0, 2, 4, 5}; if (speed + 3 > 6) return 0; return tilt[speed + 3]; } bool Insane::actor1StateFlags(int state) { // This is compressed table. It contains indexes where state // changes. I.e. 0-33: true, 34-38: false 39-72: true, etc. const int spans[] = {0, 34, 39, 73, 89, 90, 92, 93, 99, 100, 117}; bool retvalue = 0; unsigned int i; for (i = 0; i < sizeof(spans); i++) { retvalue = !retvalue; if (spans[i] <= state) break; } return retvalue; } void Insane::escapeKeyHandler(void) { struct fluConf *flu; //if (!_ptrMainLoop) { } // We don't need it // Demo has different insane, so disable it now if (!_insaneIsRunning || _scumm->_features & GF_DEMO) { smush_setToFinish(); return; } if (_needSceneSwitch || _keyboardDisable) return; debug(0, "scene: %d", _currSceneId); switch (_currSceneId) { case 1: queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); setWordInString(_numberArray, 9, 0); break; case 18: queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); setWordInString(_numberArray, 9, 1); break; case 2: flu = &_fluConf[14 + _iactSceneId2]; queueSceneSwitch(flu->sceneId, *flu->fluPtr, flu->filenamePtr, 64, 0, flu->startFrame, flu->numFrames); break; case 3: queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); break; case 4: if (_needSceneSwitch) return; if (readArray(_numberArray, 6)) { if (readArray(_numberArray, 4)) { queueSceneSwitch(14, 0, "hitdust2.san", 64, 0, 0, 0); } else { queueSceneSwitch(14, 0, "hitdust4.san", 64, 0, 0, 0); } } else { if (readArray(_numberArray, 4)) { queueSceneSwitch(14, 0, "hitdust1.san", 64, 0, 0, 0); } else { queueSceneSwitch(14, 0, "hitdust3.san", 64, 0, 0, 0); } } break; case 5: if (readArray(_numberArray, 4)) { if (_needSceneSwitch) return; queueSceneSwitch(15, 0, "vistthru.san", 64, 0, 0, 0); } else { setWordInString(_numberArray, 1, _val53d); smush_setToFinish(); } break; case 6: if (readArray(_numberArray, 4)) { if (_needSceneSwitch) return; queueSceneSwitch(15, 0, "chasthru.san", 64, 0, 0, 0); } else { if (readArray(_numberArray, 5)) { setWordInString(_numberArray, 1, _val57d); smush_setToFinish(); } else { setWordInString(_numberArray, 4, 1); queueSceneSwitch(15, 0, "chasout.san", 64, 0, 0, 0); } } break; case 8: flu = &_fluConf[7 + _iactSceneId2]; queueSceneSwitch(flu->sceneId, *flu->fluPtr, flu->filenamePtr, 64, 0, flu->startFrame, flu->numFrames); break; case 7: flu = &_fluConf[0 + _iactSceneId2]; queueSceneSwitch(flu->sceneId, *flu->fluPtr, flu->filenamePtr, 64, 0, flu->startFrame, flu->numFrames); break; case 23: _actor[0].damage = 0; queueSceneSwitch(21, 0, "rottfite.san", 64, 0, 0, 0); break; case 9: _actor[0].damage = 0; queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); break; case 10: _actor[0].damage = 0; queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); break; case 13: queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame, 1300); break; case 24: queueSceneSwitch(21, 0, "rottfite.san", 64, 0, 0, 0); break; case 16: setWordInString(_numberArray, 4, 0); setWordInString(_numberArray, 5, 1); setWordInString(_numberArray, 1, _val56d); setWordInString(_numberArray, 3, _val55d); smush_setToFinish(); break; case 15: switch (_tempSceneId) { case 5: queueSceneSwitch(6, 0, "toranch.san", 64, 0, 0, 530); break; case 6: queueSceneSwitch(4, 0, "tovista1.san", 64, 0, 0, 230); break; default: break; } break; default: break; } } bool Insane::actor0StateFlags1(int state) { const int spans[] = {0, 2, 34, 35, 39, 69, 98, 100, 117}; bool retvalue = 0; unsigned int i; for (i = 0; i < sizeof(spans); i++) { retvalue = !retvalue; if (spans[i] <= state) break; } return retvalue; } bool Insane::actor0StateFlags2(int state) { const int spans[] = {0, 10, 14, 34, 39, 73, 75, 79, 81, 90, 93, 94, 98, 100, 117, 133, 136, 153, 158, 200, 202, 209, 212, 213, 217, 219, 236, 256, 259, 272, 277, 311, 312, 315, 317, 328, 331, 332, 336, 338, 355, 379, 382, 391, 396, 440, 441, 447, 450, 451, 455, 457, 474, 502, 505, 510, 515, 549, 553, 566, 569, 570, 574, 576, 593, 601, 604, 629, 634, 680, 682, 685, 688, 689, 693, 695, 712, 716, 718, 748, 753, 787, 788, 804, 807, 808, 812, 814, 831, 863, 866, 867, 872, 920, 922, 923, 926, 927, 931, 933, 950}; bool retvalue = 0; unsigned int i; for (i = 0; i < sizeof(spans); i++) { retvalue = !retvalue; if (spans[i] <= state) break; } return retvalue; } // smlayer_loadSound1 && smlayer_loadSound2 int Insane::smlayer_loadSound(int id, int flag, int phase) { int resid; if (phase == 1) { if (_idx2Exceeded != 0) if (_objArray2Idx >= _objArray2Idx2) return 0; } resid = readArray(_numberArray, id); if (!resid && phase == 2) return 0; if (phase == 2) _scumm->ensureResourceLoaded(rtSound, resid); _scumm->setResourceCounter(rtSound, resid, 1); if (phase == 1) { _objArray2Idx2++; _objArray2[_objArray2Idx2] = id; if (_objArray2Idx2 >= 100) { _idx2Exceeded = 1; _objArray2Idx2 = 0; } } return resid; } void Insane::IMUSE_shutVolume(void) { debug(0, "***************************************************"); _scumm->_imuse->pause(true); } void Insane::IMUSE_restoreVolume(void) { debug(0, "***************************************************"); _scumm->_imuse->pause(false); } // smlayer_loadCostume1 && smlayer_loadCostume2 int Insane::smlayer_loadCostume(int id, int phase) { int resid; resid = readArray(_numberArray, id); if (!resid) return 0; _scumm->ensureResourceLoaded(rtCostume, resid); _scumm->setResourceCounter(rtCostume, resid, 1); // smlayer_lock(rtCostume, resid); // FIXME if (phase == 1) { _objArray1Idx2++; _objArray1[_objArray1Idx2] = id; if (_objArray1Idx2 == 100) _objArray1Idx2 = 0; } return resid; } void Insane::smlayer_setActorCostume(int actornum, int actnum, int costume) { Actor *a = _scumm->derefActor(_actor[actornum].act[actnum].actor, "smlayer_setActorCostume"); a->setActorCostume(costume); a->setDirection(180); a->startAnimActor(1); _actor[actornum].act[actnum].frame = 0; } void Insane::smlayer_putActor(int actornum, int actnum, int x, int y, byte room) { Actor *a = _scumm->derefActor(_actor[actornum].act[actnum].actor, "smlayer_putActor"); a->putActor(x, y, room); } void Insane::smlayer_setActorLayer(int actornum, int actnum, int layer) { Actor *a = _scumm->derefActor(_actor[actornum].act[actnum].actor, "smlayer_setActorLayer"); a->layer = layer; } void Insane::smlayer_setFluPalette(byte *pal, int shut_flag) { // FIXME. We can't run it without SmushPlayer object // if (shut_flag) // // FIXME: shut colors and make picture appear smoothly // SmushPlayer::setPalette(pal); // else _player->setPalette(pal); } bool Insane::smlayer_isSoundRunning(int32 sound) { return _scumm->_sound->isSoundRunning(readArray(_numberArray, sound)) != 0; } bool Insane::smlayer_startSound1(int32 sound) { // FIXME: original startSound parameters: // startSound(id, 40, 1); // second param is priority in imuse, // third param set sound to group volume in imuse // (0 - master, 1-sfx, 2-voice, 3 - music, // 4 - background music) // there are no equivalents in scummvm if (smlayer_loadSound(sound, 0, 2)) { _scumm->_sound->playSound(readArray(_numberArray, sound)); return true; } else return false; } bool Insane::smlayer_startSound2(int32 sound) { // FIXME: original startSound parameters: // startSound(id, 126, 2); // second param is priority in imuse, // third param set sound to group volume in imuse // (0 - master, 1-sfx, 2-voice, 3 - music, // 4 - background music) // there are no equivalents in scummvm if (smlayer_loadSound(sound, 0, 2)) { _scumm->_sound->playSound(readArray(_numberArray, sound)); return true; } else return false; } void Insane::smlayer_soundSetPan(int32 soundid, int32 pan) { _scumm->_imuseDigital->parseScriptCmds(12, soundid, 0x700, pan, 0, 0, 0, 0); } void Insane::smlayer_soundSetPriority(int32 sound, int32 priority) { } void Insane::smlayer_drawSomething(byte *renderBitmap, int32 codecparam, int32 x, int32 y, int32 arg_10, NutRenderer *nutfile, int32 c, int32 arg_1C, int32 arg_20) { nutfile->drawFrame(renderBitmap, c, x, y); } void Insane::smlayer_overrideDrawActorAt(byte *arg_0, byte arg_4, byte arg_8) { // FIXME: doublecheck // noop in current implementation } void Insane::smlayer_showStatusMsg(int32 arg_0, byte *renderBitmap, int32 codecparam, int32 x, int32 y, int32 arg_14, int32 arg_18, int32 arg_1C, const char *formatString, char *str) { // FIXME: implement // SmushPlayer::handleTextResource does the thing warning("stub Insane::smlayer_showStatusMsg(...)"); } void Insane::turnEnemy(bool battle) { int buttons; if (_actor[1].damage < _actor[1].maxdamage) { _actor[1].lost = 0; } else { if (!_actor[1].lost && !_actor[1].lost) { _actor[1].lost = 1; _actor[1].act[2].state = 36; _actor[1].act[1].state = 36; _actor[1].act[0].state = 36; _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; } } buttons = 0; if (_actor[1].lost == 0) if (battle) buttons = actionEnemy(); debug(1, "11:%d 12:%d 13:%d 10:%d", _actor[1].act[1].state, _actor[1].act[2].state, _actor[1].act[3].state, _actor[1].act[0].state); actor11Reaction(buttons); actor12Reaction(buttons); actor13Reaction(buttons); actor10Reaction(buttons); } void Insane::actor11Reaction(int32 buttons) { int32 tmpx, tmpy; chooseEnemyWeaponAnim(buttons); switch(_actor[1].tilt) { case -3: if (_actor[1].act[1].state != 41 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 6); _actor[1].act[1].state = 41; } if (_actor[1].cursorX >= -100) { setEnemyAnimation(1, 7); _actor[1].act[1].state = 40; _actor[1].field_8 = 48; _actor[1].tilt = -2; } _actor[1].x += _actor[1].cursorX / 32; break; case -2: if (_actor[1].act[1].state != 40 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 7); _actor[1].act[1].state = 40; } if (_actor[1].field_8 == 48) _actor[1].tilt = -1; else _actor[1].tilt = -3; _actor[1].x += _actor[1].cursorX / 32; break; case -1: if (_actor[1].act[1].state != 39 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 8); _actor[1].act[1].state = 39; } if (_actor[1].field_8 == 48) _actor[1].tilt = 0; else _actor[1].tilt = -2; _actor[1].x += _actor[1].cursorX / 32; break; case 0: if (_actor[1].act[1].state != 1 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 9); _actor[1].act[1].state = 1; } _actor[1].field_8 = 1; if (_actor[1].cursorX < -100) { setEnemyAnimation(1, 8); _actor[1].act[1].state = 39; _actor[1].field_8 = 46; _actor[1].tilt = -1; } else { if (_actor[1].cursorX > 100) { setEnemyAnimation(1, 10); _actor[1].act[1].state = 55; _actor[1].field_8 = 49; _actor[1].tilt = 1; } } break; case 1: if (_actor[1].act[1].state != 55 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 10); _actor[1].act[1].state = 55; } if (_actor[1].field_8 == 51) _actor[1].tilt = 0; else _actor[1].tilt = 2; _actor[1].x += _actor[1].cursorX / 32; break; case 2: if (_actor[1].act[1].state != 56 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 11); _actor[1].act[1].state = 56; } if (_actor[1].field_8 == 51) _actor[1].tilt = 1; else _actor[1].tilt = 3; _actor[1].x += _actor[1].cursorX / 32; break; case 3: if (_actor[1].act[1].state != 57 || _actor[1].weaponClass != _actor[1].animWeaponClass) { setEnemyAnimation(1, 12); _actor[1].act[1].state = 57; } if (_actor[1].cursorX <= 100) { setEnemyAnimation(1, 11); _actor[1].act[1].state = 56; _actor[1].field_8 = 51; _actor[1].tilt = 2; } _actor[1].x += _actor[1].cursorX / 32; break; } tmpx = _actor[1].x; tmpy = _actor[1].y + _actor[1].y1; if (_actor[1].act[1].room) smlayer_putActor(1, 1, tmpx, tmpy, _smlayer_room2); else smlayer_putActor(1, 1, tmpx, tmpy, _smlayer_room); _actor[1].animWeaponClass = _actor[1].weaponClass; } void Insane::setEnemyAnimation(int32 actornum, int anim) { int d = 0; if (_currEnemy == EN_VULTM1) d = 14; if (anim <= 12) smlayer_setActorFacing(actornum, 1, actorAnimationData[_actor[actornum].weaponClass * 7 + anim - 6 + d], 180); } void Insane::chooseEnemyWeaponAnim(int32 buttons) { // kick if ((buttons & 1) && (!_actor[0].lost)) { if (!_kickEnemyProgress && actor0StateFlags2(_actor[1].act[2].state + _actor[1].weapon * 238)) { switch (_actor[1].weapon) { case INV_CHAIN: _actor[1].act[2].state = 10; break; case INV_CHAINSAW: _actor[1].act[2].state = 14; break; case INV_MACE: _actor[1].act[2].state = 18; break; case INV_2X4: _actor[1].act[2].state = 22; break; case INV_WRENCH: _actor[1].act[2].state = 26; break; case INV_BOOT: _actor[1].act[2].state = 93; break; case INV_HAND: _actor[1].act[2].state = 2; break; case INV_DUST: _actor[1].act[2].state = 89; break; default: break; } _kickEnemyProgress = true; } } else { _kickEnemyProgress = false; } // switch weapon if ((buttons & 2) && (_currEnemy != EN_TORQUE)) { if (_weaponEnemyJustSwitched || _actor[1].act[2].state == 35 || _actor[1].act[2].state == 34) return; if (!actor0StateFlags1(_actor[1].act[2].state)) return; switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_WRENCH: _actor[1].act[2].state = 35; smlayer_setActorFacing(1, 2, 24, 180); break; case INV_BOOT: case INV_HAND: case INV_DUST: _actor[1].act[2].state = 0; switchEnemyWeapon(); default: switchEnemyWeapon(); } _weaponEnemyJustSwitched = true; } else { _weaponEnemyJustSwitched = false; } } void Insane::switchEnemyWeapon(void) { do { _actor[1].weapon++; if (_actor[1].weapon > 7) _actor[1].weapon = INV_CHAIN; } while (!_actor[1].inventory[_actor[1].weapon]); switch (_actor[1].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_WRENCH: smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4)); smlayer_setActorFacing(1, 2, 18, 180); _actor[1].weaponClass = 1; _actor[1].act[2].state = 34; break; case INV_BOOT: _actor[1].weaponClass = 2; _actor[1].act[2].state = 1; break; case INV_HAND: smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4)); _actor[1].weaponClass = 2; _actor[1].act[2].state = 1; break; case INV_DUST: setEnemyState(); break; default: break; } } void Insane::setEnemyState(void) { if (_actor[1].lost) return; _actor[1].act[2].animTilt = -1000; if (_currEnemy == EN_CAVEFISH) { _actor[1].weaponClass = 2; if (!_val121_) _actor[1].act[2].state = 98; else _actor[1].act[2].state = 99; return; } switch (_actor[1].weapon) { case INV_CHAIN: _actor[1].weaponClass = 1; _actor[1].act[2].state = 63; break; case INV_CHAINSAW: _actor[1].weaponClass = 1; _actor[1].act[2].state = 64; break; case INV_MACE: _actor[1].weaponClass = 1; _actor[1].act[2].state = 65; break; case INV_2X4: _actor[1].weaponClass = 1; _actor[1].act[2].state = 66; break; case INV_WRENCH: _actor[1].weaponClass = 1; _actor[1].act[2].state = 62; break; case INV_BOOT: case INV_HAND: case INV_DUST: _actor[1].weaponClass = 2; _actor[1].act[2].state = 1; } } void Insane::actor12Reaction(int32 buttons) { int32 tmp, tmp2; switch(_actor[1].act[2].state) { case 106: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; smlayer_setActorFacing(1, 2, 29, 180); _actor[1].act[2].state = 107; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 107: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 8) _actor[1].damage = _actor[1].maxdamage + 10; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 108: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; smlayer_setActorFacing(1, 2, 28, 180); _actor[1].act[2].state = 109; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 109: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 6) _actor[1].damage = _actor[1].maxdamage + 10; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 73: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 2 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 74; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 74: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 2) { smlayer_setActorFacing(1, 2, 9, 180); _actor[1].act[2].state = 1; _actor[1].weaponClass = 2; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 79: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 1 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 23, 180); _actor[1].act[2].state = 80; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 80: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 6) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 63; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 81: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 2 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 23, 180); _actor[1].act[2].state = 82; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 82: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 3) { smlayer_setActorFacing(1, 2, 26, 180); _actor[1].act[2].state = 64; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 77: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 1 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 23, 180); _actor[1].act[2].state = 78; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 78: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 5) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 65; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 83: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 0; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 2 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 23, 180); _actor[1].act[2].state = 84; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 84: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 0; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 5) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 66; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 75: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 1; if (_actor[1].act[2].frame >= 4 && !_kickEnemyProgress) { smlayer_setActorFacing(1, 2, 23, 180); _actor[1].act[2].state = 76; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 76: smlayer_setActorLayer(1, 2, 6); _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].field_44 = 0; if (_actor[1].act[2].frame >= 4) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 62; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 2: smlayer_setActorLayer(1, 2, 4); smlayer_setActorFacing(1, 2, 17, 180); _actor[1].kicking = 1; _actor[1].weaponClass = 1; _actor[1].act[2].state = 3; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(63); break; case 3: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; if (_actor[1].act[2].frame >= 6) { tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(60); if (tmp == 1000) smlayer_startSound1(62); smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 4; } _actor[1].kicking = 1; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 4: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 2) { smlayer_setActorFacing(1, 2, 9, 180); _actor[1].act[2].state = 1; _actor[1].act[2].animTilt = -1000; _actor[1].weaponClass = 2; _actor[1].kicking = 0; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 5: smlayer_setActorLayer(1, 2, 5); break; case 10: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 11; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(75); break; case 11: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 2) { if (weaponEnemyIsEffective()) { smlayer_setActorFacing(1, 2, 22, 180); _actor[1].act[2].state = 79; } else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 12; } } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 12: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 1) { switch (_actor[0].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_DUST: case INV_WRENCH: case INV_BOOT: tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(73); if (tmp == 1000) smlayer_startSound1(74); break; case INV_HAND: if(calcEnemyDamage(1, 0)) smlayer_startSound1(73); break; } smlayer_setActorFacing(1, 2, 21, 180); _actor[1].act[2].state = 13; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 13: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 3) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 63; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 14: smlayer_setActorLayer(1, 2, 8); _actor[1].weaponClass = 1; _actor[1].kicking = 1; smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 15; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(78); break; case 15: smlayer_setActorLayer(1, 2, 8); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 5) { switch (_actor[0].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_DUST: if (weaponEnemyIsEffective()) { smlayer_setActorFacing(1, 2, 22, 180); _actor[1].act[2].state = 81; } else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 16; } break; default: smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 16; break; } } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 16: smlayer_setActorLayer(1, 2, 8); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 3) { switch (_actor[0].weapon) { case INV_CHAIN: case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_DUST: tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(76); if (tmp == 1000) smlayer_startSound1(77); break; default: calcEnemyDamage(1, 0); break; } smlayer_setActorFacing(1, 2, 21,180); _actor[1].act[2].state = 17; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 17: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 1) { smlayer_setActorFacing(1, 2, 26, 180); _actor[1].act[2].state = 64; smlayer_stopSound(76); } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 18: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 19; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(69); if (!_actor[1].field_54) { tmp = rand() % 5; if (tmp == 1) { smlayer_startSound1(213); } else if (tmp == 3) { smlayer_startSound1(215); } } break; case 19: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; if (_actor[1].act[2].frame >= 3) { switch (_actor[0].weapon) { case INV_CHAIN: if (_actor[0].kicking) { _actor[0].act[2].state = 108; _actor[1].act[2].state = 110; } break; case INV_CHAINSAW: if (_actor[0].kicking || _actor[0].field_44) _actor[1].act[2].state = 106; else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 20; } break; case INV_BOOT: case INV_DUST: smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 20; break; default: if (weaponEnemyIsEffective()) { smlayer_setActorFacing(1, 2, 22, 180); _actor[1].act[2].state = 77; } else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 20; } break; } } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 20: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 1) { switch (_actor[1].weapon) { case INV_CHAINSAW: case INV_MACE: case INV_2X4: case INV_BOOT: tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(67); if (tmp == 1000) smlayer_startSound1(68); break; default: calcEnemyDamage(1, 0); break; } smlayer_setActorFacing(1, 2, 21, 180); _actor[1].act[2].state = 21; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 21: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 5) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 65; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 110: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 0; smlayer_setActorFacing(1, 2, 30, 180); _actor[1].act[2].state = 111; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 111: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 7) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 65; smlayer_setActorLayer(1, 2, 5); } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 22: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 0; _actor[1].kicking = 1; smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 23; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(81); break; case 23: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 0; _actor[1].kicking = 1; if (weaponEnemyIsEffective()) { smlayer_setActorFacing(1, 2, 22, 180); _actor[1].act[2].state = 83; } else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 24; if (!_actor[1].field_54) smlayer_startSound1(246); } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 24: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 0; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 1) { tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(79); if (tmp == 1000) smlayer_startSound1(80); break; smlayer_setActorFacing(1, 2, 21, 180); _actor[1].act[2].state = 25; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 25: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 0; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 3) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 66; _actor[1].weaponClass = 1; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 26: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; smlayer_setActorFacing(1, 2, 19, 180); _actor[1].act[2].state = 27; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); smlayer_startSound1(72); break; case 27: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 1) { if (weaponEnemyIsEffective()) { smlayer_setActorFacing(1, 2, 22, 180); _actor[1].act[2].state = 75; } else { smlayer_setActorFacing(1, 2, 20, 180); _actor[1].act[2].state = 28; break; } } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 28: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 1; if (_actor[1].act[2].frame >= 3) { tmp = calcEnemyDamage(1, 1); if (tmp == 1) smlayer_startSound1(70); if (tmp == 1000) smlayer_startSound1(71); smlayer_setActorFacing(1, 2, 21, 180); _actor[1].act[2].state = 29; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 29: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 6) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].state = 62; _actor[1].kicking = 0; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 93: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 0; smlayer_setActorFacing(1, 2, 18, 180); _actor[1].act[2].state = 94; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 94: smlayer_setActorLayer(1, 2, 4); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 15) { smlayer_setActorCostume(1, 2, readArray(_numberArray, 44)); smlayer_setActorFacing(1, 2, 6, 180); _actor[1].act[2].state = 95; _actor[1].act[0].room = 0; _actor[1].act[1].room = 0; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 95: smlayer_setActorLayer(1, 2, 4); _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 19) { queueSceneSwitch(1, _smush_minedrivFlu, "minedriv.san", 64, 0, _continueFrame1, 1300); _actor[1].act[2].state = 96; } break; case 92: smlayer_setActorLayer(1, 2, 5); _actor[1].kicking = 0; break; case 97: smlayer_setActorLayer(1, 2, 25); _actor[1].lost = true; if (_actor[1].act[2].frame >= 18) { setWordInString(_numberArray, 7, 1); _enemy[EN_VULTM2].field_10 = 1; queueSceneSwitch(12, 0, "getnitro.san", 0, 0, 0, 0); } break; case 89: smlayer_setActorLayer(1, 2, 26); _actor[1].weaponClass = 1; _actor[1].kicking = 0; if (_val121_) smlayer_setActorFacing(1, 2, 13, 180); else smlayer_setActorFacing(1, 2, 12, 180); smlayer_startSound1(100); _actor[1].act[2].state = 90; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 90: smlayer_setActorLayer(1, 2, 26); _actor[1].weaponClass = 2; _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 5) if (_actor[1].x - _actor[0].x <= 125) _actor[0].damage += 90; if (_actor[1].act[2].frame >= 12) { _actor[1].kicking = 0; setEnemyState(); smlayer_setActorLayer(1, 2, 5); } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 91: smlayer_setActorLayer(1, 2, 26); _actor[1].kicking = 0; break; case 36: _actor[1].lost = 1; _actor[1].field_54 = 1; _actor[1].cursorX = 0; _actor[1].kicking = 0; smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costumevar)); smlayer_setActorFacing(1, 2, 6, 180); smlayer_setActorLayer(1, 2, 25); smlayer_startSound1(96); _actor[1].act[2].state = 37; switch (_currEnemy) { case EN_ROTT1: smlayer_startSound2(212); break; case EN_ROTT2: smlayer_startSound2(259); break; case EN_ROTT3: smlayer_startSound2(232); break; case EN_VULTF1: smlayer_startSound2(281); break; case EN_VULTF2: smlayer_startSound2(276); break; } case 37: _actor[1].cursorX = 0; _actor[1].kicking = 0; if (_actor[1].act[2].frame < _enemy[_currEnemy].maxframe) { if (_actor[1].x >= 50 && _actor[1].x <= 270) break; if (_actor[1].act[2].frame < _enemy[_currEnemy].maxframe / 2) break; } if (_currSceneId == 21) { queueSceneSwitch(22, 0, "rottflip.san", 64, 0, 0, 0); _actor[1].act[2].state = 38; } else { queueSceneSwitch(11, 0, _enemy[_currEnemy].filename, 64, 0, 0, 0); _actor[1].act[2].state = 38; } break; case 102: _actor[1].lost = 1; _actor[1].cursorX = 0; _actor[1].kicking = 0; smlayer_setActorCostume(1, 2, readArray(_numberArray, 40)); smlayer_setActorFacing(1, 2, 6, 180); smlayer_setActorLayer(1, 2, 25); _actor[1].act[2].state = 103; case 103: _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 18 || ((_actor[1].x < 50 || _actor[1].x > 270) && _actor[1].act[2].frame >= 9)) { _enemy[EN_CAVEFISH].field_10 = 1; queueSceneSwitch(20, 0, "wr2_cvko.san", 64, 0, 0, 0); _actor[1].act[2].state = 38; } break; case 113: _actor[1].lost = 1; _actor[1].kicking = 0; smlayer_setActorCostume(1, 2, readArray(_numberArray, 46)); smlayer_setActorFacing(1, 2, 6, 180); smlayer_setActorLayer(1, 2, 25); _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; _actor[1].cursorX = 0; _actor[1].act[2].state = 114; _enemy[EN_VULTF2].field_10 = 1; smlayer_startSound2(275); break; case 114: smlayer_setActorLayer(1, 2, 25); _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 16) { if (_actor[1].x >= 50 && _actor[1].x <= 270) break; if (_actor[1].act[2].frame < 8) break; queueSceneSwitch(11, 0, _enemy[_currEnemy].filename, 64, 0, 0, 0); _actor[1].act[2].state = 38; } break; case 115: _actor[1].lost = 1; _actor[1].kicking = 0; smlayer_setActorCostume(1, 2, readArray(_numberArray, 47)); smlayer_setActorFacing(1, 2, 6, 180); smlayer_setActorLayer(1, 2, 25); _actor[1].act[1].room = 0; _actor[1].act[0].room = 0; _actor[1].cursorX = 0; _actor[1].act[2].state = 116; smlayer_startSound2(232); break; case 116: smlayer_setActorLayer(1, 2, 25); _actor[1].kicking = 0; if (_actor[1].act[2].frame >= 17) { if (_actor[1].x >= 50 && _actor[1].x <= 270) break; if (_actor[1].act[2].frame < 8) break; queueSceneSwitch(11, 0, _enemy[_currEnemy].filename, 64, 0, 0, 0); _actor[1].act[2].state = 38; } break; case 38: smlayer_setActorLayer(1, 2, 25); _actor[1].kicking = 0; if (_actor[1].act[2].frame < _enemy[_currEnemy].maxframe + 20) break; _actor[1].act[2].frame = 0; if (_currSceneId == 21) { queueSceneSwitch(22, 0, "rottflip.san", 64, 0, 0, 0); _actor[1].act[2].state = 38; } else { queueSceneSwitch(11, 0, _enemy[_currEnemy].filename, 64, 0, 0, 0); _actor[1].act[2].state = 38; } break; case 34: smlayer_setActorLayer(1, 2, 5); _actor[1].kicking = 0; if (!smlayer_actorNeedRedraw(1, 2)) { setEnemyState(); _actor[1].act[2].tilt = 0; // for some reason there is no break at this // place, so tilt gets overriden on next line } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 35: smlayer_setActorLayer(1, 2, 5); _actor[1].kicking = 0; if (!smlayer_actorNeedRedraw(1, 2)) { switchEnemyWeapon(); _actor[1].act[2].tilt = 0; } _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 63: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].animTilt = 0; } _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 64: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 26, 180); _actor[1].act[2].animTilt = 0; } _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 65: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].animTilt = 0; } _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 66: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 25, 180); _actor[1].act[2].animTilt = 0; } _actor[1].weaponClass = 1; _actor[1].kicking = 0; _actor[1].act[2].tilt = calcTilt(_actor[1].tilt); break; case 98: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 6, 180); _actor[1].act[2].animTilt = 0; } if (_val121_) { smlayer_setActorFacing(1, 2, 7, 180); _actor[1].act[2].state = 100; } _actor[1].kicking = 0; break; case 99: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 9, 180); _actor[1].act[2].animTilt = 0; } if (_val121_) { smlayer_setActorFacing(1, 2, 8, 180); _actor[1].act[2].state = 101; } _actor[1].kicking = 0; break; case 100: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].frame >= 4) { smlayer_setActorFacing(1, 2, 9, 180); _actor[1].act[2].state = 99; } _actor[1].kicking = 0; break; case 101: smlayer_setActorLayer(1, 2, 5); if (_actor[1].act[2].frame >= 4) { smlayer_setActorFacing(1, 2, 6, 180); _actor[1].act[2].state = 98; } _actor[1].kicking = 0; break; case 1: smlayer_setActorLayer(1, 2, 5); _actor[1].weaponClass = 2; _actor[1].kicking = 0; switch (_actor[1].tilt) { case -3: if (_actor[1].act[2].animTilt != -3) { smlayer_setActorFacing(1, 2, 6, 180); _actor[1].act[2].animTilt = -3; } break; case -2: if (_actor[1].field_8 == 48) smlayer_setActorFacing(1, 2, 7, 180); _actor[1].act[2].animTilt = -2; break; case -1: if (_actor[1].field_8 == 46) smlayer_setActorFacing(1, 2, 8, 180); _actor[1].act[2].animTilt = -1; break; case 0: if (_actor[1].act[2].animTilt) { smlayer_setActorFacing(1, 2, 9, 180); _actor[1].act[2].animTilt = 0; } break; case 1: if (_actor[1].field_8 == 49) smlayer_setActorFacing(1, 2, 10, 180); _actor[1].act[2].animTilt = 1; break; case 2: if (_actor[1].field_8 == 51) smlayer_setActorFacing(1, 2, 11, 180); _actor[1].act[2].animTilt = 2; break; case 3: if (_actor[1].act[2].animTilt != 3) { smlayer_setActorFacing(1, 2, 12, 180); _actor[1].act[2].animTilt = 3; } break; default: break; } _actor[1].act[2].tilt = 0; break; default: break; } tmp = _actor[1].x + _actor[1].act[2].tilt - 17; tmp2 = _actor[1].y + _actor[1].y1 - 98; if (_actor[1].act[2].room) smlayer_putActor(1, 2, tmp, tmp2, _smlayer_room2); else smlayer_putActor(1, 2, tmp, tmp2, _smlayer_room); } int32 Insane::calcEnemyDamage(bool arg_0, bool arg_4) { if ((_actor[1].x - _actor[0].x > weaponMaxRange(1)) || (_actor[1].x - _actor[0].x < weaponMinRange(1))) return 0; if (_actor[0].field_44 && arg_4) return 1000; if (!actor1StateFlags(_actor[0].act[2].state)) return 0; if (arg_0) { ouchSoundBen(); _actor[0].damage += weaponDamage(1); // PATCH } return 1; } void Insane::ouchSoundBen(void) { _actor[0].act[3].state = 52; switch (rand() % 4) { case 0: smlayer_startSound2(315); break; case 1: smlayer_startSound2(316); break; case 2: smlayer_startSound2(317); break; case 3: smlayer_startSound2(98); break; } } bool Insane::weaponEnemyIsEffective(void) { if ((_actor[1].x - _actor[0].x > weaponMaxRange(1)) || (_actor[1].x - _actor[0].x < weaponMinRange(1)) || !_actor[0].kicking) return false; return true; } void Insane::actor13Reaction(int32 buttons) { int32 tmp; switch (_actor[1].act[3].state) { case 117: smlayer_setActorFacing(1, 3, 13, 180); _actor[1].field_54 = 1; _actor[1].act[3].state = 69; break; case 69: if (_actor[1].act[3].frame >= 2) _actor[1].act[3].state = 70; break; case 70: if (_actor[1].scenePropSubIdx) { smlayer_setActorFacing(1, 3, 4, 180); tmp = _currScenePropIdx + _actor[1].scenePropSubIdx; if (!smlayer_startSound2(_sceneProp[tmp].sound)) _actor[1].runningSound = 0; else _actor[1].runningSound = _sceneProp[tmp].sound; _actor[1].act[3].state = 72; } else { _actor[1].act[3].state = 118; } break; case 72: if (_actor[1].runningSound) { if (!smlayer_isSoundRunning(_actor[1].runningSound)) { smlayer_setActorFacing(1, 3, 5, 180); _actor[1].act[3].state = 70; _actor[1].scenePropSubIdx = 0; } } else { tmp = _currScenePropIdx + _actor[1].scenePropSubIdx; if (_sceneProp[tmp].counter >= _sceneProp[tmp].maxCounter) { smlayer_setActorFacing(1, 3, 5, 180); _actor[1].act[3].state = 70; _actor[1].scenePropSubIdx = 0; _actor[1].runningSound = 0; } } break; case 118: smlayer_setActorFacing(1, 3, 14, 180); _actor[1].act[3].state = 71; break; case 71: _actor[1].field_54 = 0; if (_actor[1].act[3].frame >= 2) _actor[1].act[3].state = 1; break; case 52: if (_actor[1].runningSound) smlayer_stopSound(_actor[1].runningSound); if (_currScenePropIdx) shutCurrentScene(); _actor[1].runningSound = 0; _actor[1].defunct = 0; _actor[1].field_54 = 0; smlayer_setActorFacing(1, 3, 15, 180); _actor[1].act[3].state = 53; break; case 53: _actor[1].field_54 = 0; if (_actor[1].act[3].frame >= 2) { smlayer_setActorFacing(1, 3, 16, 180); _actor[1].act[3].state = 54; } break; case 54: case 1: _actor[1].field_54 = 0; break; default: break; } } // FIXME: this is exact actor00Reaction. Combine void Insane::actor10Reaction(int32 buttons) { int32 tmpx, tmpy; switch (_actor[1].tilt) { case -3: if (_actor[1].act[0].state != 41) { smlayer_setActorFacing(1, 0, 6, 180); _actor[1].act[0].state = 41; } break; case -2: if (_actor[1].act[0].state != 40) { smlayer_setActorFacing(1, 0, 7, 180); _actor[1].act[0].state = 40; } break; case -1: if (_actor[1].act[0].state != 39) { smlayer_setActorFacing(1, 0, 8, 180); _actor[1].act[0].state = 39; } break; case 0: if (_actor[1].act[0].state != 1) { smlayer_setActorFacing(1, 0, 9, 180); _actor[1].act[0].state = 1; } break; case 1: if (_actor[1].act[0].state != 55) { smlayer_setActorFacing(1, 0, 10, 180); _actor[1].act[0].state = 55; } break; case 2: if (_actor[1].act[0].state != 56) { smlayer_setActorFacing(1, 0, 11, 180); _actor[1].act[0].state = 56; } break; case 3: if (_actor[1].act[0].state != 57) { smlayer_setActorFacing(1, 0, 12, 180); _actor[1].act[0].state = 57; } break; default: break; } tmpx = _actor[1].x + _actor[1].x1; tmpy = _actor[1].y + _actor[1].y1; if (_actor[1].act[0].room) smlayer_putActor(1, 0, tmpx, tmpy, _smlayer_room2); else smlayer_putActor(1, 0, tmpx, tmpy, _smlayer_room); } int32 Insane::actionEnemy(void) { int32 buttons; if (_actor[1].enemyHandler != -1) buttons = enemyHandler(_actor[1].enemyHandler, 1, 0, _actor[1].probability); else buttons = enemyHandler(EN_TORQUE, 1, 0, _actor[1].probability); if (_actor[1].tilt) { _actor[1].speed += _actor[1].cursorX / 40; } else { if (_actor[1].speed < 0) _actor[1].speed++; else _actor[1].speed--; } if (_actor[1].speed > 8) _actor[1].speed = 8; if (_actor[1].speed < -8) _actor[1].speed = -8; _actor[1].x += _actor[0].speed; if (_actor[1].x > 250) _actor[1].x--; else _actor[1].x--; if (_actor[1].x > 320) { _actor[1].x = 320; _actor[1].damage++; _actor[1].x1 = -_actor[1].x1; _actor[1].damage++; return buttons; } if (!_actor[1].lost) { if (_actor[0].x + 90 > _actor[1].x) _actor[1].x = _actor[0].x + 90; } if (_actor[1].x < 0) { _actor[1].x = 0; _actor[1].x1 = -_actor[1].x1; _actor[1].damage++; } else if (_actor[1].x > 310) { _actor[1].x1 = -_actor[1].x1; _actor[1].damage++; } return buttons; } 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 } void Insane::procSKIP(Chunk &b) { _player->checkBlock(b, TYPE_SKIP, 4); int16 par1, par2; par1 = b.getWord(); par2 = b.getWord(); if (!par2) { if (isBitSet(par1)) _player->_skipNext = true; return; } if (isBitSet(par1) != isBitSet(par2)) _player->_skipNext = true; } bool Insane::isBitSet(int n) { if (n >= 0x80) return false; return (_iactBits[n / 8] & (0x80 >> (n % 8))) != 0; } void Insane::setBit(int n) { if (n >= 0x80) return; _iactBits[n / 8] |= 0x80 >> (n % 8); } void Insane::clearBit(int n) { if (n >= 0x80) return; _iactBits[n / 8] &= !(0x80 >> (n % 8)); } void Insane::smlayer_setActorFacing(int actornum, int actnum, int frame, int direction) { if (_actor[actornum].act[actnum].room) { Actor *a = _scumm->derefActor(_actor[actornum].act[actnum].actor, "smlayer_setActorFacing"); a->setDirection(direction); a->startAnimActor(frame); _actor[actornum].act[actnum].frame = 0; } } char *Insane::handleTrsTag(int32 trsFilePtr, int32 trsId) { // FIXME: implement warning("stub Insane::handleTrsTag(0, %d)", trsId); return 0; } bool Insane::smush_eitherNotStartNewFrame(void) { if (_smush_setupsan17) return false; if (_smush_isSanFileSetup) { if (_smush_frameStep < 0) return false; if (_smush_curFrame > _smush_frameStep + _smush_frameNum2) return true; else return false; } else { if (_smush_frameNum1 < 0) return false; if (_smush_curFrame >= _smush_frameNum1) { _smush_frameNum1 = -1; return false; } else return true; } } int32 Insane::getLastKey(bool arg_0) { return _scumm->_lastKeyHit; } bool Insane::smlayer_actorNeedRedraw(int actornum, int actnum) { Actor *a = _scumm->derefActor(_actor[actornum].act[actnum].actor, "smlayer_actorNeedRedraw"); return a->needRedraw; } void Insane::smush_setPaletteValue(int where, int r, int g, int b) { // FIXME: implement warning("stub Insane::smlayer_setPaletteValue(%d, %d, %d, %d)", where, r, g, b); } int32 Insane::readArray (int number, int item) { return _scumm->readArray (number, 0, item); } void Insane::setWordInString(int number, int item, int value) { _scumm->writeArray(number, 0, item, value); } void Insane::smush_setupSanWithFlu(const char *filename, int32 setupsan2, int32 step1, int32 step2, int32 setupsan1, byte *fluPtr, int32 numFrames) { byte *tmp = fluPtr; int32 offset; debug(0, "smush_setupSanWithFlu(%s, %d, %d, %d, %d, %lx, %d)", filename, setupsan2, step1, step2, setupsan1, fluPtr, numFrames); _smush_setupsan1 = setupsan1; /* skip FLUP marker */ if (READ_BE_UINT32(fluPtr) == 'FLUP') tmp += 8; _smush_setupsan2 = setupsan2; if (tmp[2] <= 1) { /* 0x300 -- palette, 0x8 -- header */ offset = READ_LE_UINT32(tmp + 0x308 + numFrames*4); smush_setupSanFile(filename, offset, numFrames); memcpy(_smush_earlyFluContents, tmp+2, 0x306); _smush_earlyFluContents[0x30e] = 0; _smush_earlyFluContents[0x30f] = 0; _smush_earlyFluContents[0x310] = 0; _smush_earlyFluContents[0x311] = 0; _smush_earlyFluContents[0x306] = 0; _smush_earlyFluContents[0x307] = 0; } else { offset = READ_LE_UINT32(tmp + 0x31c + numFrames*4); smush_setupSanFile(filename, offset, numFrames); memcpy(_smush_earlyFluContents, tmp+2, 0x31a); } _smush_isSanFileSetup = 1; _smush_setupsan4 = 1; _smush_curFrame = numFrames; smush_setFrameSteps(step1, step2); } void Insane::smush_setupSanFromStart(const char *filename, int32 setupsan2, int32 step1, int32 step2, int32 setupsan1) { _smush_setupsan1 = setupsan1; _smush_setupsan2 = setupsan2; smush_setupSanFile(filename, 8, 0); _smush_isSanFileSetup = 1; smush_setFrameSteps(step1, step2); } void Insane::smush_setFrameSteps(int32 step1, int32 step2) { _smush_frameNum2 = _smush_curFrame; _smush_frameNum1 = step2; _smush_frameStep = step1; } void Insane::smush_setupSanFile(const char *filename, int32 offset, int32 contFrame) { debug(0, "smush_setupSanFile(%s, %x)", filename, offset); _player->seekSan(filename, _scumm->getGameDataPath(), offset, contFrame); _scumm->_imuseDigital->pause(false); } } #endif // INSANE