From 082d9838a5c3c7025a59f5a6a79ffe1fde2f318e Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Tue, 11 Jan 2022 17:52:06 +0000 Subject: [PATCH] When taking/dropping corpse as object, use object's ubWireNetworkFlag and sRepairThreshold variables to store palette and camo status of corpse, instead of hardcoded flags. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9240 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Rotting Corpses.cpp | 148 ++++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 56 deletions(-) diff --git a/Tactical/Rotting Corpses.cpp b/Tactical/Rotting Corpses.cpp index d91b6ef09..26f476ec8 100644 --- a/Tactical/Rotting Corpses.cpp +++ b/Tactical/Rotting Corpses.cpp @@ -2171,6 +2171,16 @@ BOOLEAN TakeCorpse( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel ) GetPaletteRepIndexFromID(pCorpse->def.VestPal, &vestpal); GetPaletteRepIndexFromID(pCorpse->def.PantsPal, &pantspal); + // sevenfm: reuse object data to store non-standard palette values + UINT32 uiFlag = 0; + uiFlag += (headpal & 0xff); + uiFlag += (skinpal & 0xff) << 8; + uiFlag += (vestpal & 0xff) << 16; + uiFlag += (pantspal & 0xff) << 24; + gTempObject[0]->data.ubWireNetworkFlag = uiFlag; + // sevenfm: store palette flags + gTempObject[0]->data.sRepairThreshold = pCorpse->def.usFlags & (ROTTING_CORPSE_USE_STEALTH_PALETTE | ROTTING_CORPSE_USE_CAMO_PALETTE | ROTTING_CORPSE_USE_URBAN_CAMO_PALETTE | ROTTING_CORPSE_USE_DESERT_CAMO_PALETTE | ROTTING_CORPSE_USE_SNOW_CAMO_PALETTE); + switch ( headpal ) { case 0: @@ -2335,67 +2345,93 @@ BOOLEAN AddCorpseFromObject(OBJECTTYPE* pObj, INT32 sGridNo, INT8 bLevel ) Corpse.sHeightAdjustment = 0; - // check the objects flagmask and set the corpse palette IDs accordingly + UINT32 uiFlag = (*pObj)[0]->data.ubWireNetworkFlag; + INT16 sCamoFlag = (*pObj)[0]->data.sRepairThreshold; - // Hair - if ( (*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BROWN ) - SET_PALETTEREP_ID( Corpse.HeadPal, "BROWNHEAD" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BLACK ) - SET_PALETTEREP_ID( Corpse.HeadPal, "BLACKHEAD" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_WHITE ) - SET_PALETTEREP_ID( Corpse.HeadPal, "WHITEHEAD" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BLOND ) - SET_PALETTEREP_ID( Corpse.HeadPal, "BLONDHEAD" ); - else - SET_PALETTEREP_ID( Corpse.HeadPal, "REDHEAD" ); + if (uiFlag > 0) + { + // sevenfm: set values directly from stored IDs + UINT8 headpal = (uiFlag & 0xff); + UINT8 skinpal = ((uiFlag >> 8) & 0xff); + UINT8 vestpal = ((uiFlag >> 16) & 0xff); + UINT8 pantspal = ((uiFlag >> 24) & 0xff); - // Skin - if ( (*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_PINK ) - SET_PALETTEREP_ID( Corpse.SkinPal, "PINKSKIN" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_TAN ) - SET_PALETTEREP_ID( Corpse.SkinPal, "TANSKIN" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_DARK ) - SET_PALETTEREP_ID( Corpse.SkinPal, "DARKSKIN" ); - else - SET_PALETTEREP_ID( Corpse.SkinPal, "BLACKSKIN" ); + SET_PALETTEREP_ID(Corpse.HeadPal, gpPalRep[headpal].ID); + SET_PALETTEREP_ID(Corpse.SkinPal, gpPalRep[skinpal].ID); + SET_PALETTEREP_ID(Corpse.VestPal, gpPalRep[vestpal].ID); + SET_PALETTEREP_ID(Corpse.PantsPal, gpPalRep[pantspal].ID); - // Vest - if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BROWN ) - SET_PALETTEREP_ID( Corpse.VestPal, "BROWNVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_grey ) - SET_PALETTEREP_ID( Corpse.VestPal, "greyVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_GREEN ) - SET_PALETTEREP_ID( Corpse.VestPal, "GREENVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_JEAN ) - SET_PALETTEREP_ID( Corpse.VestPal, "JEANVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_RED ) - SET_PALETTEREP_ID( Corpse.VestPal, "REDVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BLUE ) - SET_PALETTEREP_ID( Corpse.VestPal, "BLUEVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_YELLOW ) - SET_PALETTEREP_ID( Corpse.VestPal, "YELLOWVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_WHITE ) - SET_PALETTEREP_ID( Corpse.VestPal, "WHITEVEST" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BLACK ) - SET_PALETTEREP_ID( Corpse.VestPal, "BLACKSHIRT" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_VEST_GYELLOW ) - SET_PALETTEREP_ID( Corpse.VestPal, "GYELLOWSHIRT" ); + // also restore camo status + if (sCamoFlag > 0) + { + Corpse.usFlags |= sCamoFlag; + } + } else - SET_PALETTEREP_ID( Corpse.VestPal, "PURPLESHIRT" ); + { + // sevenfm: use default way for standard palette + // check the objects flagmask and set the corpse palette IDs accordingly - // Pants - if ( (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_GREEN ) - SET_PALETTEREP_ID( Corpse.PantsPal, "GREENPANTS" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_JEAN ) - SET_PALETTEREP_ID( Corpse.PantsPal, "JEANPANTS" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_TAN ) - SET_PALETTEREP_ID( Corpse.PantsPal, "TANPANTS" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_BLACK ) - SET_PALETTEREP_ID( Corpse.PantsPal, "BLACKPANTS" ); - else if ( (*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_BLUE ) - SET_PALETTEREP_ID( Corpse.PantsPal, "BLUEPANTS" ); - else - SET_PALETTEREP_ID( Corpse.PantsPal, "BEIGEPANTS" ); + // Hair + if ((*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BROWN) + SET_PALETTEREP_ID(Corpse.HeadPal, "BROWNHEAD"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BLACK) + SET_PALETTEREP_ID(Corpse.HeadPal, "BLACKHEAD"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_WHITE) + SET_PALETTEREP_ID(Corpse.HeadPal, "WHITEHEAD"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_HAIR_BLOND) + SET_PALETTEREP_ID(Corpse.HeadPal, "BLONDHEAD"); + else + SET_PALETTEREP_ID(Corpse.HeadPal, "REDHEAD"); + + // Skin + if ((*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_PINK) + SET_PALETTEREP_ID(Corpse.SkinPal, "PINKSKIN"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_TAN) + SET_PALETTEREP_ID(Corpse.SkinPal, "TANSKIN"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_SKIN_DARK) + SET_PALETTEREP_ID(Corpse.SkinPal, "DARKSKIN"); + else + SET_PALETTEREP_ID(Corpse.SkinPal, "BLACKSKIN"); + + // Vest + if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BROWN) + SET_PALETTEREP_ID(Corpse.VestPal, "BROWNVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_grey) + SET_PALETTEREP_ID(Corpse.VestPal, "greyVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_GREEN) + SET_PALETTEREP_ID(Corpse.VestPal, "GREENVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_JEAN) + SET_PALETTEREP_ID(Corpse.VestPal, "JEANVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_RED) + SET_PALETTEREP_ID(Corpse.VestPal, "REDVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BLUE) + SET_PALETTEREP_ID(Corpse.VestPal, "BLUEVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_YELLOW) + SET_PALETTEREP_ID(Corpse.VestPal, "YELLOWVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_WHITE) + SET_PALETTEREP_ID(Corpse.VestPal, "WHITEVEST"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_BLACK) + SET_PALETTEREP_ID(Corpse.VestPal, "BLACKSHIRT"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_VEST_GYELLOW) + SET_PALETTEREP_ID(Corpse.VestPal, "GYELLOWSHIRT"); + else + SET_PALETTEREP_ID(Corpse.VestPal, "PURPLESHIRT"); + + // Pants + if ((*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_GREEN) + SET_PALETTEREP_ID(Corpse.PantsPal, "GREENPANTS"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_JEAN) + SET_PALETTEREP_ID(Corpse.PantsPal, "JEANPANTS"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_TAN) + SET_PALETTEREP_ID(Corpse.PantsPal, "TANPANTS"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_BLACK) + SET_PALETTEREP_ID(Corpse.PantsPal, "BLACKPANTS"); + else if ((*pObj)[0]->data.sObjectFlag & CORPSE_PANTS_BLUE) + SET_PALETTEREP_ID(Corpse.PantsPal, "BLUEPANTS"); + else + SET_PALETTEREP_ID(Corpse.PantsPal, "BEIGEPANTS"); + } Corpse.ubDirection = NORTH; Corpse.uiTimeOfDeath = GetWorldTotalMin();