mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
code improvement: no need to evaluate guns in 1st loop, do total evaluation with ammo in 2nd loop
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5885 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -3982,19 +3982,19 @@ void MoveMilitiaEquipment(INT16 sSourceX, INT16 sSourceY, INT16 sTargetX, INT16
|
|||||||
// early exit if no items are found in sector at all
|
// early exit if no items are found in sector at all
|
||||||
|
|
||||||
// 1st loop: Count all ammo in ammo and guns, evaluate all armour/face items/hand grenades/melee items/guns/launchers
|
// 1st loop: Count all ammo in ammo and guns, evaluate all armour/face items/hand grenades/melee items/guns/launchers
|
||||||
|
// We do not yet evaluate guns - we do that later, when we know what ammo exists
|
||||||
// We store ammo in a map that also stores caliber and ammotype
|
// We store ammo in a map that also stores caliber and ammotype
|
||||||
// We store launchers in a structure that stores their item, wether they need ammo, and how much ammo we found
|
// We store launchers in a structure that stores their item, wether they need ammo, and how much ammo we found
|
||||||
// We evaluate objects via EvaluateObjForItem(...). If you are unsatisgied with militia selections, try to improve this funtion first
|
// We evaluate objects via EvaluateObjForItem(...). If you are unsatisgied with militia selections, try to improve this funtion first
|
||||||
|
|
||||||
// 1st loop afterwork: If we are unable to determine a valid GridNo, soemthing is wrong here, abort
|
// 1st loop afterwork: If we are unable to determine a valid GridNo, soemthing is wrong here, abort
|
||||||
// Definite decision on armour/face items/melee items/hand grenades
|
// Definite decision on armour/face items/melee items/hand grenades
|
||||||
// We can take a gun if we already found a satisfying amount of ammo for our favourite
|
|
||||||
|
|
||||||
// 2nd loop: If no gun was selected after 1st loop, reevaluate all guns, taking ammo into account (we know how much ammo there is, as we wrote that into our map)
|
// 2nd loop: Evaluate all guns, taking ammo into account (we know how much ammo there is, as we wrote that into our map)
|
||||||
// We know know what launchers that need ammo we have here, thus we can test bombs and grenades on wether they are such ammo. Note this in the launcher map
|
// We know know what launchers that need ammo we have here, thus we can test bombs and grenades on wether they are such ammo. Note this in the launcher map
|
||||||
|
|
||||||
// 2nd loop afterwork: We now know all launchers and their ammo, we decide which launcher to take
|
// 2nd loop afterwork: We now know all launchers and their ammo, we decide which launcher to take
|
||||||
// If we did not take a gun earlier, we now can, as we know all ammo
|
// Decide on a gun, we can now do that as we know all ammo
|
||||||
// If we have selected a gun, but do not take ammo from the inventory, spawn ammo in the traditional way
|
// If we have selected a gun, but do not take ammo from the inventory, spawn ammo in the traditional way
|
||||||
|
|
||||||
// 3rd loop: If we ever decide to pick up a gun, we will have done so now. We will look for fitting ammo in all ammo/guns, spawn correct magazines in our inventory, and remove ammo from found objects
|
// 3rd loop: If we ever decide to pick up a gun, we will have done so now. We will look for fitting ammo in all ammo/guns, spawn correct magazines in our inventory, and remove ammo from found objects
|
||||||
@@ -4061,7 +4061,7 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for easy view of the loaded sector inventory in the debugger
|
// this vector isn't used anywhere - it simply allows us to easily view the contents of the inventory in debug mode
|
||||||
#ifdef JA2TESTVERSION
|
#ifdef JA2TESTVERSION
|
||||||
std::vector<std::pair<BOOLEAN, UINT16> > overviewvector;
|
std::vector<std::pair<BOOLEAN, UINT16> > overviewvector;
|
||||||
for( uiCount = 0; uiCount < uiTotalNumberOfRealItems; ++uiCount )
|
for( uiCount = 0; uiCount < uiTotalNumberOfRealItems; ++uiCount )
|
||||||
@@ -4163,6 +4163,7 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
///////////////////////////////// 1st loop /////////////////////////////////////////////////////////
|
///////////////////////////////// 1st loop /////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// 1st loop: Count all ammo in ammo and guns, evaluate all armour/face items/hand grenades/melee items/guns/launchers
|
// 1st loop: Count all ammo in ammo and guns, evaluate all armour/face items/hand grenades/melee items/guns/launchers
|
||||||
|
// We do not yet evaluate guns - we do that later, when we know what ammo exists
|
||||||
// We store ammo in a map that also stores caliber and ammotype
|
// We store ammo in a map that also stores caliber and ammotype
|
||||||
// We store launchers in a structure that stores their item, wether they need ammo, and how much ammo we found
|
// We store launchers in a structure that stores their item, wether they need ammo, and how much ammo we found
|
||||||
// We evaluate objects via EvaluateObjForItem(...). If you are unsatisgied with militia selections, try to improve this funtion first
|
// We evaluate objects via EvaluateObjForItem(...). If you are unsatisgied with militia selections, try to improve this funtion first
|
||||||
@@ -4248,8 +4249,6 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
// gun
|
// gun
|
||||||
else if ( Item[pWorldItem[ uiCount ].object.usItem].usItemClass & IC_GUN && !si[SI_GUN].done )
|
else if ( Item[pWorldItem[ uiCount ].object.usItem].usItemClass & IC_GUN && !si[SI_GUN].done )
|
||||||
{
|
{
|
||||||
EvaluateObjForItem( pWorldItem, pObj, uiCount, &si[SI_GUN] );
|
|
||||||
|
|
||||||
// we count ammo and then remove it. We will later add it again in the form of ammo crates
|
// we count ammo and then remove it. We will later add it again in the form of ammo crates
|
||||||
UINT8 calibre = Weapon[ pWorldItem[ uiCount ].object.usItem ].ubCalibre;
|
UINT8 calibre = Weapon[ pWorldItem[ uiCount ].object.usItem ].ubCalibre;
|
||||||
// guns in a stack can have different ammo, thus he need to add it individually
|
// guns in a stack can have different ammo, thus he need to add it individually
|
||||||
@@ -4290,7 +4289,6 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
|
|
||||||
// 1st loop afterwork: If we are unable to determine a valid GridNo, soemthing is wrong here, abort
|
// 1st loop afterwork: If we are unable to determine a valid GridNo, soemthing is wrong here, abort
|
||||||
// Definite decision on armour/face items/melee items/hand grenades
|
// Definite decision on armour/face items/melee items/hand grenades
|
||||||
// We can take a gun if we already found a satisfying amount of ammo for our favourite
|
|
||||||
|
|
||||||
// if the dummy GridNo is still NOWHERE, we did not find a single reachable item. If getting a random gridno also fails, better get out of here
|
// if the dummy GridNo is still NOWHERE, we did not find a single reachable item. If getting a random gridno also fails, better get out of here
|
||||||
if ( dummygridno == NOWHERE )
|
if ( dummygridno == NOWHERE )
|
||||||
@@ -4322,66 +4320,12 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
SearchItemRetrieval( pWorldItem, &si[SI_GASMASK], pp );
|
SearchItemRetrieval( pWorldItem, &si[SI_GASMASK], pp );
|
||||||
SearchItemRetrieval( pWorldItem, &si[SI_MELEE], pp );
|
SearchItemRetrieval( pWorldItem, &si[SI_MELEE], pp );
|
||||||
SearchItemRetrieval( pWorldItem, &si[SI_GRENADE], pp, 2 ); // if on a stack, we are willing to take 2 grenades at once
|
SearchItemRetrieval( pWorldItem, &si[SI_GRENADE], pp, 2 ); // if on a stack, we are willing to take 2 grenades at once
|
||||||
|
|
||||||
// if found a gun, check wether we have enough ammo for it
|
|
||||||
if ( si[SI_GUN].found )
|
|
||||||
{
|
|
||||||
UINT8 calibre = Weapon[ pWorldItem[ si[SI_GUN].pos ].object.usItem ].ubCalibre;
|
|
||||||
|
|
||||||
Calibre_BulletCountMap::iterator calibremap_it = calibrebulletountmap.find( calibre );
|
|
||||||
if ( !fSearchForAmmo || calibremap_it != calibrebulletountmap.end() )
|
|
||||||
{
|
|
||||||
// do we have enough ammo form that calibre?
|
|
||||||
if ( !fSearchForAmmo || EnoughBulletsForGun( pWorldItem[ si[SI_GUN].pos ].object.usItem, &((*calibremap_it).second) ) )
|
|
||||||
{
|
|
||||||
usSelectedGunBulletsNeeded = fSearchForAmmo ? GetNeededTotalAmmo( pWorldItem[ si[SI_GUN].pos ].object.usItem ) : 0;
|
|
||||||
usSelectedGunBulletCount = fSearchForAmmo ? pWorldItem[ si[SI_GUN].pos ].object[0]->data.gun.ubGunShotsLeft : 0;
|
|
||||||
|
|
||||||
// awesome! then take that gun...
|
|
||||||
SearchItemRetrieval( pWorldItem, &si[SI_GUN], pp );
|
|
||||||
|
|
||||||
// empty the gun, create a mag
|
|
||||||
if ( !fSearchForAmmo )
|
|
||||||
{
|
|
||||||
UINT16 bulletstomove = (pp->Inv[ HANDPOS ])[0]->data.gun.ubGunShotsLeft;
|
|
||||||
if ( bulletstomove )
|
|
||||||
{
|
|
||||||
(pp->Inv[ HANDPOS ])[0]->data.gun.ubGunShotsLeft = 0;
|
|
||||||
UINT8 ammotype = (pp->Inv[ HANDPOS ])[0]->data.gun.ubGunAmmoType;
|
|
||||||
UINT16 magsize = GetMagSize( &(pp->Inv[ HANDPOS ] ) );
|
|
||||||
UINT16 magitem = FindReplacementMagazine( Weapon[ pp->Inv[ HANDPOS ].usItem ].ubCalibre, magsize, ammotype );
|
|
||||||
|
|
||||||
// create ammo in inventory
|
|
||||||
CreateAmmo(magitem, &newAmmoObj, bulletstomove);
|
|
||||||
fNewMagCreated = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// too bad. We need to look for another weapon then
|
|
||||||
else
|
|
||||||
{
|
|
||||||
si[SI_GUN].found = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// we didn't find any gun at all. Now what?
|
|
||||||
else
|
|
||||||
{
|
|
||||||
si[SI_GUN].done = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we found guns, but not enough ammo for our favourite, reset our results. In the next loop, we will also accept lower ammo counts
|
|
||||||
if ( !si[SI_GUN].done )
|
|
||||||
{
|
|
||||||
si[SI_GUN].found = FALSE;
|
|
||||||
si[SI_GUN].val = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////// 1st loop afterwork /////////////////////////////////////////////////////////
|
///////////////////////////////// 1st loop afterwork /////////////////////////////////////////////////////////
|
||||||
|
|
||||||
///////////////////////////////// 2nd loop /////////////////////////////////////////////////////////
|
///////////////////////////////// 2nd loop /////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Second loop: If no gun was selected after 1st loop, reevaluate all guns, taking ammo into account (we know how much ammo there is, as we wrote that into our map)
|
// Second loop: Evaluate all guns, taking ammo into account (we know how much ammo there is, as we wrote that into our map)
|
||||||
// We know know what launchers that need ammo we have here, thus we can test bombs and grenades on wether they are such ammo. Note this in the launcher map
|
// We know know what launchers that need ammo we have here, thus we can test bombs and grenades on wether they are such ammo. Note this in the launcher map
|
||||||
|
|
||||||
for( uiCount = 0; uiCount < uiTotalNumberOfRealItems; ++uiCount ) // ... for all items in the world ...
|
for( uiCount = 0; uiCount < uiTotalNumberOfRealItems; ++uiCount ) // ... for all items in the world ...
|
||||||
@@ -4436,7 +4380,7 @@ void TakeMilitiaEquipmentfromSector( INT16 sMapX, INT16 sMapY, INT8 sMapZ, SOLDI
|
|||||||
///////////////////////////////// 2nd loop afterwork /////////////////////////////////////////////////////////
|
///////////////////////////////// 2nd loop afterwork /////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// 2nd loop afterwork: We now know all launchers and their ammo, we decide which launcher to take
|
// 2nd loop afterwork: We now know all launchers and their ammo, we decide which launcher to take
|
||||||
// If we did not take a gun earlier, we now can, as we know all ammo
|
// Decide on a gun, we can now do that as we know all ammo
|
||||||
// If we have selected a gun, but do not take ammo from the inventory, spawn ammo in the traditional way
|
// If we have selected a gun, but do not take ammo from the inventory, spawn ammo in the traditional way
|
||||||
|
|
||||||
// we investigate the launchers we found, and their ammo.
|
// we investigate the launchers we found, and their ammo.
|
||||||
|
|||||||
Reference in New Issue
Block a user