Ammo colour in AmmoTypes.xml is now set using <red>/<green>/<blue> tags instead of <fontColour>/<grayed>/<offNormal>/<onNormal>.

For more information, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&th=20659&goto=355255&#msg_355255

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8627 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2018-10-06 17:51:25 +00:00
parent 50d7b679c1
commit 7a49e4921a
8 changed files with 108 additions and 83 deletions
+11 -1
View File
@@ -2141,7 +2141,7 @@ INT32 CreateIconAndTextButton( INT32 Image, const STR16 string, UINT32 uiFont,
}
// Strip off any extraneous bits from button type
BType = Type & ( BUTTON_TYPE_MASK | BUTTON_NEWTOGGLE );
BType = Type & ( BUTTON_TYPE_MASK | BUTTON_NEWTOGGLE | BUTTON_16BPPCOLOURTEXT );
// Is there a QuickButton image in the given image slot?
if(ButtonPictures[Image].vobj == NULL)
@@ -3521,6 +3521,7 @@ void DrawTextOnButton(GUI_BUTTON *b)
SetFontBackground( FONT_MCOLOR_BLACK );
SetFontForeground( (UINT8)b->sForeColor );
sForeColor = b->sForeColor;
if( b->sShadowColor != -1 )
SetFontShadow( (UINT8)b->sShadowColor );
//Override the colors if necessary.
@@ -3534,6 +3535,7 @@ void DrawTextOnButton(GUI_BUTTON *b)
SetFontForeground( (UINT8)b->sForeColorDown );
sForeColor = b->sForeColorDown;
}
if( b->uiFlags & BUTTON_ENABLED && b->Area.uiFlags & MSYS_MOUSE_IN_AREA && b->sShadowColorHilited != -1 )
{
SetFontShadow( (UINT8)b->sShadowColorHilited );
@@ -3542,6 +3544,14 @@ void DrawTextOnButton(GUI_BUTTON *b)
{
SetFontShadow( (UINT8)b->sShadowColorDown );
}
else if ( b->uiFlags & BUTTON_16BPPCOLOURTEXT )
{
SetRGBFontForeground( sForeColor );
if ( b->sShadowColor < 1 )
SetRGBFontShadow( 1 );
}
if( b->uiFlags & BUTTON_CLICKED_ON && b->fShiftText )
{ // Was the button clicked on? if so, move the text slightly for the illusion
// that the text moved into the screen.
+1
View File
@@ -70,6 +70,7 @@
#define BUTTON_NEWTOGGLE 0x00002000
#define BUTTON_FORCE_UNDIRTY 0x00004000 // no matter what happens this buttons does NOT get marked dirty
#define BUTTON_IGNORE_CLICKS 0x00008000 // Ignore any clicks on this button
#define BUTTON_16BPPCOLOURTEXT 0x00010000 // Use 16 bit colours for the text of this button
#define BUTTON_DISABLED_CALLBACK 0x80000000
#define BUTTON_SOUND_NONE 0x00
+11
View File
@@ -241,6 +241,17 @@ void SetRGBFontShadow( UINT32 uiRed, UINT32 uiGreen, UINT32 uiBlue )
}
//end Kris
// Flugente: set 16 bit colour directly
void SetRGBFontForeground( UINT16 usFontForeground16 )
{
FontForeground16 = usFontForeground16;
}
void SetRGBFontShadow( UINT16 usFontShadow16 )
{
FontShadow16 = usFontShadow16;
}
//*****************************************************************************
// ResetFontObjectPalette
//
+4
View File
@@ -118,6 +118,10 @@ void SetRGBFontForeground( UINT32 uiRed, UINT32 uiGreen, UINT32 uiBlue );
void SetRGBFontBackground( UINT32 uiRed, UINT32 uiGreen, UINT32 uiBlue );
void SetRGBFontShadow( UINT32 uiRed, UINT32 uiGreen, UINT32 uiBlue );
// Flugente: set 16 bit colour directly
void SetRGBFontForeground( UINT16 usFontForeground16 );
void SetRGBFontShadow( UINT16 usFontShadow16 );
BOOLEAN ResetFontObjectPalette(INT32 iFont);
UINT16 *SetFontObjectPalette8BPP(INT32 iFont, SGPPaletteEntry *pPal8);
UINT16 *SetFontObjectPalette16BPP(INT32 iFont, UINT16 *pPal16);
+51 -44
View File
@@ -3891,7 +3891,9 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec
if ( pItemShown->usItemClass == IC_GUN && !Item[pObjShown->usItem].rocketlauncher )
{
SetFontForeground ( AmmoTypes[(*pObjShown)[iter]->data.gun.ubGunAmmoType].fontColour );
SetRGBFontForeground( AmmoTypes[( *pObjShown )[iter]->data.gun.ubGunAmmoType].red,
AmmoTypes[( *pObjShown )[iter]->data.gun.ubGunAmmoType].green,
AmmoTypes[( *pObjShown )[iter]->data.gun.ubGunAmmoType].blue );
// HEADROCK HAM 3.4: Get estimate of bullets left.
if ( (gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT) )
@@ -4358,8 +4360,10 @@ void INVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pObjec
UINT16 usMagIndex = Item[usAmmoItem].ubClassIndex;
UINT16 usAmmoMagSize = Magazine[usMagIndex].ubMagSize;
UINT8 usAmmoAmmoType = Magazine[usMagIndex].ubAmmoType;
SetFontForeground ( AmmoTypes[usAmmoAmmoType].fontColour );
SetRGBFontForeground( AmmoTypes[usAmmoAmmoType].red,
AmmoTypes[usAmmoAmmoType].green,
AmmoTypes[usAmmoAmmoType].blue );
// count the total ammo left
UINT16 totalammo = 0;
@@ -4593,9 +4597,11 @@ void MAPINVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pOb
// Set font properties
SetFont( LARGEFONT1 );
// Get color from ammo details
UINT8 ubAmmoColor = AmmoTypes[(*pObject)[0]->data.gun.ubGunAmmoType].fontColour;
SetFontForeground ( ubAmmoColor );
SetRGBFontForeground( AmmoTypes[( *pObject )[0]->data.gun.ubGunAmmoType].red,
AmmoTypes[( *pObject )[0]->data.gun.ubGunAmmoType].green,
AmmoTypes[( *pObject )[0]->data.gun.ubGunAmmoType].blue );
sNewX = sX + 5;
sNewY = ((sY + sHeight) - GetFontHeight( LARGEFONT1 )) - 2;
@@ -4675,9 +4681,11 @@ void MAPINVRenderItem( UINT32 uiBuffer, SOLDIERTYPE * pSoldier, OBJECTTYPE *pOb
// Set font properties
SetFont( LARGEFONT1 );
// Get color from ammo details
UINT8 ubAmmoColor = AmmoTypes[Magazine[Item[ pObject->usItem ].ubClassIndex].ubAmmoType].fontColour;
SetFontForeground ( ubAmmoColor );
SetRGBFontForeground( AmmoTypes[Magazine[Item[pObject->usItem].ubClassIndex].ubAmmoType].red,
AmmoTypes[Magazine[Item[pObject->usItem].ubClassIndex].ubAmmoType].green,
AmmoTypes[Magazine[Item[pObject->usItem].ubClassIndex].ubAmmoType].blue );
sNewX = sX + 5;
sNewY = ((sY + sHeight) - GetFontHeight( LARGEFONT1 )) - 2;
@@ -5281,38 +5289,35 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
}
FilenameForBPP("INTERFACE\\infobox.sti", ubString);
sForeColour = ITEMDESC_AMMO_FORE;
// Flugente: the bullet icon has a very limited colour choice because its a .sti picture. So we change the display, always use the same default picture but use the colour for the text instead
//sForeColour = ITEMDESC_AMMO_FORE;
sForeColour = (INT16)Get16BPPColor( FROMRGB( AmmoTypes[( *gpItemDescObject )[ubStatusIndex]->data.gun.ubGunAmmoType].red,
AmmoTypes[( *gpItemDescObject )[ubStatusIndex]->data.gun.ubGunAmmoType].green,
AmmoTypes[( *gpItemDescObject )[ubStatusIndex]->data.gun.ubGunAmmoType].blue ) );
// silversurfer: This should never happen but some maps may contain items with invalid ammo types and this leads to graphical glitches
// because the game cannot find the right ammo icon in infobox.sti and then uses index 0. Index 0 is the info box itself.
// Better reset ammo type to 0 which is standard ball ammo.
if ( AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed == 0 || AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal == 0 || AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal == 0 )
(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType = 0;
if ( ( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType >= gMAXAMMOTYPES_READ )
( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType = 0;
// fixed pictures
giItemDescAmmoButtonImages = LoadButtonImage( ubString,
4,// AmmoTypes[( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,
1,//AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,
-1,
3,//AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,
-1 );
giItemDescAmmoButton = CreateIconAndTextButton( giItemDescAmmoButtonImages, pStr, BLOCKFONTNARROW,
sForeColour, FONT_MCOLOR_BLACK,
sForeColour, FONT_MCOLOR_BLACK,
TEXT_CJUSTIFIED,
(INT16)( ITEMDESC_AMMO_X ), (INT16)( ITEMDESC_AMMO_Y ), (BUTTON_TOGGLE| BUTTON_16BPPCOLOURTEXT ), MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)ItemDescAmmoCallback );
giItemDescAmmoButtonImages = LoadButtonImage(ubString,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].grayed,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].offNormal,-1,AmmoTypes[(*pObject)[ubStatusIndex]->data.gun.ubGunAmmoType].onNormal,-1 );
if( guiCurrentItemDescriptionScreen == MAP_SCREEN )
{
// in mapscreen, move over a bit
giItemDescAmmoButton = CreateIconAndTextButton( giItemDescAmmoButtonImages, pStr, BLOCKFONTNARROW,
sForeColour, FONT_MCOLOR_BLACK,
sForeColour, FONT_MCOLOR_BLACK,
TEXT_CJUSTIFIED,
(INT16)(ITEMDESC_AMMO_X), (INT16)(ITEMDESC_AMMO_Y), BUTTON_TOGGLE ,MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)ItemDescAmmoCallback );
}
else
{
// not in mapscreen
giItemDescAmmoButton = CreateIconAndTextButton( giItemDescAmmoButtonImages, pStr, BLOCKFONTNARROW,
sForeColour, FONT_MCOLOR_BLACK,
sForeColour, FONT_MCOLOR_BLACK,
TEXT_CJUSTIFIED,
(INT16)(ITEMDESC_AMMO_X), (INT16)(ITEMDESC_AMMO_Y), BUTTON_TOGGLE ,MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, (GUI_CALLBACK)ItemDescAmmoCallback );
}
//if we are being init from the shop keeper screen and this is a dealer item we are getting info from
if( guiTacticalInterfaceFlags & INTERFACE_SHOPKEEP_INTERFACE && pShopKeeperItemDescObject != NULL )
{
@@ -5322,7 +5327,8 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
DisableButton( giItemDescAmmoButton );
SetButtonFastHelpText( giItemDescAmmoButton, L"\0" );
}
else{
else
{
SetButtonFastHelpText( giItemDescAmmoButton, Message[ STR_EJECT_AMMO ] );
//CHRISL: Include the ubStatusIndex in the region information so we know which object in a stack we're looking at
MSYS_SetBtnUserData( giItemDescAmmoButton, 1, ubStatusIndex );
@@ -5333,7 +5339,6 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
SpecifyButtonTextOffsets( giItemDescAmmoButton, (UINT8) usX, (UINT8) usY, TRUE );
gfItemAmmoDown = FALSE;
}
else
{
@@ -5466,7 +5471,6 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
(UINT16)(gMoneyButtonLoc.x + gMoneyButtonOffsets[cnt].x), (UINT16)(gMoneyButtonLoc.y + gMoneyButtonOffsets[cnt].y), BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST,
DEFAULT_MOVE_CALLBACK, BtnMoneyButtonCallback );
MSYS_SetBtnUserData( guiMoneyButtonBtn[cnt], 0, cnt);
}
else
{
@@ -5500,7 +5504,6 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
}
}
// HEADROCK HAM 4: Three UDB tab buttons
if (UsingEDBSystem() > 0)
{
@@ -5606,8 +5609,7 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
}
fInterfacePanelDirty = DIRTYLEVEL2;
gfInItemDescBox = TRUE;
CHECKF( ReloadItemDesc( ) );
@@ -5658,9 +5660,7 @@ BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY,
SetFactTrue( FACT_ATTACHED_ITEM_BEFORE );
gfItemDescHelpTextOffset = TRUE;
}
return( TRUE );
}
@@ -6046,6 +6046,13 @@ void RenderBulletIcon(OBJECTTYPE *pObject, UINT32 ubStatusIndex)
swprintf( pStr, L"%d", (*pObject)[ubStatusIndex]->data.gun.ubGunShotsLeft );
SpecifyButtonText( giItemDescAmmoButton, pStr );
// Flugente: redo the ammo colour, as it might have changed
INT16 sForeColour = (INT16)Get16BPPColor( FROMRGB( AmmoTypes[( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType].red,
AmmoTypes[( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType].green,
AmmoTypes[( *pObject )[ubStatusIndex]->data.gun.ubGunAmmoType].blue ) );
SpecifyButtonUpTextColors( giItemDescAmmoButton, sForeColour, -1 );
}
void ItemDescAmmoCallback(GUI_BUTTON *btn,INT32 reason)
+1
View File
@@ -1692,6 +1692,7 @@ typedef enum
// Flugente: in order not to loop over MAXITEMS items if we only have a few thousand, remember the actual number of items in the xml
extern UINT32 gMAXITEMS_READ;
extern UINT32 gMAXAMMOTYPES_READ;
/* CHRISL: Arrays to track ic group information. These allow us to determine which LBE slots control which pockets and
what LBE class the pockets are.*/
+5 -7
View File
@@ -206,13 +206,11 @@ enum
typedef struct
{
UINT32 uiIndex;
// on interface
UINT8 fontColour;
// in detail screen (interface\infobox.sti)
INT32 grayed;
INT32 offNormal;
INT32 onNormal;
// Flugente: fontColour takes RGB values from a sti library. Why not take RGB values directly?
UINT8 red;
UINT8 green;
UINT8 blue;
// bullet contact with structure
INT32 structureImpactReductionMultiplier;
+24 -31
View File
@@ -9,6 +9,8 @@
#include "XML.h"
#endif
// Flugente: remember how many ammotypes we read
UINT32 gMAXAMMOTYPES_READ = 0;
struct
{
@@ -49,10 +51,9 @@ ammotypeStartElementHandle(void *userData, const XML_Char *name, const XML_Char
}
else if(pData->curElement == ELEMENT &&
(strcmp(name, "uiIndex") == 0 ||
strcmp(name, "fontColour") == 0 ||
strcmp(name, "grayed") == 0 ||
strcmp(name, "offNormal") == 0 ||
strcmp(name, "onNormal") == 0 ||
strcmp(name, "red" ) == 0 ||
strcmp(name, "green" ) == 0 ||
strcmp(name, "blue" ) == 0 ||
strcmp(name, "structureImpactReductionMultiplier") == 0 ||
strcmp(name, "armourImpactReductionMultiplier") == 0 ||
strcmp(name, "afterArmourDamageMultiplier") == 0 ||
@@ -132,31 +133,28 @@ ammotypeEndElementHandle(void *userData, const XML_Char *name)
{
pData->curArray[pData->curAmmoType.uiIndex] = pData->curAmmoType; //write the ammotype into the table
}
gMAXAMMOTYPES_READ = pData->curAmmoType.uiIndex;
}
else if(strcmp(name, "uiIndex") == 0)
{
pData->curElement = ELEMENT;
pData->curAmmoType.uiIndex = (UINT32) strtoul(pData->szCharData, NULL, 0);
}
else if(strcmp(name, "fontColour") == 0)
else if ( strcmp( name, "red" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curAmmoType.fontColour = (UINT8) atol(pData->szCharData);
pData->curAmmoType.red = (UINT8)atol( pData->szCharData );
}
else if(strcmp(name, "grayed") == 0)
else if ( strcmp( name, "green" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curAmmoType.grayed = (INT32) atol(pData->szCharData);
pData->curAmmoType.green = (UINT8)atol( pData->szCharData );
}
else if(strcmp(name, "offNormal") == 0)
else if ( strcmp( name, "blue" ) == 0 )
{
pData->curElement = ELEMENT;
pData->curAmmoType.offNormal = (INT32) atol(pData->szCharData);
}
else if(strcmp(name, "onNormal") == 0)
{
pData->curElement = ELEMENT;
pData->curAmmoType.onNormal = (INT32) atol(pData->szCharData);
pData->curAmmoType.blue = (UINT8)atol( pData->szCharData );
}
else if(strcmp(name, "structureImpactReductionMultiplier") == 0)
{
@@ -382,19 +380,16 @@ BOOLEAN ReadInAmmoTypeStats(STR fileName)
lpcBuffer[uiFSize] = 0; //add a null terminator
FileClose( hFile );
XML_SetElementHandler(parser, ammotypeStartElementHandle, ammotypeEndElementHandle);
XML_SetCharacterDataHandler(parser, ammotypeCharacterDataHandle);
memset(&pData,0,sizeof(pData));
pData.curArray = AmmoTypes;
pData.maxArraySize = MAXITEMS;
XML_SetUserData(parser, &pData);
if(!XML_Parse(parser, lpcBuffer, uiFSize, TRUE))
{
CHAR8 errorBuf[511];
@@ -406,14 +401,16 @@ BOOLEAN ReadInAmmoTypeStats(STR fileName)
return FALSE;
}
MemFree(lpcBuffer);
// entries read were x -> x+1 entries
++gMAXAMMOTYPES_READ;
MemFree(lpcBuffer);
XML_ParserFree(parser);
return( TRUE );
}
BOOLEAN WriteAmmoTypeStats()
{
//DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"writeammotypestats");
@@ -426,19 +423,15 @@ BOOLEAN WriteAmmoTypeStats()
return( FALSE );
{
UINT32 cnt;
FilePrintf(hFile,"<AMMOTYPELIST>\r\n");
for(cnt = 0;cnt < MAXITEMS;cnt++)
for ( UINT32 cnt = 0;cnt < gMAXAMMOTYPES_READ; ++cnt)
{
FilePrintf(hFile,"\t<AMMOTYPE>\r\n");
FilePrintf(hFile,"\t\t<uiIndex>%d</uiIndex>\r\n", cnt );
FilePrintf(hFile,"\t\t<fontColour>%d</fontColour>\r\n", AmmoTypes[cnt].fontColour );
FilePrintf(hFile,"\t\t<grayed>%d</grayed>\r\n", AmmoTypes[cnt].grayed );
FilePrintf(hFile,"\t\t<offNormal>%d</offNormal>\r\n", AmmoTypes[cnt].offNormal );
FilePrintf(hFile,"\t\t<onNormal>%d</onNormal>\r\n", AmmoTypes[cnt].onNormal );
FilePrintf(hFile,"\t\t<red>%d</red>\r\n", AmmoTypes[cnt].red );
FilePrintf(hFile,"\t\t<green>%d</green>\r\n", AmmoTypes[cnt].green );
FilePrintf(hFile,"\t\t<blue>%d</blue>\r\n", AmmoTypes[cnt].blue );
FilePrintf(hFile,"\t\t<structureImpactReductionMultiplier>%d</structureImpactReductionMultiplier>\r\n", AmmoTypes[cnt].structureImpactReductionMultiplier );
FilePrintf(hFile,"\t\t<structureImpactReductionDivisor>%d</structureImpactReductionDivisor>\r\n", AmmoTypes[cnt].structureImpactReductionDivisor );
FilePrintf(hFile,"\t\t<armourImpactReductionMultiplier>%d</armourImpactReductionMultiplier>\r\n", AmmoTypes[cnt].armourImpactReductionMultiplier );