unified code for enemy/militia gear selection

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8334 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2016-10-24 18:46:39 +00:00
parent d6d4841d85
commit fcfab521fb
+88 -238
View File
@@ -332,14 +332,21 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
// SANDRO - I've split the item choosing below, so the item choices for militia can be // SANDRO - I've split the item choosing below, so the item choices for militia can be
// handled differently than for enemies. // handled differently than for enemies.
case SOLDIER_CLASS_ADMINISTRATOR: case SOLDIER_CLASS_ADMINISTRATOR:
//if ( gGameOptions.fSlowProgressForEnemyItemsChoice ) case SOLDIER_CLASS_GREEN_MILITIA:
// bRating = bEquipmentModifier - ( bSoldierClass == SOLDIER_CLASS_ADMINISTRATOR );
//else
bRating = BAD_ADMINISTRATOR_EQUIPMENT_RATING + bEquipmentModifier; bRating = BAD_ADMINISTRATOR_EQUIPMENT_RATING + bEquipmentModifier;
// Equipment quality modifier // Equipment quality modifier
if ( gGameExternalOptions.sEnemyAdminEquipmentQualityModifier != 0 ) if ( bSoldierClass == SOLDIER_CLASS_ADMINISTRATOR )
bRating += gGameExternalOptions.sEnemyAdminEquipmentQualityModifier; {
if ( gGameExternalOptions.sEnemyAdminEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.sEnemyAdminEquipmentQualityModifier;
}
else if ( bSoldierClass == SOLDIER_CLASS_GREEN_MILITIA )
{
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bGreenMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bGreenMilitiaEquipmentQualityModifier;
}
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) ); bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
@@ -353,8 +360,16 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
bHelmetClass = bRating; bHelmetClass = bRating;
// no leggings // no leggings
if( Chance( 30 ) ) if ( bSoldierClass == SOLDIER_CLASS_ADMINISTRATOR )
bKnifeClass = bRating; {
if ( Chance( 30 ) )
bKnifeClass = bRating;
}
else if ( bSoldierClass == SOLDIER_CLASS_GREEN_MILITIA )
{
if ( Chance( 15 ) )
bKnifeClass = bRating;
}
bAmmoClips = (INT8)(3 + Random( 2 )); bAmmoClips = (INT8)(3 + Random( 2 ));
@@ -373,53 +388,6 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
bGrenades = 1, bGrenadeClass = bRating; bGrenades = 1, bGrenadeClass = bRating;
} }
if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS )
{ //Randomly decide if there is to be an upgrade of guns vs armour (one goes up, the other down)
switch( Random( 5 ) )
{
case 0: bWeaponClass++, bVestClass--; break; //better gun, worse armour
case 1: bWeaponClass--, bVestClass++; break; //worse gun, better armour
}
}
break;
case SOLDIER_CLASS_GREEN_MILITIA:
bRating = BAD_ADMINISTRATOR_EQUIPMENT_RATING + bEquipmentModifier;
///////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bGreenMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bGreenMilitiaEquipmentQualityModifier;
///////////////////////////////////////////////////////////////////////////////////////////
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
bWeaponClass = bRating;
//Headrocktest, remove for release
//bLBEClass = bRating;
//Note: in some cases the class of armour and/or helmet won't be high enough to make
// the lowest level.
bVestClass = bRating;
bHelmetClass = bRating;
if( Chance( 15 ) )
bKnifeClass = bRating;
bAmmoClips = (INT8)(3 + Random( 2 ));
if( bRating >= GOOD_ADMINISTRATOR_EQUIPMENT_RATING )
{
bAmmoClips++;
bMiscClass = bRating;
}
if( bRating >= GREAT_ADMINISTRATOR_EQUIPMENT_RATING )
{
bGrenades = 1, bGrenadeClass = bRating;
}
if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS ) if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS )
{ //Randomly decide if there is to be an upgrade of guns vs armour (one goes up, the other down) { //Randomly decide if there is to be an upgrade of guns vs armour (one goes up, the other down)
switch( Random( 5 ) ) switch( Random( 5 ) )
@@ -431,15 +399,25 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
break; break;
case SOLDIER_CLASS_ARMY: case SOLDIER_CLASS_ARMY:
case SOLDIER_CLASS_REG_MILITIA:
//army guys tend to have a broad range of equipment //army guys tend to have a broad range of equipment
//if ( gGameOptions.fSlowProgressForEnemyItemsChoice ) //if ( gGameOptions.fSlowProgressForEnemyItemsChoice )
// bRating = bEquipmentModifier - ( bSoldierClass == SOLDIER_CLASS_ARMY ); // bRating = bEquipmentModifier - ( bSoldierClass == SOLDIER_CLASS_ARMY );
//else //else
bRating = BAD_ARMY_EQUIPMENT_RATING + bEquipmentModifier; bRating = BAD_ARMY_EQUIPMENT_RATING + bEquipmentModifier;
// Equipment quality modifier // Equipment quality modifier
if ( gGameExternalOptions.sEnemyRegularEquipmentQualityModifier != 0 ) if ( bSoldierClass == SOLDIER_CLASS_ARMY )
bRating += gGameExternalOptions.sEnemyRegularEquipmentQualityModifier; {
if ( gGameExternalOptions.sEnemyRegularEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.sEnemyRegularEquipmentQualityModifier;
}
else if ( bSoldierClass == SOLDIER_CLASS_REG_MILITIA )
{
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bRegularMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bRegularMilitiaEquipmentQualityModifier;
}
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) ); bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
@@ -485,8 +463,16 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
} }
} }
if( Chance( 35 ) ) if ( bSoldierClass == SOLDIER_CLASS_ARMY )
bKnifeClass = bRating; {
if ( Chance( 35 ) )
bKnifeClass = bRating;
}
else if ( bSoldierClass == SOLDIER_CLASS_REG_MILITIA )
{
if ( Chance( 20 ) )
bKnifeClass = bRating;
}
// Headrock: Chance for soldier to carry better LBE // Headrock: Chance for soldier to carry better LBE
//if( Chance( 50 ) ) //if( Chance( 50 ) )
@@ -541,7 +527,7 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
case 6: case 6:
// one per team maximum! // one per team maximum!
if ( (pp->bExpLevel >= 5) && (guiMortarsRolledByTeam < zDiffSetting[gGameOptions.ubDifficultyLevel].usMaxMortarsPerTeam) ) if ( bSoldierClass != SOLDIER_CLASS_REG_MILITIA && ( pp->bExpLevel >= 5 ) && (guiMortarsRolledByTeam < zDiffSetting[gGameOptions.ubDifficultyLevel].usMaxMortarsPerTeam) )
{ {
//mortar //mortar
fMortar = TRUE; fMortar = TRUE;
@@ -555,120 +541,26 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
} }
} }
break; break;
case SOLDIER_CLASS_REG_MILITIA:
bRating = BAD_ARMY_EQUIPMENT_RATING + bEquipmentModifier;
///////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bRegularMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bRegularMilitiaEquipmentQualityModifier;
///////////////////////////////////////////////////////////////////////////////////////////
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
bWeaponClass = bRating;
bVestClass = bRating;
bHelmetClass = bRating;
bGrenadeClass = bRating;
//WarmSteel - attachments don't need to be as high a class, controversional and might be better to externalize?
bAttachClass = bRating*3/8;
if( ( bRating >= GOOD_ARMY_EQUIPMENT_RATING ) && Chance(33) )
{
fAttachment = TRUE;
bAttachClass = bRating*5/8;
}
bAmmoClips = (INT8)(3 + Random( 2 ));
if( bRating >= AVERAGE_ARMY_EQUIPMENT_RATING )
{
bGrenades = (INT8)Random( 2 );
bKitClass = bRating;
bMiscClass = bRating;
}
if( bRating >= GOOD_ARMY_EQUIPMENT_RATING )
{
bGrenades++;
}
if( bRating >= GREAT_ARMY_EQUIPMENT_RATING )
{
bGrenades++;
bLeggingClass = bRating;
if ( Chance( 25 ) )
{
bBombClass = bRating;
}
}
if( Chance( 20 ) )
bKnifeClass = bRating;
if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS )
{
switch( Random( 7 ) )
{
case 3: bWeaponClass++, bVestClass--; break; //better gun, worse armour
case 4: bWeaponClass--, bVestClass++; break; //worse gun, better armour
case 5: bVestClass++, bHelmetClass--; break; //better armour, worse helmet
case 6: bVestClass--, bHelmetClass++; break; //worse armour, better helmet
}
}
// if well-enough equipped, 1/5 chance of something really special
if( ( bRating >= GREAT_ARMY_EQUIPMENT_RATING ) && ( Random( 100 ) < 20 ) )
{
//give this man a special weapon! No mortars if underground, however
ubMaxSpecialWeaponRoll = ( !IsAutoResolveActive() && ( gbWorldSectorZ != 0 ) ) ? 6 : 7;
switch ( Random ( ubMaxSpecialWeaponRoll ) )
{
case 0:
case 1:
case 2:
if ( pp->bExpLevel >= 3 )
{
//grenade launcher
fGrenadeLauncher = TRUE;
bGrenades = 3 + (INT8)(Random( 3 )); //3-5
}
break;
case 3:
case 4:
if ( pp->bExpLevel >= 4 )
{
// LAW rocket launcher
fLAW = TRUE;
}
break;
case 5:
if ( pp->bExpLevel >= 5 )
{
// RPG rocket launcher
fRPG = TRUE;
bGrenades = 2 + (INT8)(Random( 3 )); //2-4
bGrenadeClass = RPG_GRENADE_CLASS;
}
break;
}
}
break;
case SOLDIER_CLASS_ELITE: case SOLDIER_CLASS_ELITE:
case SOLDIER_CLASS_ELITE_MILITIA:
//if ( gGameOptions.fSlowProgressForEnemyItemsChoice ) //if ( gGameOptions.fSlowProgressForEnemyItemsChoice )
// bRating = bEquipmentModifier - ( bSoldierClass == SOLDIER_CLASS_ELITE ); // bRating = bEquipmentModifier - ( bSoldierClass == SOLDIER_CLASS_ELITE );
//else //else
bRating = BAD_ELITE_EQUIPMENT_RATING + bEquipmentModifier; bRating = BAD_ELITE_EQUIPMENT_RATING + bEquipmentModifier;
// Equipment quality modifier // Equipment quality modifier
if ( gGameExternalOptions.sEnemyEliteEquipmentQualityModifier != 0 ) if ( bSoldierClass == SOLDIER_CLASS_ELITE )
bRating += gGameExternalOptions.sEnemyEliteEquipmentQualityModifier; {
if ( gGameExternalOptions.sEnemyEliteEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.sEnemyEliteEquipmentQualityModifier;
}
else if ( bSoldierClass == SOLDIER_CLASS_ELITE_MILITIA )
{
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bVeteranMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bVeteranMilitiaEquipmentQualityModifier;
}
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) ); bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
@@ -698,8 +590,16 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
bAttachClass = bRating; bAttachClass = bRating;
} }
if( Chance( 35 ) ) if ( bSoldierClass == SOLDIER_CLASS_ELITE )
bKnifeClass = bRating; {
if ( Chance( 35 ) )
bKnifeClass = bRating;
}
else if ( bSoldierClass == SOLDIER_CLASS_ELITE_MILITIA )
{
if ( Chance( 25 ) )
bKnifeClass = bRating;
}
if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS ) if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS )
{ {
@@ -717,13 +617,15 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
} }
} }
// if well-enough equipped, 1/3 chance of something really special if ( bSoldierClass == SOLDIER_CLASS_ELITE )
if( ( bRating >= GOOD_ELITE_EQUIPMENT_RATING ) && ( Random( 100 ) < 33 ) )
{ {
//give this man a special weapon! No mortars if underground, however // if well-enough equipped, 1/3 chance of something really special
ubMaxSpecialWeaponRoll = ( !IsAutoResolveActive() && ( gbWorldSectorZ != 0 ) ) ? 6 : 7; if ( (bRating >= GOOD_ELITE_EQUIPMENT_RATING) && (Random( 100 ) < 33) )
switch ( Random ( ubMaxSpecialWeaponRoll ) )
{ {
//give this man a special weapon! No mortars if underground, however
ubMaxSpecialWeaponRoll = (!IsAutoResolveActive( ) && (gbWorldSectorZ != 0)) ? 6 : 7;
switch ( Random( ubMaxSpecialWeaponRoll ) )
{
case 0: case 0:
case 1: case 1:
case 2: case 2:
@@ -755,70 +657,18 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
bGrenadeClass = MORTAR_GRENADE_CLASS; bGrenadeClass = MORTAR_GRENADE_CLASS;
} }
break; break;
}
} }
} }
break; else if ( bSoldierClass == SOLDIER_CLASS_ELITE_MILITIA )
case SOLDIER_CLASS_ELITE_MILITIA:
bRating = BAD_ELITE_EQUIPMENT_RATING + bEquipmentModifier;
///////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - Militia equipment quality bonus
if ( gGameExternalOptions.bVeteranMilitiaEquipmentQualityModifier != 0 )
bRating += gGameExternalOptions.bVeteranMilitiaEquipmentQualityModifier;
///////////////////////////////////////////////////////////////////////////////////////////
bRating = (INT8)max( MIN_EQUIPMENT_CLASS, min( MAX_EQUIPMENT_CLASS, bRating ) );
bWeaponClass = bRating;
bHelmetClass = bRating;
bVestClass = bRating;
bLeggingClass = bRating;
bAttachClass = bRating*7/8;
bGrenadeClass = bRating;
bKitClass = bRating;
bMiscClass = bRating;
if ( Chance( 25 ) )
{ {
bBombClass = bRating; // if well-enough equipped, 1/3 chance of something really special
} if ( (bRating >= GOOD_ELITE_EQUIPMENT_RATING) && (Random( 100 ) < 60) )
bAmmoClips = (INT8)(3 + Random( 2 ));
bGrenades = (INT8)(2 + Random( 3 ));
if( ( bRating >= AVERAGE_ELITE_EQUIPMENT_RATING ) && Chance(75) )
{
fAttachment = TRUE;
bAttachClass = bRating;
}
if( Chance( 25 ) )
bKnifeClass = bRating;
if( ( bRating > MIN_EQUIPMENT_CLASS ) && bRating < MAX_EQUIPMENT_CLASS )
{
UINT32 uiRange = ((UsingNewInventorySystem() == false)) ? Random(10) : Random(11);
switch( uiRange )
{
case 4: bWeaponClass++, bVestClass--; break;
case 5: bWeaponClass--, bVestClass--; break;
case 6: bVestClass++, bHelmetClass--; break;
case 7: bGrenades += 2; break;
case 8: bHelmetClass++; break;
case 9: bVestClass++; break;
case 10: bWeaponClass++; break;
//case 11: bLBEClass++; break;
}
}
// if well-enough equipped, 1/3 chance of something really special
if( ( bRating >= GOOD_ELITE_EQUIPMENT_RATING ) && ( Random( 100 ) < 60 ) )
{
//give this man a special weapon! No mortars if underground, however
ubMaxSpecialWeaponRoll = ( !IsAutoResolveActive() && ( gbWorldSectorZ != 0 ) ) ? 4 : 5;
switch ( Random ( ubMaxSpecialWeaponRoll ) )
{ {
//give this man a special weapon! No mortars if underground, however
ubMaxSpecialWeaponRoll = (!IsAutoResolveActive( ) && (gbWorldSectorZ != 0)) ? 4 : 5;
switch ( Random( ubMaxSpecialWeaponRoll ) )
{
case 0: case 0:
//grenade launcher //grenade launcher
fGrenadeLauncher = TRUE; fGrenadeLauncher = TRUE;
@@ -841,7 +691,7 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
{ {
//mortar //mortar
fMortar = TRUE; fMortar = TRUE;
guiMortarsRolledByTeam++; ++guiMortarsRolledByTeam;
// the grenades will actually represent mortar shells in this case // the grenades will actually represent mortar shells in this case
bGrenades = 3 + (INT8)(Random( 5 )); //3-7 bGrenades = 3 + (INT8)(Random( 5 )); //3-7
@@ -855,12 +705,12 @@ void GenerateRandomEquipment( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass, INT8
bGrenadeClass = RPG_GRENADE_CLASS; bGrenadeClass = RPG_GRENADE_CLASS;
} }
break; break;
}
} }
} }
break;
case SOLDIER_CLASS_ZOMBIE: case SOLDIER_CLASS_ZOMBIE: // zombies get no items at all...
// zombies get no items at all... default:
break; break;
} }