mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-03 09:23:37 +00:00
DM: Refactor f165_getDiscardThing
This commit is contained in:
parent
81781f6f00
commit
0009c223ea
@ -1174,7 +1174,7 @@ Thing DungeonMan::f166_getUnusedThing(uint16 thingType) {
|
||||
if (--thingIdx) { /* If there are thing data left to process */
|
||||
thingPtr += thingDataByteCount; /* Proceed to the next thing data */
|
||||
} else {
|
||||
curThing = f165_getDiscardTHing(thingType);
|
||||
curThing = f165_getDiscardThing(thingType);
|
||||
if (curThing == Thing::_none)
|
||||
return Thing::_none;
|
||||
|
||||
@ -1386,116 +1386,104 @@ uint16 DungeonMan::f143_getArmourDefense(ArmourInfo* armourInfo, bool useSharpDe
|
||||
return defense;
|
||||
}
|
||||
|
||||
Thing DungeonMan::f165_getDiscardTHing(uint16 thingType) {
|
||||
uint16 L0276_ui_MapX;
|
||||
uint16 L0277_ui_MapY;
|
||||
Thing L0278_T_Thing;
|
||||
uint16 L0279_ui_MapIndex;
|
||||
byte* L0280_puc_Square;
|
||||
Thing* L0281_pT_SquareFirstThing;
|
||||
Thing* L0282_ps_Generic;
|
||||
uint16 L0283_ui_DiscardThingMapIndex;
|
||||
int L0284_i_CurrentMapIndex;
|
||||
uint16 L0285_ui_MapWidth;
|
||||
uint16 L0286_ui_MapHeight;
|
||||
int L0287_i_ThingType;
|
||||
static unsigned char G0294_auc_LastDiscardedThingMapIndex[16];
|
||||
|
||||
Thing DungeonMan::f165_getDiscardThing(uint16 thingType) {
|
||||
// CHECKME: Shouldn't it be saved in the savegames?
|
||||
static unsigned char lastDiscardedThingMapIndex[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
if (thingType == k15_ExplosionThingType)
|
||||
return Thing::_none;
|
||||
|
||||
L0284_i_CurrentMapIndex = _vm->_dungeonMan->_g272_currMapIndex;
|
||||
if (((L0279_ui_MapIndex = G0294_auc_LastDiscardedThingMapIndex[thingType]) == _vm->_dungeonMan->_g309_partyMapIndex) && (++L0279_ui_MapIndex >= _vm->_dungeonMan->_g278_dungeonFileHeader._mapCount))
|
||||
L0279_ui_MapIndex = 0;
|
||||
int16 currentMapIdx = _vm->_dungeonMan->_g272_currMapIndex;
|
||||
uint16 mapIndex = lastDiscardedThingMapIndex[thingType];
|
||||
if ((mapIndex == _vm->_dungeonMan->_g309_partyMapIndex) && (++mapIndex >= _vm->_dungeonMan->_g278_dungeonFileHeader._mapCount))
|
||||
mapIndex = 0;
|
||||
|
||||
L0283_ui_DiscardThingMapIndex = L0279_ui_MapIndex;
|
||||
uint16 discardThingMapIndex = mapIndex;
|
||||
for (;;) { /*_Infinite loop_*/
|
||||
L0285_ui_MapWidth = _vm->_dungeonMan->_g277_dungeonMaps[L0279_ui_MapIndex]._width;
|
||||
L0286_ui_MapHeight = _vm->_dungeonMan->_g277_dungeonMaps[L0279_ui_MapIndex]._height;
|
||||
L0280_puc_Square = _vm->_dungeonMan->_g279_dungeonMapData[L0279_ui_MapIndex][0];
|
||||
L0281_pT_SquareFirstThing = &_vm->_dungeonMan->_g283_squareFirstThings[_vm->_dungeonMan->_g280_dungeonColumnsCumulativeSquareThingCount[_vm->_dungeonMan->_g281_dungeonMapsFirstColumnIndex[L0279_ui_MapIndex]]];
|
||||
uint16 mapWidth = _vm->_dungeonMan->_g277_dungeonMaps[mapIndex]._width;
|
||||
uint16 mapHeight = _vm->_dungeonMan->_g277_dungeonMaps[mapIndex]._height;
|
||||
byte *currSquare = _vm->_dungeonMan->_g279_dungeonMapData[mapIndex][0];
|
||||
Thing *squareFirstThing = &_vm->_dungeonMan->_g283_squareFirstThings[_vm->_dungeonMan->_g280_dungeonColumnsCumulativeSquareThingCount[_vm->_dungeonMan->_g281_dungeonMapsFirstColumnIndex[mapIndex]]];
|
||||
|
||||
for (L0276_ui_MapX = 0; L0276_ui_MapX <= L0285_ui_MapWidth; L0276_ui_MapX++) {
|
||||
for (L0277_ui_MapY = 0; L0277_ui_MapY <= L0286_ui_MapHeight; L0277_ui_MapY++) {
|
||||
if (getFlag(*L0280_puc_Square++, k0x0010_ThingListPresent)) {
|
||||
L0278_T_Thing = *L0281_pT_SquareFirstThing++;
|
||||
if ((L0279_ui_MapIndex == _vm->_dungeonMan->_g309_partyMapIndex) && ((L0276_ui_MapX - _vm->_dungeonMan->_g306_partyMapX + 5) <= 10) && ((L0277_ui_MapY - _vm->_dungeonMan->_g307_partyMapY + 5) <= 10)) /* If square is too close to the party */
|
||||
for (int16 currMapX = 0; currMapX <= mapWidth; currMapX++) {
|
||||
for (int16 currMapY = 0; currMapY <= mapHeight; currMapY++) {
|
||||
if (getFlag(*currSquare++, k0x0010_ThingListPresent)) {
|
||||
Thing squareThing = *squareFirstThing++;
|
||||
if ((mapIndex == _vm->_dungeonMan->_g309_partyMapIndex) && ((currMapX - _vm->_dungeonMan->_g306_partyMapX + 5) <= 10) && ((currMapY - _vm->_dungeonMan->_g307_partyMapY + 5) <= 10)) /* If square is too close to the party */
|
||||
continue;
|
||||
|
||||
do {
|
||||
if ((L0287_i_ThingType = L0278_T_Thing.getType()) == k3_SensorThingType) {
|
||||
L0282_ps_Generic = (Thing*)_vm->_dungeonMan->f156_getThingData(L0278_T_Thing);
|
||||
if (((Sensor*)L0282_ps_Generic)->getType()) /* If sensor is not disabled */
|
||||
ThingType squareThingType = squareThing.getType();
|
||||
if (squareThingType == k3_SensorThingType) {
|
||||
Thing *squareThingData = (Thing*)_vm->_dungeonMan->f156_getThingData(squareThing);
|
||||
if (((Sensor*)squareThingData)->getType()) /* If sensor is not disabled */
|
||||
break;
|
||||
} else {
|
||||
if (L0287_i_ThingType == thingType) {
|
||||
L0282_ps_Generic = (Thing*)_vm->_dungeonMan->f156_getThingData(L0278_T_Thing);
|
||||
} else if (squareThingType == thingType) {
|
||||
Thing *squareThingData = (Thing*)_vm->_dungeonMan->f156_getThingData(squareThing);
|
||||
switch (thingType) {
|
||||
case k4_GroupThingType:
|
||||
if (((Group*)L0282_ps_Generic)->getDoNotDiscard())
|
||||
if (((Group*)squareThingData)->getDoNotDiscard())
|
||||
continue;
|
||||
case k14_ProjectileThingType:
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0279_ui_MapIndex);
|
||||
_vm->_dungeonMan->f173_setCurrentMap(mapIndex);
|
||||
if (thingType == k4_GroupThingType) {
|
||||
_vm->_groupMan->f188_dropGroupPossessions(L0276_ui_MapX, L0277_ui_MapY, L0278_T_Thing, kM1_soundModeDoNotPlaySound);
|
||||
_vm->_groupMan->f189_delete(L0276_ui_MapX, L0277_ui_MapY);
|
||||
_vm->_groupMan->f188_dropGroupPossessions(currMapX, currMapY, squareThing, kM1_soundModeDoNotPlaySound);
|
||||
_vm->_groupMan->f189_delete(currMapX, currMapY);
|
||||
} else {
|
||||
_vm->_projexpl->f214_projectileDeleteEvent(L0278_T_Thing);
|
||||
f164_unlinkThingFromList(L0278_T_Thing, Thing(0), L0276_ui_MapX, L0277_ui_MapY);
|
||||
_vm->_projexpl->f215_projectileDelete(L0278_T_Thing, 0, L0276_ui_MapX, L0277_ui_MapY);
|
||||
_vm->_projexpl->f214_projectileDeleteEvent(squareThing);
|
||||
f164_unlinkThingFromList(squareThing, Thing(0), currMapX, currMapY);
|
||||
_vm->_projexpl->f215_projectileDelete(squareThing, 0, currMapX, currMapY);
|
||||
}
|
||||
break;
|
||||
case k6_ArmourThingType:
|
||||
if (((Armour*)L0282_ps_Generic)->getDoNotDiscard())
|
||||
if (((Armour*)squareThingData)->getDoNotDiscard())
|
||||
continue;
|
||||
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0279_ui_MapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(L0278_T_Thing, L0276_ui_MapX, L0277_ui_MapY, kM1_MapXNotOnASquare, 0);
|
||||
_vm->_dungeonMan->f173_setCurrentMap(mapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(squareThing, currMapX, currMapY, kM1_MapXNotOnASquare, 0);
|
||||
break;
|
||||
case k5_WeaponThingType:
|
||||
if (((Weapon*)L0282_ps_Generic)->getDoNotDiscard())
|
||||
if (((Weapon*)squareThingData)->getDoNotDiscard())
|
||||
continue;
|
||||
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0279_ui_MapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(L0278_T_Thing, L0276_ui_MapX, L0277_ui_MapY, kM1_MapXNotOnASquare, 0);
|
||||
_vm->_dungeonMan->f173_setCurrentMap(mapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(squareThing, currMapX, currMapY, kM1_MapXNotOnASquare, 0);
|
||||
break;
|
||||
case k10_JunkThingType:
|
||||
if (((Junk*)L0282_ps_Generic)->getDoNotDiscard())
|
||||
if (((Junk*)squareThingData)->getDoNotDiscard())
|
||||
continue;
|
||||
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0279_ui_MapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(L0278_T_Thing, L0276_ui_MapX, L0277_ui_MapY, kM1_MapXNotOnASquare, 0);
|
||||
_vm->_dungeonMan->f173_setCurrentMap(mapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(squareThing, currMapX, currMapY, kM1_MapXNotOnASquare, 0);
|
||||
break;
|
||||
case k8_PotionThingType:
|
||||
if (((Potion*)L0282_ps_Generic)->getDoNotDiscard())
|
||||
if (((Potion*)squareThingData)->getDoNotDiscard())
|
||||
continue;
|
||||
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0279_ui_MapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(L0278_T_Thing, L0276_ui_MapX, L0277_ui_MapY, kM1_MapXNotOnASquare, 0);
|
||||
_vm->_dungeonMan->f173_setCurrentMap(mapIndex);
|
||||
_vm->_moveSens->f267_getMoveResult(squareThing, currMapX, currMapY, kM1_MapXNotOnASquare, 0);
|
||||
break;
|
||||
}
|
||||
_vm->_dungeonMan->f173_setCurrentMap(L0284_i_CurrentMapIndex);
|
||||
G0294_auc_LastDiscardedThingMapIndex[thingType] = L0279_ui_MapIndex;
|
||||
return Thing(L0278_T_Thing.getTypeAndIndex());
|
||||
_vm->_dungeonMan->f173_setCurrentMap(currentMapIdx);
|
||||
lastDiscardedThingMapIndex[thingType] = mapIndex;
|
||||
return Thing(squareThing.getTypeAndIndex());
|
||||
}
|
||||
}
|
||||
} while ((L0278_T_Thing = _vm->_dungeonMan->f159_getNextThing(L0278_T_Thing)) != Thing::_endOfList);
|
||||
} while ((squareThing = _vm->_dungeonMan->f159_getNextThing(squareThing)) != Thing::_endOfList);
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((L0279_ui_MapIndex == _vm->_dungeonMan->_g309_partyMapIndex) || (_vm->_dungeonMan->_g278_dungeonFileHeader._mapCount <= 1)) {
|
||||
G0294_auc_LastDiscardedThingMapIndex[thingType] = L0279_ui_MapIndex;
|
||||
if ((mapIndex == _vm->_dungeonMan->_g309_partyMapIndex) || (_vm->_dungeonMan->_g278_dungeonFileHeader._mapCount <= 1)) {
|
||||
lastDiscardedThingMapIndex[thingType] = mapIndex;
|
||||
return Thing::_none;
|
||||
}
|
||||
|
||||
do {
|
||||
if (++L0279_ui_MapIndex >= _vm->_dungeonMan->_g278_dungeonFileHeader._mapCount)
|
||||
L0279_ui_MapIndex = 0;
|
||||
if (++mapIndex >= _vm->_dungeonMan->_g278_dungeonFileHeader._mapCount)
|
||||
mapIndex = 0;
|
||||
} while (mapIndex == _vm->_dungeonMan->_g309_partyMapIndex);
|
||||
|
||||
} while (L0279_ui_MapIndex == _vm->_dungeonMan->_g309_partyMapIndex);
|
||||
|
||||
if (L0279_ui_MapIndex == L0283_ui_DiscardThingMapIndex)
|
||||
L0279_ui_MapIndex = _vm->_dungeonMan->_g309_partyMapIndex;
|
||||
if (mapIndex == discardThingMapIndex)
|
||||
mapIndex = _vm->_dungeonMan->_g309_partyMapIndex;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -699,7 +699,7 @@ public:
|
||||
int16 f154_getLocationAfterLevelChange(int16 mapIndex, int16 levelDelta, int16 *mapX, int16 *mapY); // @ F0154_DUNGEON_GetLocationAfterLevelChange
|
||||
Thing f162_getSquareFirstObject(int16 mapX, int16 mapY); // @ F0162_DUNGEON_GetSquareFirstObject
|
||||
uint16 f143_getArmourDefense(ArmourInfo *armourInfo, bool useSharpDefense); // @ F0143_DUNGEON_GetArmourDefense
|
||||
Thing f165_getDiscardTHing(uint16 thingType); // @ F0165_DUNGEON_GetDiscardedThing
|
||||
Thing f165_getDiscardThing(uint16 thingType); // @ F0165_DUNGEON_GetDiscardedThing
|
||||
uint16 f144_getCreatureAttributes(Thing thing); // @ F0144_DUNGEON_GetCreatureAttributes
|
||||
void f146_setGroupCells(Group *group, uint16 cells, uint16 mapIndex); // @ F0146_DUNGEON_SetGroupCells
|
||||
void f148_setGroupDirections(Group *group, int16 dir, uint16 mapIndex); // @ F0148_DUNGEON_SetGroupDirections
|
||||
|
Loading…
x
Reference in New Issue
Block a user