From 8d49e74df457e52771a5f553212a7db3e80659a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Fa=C5=82kowski?= Date: Tue, 3 Oct 2023 14:20:36 +0200 Subject: [PATCH] Face gear render fixes (#232) * Face gear is shaded the same as a face * Render continue button above icons and facegear * Face gear rendered below "hatch" (inactivity overlay) * Consistent naming --- Tactical/Faces.cpp | 586 +++++++++++++++++++++++---------------------- 1 file changed, 305 insertions(+), 281 deletions(-) diff --git a/Tactical/Faces.cpp b/Tactical/Faces.cpp index 059ba8271..a16473532 100644 --- a/Tactical/Faces.cpp +++ b/Tactical/Faces.cpp @@ -62,7 +62,8 @@ void NewEye( FACETYPE *pFace ); void NewMouth( FACETYPE *pFace ); INT32 GetFreeFace(void); void RecountFaces(void); -void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY ); +UINT32 GetFaceShade(SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit); +void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY, UINT32 uiFaceShade); extern BOOLEAN gfInItemPickupMenu; @@ -157,6 +158,32 @@ INT32 InitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags ) } +void SetPalettes(HVOBJECT *hVObject, UINT32 uiIndex) +{ + SGPPaletteEntry Pal[256]; + + // Build a grayscale palette! ( for testing different looks ) + for (UINT32 uiCount = 0; uiCount < 256; uiCount++) + { + Pal[uiCount].peRed = 255; + Pal[uiCount].peGreen = 255; + Pal[uiCount].peBlue = 255; + } + + (*hVObject)->pShades[FLASH_PORTRAIT_NOSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 255, 255, 255, FALSE); + (*hVObject)->pShades[FLASH_PORTRAIT_STARTSHADE] = Create16BPPPaletteShaded(Pal, 255, 255, 255, FALSE); + (*hVObject)->pShades[FLASH_PORTRAIT_ENDSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 250, 25, 25, TRUE); + (*hVObject)->pShades[FLASH_PORTRAIT_DARKSHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 100, 100, 100, TRUE); + (*hVObject)->pShades[FLASH_PORTRAIT_LITESHADE] = Create16BPPPaletteShaded((*hVObject)->pPaletteEntry, 100, 100, 100, FALSE); + + for (UINT32 uiCount = 0; uiCount < 256; uiCount++) + { + Pal[uiCount].peRed = (UINT8)(uiCount % 128) + 128; + Pal[uiCount].peGreen = (UINT8)(uiCount % 128) + 128; + Pal[uiCount].peBlue = (UINT8)(uiCount % 128) + 128; + } + (*hVObject)->pShades[FLASH_PORTRAIT_GRAYSHADE] = Create16BPPPaletteShaded(Pal, 255, 255, 255, FALSE); +} INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitFlags, INT32 iFaceFileID, UINT32 uiBlinkFrequency, UINT32 uiExpressionFrequency ) { @@ -167,7 +194,6 @@ INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitF ETRLEObject ETRLEObject; HVOBJECT hVObject; UINT32 uiCount; - SGPPaletteEntry Pal[256]; if( ( iFaceIndex = GetFreeFace() )==(-1) ) return(-1); @@ -436,33 +462,11 @@ INT32 InternalInitFace( UINT8 usMercProfileID, UINT8 ubSoldierID, UINT32 uiInitF // Set palette - if( GetVideoObject( &hVObject, uiVideoObject ) ) + if (GetVideoObject(&hVObject, uiVideoObject)) { - // Build a grayscale palette! ( for testing different looks ) - for(uiCount=0; uiCount < 256; uiCount++) - { - Pal[uiCount].peRed=255; - Pal[uiCount].peGreen=255; - Pal[uiCount].peBlue=255; - } - - hVObject->pShades[ FLASH_PORTRAIT_NOSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 255, 255, 255, FALSE ); - hVObject->pShades[ FLASH_PORTRAIT_STARTSHADE ] = Create16BPPPaletteShaded( Pal, 255, 255, 255, FALSE ); - hVObject->pShades[ FLASH_PORTRAIT_ENDSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 250, 25, 25, TRUE ); - hVObject->pShades[ FLASH_PORTRAIT_DARKSHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 100, 100, 100, TRUE ); - hVObject->pShades[ FLASH_PORTRAIT_LITESHADE ] = Create16BPPPaletteShaded( hVObject->pPaletteEntry, 100, 100, 100, FALSE ); - - for(uiCount=0; uiCount < 256; uiCount++) - { - Pal[uiCount].peRed=(UINT8)(uiCount%128)+128; - Pal[uiCount].peGreen=(UINT8)(uiCount%128)+128; - Pal[uiCount].peBlue=(UINT8)(uiCount%128)+128; - } - hVObject->pShades[ FLASH_PORTRAIT_GRAYSHADE ] = Create16BPPPaletteShaded( Pal, 255, 255, 255, FALSE ); - + SetPalettes(&hVObject, uiVideoObject); } - // Get FACE height, width if( GetVideoObjectETRLEPropertiesFromIndex( uiVideoObject, &ETRLEObject, 0 ) == FALSE ) { @@ -942,9 +946,13 @@ void BlinkAutoFace( INT32 iFaceIndex ) { pFace = &gFacesData[ iFaceIndex ]; + UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE; + // CHECK IF BUDDY IS DEAD, UNCONSCIOUS, ASLEEP, OR POW! if ( pFace->ubSoldierID != NOBODY ) { + uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE); + if ( ( MercPtrs[ pFace->ubSoldierID ]->stats.bLife < OKLIFE ) || ( MercPtrs[ pFace->ubSoldierID ]->flags.fMercAsleep == TRUE ) || ( MercPtrs[ pFace->ubSoldierID ]->bAssignment == ASSIGNMENT_POW ) ) @@ -1043,8 +1051,7 @@ void BlinkAutoFace( INT32 iFaceIndex ) } - HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY ); - + HandleRenderFaceAdjustments(pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade); } } @@ -1228,7 +1235,15 @@ void MouthAutoFace( INT32 iFaceIndex ) } - HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY ); + UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE; + + // Set shade + if (pFace->ubSoldierID != NOBODY) + { + uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE); + } + + HandleRenderFaceAdjustments( pFace, TRUE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade); } } @@ -1317,32 +1332,38 @@ void HandleTalkingAutoFace( INT32 iFaceIndex ) // Local function - uses these variables because they have already been validated -void SetFaceShade( SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit ) +void SetFaceShade(FACETYPE *pFace, UINT32 uiFaceShade) { // Set to default - SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_NOSHADE ); + SetObjectHandleShade(pFace->uiVideoObject, uiFaceShade); +} - if ( pFace->iVideoOverlay == -1 && !fExternBlit ) +UINT32 GetFaceShade(SOLDIERTYPE *pSoldier, FACETYPE *pFace, BOOLEAN fExternBlit) +{ + if (pFace->iVideoOverlay == -1 && !fExternBlit) { - if ( ( pSoldier->bActionPoints == 0 ) && !( gTacticalStatus.uiFlags & REALTIME ) && (gTacticalStatus.uiFlags & INCOMBAT ) ) + if ((pSoldier->bActionPoints == 0) && !(gTacticalStatus.uiFlags & REALTIME) && (gTacticalStatus.uiFlags & INCOMBAT)) { - SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_LITESHADE ); + return FLASH_PORTRAIT_LITESHADE; } } - if ( pSoldier->stats.bLife < OKLIFE ) + if (pSoldier->stats.bLife < OKLIFE) { - SetObjectHandleShade( pFace->uiVideoObject, FLASH_PORTRAIT_DARKSHADE ); + return FLASH_PORTRAIT_DARKSHADE; } // ATE: Don't shade for damage if blitting extern face... - if ( !fExternBlit ) + if (!fExternBlit) { - if ( pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START ) + if (pSoldier->flags.fFlashPortrait == FLASH_PORTRAIT_START) { - SetObjectHandleShade( pFace->uiVideoObject, pSoldier->bFlashPortraitFrame ); + return pSoldier->bFlashPortraitFrame; } } + + // Set to default + return FLASH_PORTRAIT_NOSHADE; } BOOLEAN RenderAutoFaceFromSoldier( UINT8 ubSoldierID ) @@ -1450,45 +1471,46 @@ void DoRightIcon_legion_GAS_MASK( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 } */ -void GetXYForRightIconPlacement_FaceGera( FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons , UINT32 uIDFaceGear, BOOLEAN isIMP) +void GetXYForRightIconPlacement_FaceGear(FACETYPE *pFace, UINT16 ubIndex, INT16 sFaceX, INT16 sFaceY, INT16 *psX, INT16 *psY, INT8 bNumIcons, UINT32 uiFaceGearIndex, UINT32 uiFaceShade) { INT16 sX, sY; UINT16 usWidth, usHeight; - ETRLEObject *pTrav; - HVOBJECT hVObject; + ETRLEObject *pTrav; + HVOBJECT hVObject = nullptr; // Get height, width of icon... - if (isIMP) - GetVideoObject( &hVObject, zNewFaceGearIMP[uIDFaceGear].uiIndex ); - else - GetVideoObject( &hVObject, zNewFaceGear[uIDFaceGear].uiIndex ); - - pTrav = &(hVObject->pETRLEObject[ ubIndex ] ); - usHeight = pTrav->usHeight; - usWidth = pTrav->usWidth; + if (GetVideoObject(&hVObject, uiFaceGearIndex)) + { + SetPalettes(&hVObject, uiFaceGearIndex); + } - sX = sFaceX + ( usWidth * bNumIcons ); + SetObjectShade(hVObject, uiFaceShade); + + pTrav = &(hVObject->pETRLEObject[ubIndex]); + usHeight = pTrav->usHeight; + usWidth = pTrav->usWidth; + + sX = sFaceX + (usWidth * bNumIcons); sY = sFaceY + pFace->usFaceHeight - usHeight; *psX = sX; *psY = sY; } -void DoRightIcon_FaceGear( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex , UINT32 uIDFaceGear, BOOLEAN isIMP) +void DoRightIcon_FaceGear(UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sFaceY, INT8 bNumIcons, UINT8 sIconIndex, UINT32 uIDFaceGear, BOOLEAN isIMP, UINT32 uiFaceShade) { - INT16 sIconX, sIconY; + INT16 sIconX, sIconY; // Find X, y for placement - if (isIMP) { - GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP); - BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGearIMP[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL ); + GetXYForRightIconPlacement_FaceGear(pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, zNewFaceGearIMP[uIDFaceGear].uiIndex, uiFaceShade); + BltVideoObjectFromIndex(uiRenderBuffer, zNewFaceGearIMP[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL); } else { - GetXYForRightIconPlacement_FaceGera( pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons , uIDFaceGear,isIMP); - BltVideoObjectFromIndex( uiRenderBuffer, zNewFaceGear[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL ); + GetXYForRightIconPlacement_FaceGear(pFace, sIconIndex, sFaceX, sFaceY, &sIconX, &sIconY, bNumIcons, zNewFaceGear[uIDFaceGear].uiIndex, uiFaceShade); + BltVideoObjectFromIndex(uiRenderBuffer, zNewFaceGear[uIDFaceGear].uiIndex, sIconIndex, sIconX, sIconY, VO_BLT_SRCTRANSPARENCY, NULL); } } //---------------------------------------------------------------- @@ -1548,7 +1570,7 @@ void DoRightIcon( UINT32 uiRenderBuffer, FACETYPE *pFace, INT16 sFaceX, INT16 sF } -void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY ) +void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLEAN fUseExternBuffer, UINT32 uiBuffer, INT16 sFaceX, INT16 sFaceY, UINT16 usEyesX, UINT16 usEyesY, UINT32 uiFaceShade) { INT16 sIconX, sIconY; INT16 sIconIndex = -1; @@ -1612,6 +1634,190 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE { pSoldier = MercPtrs[ pFace->ubSoldierID ]; + UINT8 faceProfileId = gMercProfiles[pSoldier->ubProfile].ubFaceIndex; + BOOLEAN isIMP = gMercProfiles[pSoldier->ubProfile].Type == PROFILETYPE_IMP; + + if (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR] && MercPtrs[pFace->ubSoldierID]->stats.bLife > 0 && !(pFace->uiFlags & FACE_BIGFACE)) + { + if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0) + { + uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem; + + if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 1) //back + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP, uiFaceShade); + } + } + + // this section chooses the pictures for gas mask and NV goggles if the ini setting "SHOW_TACTICAL_FACE_GEAR" is TRUE + // and the merc actually wears something to be shown + if (MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem + MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem > 0) + { + // WANNE: Removed the limitation + // silversurfer: don't overwrite icons if they shall be shown! + //if ( !gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] ) + { + uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem; + uiFaceItemTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem; + + uiFaceOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem; + uiFaceTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem; + + // check first face slot + if (uiFaceItemOne != NONE) + { + if (zNewFaceGear[uiFaceOne].Type == 3) + { + uiFaceItemOne = 1; + } + else if (zNewFaceGear[uiFaceOne].Type == 4) + { + uiFaceItemOne = 2; + } + else uiFaceItemOne = 0; + } + + // check second face slot + if (uiFaceItemTwo != NONE) + { + if (zNewFaceGear[uiFaceTwo].Type == 3) + { + uiFaceItemTwo = 21; + } + else if (zNewFaceGear[uiFaceTwo].Type == 4) + { + uiFaceItemTwo = 42; + } + else uiFaceItemTwo = 0; + } + + + // Now select the correct picture. This uses a matrix from uiFaceOneItem and uiFaceTwoItem (simple addition) + // the numbers on the outer border are used if that is the only item worn in that slot + // + // 21 42 63 84 + // face slot 1 \ slot 2 gas mask | NV goggles | sun goggles | extended ear + // 1 gas mask -- 43 64 85 + // 2 NV goggles 23 -- -- 86 + // 3 sun goggles 24 -- -- 87 + // 4 extended ear 25 46 67 -- + // + // this matrix leaves room for expansion + // we only need a few of the matrix' values this time because we only show gas mask or NV goggles pictures + ubFaceItemsCombined = uiFaceItemOne + uiFaceItemTwo; + } + + // WANNE: Removed silversurfers limitation, because it is too complex for the players :) + // silversurfer: we don't want to display icons for gas mask or NV goggles because you can actually see the merc wearing the gear + // in case of gas mask together with NV we display the picture of the item in face slot 1 and the icon of the item + // in face slot 2 (if icons are allowed) + + //Type : 3 - gas mask ; 4 - NV googles + // gas mask only + + if (ubFaceItemsCombined == 1 || ubFaceItemsCombined == 21) + { + if (zNewFaceGear[uiFaceOne].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + else if (zNewFaceGear[uiFaceTwo].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + + // NV goggles only + if (ubFaceItemsCombined == 2 || ubFaceItemsCombined == 42) + { + if (zNewFaceGear[uiFaceOne].Type == 4) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + else if (zNewFaceGear[uiFaceTwo].Type == 4) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + + // NV goggles + gas mask + if (ubFaceItemsCombined == 23) + { + if (zNewFaceGear[uiFaceOne].Type == 4 && zNewFaceGear[uiFaceTwo].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + } + + // gas mask + NV goggles + if (ubFaceItemsCombined == 43) + { + if (zNewFaceGear[uiFaceOne].Type == 3 && zNewFaceGear[uiFaceTwo].Type == 4) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + + // gas mask + extended ear + if (ubFaceItemsCombined == 24 || ubFaceItemsCombined == 64) + { + if (zNewFaceGear[uiFaceOne].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + else if (zNewFaceGear[uiFaceTwo].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + + // gas mask + extended ear + if (ubFaceItemsCombined == 25 || ubFaceItemsCombined == 85) + { + if (zNewFaceGear[uiFaceOne].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + else if (zNewFaceGear[uiFaceTwo].Type == 3) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + + // NV goggles + extended ear + if (ubFaceItemsCombined == 46 || ubFaceItemsCombined == 86) + { + if (zNewFaceGear[uiFaceOne].Type == 4) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP, uiFaceShade); + } + else if (zNewFaceGear[uiFaceTwo].Type == 4) + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP, uiFaceShade); + } + } + } + + if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0) + // dirty hack for IMPs because they don't have pictures for face gear + // && ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 ) + { + uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem; + + if (uiFaceItemOne != NONE) + { + if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 2) //front + { + DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP, uiFaceShade); + } + } + } + + //------------------------------------end of tactical face gear----------------------------- + } + if ( (MercPtrs[pFace->ubSoldierID]->stats.bLife < CONSCIOUSNESS || MercPtrs[pFace->ubSoldierID]->flags.fDeadPanel ) ) { // Blit Closed eyes here! @@ -1707,34 +1913,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE // Blit hatch! BltVideoObjectFromIndex( uiRenderBuffer, guiHATCH, 0, sFaceX, sFaceY, VO_BLT_SRCTRANSPARENCY, NULL ); } - - if ( !pFace->fDisabled && !pFace->fInvalidAnim ) - { - // Render text above here if that's what was asked for - if ( pFace->fDisplayTextOver != FACE_NO_TEXT_OVER ) - { - SetFont( TINYFONT1 ); - SetFontBackground( FONT_MCOLOR_BLACK ); - SetFontForeground( FONT_MCOLOR_WHITE ); - - SetFontDestBuffer( uiRenderBuffer, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); - - VarFindFontCenterCoordinates( sFaceX, sFaceY, pFace->usFaceWidth, pFace->usFaceHeight, TINYFONT1, &sFontX, &sFontY, pFace->zDisplayText ); - - if ( pFace->fDisplayTextOver == FACE_DRAW_TEXT_OVER ) - { - gprintfinvalidate( sFontX, sFontY, pFace->zDisplayText ); - mprintf( sFontX, sFontY, pFace->zDisplayText ); - } - else if ( pFace->fDisplayTextOver == FACE_ERASE_TEXT_OVER ) - { - gprintfRestore( sFontX, sFontY, pFace->zDisplayText ); - pFace->fDisplayTextOver = FACE_NO_TEXT_OVER; - } - - SetFontDestBuffer( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE ); - } - } } // sevenfm: only show for alive soldiers, no face icons for big faces @@ -1760,15 +1938,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE //------------------------------------Legion 2 by jazz-------------------------------- - UINT8 faceProfileId = gMercProfiles[MercPtrs[pFace->ubSoldierID]->ubProfile].ubFaceIndex; - BOOLEAN isIMP = FALSE; - - //IMP - if (gMercProfiles[MercPtrs[pFace->ubSoldierID]->ubProfile].Type == PROFILETYPE_IMP) - { - isIMP = TRUE; - } - // rewritten by silversurfer // this section chooses the icons for face gear if the ini setting "SHOW_TACTICAL_FACE_ICONS" is TRUE // and the merc actually wears something to be shown @@ -1883,187 +2052,6 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE } } - if (gGameSettings.fOptions[TOPTION_SHOW_TACTICAL_FACE_GEAR]) - { - if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0) - { - uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem; - - if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 1) //back - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP); - } - } - - // this section chooses the pictures for gas mask and NV goggles if the ini setting "SHOW_TACTICAL_FACE_GEAR" is TRUE - // and the merc actually wears something to be shown - if (MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem + MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem > 0) - { - // WANNE: Removed the limitation - // silversurfer: don't overwrite icons if they shall be shown! - //if ( !gGameSettings.fOptions[ SHOW_TACTICAL_FACE_ICONS ] ) - { - uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem; - uiFaceItemTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem; - - uiFaceOne = MercPtrs[pFace->ubSoldierID]->inv[HEAD1POS].usItem; - uiFaceTwo = MercPtrs[pFace->ubSoldierID]->inv[HEAD2POS].usItem; - - // check first face slot - if (uiFaceItemOne != NONE) - { - if (zNewFaceGear[uiFaceOne].Type == 3) - { - uiFaceItemOne = 1; - } - else if (zNewFaceGear[uiFaceOne].Type == 4) - { - uiFaceItemOne = 2; - } - else uiFaceItemOne = 0; - } - - // check second face slot - if (uiFaceItemTwo != NONE) - { - if (zNewFaceGear[uiFaceTwo].Type == 3) - { - uiFaceItemTwo = 21; - } - else if (zNewFaceGear[uiFaceTwo].Type == 4) - { - uiFaceItemTwo = 42; - } - else uiFaceItemTwo = 0; - } - - - // Now select the correct picture. This uses a matrix from uiFaceOneItem and uiFaceTwoItem (simple addition) - // the numbers on the outer border are used if that is the only item worn in that slot - // - // 21 42 63 84 - // face slot 1 \ slot 2 gas mask | NV goggles | sun goggles | extended ear - // 1 gas mask -- 43 64 85 - // 2 NV goggles 23 -- -- 86 - // 3 sun goggles 24 -- -- 87 - // 4 extended ear 25 46 67 -- - // - // this matrix leaves room for expansion - // we only need a few of the matrix' values this time because we only show gas mask or NV goggles pictures - ubFaceItemsCombined = uiFaceItemOne + uiFaceItemTwo; - } - - // WANNE: Removed silversurfers limitation, because it is too complex for the players :) - // silversurfer: we don't want to display icons for gas mask or NV goggles because you can actually see the merc wearing the gear - // in case of gas mask together with NV we display the picture of the item in face slot 1 and the icon of the item - // in face slot 2 (if icons are allowed) - - //Type : 3 - gas mask ; 4 - NV googles - // gas mask only - - if (ubFaceItemsCombined == 1 || ubFaceItemsCombined == 21) - { - if (zNewFaceGear[uiFaceOne].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - else if (zNewFaceGear[uiFaceTwo].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - - // NV goggles only - if (ubFaceItemsCombined == 2 || ubFaceItemsCombined == 42) - { - if (zNewFaceGear[uiFaceOne].Type == 4) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - else if (zNewFaceGear[uiFaceTwo].Type == 4) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - - // NV goggles + gas mask - if (ubFaceItemsCombined == 23) - { - if (zNewFaceGear[uiFaceOne].Type == 4 && zNewFaceGear[uiFaceTwo].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - } - - // gas mask + NV goggles - if (ubFaceItemsCombined == 43) - { - if (zNewFaceGear[uiFaceOne].Type == 3 && zNewFaceGear[uiFaceTwo].Type == 4) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - - // gas mask + extended ear - if (ubFaceItemsCombined == 24 || ubFaceItemsCombined == 64) - { - if (zNewFaceGear[uiFaceOne].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - else if (zNewFaceGear[uiFaceTwo].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - - // gas mask + extended ear - if (ubFaceItemsCombined == 25 || ubFaceItemsCombined == 85) - { - if (zNewFaceGear[uiFaceOne].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - else if (zNewFaceGear[uiFaceTwo].Type == 3) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - - // NV goggles + extended ear - if (ubFaceItemsCombined == 46 || ubFaceItemsCombined == 86) - { - if (zNewFaceGear[uiFaceOne].Type == 4) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceOne, isIMP); - } - else if (zNewFaceGear[uiFaceTwo].Type == 4) - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceTwo, isIMP); - } - } - } - - if (MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem > 0) - // dirty hack for IMPs because they don't have pictures for face gear - // && ( MercPtrs[ pFace->ubSoldierID ]->ubProfile < 51 || MercPtrs[ pFace->ubSoldierID ]->ubProfile > 56 ) - { - uiFaceItemOne = MercPtrs[pFace->ubSoldierID]->inv[HELMETPOS].usItem; - - if (uiFaceItemOne != NONE) - { - if (uiFaceItemOne != NONE && zNewFaceGear[uiFaceItemOne].Type == 2) //front - { - DoRightIcon_FaceGear(uiRenderBuffer, pFace, sFaceX, sFaceY, bNumRightIcons_legion, faceProfileId, uiFaceItemOne, isIMP); - } - } - } - - //------------------------------------end of tactical face gear----------------------------- - } - // If blind... if (MercPtrs[pFace->ubSoldierID]->bBlindedCounter > 0) { @@ -2542,6 +2530,37 @@ void HandleRenderFaceAdjustments( FACETYPE *pFace, BOOLEAN fDisplayBuffer, BOOLE } } } + + if (!(pFace->uiFlags & FACE_INACTIVE_HANDLED_ELSEWHERE) || fUseExternBuffer) + { + if (!pFace->fDisabled && !pFace->fInvalidAnim) + { + // Render text above here if that's what was asked for + if (pFace->fDisplayTextOver != FACE_NO_TEXT_OVER) + { + SetFont(TINYFONT1); + SetFontBackground(FONT_MCOLOR_BLACK); + SetFontForeground(FONT_MCOLOR_WHITE); + + SetFontDestBuffer(uiRenderBuffer, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE); + + VarFindFontCenterCoordinates(sFaceX, sFaceY, pFace->usFaceWidth, pFace->usFaceHeight, TINYFONT1, &sFontX, &sFontY, pFace->zDisplayText); + + if (pFace->fDisplayTextOver == FACE_DRAW_TEXT_OVER) + { + gprintfinvalidate(sFontX, sFontY, pFace->zDisplayText); + mprintf(sFontX, sFontY, pFace->zDisplayText); + } + else if (pFace->fDisplayTextOver == FACE_ERASE_TEXT_OVER) + { + gprintfRestore(sFontX, sFontY, pFace->zDisplayText); + pFace->fDisplayTextOver = FACE_NO_TEXT_OVER; + } + + SetFontDestBuffer(FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, FALSE); + } + } + } } else { @@ -2601,10 +2620,13 @@ BOOLEAN RenderAutoFace( INT32 iFaceIndex ) // Check for disabled guy! CHECKF( pFace->fDisabled != TRUE ); + UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE; + // Set shade if ( pFace->ubSoldierID != NOBODY ) { - SetFaceShade( MercPtrs[ pFace->ubSoldierID ], pFace, FALSE ); + uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, FALSE); + SetFaceShade(pFace, uiFaceShade); } // Blit face to save buffer! @@ -2620,7 +2642,7 @@ BOOLEAN RenderAutoFace( INT32 iFaceIndex ) } } - HandleRenderFaceAdjustments( pFace, FALSE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY ); + HandleRenderFaceAdjustments(pFace, FALSE, FALSE, 0, pFace->usFaceX, pFace->usFaceY, pFace->usEyesX, pFace->usEyesY, uiFaceShade); // Restore extern rect if ( pFace->uiAutoRestoreBuffer == guiSAVEBUFFER ) @@ -2664,9 +2686,11 @@ BOOLEAN ExternRenderFace( UINT32 uiBuffer, INT32 iFaceIndex, INT16 sX, INT16 sY // Here, any face can be rendered, even if disabled // Set shade + UINT32 uiFaceShade = FLASH_PORTRAIT_NOSHADE; if ( pFace->ubSoldierID != NOBODY ) { - SetFaceShade( MercPtrs[ pFace->ubSoldierID ], pFace , TRUE ); + uiFaceShade = GetFaceShade(MercPtrs[pFace->ubSoldierID], pFace, TRUE); + SetFaceShade(pFace, uiFaceShade); } // Blit face to save buffer! @@ -2674,7 +2698,7 @@ BOOLEAN ExternRenderFace( UINT32 uiBuffer, INT32 iFaceIndex, INT16 sX, INT16 sY GetFaceRelativeCoordinates( pFace, &usEyesX, &usEyesY, &usMouthX, &usMouthY ); - HandleRenderFaceAdjustments( pFace, FALSE, TRUE, uiBuffer, sX, sY, ( UINT16)( sX + usEyesX ), ( UINT16)( sY + usEyesY ) ); + HandleRenderFaceAdjustments(pFace, FALSE, TRUE, uiBuffer, sX, sY, (UINT16)(sX + usEyesX), ( UINT16)(sY + usEyesY), uiFaceShade); // Restore extern rect if ( uiBuffer == guiSAVEBUFFER )