aboutsummaryrefslogtreecommitdiff
path: root/scumm/smush
diff options
context:
space:
mode:
authorEugene Sandulenko2003-12-13 03:40:54 +0000
committerEugene Sandulenko2003-12-13 03:40:54 +0000
commita2a1b7de1fa4a2766c97149875580657167e66ba (patch)
tree756c4c100f5e3ec97bcc69431f092f1904736654 /scumm/smush
parent73f3c3bdd44cfb26b46809b374f00e3817782f77 (diff)
downloadscummvm-rg350-a2a1b7de1fa4a2766c97149875580657167e66ba.tar.gz
scummvm-rg350-a2a1b7de1fa4a2766c97149875580657167e66ba.tar.bz2
scummvm-rg350-a2a1b7de1fa4a2766c97149875580657167e66ba.zip
o first scene is completable, although it seems to me that enemy moving
is wrong, as he never approaches Ben o fix warnings o more correct names to some procedures o cleanup svn-id: r11610
Diffstat (limited to 'scumm/smush')
-rw-r--r--scumm/smush/insane.cpp1198
-rw-r--r--scumm/smush/insane.h17
2 files changed, 1117 insertions, 98 deletions
diff --git a/scumm/smush/insane.cpp b/scumm/smush/insane.cpp
index a5dc55f62e..737020774d 100644
--- a/scumm/smush/insane.cpp
+++ b/scumm/smush/insane.cpp
@@ -46,6 +46,14 @@
// tovista1.san
// tovista2.san
+// TODO:
+// o Fix wrong enemy animation
+// o Proper SAN seeking/switching. Now it just crashes
+// o TRS file support. Everything is in place, I just need to figure out function parameters
+// o FLU files support
+// o Kill bugs
+// o Code review/cleanup
+
namespace Scumm {
static const int scenePropIdx[58] = {0, 12, 14, 18, 20, 22, 24, 26, 28, 30, 34,
@@ -238,23 +246,23 @@ void Insane::initvars(void) {
_iactSceneId2 = 0;
init_enemyStruct(EN_ROTT1, EN_ROTT1, 0, 0, 160, 0, INV_MACE, 90, "wr2_rott.san",
- 26, 16, 17, 0x1b, 0x0b, 3);
+ 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, 0x2a, 0x0b, 3);
+ 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, 0x2b, 0x0b, 3);
+ 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, 0x25, 0x0c, 4);
+ 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, 0x24, 0x0c, 4);
+ 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, 0x23, 0x0c, 4);
+ 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, 0x2d, 0x10, 4);
+ 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, 0x29, 0x0d, 2);
+ 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, 0x25, 0x0c, 1);
+ 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);
@@ -511,7 +519,7 @@ 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 field_2C, int32 field_30, int32 field_34) {
+ int16 costumevar, int32 maxframe, int32 field_34) {
assert(strlen(filename) < 20);
_enemy[n].handler = handler;
@@ -525,8 +533,8 @@ void Insane::init_enemyStruct(int n, int32 handler, int32 initializer,
_enemy[n].costume4 = costume4;
_enemy[n].costume6 = costume6;
_enemy[n].costume5 = costume5;
- _enemy[n].field_2C = field_2C;
- _enemy[n].field_30 = field_30;
+ _enemy[n].costumevar = costumevar;
+ _enemy[n].maxframe = maxframe;
_enemy[n].field_34 = field_34;
}
@@ -639,7 +647,7 @@ int32 Insane::enemy0handler(int32 actor1, int32 actor2, int32 probability) {
act2damage = _actor[actor2].damage; // ebp
act1x = _actor[actor1].x; // esi
act2x = _actor[actor2].x; // edi
-
+
if (!_actor[actor1].field_4C) {
if (_val131w > _val132w) {
if (act1damage - act2damage >= 30) {
@@ -672,7 +680,7 @@ int32 Insane::enemy0handler(int32 actor1, int32 actor2, int32 probability) {
}
}
} else {
- if (weaponMaxRange(actor2) < dist) {
+ if (weaponMaxRange(actor2) >= dist) {
if (act2x < act1x)
_actor[1].field_14 = 101;
else
@@ -684,7 +692,8 @@ int32 Insane::enemy0handler(int32 actor1, int32 actor2, int32 probability) {
_val133w = 0;
_val134w = rand() % probability;
}
- if (_val135w < _val136w) {
+
+ if (_val135w > _val136w) {
if (weaponMaxRange(actor2) + 40 >= dist) {
if (rand() % probability == 1)
retval = 1;
@@ -843,7 +852,7 @@ int32 Insane::enemy2handler(int32 actor1, int32 actor2, int32 probability) {
_val152w = rand() % (probability * 2);
}
- dist = ABS(act1x - act2x);
+ dist = abs(act1x - act2x);
if (_val153w > _val154w) {
if (_val150b == 1) {
@@ -875,7 +884,7 @@ int32 Insane::enemy2handler(int32 actor1, int32 actor2, int32 probability) {
_val153w = 0;
_val154w = rand() % probability;
}
- if (_val155w < _val156w) {
+ if (_val155w > _val156w) {
if (weaponMaxRange(actor2) + 40 >= dist) {
if (rand() % probability == 1)
retval = 1;
@@ -1617,9 +1626,6 @@ void Insane::stopSceneSounds(int sceneId) {
case 22:
case 23:
break;
- default:
- error("Insane::stopSceneSounds(%d): default case %d",
- sceneId, sceneId);
}
smush_proc39();
if (!flag)
@@ -1841,8 +1847,6 @@ int Insane::loadSceneData(int scene, int flag, int phase) {
smlayer_loadCostume(41, phase);
break;
default:
- error("Insane::loadSceneData(%d, %d): default case[2] %d",
- scene, phase, _currEnemy);
retvalue = 0;
break;
}
@@ -1952,8 +1956,6 @@ int Insane::loadSceneData(int scene, int flag, int phase) {
case 23:
break;
default:
- error("Insane::loadSceneData(%d, %d): default case %d",
- scene, phase, scene);
retvalue = 0;
}
if (phase == 1) {
@@ -2008,24 +2010,6 @@ void Insane::setSceneCostumes(int sceneId) {
case 8:
setWordInString(_numberArray, 4, 0);
return;
- case 3:
- case 9:
- case 10:
- case 11:
- case 12:
- case 14:
- case 15:
- case 16:
- case 18:
- case 19:
- case 20:
- case 22:
- case 23:
- case 24:
- case 25:
- break;
- default:
- error("Insane::setSceneCostumes: default case %d", sceneId);
}
}
@@ -2049,6 +2033,8 @@ void Insane::setupValues(void) {
}
void Insane::setEnemyCostumes (void) {
+ int i;
+
debug(0, "setEnemyCostumes()");
smlayer_setActorCostume(0, 2, readArray(_numberArray, 12));
@@ -2133,7 +2119,8 @@ void Insane::setEnemyCostumes (void) {
_actor[1].maxdamage = _enemy[_currEnemy].maxdamage;
_actor[1].enemyHandler = _enemy[_currEnemy].handler;
_actor[1].field_30 = 0;
- memset (_actor[1].inventory, 8, 0);
+ for (i = 0; i < 8; i++)
+ _actor[1].inventory[i] = 0;
_actor[0].damage = 0;
_actor[0].x = 100;
_actor[0].y = 200;
@@ -2465,9 +2452,6 @@ void Insane::procPostRendering(byte *renderBitmap, int32 codecparam, int32 setup
case 25:
case 26:
break;
- default:
- error("Insane::procPostRendering: default case %d", _currSceneId);
- break;
}
if (_currScenePropIdx)
@@ -2698,8 +2682,52 @@ void Insane::postCase9(byte *renderBitmap, int32 codecparam, int32 setupsan12,
void Insane::postCase10(byte *renderBitmap, int32 codecparam, int32 setupsan12,
int32 setupsan13, int32 curFrame, int32 maxFrame) {
- // FIXME: implement
- warning("stub Insane::postCase10(...)");
+ 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,
@@ -2831,7 +2859,7 @@ void Insane::postCaseAll(byte *renderBitmap, int32 codecparam, int32 setupsan12,
tsceneProp = &_sceneProp[_currScenePropIdx + _currScenePropSubIdx];
tsceneProp->counter = 0;
if (tsceneProp->trsId)
- _currTrsMsg = tsceneProp->trsId;
+ _currTrsMsg = handleTrsTag(_trsFilePtr, tsceneProp->trsId);
else
_currTrsMsg = 0;
@@ -3464,7 +3492,6 @@ void Insane::actor02Reaction(int32 buttons) {
}
_actor[0].act[2].tilt = calcTilt(_actor[0].speed);
break;
- break;
case 76:
smlayer_setActorLayer(0, 2, 6);
_actor[0].field_2C = 1;
@@ -3490,7 +3517,7 @@ void Insane::actor02Reaction(int32 buttons) {
_actor[0].field_2C = 1;
if (_actor[0].act[2].frame == 2) {
if (_currEnemy != EN_CAVEFISH) {
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1)
smlayer_startSound1(60);
if (tmp == 1000)
@@ -3542,7 +3569,7 @@ void Insane::actor02Reaction(int32 buttons) {
if (_currEnemy == EN_VULTM2) {
if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
- calcDamage(0, 0)) {
+ calcBenDamage(0, 0)) {
smlayer_setActorFacing(0, 2, 20, 180);
_actor[0].act[2].state = 97;
_actor[0].act[2].room = 0;
@@ -3588,16 +3615,24 @@ void Insane::actor02Reaction(int32 buttons) {
_actor[0].kicking = 1;
if (_actor[0].act[2].frame >= 1) {
if (_currEnemy != EN_CAVEFISH) {
- if ((_actor[1].weapon >= 0 && _actor[1].weapon < 5) ||
- _actor[1].weapon == INV_DUST) {
- tmp = calcDamage(1, 1);
+ 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);
- } else {
- if(calcDamage(1, 0) == 1)
+ 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)) &&
@@ -3648,7 +3683,7 @@ void Insane::actor02Reaction(int32 buttons) {
_actor[0].field_2C = 2;
_actor[0].field_34 = 1;
_actor[0].kicking = 0;
- if ((_actor[0].act[2].frame == 3) && (calcDamage(0, 0) == 1)) {
+ if ((_actor[0].act[2].frame == 3) && (calcBenDamage(0, 0) == 1)) {
_actor[1].damage = weaponDamage(0);
smlayer_startSound1(64);
_actor[1].field_14 = 320;
@@ -3688,7 +3723,7 @@ void Insane::actor02Reaction(int32 buttons) {
switch (_actor[1].weapon) {
case INV_CHAIN:
case INV_CHAINSAW:
- if (weaponIsEffective()) {
+ if (weaponBenIsEffective()) {
smlayer_setActorFacing(0, 2, 22, 180);
_actor[0].act[2].state = 81;
} else {
@@ -3719,14 +3754,14 @@ void Insane::actor02Reaction(int32 buttons) {
switch (_actor[1].weapon) {
case INV_CHAIN:
case INV_CHAINSAW:
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1)
smlayer_startSound1(76);
if (tmp == 1000)
smlayer_startSound1(77);
break;
case INV_BOOT:
- calcDamage(0, 1);
+ calcBenDamage(0, 1);
break;
case INV_DUST:
if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
@@ -3736,7 +3771,7 @@ void Insane::actor02Reaction(int32 buttons) {
}
break;
default:
- if (calcDamage(1, 0))
+ if (calcBenDamage(1, 0))
smlayer_startSound1(76);
break;
}
@@ -3781,7 +3816,7 @@ void Insane::actor02Reaction(int32 buttons) {
}
break;
case INV_CHAINSAW:
- if (!_actor[1].kicking || !_actor[1].field_44)
+ if (_actor[1].kicking || _actor[1].field_44)
_actor[0].act[2].state = 106;
else {
smlayer_setActorFacing(0, 2, 20, 180);
@@ -3790,7 +3825,7 @@ void Insane::actor02Reaction(int32 buttons) {
break;
case INV_MACE:
case INV_2X4:
- if (weaponIsEffective()) {
+ if (weaponBenIsEffective()) {
smlayer_setActorFacing(0, 2, 22, 180);
_actor[0].act[2].state = 77;
break;
@@ -3816,7 +3851,7 @@ void Insane::actor02Reaction(int32 buttons) {
case INV_MACE:
case INV_2X4:
case INV_BOOT:
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1)
smlayer_startSound1(67);
if (tmp == 1000)
@@ -3888,7 +3923,7 @@ void Insane::actor02Reaction(int32 buttons) {
case INV_2X4:
case INV_BOOT:
case INV_DUST:
- if (weaponIsEffective()) {
+ if (weaponBenIsEffective()) {
smlayer_setActorFacing(0, 2, 22, 180);
_actor[0].act[2].state = 83;
}
@@ -3915,7 +3950,7 @@ void Insane::actor02Reaction(int32 buttons) {
case INV_2X4:
case INV_BOOT:
case INV_DUST:
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1) {
if (_currEnemy == EN_CAVEFISH) {
_actor[1].lost = 1;
@@ -3928,7 +3963,7 @@ void Insane::actor02Reaction(int32 buttons) {
smlayer_startSound1(80);
break;
default:
- if (!calcDamage(1, 0))
+ if (!calcBenDamage(1, 0))
smlayer_startSound1(79);
break;
}
@@ -3973,7 +4008,7 @@ void Insane::actor02Reaction(int32 buttons) {
case INV_2X4:
case INV_BOOT:
case INV_DUST:
- if (weaponIsEffective()) {
+ if (weaponBenIsEffective()) {
smlayer_setActorFacing(0, 2, 22, 180);
_actor[0].act[2].state = 75;
break;
@@ -3999,14 +4034,14 @@ void Insane::actor02Reaction(int32 buttons) {
case INV_2X4:
case INV_BOOT:
case INV_DUST:
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1)
smlayer_startSound1(70);
if (tmp == 1000)
smlayer_startSound1(71);
break;
case 6:
- if (!calcDamage(0, 1))
+ if (!calcBenDamage(0, 1))
smlayer_startSound1(70);
break;
default:
@@ -4057,15 +4092,15 @@ void Insane::actor02Reaction(int32 buttons) {
if (_actor[0].act[2].frame >= 5) {
switch (_currEnemy) {
case EN_ROTT3:
- if (calcDamage(0, 0))
+ if (calcBenDamage(0, 0))
_actor[1].act[2].state = 115;
break;
case EN_VULTF2:
- if (calcDamage(0, 0))
+ if (calcBenDamage(0, 0))
_actor[1].act[2].state = 113;
break;
default:
- tmp = calcDamage(1, 1);
+ tmp = calcBenDamage(1, 1);
if (tmp == 1)
smlayer_startSound1(82);
if (tmp == 1000)
@@ -4186,7 +4221,7 @@ void Insane::actor02Reaction(int32 buttons) {
_actor[0].kicking = 0;
if (!smlayer_actorNeedRedraw(0, 2)) {
- setProperActorState();
+ setBenState();
_actor[0].act[2].tilt = 0;
// heh, for some reason there is no break at this
// place, so tilt gets overriden on next line
@@ -4726,7 +4761,7 @@ int32 Insane::weaponDamage(int32 actornum) {
return map[_actor[actornum].weapon];
}
-bool Insane::weaponIsEffective(void) {
+bool Insane::weaponBenIsEffective(void) {
if ((_actor[1].x - _actor[0].x > weaponMaxRange(0)) ||
(_actor[1].x - _actor[0].x < weaponMinRange(0)) ||
!_actor[1].kicking)
@@ -4747,7 +4782,7 @@ void Insane::prepareScenePropScene(int32 scenePropNum, bool arg_4, bool arg_8) {
_sceneProp[scenePropNum + 1].counter = 0;
_currScenePropSubIdx = 1;
if (_sceneProp[scenePropNum + 1].trsId)
- _currTrsMsg = _sceneProp[scenePropNum + 1].trsId;
+ _currTrsMsg = handleTrsTag(_trsFilePtr, _sceneProp[scenePropNum + 1].trsId);
else
_currTrsMsg = 0;
@@ -4759,7 +4794,7 @@ void Insane::prepareScenePropScene(int32 scenePropNum, bool arg_4, bool arg_8) {
}
}
-int32 Insane::calcDamage(bool arg_0, bool arg_4) {
+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;
@@ -4771,14 +4806,14 @@ int32 Insane::calcDamage(bool arg_0, bool arg_4) {
return 0;
if (arg_0) {
- enemyOuchSound();
+ ouchSoundEnemy();
_actor[1].damage += weaponDamage(0);
}
return 1;
}
-void Insane::enemyOuchSound(void) {
+void Insane::ouchSoundEnemy(void) {
int32 tmp;
_actor[1].act[3].state = 52;
@@ -4849,7 +4884,7 @@ bool Insane::loadScenePropSounds(int32 scenePropNum) {
return res != 0;
}
-int32 Insane::setProperActorState(void) {
+int32 Insane::setBenState(void) {
_actor[0].act[2].facing = -1000;
switch (_actor[0].weapon) {
case INV_CHAIN:
@@ -5261,10 +5296,9 @@ void Insane::turnEnemy(bool battle) {
buttons = 0;
- if (_actor[1].lost == 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);
@@ -5443,7 +5477,7 @@ void Insane::chooseEnemyWeaponAnim(int32 buttons) {
// switch weapon
if ((buttons & 2) && (_currEnemy != EN_TORQUE)) {
- if (_weaponBenJustSwitched || _actor[1].act[2].state == 35 ||
+ if (_weaponEnemyJustSwitched || _actor[1].act[2].state == 35 ||
_actor[1].act[2].state == 34)
return;
@@ -5464,6 +5498,8 @@ void Insane::chooseEnemyWeaponAnim(int32 buttons) {
case INV_DUST:
_actor[1].act[2].state = 0;
switchEnemyWeapon();
+ default:
+ switchEnemyWeapon();
}
_weaponEnemyJustSwitched = true;
@@ -5477,7 +5513,6 @@ void Insane::switchEnemyWeapon(void) {
_actor[1].weapon++;
if (_actor[1].weapon > 7)
_actor[1].weapon = INV_CHAIN;
-
} while (!_actor[1].inventory[_actor[1].weapon]);
switch (_actor[1].weapon) {
@@ -5498,17 +5533,17 @@ void Insane::switchEnemyWeapon(void) {
case INV_HAND:
smlayer_setActorCostume(1, 2, readArray(_numberArray, _enemy[_currEnemy].costume4));
_actor[1].field_2C = 1;
- _actor[1].act[2].state = 34;
+ _actor[1].act[2].state = 1;
break;
case INV_DUST:
- enemyDustAction();
+ setEnemyState();
break;
default:
break;
}
}
-void Insane::enemyDustAction(void) {
+void Insane::setEnemyState(void) {
if (_actor[1].lost)
return;
@@ -5554,7 +5589,988 @@ void Insane::enemyDustAction(void) {
}
void Insane::actor12Reaction(int32 buttons) {
- // FIXME: implement
+ int32 tmp, tmp2;
+
+ switch(_actor[1].act[2].state) {
+ case 106:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 107:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 108:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 109:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 73:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 74:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].field_2C = 2;
+ }
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 79:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 80:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 81:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 82:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 77:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 78:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 83:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 84:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 75:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 76:
+ smlayer_setActorLayer(1, 2, 6);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 2:
+ smlayer_setActorLayer(1, 2, 4);
+ smlayer_setActorFacing(1, 2, 17, 180);
+ _actor[1].kicking = 1;
+ _actor[1].field_2C = 1;
+ _actor[1].act[2].state = 3;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ smlayer_startSound1(63);
+ break;
+ case 3:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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; // xxx
+ }
+ _actor[1].kicking = 1;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 4:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].facing = -1000;
+ _actor[1].field_2C = 2;
+ _actor[1].kicking = 0;
+ }
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 5:
+ smlayer_setActorLayer(1, 2, 5);
+ break;
+ case 10:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ smlayer_startSound1(75);
+ break;
+ case 11:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 12:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 13:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 14:
+ smlayer_setActorLayer(1, 2, 8);
+ _actor[1].field_2C = 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].speed);
+ smlayer_startSound1(78);
+ break;
+ case 15:
+ smlayer_setActorLayer(1, 2, 8);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 16:
+ smlayer_setActorLayer(1, 2, 8);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 17:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 18:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ 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].field_2C = 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].speed);
+ break;
+ case 20:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 21:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 110:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 111:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 22:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ smlayer_startSound1(81);
+ break;
+ case 23:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 24:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 25:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].field_2C = 1;
+ }
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 26:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ smlayer_startSound1(72);
+ break;
+ case 27:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 28:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 29:
+ smlayer_setActorLayer(1, 2, 5);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 93:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ break;
+ case 94:
+ smlayer_setActorLayer(1, 2, 4);
+ _actor[1].field_2C = 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].speed);
+ 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].field_2C = 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].speed);
+ break;
+ case 90:
+ smlayer_setActorLayer(1, 2, 26);
+ _actor[1].field_2C = 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].speed);
+ 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].field_14 = 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].field_14 = 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;
+ }
+ break;
+ case 102:
+ _actor[1].lost = 1;
+ _actor[1].field_14 = 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) {
+ if (_actor[1].x >= 50 && _actor[1].x <= 270)
+ break;
+
+ if (_actor[1].act[2].frame < 9)
+ break;
+
+ _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].field_14 = 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].field_14 = 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;
+ }
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ 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].speed);
+ break;
+ case 63:
+ smlayer_setActorLayer(1, 2, 5);
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 25, 180);
+ _actor[1].act[2].facing = 0;
+ }
+ _actor[1].field_2C = 1;
+ _actor[1].kicking = 0;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 64:
+ smlayer_setActorLayer(1, 2, 5);
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 26, 180);
+ _actor[1].act[2].facing = 0;
+ }
+ _actor[1].field_2C = 1;
+ _actor[1].kicking = 0;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 65:
+ smlayer_setActorLayer(1, 2, 5);
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 25, 180);
+ _actor[1].act[2].facing = 0;
+ }
+ _actor[1].field_2C = 1;
+ _actor[1].kicking = 0;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 66:
+ smlayer_setActorLayer(1, 2, 5);
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 25, 180);
+ _actor[1].act[2].facing = 0;
+ }
+ _actor[1].field_2C = 1;
+ _actor[1].kicking = 0;
+ _actor[1].act[2].tilt = calcTilt(_actor[1].speed);
+ break;
+ case 98:
+ smlayer_setActorLayer(1, 2, 5);
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 6, 180);
+ _actor[1].act[2].facing = 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].facing) {
+ smlayer_setActorFacing(1, 2, 9, 180);
+ _actor[1].act[2].facing = 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].field_2C = 2;
+ _actor[1].kicking = 0;
+
+ switch (_actor[1].speed) {
+ case -3:
+ if (_actor[1].act[2].facing != -3) {
+ smlayer_setActorFacing(1, 2, 6, 180);
+ _actor[1].act[2].facing = -3;
+ }
+ break;
+ case -2:
+ if (_actor[1].field_8 == 48)
+ smlayer_setActorFacing(1, 2, 7, 180);
+ _actor[1].act[2].facing = -2;
+ break;
+ case -1:
+ if (_actor[1].field_8 == 46)
+ smlayer_setActorFacing(1, 2, 8, 180);
+ _actor[1].act[2].facing = -1;
+ break;
+ case 0:
+ if (_actor[1].act[2].facing) {
+ smlayer_setActorFacing(1, 2, 9, 180);
+ _actor[1].act[2].facing = 0;
+ }
+ break;
+ case 1:
+ if (_actor[1].field_8 == 49)
+ smlayer_setActorFacing(1, 2, 10, 180);
+ _actor[1].act[2].facing = 1;
+ break;
+ case 2:
+ if (_actor[1].field_8 == 51)
+ smlayer_setActorFacing(1, 2, 11, 180);
+ _actor[1].act[2].facing = 2;
+ break;
+ case 3:
+ if (_actor[1].act[2].facing != 3) {
+ smlayer_setActorFacing(1, 2, 12, 180);
+ _actor[1].act[2].facing = 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);
+ }
+
+ 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) {
@@ -5704,9 +6720,9 @@ int32 Insane::actionEnemy(void) {
int32 buttons;
if (_actor[1].enemyHandler != -1)
- buttons = enemyHandler(_actor[1].enemyHandler, 0, 1, _actor[1].probability);
+ buttons = enemyHandler(_actor[1].enemyHandler, 1, 0, _actor[1].probability);
else
- buttons = enemyHandler(EN_TORQUE, 0, 1, _actor[1].probability);
+ buttons = enemyHandler(EN_TORQUE, 1, 0, _actor[1].probability);
if (_actor[1].speed) {
_actor[1].field_18 += _actor[1].field_14 / 40;
diff --git a/scumm/smush/insane.h b/scumm/smush/insane.h
index 3e4a4d610e..74f357b7f9 100644
--- a/scumm/smush/insane.h
+++ b/scumm/smush/insane.h
@@ -246,8 +246,8 @@ class Insane {
int32 costume4;
int32 costume6;
int32 costume5;
- int16 field_2C;
- int32 field_30;
+ int16 costumevar;
+ int32 maxframe;
int32 field_34;
};
@@ -459,10 +459,10 @@ class Insane {
int32 weaponMinRange(int32 actornum);
void switchBenWeapon(void);
void prepareScenePropScene(int32 scenePropNum, bool arg_4, bool arg_8);
- int32 calcDamage(bool arg_0, bool arg_4);
+ int32 calcBenDamage(bool arg_0, bool arg_4);
int32 weaponDamage(int32 actornum);
void proc47(int32 actornum, int32 val);
- bool weaponIsEffective(void);
+ bool weaponBenIsEffective(void);
bool actor1StateFlags(int state);
bool actor0StateFlags1(int state);
bool actor0StateFlags2(int state);
@@ -470,12 +470,12 @@ class Insane {
void init_scenePropStruct(int32 n, int32 n1, int32 actornum, int32 sound, int32 trsId,
byte r, byte g, byte b, int32 counter, int32 maxCounter,
int32 index);
- int32 setProperActorState(void);
+ int32 setBenState(void);
bool smlayer_actorNeedRedraw(int actornum, int actnum);
void reinitActors(void);
void smush_setPaletteValue(int where, int r, int g, int b);
char *handleTrsTag(int32 trsFilePtr, int32 trsId);
- void enemyOuchSound(void);
+ void ouchSoundBen(void);
void smush_setupSanWithFlu(const char *filename, int32 setupsan2, int32 step1,
int32 step2, int32 setupsan1, byte *fluPtr, int32 numFrames);
void smush_setupSanFromStart(const char *filename, int32 setupsan2, int32 step1,
@@ -494,7 +494,10 @@ class Insane {
void setEnemyAnimation(int32 actornum, int anim);
void chooseEnemyWeaponAnim(int buttons);
void switchEnemyWeapon(void);
- void enemyDustAction(void);
+ void setEnemyState(void);
+ int32 calcEnemyDamage(bool arg_0, bool arg_4);
+ void ouchSoundEnemy(void);
+ bool weaponEnemyIsEffective(void);
void blah(void);