diff --git a/GameSettings.cpp b/GameSettings.cpp index 31eee59a..038ae806 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -1642,6 +1642,9 @@ void LoadGameExternalOptions() gGameExternalOptions.usAttachmentDropRate = iniReader.ReadInteger("Item Property Settings","ATTACHMENT_DROP_RATE",10, 0, 100); gGameExternalOptions.iMaxEnemyAttachments = iniReader.ReadInteger("Item Property Settings","MAX_ENEMY_ATTACHMENTS",6, 2, MAX_ATTACHMENTS); + // Flugente: class specific gun choice + gGameExternalOptions.fSoldierClassSpecificItemTables = iniReader.ReadBoolean("Item Property Settings","SOLDIERCLASS_SPECIFIC_ITEM_TABLES", TRUE); + //################# Strategic Enemy AI Settings ################## // WDS - New AI diff --git a/GameSettings.h b/GameSettings.h index b78569fe..e1e5d4ad 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -714,6 +714,9 @@ typedef struct UINT32 usAttachmentDropRate; INT16 iMaxEnemyAttachments; + // Flugente: class specific gun/item choice + BOOLEAN fSoldierClassSpecificItemTables; + //** ddd //enable ext mouse key BOOLEAN fExtMouseKeyEnabled; diff --git a/Init.cpp b/Init.cpp index 624ff803..3efb07e5 100644 --- a/Init.cpp +++ b/Init.cpp @@ -457,13 +457,62 @@ BOOLEAN LoadExternalGameplayData(STR directoryName) strcat(fileName, ATTACHMENTSLOTSFILENAME); SGP_THROW_IFFALSE(ReadInAttachmentSlotsStats(fileName),ATTACHMENTSLOTSFILENAME); + // Flugente: created separate gun and item choices for different soldier classes - read in different xmls strcpy(fileName, directoryName); strcat(fileName, ENEMYGUNCHOICESFILENAME); - SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats (fileName),ENEMYGUNCHOICESFILENAME); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_NONE], fileName), ENEMYGUNCHOICESFILENAME); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_ENEMY_ADMIN); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_ADMINISTRATOR], fileName), GUNCHOICESFILENAME_ENEMY_ADMIN); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_ENEMY_REGULAR); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_ARMY], fileName), GUNCHOICESFILENAME_ENEMY_REGULAR); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_ENEMY_ELITE); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_ELITE], fileName), GUNCHOICESFILENAME_ENEMY_ELITE); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_MILITIA_GREEN); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_GREEN_MILITIA], fileName), GUNCHOICESFILENAME_MILITIA_GREEN); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_MILITIA_REGULAR); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_REG_MILITIA], fileName), GUNCHOICESFILENAME_MILITIA_REGULAR); + + strcpy(fileName, directoryName); + strcat(fileName, GUNCHOICESFILENAME_MILITIA_ELITE); + SGP_THROW_IFFALSE(ReadInExtendedArmyGunChoicesStats(gExtendedArmyGunChoices[SOLDIER_CLASS_ELITE_MILITIA], fileName), GUNCHOICESFILENAME_MILITIA_ELITE); strcpy(fileName, directoryName); strcat(fileName, ENEMYITEMCHOICESFILENAME); - SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(fileName),ENEMYITEMCHOICESFILENAME); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_NONE], fileName),ENEMYITEMCHOICESFILENAME); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_ENEMY_ADMIN); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_ADMINISTRATOR], fileName),ITEMCHOICESFILENAME_ENEMY_ADMIN); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_ENEMY_REGULAR); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_ARMY], fileName),ITEMCHOICESFILENAME_ENEMY_REGULAR); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_ENEMY_ELITE); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_ELITE], fileName),ITEMCHOICESFILENAME_ENEMY_ELITE); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_MILITIA_GREEN); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_GREEN_MILITIA], fileName),ITEMCHOICESFILENAME_MILITIA_GREEN); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_MILITIA_REGULAR); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_REG_MILITIA], fileName),ITEMCHOICESFILENAME_MILITIA_REGULAR); + + strcpy(fileName, directoryName); + strcat(fileName, ITEMCHOICESFILENAME_MILITIA_ELITE); + SGP_THROW_IFFALSE(ReadInArmyItemChoicesStats(gArmyItemChoices[SOLDIER_CLASS_ELITE_MILITIA], fileName),ITEMCHOICESFILENAME_MILITIA_ELITE); strcpy(fileName, directoryName); strcat(fileName, IMPITEMCHOICESFILENAME); diff --git a/Tactical/Inventory Choosing.cpp b/Tactical/Inventory Choosing.cpp index 01bc9c2a..6597edd7 100644 --- a/Tactical/Inventory Choosing.cpp +++ b/Tactical/Inventory Choosing.cpp @@ -67,7 +67,8 @@ UINT32 guiMortarsRolledByTeam = 0; // }; -ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[ARMY_GUN_LEVELS];// = +// Flugente: created separate gun choices for different soldier classes +ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[SOLDIER_GUN_CHOICE_SELECTIONS][ARMY_GUN_LEVELS];// = //{ // INDEX CLASS #CHOICES // { /* 0 - lo pistols */ 6, SW38, BARRACUDA, DESERTEAGLE, GLOCK_17, M1911, BERETTA_92F,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }, // { /* 1 - hi pist/shtgn */ 6, GLOCK_18, BERETTA_93R, P7M8, M870, M950 ,FIVE7,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }, @@ -82,7 +83,8 @@ ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[ARMY_GUN_LEVELS];// = // { /* 10- rocket rifle */ 5, ROCKET_RIFLE, AUTO_ROCKET_RIFLE , RPK74, HK21E, MINIMI , -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, //}; -ARMY_GUN_CHOICE_TYPE gArmyItemChoices[MAX_ITEM_TYPES]; +// Flugente: created separate gun choices for different soldier classes +ARMY_GUN_CHOICE_TYPE gArmyItemChoices[SOLDIER_GUN_CHOICE_SELECTIONS][MAX_ITEM_TYPES]; void RandomlyChooseWhichItemsAreDroppable( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass ); void EquipTank( SOLDIERCREATE_STRUCT *pp ); @@ -93,10 +95,10 @@ void ChooseBombsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bBombClas // Headrock: Added function definition for LBE chooser void ChooseLBEsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bLBEClass ); -UINT16 PickARandomItem(UINT8 typeIndex); -UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness); -UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness, BOOLEAN getMatchingCoolness); -UINT16 PickARandomAttachment(UINT8 typeIndex, UINT16 usBaseItem, UINT8 maxCoolness, BOOLEAN getMatchingCoolness); +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass); +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass, UINT8 maxCoolness); +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass, UINT8 maxCoolness, BOOLEAN getMatchingCoolness); +UINT16 PickARandomAttachment(UINT8 typeIndex, INT8 bSoldierClass, UINT16 usBaseItem, UINT8 maxCoolness, BOOLEAN getMatchingCoolness); void InitArmyGunTypes(void) @@ -114,7 +116,7 @@ void InitArmyGunTypes(void) //if (gGameOptions.fGunNut) //{ // use table of extended gun choices - pGunChoiceTable = &(gExtendedArmyGunChoices[0]); + pGunChoiceTable = &(gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][0]); //} //else //{ @@ -160,9 +162,9 @@ INT8 GetWeaponClass( UINT16 usGun ) { for (uiGunLevel = 0; uiGunLevel < ARMY_GUN_LEVELS; uiGunLevel++) { - for ( uiLoop = 0; uiLoop < gExtendedArmyGunChoices[ uiGunLevel ].ubChoices; uiLoop++ ) + for ( uiLoop = 0; uiLoop < gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][ uiGunLevel ].ubChoices; uiLoop++ ) { - if ( gExtendedArmyGunChoices[ uiGunLevel ].bItemNo[ uiLoop ] == usGun ) + if ( gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][ uiGunLevel ].bItemNo[ uiLoop ] == usGun ) { return( (INT8) uiGunLevel ); } @@ -191,9 +193,9 @@ void MarkAllWeaponsOfSameGunClassAsDropped( UINT16 usWeapon ) if ( bGunClass != -1 ) { // then mark EVERY gun in that class as dropped - for ( uiLoop = 0; uiLoop < gExtendedArmyGunChoices[ bGunClass ].ubChoices; uiLoop++ ) + for ( uiLoop = 0; uiLoop < gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][ bGunClass ].ubChoices; uiLoop++ ) { - gStrategicStatus.fWeaponDroppedAlready[ gExtendedArmyGunChoices[ bGunClass ].bItemNo[ uiLoop ] ] = TRUE; + gStrategicStatus.fWeaponDroppedAlready[ gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][ bGunClass ].bItemNo[ uiLoop ] ] = TRUE; } } @@ -998,7 +1000,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC { usGunIndex = pp->Inv[ i ].usItem; ubChanceStandardAmmo = 100 - (bWeaponClass * -9); // weapon class is negative! - usAmmoIndex = RandomMagazine( usGunIndex, ubChanceStandardAmmo, max(Item[usGunIndex].ubCoolness, HighestPlayerProgressPercentage() / 10 + 3)); + usAmmoIndex = RandomMagazine( usGunIndex, ubChanceStandardAmmo, max(Item[usGunIndex].ubCoolness, HighestPlayerProgressPercentage() / 10 + 3), pp->ubSoldierClass); if ( usAmmoIndex <= 0 ) usAmmoIndex = DefaultMagazine(usGunIndex); @@ -1035,7 +1037,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC // the weapon class here ranges from 1 to 11, so subtract 1 to get a gun level - usGunIndex = SelectStandardArmyGun( (UINT8) (bWeaponClass - 1)); + usGunIndex = SelectStandardArmyGun( (UINT8) (bWeaponClass - 1), pp->ubSoldierClass ); // Flugente: random items UINT16 newitemfromrandom = 0; @@ -1095,11 +1097,11 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC if(UsingNewAttachmentSystem()==false){ if ( Weapon[usGunIndex].ubWeaponType == GUN_SN_RIFLE ) { - usScopeIndex = PickARandomAttachment(SCOPE,usGunIndex,bAttachClass,TRUE); + usScopeIndex = PickARandomAttachment(SCOPE, pp->ubSoldierClass, usGunIndex,bAttachClass,TRUE); if ( usScopeIndex == 0 ) { // find any one that works - usScopeIndex = PickARandomAttachment(SCOPE,usGunIndex,bAttachClass,FALSE); + usScopeIndex = PickARandomAttachment(SCOPE, pp->ubSoldierClass, usGunIndex,bAttachClass,FALSE); } } @@ -1115,7 +1117,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC //Choose attachment if( bAttachClass && ( fAttachment )) - usAttachIndex = PickARandomAttachment(ATTACHMENTS,usGunIndex,bAttachClass,FALSE); + usAttachIndex = PickARandomAttachment(ATTACHMENTS, pp->ubSoldierClass, usGunIndex,bAttachClass,FALSE); if( ValidItemAttachment(&(pp->Inv[ HANDPOS ]),usAttachIndex,TRUE,FALSE)) { @@ -1129,7 +1131,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC //check for chance of second attachment if ( ( bAttachClass - Item[usAttachIndex].ubCoolness ) > 0 && Random(2) ) - usAttachIndex2 = PickARandomAttachment(ATTACHMENTS,usGunIndex,bAttachClass,FALSE); + usAttachIndex2 = PickARandomAttachment(ATTACHMENTS, pp->ubSoldierClass, usGunIndex,bAttachClass,FALSE); if( ValidItemAttachment(&(pp->Inv[ HANDPOS ]),usAttachIndex2,TRUE,FALSE)) @@ -1156,16 +1158,16 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC //When using NAS, we want more attachments. if ( Weapon[usGunIndex].ubWeaponType == GUN_SN_RIFLE ) { - usScopeIndex = PickARandomAttachment(SCOPE,usGunIndex,bAttachClass,TRUE); + usScopeIndex = PickARandomAttachment(SCOPE, pp->ubSoldierClass, usGunIndex,bAttachClass,TRUE); if ( usScopeIndex == 0 ) { // find any one that works - usScopeIndex = PickARandomAttachment(SCOPE,usGunIndex,bAttachClass,FALSE); + usScopeIndex = PickARandomAttachment(SCOPE, pp->ubSoldierClass, usGunIndex,bAttachClass,FALSE); } //Guns should have a fairly good chance of having a scope. Even when they're not sniper rifles. //They're likely to be crappier, though. } else if (Chance(75) && fAttachment){ - usScopeIndex = PickARandomAttachment(SCOPE,usGunIndex,bAttachClass-1,FALSE); + usScopeIndex = PickARandomAttachment(SCOPE, pp->ubSoldierClass, usGunIndex,bAttachClass-1,FALSE); } if( ValidItemAttachmentSlot(&(pp->Inv[ HANDPOS ]),usScopeIndex, TRUE,FALSE) ) @@ -1199,7 +1201,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC } if (fRandomPassed) - usAttachIndex = PickARandomAttachment(ATTACHMENTS,usGunIndex,bAttachClass,fGetMatchingCoolness); + usAttachIndex = PickARandomAttachment(ATTACHMENTS, pp->ubSoldierClass, usGunIndex,bAttachClass,fGetMatchingCoolness); if(!usAttachIndex){ continue; @@ -1246,7 +1248,7 @@ void ChooseWeaponForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bWeaponC // break; //} - usAmmoIndex = RandomMagazine( &pp->Inv[HANDPOS], ubChanceStandardAmmo, max(Item[usGunIndex].ubCoolness, HighestPlayerProgressPercentage() / 10 + 3 )); + usAmmoIndex = RandomMagazine( &pp->Inv[HANDPOS], ubChanceStandardAmmo, max(Item[usGunIndex].ubCoolness, HighestPlayerProgressPercentage() / 10 + 3 ), pp->ubSoldierClass); if ( usAmmoIndex <= 0 ) usAmmoIndex = DefaultMagazine(usGunIndex); @@ -1377,7 +1379,7 @@ void ChooseGrenadesForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bGrena if ( count > bGrenades ) count = bGrenades; - usItem = PickARandomItem ( GRENADE , bGrenadeClass, FALSE ); + usItem = PickARandomItem ( GRENADE, pp->ubSoldierClass, bGrenadeClass, FALSE ); if ( usItem > 0 && count > 0 ) { CreateItems( usItem, (INT8)(ubBaseQuality + Random( ubQualityVariation )), count, &gTempObject ); @@ -1604,7 +1606,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //search for a non-empty class with items we need for(i=bHelmetClass;i<=10;i++) { - usHelmetItem = PickARandomItem(HELMET,i ); + usHelmetItem = PickARandomItem(HELMET, pp->ubSoldierClass, i ); //if we find a non-empty class change to that and break if(usHelmetItem > 0) { @@ -1616,7 +1618,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //search for a non-empty class with items we need for(i=bVestClass;i<=10;i++) { - usVestItem = PickARandomItem(VEST,i ); + usVestItem = PickARandomItem(VEST, pp->ubSoldierClass, i ); //if we find a non-empty class change to that and break if(usVestItem > 0) { @@ -1628,7 +1630,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //search for a non-empty class with items we need for(i=bLeggingsClass;i<=10;i++) { - usLeggingsItem = PickARandomItem(LEGS,i ); + usLeggingsItem = PickARandomItem(LEGS, pp->ubSoldierClass, i ); //if we find a non-empty class change to that and break if(usLeggingsItem > 0) { @@ -1643,7 +1645,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //Choose helmet if( bHelmetClass ) { - if(!gGameExternalOptions.fSoldiersWearAnyArmour) usHelmetItem = PickARandomItem(HELMET,bHelmetClass ); + if(!gGameExternalOptions.fSoldiersWearAnyArmour) usHelmetItem = PickARandomItem(HELMET, pp->ubSoldierClass, bHelmetClass ); if ( usHelmetItem > 0 && Item[usHelmetItem].usItemClass == IC_ARMOUR && !(pp->Inv[ HELMETPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usHelmetItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_HELMET ) { CreateItem( usHelmetItem, (INT8)(70+Random(31)), &(pp->Inv[ HELMETPOS ]) ); @@ -1652,7 +1654,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC // roll to see if he gets an attachment, too. Higher chance the higher his entitled helmet class is if (( INT8 ) Random( 100 ) < ( 15 * ( bHelmetClass - Item[usHelmetItem].ubCoolness ) ) ) { - UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT,usHelmetItem, bHelmetClass, FALSE); + UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usHelmetItem, bHelmetClass, FALSE); if ( usAttachment > 0 ) { CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject ); @@ -1716,7 +1718,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //Choose vest if( bVestClass ) { - if(!gGameExternalOptions.fSoldiersWearAnyArmour) usVestItem = PickARandomItem(VEST,bVestClass ); + if(!gGameExternalOptions.fSoldiersWearAnyArmour) usVestItem = PickARandomItem(VEST, pp->ubSoldierClass, bVestClass ); if ( usVestItem > 0 && Item[usVestItem].usItemClass == IC_ARMOUR && !(pp->Inv[ VESTPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usVestItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_VEST ) { CreateItem( usVestItem, (INT8)(70+Random(31)), &(pp->Inv[ VESTPOS ]) ); @@ -1725,7 +1727,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC // roll to see if he gets a CERAMIC PLATES, too. Higher chance the higher his entitled vest class is if (( INT8 ) Random( 100 ) < ( 15 * ( bVestClass - Item[usVestItem].ubCoolness ) ) ) { - UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT,usVestItem, bVestClass, FALSE); + UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usVestItem, bVestClass, FALSE); if ( usAttachment > 0 ) { CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject ); @@ -1810,7 +1812,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC //Choose Leggings if( bLeggingsClass ) { - if(!gGameExternalOptions.fSoldiersWearAnyArmour) usLeggingsItem = PickARandomItem(LEGS,bLeggingsClass ); + if(!gGameExternalOptions.fSoldiersWearAnyArmour) usLeggingsItem = PickARandomItem(LEGS, pp->ubSoldierClass, bLeggingsClass ); if ( usLeggingsItem > 0 && Item[usLeggingsItem].usItemClass == IC_ARMOUR && !(pp->Inv[ LEGPOS ].fFlags & OBJECT_NO_OVERWRITE) && Armour[ Item[usLeggingsItem].ubClassIndex ].ubArmourClass == ARMOURCLASS_LEGGINGS ) { CreateItem( usLeggingsItem, (INT8)(70+Random(31)), &(pp->Inv[ LEGPOS ]) ); @@ -1819,7 +1821,7 @@ void ChooseArmourForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bHelmetC // roll to see if he gets an attachment, too. Higher chance the higher his entitled Leggings class is if (( INT8 ) Random( 100 ) < ( 15 * ( bLeggingsClass - Item[usLeggingsItem].ubCoolness ) ) ) { - UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT,usLeggingsItem, bLeggingsClass, FALSE); + UINT16 usAttachment = PickARandomAttachment(ARMOURATTACHMENT, pp->ubSoldierClass, usLeggingsItem, bLeggingsClass, FALSE); if ( usAttachment > 0 ) { CreateItem( usAttachment, (INT8)(70+Random(31)), &gTempObject ); @@ -1937,7 +1939,7 @@ void ChooseSpecialWeaponsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 if ( bKnifeClass ) { - usKnifeIndex = PickARandomItem(KNIVES,bKnifeClass); + usKnifeIndex = PickARandomItem(KNIVES, pp->ubSoldierClass, bKnifeClass); if( usKnifeIndex > 0 ) { @@ -1964,7 +1966,7 @@ void ChooseSpecialWeaponsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 } else if (fGrenadeLauncher) { - itemGrenadeLauncher = PickARandomItem ( GRENADELAUNCHER ); + itemGrenadeLauncher = PickARandomItem ( GRENADELAUNCHER, pp->ubSoldierClass ); // give grenade launcher if ( itemGrenadeLauncher > 0 ) { @@ -1977,7 +1979,7 @@ void ChooseSpecialWeaponsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 if (fLAW) { // give rocket launcher - itemLAW = PickARandomItem (SINGLESHOTROCKETLAUNCHER); + itemLAW = PickARandomItem (SINGLESHOTROCKETLAUNCHER, pp->ubSoldierClass ); if ( itemLAW > 0 ) { CreateItem( itemLAW, (INT8)(50 + Random( 51 )), &gTempObject ); @@ -1988,7 +1990,7 @@ void ChooseSpecialWeaponsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 if (fRPG) { // give rpg - itemRPG = PickARandomItem (ROCKETLAUNCHER); + itemRPG = PickARandomItem (ROCKETLAUNCHER, pp->ubSoldierClass); if ( itemRPG > 0 ) { CreateItem( itemRPG, (INT8)(50 + Random( 51 )), &gTempObject ); @@ -2003,7 +2005,7 @@ void ChooseSpecialWeaponsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 Assert( IsAutoResolveActive() || ( gbWorldSectorZ == 0 ) ); // give mortar - itemMortar = PickARandomItem (MORTARLAUNCHER); + itemMortar = PickARandomItem (MORTARLAUNCHER, pp->ubSoldierClass); if ( itemMortar > 0 ) { CreateItem( itemMortar, (INT8)(50 + Random( 51 )), &gTempObject ); @@ -2051,7 +2053,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) //All elites get a gasmask and either night goggles or uv goggles. if( Chance( 75 ) ) { - usItem = PickARandomItem(GASMASKS); + usItem = PickARandomItem(GASMASKS, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD1POS ]) ); @@ -2060,7 +2062,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) } else { - usItem = PickARandomItem(HEARINGAIDS); + usItem = PickARandomItem(HEARINGAIDS, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD1POS ]) ); @@ -2072,7 +2074,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) { if( Chance( 75 ) ) { - usItem = PickARandomItem(NVGLOW); + usItem = PickARandomItem(NVGLOW, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD2POS ]) ); @@ -2081,7 +2083,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) } else { - usItem = PickARandomItem(NVGHIGH); + usItem = PickARandomItem(NVGHIGH, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD2POS ]) ); @@ -2096,7 +2098,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) { //chance of getting a face item if( Chance( 50 ) ) { - usItem = PickARandomItem(GASMASKS); + usItem = PickARandomItem(GASMASKS, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD1POS ]) ); @@ -2105,7 +2107,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) } else { - usItem = PickARandomItem(NVGLOW); + usItem = PickARandomItem(NVGLOW, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD1POS ]) ); @@ -2115,7 +2117,7 @@ void ChooseFaceGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp ) } if( Chance( bDifficultyRating / 3 ) ) { //chance of getting a extended ear - usItem = PickARandomItem(HEARINGAIDS); + usItem = PickARandomItem(HEARINGAIDS, pp->ubSoldierClass); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(70+Random(31)), &(pp->Inv[ HEAD2POS ]) ); @@ -2198,7 +2200,7 @@ void ChooseKitsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bKitClass #endif //obsoleteCode // if we still want more medical and first aid kits, we can just add extras of those item #s to the array - usKitItem = PickARandomItem( KIT , bKitClass, FALSE ); + usKitItem = PickARandomItem( KIT, pp->ubSoldierClass, bKitClass, FALSE ); if ( usKitItem > 0 ) { CreateItem( usKitItem, (INT8)(80 + Random( 21 )), &gTempObject ); @@ -2223,7 +2225,7 @@ void ChooseMiscGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bMiscC UINT16 usItem = 0; for ( UINT16 i=0;iubSoldierClass, bMiscClass, FALSE); if ( usItem > 0 ) { int bStatus = 80 + Random( 21 ); @@ -2318,7 +2320,7 @@ void ChooseBombsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bBombClas //UINT16 usRandom; UINT16 usItem = 0; - usItem = PickARandomItem( BOMB , bBombClass, FALSE ); + usItem = PickARandomItem( BOMB, pp->ubSoldierClass, bBombClass, FALSE ); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(80 + Random( 21 )), &gTempObject ); @@ -2381,7 +2383,7 @@ void ChooseLBEsForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bLBEClass if((UsingNewInventorySystem() == false)) return; - usItem = PickARandomItem( LBE , bLBEClass, FALSE ); + usItem = PickARandomItem( LBE, pp->ubSoldierClass, bLBEClass, FALSE ); if ( usItem > 0 ) { CreateItem( usItem, (INT8)(80 + Random( 21 )), &gTempObject ); @@ -2400,7 +2402,7 @@ void ChooseLocationSpecificGearForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp if ( gWorldSectorX == TIXA_SECTOR_X && gWorldSectorY == TIXA_SECTOR_Y && StrategicMap[ TIXA_SECTOR_X + TIXA_SECTOR_Y * MAP_WORLD_X ].fEnemyControlled ) { //dnl ch40 041009 - usItem = PickARandomItem(GASMASKS); + usItem = PickARandomItem(GASMASKS, pp->ubSoldierClass); if(Random(100) > 80) usItem = NOTHING; if(usItem > 0) @@ -3247,7 +3249,7 @@ void ReplaceExtendedGuns( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass ) { bWeaponClass = GetWeaponClass( usItem ); AssertMsg( bWeaponClass != -1, String( "Gun %d does not have a match in the extended gun array", usItem ) ); - usNewGun = SelectStandardArmyGun( bWeaponClass ); + usNewGun = SelectStandardArmyGun( bWeaponClass, bSoldierClass ); } if ( usNewGun != NOTHING ) @@ -3291,7 +3293,7 @@ void ReplaceExtendedGuns( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass ) -UINT16 SelectStandardArmyGun( UINT8 uiGunLevel ) +UINT16 SelectStandardArmyGun( UINT8 uiGunLevel, INT8 bSoldierClass ) { ARMY_GUN_CHOICE_TYPE *pGunChoiceTable; int uiChoice; @@ -3306,7 +3308,12 @@ UINT16 SelectStandardArmyGun( UINT8 uiGunLevel ) //if (gGameOptions.fGunNut) //{ // use table of extended gun choices - pGunChoiceTable = &(gExtendedArmyGunChoices[0]); + + // Flugente: if accessing with wrong soldier class, or not using different selection choices, take default one + if ( bSoldierClass >= SOLDIER_GUN_CHOICE_SELECTIONS || bSoldierClass < SOLDIER_CLASS_NONE || !gGameExternalOptions.fSoldierClassSpecificItemTables ) + bSoldierClass = SOLDIER_CLASS_NONE; + + pGunChoiceTable = &(gExtendedArmyGunChoices[bSoldierClass][0]); //} //else //{ @@ -3407,15 +3414,15 @@ void ResetMortarsOnTeamCount( void ) guiMortarsRolledByTeam = 0; } -UINT16 PickARandomItem(UINT8 typeIndex) +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass) { - return PickARandomItem(typeIndex,100,FALSE); + return PickARandomItem(typeIndex, bSoldierClass, 100,FALSE); } -UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness) +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass, UINT8 maxCoolness) { - return PickARandomItem(typeIndex,maxCoolness,TRUE); + return PickARandomItem(typeIndex, bSoldierClass, maxCoolness,TRUE); } -UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness, BOOLEAN getMatchingCoolness) +UINT16 PickARandomItem(UINT8 typeIndex, INT8 bSoldierClass, UINT8 maxCoolness, BOOLEAN getMatchingCoolness) { //DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomItem: typeIndex = %d, maxCoolness = %d, getMatchingCoolness = %d",typeIndex,maxCoolness,getMatchingCoolness)); @@ -3424,27 +3431,31 @@ UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness, BOOLEAN getMatchingCo UINT16 defaultItem = 0; BOOLEAN pickItem = FALSE; - if ( gArmyItemChoices[ typeIndex ].ubChoices <= 0 ) + // Flugente: if accessing with wrong soldier class, or not using different selection choices, take default one + if ( bSoldierClass >= SOLDIER_GUN_CHOICE_SELECTIONS || bSoldierClass < SOLDIER_CLASS_NONE || !gGameExternalOptions.fSoldierClassSpecificItemTables ) + bSoldierClass = SOLDIER_CLASS_NONE; + + if ( gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices <= 0 ) return 0; // check up to 10 times for an item with a matching coolness for (int i=0; i < 10;i++) { //if we've already tried more times then there are items + 1, limit the looping to speed up the game, and just plain give up - if ( i > gArmyItemChoices[ typeIndex ].ubChoices ) + if ( i > gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices ) break; // a chance for nothing! - uiChoice = Random(gArmyItemChoices[ typeIndex ].ubChoices + (int) ( gArmyItemChoices[ typeIndex ].ubChoices / 3 )); + uiChoice = Random(gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices + (int) ( gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices / 3 )); - if ( uiChoice >= gArmyItemChoices[ typeIndex ].ubChoices ) + if ( uiChoice >= gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices ) { if ( !getMatchingCoolness ) return 0; else - uiChoice = Random(gArmyItemChoices[ typeIndex ].ubChoices); + uiChoice = Random(gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices); } - usItem = gArmyItemChoices[ typeIndex ].bItemNo[ uiChoice ]; + usItem = gArmyItemChoices[bSoldierClass][ typeIndex ].bItemNo[ uiChoice ]; // Flugente: random items UINT16 newitemfromrandom = 0; @@ -3503,7 +3514,7 @@ UINT16 PickARandomItem(UINT8 typeIndex, UINT8 maxCoolness, BOOLEAN getMatchingCo else return 0; } -UINT16 PickARandomAttachment(UINT8 typeIndex, UINT16 usBaseItem, UINT8 maxCoolness, BOOLEAN getMatchingCoolness) +UINT16 PickARandomAttachment(UINT8 typeIndex, INT8 bSoldierClass, UINT16 usBaseItem, UINT8 maxCoolness, BOOLEAN getMatchingCoolness) { //DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomAttachment: baseItem = %d, typeIndex = %d, maxCoolness = %d, getMatchingCoolness = %d",usBaseItem, typeIndex,maxCoolness,getMatchingCoolness)); @@ -3511,19 +3522,23 @@ UINT16 PickARandomAttachment(UINT8 typeIndex, UINT16 usBaseItem, UINT8 maxCoolne UINT32 uiChoice; UINT16 defaultItem = 0; + // Flugente: if accessing with wrong soldier class, or not using different selection choices, take default one + if ( bSoldierClass >= SOLDIER_GUN_CHOICE_SELECTIONS || bSoldierClass < SOLDIER_CLASS_NONE || !gGameExternalOptions.fSoldierClassSpecificItemTables ) + bSoldierClass = SOLDIER_CLASS_NONE; + // DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("PickARandomAttachment: # choices = %d", gArmyItemChoices[ typeIndex ].ubChoices )); - if ( gArmyItemChoices[ typeIndex ].ubChoices <= 0 ) + if ( gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices <= 0 ) return 0; // check up to 10 times for an item with a matching coolness for (int i=0; i < 50; i++) { //if we've already tried more times then there are items + 1, limit the looping to speed up the game, and just plain give up - if ( i > gArmyItemChoices[ typeIndex ].ubChoices ) + if ( i > gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices ) break; - uiChoice = Random(gArmyItemChoices[ typeIndex ].ubChoices); - usItem = gArmyItemChoices[ typeIndex ].bItemNo[ uiChoice ]; + uiChoice = Random(gArmyItemChoices[bSoldierClass][ typeIndex ].ubChoices); + usItem = gArmyItemChoices[bSoldierClass][ typeIndex ].bItemNo[ uiChoice ]; BOOLEAN fDefaultAttachment = FALSE; for(UINT8 cnt = 0; cnt < MAX_DEFAULT_ATTACHMENTS; cnt++){ diff --git a/Tactical/Inventory Choosing.h b/Tactical/Inventory Choosing.h index 35053114..f0e54684 100644 --- a/Tactical/Inventory Choosing.h +++ b/Tactical/Inventory Choosing.h @@ -79,14 +79,15 @@ void AssignCreatureInventory( SOLDIERTYPE *pSoldier ); void ReplaceExtendedGuns( SOLDIERCREATE_STRUCT *pp, INT8 bSoldierClass ); -UINT16 SelectStandardArmyGun( UINT8 uiGunLevel ); +UINT16 SelectStandardArmyGun( UINT8 uiGunLevel, INT8 bSoldierClass ); INT8 GetWeaponClass( UINT16 usGun ); void MarkAllWeaponsOfSameGunClassAsDropped( UINT16 usWeapon ); void ResetMortarsOnTeamCount( void ); -extern ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[ARMY_GUN_LEVELS]; +// Flugente: created separate gun choices for different soldier classes +extern ARMY_GUN_CHOICE_TYPE gExtendedArmyGunChoices[SOLDIER_GUN_CHOICE_SELECTIONS][ARMY_GUN_LEVELS]; // Headrock: Added LBE enumeration enum @@ -115,7 +116,8 @@ enum MAX_ITEM_TYPES }; -extern ARMY_GUN_CHOICE_TYPE gArmyItemChoices[MAX_ITEM_TYPES]; +// Flugente: created separate gun choices for different soldier classes +extern ARMY_GUN_CHOICE_TYPE gArmyItemChoices[SOLDIER_GUN_CHOICE_SELECTIONS][MAX_ITEM_TYPES]; #endif \ No newline at end of file diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index e92b64ca..b11a348c 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -7374,13 +7374,17 @@ UINT16 FindReplacementMagazineIfNecessary( UINT16 usOldGun, UINT16 usOldAmmo, UI // increase this if any gun can have more types that this #define MAX_AMMO_TYPES_PER_GUN 24 // MADD MARKER -UINT16 RandomMagazine( UINT16 usItem, UINT8 ubPercentStandard, UINT8 maxCoolness ) +UINT16 RandomMagazine( UINT16 usItem, UINT8 ubPercentStandard, UINT8 maxCoolness, INT8 bSoldierClass ) { // Note: if any ammo items in the item table are separated from the main group, // this function will have to be rewritten to scan the item table for an item // with item class ammo, which has class index ubLoop DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("RandomMagazine (by index)")); + // Flugente: if accessing with wrong soldier class, or not using different selection choices, take default one + if ( bSoldierClass >= SOLDIER_GUN_CHOICE_SELECTIONS || bSoldierClass < SOLDIER_CLASS_NONE || !gGameExternalOptions.fSoldierClassSpecificItemTables ) + bSoldierClass = SOLDIER_CLASS_NONE; + WEAPONTYPE * pWeapon; UINT16 usLoop; UINT16 loopItem; @@ -7408,11 +7412,11 @@ UINT16 RandomMagazine( UINT16 usItem, UINT8 ubPercentStandard, UINT8 maxCoolness // store it! (make sure array is big enough) Assert(usPossibleMagCnt < MAX_AMMO_TYPES_PER_GUN); // Madd: check to see if allowed by army - if ( gArmyItemChoices[ENEMYAMMOTYPES].ubChoices > 0 ) + if ( gArmyItemChoices[bSoldierClass][ENEMYAMMOTYPES].ubChoices > 0 ) { - for ( int i=0;i= SOLDIER_GUN_CHOICE_SELECTIONS || bSoldierClass < SOLDIER_CLASS_NONE || !gGameExternalOptions.fSoldierClassSpecificItemTables ) + bSoldierClass = SOLDIER_CLASS_NONE; + WEAPONTYPE * pWeapon; UINT16 usLoop; UINT16 loopItem; @@ -7494,11 +7502,11 @@ UINT16 RandomMagazine( OBJECTTYPE * pGun, UINT8 ubPercentStandard, UINT8 maxCool // store it! (make sure array is big enough) Assert(usPossibleMagCnt < MAX_AMMO_TYPES_PER_GUN); // Madd: check to see if allowed by army - if ( gArmyItemChoices[ENEMYAMMOTYPES].ubChoices > 0 ) + if ( gArmyItemChoices[bSoldierClass][ENEMYAMMOTYPES].ubChoices > 0 ) { - for ( int i=0;ibActive || !this->bInSector || this->stats.bLife < OKLIFE ) return( FALSE ); + // this is odd - invalid GridNo... well, no feeding then + if ( TileIsOutOfBounds(this->sGridNo) ) + return( FALSE ); + BOOLEAN isFeeding = FALSE; UINT16 usGunItem = 0; @@ -14847,7 +14851,7 @@ BOOLEAN SOLDIERTYPE::EquipmentTooGood( BOOLEAN fCloselook ) ++numberofattachments; - // no ordinary soldier is allowed that many attachments > not covert + // no ordinary soldier is allowed that many attachments -> not covert if ( numberofattachments > gGameExternalOptions.iMaxEnemyAttachments ) { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, szCovertTextStr[STR_COVERT_TOOMANYATTACHMENTS], this->name, Item[pObj->usItem].szItemName ); diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 5c3ee955..ea907842 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -328,6 +328,9 @@ enum #endif }; +// Flugente: there are now separate gun choices, depending on a soldier's class +#define SOLDIER_GUN_CHOICE_SELECTIONS SOLDIER_CLASS_CREATURE + #define SOLDIER_CLASS_ENEMY( bSoldierClass ) ( ( bSoldierClass >= SOLDIER_CLASS_ADMINISTRATOR ) && ( bSoldierClass <= SOLDIER_CLASS_ARMY ) ) #define SOLDIER_CLASS_MILITIA( bSoldierClass ) ( ( bSoldierClass >= SOLDIER_CLASS_GREEN_MILITIA ) && ( bSoldierClass <= SOLDIER_CLASS_ELITE_MILITIA ) ) diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index e5b7e476..7b5ac2d6 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -3015,7 +3015,7 @@ SOLDIERTYPE* TacticalCreateCreature( INT8 bCreatureBodyType ) return TacticalCreateSoldier( &pp, &ubID ); } -// Flugente: assassins are elite soldiers of the civ team that go hostile on a certain event, otherwsie they jsut blend in +// Flugente: assassins are elite soldiers of the civ team that go hostile on a certain event, otherwsie they just blend in SOLDIERTYPE* TacticalCreateEnemyAssassin(UINT8 disguisetype) { BASIC_SOLDIERCREATE_STRUCT bp; @@ -3033,9 +3033,18 @@ SOLDIERTYPE* TacticalCreateEnemyAssassin(UINT8 disguisetype) return NULL; } + UINT8 assassinclass = SOLDIER_CLASS_GREEN_MILITIA; + if ( disguisetype == REGULAR_MILITIA ) + assassinclass = SOLDIER_CLASS_REG_MILITIA; + else if ( disguisetype == ELITE_MILITIA ) + assassinclass = SOLDIER_CLASS_ELITE_MILITIA; + else if ( disguisetype > ELITE_MILITIA ) + // invalid class, abort + return NULL; + memset( &bp, 0, sizeof( BASIC_SOLDIERCREATE_STRUCT ) ); - RandomizeRelativeLevel( &( bp.bRelativeAttributeLevel ), SOLDIER_CLASS_ELITE ); - RandomizeRelativeLevel( &( bp.bRelativeEquipmentLevel ), SOLDIER_CLASS_ELITE ); + RandomizeRelativeLevel( &( bp.bRelativeAttributeLevel ), assassinclass ); + RandomizeRelativeLevel( &( bp.bRelativeEquipmentLevel ), assassinclass ); bp.bTeam = CIV_TEAM; bp.bOrders = SEEKENEMY; bp.bAttitude = (INT8) Random( MAXATTITUDES ); diff --git a/Tactical/XML.h b/Tactical/XML.h index ec7236ec..56f58dec 100644 --- a/Tactical/XML.h +++ b/Tactical/XML.h @@ -15,6 +15,7 @@ #include "XML_Language.h" #include "Encyclopedia_Data.h" #include "Encyclopedia.h" +#include "Inventory Choosing.h" // added by Flugente //forward declarations of common classes to eliminate includes class OBJECTTYPE; class SOLDIERTYPE; @@ -52,42 +53,57 @@ typedef PARSE_STAGE; #define TAIWANESE_PREFIX "Taiwanese." #define CHINESE_PREFIX "Chinese." -#define ATTACHMENTSFILENAME "Attachments.xml" -#define ATTACHMENTINFOFILENAME "AttachmentInfo.xml" -#define ITEMSFILENAME "Items.xml" -#define WEAPONSFILENAME "Weapons.xml" -#define LAUNCHABLESFILENAME "Launchables.xml" -#define COMPATIBLEFACEITEMSFILENAME "CompatibleFaceItems.xml" -#define MERGESFILENAME "Merges.xml" -#define ATTACHMENTCOMBOMERGESFILENAME "AttachmentComboMerges.xml" +#define ATTACHMENTSFILENAME "Items\\Attachments.xml" +#define ATTACHMENTINFOFILENAME "Items\\AttachmentInfo.xml" +#define ITEMSFILENAME "Items\\Items.xml" +#define WEAPONSFILENAME "Items\\Weapons.xml" +#define LAUNCHABLESFILENAME "Items\\Launchables.xml" +#define COMPATIBLEFACEITEMSFILENAME "Items\\CompatibleFaceItems.xml" +#define MERGESFILENAME "Items\\Merges.xml" +#define ATTACHMENTCOMBOMERGESFILENAME "Items\\AttachmentComboMerges.xml" // HEADROCK HAM 5: Item Transformations Filename -#define ITEMTRANSFORMATIONSFILENAME "Item_Transformations.xml" -#define MAGAZINESFILENAME "Magazines.xml" -#define ARMOURSFILENAME "Armours.xml" -#define EXPLOSIVESFILENAME "Explosives.xml" -#define DRUGSFILENAME "Drugs.xml" -#define FOODFILENAME "Food.xml" +#define ITEMTRANSFORMATIONSFILENAME "Items\\Item_Transformations.xml" +#define MAGAZINESFILENAME "Items\\Magazines.xml" +#define ARMOURSFILENAME "Items\\Armours.xml" +#define EXPLOSIVESFILENAME "Items\\Explosives.xml" +#define DRUGSFILENAME "Items\\Drugs.xml" +#define FOODFILENAME "Items\\Food.xml" #define MERCHANTSFILENAME "NPCInventory\\Merchants.xml" -#define CLOTHESFILENAME "Clothes.xml" -#define RANDOMITEMFILENAME "RandomItem.xml" -#define AMMOFILENAME "AmmoStrings.xml" -#define AMMOTYPESFILENAME "AmmoTypes.xml" -#define INCOMPATIBLEATTACHMENTSFILENAME "IncompatibleAttachments.xml" -#define ATTACHMENTSLOTSFILENAME "AttachmentSlots.xml" -#define ENEMYGUNCHOICESFILENAME "EnemyGunChoices.xml" -#define ENEMYITEMCHOICESFILENAME "EnemyItemChoices.xml" -#define IMPITEMCHOICESFILENAME "IMPItemChoices.xml" +#define CLOTHESFILENAME "Items\\Clothes.xml" +#define RANDOMITEMFILENAME "Items\\RandomItem.xml" +#define AMMOFILENAME "Items\\AmmoStrings.xml" +#define AMMOTYPESFILENAME "Items\\AmmoTypes.xml" +#define INCOMPATIBLEATTACHMENTSFILENAME "Items\\IncompatibleAttachments.xml" +#define ATTACHMENTSLOTSFILENAME "Items\\AttachmentSlots.xml" +#define IMPITEMCHOICESFILENAME "Inventory\\IMPItemChoices.xml" + +// Flugente: added new gun and item choices for different soldier classes +#define ENEMYGUNCHOICESFILENAME "Inventory\\EnemyGunChoices.xml" // default selection +#define GUNCHOICESFILENAME_ENEMY_ADMIN "Inventory\\GunChoices_Enemy_Admin.xml" +#define GUNCHOICESFILENAME_ENEMY_REGULAR "Inventory\\GunChoices_Enemy_Regular.xml" +#define GUNCHOICESFILENAME_ENEMY_ELITE "Inventory\\GunChoices_Enemy_Elite.xml" +#define GUNCHOICESFILENAME_MILITIA_GREEN "Inventory\\GunChoices_Militia_Green.xml" +#define GUNCHOICESFILENAME_MILITIA_REGULAR "Inventory\\GunChoices_Militia_Regular.xml" +#define GUNCHOICESFILENAME_MILITIA_ELITE "Inventory\\GunChoices_Militia_Elite.xml" + +#define ENEMYITEMCHOICESFILENAME "Inventory\\EnemyItemChoices.xml" // default selection +#define ITEMCHOICESFILENAME_ENEMY_ADMIN "Inventory\\ItemChoices_Enemy_Admin.xml" +#define ITEMCHOICESFILENAME_ENEMY_REGULAR "Inventory\\ItemChoices_Enemy_Regular.xml" +#define ITEMCHOICESFILENAME_ENEMY_ELITE "Inventory\\ItemChoices_Enemy_Elite.xml" +#define ITEMCHOICESFILENAME_MILITIA_GREEN "Inventory\\ItemChoices_Militia_Green.xml" +#define ITEMCHOICESFILENAME_MILITIA_REGULAR "Inventory\\ItemChoices_Militia_Regular.xml" +#define ITEMCHOICESFILENAME_MILITIA_ELITE "Inventory\\ItemChoices_Militia_Elite.xml" // CHRISL: -#define LOADBEARINGEQUIPMENTFILENAME "LoadBearingEquipment.xml" -#define LBEPOCKETFILENAME "Pockets.xml" +#define LOADBEARINGEQUIPMENTFILENAME "Items\\LoadBearingEquipment.xml" +#define LBEPOCKETFILENAME "Inventory\\Pockets.xml" // THE_BOB : added for pocket popup definitions -#define LBEPOCKETPOPUPFILENAME "PocketPopups.xml" +#define LBEPOCKETPOPUPFILENAME "Inventory\\PocketPopups.xml" -#define MERCSTARTINGGEARFILENAME "MercStartingGear.xml" +#define MERCSTARTINGGEARFILENAME "Inventory\\MercStartingGear.xml" #ifdef JA2UB -#define MERCSTARTINGGEAR25FILENAME "MercStartingGear25.xml" //ja25 ub +#define MERCSTARTINGGEAR25FILENAME "Inventory\\MercStartingGear25.xml" //ja25 ub #endif #define TONYINVENTORYFILENAME "NPCInventory\\TonyInventory.xml" @@ -142,7 +158,7 @@ typedef PARSE_STAGE; #define SOUNDSFILENAME "Sounds\\Sounds.xml" #define BURSTSOUNDSFILENAME "Sounds\\BurstSounds.xml" -#define EXPLOSIONDATAFILENAME "ExplosionData.xml" +#define EXPLOSIONDATAFILENAME "Items\\ExplosionData.xml" #define CITYTABLEFILENAME "Map\\Cities.xml" #define MOVEMENTCOSTFILENAME "Map\\MovementCosts.xml" @@ -157,11 +173,11 @@ typedef PARSE_STAGE; #define COMPOSITIONFILENAME "Army\\ArmyComposition.xml" // WANNE: drops filename -#define ENEMYWEAPONDROPSFILENAME "EnemyWeaponDrops.xml" -#define ENEMYAMMODROPSFILENAME "EnemyAmmoDrops.xml" -#define ENEMYEXPLOSIVEDROPSFILENAME "EnemyExplosiveDrops.xml" -#define ENEMYARMOURDROPSFILENAME "EnemyArmourDrops.xml" -#define ENEMYMISCDROPSFILENAME "EnemyMiscDrops.xml" +#define ENEMYWEAPONDROPSFILENAME "Inventory\\EnemyWeaponDrops.xml" +#define ENEMYAMMODROPSFILENAME "Inventory\\EnemyAmmoDrops.xml" +#define ENEMYEXPLOSIVEDROPSFILENAME "Inventory\\EnemyExplosiveDrops.xml" +#define ENEMYARMOURDROPSFILENAME "Inventory\\EnemyArmourDrops.xml" +#define ENEMYMISCDROPSFILENAME "Inventory\\EnemyMiscDrops.xml" // WANNE: Sector loadscreens [2007-05-18] #define SECTORLOADSCREENSFILENAME "Map\\SectorLoadscreens.xml" @@ -352,10 +368,10 @@ extern BOOLEAN WriteAttachmentSlotsStats(); extern BOOLEAN ReadInAttachmentSlotsStats(STR fileName); extern BOOLEAN WriteExtendedArmyGunChoicesStats(); -extern BOOLEAN ReadInExtendedArmyGunChoicesStats(STR fileName); +extern BOOLEAN ReadInExtendedArmyGunChoicesStats(ARMY_GUN_CHOICE_TYPE* pGunChoice, STR fileName); extern BOOLEAN WriteArmyItemChoicesStats(); -extern BOOLEAN ReadInArmyItemChoicesStats(STR fileName); +extern BOOLEAN ReadInArmyItemChoicesStats(ARMY_GUN_CHOICE_TYPE* pGunChoice, STR fileName); extern BOOLEAN WriteIMPItemChoicesStats(); extern BOOLEAN ReadInIMPItemChoicesStats(STR fileName); diff --git a/Tactical/XML_EnemyItemChoice.cpp b/Tactical/XML_EnemyItemChoice.cpp index ef2331f4..06658f58 100644 --- a/Tactical/XML_EnemyItemChoice.cpp +++ b/Tactical/XML_EnemyItemChoice.cpp @@ -416,7 +416,7 @@ armyitemchoicesEndElementHandle(void *userData, const XML_Char *name) -BOOLEAN ReadInArmyItemChoicesStats(STR fileName) +BOOLEAN ReadInArmyItemChoicesStats(ARMY_GUN_CHOICE_TYPE* pGunChoice, STR fileName) { HWFILE hFile; UINT32 uiBytesRead; @@ -453,7 +453,7 @@ BOOLEAN ReadInArmyItemChoicesStats(STR fileName) memset(&pData,0,sizeof(pData)); - pData.curArray = gArmyItemChoices; + pData.curArray = pGunChoice; pData.maxArraySize = MAX_ITEM_TYPES; XML_SetUserData(parser, &pData); @@ -499,9 +499,9 @@ BOOLEAN WriteArmyItemChoicesStats() FilePrintf(hFile,"\t\r\n"); FilePrintf(hFile,"\t\t%d\r\n", cnt ); - FilePrintf(hFile,"\t\t%d\r\n", gArmyItemChoices[cnt].ubChoices ); + FilePrintf(hFile,"\t\t%d\r\n", gArmyItemChoices[SOLDIER_CLASS_NONE][cnt].ubChoices ); for (int i=0;i<50;i++) - FilePrintf(hFile,"\t\t%d\r\n",i+1,gArmyItemChoices[cnt].bItemNo[i],i+1 ); + FilePrintf(hFile,"\t\t%d\r\n",i+1,gArmyItemChoices[SOLDIER_CLASS_NONE][cnt].bItemNo[i],i+1 ); FilePrintf(hFile,"\t\r\n"); diff --git a/Tactical/XML_EnemyWeaponChoice.cpp b/Tactical/XML_EnemyWeaponChoice.cpp index 8068ac1f..e2257493 100644 --- a/Tactical/XML_EnemyWeaponChoice.cpp +++ b/Tactical/XML_EnemyWeaponChoice.cpp @@ -416,7 +416,7 @@ extendedarmygunchoicesEndElementHandle(void *userData, const XML_Char *name) -BOOLEAN ReadInExtendedArmyGunChoicesStats(STR fileName) +BOOLEAN ReadInExtendedArmyGunChoicesStats(ARMY_GUN_CHOICE_TYPE* pGunChoice, STR fileName) { HWFILE hFile; UINT32 uiBytesRead; @@ -453,7 +453,7 @@ BOOLEAN ReadInExtendedArmyGunChoicesStats(STR fileName) memset(&pData,0,sizeof(pData)); - pData.curArray = gExtendedArmyGunChoices; + pData.curArray = pGunChoice; pData.maxArraySize = ARMY_GUN_LEVELS; XML_SetUserData(parser, &pData); @@ -499,9 +499,9 @@ BOOLEAN WriteExtendedArmyGunChoicesStats() FilePrintf(hFile,"\t\r\n"); FilePrintf(hFile,"\t\t%d\r\n", cnt ); - FilePrintf(hFile,"\t\t%d\r\n", gExtendedArmyGunChoices[cnt].ubChoices ); + FilePrintf(hFile,"\t\t%d\r\n", gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][cnt].ubChoices ); for (int i=0;i<50;i++) - FilePrintf(hFile,"\t\t%d\r\n",i+1,gExtendedArmyGunChoices[cnt].bItemNo[i],i+1 ); + FilePrintf(hFile,"\t\t%d\r\n",i+1,gExtendedArmyGunChoices[SOLDIER_CLASS_NONE][cnt].bItemNo[i],i+1 ); FilePrintf(hFile,"\t\r\n");