1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 
24 
25 #include "engines/engine.h"
26 
27 #include "scumm/insane/insane.h"
28 #include "scumm/scumm_v7.h"
29 
30 namespace Scumm {
31 
enemyBenHandler(int32 actor1,int32 actor2,int32 probability)32 int32 Insane::enemyBenHandler(int32 actor1, int32 actor2, int32 probability) {
33 	int32 retval;
34 	int32 tmp;
35 
36 	retval = processMouse();
37 
38 	// Joystick support is skipped
39 
40 	retval |= processKeyboard();
41 
42 	tmp = _enemyState[EN_BEN][0] - 160;
43 	if (tmp < -160)
44 		tmp = -160;
45 
46 	if (tmp > 160)
47 		tmp = 160;
48 
49 	_actor[actor1].cursorX = tmp;
50 
51 	smush_warpMouse(_enemyState[EN_BEN][0], _enemyState[EN_BEN][1], -1);
52 
53 	return (retval & 3);
54 }
55 
turnBen(bool controllable)56 void Insane::turnBen(bool controllable) {
57 	int32 buttons;
58 
59 	switch (_currSceneId) {
60 	case 21:
61 	case 25:
62 	case 3:
63 	case 13:
64 		if (_actor[0].damage < _actor[0].maxdamage) {
65 			_actor[0].lost = false;
66 		} else {
67 			if (!_actor[0].lost && !_actor[1].lost) {
68 				_actor[0].lost = true;
69 				_actor[0].act[2].state = 36;
70 				_actor[0].act[1].state = 36;
71 				_actor[0].act[1].room = 0;
72 				_actor[0].act[0].state = 36;
73 				_actor[0].act[0].room = 0;
74 
75 				if (smlayer_isSoundRunning(95))
76 					smlayer_stopSound(95);
77 			}
78 		}
79 		buttons = 0;
80 		if (!_actor[0].lost && controllable) {
81 			buttons = actionBen();
82 			if (_currSceneId == 13)
83 				buttons &= 2;
84 			if (_currEnemy == EN_TORQUE)
85 				buttons = 0;
86 		}
87 		debug(5, "00:%d 01:%d 02:%d 03:%d", _actor[0].act[0].state,
88 				_actor[0].act[1].state, _actor[0].act[2].state, _actor[0].act[3].state);
89 		actor01Reaction(buttons);
90 		actor02Reaction(buttons);
91 		actor03Reaction(buttons);
92 		actor00Reaction(buttons);
93 		break;
94 	case 17:
95 		mineChooseRoad(processBenOnRoad(false));
96 		break;
97 	default:
98 		if (_actor[0].damage < _actor[0].maxdamage) {
99 			_actor[0].lost = false;
100 		} else {
101 			if (!_actor[0].lost && !_actor[1].lost) {
102 				queueSceneSwitch(10, 0, "wr2_ben.san", 64, 0, 0, 0);
103 				_actor[0].lost = true;
104 				_actor[0].act[2].state = 36;
105 				_actor[0].act[2].room = 0;
106 				_actor[0].act[0].state = 36;
107 				_actor[0].act[0].room = 0;
108 				_actor[0].act[1].state = 36;
109 				_actor[0].act[1].room = 0;
110 				mineChooseRoad(0);
111 				return;
112 			}
113 		}
114 
115 		if (!_actor[0].lost && controllable)
116 			mineChooseRoad(processBenOnRoad(true));
117 		else
118 			mineChooseRoad(0);
119 		break;
120 	}
121 }
122 
actionBen()123 int32 Insane::actionBen() {
124 	int32 buttons, tmp;
125 	bool doDamage = false;
126 	int sound;
127 
128 	if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
129 		sound = 59;
130 	else
131 		sound = 95;
132 
133 	if (_actor[0].enemyHandler != -1)
134 		buttons = enemyHandler(_actor[0].enemyHandler, 0, 1, _actor[0].probability);
135 	else
136 		buttons = enemyHandler(EN_TORQUE, 0, 1, _actor[0].probability);
137 
138 	if (_actor[0].tilt) {
139 		_actor[0].speed += _actor[0].cursorX / 40;
140 	} else {
141 		if (_actor[0].speed < 0)
142 			_actor[0].speed++;
143 		else
144 			_actor[0].speed--;
145 	}
146 
147 	if (_actor[0].speed > 8)
148 		_actor[0].speed = 8;
149 
150 	if (_actor[0].speed < -8)
151 		_actor[0].speed = -8;
152 
153 	_actor[0].x += _actor[0].speed;
154 
155 	if (_actor[0].x > 100)
156 		_actor[0].x--;
157 	else
158 		if (_actor[0].x < 100)
159 			_actor[0].x++;
160 
161 	if (_actor[0].x >= 0) {
162 		if (_actor[1].x - 90 <= _actor[0].x && !_actor[0].lost && !_actor[1].lost) {
163 			_val213d++;
164 			_actor[0].x = _actor[1].x - 90;
165 
166 			tmp = _actor[1].speed;
167 			_actor[1].speed = _actor[0].speed;
168 			_actor[0].speed = tmp;
169 
170 			if (_val213d > 50) {
171 				_actor[0].cursorX = -320;
172 				_val213d = 0;
173 			}
174 
175 			if (!smlayer_isSoundRunning(sound))
176 				smlayer_startSfx(sound);
177 		} else {
178 			if (smlayer_isSoundRunning(sound))
179 				smlayer_stopSound(sound);
180 
181 			_val213d = 0;
182 		}
183 	} else {
184 		_actor[0].x = 0;
185 		_actor[0].damage++; // FIXME: apparently it is a bug in original
186 							// and damage is doubled
187 		doDamage = true;
188 	}
189 
190 	if (_actor[0].x > 320) {
191 		_actor[0].x = 320;
192 		doDamage = true;
193 	}
194 
195 	if (_actor[0].x < 10 || _actor[0].x > 310 || doDamage) {
196 		_tiresRustle = 1;
197 		_actor[0].x1 = -_actor[0].x1;
198 		_actor[0].damage++; // PATCH
199 	}
200 
201 	return buttons;
202 }
203 
processBenOnRoad(bool flag)204 int32 Insane::processBenOnRoad(bool flag) {
205 	int32 buttons;
206 
207 	if (_actor[0].enemyHandler != -1)
208 		buttons = enemyHandler(_actor[0].enemyHandler, 0, 1, _actor[0].probability);
209 	else
210 		buttons = enemyHandler(EN_TORQUE, 0, 1, _actor[0].probability);
211 
212 	if (flag) {
213 		_actor[0].speed = _actor[0].tilt;
214 
215 		if (_actor[0].speed > 8)
216 			_actor[0].speed = 8;
217 
218 		if (_actor[0].speed < -8)
219 			_actor[0].speed = -8;
220 
221 		_actor[0].x += _actor[0].speed / 2 + _actor[0].speed;
222 
223 		if (_actor[0].x < 0)
224 			_actor[0].x = 0;
225 
226 		if (_actor[0].x > 320)
227 			_actor[0].x = 320;
228 	}
229 
230 	return buttons;
231 }
232 
mineChooseRoad(int32 buttons)233 void Insane::mineChooseRoad(int32 buttons) {
234 	int16 tmp;
235 
236 	if (_actor[0].field_8 < 1)
237 		return;
238 
239 	if (_actor[0].field_8 == 112) {
240 		if (_actor[0].frame < 18 || _needSceneSwitch)
241 			return;
242 
243 		queueSceneSwitch(18, 0, "fishgogg.san", 64, 0, 0, 0);
244 	} else if (_actor[0].field_8 == 1) {
245 		tmp = _actor[0].cursorX / 22;
246 
247 		switch (_currSceneId) {
248 		case 17:
249 			if (buttons & 1) {
250 				if (_mineCaveIsNear) {
251 					writeArray(1, _posCave);
252 					smush_setToFinish();
253 				}
254 
255 				if (_roadBranch && !_needSceneSwitch) {
256 					_iactSceneId2 = _iactSceneId;
257 					queueSceneSwitch(2, 0, "mineexit.san", 64, 0, 0, 0);
258 				}
259 			}
260 
261 			if ((buttons & 2) == 0 || _needSceneSwitch)
262 				return;
263 
264 			queueSceneSwitch(19, 0, "fishgog2.san", 64, 0, 0, 0);
265 			break;
266 		case 1:
267 			_actor[0].tilt = tmp;
268 
269 			if (tmp < -7)
270 				_actor[0].tilt = -7;
271 			if (tmp > 7)
272 				_actor[0].tilt = 7;
273 
274 			drawSpeedyActor(buttons);
275 
276 			if ((buttons & 1) && _currSceneId == 1 && _roadBranch && !_needSceneSwitch) {
277 				_iactSceneId2 = _iactSceneId;
278 				queueSceneSwitch(2, 0, "mineexit.san", 64, 0, 0, 0);
279 			}
280 
281 			if ((buttons & 2) == 0 || !_benHasGoggles)
282 				return;
283 
284 			_actor[0].frame = 0;
285 			_actor[0].field_8 = 112;
286 			smlayer_setActorFacing(0, 2, 26, 180);
287 			break;
288 		case 4:
289 		case 5:
290 			_actor[0].tilt = tmp;
291 
292 			if (tmp < -7)
293 				_actor[0].tilt = -7;
294 			if (tmp > 7)
295 				_actor[0].tilt = 7;
296 
297 			drawSpeedyActor(buttons);
298 
299 			if ((buttons & 1) == 0)
300 				return;
301 
302 			if (_roadBranch && !_needSceneSwitch) {
303 				_iactSceneId2 = _iactSceneId;
304 
305 				if (readArray(4) && _val211d < 3) {
306 					_val211d++;
307 					queueSceneSwitch(8, 0, "fishfear.san", 64, 0, 0, 0);
308 				} else {
309 					queueSceneSwitch(8, 0, "tomine.san", 64, 0, 0, 0);
310 				}
311 			}
312 
313 			if (_roadStop) {
314 				writeArray(1, _posBrokenTruck);
315 				writeArray(3, _val57d);
316 				smush_setToFinish();
317 			}
318 
319 			if (!_carIsBroken)
320 				return;
321 
322 			writeArray(1, _posBrokenCar);
323 			writeArray(3, _val57d);
324 			smush_setToFinish();
325 			break;
326 		case 6:
327 			_actor[0].tilt = tmp;
328 
329 			if (tmp < -7)
330 				_actor[0].tilt = -7;
331 			if (tmp > 7)
332 				_actor[0].tilt = 7;
333 
334 			drawSpeedyActor(buttons);
335 
336 			if ((buttons & 1) == 0)
337 				return;
338 
339 			if (_roadBranch && !_needSceneSwitch) {
340 				_iactSceneId2 = _iactSceneId;
341 
342 				if (readArray(4) && _val211d < 3) {
343 					_val211d++;
344 					queueSceneSwitch(7, 0, "fishfear.san", 64, 0, 0, 0);
345 				} else {
346 					queueSceneSwitch(7, 0, "tomine.san", 64, 0, 0, 0);
347 				}
348 			}
349 
350 			if (_roadStop) {
351 				writeArray(1, _posBrokenTruck);
352 				writeArray(3, _posVista);
353 				smush_setToFinish();
354 			}
355 
356 			if (!_carIsBroken)
357 				return;
358 
359 			writeArray(1, _posBrokenCar);
360 			writeArray(3, _posVista);
361 			smush_setToFinish();
362 			break;
363 		default:
364 			break;
365 		}
366 	}
367 }
368 
drawSpeedyActor(int32 buttons)369 void Insane::drawSpeedyActor(int32 buttons) {
370 	switch (_actor[0].tilt) {
371 	case -7:
372 		if (_actor[0].act[2].state != 47) {
373 			smlayer_setActorFacing(0, 2, 13, 180);
374 			_actor[0].act[2].state = 47;
375 		}
376 		break;
377 	case -6:
378 		if (_actor[0].act[2].state != 44) {
379 			smlayer_setActorFacing(0, 2, 11, 180);
380 			_actor[0].act[2].state = 44;
381 		}
382 		break;
383 	case -5:
384 		if (_actor[0].act[2].state != 43) {
385 			smlayer_setActorFacing(0, 2, 10, 180);
386 			_actor[0].act[2].state = 43;
387 		}
388 		break;
389 	case -4:
390 		if (_actor[0].act[2].state != 42) {
391 			smlayer_setActorFacing(0, 2, 9, 180);
392 			_actor[0].act[2].state = 42;
393 		}
394 		break;
395 	case -3:
396 		if (_actor[0].act[2].state != 41) {
397 			smlayer_setActorFacing(0, 2, 8, 180);
398 			_actor[0].act[2].state = 41;
399 		}
400 		break;
401 	case -2:
402 		if (_actor[0].act[2].state != 40) {
403 			smlayer_setActorFacing(0, 2, 7, 180);
404 			_actor[0].act[2].state = 40;
405 		}
406 		break;
407 	case -1:
408 		if (_actor[0].act[2].state != 39) {
409 			smlayer_setActorFacing(0, 2, 6, 180);
410 			_actor[0].act[2].state = 39;
411 		}
412 		break;
413 	case 0:
414 		if (_actor[0].act[2].state != 1) {
415 			smlayer_setActorFacing(0, 2, 22, 180);
416 			_actor[0].act[2].state = 1;
417 		}
418 		break;
419 	case 1:
420 		if (_actor[0].act[2].state != 55) {
421 			smlayer_setActorFacing(0, 2, 14, 180);
422 			_actor[0].act[2].state = 55;
423 		}
424 		break;
425 	case 2:
426 		if (_actor[0].act[2].state != 56) {
427 			smlayer_setActorFacing(0, 2, 15, 180);
428 			_actor[0].act[2].state = 56;
429 		}
430 		break;
431 	case 3:
432 		if (_actor[0].act[2].state != 57) {
433 			smlayer_setActorFacing(0, 2, 16, 180);
434 			_actor[0].act[2].state = 57;
435 		}
436 		break;
437 	case 4:
438 		if (_actor[0].act[2].state != 58) {
439 			smlayer_setActorFacing(0, 2, 17, 180);
440 			_actor[0].act[2].state = 58;
441 		}
442 		break;
443 	case 5:
444 		if (_actor[0].act[2].state != 59) {
445 			smlayer_setActorFacing(0, 2, 18, 180);
446 			_actor[0].act[2].state = 59;
447 		}
448 		break;
449 	case 6:
450 		if (_actor[0].act[2].state != 60) {
451 			smlayer_setActorFacing(0, 2, 19, 180);
452 			_actor[0].act[2].state = 60;
453 		}
454 		break;
455 	case 7:
456 		if (_actor[0].act[2].state != 50) {
457 			smlayer_setActorFacing(0, 2, 21, 180);
458 			_actor[0].act[2].state = 50;
459 		}
460 		break;
461 	default:
462 		break;
463 	}
464 
465 	if (!_actor[0].act[2].room)
466 		return;
467 
468 	smlayer_putActor(0, 2, _actor[0].x + _actor[0].x1, _actor[0].y + _actor[0].y1,
469 					 _smlayer_room2);
470 }
471 
weaponBenIsEffective()472 bool Insane::weaponBenIsEffective() {
473 	if ((_actor[1].x - _actor[0].x > weaponMaxRange(0)) ||
474 		(_actor[1].x - _actor[0].x < weaponMinRange(0)) ||
475 		!_actor[1].kicking)
476 		return false;
477 
478 	return true;
479 }
480 
calcBenDamage(bool arg_0,bool arg_4)481 int32 Insane::calcBenDamage(bool arg_0, bool arg_4) {
482 	if ((_actor[1].x - _actor[0].x > weaponMaxRange(1)) ||
483 		(_actor[1].x - _actor[0].x < weaponMinRange(1)))
484 		return 0;
485 
486 	if (_actor[0].field_44 && arg_4)
487 		return 1000;
488 
489 	if (!actor1StateFlags(_actor[0].act[2].state))
490 		return 0;
491 
492 	if (arg_0) {
493 		ouchSoundBen();
494 		_actor[0].damage += weaponDamage(1); // PATCH
495 	}
496 
497 	return 1;
498 }
499 
500 // Ben
actor02Reaction(int32 buttons)501 void Insane::actor02Reaction(int32 buttons) {
502 	int32 tmp, tmp2;
503 
504 	switch (_actor[0].act[2].state) {
505 	case 1:
506 		smlayer_setActorLayer(0, 2, 5);
507 		_actor[0].weaponClass = 2;
508 		_actor[0].kicking = false;
509 
510 		switch (_actor[0].tilt) {
511 		case -3:
512 			if (_actor[0].act[2].animTilt != -3) {
513 				smlayer_setActorFacing(0, 2, 6, 180);
514 				_actor[0].act[2].animTilt = -3;
515 			}
516 			break;
517 		case -2:
518 			if (_actor[0].field_8 == 48)
519 				smlayer_setActorFacing(0, 2, 7, 180);
520 			_actor[0].act[2].animTilt = -2;
521 			break;
522 		case -1:
523 			if (_actor[0].field_8 == 46)
524 				smlayer_setActorFacing(0, 2, 8, 180);
525 			_actor[0].act[2].animTilt = -1;
526 			break;
527 		case 0:
528 			if (_actor[0].act[2].animTilt) {
529 				smlayer_setActorFacing(0, 2, 9, 180);
530 				_actor[0].act[2].animTilt = 0;
531 			}
532 			break;
533 		case 1:
534 			if (_actor[0].field_8 == 49)
535 				smlayer_setActorFacing(0, 2, 10, 180);
536 			_actor[0].act[2].animTilt = 1;
537 			break;
538 		case 2:
539 			if (_actor[0].field_8 == 51)
540 				smlayer_setActorFacing(0, 2, 11, 180);
541 			_actor[0].act[2].animTilt = 2;
542 			break;
543 		case 3:
544 			if (_actor[0].act[2].animTilt != 3) {
545 				smlayer_setActorFacing(0, 2, 12, 180);
546 				_actor[0].act[2].animTilt = 3;
547 			}
548 			break;
549 		default:
550 			break;
551 		}
552 		_actor[0].act[2].tilt = 0;
553 		break;
554 	case 2:
555 		smlayer_setActorLayer(0, 2, 4);
556 		smlayer_setActorFacing(0, 2, 17, 180);
557 		_actor[0].kicking = true;
558 		_actor[0].weaponClass = 1;
559 		_actor[0].act[2].state = 3;
560 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
561 		if (!((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)))
562 			smlayer_startSfx(63);
563 		break;
564 	case 3:
565 		smlayer_setActorLayer(0, 2, 4);
566 		_actor[0].weaponClass = 1;
567 		if (_actor[0].act[2].frame == 2) {
568 			if (_currEnemy != EN_CAVEFISH) {
569 				tmp = calcEnemyDamage(1, 1);
570 				if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
571 					if (tmp == 1)
572 						smlayer_startSfx(50);
573 				} else {
574 					if (tmp == 1)
575 						smlayer_startSfx(60);
576 					if (tmp == 1000)
577 						smlayer_startSfx(62);
578 				}
579 			} else {
580 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
581 					(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
582 					!_actor[0].field_54)
583 					prepareScenePropScene(1, 0, 0);
584 			}
585 		}
586 		if (_actor[0].act[2].frame >= 4) {
587 			smlayer_setActorFacing(0, 2, 20, 180);
588 			_actor[0].act[2].state = 4;
589 		}
590 
591 		_actor[0].kicking = true;
592 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
593 		break;
594 	case 4:
595 		smlayer_setActorLayer(0, 2, 5);
596 		_actor[0].weaponClass = 1;
597 		_actor[0].kicking = false;
598 		if (_actor[0].act[2].frame >= 2) {
599 			smlayer_setActorFacing(0, 2, 9, 180);
600 			_actor[0].act[2].state = 1;
601 			_actor[0].act[2].animTilt = -1000;
602 			_actor[0].weaponClass = 2;
603 		}
604 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
605 		break;
606 	case 5:
607 		smlayer_setActorLayer(0, 2, 5);
608 		break;
609 	case 6:
610 		smlayer_setActorLayer(0, 2, 4);
611 		_actor[0].weaponClass = 2;
612 		_actor[0].newFacingFlag = 1;
613 		_actor[0].kicking = false;
614 		smlayer_setActorCostume(0, 2, readArray(22));
615 		smlayer_setActorFacing(0, 2, 19, 180);
616 		_actor[0].act[2].state = 7;
617 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
618 		smlayer_startSfx(66);
619 		break;
620 	case 7:
621 		smlayer_setActorLayer(0, 2, 4);
622 		_actor[0].weaponClass = 2;
623 		_actor[0].newFacingFlag = 1;
624 		_actor[0].kicking = false;
625 		if (_actor[0].act[2].frame >= 1) {
626 			smlayer_setActorFacing(0, 2, 20, 180);
627 			_actor[0].act[2].state = 8;
628 		}
629 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
630 		break;
631 	case 8:
632 		smlayer_setActorLayer(0, 2, 4);
633 		_actor[0].weaponClass = 2;
634 		_actor[0].newFacingFlag = 1;
635 		_actor[0].kicking = false;
636 		if ((_actor[0].act[2].frame == 3) && (calcEnemyDamage(0, 0) == 1)) {
637 			_actor[1].damage += weaponDamage(0);
638 			smlayer_startSfx(64);
639 			_actor[1].cursorX = 320;
640 		}
641 		if (_actor[0].act[2].frame >= 5) {
642 			smlayer_setActorFacing(0, 2, 21, 180);
643 			_actor[0].act[2].state = 9;
644 		}
645 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
646 		break;
647 	case 9:
648 		smlayer_setActorLayer(0, 2, 5);
649 		_actor[0].weaponClass = 2;
650 		_actor[0].newFacingFlag = 1;
651 		_actor[0].kicking = false;
652 		if (_actor[0].act[2].frame >= 3) {
653 			smlayer_setActorCostume(0, 2, readArray(12));
654 			_actor[0].newFacingFlag = 2;
655 			_actor[0].act[2].state = 1;
656 		}
657 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
658 		break;
659 	case 10:
660 		smlayer_setActorLayer(0, 2, 4);
661 		_actor[0].weaponClass = 1;
662 		_actor[0].kicking = true;
663 		smlayer_setActorFacing(0, 2, 19, 180);
664 		_actor[0].act[2].state = 11;
665 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
666 		smlayer_startSfx(75);
667 		break;
668 	case 11:
669 		smlayer_setActorLayer(0, 2, 4);
670 		_actor[0].weaponClass = 1;
671 		_actor[0].kicking = true;
672 		if (_actor[0].act[2].frame >= 2) {
673 			if (_currEnemy == EN_VULTM2) {
674 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
675 					(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
676 					calcEnemyDamage(0, 0)) {
677 					smlayer_setActorFacing(0, 2, 20, 180);
678 					_actor[0].act[2].state = 97;
679 					_actor[0].act[2].room = 0;
680 					_actor[0].act[1].room = 0;
681 					_actor[0].act[0].room = 0;
682 					smlayer_setActorLayer(0, 2, 25);
683 					smlayer_setActorCostume(1, 2, readArray(45));
684 					smlayer_setActorFacing(1, 2, 6, 180);
685 					smlayer_startSfx(101);
686 					_actor[1].act[2].state = 97;
687 					_actor[1].lost = true;
688 					_actor[1].act[2].room = 1;
689 					_actor[1].act[1].room = 0;
690 					_actor[1].act[0].room = 0;
691 				} else {
692 					smlayer_setActorFacing(0, 2, 20, 180);
693 					_actor[0].act[2].state = 12;
694 				}
695 			} else {
696 				smlayer_setActorFacing(0, 2, 20, 180);
697 				_actor[0].act[2].state = 12;
698 			}
699 		}
700 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
701 		break;
702 	case 12:
703 		smlayer_setActorLayer(0, 2, 4);
704 		_actor[0].weaponClass = 1;
705 		_actor[0].kicking = true;
706 		if (_actor[0].act[2].frame >= 1) {
707 			if (_currEnemy != EN_CAVEFISH) {
708 				switch (_actor[1].weapon) {
709 				case INV_CHAIN:
710 				case INV_CHAINSAW:
711 				case INV_MACE:
712 				case INV_2X4:
713 				case INV_DUST:
714 					tmp = calcEnemyDamage(1, 1);
715 					if (tmp == 1)
716 						smlayer_startSfx(73);
717 					if (tmp == 1000)
718 						smlayer_startSfx(74);
719 					break;
720 				default:
721 					if (calcEnemyDamage(1, 0) == 1)
722 						smlayer_startSfx(73);
723 					break;
724 				}
725 			} else {
726 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
727 					(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
728 					!_actor[0].field_54)
729 					prepareScenePropScene(1, 0, 0);
730 
731 			}
732 			smlayer_setActorFacing(0, 2, 21, 180);
733 			_actor[0].act[2].state = 13;
734 		}
735 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
736 		break;
737 	case 13:
738 		smlayer_setActorLayer(0, 2, 5);
739 		_actor[0].weaponClass = 1;
740 		_actor[0].kicking = false;
741 		if (_actor[0].act[2].frame >= 3) {
742 			smlayer_setActorFacing(0, 2, 25, 180);
743 			_actor[0].act[2].state = 63;
744 		}
745 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
746 		break;
747 	case 14:
748 		smlayer_setActorLayer(0, 2, 8);
749 		_actor[0].weaponClass = 1;
750 		_actor[0].kicking = true;
751 		smlayer_setActorFacing(0, 2, 19, 180);
752 		_actor[0].act[2].state = 15;
753 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
754 		smlayer_startSfx(78);
755 		break;
756 	case 15:
757 		smlayer_setActorLayer(0, 2, 8);
758 		_actor[0].weaponClass = 1;
759 		_actor[0].kicking = true;
760 		if (_actor[0].act[2].frame >= 2) {
761 			switch (_actor[1].weapon) {
762 			case INV_CHAIN:
763 			case INV_CHAINSAW:
764 				if (weaponBenIsEffective()) {
765 					smlayer_setActorFacing(0, 2, 22, 180);
766 					_actor[0].act[2].state = 81;
767 				} else {
768 					smlayer_setActorFacing(0, 2, 20, 180);
769 					_actor[0].act[2].state = 16;
770 				}
771 				break;
772 			case INV_MACE:
773 				if (!_actor[1].kicking || _actor[1].field_44)
774 					if (actor1StateFlags(_actor[1].act[2].state)) {
775 						smlayer_setActorFacing(0, 2, 20, 180);
776 						_actor[0].act[2].state = 106;
777 						break;
778 					}
779 				break;
780 			default:
781 				smlayer_setActorFacing(0, 2, 20, 180);
782 				_actor[0].act[2].state = 16;
783 				break;
784 			}
785 		}
786 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
787 		break;
788 	case 16:
789 		smlayer_setActorLayer(0, 2, 8);
790 		_actor[0].weaponClass = 1;
791 		_actor[0].kicking = true;
792 		if (_actor[0].act[2].frame >= 1) {
793 			switch (_actor[1].weapon) {
794 			case INV_CHAIN:
795 			case INV_CHAINSAW:
796 				tmp = calcEnemyDamage(1, 1);
797 				if (tmp == 1)
798 					smlayer_startSfx(76);
799 				if (tmp == 1000)
800 					smlayer_startSfx(77);
801 				break;
802 			case INV_BOOT:
803 				calcEnemyDamage(0, 1);
804 				break;
805 			case INV_DUST:
806 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
807 					(_actor[1].x - _actor[0].x >= weaponMinRange(0))) {
808 					smlayer_startSfx(76);
809 					_actor[1].damage += weaponDamage(0);
810 				}
811 				break;
812 			default:
813 				if (calcEnemyDamage(1, 0))
814 					smlayer_startSfx(76);
815 				break;
816 			}
817 			smlayer_setActorFacing(0, 2, 21, 180);
818 			_actor[0].act[2].state = 17;
819 		}
820 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
821 		break;
822 	case 17:
823 		smlayer_setActorLayer(0, 2, 5);
824 		_actor[0].weaponClass = 1;
825 		_actor[0].kicking = false;
826 		if (_actor[0].act[2].frame >= 2) {
827 			smlayer_setActorFacing(0, 2, 26, 180);
828 			_actor[0].act[2].state = 64;
829 			smlayer_stopSound(76);
830 		}
831 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
832 		break;
833 	case 18:
834 		smlayer_setActorLayer(0, 2, 4);
835 		_actor[0].weaponClass = 1;
836 		_actor[0].kicking = true;
837 		smlayer_setActorFacing(0, 2, 19, 180);
838 		_actor[0].act[2].state = 19;
839 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
840 		smlayer_startSfx(69);
841 		break;
842 	case 19:
843 		smlayer_setActorLayer(0, 2, 4);
844 		_actor[0].weaponClass = 1;
845 		_actor[0].kicking = true;
846 		if (_actor[0].act[2].frame >= 1) {
847 			switch (_actor[1].weapon) {
848 			case INV_CHAIN:
849 				if (_actor[1].kicking) {
850 					_actor[1].act[2].state = 108;
851 					_actor[0].act[2].state = 110;
852 				} else {
853 					smlayer_setActorFacing(0, 2, 20, 180);
854 					_actor[0].act[2].state = 20;
855 				}
856 				break;
857 			case INV_CHAINSAW:
858 				if (_actor[1].kicking || _actor[1].field_44)
859 					_actor[0].act[2].state = 106;
860 				else {
861 					smlayer_setActorFacing(0, 2, 20, 180);
862 					_actor[0].act[2].state = 20;
863 				}
864 				break;
865 			case INV_MACE:
866 			case INV_2X4:
867 				if (weaponBenIsEffective()) {
868 					smlayer_setActorFacing(0, 2, 22, 180);
869 					_actor[0].act[2].state = 77;
870 					break;
871 				}
872 				// fall through
873 			default:
874 				smlayer_setActorFacing(0, 2, 20, 180);
875 				_actor[0].act[2].state = 20;
876 				break;
877 			}
878 		}
879 
880 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
881 		break;
882 	case 20:
883 		smlayer_setActorLayer(0, 2, 4);
884 		_actor[0].weaponClass = 1;
885 		_actor[0].kicking = true;
886 		if (_actor[0].act[2].frame >= 1) {
887 			if (_currEnemy != EN_CAVEFISH) {
888 				switch (_actor[1].weapon) {
889 				case INV_CHAINSAW:
890 				case INV_MACE:
891 				case INV_2X4:
892 				case INV_BOOT:
893 					tmp = calcEnemyDamage(1, 1);
894 					if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
895 						if (tmp == 1)
896 							smlayer_startSfx(52);
897 						if (tmp == 1000)
898 							smlayer_startSfx(56);
899 					} else {
900 						if (tmp == 1)
901 							smlayer_startSfx(67);
902 						if (tmp == 1000)
903 							smlayer_startSfx(68);
904 					}
905 					break;
906 				default:
907 					if (calcEnemyDamage(1, 0))
908 						smlayer_startSfx(67);
909 					break;
910 				}
911 			} else {
912 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
913 					(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
914 					!_actor[0].field_54)
915 					prepareScenePropScene(1, 0, 0);
916 			}
917 			smlayer_setActorFacing(0, 2, 21, 180);
918 			_actor[0].act[2].state = 21;
919 		}
920 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
921 		break;
922 	case 21:
923 		smlayer_setActorLayer(0, 2, 5);
924 		_actor[0].weaponClass = 1;
925 		_actor[0].kicking = false;
926 		if (_actor[0].act[2].frame >= 6) {
927 			smlayer_setActorFacing(0, 2, 25, 180);
928 			_actor[0].act[2].state = 65;
929 		}
930 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
931 		break;
932 	case 22:
933 		smlayer_setActorLayer(0, 2, 6);
934 		_actor[0].weaponClass = 0;
935 		_actor[0].kicking = true;
936 		smlayer_setActorFacing(0, 2, 19, 180);
937 		_actor[0].act[2].state = 23;
938 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
939 		smlayer_startSfx(81);
940 		break;
941 	case 23:
942 		smlayer_setActorLayer(0, 2, 6);
943 		_actor[0].weaponClass = 0;
944 		_actor[0].kicking = true;
945 		if (_actor[0].act[2].frame >= 4) {
946 			switch (_actor[1].weapon) {
947 			case INV_CHAIN:
948 			case INV_CHAINSAW:
949 			case INV_MACE:
950 			case INV_2X4:
951 			case INV_BOOT:
952 			case INV_DUST:
953 				if (weaponBenIsEffective()) {
954 					smlayer_setActorFacing(0, 2, 22, 180);
955 					_actor[0].act[2].state = 83;
956 					break;
957 				}
958 				// fall through
959 			default:
960 				smlayer_setActorFacing(0, 2, 20, 180);
961 				_actor[0].act[2].state = 24;
962 				break;
963 			}
964 		}
965 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
966 		break;
967 	case 24:
968 		smlayer_setActorLayer(0, 2, 4);
969 		_actor[0].weaponClass = 0;
970 		_actor[0].kicking = true;
971 		if (_actor[0].act[2].frame >= 1) {
972 			switch (_actor[1].weapon) {
973 			case INV_CHAIN:
974 			case INV_CHAINSAW:
975 			case INV_MACE:
976 			case INV_2X4:
977 			case INV_BOOT:
978 			case INV_DUST:
979 				tmp = calcEnemyDamage(1, 1);
980 				if (tmp == 1) {
981 					if (_currEnemy == EN_CAVEFISH) {
982 						_actor[1].lost = true;
983 						_actor[1].act[2].state = 102;
984 						_actor[1].damage = _actor[1].maxdamage + 10;
985 					}
986 					smlayer_startSfx(79);
987 				}
988 				if (tmp == 1000)
989 					smlayer_startSfx(80);
990 				break;
991 			default:
992 				if (!calcEnemyDamage(1, 0))
993 					smlayer_startSfx(79);
994 				break;
995 			}
996 			smlayer_setActorFacing(0, 2, 21, 180);
997 			_actor[0].act[2].state = 25;
998 		}
999 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1000 		break;
1001 	case 25:
1002 		smlayer_setActorLayer(0, 2, 5);
1003 		_actor[0].weaponClass = 0;
1004 		_actor[0].kicking = false;
1005 		if (_actor[0].act[2].frame >= 6) {
1006 			smlayer_setActorFacing(0, 2, 25, 180);
1007 			_actor[0].act[2].state = 66;
1008 			_actor[0].weaponClass = 1;
1009 		}
1010 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1011 		break;
1012 	case 26:
1013 		smlayer_setActorLayer(0, 2, 4);
1014 		_actor[0].weaponClass = 1;
1015 		_actor[0].kicking = true;
1016 		smlayer_setActorFacing(0, 2, 19, 180);
1017 		_actor[0].act[2].state = 27;
1018 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1019 		if (!((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)))
1020 			smlayer_startSfx(72);
1021 		break;
1022 	case 27:
1023 		smlayer_setActorLayer(0, 2, 4);
1024 		_actor[0].weaponClass = 1;
1025 		_actor[0].kicking = true;
1026 		if (_actor[0].act[2].frame >= 1) {
1027 			switch (_actor[1].weapon) {
1028 			case INV_CHAIN:
1029 			case INV_CHAINSAW:
1030 			case INV_MACE:
1031 			case INV_2X4:
1032 			case INV_BOOT:
1033 			case INV_DUST:
1034 				if (weaponBenIsEffective()) {
1035 					smlayer_setActorFacing(0, 2, 22, 180);
1036 					_actor[0].act[2].state = 75;
1037 					break;
1038 				}
1039 				// fall through
1040 			default:
1041 				smlayer_setActorFacing(0, 2, 20, 180);
1042 				_actor[0].act[2].state = 28;
1043 				break;
1044 			}
1045 		}
1046 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1047 		break;
1048 	case 28:
1049 		smlayer_setActorLayer(0, 2, 4);
1050 		_actor[0].weaponClass = 1;
1051 		_actor[0].kicking = true;
1052 		if (_actor[0].act[2].frame >= 3) {
1053 			if (_currEnemy != EN_CAVEFISH) {
1054 				switch (_actor[1].weapon) {
1055 				case INV_CHAIN:
1056 				case INV_CHAINSAW:
1057 				case INV_MACE:
1058 				case INV_2X4:
1059 				case INV_BOOT:
1060 				case INV_DUST:
1061 					tmp = calcEnemyDamage(1, 1);
1062 					if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
1063 						if (tmp == 1)
1064 							smlayer_startSfx(58);
1065 						if (tmp == 1000)
1066 							smlayer_startSfx(56);
1067 					} else {
1068 						if (tmp == 1)
1069 							smlayer_startSfx(70);
1070 						if (tmp == 1000)
1071 							smlayer_startSfx(71);
1072 					}
1073 					break;
1074 				case INV_HAND:
1075 					if (!calcEnemyDamage(1, 0))
1076 						smlayer_startSfx(70);
1077 					break;
1078 				default:
1079 					break;
1080 				}
1081 			} else {
1082 				if ((_actor[1].x - _actor[0].x <= weaponMaxRange(0)) &&
1083 					(_actor[1].x - _actor[0].x >= weaponMinRange(0)) &&
1084 					!_actor[0].field_54)
1085 					prepareScenePropScene(1, 0, 0);
1086 			}
1087 			smlayer_setActorFacing(0, 2, 21, 180);
1088 			_actor[0].act[2].state = 29;
1089 		}
1090 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1091 		break;
1092 	case 29:
1093 		smlayer_setActorLayer(0, 2, 5);
1094 		_actor[0].weaponClass = 1;
1095 		_actor[0].kicking = false;
1096 		if (_actor[0].act[2].frame >= 6) {
1097 			smlayer_setActorFacing(0, 2, 25, 180);
1098 			_actor[0].act[2].state = 62;
1099 		}
1100 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1101 		break;
1102 	case 30:
1103 		smlayer_setActorLayer(0, 2, 4);
1104 		_actor[0].weaponClass = 1;
1105 		smlayer_setActorCostume(0, 2, readArray(21));
1106 		smlayer_setActorFacing(0, 2, 18, 180);
1107 		_actor[0].act[2].state = 31;
1108 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1109 		smlayer_startSfx(84);
1110 		break;
1111 	case 31:
1112 		smlayer_setActorLayer(0, 2, 4);
1113 		_actor[0].weaponClass = 1;
1114 		if (_actor[0].act[2].frame >= 6) {
1115 			smlayer_setActorFacing(0, 2, 20, 180);
1116 			_actor[0].act[2].state = 32;
1117 		}
1118 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1119 		break;
1120 	case 32:
1121 		smlayer_setActorLayer(0, 2, 4);
1122 		_actor[0].weaponClass = 1;
1123 		if (_actor[0].act[2].frame >= 5) {
1124 			switch (_currEnemy) {
1125 			case EN_ROTT3:
1126 				if (calcEnemyDamage(0, 0))
1127 					_actor[1].act[2].state = 115;
1128 				break;
1129 			case EN_VULTF2:
1130 				if (calcEnemyDamage(0, 0))
1131 					_actor[1].act[2].state = 113;
1132 				break;
1133 			default:
1134 				tmp = calcEnemyDamage(1, 1);
1135 				if (tmp == 1)
1136 					smlayer_startSfx(82);
1137 				if (tmp == 1000)
1138 					smlayer_startSfx(83);
1139 				break;
1140 			}
1141 			smlayer_setActorFacing(0, 2, 21, 180);
1142 			_actor[0].act[2].state = 33;
1143 		}
1144 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1145 		break;
1146 	case 33:
1147 		smlayer_setActorLayer(0, 2, 5);
1148 		_actor[0].weaponClass = 1;
1149 		_actor[0].kicking = false;
1150 		if (_actor[0].act[2].frame >= 5) {
1151 			smlayer_setActorCostume(0, 2, readArray(12));
1152 			_actor[0].act[2].state = 1;
1153 		}
1154 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1155 		break;
1156 	case 34:
1157 		smlayer_setActorLayer(0, 2, 5);
1158 		_actor[0].kicking = false;
1159 
1160 		if (!smlayer_actorNeedRedraw(0, 2)) {
1161 			setBenState();
1162 			_actor[0].act[2].tilt = 0;
1163 			// for some reason there is no break at this
1164 			// place, so tilt gets overridden on next line
1165 		}
1166 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1167 		break;
1168 	case 35:
1169 		smlayer_setActorLayer(0, 2, 5);
1170 		_actor[0].kicking = false;
1171 
1172 		if (!smlayer_actorNeedRedraw(0, 2)) {
1173 			switchBenWeapon();
1174 			_actor[0].act[2].state = 1;
1175 		}
1176 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1177 		break;
1178 	case 36:
1179 		_actor[0].lost = true;
1180 		smlayer_setActorLayer(0, 2, 5);
1181 		_actor[0].kicking = false;
1182 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1183 			smlayer_setActorCostume(0, 2, readArray(17));
1184 		else
1185 			smlayer_setActorCostume(0, 2, readArray(18));
1186 		smlayer_setActorFacing(0, 2, 6, 180);
1187 		smlayer_startSfx(96);
1188 		switch (_currEnemy) {
1189 		case EN_ROTT1:
1190 			prepareScenePropScene(33, 0, 0);
1191 			break;
1192 		case EN_ROTT2:
1193 			tmp = _vm->_rnd.getRandomNumber(4);
1194 			if (!tmp)
1195 				prepareScenePropScene(35, 0, 0);
1196 			if (tmp == 3)
1197 				prepareScenePropScene(36, 0, 0);
1198 			break;
1199 		case EN_VULTF1:
1200 			prepareScenePropScene(6, 0, 0);
1201 			break;
1202 		case EN_VULTM1:
1203 			tmp = _vm->_rnd.getRandomNumber(4);
1204 			if (!tmp)
1205 				prepareScenePropScene(40, 0, 0);
1206 			if (tmp == 3)
1207 				prepareScenePropScene(41, 0, 0);
1208 			break;
1209 		default:
1210 			break;
1211 		}
1212 		_actor[0].act[2].state = 37;
1213 		break;
1214 	case 37:
1215 		smlayer_setActorLayer(0, 2, 25);
1216 		_actor[0].cursorX = 0;
1217 		_actor[0].kicking = false;
1218 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
1219 			if (_actor[0].act[2].frame >= 28) {
1220 					queueSceneSwitch(9, 0, "bencrshe.san", 64, 0, 0, 0);
1221 					_actor[0].act[2].state = 38;
1222 			}
1223 		} else if (_actor[0].act[2].frame >= 18 ||
1224 			(_actor[0].x < 50 && _actor[0].act[2].frame >= 10) ||
1225 			 (_actor[0].x > 270 && _actor[0].act[2].frame >= 10)) {
1226 			if (_currSceneId == 21) {
1227 				queueSceneSwitch(23, 0, "benflip.san", 64, 0, 0, 0);
1228 			} else {
1229 				switch (_currEnemy) {
1230 				case EN_ROTT1:
1231 				case EN_ROTT2:
1232 				case EN_ROTT3:
1233 					if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1234 						queueSceneSwitch(9, 0, "bencrshe.san", 64, 0, 0, 0);
1235 					else
1236 						queueSceneSwitch(9, 0, "wr2_benr.san", 64, 0, 0, 0);
1237 					break;
1238 				case EN_VULTF1:
1239 				case EN_VULTM1:
1240 				case EN_VULTF2:
1241 				case EN_VULTM2:
1242 					queueSceneSwitch(9, 0, "wr2_benv.san", 64, 0, 0, 0);
1243 					break;
1244 				case EN_CAVEFISH:
1245 					queueSceneSwitch(9, 0, "wr2_benc.san", 64, 0, 0, 0);
1246 					break;
1247 				default:
1248 					queueSceneSwitch(9, 0, "wr2_ben.san", 64, 0, 0, 0);
1249 					break;
1250 				}
1251 			}
1252 			_actor[0].act[2].state = 38;
1253 		}
1254 		break;
1255 	case 38:
1256 		if (_actor[0].act[2].frame >= 36) {
1257 			_actor[0].act[2].frame = 0;
1258 			if (_currSceneId == 21) {
1259 				queueSceneSwitch(23, 0, "benflip.san", 64, 0, 0, 0);
1260 			} else {
1261 				switch (_currEnemy) {
1262 				case EN_ROTT1:
1263 				case EN_ROTT2:
1264 				case EN_ROTT3:
1265 					queueSceneSwitch(9, 0, "wr2_benr.san", 64, 0, 0, 0);
1266 					break;
1267 				case EN_VULTF1:
1268 				case EN_VULTM1:
1269 				case EN_VULTF2:
1270 				case EN_VULTM2:
1271 					queueSceneSwitch(9, 0, "wr2_benv.san", 64, 0, 0, 0);
1272 					break;
1273 				case EN_CAVEFISH:
1274 					queueSceneSwitch(9, 0, "wr2_benc.san", 64, 0, 0, 0);
1275 					break;
1276 				default:
1277 					queueSceneSwitch(9, 0, "wr2_ben.san", 64, 0, 0, 0);
1278 					break;
1279 				}
1280 			}
1281 			_actor[0].act[2].state = 38;
1282 		}
1283 		break;
1284 	case 63:
1285 		smlayer_setActorLayer(0, 2, 5);
1286 		if (_actor[0].act[2].animTilt) {
1287 			smlayer_setActorFacing(0, 2, 25, 180);
1288 			_actor[0].act[2].animTilt = 0;
1289 		}
1290 		_actor[0].weaponClass = 1;
1291 		_actor[0].kicking = false;
1292 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1293 		break;
1294 	case 64:
1295 		smlayer_setActorLayer(0, 2, 5);
1296 		if (_actor[0].act[2].animTilt) {
1297 			smlayer_setActorFacing(0, 2, 26, 180);
1298 			_actor[0].act[2].animTilt = 0;
1299 		}
1300 		_actor[0].weaponClass = 1;
1301 		_actor[0].kicking = false;
1302 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1303 		break;
1304 	case 65:
1305 		smlayer_setActorLayer(0, 2, 5);
1306 		if (_actor[0].act[2].animTilt) {
1307 			smlayer_setActorFacing(0, 2, 25, 180);
1308 			_actor[0].act[2].animTilt = 0;
1309 		}
1310 		_actor[0].weaponClass = 1;
1311 		_actor[0].kicking = false;
1312 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1313 		break;
1314 	case 66:
1315 		smlayer_setActorLayer(0, 2, 5);
1316 		if (_actor[0].act[2].animTilt) {
1317 			smlayer_setActorFacing(0, 2, 25, 180);
1318 			_actor[0].act[2].animTilt = 0;
1319 		}
1320 		_actor[0].weaponClass = 1;
1321 		_actor[0].kicking = false;
1322 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1323 		break;
1324 	case 62:
1325 		smlayer_setActorLayer(0, 2, 5);
1326 		if (_actor[0].act[2].animTilt) {
1327 			smlayer_setActorFacing(0, 2, 25, 180);
1328 			_actor[0].act[2].animTilt = 0;
1329 		}
1330 		_actor[0].weaponClass = 1;
1331 		_actor[0].kicking = false;
1332 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1333 		break;
1334 	case 73:
1335 		smlayer_setActorLayer(0, 2, 6);
1336 		_actor[0].weaponClass = 1;
1337 		_actor[0].kicking = false;
1338 		_actor[0].field_44 = true;
1339 		if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) {
1340 			smlayer_setActorFacing(0, 2, 19, 180);
1341 			_actor[0].act[2].state = 74;
1342 		}
1343 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1344 		break;
1345 	case 74:
1346 		smlayer_setActorLayer(0, 2, 6);
1347 		_actor[0].weaponClass = 1;
1348 		_actor[0].kicking = false;
1349 		_actor[0].field_44 = false;
1350 		if (_actor[0].act[2].frame >= 2) {
1351 			smlayer_setActorFacing(0, 2, 9, 180);
1352 			_actor[0].act[2].state = 1;
1353 			_actor[0].weaponClass = 2;
1354 		}
1355 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1356 		break;
1357 	case 75:
1358 		smlayer_setActorLayer(0, 2, 6);
1359 		_actor[0].weaponClass = 1;
1360 		_actor[0].kicking = false;
1361 		_actor[0].field_44 = true;
1362 		if (_actor[0].act[2].frame >= 4 && !_kickBenProgress) {
1363 			smlayer_setActorFacing(0, 2, 23, 180);
1364 			_actor[0].act[2].state = 76;
1365 		}
1366 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1367 		break;
1368 	case 76:
1369 		smlayer_setActorLayer(0, 2, 6);
1370 		_actor[0].weaponClass = 1;
1371 		_actor[0].kicking = false;
1372 		_actor[0].field_44 = false;
1373 		if (_actor[0].act[2].frame >= 4) {
1374 			smlayer_setActorFacing(0, 2, 25, 180);
1375 			_actor[0].act[2].state = 62;
1376 		}
1377 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1378 		break;
1379 	case 77:
1380 		smlayer_setActorLayer(0, 2, 6);
1381 		_actor[0].weaponClass = 1;
1382 		_actor[0].kicking = false;
1383 		_actor[0].field_44 = true;
1384 		if (_actor[0].act[2].frame >= 2) {
1385 			smlayer_setActorFacing(0, 2, 23, 180);
1386 			_actor[0].act[2].state = 78;
1387 		}
1388 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1389 		break;
1390 	case 78:
1391 		smlayer_setActorLayer(0, 2, 6);
1392 		_actor[0].weaponClass = 1;
1393 		_actor[0].kicking = false;
1394 		_actor[0].field_44 = false;
1395 		if (_actor[0].act[2].frame >= 5) {
1396 			smlayer_setActorFacing(0, 2, 25, 180);
1397 			_actor[0].act[2].state = 65;
1398 		}
1399 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1400 		break;
1401 	case 79:
1402 		smlayer_setActorLayer(0, 2, 6);
1403 		_actor[0].weaponClass = 1;
1404 		_actor[0].kicking = false;
1405 		_actor[0].field_44 = true;
1406 		if (_actor[0].act[2].frame >= 2) {
1407 			smlayer_setActorFacing(0, 2, 23, 180);
1408 			_actor[0].act[2].state = 80;
1409 		}
1410 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1411 		break;
1412 	case 80:
1413 		smlayer_setActorLayer(0, 2, 6);
1414 		_actor[0].weaponClass = 1;
1415 		_actor[0].kicking = false;
1416 		_actor[0].field_44 = false;
1417 		if (_actor[0].act[2].frame >= 6) {
1418 			smlayer_setActorFacing(0, 2, 25, 180);
1419 			_actor[0].act[2].state = 63;
1420 		}
1421 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1422 		break;
1423 	case 81:
1424 		smlayer_setActorLayer(0, 2, 6);
1425 		_actor[0].weaponClass = 1;
1426 		_actor[0].kicking = false;
1427 		_actor[0].field_44 = true;
1428 		if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) {
1429 			smlayer_setActorFacing(0, 2, 23, 180);
1430 			_actor[0].act[2].state = 82;
1431 		}
1432 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1433 		break;
1434 	case 82:
1435 		smlayer_setActorLayer(0, 2, 6);
1436 		_actor[0].weaponClass = 1;
1437 		_actor[0].kicking = false;
1438 		_actor[0].field_44 = false;
1439 		if (_actor[0].act[2].frame >= 3) {
1440 			smlayer_setActorFacing(0, 2, 26, 180);
1441 			_actor[0].act[2].state = 64;
1442 		}
1443 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1444 		break;
1445 	case 83:
1446 		smlayer_setActorLayer(0, 2, 6);
1447 		_actor[0].weaponClass = 0;
1448 		_actor[0].kicking = false;
1449 		_actor[0].field_44 = true;
1450 		if (_actor[0].act[2].frame >= 2 && !_kickBenProgress) {
1451 			smlayer_setActorFacing(0, 2, 23, 180);
1452 			_actor[0].act[2].state = 84;
1453 		}
1454 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1455 		break;
1456 	case 84:
1457 		smlayer_setActorLayer(0, 2, 6);
1458 		_actor[0].weaponClass = 0;
1459 		_actor[0].kicking = false;
1460 		_actor[0].field_44 = false;
1461 		if (_actor[0].act[2].frame >= 5) {
1462 			smlayer_setActorFacing(0, 2, 25, 180);
1463 			_actor[0].act[2].state = 66;
1464 		}
1465 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1466 		break;
1467 	case 97:
1468 		smlayer_setActorLayer(0, 2, 5);
1469 		_actor[0].weaponClass = 1;
1470 		_actor[0].kicking = true;
1471 		if (_actor[0].act[2].frame >= 5) {
1472 			_actor[0].act[2].room = 1;
1473 			_actor[0].act[1].room = 1;
1474 			_actor[0].act[0].room = 1;
1475 			smlayer_setActorFacing(0, 2, 21, 180);
1476 			_actor[0].act[2].state = 13;
1477 			_actor[0].x = _actor[1].x - 116;
1478 		}
1479 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1480 		break;
1481 	case 104:
1482 		smlayer_setActorLayer(0, 2, 5);
1483 		_actor[0].weaponClass = 1;
1484 		_actor[0].kicking = false;
1485 		smlayer_setActorFacing(0, 2, 28, 180);
1486 		_actor[0].act[2].state = 105;
1487 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1488 		break;
1489 	case 105:
1490 		smlayer_setActorLayer(0, 2, 5);
1491 		_actor[0].weaponClass = 1;
1492 		_actor[0].kicking = false;
1493 		if (_actor[0].act[2].frame >= 5) {
1494 			_actor[0].act[2].state = 1;
1495 			_actor[0].inventory[INV_MACE] = 0;
1496 			smlayer_startVoice(318);
1497 			switchBenWeapon();
1498 		}
1499 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1500 		break;
1501 	case 106:
1502 		smlayer_setActorLayer(0, 2, 5);
1503 		_actor[0].weaponClass = 1;
1504 		_actor[0].kicking = false;
1505 		smlayer_setActorFacing(0, 2, 29, 180);
1506 		_actor[0].act[2].state = 107;
1507 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1508 		break;
1509 	case 107:
1510 		smlayer_setActorLayer(0, 2, 5);
1511 		_actor[0].weaponClass = 1;
1512 		_actor[0].kicking = false;
1513 		if (_actor[0].act[2].frame >= 9) {
1514 			_actor[0].act[2].state = 1;
1515 			_actor[0].inventory[INV_MACE] = 0;
1516 			smlayer_startVoice(318);
1517 			switchBenWeapon();
1518 		}
1519 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1520 		break;
1521 	case 108:
1522 		smlayer_setActorLayer(0, 2, 5);
1523 		_actor[0].weaponClass = 1;
1524 		_actor[0].kicking = false;
1525 		smlayer_setActorFacing(0, 2, 28, 180);
1526 		_actor[0].act[2].state = 109;
1527 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1528 		break;
1529 	case 109:
1530 		smlayer_setActorLayer(0, 2, 5);
1531 		_actor[0].weaponClass = 1;
1532 		_actor[0].kicking = false;
1533 		if (_actor[0].act[2].frame >= 5) {
1534 			_actor[0].act[2].state = 1;
1535 			_actor[0].inventory[INV_CHAIN] = 0; // Chain
1536 			smlayer_startVoice(318);
1537 			switchBenWeapon();
1538 		}
1539 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1540 		break;
1541 	case 110:
1542 		smlayer_setActorLayer(0, 2, 4);
1543 		_actor[0].weaponClass = 1;
1544 		_actor[0].kicking = false;
1545 		smlayer_setActorFacing(0, 2, 30, 180);
1546 		_actor[0].act[2].state = 111;
1547 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1548 		break;
1549 	case 111:
1550 		smlayer_setActorLayer(0, 2, 4);
1551 		_actor[0].weaponClass = 1;
1552 		_actor[0].kicking = false;
1553 		if (_actor[0].act[2].frame >= 7) {
1554 			smlayer_setActorFacing(0, 2, 25, 180);
1555 			_actor[0].act[2].state = 65;
1556 			_actor[0].inventory[INV_CHAIN] = 1; // Chain
1557 		}
1558 		_actor[0].act[2].tilt = calcTilt(_actor[0].tilt);
1559 		break;
1560 	default:
1561 		break;
1562 	}
1563 	tmp = _actor[0].x + _actor[0].act[2].tilt + 17 + _actor[0].x1;
1564 	tmp2 = _actor[0].y + _actor[0].y1 - 98;
1565 
1566 	if (_actor[0].act[2].room)
1567 		smlayer_putActor(0, 2, tmp, tmp2, _smlayer_room2);
1568 	else
1569 		smlayer_putActor(0, 2, tmp, tmp2, _smlayer_room);
1570 }
1571 
1572 // Bike
actor00Reaction(int32 buttons)1573 void Insane::actor00Reaction(int32 buttons) {
1574 	int32 tmpx, tmpy;
1575 
1576 	switch (_actor[0].tilt) {
1577 	case -3:
1578 		if (_actor[0].act[0].state != 41) {
1579 			smlayer_setActorFacing(0, 0, 6, 180);
1580 			_actor[0].act[0].state = 41;
1581 		}
1582 		break;
1583 	case -2:
1584 		if (_actor[0].act[0].state != 40) {
1585 			smlayer_setActorFacing(0, 0, 7, 180);
1586 			_actor[0].act[0].state = 40;
1587 		}
1588 		break;
1589 	case -1:
1590 		if (_actor[0].act[0].state != 39) {
1591 			smlayer_setActorFacing(0, 0, 8, 180);
1592 			_actor[0].act[0].state = 39;
1593 		}
1594 		break;
1595 	case 0:
1596 		if (_actor[0].act[0].state != 1) {
1597 			smlayer_setActorFacing(0, 0, 9, 180);
1598 			_actor[0].act[0].state = 1;
1599 		}
1600 		break;
1601 	case 1:
1602 		if (_actor[0].act[0].state != 55) {
1603 			smlayer_setActorFacing(0, 0, 10, 180);
1604 			_actor[0].act[0].state = 55;
1605 		}
1606 		break;
1607 	case 2:
1608 		if (_actor[0].act[0].state != 56) {
1609 			smlayer_setActorFacing(0, 0, 11, 180);
1610 			_actor[0].act[0].state = 56;
1611 		}
1612 		break;
1613 	case 3:
1614 		if (_actor[0].act[0].state != 57) {
1615 			smlayer_setActorFacing(0, 0, 12, 180);
1616 			_actor[0].act[0].state = 57;
1617 		}
1618 		break;
1619 	default:
1620 		break;
1621 	}
1622 	tmpx = _actor[0].x + _actor[0].x1;
1623 	tmpy = _actor[0].y + _actor[0].y1;
1624 
1625 	if (_actor[0].act[0].room)
1626 		smlayer_putActor(0, 0, tmpx, tmpy, _smlayer_room2);
1627 	else
1628 		smlayer_putActor(0, 0, tmpx, tmpy, _smlayer_room);
1629 }
1630 
1631 // Bike top
actor01Reaction(int32 buttons)1632 void Insane::actor01Reaction(int32 buttons) {
1633 	int32 tmpx, tmpy;
1634 
1635 	chooseBenWeaponAnim(buttons);
1636 
1637 	switch (_actor[0].tilt) {
1638 	case -3:
1639 		if (_actor[0].act[1].state != 41 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1640 			setBenAnimation(0, 6);
1641 			_actor[0].act[1].state = 41;
1642 		}
1643 
1644 		if (_actor[0].cursorX >= -100) {
1645 			setBenAnimation(0, 7);
1646 			_actor[0].act[1].state = 40;
1647 			_actor[0].field_8 = 48;
1648 			_actor[0].tilt = -2;
1649 		}
1650 		break;
1651 	case -2:
1652 		if (_actor[0].act[1].state != 40 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1653 			setBenAnimation(0, 7);
1654 			_actor[0].act[1].state = 40;
1655 		}
1656 		if (_actor[0].field_8 == 48)
1657 			_actor[0].tilt = -1;
1658 		else
1659 			_actor[0].tilt = -3;
1660 		break;
1661 	case -1:
1662 		if (_actor[0].act[1].state != 39 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1663 			setBenAnimation(0, 8);
1664 			_actor[0].act[1].state = 39;
1665 		}
1666 
1667 		if (_actor[0].field_8 == 48)
1668 			_actor[0].tilt = 0;
1669 		else
1670 			_actor[0].tilt = -2;
1671 		break;
1672 	case 0:
1673 		if (_actor[0].act[1].state != 1 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1674 			setBenAnimation(0, 9);
1675 			_actor[0].act[1].state = 1;
1676 		}
1677 		_actor[0].field_8 = 1;
1678 		if (_actor[0].cursorX < -100) {
1679 			setBenAnimation(0, 8);
1680 			_actor[0].act[1].state = 39;
1681 			_actor[0].field_8 = 46;
1682 			_actor[0].tilt = -1;
1683 		} else {
1684 			if (_actor[0].cursorX > 100) {
1685 				setBenAnimation(0, 10);
1686 				_actor[0].act[1].state = 55;
1687 				_actor[0].field_8 = 49;
1688 				_actor[0].tilt = 1;
1689 			}
1690 		}
1691 		break;
1692 	case 1:
1693 		if (_actor[0].act[1].state != 55 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1694 			setBenAnimation(0, 10);
1695 			_actor[0].act[1].state = 55;
1696 		}
1697 		if (_actor[0].field_8 == 51)
1698 			_actor[0].tilt = 0;
1699 		else
1700 			_actor[0].tilt = 2;
1701 		break;
1702 	case 2:
1703 		if (_actor[0].act[1].state != 56 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1704 			setBenAnimation(0, 11);
1705 			_actor[0].act[1].state = 56;
1706 		}
1707 		if (_actor[0].field_8 == 51)
1708 			_actor[0].tilt = 1;
1709 		else
1710 			_actor[0].tilt = 3;
1711 		break;
1712 	case 3:
1713 		if (_actor[0].act[1].state != 57 || _actor[0].weaponClass != _actor[0].animWeaponClass) {
1714 			setBenAnimation(0, 12);
1715 			_actor[0].act[1].state = 57;
1716 		}
1717 
1718 		if (_actor[0].cursorX <= 100) {
1719 			setBenAnimation(0, 11);
1720 			_actor[0].act[1].state = 56;
1721 			_actor[0].field_8 = 51;
1722 			_actor[0].tilt = 2;
1723 		}
1724 		break;
1725 	}
1726 
1727 	if (_actor[0].curFacingFlag != _actor[0].newFacingFlag) {
1728 		if (_actor[0].newFacingFlag == 2)
1729 			smlayer_setActorFacing(0, 1, 28, 180);
1730 		else
1731 			smlayer_setActorFacing(0, 1, 27, 180);
1732 	}
1733 
1734 	tmpx = _actor[0].x + _actor[0].x1;
1735 	tmpy = _actor[0].y + _actor[0].y1;
1736 
1737 	if (_actor[0].act[1].room)
1738 		smlayer_putActor(0, 1, tmpx, tmpy, _smlayer_room2);
1739 	else
1740 		smlayer_putActor(0, 1, tmpx, tmpy, _smlayer_room);
1741 
1742 	_actor[0].animWeaponClass = _actor[0].weaponClass;
1743 	_actor[0].curFacingFlag = _actor[0].newFacingFlag;
1744 }
1745 
actor03Reaction(int32 buttons)1746 void Insane::actor03Reaction(int32 buttons) {
1747 	int32 tmp;
1748 
1749 	switch (_actor[0].act[3].state) {
1750 	case 1:
1751 		_actor[0].field_54 = 0;
1752 		break;
1753 	case 52:
1754 		if (_actor[0].runningSound)
1755 			smlayer_stopSound(_actor[0].runningSound);
1756 
1757 		if (_currScenePropIdx)
1758 			shutCurrentScene();
1759 
1760 		_actor[0].runningSound = 0;
1761 		_actor[0].defunct = 0;
1762 		_actor[0].field_54 = 0;
1763 		smlayer_setActorFacing(0, 3, 15, 180);
1764 		_actor[0].act[3].state = 53;
1765 		break;
1766 	case 53:
1767 		if (_actor[0].act[3].frame >= 2) {
1768 			smlayer_setActorFacing(0, 3, 16, 180);
1769 			_actor[0].act[3].state = 54;
1770 		}
1771 		break;
1772 	case 54:
1773 		break;
1774 	case 69:
1775 		if (_actor[0].act[3].frame >= 2)
1776 			_actor[0].act[3].state = 70;
1777 		break;
1778 	case 70:
1779 		if (_actor[0].scenePropSubIdx) {
1780 			smlayer_setActorFacing(0, 3, 4, 180);
1781 			tmp = _currScenePropIdx + _actor[0].scenePropSubIdx;
1782 			if (!smlayer_startVoice(_sceneProp[tmp].sound))
1783 				_actor[0].runningSound = 0;
1784 			else
1785 				_actor[0].runningSound = _sceneProp[tmp].sound;
1786 			_actor[0].act[3].state = 72;
1787 		} else {
1788 			_actor[0].act[3].state = 118;
1789 		}
1790 		break;
1791 	case 71:
1792 		_actor[0].field_54 = 0;
1793 		if (_actor[0].act[3].frame >= 2)
1794 			_actor[0].act[3].state = 1;
1795 		break;
1796 	case 72:
1797 		if (_actor[0].runningSound) {
1798 			if (!smlayer_isSoundRunning(_actor[0].runningSound)) {
1799 				smlayer_setActorFacing(0, 3, 5, 180);
1800 				_actor[0].act[3].state = 70;
1801 				_actor[0].scenePropSubIdx = 0;
1802 			}
1803 		} else {
1804 			tmp = _currScenePropIdx + _actor[0].scenePropSubIdx;
1805 			if (_sceneProp[tmp].counter >= _sceneProp[tmp].maxCounter) {
1806 				smlayer_setActorFacing(0, 3, 5, 180);
1807 				_actor[0].act[3].state = 70;
1808 				_actor[0].scenePropSubIdx = 0;
1809 				_actor[0].runningSound = 0;
1810 			}
1811 		}
1812 		break;
1813 	case 117:
1814 		reinitActors();
1815 		smlayer_setActorFacing(0, 3, 13, 180);
1816 		_actor[0].act[3].state = 69;
1817 		break;
1818 	case 118:
1819 		smlayer_setActorFacing(0, 3, 14, 180);
1820 		_actor[0].act[3].state = 71;
1821 		break;
1822 	default:
1823 		break;
1824 	}
1825 }
1826 
chooseBenWeaponAnim(int buttons)1827 void Insane::chooseBenWeaponAnim(int buttons) {
1828 	// kick
1829 	if ((buttons & 1) && (_currEnemy != EN_TORQUE)) {
1830 		if (!_kickBenProgress && actor0StateFlags2(_actor[0].act[2].state + _actor[0].weapon * 119)) {
1831 			switch (_actor[0].weapon) {
1832 			case INV_CHAIN:
1833 				_actor[0].act[2].state = 10;
1834 				break;
1835 			case INV_CHAINSAW:
1836 				_actor[0].act[2].state = 14;
1837 				break;
1838 			case INV_MACE:
1839 				_actor[0].act[2].state = 18;
1840 				break;
1841 			case INV_2X4:
1842 				_actor[0].act[2].state = 22;
1843 				break;
1844 			case INV_WRENCH:
1845 				_actor[0].act[2].state = 26;
1846 				break;
1847 			case INV_BOOT:
1848 				_actor[0].act[2].state = 6;
1849 				break;
1850 			case INV_HAND:
1851 				_actor[0].act[2].state = 2;
1852 				break;
1853 			case INV_DUST:
1854 				_actor[0].act[2].state = 30;
1855 				break;
1856 			default:
1857 				break;
1858 			}
1859 			_actor[0].kicking = true;
1860 			_kickBenProgress = true;
1861 		}
1862 	} else {
1863 		_kickBenProgress = false;
1864 	}
1865 
1866 	// switch weapon
1867 	if ((buttons & 2) && (_currEnemy != EN_TORQUE)) {
1868 		if (_weaponBenJustSwitched)
1869 			return;
1870 
1871 		if (!actor0StateFlags1(_actor[0].act[2].state))
1872 			return;
1873 
1874 		switch (_actor[0].weapon) {
1875 		case INV_CHAIN:
1876 		case INV_CHAINSAW:
1877 		case INV_MACE:
1878 		case INV_2X4:
1879 		case INV_WRENCH:
1880 			_actor[0].act[2].state = 35;
1881 			smlayer_setActorFacing(0, 2, 24, 180);
1882 			break;
1883 		case INV_BOOT:
1884 		case INV_HAND:
1885 		case INV_DUST:
1886 			_actor[0].act[2].state = 0;
1887 			switchBenWeapon();
1888 		}
1889 
1890 		_weaponBenJustSwitched = true;
1891 	} else {
1892 		_weaponBenJustSwitched = false;
1893 	}
1894 }
1895 
switchBenWeapon()1896 void Insane::switchBenWeapon() {
1897 	do {
1898 		_actor[0].weapon++;
1899 		if (_actor[0].weapon > 7)
1900 			_actor[0].weapon = INV_CHAIN;
1901 
1902 	} while (!_actor[0].inventory[_actor[0].weapon]);
1903 
1904 	switch (_actor[0].weapon) {
1905 	case INV_CHAIN:
1906 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1907 			smlayer_setActorCostume(0, 2, readArray(19));
1908 		else
1909 			smlayer_setActorCostume(0, 2, readArray(20));
1910 		smlayer_setActorFacing(0, 2, 18, 180);
1911 		_actor[0].weaponClass = 1;
1912 		_actor[0].act[2].state = 34;
1913 		break;
1914 	case INV_CHAINSAW:
1915 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1916 			smlayer_setActorCostume(0, 2, readArray(23));
1917 		else
1918 			smlayer_setActorCostume(0, 2, readArray(24));
1919 		smlayer_setActorFacing(0, 2, 18, 180);
1920 		_actor[0].weaponClass = 1;
1921 		_actor[0].act[2].state = 34;
1922 		break;
1923 	case INV_MACE:
1924 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1925 			smlayer_setActorCostume(0, 2, readArray(22));
1926 		else
1927 			smlayer_setActorCostume(0, 2, readArray(23));
1928 		smlayer_setActorFacing(0, 2, 18, 180);
1929 		_actor[0].weaponClass = 1;
1930 		_actor[0].act[2].state = 34;
1931 		break;
1932 	case INV_2X4:
1933 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
1934 			smlayer_setActorCostume(0, 2, readArray(18));
1935 		} else {
1936 			if (_currEnemy == EN_CAVEFISH)
1937 				smlayer_setActorCostume(0, 2, readArray(38));
1938 			else
1939 				smlayer_setActorCostume(0, 2, readArray(19));
1940 		}
1941 		smlayer_setActorFacing(0, 2, 18, 180);
1942 		_actor[0].weaponClass = 1;
1943 		_actor[0].act[2].state = 34;
1944 		break;
1945 	case INV_WRENCH:
1946 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1947 			smlayer_setActorCostume(0, 2, readArray(24));
1948 		else
1949 			smlayer_setActorCostume(0, 2, readArray(25));
1950 		smlayer_setActorFacing(0, 2, 18, 180);
1951 		_actor[0].weaponClass = 1;
1952 		_actor[0].act[2].state = 34;
1953 		break;
1954 	case INV_BOOT:
1955 	case INV_HAND:
1956 	case INV_DUST:
1957 		if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS))
1958 			smlayer_setActorCostume(0, 2, readArray(11));
1959 		else
1960 			smlayer_setActorCostume(0, 2, readArray(12));
1961 		_actor[0].weaponClass = 2;
1962 		_actor[0].act[2].state = 1;
1963 		break;
1964 	default:
1965 		break;
1966 	}
1967 }
1968 
setBenState()1969 int32 Insane::setBenState() {
1970 	_actor[0].act[2].animTilt = -1000;
1971 
1972 	switch (_actor[0].weapon) {
1973 	case INV_CHAIN:
1974 		_actor[0].weaponClass = 1;
1975 		_actor[0].act[2].state = 63;
1976 		break;
1977 	case INV_CHAINSAW:
1978 		_actor[0].weaponClass = 1;
1979 		_actor[0].act[2].state = 64;
1980 		break;
1981 	case INV_MACE:
1982 		_actor[0].weaponClass = 1;
1983 		_actor[0].act[2].state = 65;
1984 		break;
1985 	case INV_2X4:
1986 		_actor[0].weaponClass = 1;
1987 		_actor[0].act[2].state = 66;
1988 		break;
1989 	case INV_WRENCH:
1990 		_actor[0].weaponClass = 1;
1991 		_actor[0].act[2].state = 62;
1992 		break;
1993 	case INV_BOOT:
1994 	case INV_HAND:
1995 	case INV_DUST:
1996 		_actor[0].weaponClass = 2;
1997 		_actor[0].act[2].state = 1;
1998 		break;
1999 	default:
2000 		break;
2001 	}
2002 	return _actor[0].act[2].state;
2003 }
2004 
ouchSoundBen()2005 void Insane::ouchSoundBen() {
2006 	_actor[0].act[3].state = 52;
2007 
2008 	if ((_vm->_game.features & GF_DEMO) && (_vm->_game.platform == Common::kPlatformDOS)) {
2009 		smlayer_startVoice(54);
2010 		return;
2011 	}
2012 
2013 	switch (_vm->_rnd.getRandomNumber(3)) {
2014 	case 0:
2015 		smlayer_startVoice(315);
2016 		break;
2017 	case 1:
2018 		smlayer_startVoice(316);
2019 		break;
2020 	case 2:
2021 		smlayer_startVoice(317);
2022 		break;
2023 	case 3:
2024 		smlayer_startVoice(98);
2025 		break;
2026 	}
2027 }
2028 
2029 }
2030