Brief: //dnl ch83

- Fix BigMaps cliff-prone problem.
Details:
- Bug which prevent merc to go prone and crawl in big maps with cliffs was reported by Buggler who already find source of problem which lies in DB_STRUCTURE_TILE struct variable sPosRelToBase. This variable contains relative position to base tile which and cannot simply be change to INT32 as data from JSD files are loaded into it. However reason for problem is because sPosRelToBase is not updated for quite bunch of structures when map size is changed so add macro which in real time perform conversion and update sPosRelToBase value.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6740 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Kriplo
2014-01-08 21:16:35 +00:00
parent 49de642d7d
commit a3a9b29ead
6 changed files with 47 additions and 4 deletions
+12
View File
@@ -509,7 +509,11 @@ BOOLEAN AddToUndoListCmd( INT32 iMapIndex, INT32 iCmdCount )
{
// this loop won't execute for single-tile structures; for multi-tile structures, we have to
// add to the undo list all the other tiles covered by the structure
#if 0//dnl ch83 080114
iCoveredMapIndex = pStructure->sBaseGridNo + pStructure->pDBStructureRef->ppTile[ubLoop]->sPosRelToBase;
#else
iCoveredMapIndex = AddPosRelToBase(pStructure->sBaseGridNo, pStructure->pDBStructureRef->ppTile[ubLoop]);
#endif
AddToUndoList( iCoveredMapIndex );
}
pStructure = pStructure->pNext;
@@ -537,11 +541,19 @@ void CheckMapIndexForMultiTileStructures( UINT32 usMapIndex )
// for multi-tile structures we have to add, to the undo list, all the other tiles covered by the structure
if (pStructure->fFlags & STRUCTURE_BASE_TILE)
{
#if 0//dnl ch83 080114
iCoveredMapIndex = usMapIndex + pStructure->pDBStructureRef->ppTile[ubLoop]->sPosRelToBase;
#else
iCoveredMapIndex = AddPosRelToBase(usMapIndex, pStructure->pDBStructureRef->ppTile[ubLoop]);
#endif
}
else
{
#if 0//dnl ch83 080114
iCoveredMapIndex = pStructure->sBaseGridNo + pStructure->pDBStructureRef->ppTile[ubLoop]->sPosRelToBase;
#else
iCoveredMapIndex = AddPosRelToBase(pStructure->sBaseGridNo, pStructure->pDBStructureRef->ppTile[ubLoop]);
#endif
}
AddToUndoList( iCoveredMapIndex );
}
+4 -2
View File
@@ -659,9 +659,11 @@ INT32 AddRottingCorpse( ROTTING_CORPSE_DEFINITION *pCorpseDef )
for (ubLoop = 0; ubLoop < pDBStructureRef->pDBStructure->ubNumberOfTiles; ubLoop++)
{
ppTile = pDBStructureRef->ppTile;
#if 0//dnl ch83 080114
sTileGridNo = pCorpseDef->sGridNo + ppTile[ ubLoop ]->sPosRelToBase;
#else
sTileGridNo = AddPosRelToBase(pCorpseDef->sGridNo, ppTile[ubLoop]);
#endif
//Remove blood
RemoveBlood( sTileGridNo, pCorpseDef->bLevel );
}
+8 -1
View File
@@ -838,7 +838,11 @@ BOOLEAN ExplosiveDamageStructureAtGridNo( STRUCTURE * pCurrent, STRUCTURE **ppNe
{
if ( !(ppTile[ ubLoop ]->fFlags & TILE_ON_ROOF ) )
{
#if 0//dnl ch83 080114
sStructGridNo = pBase->sGridNo + ppTile[ubLoop]->sPosRelToBase;
#else
sStructGridNo = AddPosRelToBase(pBase->sGridNo, ppTile[ubLoop]);
#endif
// there might be two structures in this tile, one on each level, but we just want to
// delete one on each pass
@@ -1461,8 +1465,11 @@ void ExplosiveDamageGridNo( INT32 sGridNo, INT16 sWoundAmt, UINT32 uiDist, BOOLE
for ( ubLoop = BASE_TILE; ubLoop < ubNumberOfTiles; ubLoop++)
{
#if 0//dnl ch83 080114
sNewGridNo = sBaseGridNo + ppTile[ubLoop]->sPosRelToBase;
#else
sNewGridNo = AddPosRelToBase(sBaseGridNo, ppTile[ubLoop]);
#endif
// look in adjacent tiles
for ( ubLoop2 = 0; ubLoop2 < NUM_WORLD_DIRECTIONS; ubLoop2++ )
{
+4 -1
View File
@@ -216,8 +216,11 @@ void ExamineGridNoForSlantRoofExtraGraphic( INT32 sCheckGridNo )
for ( ubLoop = 0; ubLoop < pBase->pDBStructureRef->pDBStructure->ubNumberOfTiles; ubLoop++ )
{
ppTile = pBase->pDBStructureRef->ppTile;
#if 0//dnl ch83 080114
sGridNo = pBase->sGridNo + ppTile[ ubLoop ]->sPosRelToBase;
#else
sGridNo = AddPosRelToBase(pBase->sGridNo, ppTile[ubLoop]);
#endif
if (sGridNo < 0 || sGridNo > WORLD_MAX)
{
continue;
+2
View File
@@ -123,6 +123,8 @@ extern UINT8 AtHeight[PROFILE_Z_SIZE];
#define TILE_ON_ROOF 0x01
#define TILE_PASSABLE 0x02
#define AddPosRelToBase(sBaseGridNo, pTile) (pTile->sPosRelToBase ? (sBaseGridNo + pTile->bXPosRelToBase + pTile->bYPosRelToBase * WORLD_COLS) : sBaseGridNo)//dnl ch83 080114
typedef struct TAG_STRUCTURE_TILE
{
INT16 sPosRelToBase; // "single-axis"
+17
View File
@@ -636,7 +636,11 @@ BOOLEAN OkayToAddStructureToTile( INT32 sBaseGridNo, INT16 sCubeOffset, DB_STRUC
INT32 sOtherGridNo;
ppTile = pDBStructureRef->ppTile;
#if 0//dnl ch83 080114
sGridNo = sBaseGridNo + ppTile[ubTileIndex]->sPosRelToBase;
#else
sGridNo = AddPosRelToBase(sBaseGridNo, ppTile[ubTileIndex]);
#endif
if (sGridNo < 0 || sGridNo > WORLD_MAX)
{
return( FALSE );
@@ -742,11 +746,16 @@ BOOLEAN OkayToAddStructureToTile( INT32 sBaseGridNo, INT16 sCubeOffset, DB_STRUC
}
for (bLoop2 = 0; bLoop2 < pDBStructure->ubNumberOfTiles; bLoop2++)
{
#if 0//dnl ch83 080114
if ( sBaseGridNo + ppTile[bLoop2]->sPosRelToBase == sOtherGridNo)
{
// obstacle will straddle wall!
return( FALSE );
}
#else
if(AddPosRelToBase(sBaseGridNo, ppTile[bLoop2]) == sOtherGridNo)
return(FALSE);// obstacle will straddle wall!
#endif
}
}
}
@@ -988,7 +997,11 @@ STRUCTURE * InternalAddStructureToWorld( INT32 sBaseGridNo, INT8 bLevel, DB_STRU
MemFree( ppStructure );
return( NULL );
}
#if 0//dnl ch83 080114
ppStructure[ubLoop]->sGridNo = sBaseGridNo + ppTile[ubLoop]->sPosRelToBase;
#else
ppStructure[ubLoop]->sGridNo = AddPosRelToBase(sBaseGridNo, ppTile[ubLoop]);
#endif
if (ubLoop != BASE_TILE)
{
#ifdef JA2EDITOR
@@ -1196,7 +1209,11 @@ BOOLEAN DeleteStructureFromWorld( STRUCTURE * pStructure )
// Free all the tiles
for (ubLoop = BASE_TILE; ubLoop < ubNumberOfTiles; ubLoop++)
{
#if 0//dnl ch83 080114
sGridNo = sBaseGridNo + ppTile[ubLoop]->sPosRelToBase;
#else
sGridNo = AddPosRelToBase(sBaseGridNo, ppTile[ubLoop]);
#endif
// there might be two structures in this tile, one on each level, but we just want to
// delete one on each pass
pCurrent = FindStructureByID( sGridNo, usStructureID );