diff --git a/Laptop/IMP Confirm.cpp b/Laptop/IMP Confirm.cpp index 893d5201..8a4239b3 100644 --- a/Laptop/IMP Confirm.cpp +++ b/Laptop/IMP Confirm.cpp @@ -549,7 +549,7 @@ void GiveItemsToPC( UINT8 ubProfileId ) GiveIMPRandomItems(pProfile,IMP_KNIFING); } - if (PROFILE_HAS_SKILL_TRAIT(pProfile, CAMOUFLAGED)) + if (PROFILE_HAS_SKILL_TRAIT(pProfile, CAMOUFLAGED)) // TODO: Madd - other camouflage types, once we figure out a way to enable more traits { // MakeProfileInvItemAnySlot(pProfile, CAMOUFLAGEKIT, 100, 1); GiveIMPRandomItems(pProfile,IMP_CAMOUFLAGED); diff --git a/Strategic/Strategic Merc Handler.cpp b/Strategic/Strategic Merc Handler.cpp index 8e6c76fa..098cbd98 100644 --- a/Strategic/Strategic Merc Handler.cpp +++ b/Strategic/Strategic Merc Handler.cpp @@ -1048,7 +1048,7 @@ void HourlyCamouflageUpdate( void ) { INT8 bMercID, bLastTeamID; SOLDIERTYPE * pSoldier; - + BOOLEAN camoWoreOff = FALSE; bMercID = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; bLastTeamID = gTacticalStatus.Team[ gbPlayerNum ].bLastID; @@ -1064,16 +1064,49 @@ void HourlyCamouflageUpdate( void ) if (pSoldier->bCamo <= 0) { pSoldier->bCamo = 0; - // Reload palettes.... - if ( pSoldier->bInSector ) - { - CreateSoldierPalettes( pSoldier ); - } - - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_CAMMO_WORN_OFF], pSoldier->name ); - DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 ); + camoWoreOff = TRUE; } } + if( ( pSoldier->urbanCamo > 0) && ( !( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_URBAN) ) ) ) + { + pSoldier->urbanCamo -= 2; + if (pSoldier->urbanCamo <= 0) + { + pSoldier->urbanCamo = 0; + camoWoreOff = TRUE; + } + } + if( ( pSoldier->desertCamo > 0) && ( !( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_DESERT) ) ) ) + { + pSoldier->desertCamo -= 2; + if (pSoldier->desertCamo <= 0) + { + pSoldier->desertCamo = 0; + camoWoreOff = TRUE; + } + } + if( ( pSoldier->snowCamo > 0) && ( !( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_SNOW) ) ) ) + { + pSoldier->snowCamo -= 2; + if (pSoldier->snowCamo <= 0) + { + pSoldier->snowCamo = 0; + camoWoreOff = TRUE; + } + } + + if ( camoWoreOff ) + { + // Reload palettes.... + if ( pSoldier->bInSector ) + { + CreateSoldierPalettes( pSoldier ); + } + + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_CAMMO_WORN_OFF], pSoldier->name ); + DirtyMercPanelInterface( pSoldier, DIRTYLEVEL2 ); + } + // if the merc has non-zero monster smell, degrade it by 1 if ( pSoldier->bMonsterSmell > 0 ) { diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index b6f082d1..a21efac2 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -6811,7 +6811,7 @@ void BltCharInvPanel() mprintf( usX, usY, sString ); // Display camo value - swprintf( sString, L"%3d", max(0, min ((pSoldier->bCamo + pSoldier->wornCamo ),100 )) ); + swprintf( sString, L"%3d", max(0, min ((pSoldier->bCamo + pSoldier->wornCamo + pSoldier->urbanCamo+pSoldier->wornUrbanCamo+pSoldier->desertCamo+pSoldier->wornDesertCamo+pSoldier->snowCamo+pSoldier->wornSnowCamo ),100 )) ); FindFontRightCoordinates(MAP_CAMMO_X, MAP_CAMMO_Y, MAP_PERCENT_WIDTH, MAP_PERCENT_HEIGHT, sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY, sString ); diff --git a/Tactical/Animation Control.cpp b/Tactical/Animation Control.cpp index d2cbc950..b6918964 100644 --- a/Tactical/Animation Control.cpp +++ b/Tactical/Animation Control.cpp @@ -1056,7 +1056,6 @@ ANIMSUBTYPE gDoubleHandledSub = STANDING, RGMDBLBREATH, BGMDBLBREATH, RGMDBLBREATH, RGFDBLBREATH }; - void InitAnimationSurfacesPerBodytype( ) { INT32 cnt1, cnt2; @@ -3209,18 +3208,36 @@ INT8 GetBodyTypePaletteSubstitutionCode( SOLDIERTYPE *pSoldier, UINT8 ubBodyType return( 0 ); } - // Check for cammo... + + // Check for camo... + + //stealth has priority if ( GetWornStealth(pSoldier) >= 50 ) { strcpy( zColFilename, "ANIMS\\stealth.col" ); return( 1 ); } - else if ( ( pSoldier->bCamo + pSoldier->wornCamo ) >= 50 ) + + int urban = pSoldier->urbanCamo + pSoldier->wornUrbanCamo; + int jungle = pSoldier->bCamo + pSoldier->wornCamo; + int desert = pSoldier->desertCamo + pSoldier->wornDesertCamo; + int snow = pSoldier->snowCamo + pSoldier->wornSnowCamo; + int total = urban + jungle + desert + snow; + + // display camo depending on which is higher + if ( total >= 50 ) { - strcpy( zColFilename, "ANIMS\\camo.COL" ); + if ( jungle >= urban && jungle >= desert && jungle >= snow ) + strcpy( zColFilename, "ANIMS\\camo.COL" ); + else if ( urban >= jungle && urban >= desert && urban >= snow ) + strcpy( zColFilename, "ANIMS\\urban.col" ); + else if ( desert >= urban && desert >= jungle && desert >= snow ) + strcpy( zColFilename, "ANIMS\\desert.col" ); + else if ( snow >= urban && snow >= desert && snow >= jungle ) + strcpy( zColFilename, "ANIMS\\snow.col" ); + return( 1 ); } - } return( -1 ); diff --git a/Tactical/Interface Panels.cpp b/Tactical/Interface Panels.cpp index 095ee18c..be47a1e3 100644 --- a/Tactical/Interface Panels.cpp +++ b/Tactical/Interface Panels.cpp @@ -2036,7 +2036,7 @@ void RenderSMPanel( BOOLEAN *pfDirty ) ApplyEquipmentBonuses(gpSMCurrentMerc); // Display cammo value! - swprintf( sString, L"%3d", max(0, min( (gpSMCurrentMerc->bCamo + gpSMCurrentMerc->wornCamo),100 )) ); + swprintf( sString, L"%3d", max(0, min( (gpSMCurrentMerc->bCamo + gpSMCurrentMerc->wornCamo+gpSMCurrentMerc->urbanCamo+gpSMCurrentMerc->wornUrbanCamo+gpSMCurrentMerc->desertCamo+gpSMCurrentMerc->wornDesertCamo+gpSMCurrentMerc->snowCamo+gpSMCurrentMerc->wornSnowCamo),100 )) ); FindFontRightCoordinates(SM_CAMMO_X, SM_CAMMO_Y ,SM_PERCENT_WIDTH ,SM_PERCENT_HEIGHT ,sString, BLOCKFONT2, &usX, &usY); mprintf( usX, usY , sString ); diff --git a/Tactical/Item Types.h b/Tactical/Item Types.h index e1aafee9..0c63eaa4 100644 --- a/Tactical/Item Types.h +++ b/Tactical/Item Types.h @@ -384,6 +384,9 @@ typedef struct INT16 camobonus; INT16 stealthbonus; + INT16 urbanCamobonus; + INT16 desertCamobonus; + INT16 snowCamobonus; UINT16 defaultattachment; } INVTYPE; diff --git a/Tactical/Items.cpp b/Tactical/Items.cpp index 7aee5177..890731b1 100644 --- a/Tactical/Items.cpp +++ b/Tactical/Items.cpp @@ -2177,7 +2177,7 @@ UINT8 CalculateObjectWeight( OBJECTTYPE *pObject ) // Start with base weight usWeight = pItem->ubWeight; - if (pItem->ubPerPocket < 2) + if ( pItem->ubPerPocket < 2 && pItem->usItemClass != IC_AMMO ) { // account for any attachments for ( cnt = 0; cnt < MAX_ATTACHMENTS; cnt++ ) @@ -2191,13 +2191,27 @@ UINT8 CalculateObjectWeight( OBJECTTYPE *pObject ) // add in weight of ammo if (Item[ pObject->usItem ].usItemClass == IC_GUN && pObject->ubGunShotsLeft > 0) { - usWeight += Item[ pObject->usGunAmmoItem ].ubWeight; + usWeight += (INT16)((pObject->ubGunShotsLeft / Magazine[Item[pObject->usGunAmmoItem].ubClassIndex].ubMagSize ) * Item[ pObject->usGunAmmoItem ].ubWeight);//Madd: added weight allowance for ammo not being full } } - + else if ( pItem->usItemClass == IC_AMMO )//Madd: added weight allowance for ammo not being full + { + for ( cnt = 0; cnt < MAX_OBJECTS_PER_SLOT; cnt++ ) + { + if (pObject->ubShotsLeft[cnt] > 0 ) + { + usWeight += (INT16)(pObject->ubShotsLeft[cnt]/Magazine[pItem->usItemClass].ubMagSize) * pItem->ubWeight; + } + } + } + + // make sure it really fits into that UINT8, in case we ever add anything real heavy with attachments/ammo Assert(usWeight <= 255); + if ( usWeight > 255 ) + usWeight = 255; //Madd: limit to 255 to prevent negative weights, at least until we can change the OBJECTTYPE structure + return( (UINT8) usWeight ); } @@ -5556,29 +5570,74 @@ void WaterDamage( SOLDIERTYPE *pSoldier ) } } } + BOOLEAN camoWoreOff = FALSE; if (pSoldier->bCamo > 0 && !HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED ) ) { // reduce camouflage by 2% per tile of deep water // and 1% for medium water if ( pSoldier->bOverTerrainType == DEEP_WATER ) - { pSoldier->bCamo = __max( 0, pSoldier->bCamo - 2 ); - } else - { pSoldier->bCamo = __max( 0, pSoldier->bCamo - 1 ); - } - if ( (pSoldier->bCamo)== 0) - { - // Reload palettes.... - if ( pSoldier->bInSector ) - { - CreateSoldierPalettes( pSoldier ); - } - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_CAMMO_WASHED_OFF], pSoldier->name ); - } + if ( (pSoldier->bCamo)== 0) + camoWoreOff = TRUE; } + + if (pSoldier->urbanCamo > 0 && !HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_URBAN ) ) + { + // reduce camouflage by 2% per tile of deep water + // and 1% for medium water + if ( pSoldier->bOverTerrainType == DEEP_WATER ) + pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 2 ); + else + pSoldier->urbanCamo = __max( 0, pSoldier->urbanCamo - 1 ); + + if ( (pSoldier->urbanCamo)== 0) + camoWoreOff = TRUE; + } + + if (pSoldier->desertCamo > 0 && !HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_DESERT ) ) + { + // reduce camouflage by 2% per tile of deep water + // and 1% for medium water + if ( pSoldier->bOverTerrainType == DEEP_WATER ) + pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 2 ); + else + pSoldier->desertCamo = __max( 0, pSoldier->desertCamo - 1 ); + + if ( (pSoldier->desertCamo)== 0) + camoWoreOff = TRUE; + } + + if (pSoldier->snowCamo > 0 && !HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_SNOW ) ) + { + // reduce camouflage by 2% per tile of deep water + // and 1% for medium water + if ( pSoldier->bOverTerrainType == DEEP_WATER ) + pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 2 ); + else + pSoldier->snowCamo = __max( 0, pSoldier->snowCamo - 1 ); + + if ( (pSoldier->snowCamo)== 0) + camoWoreOff = TRUE; + } + + if ( camoWoreOff ) + { + // Reload palettes.... + if ( pSoldier->bInSector ) + { + CreateSoldierPalettes( pSoldier ); + } + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, Message[STR_CAMMO_WASHED_OFF], pSoldier->name ); + } + + + + + + if ( pSoldier->bTeam == gbPlayerNum && pSoldier->bMonsterSmell > 0 ) { if ( pSoldier->bOverTerrainType == DEEP_WATER ) @@ -5623,7 +5682,14 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP return( FALSE ); } - if ((pSoldier->bCamo + pSoldier->wornCamo ) >= 100) + //get total camo bonus for kit -- note that camo kits now require the camobonus tag to be set + int itemCamo = Item[pObj->usItem].camobonus + Item[pObj->usItem].urbanCamobonus + Item[pObj->usItem].desertCamobonus + Item[pObj->usItem].snowCamobonus; + + if ( itemCamo < 100 ) + usTotalKitPoints = (INT16)((itemCamo / 100) * usTotalKitPoints); + + int totalCamo = pSoldier->bCamo + pSoldier->wornCamo + pSoldier->urbanCamo+pSoldier->wornUrbanCamo+pSoldier->desertCamo+pSoldier->wornDesertCamo+pSoldier->snowCamo+pSoldier->wornSnowCamo; + if ((totalCamo) >= 100) { // nothing more to add return( FALSE ); @@ -5631,9 +5697,19 @@ BOOLEAN ApplyCammo( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAP // points are used up at a rate of 50% kit = 100% cammo on guy // add 1 to round off - bPointsToUse = (100 - (pSoldier->bCamo + pSoldier->wornCamo) + 1 ) / 2; + bPointsToUse = (100 - (totalCamo) + 1 ) / 2; bPointsToUse = __min( bPointsToUse, usTotalKitPoints ); - pSoldier->bCamo = __min( 100, pSoldier->bCamo + bPointsToUse * 2); + + //figure out proportions of each to be applied, one item can theoretically have more than one camouflage type this way + int urban = (int)((Item[pObj->usItem].urbanCamobonus / itemCamo) * bPointsToUse); + int jungle = (int)((Item[pObj->usItem].camobonus / itemCamo) * bPointsToUse); + int desert = (int)((Item[pObj->usItem].desertCamobonus / itemCamo) * bPointsToUse); + int snow = (int)((Item[pObj->usItem].snowCamobonus / itemCamo) * bPointsToUse); + + pSoldier->bCamo = __min( 100, pSoldier->bCamo + jungle * 2); + pSoldier->urbanCamo = __min( 100, pSoldier->urbanCamo + urban * 2); + pSoldier->desertCamo = __min( 100, pSoldier->desertCamo + desert * 2); + pSoldier->snowCamo = __min( 100, pSoldier->snowCamo + snow * 2); UseKitPoints( pObj, bPointsToUse, pSoldier ); diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index 95930150..13774e83 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -1612,7 +1612,20 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE } } - if ( ( pEndSoldier->bCamo + pEndSoldier->wornCamo ) > 0 && !bAware ) + //get the total camouflage + float jungle = (float)(pEndSoldier->bCamo + pEndSoldier->wornCamo); + float urban = (float)(pEndSoldier->urbanCamo + pEndSoldier->wornUrbanCamo); + float desert = (float)(pEndSoldier->desertCamo + pEndSoldier->wornDesertCamo); + float snow = (float)(pEndSoldier->snowCamo + pEndSoldier->wornSnowCamo); + int totalCamo = (int)(jungle + urban + desert + snow); + + //get the percentage of each type + jungle = jungle / totalCamo; + urban = urban / totalCamo; + desert = desert / totalCamo; + snow = snow / totalCamo; + + if ( ( totalCamo ) > 0 && !bAware ) { // reduce effects of camo of 5% per tile moved last turn @@ -1622,25 +1635,40 @@ INT32 SoldierToSoldierLineOfSightTest( SOLDIERTYPE * pStartSoldier, SOLDIERTYPE } else { - bEffectiveCamo = max(0,min(100,(pEndSoldier->bCamo + pEndSoldier->wornCamo))) * (100 - pEndSoldier->bTilesMoved * 5) / 100; + bEffectiveCamo = max(0,min(100,(totalCamo))) * (100 - pEndSoldier->bTilesMoved * 5) / 100; } bEffectiveCamo = __max( bEffectiveCamo, 0 ); if ( gAnimControl[ pEndSoldier->usAnimState ].ubEndHeight < ANIM_STAND ) { + iTemp = ubTileSightLimit; // reduce visibility by up to a third for camouflage! switch( pEndSoldier->bOverTerrainType ) { - case FLAT_GROUND: case LOW_GRASS: - case HIGH_GRASS: - iTemp = ubTileSightLimit; - iTemp -= iTemp * (bEffectiveCamo / 3) / 100; - ubTileSightLimit = (UINT8) iTemp; + case HIGH_GRASS: // jungle camo bonus + iTemp -= iTemp * (int)(jungle * bEffectiveCamo / 3) / 100; + break; + case FLAT_FLOOR: // flat floor = indoors + case PAVED_ROAD: // urban camo bonus + iTemp -= iTemp * (int)(urban * bEffectiveCamo / 3) / 100; + break; + case DIRT_ROAD: // desert camo bonus + case TRAIN_TRACKS: + iTemp -= iTemp * (int)(desert * bEffectiveCamo / 3) / 100; + break; + //case ??? : // snow camo bonus + // iTemp -= iTemp * (snow * bEffectiveCamo / 3) / 100; + // break; + case FLAT_GROUND: + //in this case both desert and jungle can work: + iTemp -= iTemp * (int)(jungle * bEffectiveCamo / 3) / 100; + iTemp -= iTemp * (int)(desert * bEffectiveCamo / 3) / 100; break; default: break; } + ubTileSightLimit = (UINT8) iTemp; } } else diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index 6e22597c..cd09dbb2 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -700,11 +700,26 @@ BOOLEAN CreateCorpsePalette( ROTTING_CORPSE *pCorpse ) { bBodyTypePalette = 0; } - else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_CAMMO_PALETTE ) + else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_CAMO_PALETTE ) { strcpy( zColFilename, "ANIMS\\camo.COL" ); bBodyTypePalette = 1; } + else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_URBAN_CAMO_PALETTE ) + { + strcpy( zColFilename, "ANIMS\\urban.col" ); + bBodyTypePalette = 1; + } + else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_DESERT_CAMO_PALETTE ) + { + strcpy( zColFilename, "ANIMS\\desert.col" ); + bBodyTypePalette = 1; + } + else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_SNOW_CAMO_PALETTE ) + { + strcpy( zColFilename, "ANIMS\\snow.col" ); + bBodyTypePalette = 1; + } else if ( pCorpse->def.usFlags & ROTTING_CORPSE_USE_STEALTH_PALETTE ) { strcpy( zColFilename, "ANIMS\\stealth.col" ); @@ -795,14 +810,29 @@ BOOLEAN TurnSoldierIntoCorpse( SOLDIERTYPE *pSoldier, BOOLEAN fRemoveMerc, BOOLE SET_PALETTEREP_ID ( Corpse.SkinPal, pSoldier->SkinPal ); SET_PALETTEREP_ID ( Corpse.PantsPal, pSoldier->PantsPal ); + int urban = pSoldier->urbanCamo + pSoldier->wornUrbanCamo; + int jungle = pSoldier->bCamo + pSoldier->wornCamo; + int desert = pSoldier->desertCamo + pSoldier->wornDesertCamo; + int snow = pSoldier->snowCamo + pSoldier->wornSnowCamo; + int total = urban + jungle + desert + snow; + if ( GetWornStealth(pSoldier) >= 50 ) { Corpse.usFlags |= ROTTING_CORPSE_USE_STEALTH_PALETTE; } - else if ( pSoldier->bCamo >= 50 ) + else if ( total >= 50 ) { - Corpse.usFlags |= ROTTING_CORPSE_USE_CAMMO_PALETTE; + // display camo depending on which is higher + if ( jungle >= urban && jungle >= desert && jungle >= snow ) + Corpse.usFlags |= ROTTING_CORPSE_USE_CAMO_PALETTE; + else if ( urban >= jungle && urban >= desert && urban >= snow ) + Corpse.usFlags |= ROTTING_CORPSE_USE_URBAN_CAMO_PALETTE; + else if ( desert >= urban && desert >= jungle && desert >= snow ) + Corpse.usFlags |= ROTTING_CORPSE_USE_DESERT_CAMO_PALETTE; + else if ( snow >= urban && snow >= desert && snow >= jungle ) + Corpse.usFlags |= ROTTING_CORPSE_USE_SNOW_CAMO_PALETTE; } + // Determine corpse type! ubType = (UINT8)gubAnimSurfaceCorpseID[ pSoldier->ubBodyType][ pSoldier->usAnimState ]; diff --git a/Tactical/Rotting Corpses.h b/Tactical/Rotting Corpses.h index 5a0fa375..f5c1b5e9 100644 --- a/Tactical/Rotting Corpses.h +++ b/Tactical/Rotting Corpses.h @@ -73,14 +73,17 @@ enum RottingCorpseDefines -#define ROTTING_CORPSE_FIND_SWEETSPOT_FROM_GRIDNO 0x01 //Find the closest spot to the given gridno -#define ROTTING_CORPSE_USE_NORTH_ENTRY_POINT 0x02 //Find the spot closest to the north entry grid -#define ROTTING_CORPSE_USE_SOUTH_ENTRY_POINT 0x04 //Find the spot closest to the south entry grid -#define ROTTING_CORPSE_USE_EAST_ENTRY_POINT 0x08 //Find the spot closest to the east entry grid -#define ROTTING_CORPSE_USE_WEST_ENTRY_POINT 0x10 //Find the spot closest to the west entry grid -#define ROTTING_CORPSE_USE_CAMMO_PALETTE 0x20 //We use cammo palette here.... -#define ROTTING_CORPSE_VEHICLE 0x40 //Vehicle Corpse -#define ROTTING_CORPSE_USE_STEALTH_PALETTE 0x80 //We use stealth palette here.... +#define ROTTING_CORPSE_FIND_SWEETSPOT_FROM_GRIDNO 0x001 //Find the closest spot to the given gridno +#define ROTTING_CORPSE_USE_NORTH_ENTRY_POINT 0x002 //Find the spot closest to the north entry grid +#define ROTTING_CORPSE_USE_SOUTH_ENTRY_POINT 0x004 //Find the spot closest to the south entry grid +#define ROTTING_CORPSE_USE_EAST_ENTRY_POINT 0x008 //Find the spot closest to the east entry grid +#define ROTTING_CORPSE_USE_WEST_ENTRY_POINT 0x010 //Find the spot closest to the west entry grid +#define ROTTING_CORPSE_USE_CAMO_PALETTE 0x020 //We use cammo palette here.... +#define ROTTING_CORPSE_VEHICLE 0x040 //Vehicle Corpse +#define ROTTING_CORPSE_USE_STEALTH_PALETTE 0x080 //We use stealth palette here.... +#define ROTTING_CORPSE_USE_URBAN_CAMO_PALETTE 0x100 //We use urban palette here.... +#define ROTTING_CORPSE_USE_DESERT_CAMO_PALETTE 0x200 //We use desert palette here.... +#define ROTTING_CORPSE_USE_SNOW_CAMO_PALETTE 0x400 //We use snow palette here.... typedef struct { diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index e46fb94d..90d8b4b4 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -943,8 +943,18 @@ typedef struct BOOLEAN lastFlankLeft; INT8 sniper; INT16 origDir; - INT16 wornCamo; - UINT8 bFiller[ 41 ]; + INT8 wornCamo; + + INT8 urbanCamo; // Madd: new camo types + INT8 wornUrbanCamo; + + INT8 desertCamo; + INT8 wornDesertCamo; + + INT8 snowCamo; + INT8 wornSnowCamo; + + UINT8 bFiller[ 36 ]; } SOLDIERTYPE; diff --git a/Tactical/Soldier Create.cpp b/Tactical/Soldier Create.cpp index cce3d9e8..7dfea26d 100644 --- a/Tactical/Soldier Create.cpp +++ b/Tactical/Soldier Create.cpp @@ -457,7 +457,10 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 * if ( i != NO_SLOT && Random( 5 ) < SoldierDifficultyLevel( &Soldier )) { // start camouflaged - Soldier.bCamo = 100; + Soldier.bCamo = Item[i].camobonus; + Soldier.urbanCamo = Item[i].urbanCamobonus; + Soldier.desertCamo = Item[i].desertCamobonus; + Soldier.snowCamo = Item[i].snowCamobonus; } } } @@ -722,6 +725,21 @@ BOOLEAN TacticalCopySoldierFromProfile( SOLDIERTYPE *pSoldier, SOLDIERCREATE_STR // set camouflaged to 100 automatically pSoldier->bCamo = 100; } + if ( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_URBAN ) ) + { + // set camouflaged to 100 automatically + pSoldier->urbanCamo = 100; + } + if ( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_DESERT ) ) + { + // set camouflaged to 100 automatically + pSoldier->desertCamo = 100; + } + if ( HAS_SKILL_TRAIT( pSoldier, CAMOUFLAGED_SNOW ) ) + { + // set camouflaged to 100 automatically + pSoldier->snowCamo = 100; + } return( TRUE ); } diff --git a/Tactical/Soldier Profile.cpp b/Tactical/Soldier Profile.cpp index 35944831..2d727c23 100644 --- a/Tactical/Soldier Profile.cpp +++ b/Tactical/Soldier Profile.cpp @@ -81,6 +81,9 @@ INT8 gbSkillTraitBonus[NUM_SKILLTRAITS] = 30, //KNIFING 15, //ONROOF 0, //CAMOUFLAGED + 0, //CAMOUFLAGED_URBAN + 0, //CAMOUFLAGED_DESERT + 0, //CAMOUFLAGED_SNOW }; diff --git a/Tactical/soldier profile type.h b/Tactical/soldier profile type.h index 51224089..de3a90ca 100644 --- a/Tactical/soldier profile type.h +++ b/Tactical/soldier profile type.h @@ -95,6 +95,9 @@ typedef enum KNIFING, ONROOF, CAMOUFLAGED, + CAMOUFLAGED_URBAN, + CAMOUFLAGED_DESERT, + CAMOUFLAGED_SNOW, NUM_SKILLTRAITS } SkillTrait; diff --git a/TileEngine/TileEngine.vcproj b/TileEngine/TileEngine.vcproj index 57aa7bfb..89f5d6aa 100644 --- a/TileEngine/TileEngine.vcproj +++ b/TileEngine/TileEngine.vcproj @@ -3096,6 +3096,9 @@ + + diff --git a/Utils/XML_Items.cpp b/Utils/XML_Items.cpp index 6ef265ca..68d3de02 100644 --- a/Utils/XML_Items.cpp +++ b/Utils/XML_Items.cpp @@ -197,6 +197,9 @@ itemStartElementHandle(void *userData, const char *name, const char **atts) strcmp(name, "PercentTunnelVision") == 0 || strcmp(name, "DefaultAttachment") == 0 || strcmp(name, "CamoBonus") == 0 || + strcmp(name, "UrbanCamoBonus") == 0 || + strcmp(name, "DesertCamoBonus") == 0 || + strcmp(name, "SnowCamoBonus") == 0 || strcmp(name, "StealthBonus") == 0 || strcmp(name, "fFlags") == 0 )) @@ -525,6 +528,21 @@ itemEndElementHandle(void *userData, const char *name) pData->curElement = ELEMENT; pData->curItem.camobonus = (INT16) atol(pData->szCharData); } + else if(strcmp(name, "DesertCamoBonus") == 0) + { + pData->curElement = ELEMENT; + pData->curItem.desertCamobonus = (INT16) atol(pData->szCharData); + } + else if(strcmp(name, "UrbanCamoBonus") == 0) + { + pData->curElement = ELEMENT; + pData->curItem.urbanCamobonus = (INT16) atol(pData->szCharData); + } + else if(strcmp(name, "SnowCamoBonus") == 0) + { + pData->curElement = ELEMENT; + pData->curItem.snowCamobonus = (INT16) atol(pData->szCharData); + } else if(strcmp(name, "StealthBonus") == 0) { pData->curElement = ELEMENT; @@ -1401,6 +1419,9 @@ BOOLEAN WriteItemStats() FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].rock ); FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].camobonus ); + FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].urbanCamobonus ); + FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].desertCamobonus ); + FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].snowCamobonus ); FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].stealthbonus ); FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].flakjacket ); FilePrintf(hFile,"\t\t%d\r\n", Item[cnt].leatherjacket );