Fix bug which sometimes lead to some enemies never appear.

Remove some unused code.
Give some vars and functions proper names.

svn-id: r14902
This commit is contained in:
Eugene Sandulenko 2004-09-05 05:40:29 +00:00
parent 8db0a7bb79
commit 010a781ada
5 changed files with 66 additions and 98 deletions

View File

@ -122,7 +122,6 @@ void Insane::initvars(void) {
_keyboardDisable = 0; _keyboardDisable = 0;
_needSceneSwitch = false; _needSceneSwitch = false;
_idx2Exceeded = 0; _idx2Exceeded = 0;
_memoryAllocatedNotOK = 0;
_lastKey = 0; _lastKey = 0;
_tiresRustle = false; _tiresRustle = false;
_keybOldDx = 0; _keybOldDx = 0;
@ -156,7 +155,7 @@ void Insane::initvars(void) {
_roadBumps = false; _roadBumps = false;
_val211d = 0; _val211d = 0;
_val213d = 0; _val213d = 0;
_val215d = 0; _metEnemiesListTail = 0;
_smlayer_room = 0; _smlayer_room = 0;
_smlayer_room2 = 0; _smlayer_room2 = 0;
_isBenCut = 0; _isBenCut = 0;
@ -166,6 +165,9 @@ void Insane::initvars(void) {
_iactSceneId = 0; _iactSceneId = 0;
_iactSceneId2 = 0; _iactSceneId2 = 0;
for (i = 0; i < 12; i++)
_metEnemiesList[i] = 0;
for (i = 0; i < 9; i++) for (i = 0; i < 9; i++)
for (j = 0; j < 9; j++) for (j = 0; j < 9; j++)
_enHdlVar[i][j] = 0; _enHdlVar[i][j] = 0;
@ -451,7 +453,7 @@ void Insane::init_actStruct(int actornum, int actnum, int32 actorval, byte state
} }
void Insane::init_enemyStruct(int n, int32 handler, int32 initializer, void Insane::init_enemyStruct(int n, int32 handler, int32 initializer,
int16 occurences, int32 maxdamage, int32 field_10, int16 occurences, int32 maxdamage, int32 isEmpty,
int32 weapon, int32 sound, const char *filename, int32 weapon, int32 sound, const char *filename,
int32 costume4, int32 costume6, int32 costume5, int32 costume4, int32 costume6, int32 costume5,
int16 costumevar, int32 maxframe, int32 apprAnim) { int16 costumevar, int32 maxframe, int32 apprAnim) {
@ -461,7 +463,7 @@ void Insane::init_enemyStruct(int n, int32 handler, int32 initializer,
_enemy[n].initializer = initializer; _enemy[n].initializer = initializer;
_enemy[n].occurences = occurences; _enemy[n].occurences = occurences;
_enemy[n].maxdamage = maxdamage; _enemy[n].maxdamage = maxdamage;
_enemy[n].field_10 = field_10; _enemy[n].isEmpty = isEmpty;
_enemy[n].weapon = weapon; _enemy[n].weapon = weapon;
_enemy[n].sound = sound; _enemy[n].sound = sound;
strncpy(_enemy[n].filename, filename, 20); strncpy(_enemy[n].filename, filename, 20);
@ -648,7 +650,6 @@ void Insane::readState(void) { // PATCH
_actor[0].inventory[INV_DUST] = readArray(55) != 0; _actor[0].inventory[INV_DUST] = readArray(55) != 0;
_actor[0].inventory[INV_HAND] = 1; _actor[0].inventory[INV_HAND] = 1;
_actor[0].inventory[INV_BOOT] = 1; _actor[0].inventory[INV_BOOT] = 1;
_enemy[EN_CAVEFISH].field_10 = readArray(56);
_smlayer_room = readArray(320); _smlayer_room = readArray(320);
_smlayer_room2 = readArray(321); _smlayer_room2 = readArray(321);
_posBrokenTruck = readArray(322); _posBrokenTruck = readArray(322);
@ -667,8 +668,22 @@ void Insane::readState(void) { // PATCH
_enemy[EN_VULTF2].occurences = readArray(334); _enemy[EN_VULTF2].occurences = readArray(334);
_enemy[EN_VULTM2].occurences = readArray(335); _enemy[EN_VULTM2].occurences = readArray(335);
_enemy[EN_CAVEFISH].occurences = readArray(336); _enemy[EN_CAVEFISH].occurences = readArray(336);
_enemy[EN_VULTM2].field_10 = readArray(340); _enemy[EN_VULTM2].isEmpty = readArray(340);
_enemy[EN_VULTF2].field_10 = readArray(339); _enemy[EN_VULTF2].isEmpty = readArray(339);
_enemy[EN_CAVEFISH].isEmpty = readArray(56);
// Some sanity checks. There were submitted savefiles where these values were wrong
if (_enemy[EN_VULTM2].isEmpty != readArray(7))
error("Wrong INSANE parameters for EN_VULTM2 (%d %d). Please, report this",
_enemy[EN_VULTM2].isEmpty, readArray(7));
if (_enemy[EN_VULTF2].isEmpty != _actor[0].inventory[INV_CHAINSAW])
error("Wrong INSANE parameters for EN_VULTF2 (%d %d). Please, report this",
_enemy[EN_VULTF2].isEmpty, _actor[0].inventory[INV_CHAINSAW]);
if (_enemy[EN_CAVEFISH].isEmpty != readArray(8))
error("Wrong INSANE parameters for EN_CAVEFISH (%d %d). Please, report this",
_enemy[EN_CAVEFISH].isEmpty, readArray(8));
} }
} }
@ -691,47 +706,6 @@ void Insane::setupValues(void) {
smush_warpMouse(160, 100, -1); smush_warpMouse(160, 100, -1);
} }
// FIXME: it seems that in ScummVM it may be unused
void Insane::mainLoop(void) {
int32 resid;
while (!idx2Compare()) {
if(!(resid = idx2Tweak()))
continue;
_vm->ensureResourceLoaded(rtSound, resid);
_vm->setResourceCounter(rtSound, resid, 1);
}
_vm->increaseResourceCounter();
while (!idx1Compare()) {
resid = idx1Tweak();
_vm->ensureResourceLoaded(rtCostume, resid);
_vm->setResourceCounter(rtCostume, resid, 1);
// smlayer_lock (rtCostume, resid);
}
if (loadSceneData(_currSceneId, 0, 2)) {
_sceneData1Loaded = 0;
_objArray2[0] = 0;
return;
}
_sceneData1Loaded = 1;
if (idx1Compare() || idx2Compare()) {
_objArray2[0] = 0;
return;
}
_objArray2[0]++;
if (_objArray2[0] <= 5) {
_objArray2[0] = 0;
return;
}
smush_setToFinish();
loadSceneData(_currSceneId, 1, 2);
_memoryAllocatedNotOK = 1;
}
bool Insane::idx1Compare(void) { bool Insane::idx1Compare(void) {
return _objArray1Idx == _objArray1Idx2; return _objArray1Idx == _objArray1Idx2;
} }

View File

@ -105,7 +105,6 @@ class Insane {
int16 _keyboardDisable; int16 _keyboardDisable;
bool _needSceneSwitch; bool _needSceneSwitch;
int32 _idx2Exceeded; int32 _idx2Exceeded;
bool _memoryAllocatedNotOK;
int32 _lastKey; int32 _lastKey;
bool _beenCheated; bool _beenCheated;
bool _tiresRustle; bool _tiresRustle;
@ -175,15 +174,15 @@ class Insane {
bool _val115_; bool _val115_;
int32 _val211d; int32 _val211d;
int32 _val213d; int32 _val213d;
int32 _val215d; int32 _metEnemiesListTail;
int32 _val216d[12]; int32 _metEnemiesList[12];
struct enemy { struct enemy {
int32 handler; int32 handler;
int32 initializer; int32 initializer;
int16 occurences; int16 occurences;
int32 maxdamage; int32 maxdamage;
int32 field_10; int32 isEmpty;
int32 weapon; int32 weapon;
int32 sound; int32 sound;
char filename[20]; char filename[20];
@ -288,7 +287,6 @@ class Insane {
int32 readArray(int item); int32 readArray(int item);
void writeArray(int item, int value); void writeArray(int item, int value);
void mainLoop(void);
bool idx1Compare(void); bool idx1Compare(void);
bool idx2Compare(void); bool idx2Compare(void);
int32 idx1Tweak(void); int32 idx1Tweak(void);
@ -335,7 +333,7 @@ class Insane {
void init_actStruct(int actornum, int actnum, int32 actorval, byte state, void init_actStruct(int actornum, int actnum, int32 actorval, byte state,
int32 room, int32 animtilt, int32 tilt, int32 frame); int32 room, int32 animtilt, int32 tilt, int32 frame);
void init_enemyStruct(int n, int32 handler, int32 initializer, void init_enemyStruct(int n, int32 handler, int32 initializer,
int16 occurences, int32 maxdamage, int32 field_10, int16 occurences, int32 maxdamage, int32 isEmpty,
int32 field_14, int32 sound, const char *filename, int32 field_14, int32 sound, const char *filename,
int32 costume4, int32 costume6, int32 costume5, int32 costume4, int32 costume6, int32 costume5,
int16 field_2C, int32 field_30, int32 field_34); int16 field_2C, int32 field_30, int32 field_34);
@ -448,9 +446,9 @@ class Insane {
bool isBitSet(int n); bool isBitSet(int n);
void setBit(int n); void setBit(int n);
void clearBit(int n); void clearBit(int n);
void proc62(void); void chooseEnemy(void);
void proc63(void); void removeEmptyEnemies(void);
void proc64(int32); void removeEnemyFromMetList(int32);
}; };
} // End of namespace Insane } // End of namespace Insane

View File

@ -2410,7 +2410,7 @@ void Insane::actor12Reaction(int32 buttons) {
_actor[1].lost = true; _actor[1].lost = true;
if (_actor[1].act[2].frame >= 18) { if (_actor[1].act[2].frame >= 18) {
writeArray(7, 1); writeArray(7, 1);
_enemy[EN_VULTM2].field_10 = 1; _enemy[EN_VULTM2].isEmpty = 1;
queueSceneSwitch(12, 0, "getnitro.san", 0, 0, 0, 0); queueSceneSwitch(12, 0, "getnitro.san", 0, 0, 0, 0);
} }
break; break;
@ -2467,7 +2467,7 @@ void Insane::actor12Reaction(int32 buttons) {
if (_actor[1].act[2].frame >= 18 || ((_actor[1].x < 50 || _actor[1].x > 270) && if (_actor[1].act[2].frame >= 18 || ((_actor[1].x < 50 || _actor[1].x > 270) &&
_actor[1].act[2].frame >= 9)) { _actor[1].act[2].frame >= 9)) {
_enemy[EN_CAVEFISH].field_10 = 1; _enemy[EN_CAVEFISH].isEmpty = 1;
queueSceneSwitch(20, 0, "wr2_cvko.san", 64, 0, 0, 0); queueSceneSwitch(20, 0, "wr2_cvko.san", 64, 0, 0, 0);
_actor[1].act[2].state = 38; _actor[1].act[2].state = 38;
} }
@ -2535,7 +2535,7 @@ void Insane::actor12Reaction(int32 buttons) {
_actor[1].act[0].room = 0; _actor[1].act[0].room = 0;
_actor[1].cursorX = 0; _actor[1].cursorX = 0;
_actor[1].act[2].state = 114; _actor[1].act[2].state = 114;
_enemy[EN_VULTF2].field_10 = 1; _enemy[EN_VULTF2].isEmpty = 1;
smlayer_startVoice(275); smlayer_startVoice(275);
break; break;
case 114: case 114:

View File

@ -86,7 +86,7 @@ void Insane::iactScene1(byte *renderBitmap, int32 codecparam, int32 setupsan12,
} }
if (_approachAnim == -1) { if (_approachAnim == -1) {
proc62(); //PATCH chooseEnemy(); //PATCH
_approachAnim = _enemy[_currEnemy].apprAnim; _approachAnim = _enemy[_currEnemy].apprAnim;
} }
@ -183,26 +183,25 @@ void Insane::iactScene1(byte *renderBitmap, int32 codecparam, int32 setupsan12,
} }
} }
void Insane::proc62(void) { void Insane::chooseEnemy(void) {
debug(1, "Insane::proc62");
if (readArray(58) != 0) if (readArray(58) != 0)
_enemy[EN_TORQUE].field_10 = 1; _enemy[EN_TORQUE].isEmpty = 1;
if (_enemy[EN_TORQUE].occurences == 0) { if (_enemy[EN_TORQUE].occurences == 0) {
_currEnemy = EN_TORQUE; _currEnemy = EN_TORQUE;
_val215d++; _metEnemiesListTail++;
_val216d[_val215d] = EN_TORQUE; _metEnemiesList[_metEnemiesListTail] = EN_TORQUE;
return; return;
} }
proc63(); removeEmptyEnemies();
int32 count, i, j, en, en2; int32 count, i, j, en, en2;
bool notfound; bool notfound;
en = 0; en = 0;
for (i = 0; i < 9; i++) for (i = 0; i < 9; i++)
if (_enemy[i].field_10 == 0) if (_enemy[i].isEmpty == 0)
++en; ++en;
en -= 4; en -= 4;
@ -220,16 +219,16 @@ void Insane::proc62(void) {
notfound = true; notfound = true;
if (_enemy[en2].field_10 != 0) if (_enemy[en2].isEmpty != 0)
continue; continue;
if (0 < _val215d) { if (0 < _metEnemiesListTail) {
i = 0; i = 0;
do { do {
if (en2 == _val216d[i + 1]) if (en2 == _metEnemiesList[i + 1])
notfound = false; notfound = false;
i++; i++;
} while (i < _val215d && notfound); } while (i < _metEnemiesListTail && notfound);
} }
if (!notfound) { if (!notfound) {
continue; continue;
@ -239,29 +238,29 @@ void Insane::proc62(void) {
do { do {
notfound = true; notfound = true;
en2 = j; en2 = j;
if (0 < _val215d) { if (0 < _metEnemiesListTail) {
i = 0; i = 0;
do { do {
if (en2 == _val216d[i + 1]) if (en2 == _metEnemiesList[i + 1])
notfound = false; notfound = false;
i++; i++;
} while (i < _val215d && notfound); } while (i < _metEnemiesListTail && notfound);
} }
j++; j++;
} while (j < 9 && !notfound); } while (j < 9 && !notfound);
if (!notfound) { if (!notfound) {
_val215d = 0; _metEnemiesListTail = 0;
count = 0; count = 0;
continue; continue;
} }
} }
++_val215d; ++_metEnemiesListTail;
assert(_val215d < ARRAYSIZE(_val216d)); assert(_metEnemiesListTail < ARRAYSIZE(_metEnemiesList));
_val216d[_val215d] = en2; _metEnemiesList[_metEnemiesListTail] = en2;
if (_val215d >= en) { if (_metEnemiesListTail >= en) {
proc64(0); removeEnemyFromMetList(0);
} }
if (notfound) if (notfound)
@ -271,25 +270,25 @@ void Insane::proc62(void) {
_currEnemy = en2; _currEnemy = en2;
} }
void Insane::proc63(void) { void Insane::removeEmptyEnemies(void) {
if (_val215d > 0) { if (_metEnemiesListTail > 0) {
for (int i = 0; i < _val215d; i++) for (int i = 0; i < _metEnemiesListTail; i++)
if (_enemy[i].field_10 == 1) if (_enemy[i].isEmpty == 1)
proc64(i); removeEnemyFromMetList(i);
} }
} }
void Insane::proc64(int32 enemy1) { void Insane::removeEnemyFromMetList(int32 enemy1) {
if (enemy1 >= _val215d) if (enemy1 >= _metEnemiesListTail)
return; return;
int en = enemy1; int en = enemy1;
do { do {
++en; ++en;
assert(en + 1 < ARRAYSIZE(_val216d)); assert(en + 1 < ARRAYSIZE(_metEnemiesList));
_val216d[en] = _val216d[en + 1]; _metEnemiesList[en] = _metEnemiesList[en + 1];
} while (en < _val215d); } while (en < _metEnemiesListTail);
_val215d--; _metEnemiesListTail--;
} }
void Insane::iactScene3(byte *renderBitmap, int32 codecparam, int32 setupsan12, void Insane::iactScene3(byte *renderBitmap, int32 codecparam, int32 setupsan12,

View File

@ -148,7 +148,7 @@ void Insane::runScene(int arraynum) {
writeArray(53, _actor[0].inventory[INV_2X4]); writeArray(53, _actor[0].inventory[INV_2X4]);
writeArray(54, _actor[0].inventory[INV_WRENCH]); writeArray(54, _actor[0].inventory[INV_WRENCH]);
writeArray(55, _actor[0].inventory[INV_DUST]); writeArray(55, _actor[0].inventory[INV_DUST]);
writeArray(56, _enemy[EN_CAVEFISH].field_10); writeArray(56, _enemy[EN_CAVEFISH].isEmpty);
writeArray(337, _enemy[EN_TORQUE].occurences); writeArray(337, _enemy[EN_TORQUE].occurences);
writeArray(329, _enemy[EN_ROTT1].occurences); writeArray(329, _enemy[EN_ROTT1].occurences);
writeArray(330, _enemy[EN_ROTT2].occurences); writeArray(330, _enemy[EN_ROTT2].occurences);
@ -158,14 +158,11 @@ void Insane::runScene(int arraynum) {
writeArray(334, _enemy[EN_VULTF2].occurences); writeArray(334, _enemy[EN_VULTF2].occurences);
writeArray(335, _enemy[EN_VULTM2].occurences); writeArray(335, _enemy[EN_VULTM2].occurences);
writeArray(336, _enemy[EN_CAVEFISH].occurences); writeArray(336, _enemy[EN_CAVEFISH].occurences);
writeArray(339, _enemy[EN_VULTF2].field_10); writeArray(339, _enemy[EN_VULTF2].isEmpty);
writeArray(340, _enemy[EN_VULTM2].field_10); writeArray(340, _enemy[EN_VULTM2].isEmpty);
} }
// insane_unlock(); // FIXME // insane_unlock(); // FIXME
_vm->_sound->stopAllSounds(); // IMUSE_StopAllSounds(); _vm->_sound->stopAllSounds(); // IMUSE_StopAllSounds();
if (_memoryAllocatedNotOK) {
error("Memory Alloc Error in Mineroad (Heap Size?)");
}
delete _player; delete _player;
} }