mirror of
https://github.com/1dot13/source.git
synced 2026-09-16 14:47:17 +02:00
Merge branch 'master' into decideaction
This commit is contained in:
+9
-13
@@ -352,9 +352,8 @@ INT32 PickRandomLocationAtMinSpacesAway( INT32 sGridNo, INT16 sMinValue, INT16 s
|
||||
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,"PickRandomLocationAtMinSpacesAway");
|
||||
|
||||
sX = CenterX( sGridNo );
|
||||
sY = CenterY( sGridNo );
|
||||
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
while(TileIsOutOfBounds(sNewGridNo))
|
||||
{
|
||||
sNewX = sX + sMinValue + (INT16)Random( sRandomVar );
|
||||
@@ -596,8 +595,7 @@ void BeginBombing( )
|
||||
sGridNo = PickRandomLocationAtMinSpacesAway( gsDiveTargetLocation , 300, 200 );
|
||||
|
||||
// Save X, y:
|
||||
gsDiveX = CenterX( sGridNo );
|
||||
gsDiveY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &gsDiveX, &gsDiveY);
|
||||
|
||||
RESETTIMECOUNTER( giTimerAirRaidUpdate, RAID_DELAY );
|
||||
|
||||
@@ -657,8 +655,7 @@ void BeginDive( )
|
||||
sGridNo = PickRandomLocationAtMinSpacesAway( gsDiveTargetLocation, 300, 200 );
|
||||
|
||||
// Save X, y:
|
||||
gsDiveX = CenterX( sGridNo );
|
||||
gsDiveY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &gsDiveX, &gsDiveY);
|
||||
|
||||
RESETTIMECOUNTER( giTimerAirRaidUpdate, RAID_DELAY );
|
||||
giNumTurnsSinceDiveStarted = 0;
|
||||
@@ -760,8 +757,7 @@ void DoDive( )
|
||||
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,"DoDive: move towards target");
|
||||
// Move Towards target....
|
||||
sTargetX = CenterX( gsDiveTargetLocation );
|
||||
sTargetY = CenterY( gsDiveTargetLocation );
|
||||
ConvertGridNoToCenterCellXY(gsDiveTargetLocation, &sTargetX, &sTargetY);
|
||||
|
||||
// Determine deltas
|
||||
dDeltaX = (FLOAT)( sTargetX - gsDiveX );
|
||||
@@ -886,7 +882,7 @@ void DoBombing( )
|
||||
INT16 sRange;
|
||||
INT32 sGridNo, sOldGridNo, sBombGridNo;
|
||||
|
||||
INT16 sTargetX, sTargetY;
|
||||
INT16 sTargetX, sTargetY, sBombX, sBombY;
|
||||
UINT16 usItem;
|
||||
INT16 sStrafeX, sStrafeY;
|
||||
FLOAT dDeltaX, dDeltaY, dAngle, dDeltaXPos, dDeltaYPos;
|
||||
@@ -933,8 +929,7 @@ void DoBombing( )
|
||||
RESETTIMECOUNTER( giTimerAirRaidUpdate, RAID_DELAY );
|
||||
|
||||
// Move Towards target....
|
||||
sTargetX = CenterX( gsDiveTargetLocation );
|
||||
sTargetY = CenterY( gsDiveTargetLocation );
|
||||
ConvertGridNoToCenterCellXY(gsDiveTargetLocation, &sTargetX, &sTargetY);
|
||||
|
||||
// Determine deltas
|
||||
dDeltaX = (FLOAT)( sTargetX - gsDiveX );
|
||||
@@ -1002,7 +997,8 @@ void DoBombing( )
|
||||
}
|
||||
|
||||
// Drop bombs...
|
||||
InternalIgniteExplosion( NOBODY, CenterX( sBombGridNo ), CenterY( sBombGridNo ), 0, sBombGridNo, usItem, fLocate , (UINT8)IsRoofPresentAtGridNo( sBombGridNo ) );
|
||||
ConvertGridNoToCenterCellXY(sBombGridNo, &sBombX, &sBombY);
|
||||
InternalIgniteExplosion( NOBODY, sBombX, sBombY, 0, sBombGridNo, usItem, fLocate , (UINT8)IsRoofPresentAtGridNo( sBombGridNo ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
return (returnHeap);
|
||||
}
|
||||
|
||||
int moveUp(register int index, KEY newKey)
|
||||
int moveUp(int index, KEY newKey)
|
||||
{
|
||||
while (index > 1) {
|
||||
int current2 = index>>1;//divided by 2
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
|
||||
int moveDown(int index, KEY currentKey)
|
||||
{
|
||||
register int current2 = index+index;
|
||||
int current2 = index+index;
|
||||
while (current2 < heapCount) {
|
||||
if (current2+1 < heapCount) {
|
||||
//choose child to possibly move
|
||||
@@ -314,7 +314,7 @@ insert:
|
||||
|
||||
int findData(const T data) const
|
||||
{
|
||||
register int current;
|
||||
int current;
|
||||
for (current = heapCount-1; current > 0; --current) {
|
||||
if (BinaryHeap[current].data == data) {
|
||||
break;
|
||||
|
||||
+238
-317
File diff suppressed because it is too large
Load Diff
@@ -373,7 +373,7 @@ BOOLEAN HasAdjTile( const INT32& ubX, const INT32& ubY, const INT32& ubZ )
|
||||
|
||||
void AddCoverObjectsToViewArea()
|
||||
{
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
BOOLEAN fNightTime = NightTime( );
|
||||
@@ -406,7 +406,7 @@ void RemoveCoverObjectsFromViewArea()
|
||||
return;
|
||||
|
||||
// Go through the whole gCoverViewArea when removing cover objects. Otherwise we don't clean up tiles that are not in the viewport which results in an annoying visual bug.
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
for ( ubX = 0; ubX < COVER_X_CELLS; ++ubX )
|
||||
@@ -669,8 +669,8 @@ static void CalculateCoverFromEnemies()
|
||||
|
||||
void CalculateCover()
|
||||
{
|
||||
register INT32 ubX, ubY;
|
||||
register INT8 ubZ;
|
||||
INT32 ubX, ubY;
|
||||
INT8 ubZ;
|
||||
SOLDIERTYPE* pSoldier;
|
||||
|
||||
if (gusSelectedSoldier == NOBODY)
|
||||
@@ -1144,7 +1144,7 @@ void AddMinesObjectsToViewArea()
|
||||
if ( gsMaxCellY < 0 )
|
||||
return;
|
||||
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
BOOLEAN fNightTime = NightTime( );
|
||||
@@ -1503,7 +1503,7 @@ void AddTraitObjectsToViewArea()
|
||||
if ( gsMaxCellY < 0 )
|
||||
return;
|
||||
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
BOOLEAN fNightTime = NightTime( );
|
||||
@@ -1657,7 +1657,7 @@ void AddTrackerObjectsToViewArea( )
|
||||
if ( gsMaxCellY < 0 )
|
||||
return;
|
||||
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
BOOLEAN fNightTime = NightTime();
|
||||
@@ -1731,7 +1731,7 @@ void CalculateFortify( )
|
||||
if ( gsMaxCellY < 0 )
|
||||
return;
|
||||
|
||||
register INT32 ubX, ubY, ubZ;
|
||||
INT32 ubX, ubY, ubZ;
|
||||
BOOLEAN fChanged = FALSE;
|
||||
|
||||
BOOLEAN fNightTime = NightTime( );
|
||||
|
||||
+305
-281
@@ -62,7 +62,8 @@ void NewEye( FACETYPE *pFace );
|
||||
void NewMouth( FACETYPE *pFace );
|
||||
INT32 GetFreeFace(void);
|
||||
void RecountFaces(void);
|
||||
void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY );
|
||||
UINT32 GetFaceShade(SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit);
|
||||
void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY, UINT32 uiFaceShade);
|
||||
|
||||
extern BOOLEAN gfInItemPickupMenu;
|
||||
|
||||
@@ -157,6 +158,32 @@ INT32 InitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags )
|
||||
|
||||
}
|
||||
|
||||
void SetPalettes(HVOBJECT *hVObject, UINT32 uiIndex)
|
||||
{
|
||||
SGPPaletteEntry Pal[256];
|
||||
|
||||
// Build a grayscale palette! ( for testing different looks )
|
||||
for (UINT32 uiCount = 0; uiCount < 256; uiCount++)
|
||||
{
|
||||
Pal[uiCount].peRed = 255;
|
||||
Pal[uiCount].peGreen = 255;
|
||||
Pal[uiCount].peBlue = 255;
|
||||
}
|
||||
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_NOSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 255, 255, 255, FALSE);
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_STARTSHADE] = Create16BPPPaletteShaded(Pal, 255, 255, 255, FALSE);
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_ENDSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 250, 25, 25, TRUE);
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_DARKSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 100, 100, 100, TRUE);
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_LITESHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 100, 100, 100, FALSE);
|
||||
|
||||
for (UINT32 uiCount = 0; uiCount < 256; uiCount++)
|
||||
{
|
||||
Pal[uiCount].peRed = (UINT8)(uiCount % 128) + 128;
|
||||
Pal[uiCount].peGreen = (UINT8)(uiCount % 128) + 128;
|
||||
Pal[uiCount].peBlue = (UINT8)(uiCount % 128) + 128;
|
||||
}
|
||||
(*hVObject)->pShades[FLASH_PORTRAIT_GRAYSHADE] = Create16BPPPaletteShaded(Pal, 255, 255, 255, FALSE);
|
||||
}
|
||||
|
||||
INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags, INT32 iFaceFileID, UINT32 uiBlinkFrequency, UINT32 uiExpressionFrequency )
|
||||
{
|
||||
@@ -167,7 +194,6 @@ INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitF
|
||||
ETRLEObject ETRLEObject;
|
||||
HVOBJECT hVObject;
|
||||
UINT32 uiCount;
|
||||
SGPPaletteEntry Pal[256];
|
||||
|
||||
if( ( iFaceIndex = GetFreeFace() )==(-1) )
|
||||
return(-1);
|
||||
@@ -436,33 +462,11 @@ INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitF
|
||||
|
||||
|
||||
// Set palette
|
||||
if( GetVideoObject( &hVObject, uiVideoObject ) )
|
||||
if (GetVideoObject(&hVObject, uiVideoObject))
|
||||
{
|
||||
// Build a grayscale palette! ( for testing different looks )
|
||||
for(uiCount=0; uiCount < 256; uiCount++)
|
||||
{
|
||||
Pal[uiCount].peRed=255;
|
||||
Pal[uiCount].peGreen=255;
|
||||
Pal[uiCount].peBlue=255;
|
||||
}
|
||||
|
||||
hVObject->pShades[ FLASH_PORTRAIT_NOSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 255, 255, 255, FALSE );
|
||||
hVObject->pShades[ FLASH_PORTRAIT_STARTSHADE ] = Create16BPPPaletteShaded( Pal, 255, 255, 255, FALSE );
|
||||
hVObject->pShades[ FLASH_PORTRAIT_ENDSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 250, 25, 25, TRUE );
|
||||
hVObject->pShades[ FLASH_PORTRAIT_DARKSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 100, 100, 100, TRUE );
|
||||
hVObject->pShades[ FLASH_PORTRAIT_LITESHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 100, 100, 100, FALSE );
|
||||
|
||||
for(uiCount=0; uiCount < 256; uiCount++)
|
||||
{
|
||||
Pal[uiCount].peRed=(UINT8)(uiCount%128)+128;
|
||||
Pal[uiCount].peGreen=(UINT8)(uiCount%128)+128;
|
||||
Pal[uiCount].peBlue=(UINT8)(uiCount%128)+128;
|
||||
}
|
||||
hVObject->pShades[ FLASH_PORTRAIT_GRAYSHADE ] = Create16BPPPaletteShaded( Pal, 255, 255, 255, FALSE );
|
||||
|
||||
SetPalettes(&hVObject, uiVideoObject);
|
||||
}
|
||||
|
||||
|
||||
// Get FACE height, width
|
||||
if( GetVideoObjectETRLEPropertiesFromIndex( uiVideoObject, &ETRLEObject, 0 ) == FALSE )
|
||||
{
|
||||
@@ -942,9 +946,13 @@ void BlinkAutoFace( INT32 iFaceIndex )
|
||||
{
|
||||
pFace = &gFacesData[ iFaceIndex ];
|
||||
|
||||
UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE;
|
||||
|
||||
// CHECK IF BUDDY IS DEAD, UNCONSCIOUS, ASLEEP, OR POW!
|
||||
if ( pFace->ubSoldierID != NOBODY )
|
||||
{
|
||||
uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE);
|
||||
|
||||
if ( ( MercPtrs[ pFace->ubSoldierID ]->stats.bLife < OKLIFE ) ||
|
||||
( MercPtrs[ pFace->ubSoldierID ]->flags.fMercAsleep == TRUE ) ||
|
||||
( MercPtrs[ pFace->ubSoldierID ]->bAssignment == ASSIGNMENT_POW ) )
|
||||
@@ -1043,8 +1051,7 @@ void BlinkAutoFace( INT32 iFaceIndex )
|
||||
|
||||
}
|
||||
|
||||
HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY );
|
||||
|
||||
HandleRenderFaceAdjustments(pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1228,7 +1235,15 @@ void MouthAutoFace( INT32 iFaceIndex )
|
||||
|
||||
}
|
||||
|
||||
HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY );
|
||||
UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE;
|
||||
|
||||
// Set shade
|
||||
if (pFace->ubSoldierID != NOBODY)
|
||||
{
|
||||
uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE);
|
||||
}
|
||||
|
||||
HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1317,32 +1332,38 @@ void HandleTalkingAutoFace( INT32 iFaceIndex )
|
||||
|
||||
|
||||
// Local function - uses these variables because they have already been validated
|
||||
void SetFaceShade( SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit )
|
||||
void SetFaceShade(FACETYPE *pFace, UINT32 uiFaceShade)
|
||||
{
|
||||
// Set to default
|
||||
SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_NOSHADE );
|
||||
SetObjectHandleShade(pFace->uiVideoObject, uiFaceShade);
|
||||
}
|
||||
|
||||
if ( pFace->iVideoOverlay == -1 && !fExternBlit )
|
||||
UINT32 GetFaceShade(SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit)
|
||||
{
|
||||
if (pFace->iVideoOverlay == -1 && !fExternBlit)
|
||||
{
|
||||
if ( ( pSoldier->bActionPoints == 0 ) && !( gTacticalStatus.uiFlags & REALTIME ) && (gTacticalStatus.uiFlags & INCOMBAT ) )
|
||||
if ((pSoldier->bActionPoints == 0) && !(gTacticalStatus.uiFlags & REALTIME) && (gTacticalStatus.uiFlags & INCOMBAT))
|
||||
{
|
||||
SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_LITESHADE );
|
||||
return FLASH_PORTRAIT_LITESHADE;
|
||||
}
|
||||
}
|
||||
|
||||
if ( pSoldier->stats.bLife < OKLIFE )
|
||||
if (pSoldier->stats.bLife < OKLIFE)
|
||||
{
|
||||
SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_DARKSHADE );
|
||||
return FLASH_PORTRAIT_DARKSHADE;
|
||||
}
|
||||
|
||||
// ATE: Don't shade for damage if blitting extern face...
|
||||
if ( !fExternBlit )
|
||||
if (!fExternBlit)
|
||||
{
|
||||
if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START )
|
||||
if (pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START)
|
||||
{
|
||||
SetObjectHandleShade( pFace->uiVideoObject, pSoldier->bFlashPortraitFrame );
|
||||
return pSoldier->bFlashPortraitFrame;
|
||||
}
|
||||
}
|
||||
|
||||
// Set to default
|
||||
return FLASH_PORTRAIT_NOSHADE;
|
||||
}
|
||||
|
||||
BOOLEAN RenderAutoFaceFromSoldier( UINT8 ubSoldierID )
|
||||
@@ -1450,45 +1471,46 @@ void DoRightIcon_legion_GAS_MASK( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16
|
||||
|
||||
}
|
||||
*/
|
||||
void GetXYForRightIconPlacement_FaceGera( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons , UINT32 uIDFaceGear, BOOLEAN isIMP)
|
||||
void GetXYForRightIconPlacement_FaceGear(FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons, UINT32 uiFaceGearIndex, UINT32 uiFaceShade)
|
||||
{
|
||||
INT16 sX, sY;
|
||||
UINT16 usWidth, usHeight;
|
||||
ETRLEObject *pTrav;
|
||||
HVOBJECT hVObject;
|
||||
ETRLEObject *pTrav;
|
||||
HVOBJECT hVObject = nullptr;
|
||||
|
||||
// Get height, width of icon...
|
||||
if (isIMP)
|
||||
GetVideoObject( &hVObject, zNewFaceGearIMP[uIDFaceGear].uiIndex );
|
||||
else
|
||||
GetVideoObject( &hVObject, zNewFaceGear[uIDFaceGear].uiIndex );
|
||||
|
||||
pTrav = &(hVObject->pETRLEObject[ ubIndex ] );
|
||||
usHeight = pTrav->usHeight;
|
||||
usWidth = pTrav->usWidth;
|
||||
if (GetVideoObject(&hVObject, uiFaceGearIndex))
|
||||
{
|
||||
SetPalettes(&hVObject, uiFaceGearIndex);
|
||||
}
|
||||
|
||||
sX = sFaceX + ( usWidth * bNumIcons );
|
||||
SetObjectShade(hVObject, uiFaceShade);
|
||||
|
||||
pTrav = &(hVObject->pETRLEObject[ubIndex]);
|
||||
usHeight = pTrav->usHeight;
|
||||
usWidth = pTrav->usWidth;
|
||||
|
||||
sX = sFaceX + (usWidth * bNumIcons);
|
||||
sY = sFaceY + pFace->usFaceHeight - usHeight;
|
||||
|
||||
*psX = sX;
|
||||
*psY = sY;
|
||||
}
|
||||
|
||||
void DoRightIcon_FaceGear( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex , UINT32 uIDFaceGear, BOOLEAN isIMP)
|
||||
void DoRightIcon_FaceGear(UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex, UINT32 uIDFaceGear, BOOLEAN isIMP, UINT32 uiFaceShade)
|
||||
{
|
||||
INT16 sIconX, sIconY;
|
||||
INT16 sIconX, sIconY;
|
||||
|
||||
// Find X, y for placement
|
||||
|
||||
if (isIMP)
|
||||
{
|
||||
GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP);
|
||||
BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGearIMP[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
|
||||
GetXYForRightIconPlacement_FaceGear(pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, zNewFaceGearIMP[uIDFaceGear].uiIndex, uiFaceShade);
|
||||
BltVideoObjectFromIndex(uiRenderBuffer, zNewFaceGearIMP[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP);
|
||||
BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGear[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL );
|
||||
GetXYForRightIconPlacement_FaceGear(pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, zNewFaceGear[uIDFaceGear].uiIndex, uiFaceShade);
|
||||
BltVideoObjectFromIndex(uiRenderBuffer, zNewFaceGear[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL);
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------
|
||||
@@ -1548,7 +1570,7 @@ void DoRightIcon( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sF
|
||||
}
|
||||
|
||||
|
||||
void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY )
|
||||
void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY, UINT32 uiFaceShade)
|
||||
{
|
||||
INT16 sIconX, sIconY;
|
||||
INT16 sIconIndex = -1;
|
||||
@@ -1612,6 +1634,190 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
||||
{
|
||||
pSoldier = MercPtrs[ pFace->ubSoldierID ];
|
||||
|
||||
UINT8 faceProfileId = gMercProfiles[pSoldier->ubProfile].ubFaceIndex;
|
||||
BOOLEAN isIMP = gMercProfiles[pSoldier->ubProfile].Type == PROFILETYPE_IMP;
|
||||
|
||||
if (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR] && MercPtrs[pFace->ubSoldierID]->stats.bLife > 0 && !(pFace->uiFlags & FACE_BIGFACE))
|
||||
{
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0)
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem;
|
||||
|
||||
if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 1) //back
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// this section chooses the pictures for gas mask and NV goggles if the ini setting "SHOW_TACTICAL_FACE_GEAR" is TRUE
|
||||
// and the merc actually wears something to be shown
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem + MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem > 0)
|
||||
{
|
||||
// WANNE: Removed the limitation
|
||||
// silversurfer: don't overwrite icons if they shall be shown!
|
||||
//if ( !gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] )
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem;
|
||||
uiFaceItemTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem;
|
||||
|
||||
uiFaceOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem;
|
||||
uiFaceTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem;
|
||||
|
||||
// check first face slot
|
||||
if (uiFaceItemOne != NONE)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
uiFaceItemOne = 1;
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
uiFaceItemOne = 2;
|
||||
}
|
||||
else uiFaceItemOne = 0;
|
||||
}
|
||||
|
||||
// check second face slot
|
||||
if (uiFaceItemTwo != NONE)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
uiFaceItemTwo = 21;
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
uiFaceItemTwo = 42;
|
||||
}
|
||||
else uiFaceItemTwo = 0;
|
||||
}
|
||||
|
||||
|
||||
// Now select the correct picture. This uses a matrix from uiFaceOneItem and uiFaceTwoItem (simple addition)
|
||||
// the numbers on the outer border are used if that is the only item worn in that slot
|
||||
//
|
||||
// 21 42 63 84
|
||||
// face slot 1 \ slot 2 gas mask | NV goggles | sun goggles | extended ear
|
||||
// 1 gas mask -- 43 64 85
|
||||
// 2 NV goggles 23 -- -- 86
|
||||
// 3 sun goggles 24 -- -- 87
|
||||
// 4 extended ear 25 46 67 --
|
||||
//
|
||||
// this matrix leaves room for expansion
|
||||
// we only need a few of the matrix' values this time because we only show gas mask or NV goggles pictures
|
||||
ubFaceItemsCombined = uiFaceItemOne + uiFaceItemTwo;
|
||||
}
|
||||
|
||||
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
|
||||
// silversurfer: we don't want to display icons for gas mask or NV goggles because you can actually see the merc wearing the gear
|
||||
// in case of gas mask together with NV we display the picture of the item in face slot 1 and the icon of the item
|
||||
// in face slot 2 (if icons are allowed)
|
||||
|
||||
//Type : 3 - gas mask ; 4 - NV googles
|
||||
// gas mask only
|
||||
|
||||
if (ubFaceItemsCombined == 1 || ubFaceItemsCombined == 21)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles only
|
||||
if (ubFaceItemsCombined == 2 || ubFaceItemsCombined == 42)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles + gas mask
|
||||
if (ubFaceItemsCombined == 23)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4 && zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + NV goggles
|
||||
if (ubFaceItemsCombined == 43)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3 && zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + extended ear
|
||||
if (ubFaceItemsCombined == 24 || ubFaceItemsCombined == 64)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + extended ear
|
||||
if (ubFaceItemsCombined == 25 || ubFaceItemsCombined == 85)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles + extended ear
|
||||
if (ubFaceItemsCombined == 46 || ubFaceItemsCombined == 86)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0)
|
||||
// dirty hack for IMPs because they don't have pictures for face gear
|
||||
// && ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 )
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem;
|
||||
|
||||
if (uiFaceItemOne != NONE)
|
||||
{
|
||||
if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 2) //front
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP, uiFaceShade);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------end of tactical face gear-----------------------------
|
||||
}
|
||||
|
||||
if ( (MercPtrs[pFace->ubSoldierID]->stats.bLife < CONSCIOUSNESS || MercPtrs[pFace->ubSoldierID]->flags.fDeadPanel ) )
|
||||
{
|
||||
// Blit Closed eyes here!
|
||||
@@ -1707,34 +1913,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
||||
// Blit hatch!
|
||||
BltVideoObjectFromIndex( uiRenderBuffer, guiHATCH, 0, sFaceX, sFaceY, VO_BLT_SRCTRANSPARENCY, NULL );
|
||||
}
|
||||
|
||||
if ( !pFace->fDisabled && !pFace->fInvalidAnim )
|
||||
{
|
||||
// Render text above here if that's what was asked for
|
||||
if ( pFace->fDisplayTextOver != FACE_NO_TEXT_OVER )
|
||||
{
|
||||
SetFont( TINYFONT1 );
|
||||
SetFontBackground( FONT_MCOLOR_BLACK );
|
||||
SetFontForeground( FONT_MCOLOR_WHITE );
|
||||
|
||||
SetFontDestBuffer( uiRenderBuffer, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
||||
|
||||
VarFindFontCenterCoordinates( sFaceX, sFaceY, pFace->usFaceWidth, pFace->usFaceHeight, TINYFONT1, &sFontX, &sFontY, pFace->zDisplayText );
|
||||
|
||||
if ( pFace->fDisplayTextOver == FACE_DRAW_TEXT_OVER )
|
||||
{
|
||||
gprintfinvalidate( sFontX, sFontY, pFace->zDisplayText );
|
||||
mprintf( sFontX, sFontY, pFace->zDisplayText );
|
||||
}
|
||||
else if ( pFace->fDisplayTextOver == FACE_ERASE_TEXT_OVER )
|
||||
{
|
||||
gprintfRestore( sFontX, sFontY, pFace->zDisplayText );
|
||||
pFace->fDisplayTextOver = FACE_NO_TEXT_OVER;
|
||||
}
|
||||
|
||||
SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// sevenfm: only show for alive soldiers, no face icons for big faces
|
||||
@@ -1760,15 +1938,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
||||
|
||||
//------------------------------------Legion 2 by jazz--------------------------------
|
||||
|
||||
UINT8 faceProfileId = gMercProfiles[MercPtrs[pFace->ubSoldierID]->ubProfile].ubFaceIndex;
|
||||
BOOLEAN isIMP = FALSE;
|
||||
|
||||
//IMP
|
||||
if (gMercProfiles[MercPtrs[pFace->ubSoldierID]->ubProfile].Type == PROFILETYPE_IMP)
|
||||
{
|
||||
isIMP = TRUE;
|
||||
}
|
||||
|
||||
// rewritten by silversurfer
|
||||
// this section chooses the icons for face gear if the ini setting "SHOW_TACTICAL_FACE_ICONS" is TRUE
|
||||
// and the merc actually wears something to be shown
|
||||
@@ -1883,187 +2052,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
||||
}
|
||||
}
|
||||
|
||||
if (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR])
|
||||
{
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0)
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem;
|
||||
|
||||
if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 1) //back
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// this section chooses the pictures for gas mask and NV goggles if the ini setting "SHOW_TACTICAL_FACE_GEAR" is TRUE
|
||||
// and the merc actually wears something to be shown
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem + MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem > 0)
|
||||
{
|
||||
// WANNE: Removed the limitation
|
||||
// silversurfer: don't overwrite icons if they shall be shown!
|
||||
//if ( !gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] )
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem;
|
||||
uiFaceItemTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem;
|
||||
|
||||
uiFaceOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem;
|
||||
uiFaceTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem;
|
||||
|
||||
// check first face slot
|
||||
if (uiFaceItemOne != NONE)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
uiFaceItemOne = 1;
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
uiFaceItemOne = 2;
|
||||
}
|
||||
else uiFaceItemOne = 0;
|
||||
}
|
||||
|
||||
// check second face slot
|
||||
if (uiFaceItemTwo != NONE)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
uiFaceItemTwo = 21;
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
uiFaceItemTwo = 42;
|
||||
}
|
||||
else uiFaceItemTwo = 0;
|
||||
}
|
||||
|
||||
|
||||
// Now select the correct picture. This uses a matrix from uiFaceOneItem and uiFaceTwoItem (simple addition)
|
||||
// the numbers on the outer border are used if that is the only item worn in that slot
|
||||
//
|
||||
// 21 42 63 84
|
||||
// face slot 1 \ slot 2 gas mask | NV goggles | sun goggles | extended ear
|
||||
// 1 gas mask -- 43 64 85
|
||||
// 2 NV goggles 23 -- -- 86
|
||||
// 3 sun goggles 24 -- -- 87
|
||||
// 4 extended ear 25 46 67 --
|
||||
//
|
||||
// this matrix leaves room for expansion
|
||||
// we only need a few of the matrix' values this time because we only show gas mask or NV goggles pictures
|
||||
ubFaceItemsCombined = uiFaceItemOne + uiFaceItemTwo;
|
||||
}
|
||||
|
||||
// WANNE: Removed silversurfers limitation, because it is too complex for the players :)
|
||||
// silversurfer: we don't want to display icons for gas mask or NV goggles because you can actually see the merc wearing the gear
|
||||
// in case of gas mask together with NV we display the picture of the item in face slot 1 and the icon of the item
|
||||
// in face slot 2 (if icons are allowed)
|
||||
|
||||
//Type : 3 - gas mask ; 4 - NV googles
|
||||
// gas mask only
|
||||
|
||||
if (ubFaceItemsCombined == 1 || ubFaceItemsCombined == 21)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles only
|
||||
if (ubFaceItemsCombined == 2 || ubFaceItemsCombined == 42)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles + gas mask
|
||||
if (ubFaceItemsCombined == 23)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4 && zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + NV goggles
|
||||
if (ubFaceItemsCombined == 43)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3 && zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + extended ear
|
||||
if (ubFaceItemsCombined == 24 || ubFaceItemsCombined == 64)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// gas mask + extended ear
|
||||
if (ubFaceItemsCombined == 25 || ubFaceItemsCombined == 85)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 3)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
|
||||
// NV goggles + extended ear
|
||||
if (ubFaceItemsCombined == 46 || ubFaceItemsCombined == 86)
|
||||
{
|
||||
if (zNewFaceGear[uiFaceOne].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP);
|
||||
}
|
||||
else if (zNewFaceGear[uiFaceTwo].Type == 4)
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0)
|
||||
// dirty hack for IMPs because they don't have pictures for face gear
|
||||
// && ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 )
|
||||
{
|
||||
uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem;
|
||||
|
||||
if (uiFaceItemOne != NONE)
|
||||
{
|
||||
if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 2) //front
|
||||
{
|
||||
DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------end of tactical face gear-----------------------------
|
||||
}
|
||||
|
||||
// If blind...
|
||||
if (MercPtrs[pFace->ubSoldierID]->bBlindedCounter > 0)
|
||||
{
|
||||
@@ -2542,6 +2530,37 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!(pFace->uiFlags & FACE_INACTIVE_HANDLED_ELSEWHERE) || fUseExternBuffer)
|
||||
{
|
||||
if (!pFace->fDisabled && !pFace->fInvalidAnim)
|
||||
{
|
||||
// Render text above here if that's what was asked for
|
||||
if (pFace->fDisplayTextOver != FACE_NO_TEXT_OVER)
|
||||
{
|
||||
SetFont(TINYFONT1);
|
||||
SetFontBackground(FONT_MCOLOR_BLACK);
|
||||
SetFontForeground(FONT_MCOLOR_WHITE);
|
||||
|
||||
SetFontDestBuffer(uiRenderBuffer, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE);
|
||||
|
||||
VarFindFontCenterCoordinates(sFaceX, sFaceY, pFace->usFaceWidth, pFace->usFaceHeight, TINYFONT1, &sFontX, &sFontY, pFace->zDisplayText);
|
||||
|
||||
if (pFace->fDisplayTextOver == FACE_DRAW_TEXT_OVER)
|
||||
{
|
||||
gprintfinvalidate(sFontX, sFontY, pFace->zDisplayText);
|
||||
mprintf(sFontX, sFontY, pFace->zDisplayText);
|
||||
}
|
||||
else if (pFace->fDisplayTextOver == FACE_ERASE_TEXT_OVER)
|
||||
{
|
||||
gprintfRestore(sFontX, sFontY, pFace->zDisplayText);
|
||||
pFace->fDisplayTextOver = FACE_NO_TEXT_OVER;
|
||||
}
|
||||
|
||||
SetFontDestBuffer(FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2601,10 +2620,13 @@ BOOLEAN RenderAutoFace( INT32 iFaceIndex )
|
||||
// Check for disabled guy!
|
||||
CHECKF( pFace->fDisabled != TRUE );
|
||||
|
||||
UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE;
|
||||
|
||||
// Set shade
|
||||
if ( pFace->ubSoldierID != NOBODY )
|
||||
{
|
||||
SetFaceShade( MercPtrs[ pFace->ubSoldierID ], pFace, FALSE );
|
||||
uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE);
|
||||
SetFaceShade(pFace, uiFaceShade);
|
||||
}
|
||||
|
||||
// Blit face to save buffer!
|
||||
@@ -2620,7 +2642,7 @@ BOOLEAN RenderAutoFace( INT32 iFaceIndex )
|
||||
}
|
||||
}
|
||||
|
||||
HandleRenderFaceAdjustments( pFace, FALSE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY );
|
||||
HandleRenderFaceAdjustments(pFace, FALSE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade);
|
||||
|
||||
// Restore extern rect
|
||||
if ( pFace->uiAutoRestoreBuffer == guiSAVEBUFFER )
|
||||
@@ -2664,9 +2686,11 @@ BOOLEAN ExternRenderFace( UINT32 uiBuffer, INT32 iFaceIndex, INT16 sX, INT16 sY
|
||||
// Here, any face can be rendered, even if disabled
|
||||
|
||||
// Set shade
|
||||
UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE;
|
||||
if ( pFace->ubSoldierID != NOBODY )
|
||||
{
|
||||
SetFaceShade( MercPtrs[ pFace->ubSoldierID ], pFace , TRUE );
|
||||
uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, TRUE);
|
||||
SetFaceShade(pFace, uiFaceShade);
|
||||
}
|
||||
|
||||
// Blit face to save buffer!
|
||||
@@ -2674,7 +2698,7 @@ BOOLEAN ExternRenderFace( UINT32 uiBuffer, INT32 iFaceIndex, INT16 sX, INT16 sY
|
||||
|
||||
GetFaceRelativeCoordinates( pFace, &usEyesX, &usEyesY, &usMouthX, &usMouthY );
|
||||
|
||||
HandleRenderFaceAdjustments( pFace, FALSE, TRUE, uiBuffer, sX, sY, ( UINT16)( sX + usEyesX ), ( UINT16)( sY + usEyesY ) );
|
||||
HandleRenderFaceAdjustments(pFace, FALSE, TRUE, uiBuffer, sX, sY, (UINT16)(sX + usEyesX), ( UINT16)(sY + usEyesY), uiFaceShade);
|
||||
|
||||
// Restore extern rect
|
||||
if ( uiBuffer == guiSAVEBUFFER )
|
||||
|
||||
@@ -2187,7 +2187,7 @@ void HandleSoldierThrowItem( SOLDIERTYPE *pSoldier, INT32 sGridNo )
|
||||
pSoldier->usPendingAnimation = LOB_ITEM;
|
||||
}
|
||||
// Draw item depending on distance from buddy
|
||||
else if ( GetRangeFromGridNoDiff( sGridNo, pSoldier->sGridNo ) < MIN_LOB_RANGE )
|
||||
else if (PythSpacesAway( sGridNo, pSoldier->sGridNo ) < MIN_LOB_RANGE )
|
||||
{
|
||||
//ddd maybe need to add check for throwing item class - grenade
|
||||
if( (pSoldier->pThrowParams->ubActionCode == THROW_ARM_ITEM) &&
|
||||
@@ -5919,8 +5919,7 @@ void SetOffBoobyTrap( ITEM_POOL * pItemPool )
|
||||
if ( pItemPool )
|
||||
{
|
||||
INT16 sX, sY;
|
||||
sX = CenterX( pItemPool->sGridNo );
|
||||
sY = CenterY( pItemPool->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(pItemPool->sGridNo, &sX, &sY);
|
||||
IgniteExplosion( NOBODY, sX, sY, (INT16) (gpWorldLevelData[pItemPool->sGridNo].sHeight + pItemPool->bRenderZHeightAboveLevel), pItemPool->sGridNo, MINI_GRENADE, 0 );
|
||||
RemoveItemFromPool( pItemPool->sGridNo, pItemPool->iItemIndex, pItemPool->ubLevel );
|
||||
}
|
||||
|
||||
@@ -5619,7 +5619,7 @@ UINT32 UIHandleTOnTerrain( UI_EVENT *pUIEvent )
|
||||
sTargetGridNo = MercPtrs[ ubTargID ]->sGridNo;
|
||||
}
|
||||
|
||||
uiRange = GetRangeFromGridNoDiff( pSoldier->sGridNo, sTargetGridNo );
|
||||
uiRange = PythSpacesAway( pSoldier->sGridNo, sTargetGridNo );
|
||||
|
||||
|
||||
if ( uiRange <= NPC_TALK_RADIUS )
|
||||
@@ -6610,7 +6610,7 @@ BOOLEAN HandleTalkInit( )
|
||||
}
|
||||
|
||||
// Check distance
|
||||
uiRange = GetRangeFromGridNoDiff( pSoldier->sGridNo, usMapPos );
|
||||
uiRange = PythSpacesAway( pSoldier->sGridNo, usMapPos );
|
||||
|
||||
// Double check path
|
||||
if ( GetCivType( pTSoldier ) != CIV_TYPE_NA )
|
||||
|
||||
@@ -1827,7 +1827,7 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
||||
EXITGRID ExitGrid;
|
||||
INT32 iRandom = 0;
|
||||
UINT8 ubMineIndex;
|
||||
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
|
||||
pSoldier2 = NULL;
|
||||
//ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Handling %s, action %d at %ld", gMercProfiles[ ubTargetNPC ].zNickname, usActionCode, GetJA2Clock() );
|
||||
@@ -1840,7 +1840,9 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
||||
if (pSoldier && pSoldier2)
|
||||
{
|
||||
// see if we are facing this person
|
||||
ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(pSoldier2->sGridNo),CenterY(pSoldier2->sGridNo));
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(pSoldier2->sGridNo, &sX2, &sY2);
|
||||
ubDesiredMercDir = atan8(sX, sY, sX2, sY2);
|
||||
// if not already facing in that direction,
|
||||
if (pSoldier->ubDirection != ubDesiredMercDir)
|
||||
{
|
||||
@@ -2317,7 +2319,9 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
||||
if (!TileIsOutOfBounds(sGridNo))
|
||||
{
|
||||
// see if we are facing this person
|
||||
ubDesiredMercDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sGridNo),CenterY(sGridNo));
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX2, &sY2);
|
||||
ubDesiredMercDir = atan8(sX, sY, sX2, sY2);
|
||||
// if not already facing in that direction,
|
||||
if (pSoldier->ubDirection != ubDesiredMercDir)
|
||||
{
|
||||
@@ -5632,7 +5636,9 @@ void HandleRaulBlowingHimselfUp()
|
||||
|
||||
//blow himself up with, hmmm, lets say TNT. :)
|
||||
usItem = HAND_GRENADE;
|
||||
IgniteExplosion( RAUL_UB, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, usItem, pSoldier->pathing.bLevel );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
IgniteExplosion( RAUL_UB, sX, sY, 0, pSoldier->sGridNo, usItem, pSoldier->pathing.bLevel );
|
||||
|
||||
SetJa25GeneralFlag( JA_GF__RAUL_BLOW_HIMSELF_UP );
|
||||
}
|
||||
|
||||
@@ -9570,7 +9570,7 @@ BOOLEAN HandleItemPointerClick( INT32 usMapPos )
|
||||
BOOLEAN ItemCursorInLobRange( INT32 usMapPos )
|
||||
{
|
||||
// Draw item depending on distance from buddy
|
||||
if ( GetRangeFromGridNoDiff( usMapPos, gpItemPointerSoldier->sGridNo ) > MIN_LOB_RANGE )
|
||||
if (PythSpacesAway( usMapPos, gpItemPointerSoldier->sGridNo ) > MIN_LOB_RANGE )
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
|
||||
@@ -2478,14 +2478,16 @@ BOOLEAN DrawCTHIndicator()
|
||||
|
||||
//////////////////////////////////
|
||||
// Calculate Aperture
|
||||
|
||||
INT16 sX, sY;
|
||||
// Calculate the center point of the shooter, in world coordinates.
|
||||
FLOAT dStartX = (FLOAT) CenterX( gCTHDisplay.iShooterGridNo );
|
||||
FLOAT dStartY = (FLOAT) CenterY( gCTHDisplay.iShooterGridNo );
|
||||
ConvertGridNoToCenterCellXY(gCTHDisplay.iShooterGridNo, &sX, &sY);
|
||||
FLOAT dStartX = (FLOAT) sX;
|
||||
FLOAT dStartY = (FLOAT) sY;
|
||||
|
||||
// Calculate the center point of the target, in world coordinates.
|
||||
FLOAT dEndX = (FLOAT) CenterX( gCTHDisplay.iTargetGridNo );
|
||||
FLOAT dEndY = (FLOAT) CenterY( gCTHDisplay.iTargetGridNo );
|
||||
ConvertGridNoToCenterCellXY(gCTHDisplay.iTargetGridNo, &sX, &sY);
|
||||
FLOAT dEndX = (FLOAT) sX;
|
||||
FLOAT dEndY = (FLOAT) sY;
|
||||
|
||||
// Calculate a delta: the difference between the shooter and target.
|
||||
FLOAT dDeltaX = dEndX - dStartX;
|
||||
@@ -6647,4 +6649,4 @@ INT16 GetBackgroundValue( UINT8 usProfile, UINT16 aNr )
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
+10
-5
@@ -9262,13 +9262,16 @@ void CheckEquipmentForDamage( SOLDIERTYPE *pSoldier, INT32 iDamage )
|
||||
if (fBlowsUp)
|
||||
{
|
||||
// blow it up!
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
|
||||
if ( gTacticalStatus.ubAttackBusyCount )
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubAttackerID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, pSoldier->inv[ bSlot ].usItem, pSoldier->pathing.bLevel, pSoldier->ubDirection, &pSoldier->inv[ bSlot ] );
|
||||
IgniteExplosion( pSoldier->ubAttackerID, sX, sY, 0, pSoldier->sGridNo, pSoldier->inv[ bSlot ].usItem, pSoldier->pathing.bLevel, pSoldier->ubDirection, &pSoldier->inv[ bSlot ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, pSoldier->inv[ bSlot ].usItem, pSoldier->pathing.bLevel, pSoldier->ubDirection, &pSoldier->inv[ bSlot ] );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, pSoldier->inv[ bSlot ].usItem, pSoldier->pathing.bLevel, pSoldier->ubDirection, &pSoldier->inv[ bSlot ] );
|
||||
}
|
||||
|
||||
//ADB when something in a stack blows up the whole stack goes, so no need to worry about number of items
|
||||
@@ -9333,7 +9336,9 @@ BOOLEAN DamageItemOnGround( OBJECTTYPE * pObject, INT32 sGridNo, INT8 bLevel, IN
|
||||
if ( fBlowsUp )
|
||||
{
|
||||
// OK, Ignite this explosion!
|
||||
IgniteExplosion( ubOwner, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, pObject->usItem, bLevel, DIRECTION_IRRELEVANT, pObject );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
IgniteExplosion( ubOwner, sX, sY, 0, sGridNo, pObject->usItem, bLevel, DIRECTION_IRRELEVANT, pObject );
|
||||
|
||||
// SANDRO - merc records
|
||||
if ( (pObject->fFlags & OBJECT_ARMED_BOMB) && ((*pObject)[0]->data.misc.ubBombOwner > 1) )
|
||||
@@ -15271,7 +15276,7 @@ BOOLEAN HasItemFlag( UINT16 usItem, UINT64 aFlag )
|
||||
// Flugente: get first item number that has this flag. Use with caution, as we search in all items
|
||||
BOOLEAN GetFirstItemWithFlag( UINT16* pusItem, UINT64 aFlag )
|
||||
{
|
||||
register UINT16 i;
|
||||
UINT16 i;
|
||||
for ( i = 1; i < gMAXITEMS_READ; ++i )
|
||||
{
|
||||
if ( HasItemFlag(i, aFlag) )
|
||||
@@ -15537,7 +15542,7 @@ BOOLEAN GetFirstClothesItemWithSpecificData( UINT16* pusItem, PaletteRepID aPalV
|
||||
UINT32 bestclothestype = 999999;
|
||||
UINT16 bestitem = 0;
|
||||
|
||||
register UINT16 i;
|
||||
UINT16 i;
|
||||
for ( i = 1; i < gMAXITEMS_READ; ++i )
|
||||
{
|
||||
if ( Item[i].clothestype > 0 )
|
||||
|
||||
+4
-3
@@ -669,7 +669,9 @@ void HandleDoorTrap( SOLDIERTYPE * pSoldier, DOOR * pDoor )
|
||||
{
|
||||
case EXPLOSION:
|
||||
// cause damage as a regular hand grenade
|
||||
IgniteExplosion( NOBODY, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 25, pSoldier->sGridNo, HAND_GRENADE, 0 );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
IgniteExplosion( NOBODY, sX, sY, 25, pSoldier->sGridNo, HAND_GRENADE, 0 );
|
||||
break;
|
||||
|
||||
case SIREN:
|
||||
@@ -760,8 +762,7 @@ BOOLEAN AttemptToBlowUpLock(SOLDIERTYPE * pSoldier, DOOR * pDoor)
|
||||
sGridNo = pDoor->sGridNo;
|
||||
|
||||
// Get sX, sy;
|
||||
sX = CenterX(sGridNo);
|
||||
sY = CenterY(sGridNo);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
// Get Z position, based on orientation....
|
||||
sZ = 20;
|
||||
|
||||
+85
-66
@@ -2380,12 +2380,15 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE
|
||||
UINT8 ubNumberOfTiles = pBase->pDBStructureRef->pDBStructure->ubNumberOfTiles;
|
||||
|
||||
INT32 sStructGridNo;
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
ConvertGridNoToCenterCellXY(pStartSoldier->sGridNo, &sX, &sY);
|
||||
|
||||
// loop through all tiles
|
||||
for (UINT8 ubLoop = BASE_TILE; ubLoop < ubNumberOfTiles; ubLoop++)
|
||||
{
|
||||
sStructGridNo = AddPosRelToBase(pBase->sGridNo, ppTile[ubLoop]);
|
||||
if( LineOfSightTest( (FLOAT) CenterX( pStartSoldier->sGridNo ), (FLOAT) CenterY( pStartSoldier->sGridNo ), dStartZPos, (FLOAT) CenterX( sStructGridNo ), (FLOAT) CenterY( sStructGridNo ), dEndZPos, iTileSightLimit, bAware, fSmell, NULL, adjustForSight, cthCalc ) )
|
||||
ConvertGridNoToCenterCellXY(sStructGridNo, &sX2, &sY2);
|
||||
if( LineOfSightTest( (FLOAT) sX, (FLOAT) sY, dStartZPos, (FLOAT) sX2, (FLOAT) sY2, dEndZPos, iTileSightLimit, bAware, fSmell, NULL, adjustForSight, cthCalc ) )
|
||||
{
|
||||
return( TRUE );
|
||||
}
|
||||
@@ -2393,14 +2396,18 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE
|
||||
return( FALSE );
|
||||
}
|
||||
|
||||
return( LineOfSightTest( (FLOAT) CenterX( pStartSoldier->sGridNo ), (FLOAT) CenterY( pStartSoldier->sGridNo ), dStartZPos, (FLOAT) CenterX( pEndSoldier->sGridNo ), (FLOAT) CenterY( pEndSoldier->sGridNo ), dEndZPos, iTileSightLimit, bAware, fSmell, NULL, adjustForSight, cthCalc ) );
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
ConvertGridNoToCenterCellXY(pStartSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(pEndSoldier->sGridNo, &sX2, &sY2);
|
||||
|
||||
return( LineOfSightTest( (FLOAT) sX, (FLOAT) sY, dStartZPos, (FLOAT) sX2, (FLOAT) sY2, dEndZPos, iTileSightLimit, bAware, fSmell, NULL, adjustForSight, cthCalc ) );
|
||||
}
|
||||
|
||||
INT32 SoldierToLocationWindowTest( SOLDIERTYPE * pStartSoldier, INT32 sEndGridNo )
|
||||
{
|
||||
// figure out if there is a SINGLE window between the looker and target
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sXPos, sYPos;
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
INT32 sWindowGridNo = NOWHERE;
|
||||
INT32 iRet;
|
||||
|
||||
@@ -2413,24 +2420,23 @@ INT32 SoldierToLocationWindowTest( SOLDIERTYPE * pStartSoldier, INT32 sEndGridNo
|
||||
dStartZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[pStartSoldier->sGridNo].sHeight );
|
||||
dEndZPos = dStartZPos;
|
||||
|
||||
ConvertGridNoToXY( sEndGridNo, &sXPos, &sYPos );
|
||||
sXPos = sXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sYPos = sYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
ConvertGridNoToCenterCellXY(pStartSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(sEndGridNo, &sX2, &sY2);
|
||||
|
||||
//ADB changed from 255 to 511 to handle new LOS test
|
||||
// We don't want to consider distance limits here so pass in tile sight limit of 255( + 256)
|
||||
// and consider trees as little as possible
|
||||
iRet = LineOfSightTest( (FLOAT) CenterX( pStartSoldier->sGridNo ), (FLOAT) CenterY( pStartSoldier->sGridNo ), dStartZPos, (FLOAT) sXPos, (FLOAT) sYPos, dEndZPos, 511, TRUE, FALSE, &sWindowGridNo );
|
||||
iRet = LineOfSightTest( (FLOAT) sX, (FLOAT) sY, dStartZPos, (FLOAT) sX2, (FLOAT) sY2, dEndZPos, 511, TRUE, FALSE, &sWindowGridNo );
|
||||
|
||||
return( sWindowGridNo );
|
||||
}
|
||||
|
||||
INT32 SoldierTo3DLocationLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32 sGridNo, INT8 bLevel, INT8 bCubeLevel, INT8 bAware, int iTileSightLimit, bool adjustForSight )
|
||||
{
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sXPos, sYPos;
|
||||
UINT8 ubTargetID;
|
||||
BOOLEAN fOk;
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
UINT8 ubTargetID;
|
||||
BOOLEAN fOk;
|
||||
|
||||
CHECKF( pStartSoldier );
|
||||
|
||||
@@ -2457,9 +2463,6 @@ INT32 SoldierTo3DLocationLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32 sGr
|
||||
dEndZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[ sGridNo ].sHeight );
|
||||
}
|
||||
|
||||
ConvertGridNoToXY( sGridNo, &sXPos, &sYPos );
|
||||
sXPos = sXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sYPos = sYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
|
||||
if (iTileSightLimit == CALC_FROM_ALL_DIRS || iTileSightLimit == CALC_FROM_WANTED_DIR) {
|
||||
iTileSightLimit = pStartSoldier->GetMaxDistanceVisible( sGridNo, bLevel, iTileSightLimit );
|
||||
@@ -2468,14 +2471,17 @@ INT32 SoldierTo3DLocationLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32 sGr
|
||||
iTileSightLimit = 255 + pStartSoldier->GetMaxDistanceVisible( sGridNo, bLevel, CALC_FROM_ALL_DIRS );
|
||||
}
|
||||
|
||||
return( LineOfSightTest( (FLOAT) CenterX( pStartSoldier->sGridNo ), (FLOAT) CenterY( pStartSoldier->sGridNo ), dStartZPos, (FLOAT) sXPos, (FLOAT) sYPos, dEndZPos, iTileSightLimit, bAware, HasThermalOptics( pStartSoldier), NULL, adjustForSight ) );
|
||||
ConvertGridNoToCenterCellXY(pStartSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX2, &sY2);
|
||||
|
||||
return( LineOfSightTest( (FLOAT) sX, (FLOAT) sY, dStartZPos, (FLOAT) sX2, (FLOAT) sY2, dEndZPos, iTileSightLimit, bAware, HasThermalOptics( pStartSoldier), NULL, adjustForSight ) );
|
||||
}
|
||||
|
||||
INT32 SoldierToVirtualSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32 sGridNo, INT8 bLevel, INT8 bStance, INT8 bAware, int iTileSightLimit )
|
||||
{
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sXPos, sYPos;
|
||||
BOOLEAN fOk;
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 endXPos, endYPos, startXPos, startYPos;
|
||||
BOOLEAN fOk;
|
||||
|
||||
CHECKF( pStartSoldier );
|
||||
|
||||
@@ -2504,10 +2510,6 @@ INT32 SoldierToVirtualSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32
|
||||
}
|
||||
|
||||
|
||||
ConvertGridNoToXY( sGridNo, &sXPos, &sYPos );
|
||||
sXPos = sXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sYPos = sYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
|
||||
if (iTileSightLimit == CALC_FROM_ALL_DIRS || iTileSightLimit == CALC_FROM_WANTED_DIR) {
|
||||
iTileSightLimit = pStartSoldier->GetMaxDistanceVisible( sGridNo, bLevel, iTileSightLimit );
|
||||
}
|
||||
@@ -2515,13 +2517,15 @@ INT32 SoldierToVirtualSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, INT32
|
||||
iTileSightLimit = 255 + pStartSoldier->GetMaxDistanceVisible( sGridNo, bLevel, CALC_FROM_ALL_DIRS );
|
||||
}
|
||||
|
||||
return( LineOfSightTest( (FLOAT) CenterX( pStartSoldier->sGridNo ), (FLOAT) CenterY( pStartSoldier->sGridNo ), dStartZPos, (FLOAT) sXPos, (FLOAT) sYPos, dEndZPos, iTileSightLimit, bAware, HasThermalOptics( pStartSoldier), NULL, false ) );
|
||||
ConvertGridNoToCenterCellXY(pStartSoldier->sGridNo, &startXPos, &startYPos);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &endXPos, &endYPos);
|
||||
return(LineOfSightTest((FLOAT)startXPos, (FLOAT)startYPos, dStartZPos, (FLOAT)endXPos, (FLOAT)endYPos, dEndZPos, iTileSightLimit, bAware, HasThermalOptics(pStartSoldier), NULL, false));
|
||||
}
|
||||
|
||||
INT32 LocationToLocationLineOfSightTest( INT32 sStartGridNo, INT8 bStartLevel, INT32 sEndGridNo, INT8 bEndLevel, INT8 bAware, int iTileSightLimit, FLOAT dStartPos, FLOAT dEndPos )
|
||||
{
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sStartXPos, sStartYPos, sEndXPos, sEndYPos;
|
||||
FLOAT dStartZPos, dEndZPos;
|
||||
INT16 sStartXPos, sStartYPos, sEndXPos, sEndYPos;
|
||||
|
||||
// Bob: prevent access violation
|
||||
if (sStartGridNo < 0) {
|
||||
@@ -2544,19 +2548,11 @@ INT32 LocationToLocationLineOfSightTest( INT32 sStartGridNo, INT8 bStartLevel, I
|
||||
// add in ground height
|
||||
dStartZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[ sStartGridNo ].sHeight );
|
||||
|
||||
ConvertGridNoToXY( sStartGridNo, &sStartXPos, &sStartYPos );
|
||||
sStartXPos = sStartXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sStartYPos = sStartYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
|
||||
// sevenfm: use height argument
|
||||
dEndZPos = dEndPos + bEndLevel * HEIGHT_UNITS;
|
||||
// add in ground height
|
||||
dEndZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[ sEndGridNo ].sHeight );
|
||||
|
||||
ConvertGridNoToXY( sEndGridNo, &sEndXPos, &sEndYPos );
|
||||
sEndXPos = sEndXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sEndYPos = sEndYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
|
||||
if (iTileSightLimit == CALC_FROM_ALL_DIRS || iTileSightLimit == CALC_FROM_WANTED_DIR)
|
||||
{
|
||||
iTileSightLimit = MaxNormalDistanceVisible();
|
||||
@@ -2565,6 +2561,10 @@ INT32 LocationToLocationLineOfSightTest( INT32 sStartGridNo, INT8 bStartLevel, I
|
||||
{
|
||||
iTileSightLimit = 255 + MaxNormalDistanceVisible();
|
||||
}
|
||||
|
||||
ConvertGridNoToCenterCellXY(sStartGridNo, &sStartXPos, &sStartYPos);
|
||||
ConvertGridNoToCenterCellXY(sEndGridNo, &sEndXPos, &sEndYPos);
|
||||
|
||||
return( LineOfSightTest( (FLOAT)sStartXPos, (FLOAT)sStartYPos, dStartZPos, (FLOAT) sEndXPos, (FLOAT) sEndYPos, dEndZPos, iTileSightLimit, bAware, FALSE, NULL ) );
|
||||
}
|
||||
|
||||
@@ -2931,20 +2931,24 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
|
||||
|
||||
// Flugente: we measure the distance of the bullet's location to the location of the soldier, and to the 2 gridnos his head and leg occupy
|
||||
// From this we can decide what body part was hit
|
||||
FLOAT bodycenterX = (FLOAT)CenterX( pTarget->sGridNo );
|
||||
FLOAT bodycenterY = (FLOAT)CenterY( pTarget->sGridNo );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pTarget->sGridNo, &sX, &sY);
|
||||
FLOAT bodycenterX = (FLOAT) sX;
|
||||
FLOAT bodycenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftobodycenter = sqrt( (bodycenterX - x) * (bodycenterX - x) + (bodycenterY - y) * (bodycenterY - y) );
|
||||
|
||||
INT32 viewdirectiongridno = NewGridNo( pTarget->sGridNo, DirectionInc( pTarget->ubDirection ) );
|
||||
FLOAT nextgridnocenterX = (FLOAT)CenterX( viewdirectiongridno );
|
||||
FLOAT nextgridnocenterY = (FLOAT)CenterY( viewdirectiongridno );
|
||||
ConvertGridNoToCenterCellXY(viewdirectiongridno, &sX, &sY);
|
||||
FLOAT nextgridnocenterX = (FLOAT) sX;
|
||||
FLOAT nextgridnocenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftonextgridno = sqrt( (nextgridnocenterX - x) * (nextgridnocenterX - x) + (nextgridnocenterY - y) * (nextgridnocenterY - y) );
|
||||
|
||||
INT32 oppositeviewdirectiongridno = NewGridNo( pTarget->sGridNo, DirectionInc( gOppositeDirection[pTarget->ubDirection] ) );
|
||||
FLOAT oppositenextgridnocenterX = (FLOAT)CenterX( oppositeviewdirectiongridno );
|
||||
FLOAT oppositenextgridnocenterY = (FLOAT)CenterY( oppositeviewdirectiongridno );
|
||||
ConvertGridNoToCenterCellXY(oppositeviewdirectiongridno, &sX, &sY);
|
||||
FLOAT oppositenextgridnocenterX = (FLOAT) sX;
|
||||
FLOAT oppositenextgridnocenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftooppositenextgridno = sqrt( (oppositenextgridnocenterX - x) * (oppositenextgridnocenterX - x) + (oppositenextgridnocenterY - y) * (oppositenextgridnocenterY - y) );
|
||||
|
||||
@@ -4319,8 +4323,9 @@ UINT8 CalcChanceToGetThrough( BULLET * pBullet )
|
||||
|
||||
UINT8 SoldierToSoldierChanceToGetThrough( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE * pEndSoldier )
|
||||
{
|
||||
FLOAT dEndZPos;
|
||||
BOOLEAN fOk;
|
||||
INT16 sX, sY;
|
||||
FLOAT dEndZPos;
|
||||
BOOLEAN fOk;
|
||||
|
||||
if (pStartSoldier == pEndSoldier)
|
||||
{
|
||||
@@ -4337,15 +4342,18 @@ UINT8 SoldierToSoldierChanceToGetThrough( SOLDIERTYPE * pStartSoldier, SOLDIERTY
|
||||
// set startsoldier's target ID ... need an ID stored in case this
|
||||
// is the AI calculating cover to a location where he might not be any more
|
||||
pStartSoldier->ubCTGTTargetID = pEndSoldier->ubID;
|
||||
return( ChanceToGetThrough( pStartSoldier, (FLOAT) CenterX( pEndSoldier->sGridNo ), (FLOAT) CenterY( pEndSoldier->sGridNo ), dEndZPos ) );
|
||||
|
||||
ConvertGridNoToCenterCellXY(pEndSoldier->sGridNo, &sX, &sY);
|
||||
return( ChanceToGetThrough( pStartSoldier, (FLOAT) sX, (FLOAT) sY, dEndZPos ) );
|
||||
}
|
||||
|
||||
UINT8 SoldierToSoldierBodyPartChanceToGetThrough( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE * pEndSoldier, UINT8 ubAimLocation )
|
||||
{
|
||||
// does like StS-CTGT but with a particular body part in mind
|
||||
FLOAT dEndZPos;
|
||||
BOOLEAN fOk;
|
||||
UINT8 ubPosType;
|
||||
INT16 sX, sY;
|
||||
FLOAT dEndZPos;
|
||||
BOOLEAN fOk;
|
||||
UINT8 ubPosType;
|
||||
|
||||
if (pStartSoldier == pEndSoldier)
|
||||
{
|
||||
@@ -4378,7 +4386,8 @@ UINT8 SoldierToSoldierBodyPartChanceToGetThrough( SOLDIERTYPE * pStartSoldier, S
|
||||
// set startsoldier's target ID ... need an ID stored in case this
|
||||
// is the AI calculating cover to a location where he might not be any more
|
||||
pStartSoldier->ubCTGTTargetID = pEndSoldier->ubID;
|
||||
return( ChanceToGetThrough( pStartSoldier, (FLOAT) CenterX( pEndSoldier->sGridNo ), (FLOAT) CenterY( pEndSoldier->sGridNo ), dEndZPos ) );
|
||||
ConvertGridNoToCenterCellXY(pEndSoldier->sGridNo, &sX, &sY);
|
||||
return( ChanceToGetThrough( pStartSoldier, (FLOAT) sX, (FLOAT) sY, dEndZPos ) );
|
||||
}
|
||||
|
||||
UINT8 SoldierToLocationChanceToGetThrough( SOLDIERTYPE * pStartSoldier, INT32 sGridNo, INT8 bLevel, INT8 bCubeLevel, UINT8 ubTargetID )
|
||||
@@ -4423,9 +4432,7 @@ UINT8 SoldierToLocationChanceToGetThrough( SOLDIERTYPE * pStartSoldier, INT32 sG
|
||||
}
|
||||
|
||||
dEndZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[sGridNo].sHeight );
|
||||
ConvertGridNoToXY( sGridNo, &sXPos, &sYPos );
|
||||
sXPos = sXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sYPos = sYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sXPos, &sYPos);
|
||||
|
||||
// set startsoldier's target ID ... need an ID stored in case this
|
||||
// is the AI calculating cover to a location where he might not be any more
|
||||
@@ -4437,6 +4444,7 @@ UINT8 SoldierToLocationChanceToGetThrough( SOLDIERTYPE * pStartSoldier, INT32 sG
|
||||
UINT8 AISoldierToSoldierChanceToGetThrough( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE * pEndSoldier )
|
||||
{
|
||||
// Like a standard CTGT algorithm BUT fakes the start soldier at standing height
|
||||
INT16 sX, sY;
|
||||
FLOAT dEndZPos;
|
||||
BOOLEAN fOk;
|
||||
UINT8 ubChance;
|
||||
@@ -4460,7 +4468,8 @@ UINT8 AISoldierToSoldierChanceToGetThrough( SOLDIERTYPE * pStartSoldier, SOLDIER
|
||||
// is the AI calculating cover to a location where he might not be any more
|
||||
pStartSoldier->ubCTGTTargetID = NOBODY;
|
||||
|
||||
ubChance = ChanceToGetThrough( pStartSoldier, (FLOAT) CenterX( pEndSoldier->sGridNo ), (FLOAT) CenterY( pEndSoldier->sGridNo ), dEndZPos );
|
||||
ConvertGridNoToCenterCellXY(pEndSoldier->sGridNo, &sX, &sY);
|
||||
ubChance = ChanceToGetThrough( pStartSoldier, (FLOAT) sX, (FLOAT) sY, dEndZPos );
|
||||
pStartSoldier->usAnimState = usTrueState;
|
||||
return( ubChance );
|
||||
}
|
||||
@@ -4510,9 +4519,7 @@ UINT8 AISoldierToLocationChanceToGetThrough( SOLDIERTYPE * pStartSoldier, INT32
|
||||
}
|
||||
|
||||
dEndZPos += CONVERT_PIXELS_TO_HEIGHTUNITS( gpWorldLevelData[sGridNo].sHeight );
|
||||
ConvertGridNoToXY( sGridNo, &sXPos, &sYPos );
|
||||
sXPos = sXPos * CELL_X_SIZE + (CELL_X_SIZE / 2);
|
||||
sYPos = sYPos * CELL_Y_SIZE + (CELL_Y_SIZE / 2);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sXPos, &sYPos);
|
||||
|
||||
// set startsoldier's target ID ... need an ID stored in case this
|
||||
// is the AI calculating cover to a location where he might not be any more
|
||||
@@ -4788,6 +4795,7 @@ INT8 FireBulletGivenTargetNCTH( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY,
|
||||
UINT8 ubSpreadIndex = 0;
|
||||
UINT16 usBulletFlags = 0;
|
||||
int n=0;
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
OBJECTTYPE* pObjAttHand = pFirer->GetUsedWeapon( &(pFirer->inv[pFirer->ubAttackingHand]) );
|
||||
|
||||
@@ -4799,8 +4807,9 @@ INT8 FireBulletGivenTargetNCTH( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY,
|
||||
|
||||
CalculateSoldierZPos( pFirer, FIRING_POS, &dStartZ );
|
||||
|
||||
dStartX = (FLOAT) CenterX( pFirer->sGridNo );
|
||||
dStartY = (FLOAT) CenterY( pFirer->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(pFirer->sGridNo, &sXPos, &sYPos);
|
||||
dStartX = (FLOAT) sXPos;
|
||||
dStartY = (FLOAT) sYPos;
|
||||
|
||||
dDeltaX = dEndX - dStartX;
|
||||
dDeltaY = dEndY - dStartY;
|
||||
@@ -5279,6 +5288,7 @@ INT8 FireBulletGivenTarget( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, FLOA
|
||||
UINT8 ubSpreadIndex = 0;
|
||||
UINT16 usBulletFlags = 0;
|
||||
int n=0;
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
OBJECTTYPE* pObjAttHand = pFirer->GetUsedWeapon( &(pFirer->inv[pFirer->ubAttackingHand]) );
|
||||
|
||||
@@ -5290,8 +5300,9 @@ INT8 FireBulletGivenTarget( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, FLOA
|
||||
|
||||
CalculateSoldierZPos( pFirer, FIRING_POS, &dStartZ );
|
||||
|
||||
dStartX = (FLOAT) CenterX( pFirer->sGridNo );
|
||||
dStartY = (FLOAT) CenterY( pFirer->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(pFirer->sGridNo, &sXPos, &sYPos);
|
||||
dStartX = (FLOAT) sXPos;
|
||||
dStartY = (FLOAT) sYPos;
|
||||
|
||||
dDeltaX = dEndX - dStartX;
|
||||
dDeltaY = dEndY - dStartY;
|
||||
@@ -5954,6 +5965,7 @@ INT8 FireBulletGivenTargetTrapOnly( SOLDIERTYPE* pThrower, OBJECTTYPE* pObj, INT
|
||||
UINT8 ubSpreadIndex = 0;
|
||||
UINT16 usBulletFlags = 0;
|
||||
int n=0;
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
UINT16 usItem = pObj->usItem;
|
||||
UINT8 ammotype = ( *pObj )[0]->data.gun.ubGunAmmoType;
|
||||
@@ -5962,8 +5974,9 @@ INT8 FireBulletGivenTargetTrapOnly( SOLDIERTYPE* pThrower, OBJECTTYPE* pObj, INT
|
||||
if ( AmmoTypes[ammotype].numberOfBullets > 1 )
|
||||
fBuckshot = TRUE;
|
||||
|
||||
dStartX = (FLOAT) CenterX( gridno );
|
||||
dStartY = (FLOAT) CenterY( gridno );
|
||||
ConvertGridNoToCenterCellXY(gridno, &sXPos, &sYPos);
|
||||
dStartX = (FLOAT) sXPos;
|
||||
dStartY = (FLOAT) sYPos;
|
||||
|
||||
dDeltaX = dEndX - dStartX;
|
||||
dDeltaY = dEndY - dStartY;
|
||||
@@ -6541,13 +6554,15 @@ INT8 FireBulletGivenTarget_NoObjectNoSoldier( UINT16 usItem, UINT8 ammotype, UIN
|
||||
UINT8 ubSpreadIndex = 0;
|
||||
UINT16 usBulletFlags = 0;
|
||||
int n = 0;
|
||||
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
BOOLEAN fBuckshot = FALSE;
|
||||
if ( AmmoTypes[ammotype].numberOfBullets > 1 )
|
||||
fBuckshot = TRUE;
|
||||
|
||||
dStartX = (FLOAT)CenterX( gridno );
|
||||
dStartY = (FLOAT)CenterY( gridno );
|
||||
ConvertGridNoToCenterCellXY(gridno, &sXPos, &sYPos);
|
||||
dStartX = (FLOAT)sXPos;
|
||||
dStartY = (FLOAT)sYPos;
|
||||
|
||||
dDeltaX = dEndX - dStartX;
|
||||
dDeltaY = dEndY - dStartY;
|
||||
@@ -8537,8 +8552,10 @@ void AdjustTargetCenterPoint( SOLDIERTYPE *pShooter, INT32 iTargetGridNo, FLOAT
|
||||
CalculateSoldierZPos( pShooter, FIRING_POS, &dStartZ );
|
||||
|
||||
// Locate absolute center X,Y of the shooter
|
||||
dStartX = (FLOAT) CenterX( pShooter->sGridNo );
|
||||
dStartY = (FLOAT) CenterY( pShooter->sGridNo );
|
||||
INT16 sXPos, sYPos;
|
||||
ConvertGridNoToCenterCellXY(pShooter->sGridNo, &sXPos, &sYPos);
|
||||
dStartX = (FLOAT) sXPos;
|
||||
dStartY = (FLOAT) sYPos;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Calculate difference (Delta) between start and end point of bullet flight
|
||||
@@ -9157,8 +9174,10 @@ void CalcTargetMovementOffset( SOLDIERTYPE *pShooter, SOLDIERTYPE *pTarget, OBJE
|
||||
{
|
||||
// HEADROCK HAM 4: Hopefully the right spot for this: This soldier has no "old" coordinates, so just set them
|
||||
// to wherever he/she is currently standing.
|
||||
pTarget->sOldXPos = CenterX( pTarget->sGridNo );
|
||||
pTarget->sOldYPos = CenterY( pTarget->sGridNo );
|
||||
INT16 sXPos, sYPos;
|
||||
ConvertGridNoToCenterCellXY(pTarget->sGridNo, &sXPos, &sYPos);
|
||||
pTarget->sOldXPos = sXPos;
|
||||
pTarget->sOldYPos = sYPos;
|
||||
// Since movement is now nonexistent, break the formula here without adjusting coordinates.
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -561,8 +561,7 @@ INT32 AddRottingCorpse( ROTTING_CORPSE_DEFINITION *pCorpseDef )
|
||||
}
|
||||
else
|
||||
{
|
||||
AniParams.sX = CenterX(pCorpse->def.sGridNo);
|
||||
AniParams.sY = CenterY(pCorpse->def.sGridNo);
|
||||
ConvertGridNoToCenterCellXY(pCorpse->def.sGridNo, &AniParams.sX, &AniParams.sY);
|
||||
}
|
||||
|
||||
AniParams.sZ = (INT16)pCorpse->def.sHeightAdjustment;
|
||||
@@ -1588,8 +1587,7 @@ void VaporizeCorpse( INT32 sGridNo, INT8 asLevel, UINT16 usStructureID )
|
||||
AniParams.sDelay = (INT16)( 80 );
|
||||
AniParams.sStartFrame = 0;
|
||||
AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD;
|
||||
AniParams.sX = CenterX( sBaseGridNo );
|
||||
AniParams.sY = CenterY( sBaseGridNo );
|
||||
ConvertGridNoToCenterCellXY(sBaseGridNo, &AniParams.sX, &AniParams.sY);
|
||||
AniParams.sZ = (INT16)pCorpse->def.sHeightAdjustment;
|
||||
|
||||
strcpy( AniParams.zCachedFile, "TILECACHE\\GEN_BLOW.STI" );
|
||||
@@ -2284,10 +2282,12 @@ BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel )
|
||||
Corpse.ubBodyType = REGMALE;
|
||||
}
|
||||
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
Corpse.sGridNo = sGridNo;
|
||||
|
||||
Corpse.dXPos = CenterX(Corpse.sGridNo);
|
||||
Corpse.dYPos = CenterY(Corpse.sGridNo);
|
||||
Corpse.dXPos = sX;
|
||||
Corpse.dYPos = sY;
|
||||
|
||||
Corpse.sHeightAdjustment = 0;
|
||||
|
||||
|
||||
@@ -776,7 +776,7 @@ BOOLEAN EnterShopKeeperInterface()
|
||||
else
|
||||
pShopkeeper = FindSoldierByProfileID( armsDealerInfo[gbSelectedArmsDealerID].ubShopKeeperID, FALSE );
|
||||
|
||||
if ( GetRangeFromGridNoDiff( pSoldier->sGridNo, pShopkeeper->sGridNo ) > NPC_TALK_RADIUS )
|
||||
if (PythSpacesAway( pSoldier->sGridNo, pShopkeeper->sGridNo ) > NPC_TALK_RADIUS )
|
||||
{
|
||||
//so now we know we are too far away to trade, so instead of just quitting,
|
||||
//either post a message or run to the guy like HandleTalkInit does
|
||||
@@ -6668,7 +6668,7 @@ BOOLEAN CanMercInteractWithSelectedShopkeeper( SOLDIERTYPE *pSoldier )
|
||||
if ( SoldierTo3DLocationLineOfSightTest( pSoldier, sDestGridNo, bDestLevel, 3, TRUE, CALC_FROM_ALL_DIRS ) )
|
||||
{
|
||||
// Get range to shopkeeper
|
||||
uiRange = GetRangeFromGridNoDiff( pSoldier->sGridNo, sDestGridNo );
|
||||
uiRange = PythSpacesAway( pSoldier->sGridNo, sDestGridNo );
|
||||
|
||||
// and is close enough to talk to the shopkeeper (use this define INSTEAD of PASSING_ITEM_DISTANCE_OKLIFE!)
|
||||
if ( uiRange <= NPC_TALK_RADIUS )
|
||||
|
||||
+11
-22
@@ -1367,11 +1367,9 @@ void InternalSoldierInSectorSleep( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN
|
||||
usAnim = STANDING;
|
||||
}
|
||||
|
||||
// OK, look for sutable placement....
|
||||
// OK, look for suitable placement....
|
||||
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, usAnim, sGridNo, 5, &ubNewDirection, FALSE );
|
||||
|
||||
sWorldX = CenterX( sGoodGridNo );
|
||||
sWorldY = CenterY( sGoodGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGoodGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
pSoldier->EVENT_SetSoldierPosition( sWorldX, sWorldY );
|
||||
|
||||
@@ -1408,11 +1406,9 @@ void SoldierInSectorIncompaciated( SOLDIERTYPE *pSoldier, INT32 sGridNo )
|
||||
return;
|
||||
}
|
||||
|
||||
// OK, look for sutable placement....
|
||||
// OK, look for suitable placement....
|
||||
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, STAND_FALLFORWARD_STOP, sGridNo, 5, &ubNewDirection, FALSE );
|
||||
|
||||
sWorldX = CenterX( sGoodGridNo );
|
||||
sWorldY = CenterY( sGoodGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGoodGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
pSoldier->EVENT_SetSoldierPosition( sWorldX, sWorldY );
|
||||
|
||||
@@ -1444,11 +1440,9 @@ void SoldierInSectorPatient( SOLDIERTYPE *pSoldier, INT32 sGridNo )
|
||||
return;
|
||||
}
|
||||
|
||||
// OK, look for sutable placement....
|
||||
// OK, look for suitable placement....
|
||||
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, BEING_PATIENT, sGridNo, 5, &ubNewDirection, FALSE );
|
||||
|
||||
sWorldX = CenterX( sGoodGridNo );
|
||||
sWorldY = CenterY( sGoodGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGoodGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
pSoldier->EVENT_SetSoldierPosition( sWorldX, sWorldY );
|
||||
|
||||
@@ -1479,11 +1473,9 @@ void SoldierInSectorDoctor( SOLDIERTYPE *pSoldier, INT32 sGridNo )
|
||||
return;
|
||||
}
|
||||
|
||||
// OK, look for sutable placement....
|
||||
// OK, look for suitable placement....
|
||||
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, BEING_DOCTOR, sGridNo, 5, &ubNewDirection, FALSE );
|
||||
|
||||
sWorldX = CenterX( sGoodGridNo );
|
||||
sWorldY = CenterY( sGoodGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGoodGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
pSoldier->EVENT_SetSoldierPosition( sWorldX, sWorldY );
|
||||
|
||||
@@ -1514,11 +1506,9 @@ void SoldierInSectorRepair( SOLDIERTYPE *pSoldier, INT32 sGridNo )
|
||||
return;
|
||||
}
|
||||
|
||||
// OK, look for sutable placement....
|
||||
// OK, look for suitable placement....
|
||||
sGoodGridNo = FindGridNoFromSweetSpotWithStructData( pSoldier, BEING_REPAIRMAN, sGridNo, 5, &ubNewDirection, FALSE );
|
||||
|
||||
sWorldX = CenterX( sGoodGridNo );
|
||||
sWorldY = CenterY( sGoodGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGoodGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
pSoldier->EVENT_SetSoldierPosition( sWorldX, sWorldY );
|
||||
|
||||
@@ -1550,8 +1540,7 @@ void AddSoldierToSectorGridNo( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubDir
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("AddSoldierToSectorGridNo"));
|
||||
|
||||
// Add merc to gridno
|
||||
sWorldX = CenterX( sGridNo );
|
||||
sWorldY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sWorldX, &sWorldY);
|
||||
|
||||
// Set reserved location!
|
||||
pSoldier->sReservedMovementGridNo = NOWHERE;
|
||||
|
||||
@@ -280,7 +280,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
//sNewGridNo = NewGridNo( pSoldier->sGridNo, (UINT16)DirectionInc( pSoldier->ubDirection ) );
|
||||
ConvertMapPosToWorldTileCenter( pSoldier->sTempNewGridNo, &sXPos, &sYPos );
|
||||
ConvertGridNoToCenterCellXY( pSoldier->sTempNewGridNo, &sXPos, &sYPos );
|
||||
pSoldier->EVENT_SetSoldierPosition( (FLOAT)sXPos, (FLOAT)sYPos );
|
||||
}
|
||||
|
||||
@@ -717,8 +717,7 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
|
||||
// CODE: End Hop Fence
|
||||
// MOVE TO FORCASTED GRIDNO
|
||||
sX = CenterX( pSoldier->sForcastGridno );
|
||||
sY = CenterY( pSoldier->sForcastGridno );
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sForcastGridno, &sX, &sY);
|
||||
|
||||
pSoldier->EVENT_InternalSetSoldierPosition( (FLOAT) sX, (FLOAT) sY, FALSE, FALSE, FALSE );
|
||||
pSoldier->EVENT_SetSoldierDirection( gTwoCDirection[ pSoldier->ubDirection ] );
|
||||
|
||||
@@ -5041,8 +5041,10 @@ void SOLDIERTYPE::EVENT_FireSoldierWeapon( INT32 sTargetGridNo )
|
||||
}
|
||||
else if (!TileIsOutOfBounds(sTargetGridNo) && !GridNoOnScreen(sTargetGridNo))
|
||||
{
|
||||
INT16 sNewCenterWorldX = CenterX(sTargetGridNo);
|
||||
INT16 sNewCenterWorldY = CenterY(sTargetGridNo);
|
||||
INT16 sNewCenterWorldX;
|
||||
INT16 sNewCenterWorldY;
|
||||
ConvertGridNoToCenterCellXY(sTargetGridNo, &sNewCenterWorldX, &sNewCenterWorldY);
|
||||
|
||||
SetRenderCenter(sNewCenterWorldX, sNewCenterWorldY);
|
||||
|
||||
// Plot new path!
|
||||
@@ -7359,7 +7361,7 @@ void SOLDIERTYPE::EVENT_InternalSetSoldierDestination( UINT16 usNewDirection, BO
|
||||
// Get dest gridno, convert to center coords
|
||||
sNewGridNo = NewGridNo( this->sGridNo, DirectionInc( (UINT8)usNewDirection ) );
|
||||
|
||||
ConvertMapPosToWorldTileCenter( sNewGridNo, &sXPos, &sYPos );
|
||||
ConvertGridNoToCenterCellXY( sNewGridNo, &sXPos, &sYPos );
|
||||
|
||||
// Save new dest gridno, x, y
|
||||
this->pathing.sDestination = sNewGridNo;
|
||||
@@ -11544,7 +11546,7 @@ void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckR
|
||||
{
|
||||
INT16 this_base_x = 0;
|
||||
INT16 this_base_y = 0;
|
||||
ConvertMapPosToWorldTileCenter( this->sGridNo, &this_base_x, &this_base_y );
|
||||
ConvertGridNoToCenterCellXY( this->sGridNo, &this_base_x, &this_base_y );
|
||||
|
||||
dx = this->dXPos - this_base_x;
|
||||
dy = this->dYPos - this_base_y;
|
||||
@@ -11552,7 +11554,7 @@ void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckR
|
||||
|
||||
INT16 base_x = 0;
|
||||
INT16 base_y = 0;
|
||||
ConvertMapPosToWorldTileCenter( gridnotouse, &base_x, &base_y );
|
||||
ConvertGridNoToCenterCellXY( gridnotouse, &base_x, &base_y );
|
||||
|
||||
pSoldier->EVENT_InternalSetSoldierPosition( base_x + dx, base_y + dy, FALSE, FALSE, FALSE );
|
||||
}
|
||||
@@ -11586,27 +11588,33 @@ void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckR
|
||||
// adjust both gridno and x,y coordinates
|
||||
if (sOldGridNo != this->sGridNo)
|
||||
{
|
||||
CorpseDef.sGridNo = sOldGridNo;
|
||||
CorpseDef.dXPos = CenterX(CorpseDef.sGridNo);
|
||||
CorpseDef.dYPos = CenterY(CorpseDef.sGridNo);
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sOldGridNo, &sX, &sY);
|
||||
|
||||
CorpseDef.sGridNo = sOldGridNo;
|
||||
CorpseDef.dXPos = sX;
|
||||
CorpseDef.dYPos = sY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// move corpse a bit
|
||||
INT16 this_base_x = 0;
|
||||
INT16 this_base_y = 0;
|
||||
ConvertMapPosToWorldTileCenter(this->sGridNo, &this_base_x, &this_base_y);
|
||||
ConvertGridNoToCenterCellXY(this->sGridNo, &this_base_x, &this_base_y);
|
||||
|
||||
FLOAT dx = this->dXPos - this_base_x;
|
||||
FLOAT dy = this->dYPos - this_base_y;
|
||||
|
||||
INT16 base_x = 0;
|
||||
INT16 base_y = 0;
|
||||
ConvertMapPosToWorldTileCenter(pCorpse->def.sGridNo, &base_x, &base_y);
|
||||
ConvertGridNoToCenterCellXY(pCorpse->def.sGridNo, &base_x, &base_y);
|
||||
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pCorpse->def.sGridNo, &sX, &sY);
|
||||
|
||||
CorpseDef.sGridNo = pCorpse->def.sGridNo;
|
||||
CorpseDef.dXPos = CenterX(CorpseDef.sGridNo) + dx;
|
||||
CorpseDef.dYPos = CenterY(CorpseDef.sGridNo) + dy;
|
||||
CorpseDef.dXPos = sX + dx;
|
||||
CorpseDef.dYPos = sY + dy;
|
||||
}
|
||||
|
||||
CorpseDef.usFlags |= ROTTING_CORPSE_USE_XY_PROVIDED;
|
||||
@@ -11768,6 +11776,17 @@ UINT8 GetDirectionFromXY( INT16 sXPos, INT16 sYPos, SOLDIERTYPE *pSoldier )
|
||||
return(atan8( sXPos2, sYPos2, sXPos, sYPos ));
|
||||
}
|
||||
|
||||
INT16 GetDirectionFromCenterCellXYGridNo(INT32 EndGridNo, INT32 StartGridNo)
|
||||
{
|
||||
INT16 sXPos2, sYPos2;
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
ConvertGridNoToCenterCellXY(StartGridNo, &sXPos, &sYPos);
|
||||
ConvertGridNoToCenterCellXY(EndGridNo, &sXPos2, &sYPos2);
|
||||
|
||||
return(atan8(sXPos2, sYPos2, sXPos, sYPos));
|
||||
}
|
||||
|
||||
|
||||
//#if 0
|
||||
UINT8 atan8( INT16 sXPos, INT16 sYPos, INT16 sXPos2, INT16 sYPos2 )
|
||||
@@ -12261,8 +12280,7 @@ void SOLDIERTYPE::ReviveSoldier( void )
|
||||
this->BeginSoldierGetup( );
|
||||
|
||||
// Makesure center of tile
|
||||
sX = CenterX( this->sGridNo );
|
||||
sY = CenterY( this->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(this->sGridNo, &sX, &sY);
|
||||
|
||||
this->EVENT_SetSoldierPosition( (FLOAT)sX, (FLOAT)sY );
|
||||
|
||||
@@ -13962,8 +13980,7 @@ void SOLDIERTYPE::EVENT_StopMerc( INT32 sGridNo, INT8 bDirection )
|
||||
|
||||
// MOVE GUY TO GRIDNO--- SHOULD BE THE SAME UNLESS IN MULTIPLAYER
|
||||
// Makesure center of tile
|
||||
sX = CenterX( sGridNo );
|
||||
sY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
//Cancel pending events
|
||||
if ( !this->flags.fDelayedMovement )
|
||||
@@ -15862,7 +15879,7 @@ BOOLEAN SOLDIERTYPE::SeemsLegit( UINT8 ubObserverID )
|
||||
}
|
||||
|
||||
UINT8 covertlevel = NUM_SKILL_TRAITS( this, COVERT_NT ); // our level in covert operations
|
||||
INT32 distance = GetRangeFromGridNoDiff( this->sGridNo, pSoldier->sGridNo );
|
||||
INT32 distance = PythSpacesAway( this->sGridNo, pSoldier->sGridNo );
|
||||
|
||||
// if we are closer than this, our cover will always break if we do not have the skill
|
||||
// if we have the skill, our cover will blow if we dress up as a soldier, but not if we are dressed like a civilian
|
||||
@@ -20865,7 +20882,7 @@ void SOLDIERTYPE::CancelDrag()
|
||||
{
|
||||
INT16 base_x = 0;
|
||||
INT16 base_y = 0;
|
||||
ConvertMapPosToWorldTileCenter(pSoldier->sGridNo, &base_x, &base_y);
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &base_x, &base_y);
|
||||
|
||||
pSoldier->EVENT_InternalSetSoldierPosition(base_x, base_y, FALSE, FALSE, FALSE);
|
||||
}
|
||||
@@ -23199,7 +23216,7 @@ BOOLEAN SOLDIERTYPE::PlayerSoldierStartTalking( UINT8 ubTargetID, BOOLEAN fValid
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
uiRange = GetRangeFromGridNoDiff( this->sGridNo, pTSoldier->sGridNo );
|
||||
uiRange = PythSpacesAway( this->sGridNo, pTSoldier->sGridNo );
|
||||
|
||||
if ( uiRange > (NPC_TALK_RADIUS * 2) )
|
||||
{
|
||||
|
||||
@@ -2204,7 +2204,8 @@ BOOLEAN GetDirectionChangeAmount( INT32 sGridNo, SOLDIERTYPE *pSoldier, UINT8 ui
|
||||
UINT8 GetDirectionFromGridNo( INT32 sGridNo, SOLDIERTYPE *pSoldier );
|
||||
UINT8 atan8( INT16 sXPos, INT16 sYPos, INT16 sXPos2, INT16 sYPos2 );
|
||||
UINT8 atan8FromAngle( DOUBLE dAngle );
|
||||
INT16 GetDirectionToGridNoFromGridNo( INT32 sGridNoDest, INT32 sGridNoSrc );
|
||||
INT16 GetDirectionToGridNoFromGridNo(INT32 sGridNoDest, INT32 sGridNoSrc);
|
||||
INT16 GetDirectionFromCenterCellXYGridNo(INT32 EndGridNo, INT32 StartGridNo);
|
||||
// This function is now obsolete. Call ReduceAttackBusyCount instead.
|
||||
// void ReleaseSoldiersAttacker( SOLDIERTYPE *pSoldier );
|
||||
|
||||
|
||||
+16
-12
@@ -814,8 +814,7 @@ BOOLEAN SoldierLocationRelativeToScreen( INT32 sGridNo, UINT16 usReasonID, INT8
|
||||
|
||||
*puiScrollFlags = 0;
|
||||
|
||||
sX = CenterX( sGridNo );
|
||||
sY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
// Get screen coordinates for current position of soldier
|
||||
GetWorldXYAbsoluteScreenXY( (INT16)(sX/CELL_X_SIZE), (INT16)(sY/CELL_Y_SIZE), &sWorldX, &sWorldY);
|
||||
@@ -954,25 +953,28 @@ BOOLEAN FindRelativeSoldierPosition( SOLDIERTYPE *pSoldier, UINT16 *usFlags, INT
|
||||
// Then, depending on whether this is the gridno we are looking at, this will be head or legs
|
||||
if ( gGameExternalOptions.fAllowTargetHeadAndLegIfProne )
|
||||
{
|
||||
INT16 sWorldX, sWorldY;
|
||||
INT16 sWorldX, sWorldY, sX, sY;
|
||||
GetMouseWorldCoords( &sWorldX, &sWorldY );
|
||||
|
||||
// Flugente: we measure the distance of the bullet's location to the location of the soldier, and to the 2 gridnos his head and leg occupy
|
||||
// From this we can decide what body part was hit
|
||||
FLOAT bodycenterX = (FLOAT)CenterX( pSoldier->sGridNo );
|
||||
FLOAT bodycenterY = (FLOAT)CenterY( pSoldier->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
FLOAT bodycenterX = (FLOAT) sX;
|
||||
FLOAT bodycenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftobodycenter = sqrt( (bodycenterX - sWorldX) * (bodycenterX - sWorldX) + (bodycenterY - sWorldY) * (bodycenterY - sWorldY) );
|
||||
|
||||
INT32 viewdirectiongridno = NewGridNo( pSoldier->sGridNo, DirectionInc( pSoldier->ubDirection ) );
|
||||
FLOAT nextgridnocenterX = (FLOAT)CenterX( viewdirectiongridno );
|
||||
FLOAT nextgridnocenterY = (FLOAT)CenterY( viewdirectiongridno );
|
||||
ConvertGridNoToCenterCellXY(viewdirectiongridno, &sX, &sY);
|
||||
FLOAT nextgridnocenterX = (FLOAT) sX;
|
||||
FLOAT nextgridnocenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftonextgridno = sqrt( (nextgridnocenterX - sWorldX) * (nextgridnocenterX - sWorldX) + (nextgridnocenterY - sWorldY) * (nextgridnocenterY - sWorldY) );
|
||||
|
||||
INT32 oppositeviewdirectiongridno = NewGridNo( pSoldier->sGridNo, DirectionInc( gOppositeDirection[pSoldier->ubDirection] ) );
|
||||
FLOAT oppositenextgridnocenterX = (FLOAT)CenterX( oppositeviewdirectiongridno );
|
||||
FLOAT oppositenextgridnocenterY = (FLOAT)CenterY( oppositeviewdirectiongridno );
|
||||
ConvertGridNoToCenterCellXY(oppositeviewdirectiongridno, &sX, &sY);
|
||||
FLOAT oppositenextgridnocenterX = (FLOAT) sX;
|
||||
FLOAT oppositenextgridnocenterY = (FLOAT) sY;
|
||||
|
||||
FLOAT difftooppositenextgridno = sqrt( (oppositenextgridnocenterX - sWorldX) * (oppositenextgridnocenterX - sWorldX) + (oppositenextgridnocenterY - sWorldY) * (oppositenextgridnocenterY - sWorldY) );
|
||||
|
||||
@@ -1030,13 +1032,15 @@ UINT8 QuickFindSoldier( INT32 sGridNo )
|
||||
|
||||
void GetGridNoScreenPos( INT32 sGridNo, UINT8 ubLevel, INT16 *psScreenX, INT16 *psScreenY )
|
||||
{
|
||||
INT16 sScreenX, sScreenY;
|
||||
INT16 sScreenX, sScreenY, sX, sY;
|
||||
FLOAT dOffsetX, dOffsetY;
|
||||
FLOAT dTempX_S, dTempY_S;
|
||||
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
|
||||
// Get 'TRUE' merc position
|
||||
dOffsetX = (FLOAT)( CenterX( sGridNo ) - gsRenderCenterX );
|
||||
dOffsetY = (FLOAT)( CenterY( sGridNo ) - gsRenderCenterY );
|
||||
dOffsetX = (FLOAT)( sX - gsRenderCenterX );
|
||||
dOffsetY = (FLOAT)( sY - gsRenderCenterY );
|
||||
|
||||
// OK, DONT'T ASK... CONVERSION TO PROPER Y NEEDS THIS...
|
||||
dOffsetX -= CELL_Y_SIZE;
|
||||
|
||||
@@ -738,8 +738,7 @@ BOOLEAN TeleportSoldier( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fForce )
|
||||
if ( NewOKDestination( pSoldier, sGridNo, TRUE, 0 ) || fForce )
|
||||
{
|
||||
// TELEPORT TO THIS LOCATION!
|
||||
sX = CenterX( sGridNo );
|
||||
sY = CenterY( sGridNo );
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
pSoldier->EVENT_SetSoldierPosition( (FLOAT) sX, (FLOAT) sY );
|
||||
|
||||
pSoldier->pathing.sFinalDestination = sGridNo;
|
||||
|
||||
+11
-36
@@ -1678,33 +1678,7 @@ BOOLEAN RetrieveTempFileFromSavedGame( HWFILE hFile, UINT32 uiType, INT16 sMapX,
|
||||
//Deletes the Temp map Directory
|
||||
BOOLEAN InitTacticalSave( BOOLEAN fCreateTempDir )
|
||||
{
|
||||
#ifndef USE_VFS
|
||||
UINT32 uiRetVal;
|
||||
|
||||
//If the Map Temp directory exists, removes the temp files
|
||||
uiRetVal = FileGetAttributes( MAPS_DIR );
|
||||
if( uiRetVal != 0xFFFFFFFF )
|
||||
{
|
||||
if( uiRetVal & FILE_ATTRIBUTES_DIRECTORY )
|
||||
{
|
||||
//Erase the directory
|
||||
if( !EraseDirectory( MAPS_DIR ) )
|
||||
{
|
||||
//error erasing the temporary maps directory
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( !MakeFileManDirectory( MAPS_DIR ) )
|
||||
{
|
||||
//Erro creating the temp map directory
|
||||
AssertMsg( 0, "Error creating the Temp Directory.");
|
||||
}
|
||||
}
|
||||
#else
|
||||
EraseDirectory( MAPS_DIR );
|
||||
#endif
|
||||
if( fCreateTempDir )
|
||||
{
|
||||
//Create the initial temp file for the Npc Quote Info
|
||||
@@ -1878,8 +1852,10 @@ BOOLEAN LoadRottingCorpsesFromTempCorpseFile( INT16 sMapX, INT16 sMapY, INT8 bMa
|
||||
def.sGridNo = gMapInformation.sWestGridNo;
|
||||
}
|
||||
//Recalculate the dx,dy info
|
||||
def.dXPos = CenterX( def.sGridNo );
|
||||
def.dYPos = CenterY( def.sGridNo );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(def.sGridNo, &sX, &sY);
|
||||
def.dXPos = sX;
|
||||
def.dYPos = sY;
|
||||
// If not from loading a save....
|
||||
if( !(gTacticalStatus.uiFlags & LOADING_SAVED_GAME ) )
|
||||
{
|
||||
@@ -2737,15 +2713,14 @@ BOOLEAN AddDeadSoldierToUnLoadedSector( INT16 sMapX, INT16 sMapY, UINT8 bMapZ, S
|
||||
memset( &Corpse, 0, sizeof( ROTTING_CORPSE_DEFINITION ) );
|
||||
|
||||
// Setup some values!
|
||||
Corpse.ubBodyType = pSoldier->ubBodyType;
|
||||
Corpse.sGridNo = sGridNo;
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sXPos, &sYPos);
|
||||
|
||||
ConvertGridNoToXY( sGridNo, &sXPos, &sYPos );
|
||||
|
||||
Corpse.dXPos = (FLOAT)( CenterX( sXPos ) );
|
||||
Corpse.dYPos = (FLOAT)( CenterY( sYPos ) );
|
||||
Corpse.sHeightAdjustment = pSoldier->sHeightAdjustment;
|
||||
Corpse.bVisible = TRUE;
|
||||
Corpse.ubBodyType = pSoldier->ubBodyType;
|
||||
Corpse.sGridNo = sGridNo;
|
||||
Corpse.dXPos = (FLOAT)( sXPos );
|
||||
Corpse.dYPos = (FLOAT)( sYPos );
|
||||
Corpse.sHeightAdjustment = pSoldier->sHeightAdjustment;
|
||||
Corpse.bVisible = TRUE;
|
||||
|
||||
SET_PALETTEREP_ID ( Corpse.HeadPal, pSoldier->HeadPal );
|
||||
SET_PALETTEREP_ID ( Corpse.VestPal, pSoldier->VestPal );
|
||||
|
||||
+18
-6
@@ -676,8 +676,12 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
|
||||
gCTHDisplay.iTargetGridNo = usMapPos;
|
||||
|
||||
// Calculate distance to target
|
||||
FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( usMapPos ));
|
||||
FLOAT dDeltaY = (FLOAT)(CenterY( pSoldier->sGridNo ) - CenterY( usMapPos ));
|
||||
INT16 sX, sY, sXMap, sYMap;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(usMapPos, &sXMap, &sYMap);
|
||||
|
||||
FLOAT dDeltaX = (FLOAT)( sX - sXMap );
|
||||
FLOAT dDeltaY = (FLOAT)( sY - sYMap );
|
||||
FLOAT d2DDistance = sqrt((dDeltaX*dDeltaX)+(dDeltaY*dDeltaY));
|
||||
|
||||
CalcMagFactorSimple( pSoldier, d2DDistance, pSoldier->aiData.bShownAimTime, usMapPos );
|
||||
@@ -782,8 +786,12 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
|
||||
gbCtHBurstCount = 0;
|
||||
|
||||
// Calculate distance to target
|
||||
FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( usMapPos ));
|
||||
FLOAT dDeltaY = (FLOAT)(CenterY( pSoldier->sGridNo ) - CenterY( usMapPos ));
|
||||
INT16 sX, sY, sXMap, sYMap;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(usMapPos, &sXMap, &sYMap);
|
||||
|
||||
FLOAT dDeltaX = (FLOAT)(sX - sXMap);
|
||||
FLOAT dDeltaY = (FLOAT)(sY - sYMap);
|
||||
FLOAT d2DDistance = sqrt((dDeltaX*dDeltaX)+(dDeltaY*dDeltaY));
|
||||
|
||||
CalcMagFactorSimple( pSoldier, d2DDistance, pSoldier->aiData.bShownAimTime, usMapPos );
|
||||
@@ -884,8 +892,12 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, INT32 usMapPos, BOOLEA
|
||||
gCTHDisplay.iTargetGridNo = usMapPos;
|
||||
|
||||
// Calculate distance to target
|
||||
FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( usMapPos ));
|
||||
FLOAT dDeltaY = (FLOAT)(CenterY( pSoldier->sGridNo ) - CenterY( usMapPos ));
|
||||
INT16 sX, sY, sXMap, sYMap;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(usMapPos, &sXMap, &sYMap);
|
||||
|
||||
FLOAT dDeltaX = (FLOAT)(sX - sXMap);
|
||||
FLOAT dDeltaY = (FLOAT)(sY - sYMap);
|
||||
FLOAT d2DDistance = sqrt((dDeltaX*dDeltaX)+(dDeltaY*dDeltaY));
|
||||
|
||||
CalcMagFactorSimple( pSoldier, d2DDistance, pSoldier->aiData.bShownAimTime, usMapPos );
|
||||
|
||||
@@ -1787,7 +1787,9 @@ BOOLEAN ExitVehicle( SOLDIERTYPE *pSoldier )
|
||||
pSoldier->aiData.bOppList[ pVehicle->ubID ] = 1;
|
||||
|
||||
// Add to sector....
|
||||
pSoldier->EVENT_SetSoldierPosition( CenterX( sGridNo ), CenterY( sGridNo ) );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
pSoldier->EVENT_SetSoldierPosition( sX, sY );
|
||||
|
||||
// anv: since now they can shoot it's important to set passenger to proper stance
|
||||
// namely, back to standing, because we set them to crouching when entering
|
||||
@@ -2064,7 +2066,9 @@ void HandleCriticalHitForVehicleInLocation( UINT8 ubID, INT16 sDmg, INT32 sGridN
|
||||
pVehicleList[ ubID ].fDestroyed = TRUE;
|
||||
|
||||
// Explode vehicle...
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, GREAT_BIG_EXPLOSION, 0 );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, GREAT_BIG_EXPLOSION, 0 );
|
||||
|
||||
if ( pSoldier != NULL )
|
||||
{
|
||||
|
||||
+50
-27
@@ -1714,7 +1714,7 @@ void GetTargetWorldPositions( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, FLOAT
|
||||
FLOAT dTargetZ;
|
||||
SOLDIERTYPE* pTargetSoldier = NULL;
|
||||
INT8 bStructHeight;
|
||||
INT16 sXMapPos, sYMapPos;
|
||||
INT16 sXMapPos, sYMapPos, sX, sY;
|
||||
UINT32 uiRoll;
|
||||
INT8 bTargetCubeLevel = 0;
|
||||
INT8 bTargetLevel = 0;
|
||||
@@ -1731,8 +1731,9 @@ void GetTargetWorldPositions( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, FLOAT
|
||||
{
|
||||
// SAVE OPP ID
|
||||
pSoldier->ubOppNum = pTargetSoldier->ubID;
|
||||
dTargetX = (FLOAT) CenterX( pTargetSoldier->sGridNo );
|
||||
dTargetY = (FLOAT) CenterY( pTargetSoldier->sGridNo );
|
||||
ConvertGridNoToCenterCellXY(pTargetSoldier->sGridNo, &sX, &sY);
|
||||
dTargetX = (FLOAT) sX;
|
||||
dTargetY = (FLOAT) sY;
|
||||
if (pSoldier->bAimShotLocation == AIM_SHOT_RANDOM)
|
||||
{
|
||||
uiRoll = PreRandom( 100 );
|
||||
@@ -1773,9 +1774,11 @@ void GetTargetWorldPositions( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, FLOAT
|
||||
if ( gGameExternalOptions.fAllowTargetHeadAndLegIfProne && gAnimControl[pTargetSoldier->usAnimState].ubHeight == ANIM_PRONE )
|
||||
{
|
||||
INT32 viewdirectiongridno = NewGridNo( pTargetSoldier->sGridNo, DirectionInc( pTargetSoldier->ubDirection ) );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(viewdirectiongridno, &sX, &sY);
|
||||
|
||||
dTargetX = (0.3f * dTargetX + 0.7f * (FLOAT)CenterX( viewdirectiongridno )) / 1.0f;
|
||||
dTargetY = (0.3f * dTargetY + 0.7f * (FLOAT)CenterY( viewdirectiongridno )) / 1.0f;
|
||||
dTargetX = (0.3f * dTargetX + 0.7f * (FLOAT)sX) / 1.0f;
|
||||
dTargetY = (0.3f * dTargetY + 0.7f * (FLOAT)sY) / 1.0f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1789,9 +1792,11 @@ void GetTargetWorldPositions( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, FLOAT
|
||||
if ( gGameExternalOptions.fAllowTargetHeadAndLegIfProne && gAnimControl[pTargetSoldier->usAnimState].ubHeight == ANIM_PRONE )
|
||||
{
|
||||
INT32 viewdirectiongridno = NewGridNo( pTargetSoldier->sGridNo, DirectionInc( gOppositeDirection[pTargetSoldier->ubDirection] ) );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(viewdirectiongridno, &sX, &sY);
|
||||
|
||||
dTargetX = (0.3f * dTargetX + 0.7f * (FLOAT)CenterX( viewdirectiongridno )) / 1.0f;
|
||||
dTargetY = (0.3f * dTargetY + 0.7f * (FLOAT)CenterY( viewdirectiongridno )) / 1.0f;
|
||||
dTargetX = (0.3f * dTargetX + 0.7f * (FLOAT)sX) / 1.0f;
|
||||
dTargetY = (0.3f * dTargetY + 0.7f * (FLOAT)sY) / 1.0f;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2718,11 +2723,14 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
{
|
||||
if ( WillExplosiveWeaponFail( pSoldier, pObjHand ) )
|
||||
{
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
|
||||
if ( Item[usUBItem].singleshotrocketlauncher )
|
||||
{
|
||||
CreateItem( Item[usItemNum].discardedlauncheritem , (*pObjHand)[0]->data.objectStatus, pObjHand );
|
||||
|
||||
// Flugente: why would we keep a piece of scrap in our ahnds in the first place? just drop it to the ground
|
||||
// Flugente: why would we keep a piece of scrap in our hands in the first place? just drop it to the ground
|
||||
AddItemToPool( pSoldier->sGridNo, pObjHand, 1, pSoldier->pathing.bLevel, 0, -1 );
|
||||
|
||||
// Delete object
|
||||
@@ -2730,20 +2738,21 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
|
||||
DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 );
|
||||
|
||||
|
||||
if ( Item[usUBItem].usBuddyItem != 0 && Item[Item[usUBItem].usBuddyItem].usItemClass & IC_EXPLOSV )
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, Item[usUBItem].usBuddyItem, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, Item[usUBItem].usBuddyItem, pSoldier->pathing.bLevel );
|
||||
}
|
||||
else
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("StructureHit: RPG7 item: %d, Ammo: %d", usUBItem , (*pObjHand)[0]->data.gun.usGunAmmoItem ) );
|
||||
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, (*pObjHand)[0]->data.gun.usGunAmmoItem, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, (*pObjHand)[0]->data.gun.usGunAmmoItem, pSoldier->pathing.bLevel );
|
||||
pSoldier->inv[pSoldier->ubAttackingHand ][0]->data.gun.usGunAmmoItem = NONE;
|
||||
}
|
||||
// Reduce again for attack end 'cause it has been incremented for a normal attack
|
||||
@@ -2893,8 +2902,8 @@ BOOLEAN UseGunNCTH( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
{
|
||||
sTempGridNo = NewGridNo(sTempGridNo, DirectionInc(pSoldier->ubDirection));
|
||||
}
|
||||
INT16 sX = CenterX(sTempGridNo);
|
||||
INT16 sY = CenterY(sTempGridNo);
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sTempGridNo, &sX, &sY);
|
||||
|
||||
AniParams.sGridNo = pSoldier->sGridNo;
|
||||
AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
|
||||
@@ -3643,6 +3652,9 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
{
|
||||
if ( WillExplosiveWeaponFail( pSoldier, pObjUsed ) )
|
||||
{
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
|
||||
if ( Item[usUBItem].singleshotrocketlauncher )
|
||||
{
|
||||
CreateItem( Item[usUBItem].discardedlauncheritem , (*pObjUsed)[0]->data.objectStatus, pObjUsed );
|
||||
@@ -3655,20 +3667,21 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
|
||||
DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 );
|
||||
|
||||
|
||||
if ( Item[usUBItem].usBuddyItem != 0 && Item[Item[usUBItem].usBuddyItem].usItemClass & IC_EXPLOSV )
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
}
|
||||
else
|
||||
{
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, C1, pSoldier->pathing.bLevel );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("StructureHit: RPG7 item: %d, Ammo: %d", usUBItem , (*pObjUsed)[0]->data.gun.usGunAmmoItem ) );
|
||||
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, (*pObjUsed)[0]->data.gun.usGunAmmoItem, pSoldier->pathing.bLevel );
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, (*pObjUsed)[0]->data.gun.usGunAmmoItem, pSoldier->pathing.bLevel );
|
||||
|
||||
OBJECTTYPE * pLaunchable = FindLaunchableAttachment( pObjUsed, usUBItem );
|
||||
if(pLaunchable)
|
||||
@@ -3708,8 +3721,8 @@ BOOLEAN UseGun( SOLDIERTYPE *pSoldier , INT32 sTargetGridNo )
|
||||
{
|
||||
sTempGridNo = NewGridNo(sTempGridNo, DirectionInc(pSoldier->ubDirection));
|
||||
}
|
||||
INT16 sX = CenterX(sTempGridNo);
|
||||
INT16 sY = CenterY(sTempGridNo);
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sTempGridNo, &sX, &sY);
|
||||
|
||||
AniParams.sGridNo = pSoldier->sGridNo;
|
||||
AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
|
||||
@@ -5167,7 +5180,9 @@ BOOLEAN UseLauncher( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo )
|
||||
|
||||
// So we still should have ABC > 0
|
||||
// Begin explosion due to failure...
|
||||
IgniteExplosion( pSoldier->ubID, CenterX( pSoldier->sGridNo ), CenterY( pSoldier->sGridNo ), 0, pSoldier->sGridNo, Launchable.usItem, pSoldier->pathing.bLevel );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
IgniteExplosion( pSoldier->ubID, sX, sY, 0, pSoldier->sGridNo, Launchable.usItem, pSoldier->pathing.bLevel );
|
||||
|
||||
// Reduce again for attack end 'cause it has been incremented for a normal attack
|
||||
// Nope, not anymore.
|
||||
@@ -5676,15 +5691,18 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN
|
||||
// HEADROCK HAM 5: Fragments fired by such weapons should not explode.
|
||||
if ( pBullet->fFragment == false)
|
||||
{
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
|
||||
if ( Item[usWeaponIndex].singleshotrocketlauncher )
|
||||
{
|
||||
if ( Item[usWeaponIndex].usBuddyItem != 0 && Item[Item[usWeaponIndex].usBuddyItem].usItemClass & IC_EXPLOSV )
|
||||
{
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, Item[usWeaponIndex].usBuddyItem, bLevel, usDirection );
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, Item[usWeaponIndex].usBuddyItem, bLevel, usDirection );
|
||||
}
|
||||
else
|
||||
{
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, C1, bLevel, usDirection );
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, C1, bLevel, usDirection );
|
||||
}
|
||||
}
|
||||
// changed too to use 2 flag to determine
|
||||
@@ -5692,7 +5710,7 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN
|
||||
//there shouldn't be a way to enter here with an UnderBarrel weapon, so retaining original code :JMich
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("StructureHit: RPG7 item: %d, Ammo: %d",pAttacker->inv[HANDPOS].usItem , pAttacker->inv[HANDPOS][0]->data.gun.usGunAmmoItem ) );
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, pAttacker->inv[pAttacker->ubAttackingHand][0]->data.gun.usGunAmmoItem, bLevel, usDirection );
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, pAttacker->inv[pAttacker->ubAttackingHand][0]->data.gun.usGunAmmoItem, bLevel, usDirection );
|
||||
|
||||
//This is just to make multishot launchers work in semi auto. It's not really a permanent solution because it still doesn't allow autofire, but it will do for now.
|
||||
OBJECTTYPE * pLaunchable = FindLaunchableAttachment( &(pAttacker->inv[pAttacker->ubAttackingHand ]), pAttacker->inv[pAttacker->ubAttackingHand ].usItem );
|
||||
@@ -5708,7 +5726,7 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN
|
||||
else if ( AmmoTypes[(*pObj)[0]->data.gun.ubGunAmmoType].explosionSize > 1)
|
||||
{
|
||||
// re-routed the Highexplosive value to define exposion type
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, AmmoTypes[(*pObj)[0]->data.gun.ubGunAmmoType].highExplosive, bLevel, usDirection );
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, AmmoTypes[(*pObj)[0]->data.gun.ubGunAmmoType].highExplosive, bLevel, usDirection );
|
||||
// pSoldier->inv[pSoldier->ubAttackingHand ][0]->data.gun.usGunAmmoItem = NONE;
|
||||
}
|
||||
}
|
||||
@@ -5726,7 +5744,9 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN
|
||||
//FreeUpAttacker( ubAttackerID );
|
||||
|
||||
// HEADROCK HAM 5 TODO: Tank shell!!
|
||||
IgniteExplosion( ubAttackerID, CenterX( sGridNo ), CenterY( sGridNo ), 0, sGridNo, TANK_SHELL, bLevel, usDirection );
|
||||
INT16 sX, sY;
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX, &sY);
|
||||
IgniteExplosion( ubAttackerID, sX, sY, 0, sGridNo, TANK_SHELL, bLevel, usDirection );
|
||||
//FreeUpAttacker( (UINT8) ubAttackerID );
|
||||
|
||||
// Moved here to keep ABC >0 as long as possible
|
||||
@@ -6250,7 +6270,7 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
|
||||
// Basic defines
|
||||
SOLDIERTYPE * pTarget;
|
||||
INT32 iRange, iSightRange; //, minRange;
|
||||
|
||||
INT16 sX, sY, sX2, sY2;
|
||||
UINT16 usInHand;
|
||||
OBJECTTYPE * pInHand;
|
||||
INT16 sDistVis, sDistVisNoScope;
|
||||
@@ -6270,8 +6290,11 @@ UINT32 CalcNewChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTi
|
||||
|
||||
// calculate actual range (in units, 10 units = 1 tile)
|
||||
iRange = GetRangeInCellCoordsFromGridNoDiff( pSoldier->sGridNo, sGridNo );
|
||||
FLOAT dDeltaX = (FLOAT)(CenterX( pSoldier->sGridNo ) - CenterX( sGridNo ));
|
||||
FLOAT dDeltaY = (FLOAT)(CenterY( pSoldier->sGridNo ) - CenterY( sGridNo ));
|
||||
|
||||
ConvertGridNoToCenterCellXY(pSoldier->sGridNo, &sX, &sY);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sX2, &sY2);
|
||||
FLOAT dDeltaX = (FLOAT)( sX - sX2 );
|
||||
FLOAT dDeltaY = (FLOAT)( sY - sY2 );
|
||||
FLOAT d2DDistance = sqrt((dDeltaX*dDeltaX)+(dDeltaY*dDeltaY));
|
||||
|
||||
// Find a target in the tile
|
||||
|
||||
@@ -6130,10 +6130,8 @@ void ProcessNoise(UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bLevel, UINT8 ubTerrTy
|
||||
{
|
||||
// ALL RIGHT! Passed all the tests, this listener hears this noise!!!
|
||||
HearNoise(pSoldier,ubSource,sGridNo,bLevel,ubEffVolume,ubNoiseType, (UINT8 *)&bSeen);
|
||||
|
||||
bHeard = TRUE;
|
||||
|
||||
ubNoiseDir = atan8(CenterX(pSoldier->sGridNo),CenterY(pSoldier->sGridNo),CenterX(sGridNo),CenterY(sGridNo));
|
||||
ubNoiseDir = GetDirectionFromCenterCellXYGridNo(pSoldier->sGridNo, sGridNo);
|
||||
|
||||
// check the 'noise heard & reported' bit for that soldier & direction
|
||||
if ( ubNoiseType != NOISE_MOVEMENT || bTeam != OUR_TEAM || (pSoldier->aiData.bInterruptDuelPts != NO_INTERRUPT) || !(pSoldier->ubMovementNoiseHeard & (1 << ubNoiseDir) ) )
|
||||
@@ -6441,8 +6439,7 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL
|
||||
// ignore muzzle flashes when turning head to see noise
|
||||
if ( ubNoiseType == NOISE_GUNFIRE && ubNoiseMaker != NOBODY && MercPtrs[ ubNoiseMaker ]->flags.fMuzzleFlash )
|
||||
{
|
||||
sNoiseX = CenterX(sGridNo);
|
||||
sNoiseY = CenterY(sGridNo);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sNoiseX, &sNoiseY);
|
||||
bDirection = atan8(pSoldier->sX,pSoldier->sY,sNoiseX,sNoiseY);
|
||||
if ( pSoldier->ubDirection != bDirection && pSoldier->ubDirection != gOneCDirection[ bDirection ] && pSoldier->ubDirection != gOneCCDirection[ bDirection ] )
|
||||
{
|
||||
@@ -6463,8 +6460,7 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL
|
||||
if (PythSpacesAway(pSoldier->sGridNo,sGridNo) <= sDistVisible )
|
||||
{
|
||||
// just use the XXadjustedXX center of the gridno
|
||||
sNoiseX = CenterX(sGridNo);
|
||||
sNoiseY = CenterY(sGridNo);
|
||||
ConvertGridNoToCenterCellXY(sGridNo, &sNoiseX, &sNoiseY);
|
||||
|
||||
if (pSoldier->ubDirection != atan8(pSoldier->sX,pSoldier->sY,sNoiseX,sNoiseY))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user