Enhanced Description Box, v1.3. By Headrock

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2414 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
ChrisL
2008-11-13 01:11:59 +00:00
parent 3cd3ef39cb
commit 905ce20125
21 changed files with 10042 additions and 1061 deletions
File diff suppressed because it is too large Load Diff
+27
View File
@@ -0,0 +1,27 @@
#ifndef __INTERFACE_ENHANCED_H
#define __INTERFACE_ENHANCED_H
extern INV_DESC_STATS gMiscItemStatsEDB[];
UINT8 UsingEDBSystem();
void InitItemDescriptionBoxOffsets();
BOOLEAN InternalInitEnhancedDescBox();
void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurrentItemDescriptionScreen );
void DeleteEnhancedDescBox( UINT32 guiCurrentItemDescriptionScreen );
void InitDescStatCoords();
void InitLBECoords();
void InitEDBCoords();
void DrawWeaponStats( OBJECTTYPE * gpItemDescObject );
void DrawAmmoStats( OBJECTTYPE * gpItemDescObject );
void DrawExplosiveStats( OBJECTTYPE * gpItemDescObject );
void DrawArmorStats( OBJECTTYPE * gpItemDescObject );
void DrawMiscStats( OBJECTTYPE * gpItemDescObject );
void DrawWeaponValues( OBJECTTYPE * gpItemDescObject );
void DrawAmmoValues( OBJECTTYPE * gpItemDescObject, int shotsLeft );
void DrawExplosiveValues( OBJECTTYPE * gpItemDescObject );
void DrawArmorValues( OBJECTTYPE * gpItemDescObject );
void DrawMiscValues( OBJECTTYPE * gpItemDescObject );
#endif
File diff suppressed because it is too large Load Diff
+68
View File
@@ -9,6 +9,7 @@
#define BIG_INV_SLOT_HEIGHT 22
#define SM_INV_SLOT_WIDTH 30
#define SM_INV_SLOT_HEIGHT 23
#define MAP_ATTACH_SLOT_WIDTH 32
#define VEST_INV_SLOT_WIDTH 43
#define VEST_INV_SLOT_HEIGHT 24
#define LEGS_INV_SLOT_WIDTH 43
@@ -17,6 +18,72 @@
#define HEAD_INV_SLOT_HEIGHT 24
//CHRISL: moved from Interface Items.cpp
typedef struct
{
INT16 sX;
INT16 sY;
INT16 sValDx;
} INV_DESC_STATS;
typedef struct
{
UINT32 uiTotalAmount;
UINT32 uiMoneyRemaining;
UINT32 uiMoneyRemoving;
} REMOVE_MONEY;
typedef struct
{
UINT16 x;
UINT16 y;
} MoneyLoc;
void ItemDescCallback( MOUSE_REGION * pRegion, INT32 iReason );
#define ITEMDESC_FONT BLOCKFONT2
#define INV_BAR_DX 5
#define INV_BAR_DY 21
#define ITEM_STATS_WIDTH 26
#define ITEM_STATS_HEIGHT 8
#define EXCEPTIONAL_DAMAGE 40
#define EXCEPTIONAL_WEIGHT 20
#define EXCEPTIONAL_RANGE 400
#define EXCEPTIONAL_MAGAZINE 50
#define EXCEPTIONAL_AP_COST 5
#define EXCEPTIONAL_BURST_SIZE 5
#define EXCEPTIONAL_RELIABILITY 2
#define EXCEPTIONAL_REPAIR_EASE 2
#define EXCEPTIONAL_ACCURACY 4
#define ITEMDESC_FONTHIGHLIGHT FONT_MCOLOR_WHITE
#define MAP_ITEMDESC_NAME_X (7 + gsInvDescX)
#define MAP_ITEMDESC_NAME_Y (65 + gsInvDescY)
//CHRISL: extern'd for EDB project
extern INT16 gsInvDescX;
extern INT16 gsInvDescY;
extern INT16 ITEMDESC_CALIBER_X;
extern INT16 ITEMDESC_CALIBER_Y;
extern INT16 BULLET_SING_X;
extern INT16 BULLET_SING_Y;
extern INT16 BULLET_BURST_X;
extern INT16 BULLET_BURST_Y;
extern INT16 MAP_BULLET_SING_X;
extern INT16 MAP_BULLET_SING_Y;
extern INT16 MAP_BULLET_BURST_X;
extern INT16 MAP_BULLET_BURST_Y;
extern INT16 ITEMDESC_DESC_START_X;
extern INT16 ITEMDESC_DESC_START_Y;
extern INT16 ITEMDESC_PROS_START_X;
extern INT16 ITEMDESC_PROS_START_Y;
extern INT16 ITEMDESC_CONS_START_X;
extern INT16 ITEMDESC_CONS_START_Y;
extern INT16 MAP_ITEMDESC_DESC_START_X;
extern INT16 MAP_ITEMDESC_DESC_START_Y;
extern INT16 MAP_ITEMDESC_PROS_START_X;
extern INT16 MAP_ITEMDESC_PROS_START_Y;
extern INT16 MAP_ITEMDESC_CONS_START_X;
extern INT16 MAP_ITEMDESC_CONS_START_Y;
extern INT16 ITEMDESC_DESC_WIDTH;
extern UINT8 gubItemDescStatusIndex;
// A STRUCT USED INTERNALLY FOR INV SLOT REGIONS
typedef struct
@@ -132,6 +199,7 @@ extern BOOLEAN gfInItemDescBox;
BOOLEAN InItemDescriptionBox( );
BOOLEAN InitItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
BOOLEAN InternalInitItemDescriptionBox( OBJECTTYPE *pObject, INT16 sX, INT16 sY, UINT8 ubStatusIndex, SOLDIERTYPE *pSoldier, UINT8 ubPosition = NUM_INV_SLOTS );
void UpdateAttachmentTooltips( OBJECTTYPE *pObject, UINT8 ubStatusIndex );
BOOLEAN InitKeyItemDescriptionBox( SOLDIERTYPE *pSoldier, UINT8 ubPosition, INT16 sX, INT16 sY, UINT8 ubStatusIndex );
void RenderItemDescriptionBox( );
void HandleItemDescriptionBox( BOOLEAN *pfDirty );
+252
View File
@@ -8526,3 +8526,255 @@ INT16 GetWornStealth( SOLDIERTYPE * pSoldier )
return __min( ttl, 100 );
}
/////////////////////////////
// HEADROCK: Several functions created for the Enhanced Description Box project, but may generally be useful some
// day. They calculate item bonuses, ammo bonuses and attachment bonuses, without requiring a SOLDIERTYPE or any
// other variable.
////////////////////////////
// HEADROCK: Function to get the total aim-bonus from the gun and its attachments
INT16 GetFlatAimBonus( OBJECTTYPE * pObj )
{
INT16 bonus = 0;
bonus += Item[pObj->usItem].aimbonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].aimbonus;
}
return( bonus );
}
// HEADROCK: Function to get the final Loudness value of a gun, after ammo and attachment reductions
INT16 GetFinalLoudness( OBJECTTYPE * pObj )
{
INT16 loudness = 0;
INT16 loudnessModifier = 0;
loudness = Weapon[Item[pObj->usItem].ubClassIndex].ubAttackVolume;
loudnessModifier += Item[pObj->usItem].percentnoisereduction;
if ( (*pObj)[0]->data.gun.ubGunShotsLeft > 0 )
loudnessModifier += Item[(*pObj)[0]->data.gun.usGunAmmoItem].percentnoisereduction ;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
loudnessModifier += BonusReduce( Item[iter->usItem].percentnoisereduction, (*iter)[0]->data.objectStatus ) ;
}
loudness = loudness * ( 100 - loudnessModifier ) / 100;
loudness = __max(loudness, 1);
return ( loudness );
}
// HEADROCK: Function to get AP bonus from an item rather than a soldier
INT16 GetAPBonus( OBJECTTYPE * pObj )
{
INT16 bonus=0;
bonus += Item[ pObj->usItem ].APBonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].APBonus;
}
return( bonus );
}
// HEADROCK: Alternative function to determine flat to-hit bonus of weapon
INT16 GetFlatToHitBonus( OBJECTTYPE * pObj )
{
INT16 bonus=0;
bonus = Item[pObj->usItem].tohitbonus;
bonus += Item[(*pObj)[0]->data.gun.usGunAmmoItem].tohitbonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].tohitbonus;
}
return( bonus );
}
// HEADROCK: Function to get average of all "best laser range" attributes from weapon and attachments
INT16 GetAverageBestLaserRange( OBJECTTYPE * pObj )
{
INT16 bonus=0;
INT16 numModifiers=0;
if (Item[pObj->usItem].bestlaserrange > 0)
{
numModifiers++;
bonus += Item[pObj->usItem].bestlaserrange;
}
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
if (Item[iter->usItem].bestlaserrange > 0)
{
numModifiers++;
bonus += Item[iter->usItem].bestlaserrange;
}
}
if (numModifiers>0)
{
bonus = bonus / numModifiers;
}
return( bonus );
}
// HEADROCK: This function determines the bipod bonii of the gun or its attachments
INT16 GetBipodBonus( OBJECTTYPE * pObj )
{
INT16 bonus=0;
bonus = Item[pObj->usItem].bipod;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].bipod;
}
return( bonus );
}
// HEADROCK: Added a function to calculate the vision range bonus of an object and its attachments. Takes an argument which determines what type
// of vision range bonus we want to get:
// 0 - Regular
// 1 - Day
// 2 - Night
// 3 - Bright Light
// 4 - Cave
INT16 GetItemVisionRangeBonus( OBJECTTYPE * pObj, INT16 VisionType )
{
INT16 bonus = 0;
if (VisionType == 0)
{
bonus += Item[ pObj->usItem ].visionrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].visionrangebonus;
}
}
else if (VisionType == 1)
{
bonus += Item[ pObj->usItem ].dayvisionrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].dayvisionrangebonus;
}
}
else if (VisionType == 2)
{
bonus += Item[ pObj->usItem ].nightvisionrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].nightvisionrangebonus;
}
}
else if (VisionType == 3)
{
bonus += Item[ pObj->usItem ].brightlightvisionrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].brightlightvisionrangebonus;
}
}
else if (VisionType == 4)
{
bonus += Item[ pObj->usItem ].cavevisionrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].cavevisionrangebonus;
}
}
return( bonus );
}
// HEADROCK: function to get Tunnel Vision percent from an item and its attachments
UINT8 GetItemPercentTunnelVision( OBJECTTYPE * pObj )
{
UINT8 bonus = 0;
bonus += Item[ pObj->usItem ].percenttunnelvision;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[iter->usItem].percenttunnelvision;
}
bonus = __min(bonus, 100);
return( bonus );
}
// HEADROCK: Function to calculate hearing range bonus without SOLDIERTYPE, from an item and its attachments
INT16 GetItemHearingRangeBonus( OBJECTTYPE * pObj )
{
INT16 bonus = 0;
bonus += Item[ pObj->usItem ].hearingrangebonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter)
{
bonus += Item[ iter->usItem ].hearingrangebonus;
}
return( bonus );
}
// HEADROCK: Flash Suppression Detector function that does not use SOLDIERTYPE.
BOOLEAN IsFlashSuppressorAlt( OBJECTTYPE * pObj )
{
if ( AmmoTypes[(*pObj)[0]->data.gun.ubGunAmmoType].tracerEffect )
return FALSE;
if ( Item[pObj->usItem].hidemuzzleflash )
return TRUE;
if ( Item[(*pObj)[0]->data.gun.usGunAmmoItem].hidemuzzleflash )
return TRUE;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
if (Item[iter->usItem].hidemuzzleflash )
{
return( TRUE );
}
}
return( FALSE );
}
// HEADROCK: Calculate stealth not based on item status
INT16 GetBasicStealthBonus( OBJECTTYPE * pObj )
{
INT16 bonus = 0;
if ( pObj->exists() == true ) {
bonus = Item[pObj->usItem].stealthbonus;
for (attachmentList::iterator iter = (*pObj)[0]->attachments.begin(); iter != (*pObj)[0]->attachments.end(); ++iter) {
bonus += (INT16) Item[iter->usItem].stealthbonus;
}
}
return( bonus );
}
+23
View File
@@ -214,8 +214,18 @@ UINT16 MagazineClassIndexToItemType(UINT16 usMagIndex);
BOOLEAN IsScoped( OBJECTTYPE * pObj );
INT16 GetAimBonus( OBJECTTYPE * pObj, INT32 iRange, INT16 ubAimTime );
// HEADROCK: Function to get the natural aimbonus of the weapon and its attachments
INT16 GetFlatAimBonus( OBJECTTYPE * pObj );
// HEADROCK: Function to get the final loudness value of a weapon, after reduction from its own characteristics, ammo and attachments
INT16 GetFinalLoudness( OBJECTTYPE * pObj );
INT16 GetMinAimBonusRange( OBJECTTYPE * pObj );
INT16 GetToHitBonus( OBJECTTYPE * pObj, INT32 iRange, UINT8 bLightLevel, BOOLEAN fProneStance = FALSE );
// HEADROCK: Added alternate function that only returns the natural to-hit-bonii of a weapon, ammo and attachments
INT16 GetFlatToHitBonus( OBJECTTYPE * pObj );
// HEADROCK: Function to get average of best laser ranges from weapon and attachments
INT16 GetAverageBestLaserRange( OBJECTTYPE * pObj );
// HEADROCK: Function to get bipod bonus from weapon and its attachments
INT16 GetBipodBonus( OBJECTTYPE * pObj );
UINT32 FindRangeBonusAttachment( OBJECTTYPE * pObj );
INT16 GetRangeBonus( OBJECTTYPE * pObj );
INT16 GetBurstToHitBonus( OBJECTTYPE * pObj, BOOLEAN fProneStance = FALSE );
@@ -244,6 +254,11 @@ INT16 GetMagSizeBonus( OBJECTTYPE * pObj );
// GetBrightLightVisionRangeBonus: bLightLevel < NORMAL_LIGHTLEVEL_DAY
// (remember: darker is higher!)
INT16 GetTotalVisionRangeBonus( SOLDIERTYPE * pSoldier, UINT8 bLightLevel );
// HEADROCK: Following function used to get the vision range bonus of an item and its attachments. Second argument controls specific
// vision type.
INT16 GetItemVisionRangeBonus( OBJECTTYPE * pObj, INT16 VisionType );
// HEADROCK: This function calculates percent tunnel vision from an object and its attachments.
UINT8 GetItemPercentTunnelVision( OBJECTTYPE * pObj );
// Snap: Scale night vision bonus with light level
INT16 NightBonusScale( INT16 bonus, UINT8 bLightLevel );
@@ -253,6 +268,8 @@ BOOLEAN HasThermalOptics( SOLDIERTYPE * pSoldier );
INT8 FindHearingAid( SOLDIERTYPE * pSoldier );
INT16 GetHearingRangeBonus( SOLDIERTYPE * pSoldier );
// HEADROCK: This is the same function as above, but calculates hearing range bonus without SOLDIERTYPE, from an item and its attachments
INT16 GetItemHearingRangeBonus( OBJECTTYPE * pObj );
INT8 IsGrenadeLauncher( OBJECTTYPE * pObj );
INT16 GetGrenadeLauncherStatus( OBJECTTYPE * pObj );
@@ -266,6 +283,8 @@ OBJECTTYPE* FindNonSmokeLaunchableAttachment( OBJECTTYPE * pObj, UINT16 usWeapon
UINT16 PickARandomLaunchable(UINT16 itemIndex);
BOOLEAN IsFlashSuppressor( OBJECTTYPE * pObj, SOLDIERTYPE * pSoldier );
// HEADROCK: Declaration of new function to detect flash suppression without SOLDIERTYPE argument
BOOLEAN IsFlashSuppressorAlt( OBJECTTYPE * pObj );
INT16 GetFlashSuppressorStatus( OBJECTTYPE * pObj );
BOOLEAN IsRemoteDetonator( OBJECTTYPE * pObj );
BOOLEAN IsDetonator( OBJECTTYPE * pObj );
@@ -297,12 +316,16 @@ INT16 GetWornCamo( SOLDIERTYPE * pSoldier );
INT16 GetCamoBonus( OBJECTTYPE * pObj );
INT16 GetWornStealth( SOLDIERTYPE * pSoldier );
INT16 GetStealthBonus( OBJECTTYPE * pObj );
// HEADROCK: Non-status-dependent version of the above
INT16 GetBasicStealthBonus( OBJECTTYPE * pObj );
void ApplyEquipmentBonuses(SOLDIERTYPE * pSoldier);
INT16 GetGearAimBonus( SOLDIERTYPE * pSoldier, INT32 iRange, INT16 ubAimTime);
INT16 GetGearToHitBonus( SOLDIERTYPE * pSoldier );
INT16 GetGearAPBonus( SOLDIERTYPE * pSoldier );
// HEADROCK: This function gets total AP bonus for an item and its attachments
INT16 GetAPBonus( OBJECTTYPE * pObj );
UINT16 GetFirstExplosiveOfType(UINT16 expType);
+8
View File
@@ -392,6 +392,10 @@
RelativePath=".\interface Dialogue.h"
>
</File>
<File
RelativePath=".\Interface Enhanced.h"
>
</File>
<File
RelativePath=".\Interface Items.h"
>
@@ -710,6 +714,10 @@
RelativePath=".\Interface Dialogue.cpp"
>
</File>
<File
RelativePath=".\Interface Enhanced.cpp"
>
</File>
<File
RelativePath=".\Interface Items.cpp"
>