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 GetVisionRangeBonus( SOLDIERTYPE * pSoldier )
{ {
INT16 bns=0; INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++) 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 // 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; 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 ;) //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 ) if ( WeaponReady(pSoldier) || gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_FIRE )
{ {
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++) 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 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{ {
INT16 bns=0; INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++) 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 // 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; continue;
} }
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) ) if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{ {
bns += BonusReduceMore( bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[i].usItem].nightvisionrangebonus, bLightLevel ), NightBonusScale( pItem->nightvisionrangebonus, bLightLevel ),
pSoldier->inv[i].bStatus[0] ); pObj->bStatus[0] );
} }
} }
// Snap: check only attachments on a raised weapon! // Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) ) if ( WeaponReady(pSoldier) )
{ {
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++) for (int i=0; i < MAX_ATTACHMENTS; i++)
{ {
bns += BonusReduceMore( bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].nightvisionrangebonus, bLightLevel ), NightBonusScale( Item[pObj->usAttachItem[i]].nightvisionrangebonus, bLightLevel ),
pSoldier->inv[HANDPOS].bAttachStatus[i] ); pObj->bAttachStatus[i] );
} }
} }
@@ -6784,32 +6804,42 @@ INT16 GetNightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{ {
INT16 bns=0; INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
for (int i = 0; i < BIGPOCK1POS; i++) 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 // Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) && 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; continue;
} }
if (!IsWeapon(pSoldier->inv[i].usItem) || (IsWeapon(pSoldier->inv[i].usItem) && WeaponReady(pSoldier) ) ) if (!IsWeapon(usItem) || (IsWeapon(usItem) && WeaponReady(pSoldier) ) )
{ {
bns += BonusReduceMore( bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[i].usItem].cavevisionrangebonus, bLightLevel ), NightBonusScale( pItem->cavevisionrangebonus, bLightLevel ),
pSoldier->inv[i].bStatus[0] ); pObj->bStatus[0] );
} }
} }
// Snap: check only attachments on a raised weapon! // Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) ) if ( WeaponReady(pSoldier) )
{ {
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++) for (int i=0; i < MAX_ATTACHMENTS; i++)
{ {
bns += BonusReduceMore( bns += BonusReduceMore(
NightBonusScale( Item[pSoldier->inv[HANDPOS].usAttachItem[i]].cavevisionrangebonus, bLightLevel ), NightBonusScale( Item[pObj->usAttachItem[i]].cavevisionrangebonus, bLightLevel ),
pSoldier->inv[HANDPOS].bAttachStatus[i] ); pObj->bAttachStatus[i] );
} }
} }
@@ -6819,34 +6849,44 @@ INT16 GetCaveVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel ) INT16 GetDayVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{ {
INT16 bns=0; INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
// Snap: Scale the bonus with the light level // Snap: Scale the bonus with the light level
for (int i = 0; i < BIGPOCK1POS; i++) 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 // Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) && 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; 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 ), * (NORMAL_LIGHTLEVEL_NIGHT - bLightLevel), NORMAL_LIGHTLEVEL_NIGHT ),
pSoldier->inv[i].bStatus[0] ); pObj->bStatus[0] );
} }
} }
// Snap: check only attachments on a raised weapon! // Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) ) if ( WeaponReady(pSoldier) )
{ {
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++) 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 ), * (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 GetBrightLightVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel )
{ {
INT16 bns=0; INT16 bns=0;
OBJECTTYPE *pObj;
UINT16 usItem;
INVTYPE *pItem;
// Snap: Scale the bonus with the light level // Snap: Scale the bonus with the light level
for (int i = 0; i < BIGPOCK1POS; i++) 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 // Snap (TODO): binoculars and such should not be active by default
if ( (i == HANDPOS || i == SECONDHANDPOS) && 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; 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 ), * (NORMAL_LIGHTLEVEL_DAY - bLightLevel), NORMAL_LIGHTLEVEL_DAY ),
pSoldier->inv[i].bStatus[0] ); pObj->bStatus[0] );
} }
} }
// Snap: check only attachments on a raised weapon! // Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) ) if ( WeaponReady(pSoldier) )
{ {
pObj = &( pSoldier->inv[HANDPOS]);
for (int i=0; i < MAX_ATTACHMENTS; i++) 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 ), * (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 GetPercentTunnelVision( SOLDIERTYPE * pSoldier )
{ {
UINT8 bns = 0; UINT8 bns = 0;
UINT16 usItem;
INVTYPE *pItem;
for (int i = HELMETPOS; i < BIGPOCK1POS; i++) 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; 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! // Snap: check only attachments on a raised weapon!
if ( WeaponReady(pSoldier) ) if ( WeaponReady(pSoldier) )
{ {
if ( IsWeapon(pSoldier->inv[HANDPOS].usItem) ) //if not a weapon, then it was added already above OBJECTTYPE *pInv = &(pSoldier->inv[HANDPOS]);
bns += Item[pSoldier->inv[HANDPOS].usItem].percenttunnelvision; 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++) 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 ) BOOLEAN IsWeapon ( UINT16 itemIndex )
{ {
if ( Item[itemIndex].usItemClass == IC_GUN || Item[itemIndex].usItemClass == IC_PUNCH || Item[itemIndex].usItemClass == IC_BLADE || UINT16 usItemClass = Item[itemIndex].usItemClass;
Item[itemIndex].usItemClass == IC_LAUNCHER || Item[itemIndex].usItemClass == IC_THROWING_KNIFE || Item[itemIndex].usItemClass == IC_THROWN || return (usItemClass == IC_GUN || usItemClass == IC_PUNCH || usItemClass == IC_BLADE ||
Item[itemIndex].usItemClass == IC_GRENADE || Item[itemIndex].usItemClass == IC_TENTACLES ) usItemClass == IC_LAUNCHER || usItemClass == IC_THROWING_KNIFE || usItemClass == IC_THROWN ||
return true; usItemClass == IC_GRENADE || usItemClass == IC_TENTACLES);
return false;
} }
UINT8 GetDamage ( OBJECTTYPE *pObj ) UINT8 GetDamage ( OBJECTTYPE *pObj )