Efficiency improvements for soldier->soldier sighting

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1091 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Overhaul
2007-07-21 08:10:00 +00:00
parent 9e92cefbfa
commit b7859a710f
2 changed files with 98 additions and 40 deletions
+94 -34
View File
@@ -6705,18 +6705,26 @@ INT16 GetPercentBurstFireAPReduction( OBJECTTYPE * pObj )
INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier )
{
INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++)
{
// Okay, it's time for some optimization here too
pObj = &( pSoldier->inv[i]);
usItem = pObj->usItem;
pItem = &(Item[usItem]);
// Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) && (Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
if ( (i == HANDPOS || i == SECONDHANDPOS) && (pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) )
if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{
bns += BonusReduceMore( Item[pSoldier->inv[i].usItem].visionrangebonus, pSoldier->inv[i].bStatus[0] );
bns += BonusReduceMore( pItem->visionrangebonus, pObj->bStatus[0] );
}
}
@@ -6724,9 +6732,11 @@ INT16 GetVisionRangeBonus( SOLDIERTYPE * pSoldier )
//AXP 28.03.2007: CtH bug fix: We also want to check on a firing weapon, "raised" alone is not enough ;)
if ( WeaponReady(pSoldier) || gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIRE )
{
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += BonusReduceMore( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].visionrangebonus, pSoldier->inv[HANDPOS].bAttachStatus[i] );
bns += BonusReduceMore( Item[pObj->usAttachItem[i]].visionrangebonus, pObj->bAttachStatus[i] );
}
}
@@ -6750,31 +6760,41 @@ INT16 NightBonusScale( INT16 bonus, UINT8 bLightLevel )
INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{
INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++)
{
// More optimization
pObj = &( pSoldier->inv[i]);
usItem = pObj->usItem;
pItem = &(Item[usItem]);
// Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) && (Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
if ( (i == HANDPOS || i == SECONDHANDPOS) && (pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) )
if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{
bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[i].usItem].nightvisionrangebonus, bLightLevel ),
pSoldier->inv[i].bStatus[0] );
NightBonusScale( pItem->nightvisionrangebonus, bLightLevel ),
pObj->bStatus[0] );
}
}
// Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) )
{
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].nightvisionrangebonus, bLightLevel ),
pSoldier->inv[HANDPOS].bAttachStatus[i] );
NightBonusScale( Item[pObj->usAttachItem[i]].nightvisionrangebonus, bLightLevel ),
pObj->bAttachStatus[i] );
}
}
@@ -6784,32 +6804,42 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{
INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = 0; i < BIGPOCK1POS; i++)
{
// More optimization
pObj = &( pSoldier->inv[i]);
usItem = pObj->usItem;
pItem = &(Item[usItem]);
// Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) &&
(Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
(pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) )
if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{
bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[i].usItem].cavevisionrangebonus, bLightLevel ),
pSoldier->inv[i].bStatus[0] );
NightBonusScale( pItem->cavevisionrangebonus, bLightLevel ),
pObj->bStatus[0] );
}
}
// Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) )
{
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].cavevisionrangebonus, bLightLevel ),
pSoldier->inv[HANDPOS].bAttachStatus[i] );
NightBonusScale( Item[pObj->usAttachItem[i]].cavevisionrangebonus, bLightLevel ),
pObj->bAttachStatus[i] );
}
}
@@ -6819,34 +6849,44 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{
INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
// Snap: Scale the bonus with the light level
for (int i = 0; i < BIGPOCK1POS; i++)
{
// More optimization
pObj = &( pSoldier->inv[i]);
usItem = pObj->usItem;
pItem = &(Item[usItem]);
// Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) &&
(Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
(pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) )
if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{
bns += BonusReduceMore( idiv( Item[pSoldier->inv[i].usItem].dayvisionrangebonus
bns += BonusReduceMore( idiv( pItem->dayvisionrangebonus
* (NORMAL_LIGHTLEVEL_NIGHT - bLightLevel), NORMAL_LIGHTLEVEL_NIGHT ),
pSoldier->inv[i].bStatus[0] );
pObj->bStatus[0] );
}
}
// Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) )
{
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += BonusReduceMore( idiv( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].dayvisionrangebonus
bns += BonusReduceMore( idiv( Item[pObj->usAttachItem[i]].dayvisionrangebonus
* (NORMAL_LIGHTLEVEL_NIGHT - bLightLevel), NORMAL_LIGHTLEVEL_NIGHT ),
pSoldier->inv[HANDPOS].bAttachStatus[i] );
pObj->bAttachStatus[i] );
}
}
@@ -6856,34 +6896,44 @@ INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
INT16 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{
INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
// Snap: Scale the bonus with the light level
for (int i = 0; i < BIGPOCK1POS; i++)
{
// More optimization
pObj = &( pSoldier->inv[i]);
usItem = pObj->usItem;
pItem = &(Item[usItem]);
// Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) &&
(Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
(pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) )
if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{
bns += BonusReduceMore( idiv( Item[pSoldier->inv[i].usItem].brightlightvisionrangebonus
bns += BonusReduceMore( idiv( pItem->brightlightvisionrangebonus
* (NORMAL_LIGHTLEVEL_DAY - bLightLevel), NORMAL_LIGHTLEVEL_DAY ),
pSoldier->inv[i].bStatus[0] );
pObj->bStatus[0] );
}
}
// Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) )
{
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += BonusReduceMore( idiv( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].brightlightvisionrangebonus
bns += BonusReduceMore( idiv( Item[pObj->usAttachItem[i]].brightlightvisionrangebonus
* (NORMAL_LIGHTLEVEL_DAY - bLightLevel), NORMAL_LIGHTLEVEL_DAY ),
pSoldier->inv[HANDPOS].bAttachStatus[i] );
pObj->bAttachStatus[i] );
}
}
@@ -6922,29 +6972,39 @@ INT16 GetTotalVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
UINT8 GetPercentTunnelVision( SOLDIERTYPE * pSoldier )
{
UINT8 bns = 0;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++)
{
if ( (i == HANDPOS || i == SECONDHANDPOS) && (Item[pSoldier->inv[i].usItem].usItemClass & IC_ARMOUR || Item[pSoldier->inv[i].usItem].usItemClass & IC_FACE ))
// Okay, it's time for some optimization here
usItem = pSoldier->inv[i].usItem;
pItem = &(Item[usItem]);
if ( (i == HANDPOS || i == SECONDHANDPOS) && (pItem->usItemClass & IC_ARMOUR || pItem->usItemClass & IC_FACE ))
{
continue;
}
if ( !IsWeapon(pSoldier->inv[i].usItem) )
if ( !IsWeapon(usItem) )
{
bns = __max( bns, Item[pSoldier->inv[i].usItem].percenttunnelvision );
bns = __max( bns, pItem->percenttunnelvision );
}
}
// Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) )
{
if ( IsWeapon(pSoldier->inv[HANDPOS].usItem) ) //if not a weapon, then it was added already above
bns += Item[pSoldier->inv[HANDPOS].usItem].percenttunnelvision;
OBJECTTYPE *pInv = &(pSoldier->inv[HANDPOS]);
usItem = pInv->usItem;
pItem = &(Item[usItem]);
if ( IsWeapon(usItem) ) //if not a weapon, then it was added already above
bns += Item[usItem].percenttunnelvision;
for (int i=0; i < MAX_ATTACHMENTS; i++)
{
bns += Item[pSoldier->inv[HANDPOS].usAttachItem[i]].percenttunnelvision;
bns += Item[pInv->usAttachItem[i]].percenttunnelvision;
}
}
+4 -6
View File
@@ -5671,12 +5671,10 @@ BOOLEAN WillExplosiveWeaponFail( SOLDIERTYPE *pSoldier, OBJECTTYPE *pObj )
BOOLEAN IsWeapon ( UINT16 itemIndex )
{
if ( Item[itemIndex].usItemClass == IC_GUN || Item[itemIndex].usItemClass == IC_PUNCH || Item[itemIndex].usItemClass == IC_BLADE ||
Item[itemIndex].usItemClass == IC_LAUNCHER || Item[itemIndex].usItemClass == IC_THROWING_KNIFE || Item[itemIndex].usItemClass == IC_THROWN ||
Item[itemIndex].usItemClass == IC_GRENADE || Item[itemIndex].usItemClass == IC_TENTACLES )
return true;
return false;
UINT16 usItemClass = Item[itemIndex].usItemClass;
return (usItemClass == IC_GUN || usItemClass == IC_PUNCH || usItemClass == IC_BLADE ||
usItemClass == IC_LAUNCHER || usItemClass == IC_THROWING_KNIFE || usItemClass == IC_THROWN ||
usItemClass == IC_GRENADE || usItemClass == IC_TENTACLES);
}
UINT8 GetDamage ( OBJECTTYPE *pObj )