rott/kf_sources/ScrnBalanceSrv/Classes/ScrnGUIBuyWeaponInfoPanel.uc
2026-07-14 20:27:09 +07:00

892 lines
33 KiB
Ucode

class ScrnGUIBuyWeaponInfoPanel extends SRGUIBuyWeaponInfoPanel;
var automated GUIImage ScrnLogo, TourneyLogo;
var localized string strSecondsPerShot, StrReloadsInDPM, strMeters;
var automated GUILabel lblDamage, lblDPS, lblDPM, lblRange, lblMag, lblAmmo;
var automated ScrnGUIWeaponBar barDamage, barDPS, barDPM, barRange, barMag, barAmmo;
var automated moCheckBox ch_FireMode0, ch_FireMode1;
//adds headshot damage display toggle checkbox
var automated moCheckBox ch_HSDmgCheck;
var bool bHSDamage;
var int TopDamage, TopDPM, TopMag, TopAmmo;
var float TopDPS, TopRange, TopRadius;
var GUIBuyable LastBuyable;
function InitComponent(GUIController MyController, GUIComponent MyOwner)
{
super.InitComponent(MyController, MyOwner);
ch_FireMode0.Checked(true);
}
function ResetValues()
{
TopDamage = 0;
TopDPM = 0;
TopMag = 0;
TopAmmo = 0;
TopDPS = 0;
TopRange = 0;
TopRadius = 0;
}
function float GetBarPct(float Value, float MaxValue)
{
if ( Value == 0 || MaxValue == 0 )
return 0.f;
if ( Value ~= MaxValue )
return 1.0;
return Sqrt(Value) / Sqrt(MaxValue);
}
function LoadStats(GUIBuyable NewBuyable, byte FireMode, optional bool bSetTopValuesOnly, optional bool bHSDamage)
{
local KFPlayerReplicationInfo KFPRI;
local class<KFVeterancyTypes> Perk;
local class<ScrnVeterancyTypes> ScrnPerk;
local class<WeaponFire> WF;
local class<InstantFire> IFClass;
local class<BaseProjectileFire> ProjFireClass;
local class<Projectile> ProjClass;
local class<KFMeleeFire> MeeleeFireClass;
local class<DamageType> DamType;
local class<KFWeaponDamageType> KFDamType;
local int BaseDmg, PerkedValue, Mult, PerkedValueHS;
local float FireTime, ReloadTime, dmg, range, ammo, MagTime;
local float PerkBonus;
local float HSMult, OldHSMult; //headshot multiplier
local String s;
local int MagCapacity, MagCount, TotalAmmo;
// reset values
if ( !bSetTopValuesOnly ) {
barDamage.Value = 0;
barDPS.Value = 0;
barDPM.Value = 0;
barRange.Value = 0;
barMag.Value = 0;
barAmmo.Value = 0;
}
if ( NewBuyable == none )
return;
if ( NewBuyable.ItemWeaponClass == none )
return; // todo - show armor %
WF = NewBuyable.ItemWeaponClass.default.FireModeClass[FireMode];
if ( WF == none || WF == class'KFMod.NoFire' )
return;
KFPRI = KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo);
if ( KFPRI != none ) {
Perk = KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo).ClientVeteranSkill;
ScrnPerk = class<ScrnVeterancyTypes>(Perk);
}
// magazine
if ( FireMode == 0 ) {
MagCapacity = NewBuyable.ItemWeaponClass.default.MagCapacity;
if ( MagCapacity > 1 ) {
// vanilla perks require weapon instance to be passed (not the class),
// so bonuses can be shown only for ScrN perks
if ( ScrnPerk != none )
PerkedValue = MagCapacity * ScrnPerk.Static.GetMagCapacityModStatic(KFPRI, NewBuyable.ItemWeaponClass);
else
PerkedValue = MagCapacity;
TopMag = max(TopMag, PerkedValue);
if ( !bSetTopValuesOnly ) {
barMag.High = TopMag;
barMag.Value = PerkedValue;
S = string(PerkedValue);
barMag.SetHighlight(PerkedValue > MagCapacity);
if ( PerkedValue != MagCapacity ) {
if ( PerkedValue > MagCapacity )
S @= "("$string(MagCapacity)$"+"$string(PerkedValue-MagCapacity)$")";
else
S @= "("$string(MagCapacity)$string(PerkedValue-MagCapacity)$")";
}
barMag.Caption = S;
}
MagCapacity = PerkedValue;
//reload
ReloadTime = NewBuyable.ItemWeaponClass.default.ReloadRate;
if ( ScrnPerk != none ) {
PerkBonus = ScrnPerk.Static.GetReloadSpeedModifierStatic(KFPRI, NewBuyable.ItemWeaponClass);
ReloadTime /= PerkBonus;
barDPM.SetHighlight(PerkBonus > 1.0001);
}
else {
barDPM.SetHighlight(false);
}
if ( NewBuyable.ItemWeaponClass.default.bHoldToReload )
ReloadTime *= MagCapacity; // per-bullet reload
}
else {
ReloadTime = 0.000001;
barDPM.SetHighlight(false);
}
}
// total ammo
TotalAmmo = 0;
if ( WF.default.AmmoClass != none ) {
TotalAmmo = WF.default.AmmoClass.default.MaxAmmo;
if ( Perk != none )
PerkedValue = TotalAmmo * Perk.Static.AddExtraAmmoFor(KFPRI, WF.default.AmmoClass);
else
PerkedValue = TotalAmmo;
TopAmmo = max(TopAmmo, PerkedValue);
if ( !bSetTopValuesOnly ) {
barAmmo.Value = barAmmo.High * GetBarPct(PerkedValue, TopAmmo);
S = string(PerkedValue);
barAmmo.SetHighlight(PerkedValue > TotalAmmo);
if ( PerkedValue != TotalAmmo ) {
if ( PerkedValue > TotalAmmo )
S @= "("$string(TotalAmmo)$"+"$string(PerkedValue-TotalAmmo)$")";
else
S @= "("$string(TotalAmmo)$string(PerkedValue-TotalAmmo)$")";
}
barAmmo.Caption = S;
}
TotalAmmo = PerkedValue;
}
IFClass = class<InstantFire>(WF);
ProjFireClass = class<BaseProjectileFire>(WF);
ProjClass = WF.default.ProjectileClass;
MeeleeFireClass = class<KFMeleeFire>(WF);
// damage
if ( IFClass != none ) {
BaseDmg = IFClass.default.DamageMax;
DamType = IFClass.default.DamageType;
KFDamType = class<KFWeaponDamageType>(DamType);
HSMult = KFDamType.default.HeadShotDamageMult; //this works for all hitscan weapons
Mult = WF.default.AmmoPerFire;
//set HSMult to 0 if DamType can't do headshots
if (KFDamType.default.bCheckForHeadShots == false)
HSMult = 0;
}
//projectile
else if ( ProjFireClass != none && ProjClass != none ) {
BaseDmg = ProjClass.default.Damage;
DamType = ProjClass.default.MyDamageType;
KFDamType = class<KFWeaponDamageType>(DamType);
DamType = ProjClass.default.MyDamageType;
if (bHSDamage)
{
//current implementation works with projectiles extended from base classes
//unknown projectiles may be handled with if(int(ProjClass.GetPropertyText("HeadShotDamageMult"))>0)
//first, set HSMult to 0 so if projectile headshot mult isn't detected there won't be a stupid value displayed
HSMult = 0;
//a ton of things extend shotgunbullet so handle it first and set it again later
//handle shotgun projectiles
if ( class<ShotgunBullet>(ProjClass) != none )
HSMult = KFDamType.default.HeadShotDamageMult;; //usually 1.1x
//The Shotguns actually do 1.65x because of two multipliers, handle them seperately like this
// prevent other non-shotgun shotgunbullets from getting 1.65x (Mainly Horzine Tech Cryo dart weapons)
if ( class<ScrnCustomShotgunBullet>(ProjClass) != none )
HSMult = class<ScrnCustomShotgunBullet>(ProjClass).default.HeadShotDamageMult * KFDamType.default.HeadShotDamageMult; //1.1 * 1.5 = 1.65
//quick hack to stop flamethrower from displaying 1.1x headshot damage
if ( class<FlameTendril>(ProjClass) != none )
HSMult = 0;
//handle Trenchgun projectiles
if ( class<TrenchgunBullet>(ProjClass) != none )
HSMult = class<TrenchgunBullet>(ProjClass).default.HeadShotDamageMult * KFDamType.default.HeadShotDamageMult;
//handle buzzsaw bow and derived projectiles
if ( class<CrossBuzzsawBlade>(ProjClass) != none )
HSMult = class<CrossBuzzsawBlade>(ProjClass).default.HeadShotDamageMult;
//handle m99 and derived projectiles
if ( class<M99Bullet>(ProjClass) != none )
HSMult = class<M99Bullet>(ProjClass).default.HeadShotDamageMult;
//handle CrossbowArrow and derived projectiles
if ( class<CrossbowArrow>(ProjClass) != none )
HSMult = class<CrossbowArrow>(ProjClass).default.HeadShotDamageMult;
//handle M79 projectiles (HS multiplier is in impact damage type)
if ( class<M79GrenadeProjectile>(ProjClass) != none )
{
BaseDmg = class<M79GrenadeProjectile>(ProjClass).default.ImpactDamage;
DamType = class<M79GrenadeProjectile>(ProjClass).default.ImpactDamageType;
HSMult = Class<KFWeaponDamageType>(DamType).default.HeadShotDamageMult;
}
//handle SP grenade projectiles (HS multiplier is in impact damage type)
if ( class<SPGrenadeProjectile>(ProjClass) != none )
{
BaseDmg = class<SPGrenadeProjectile>(ProjClass).default.ImpactDamage;
DamType = class<SPGrenadeProjectile>(ProjClass).default.ImpactDamageType;
HSMult = Class<KFWeaponDamageType>(DamType).default.HeadShotDamageMult;
}
//handle LAW projectiles, but ignore classes that don't use it's impact damage (ZED Guns)
if ( class<LAWProj>(ProjClass) != none && class<ZEDGunProjectile>(ProjClass) == none && class<ZEDMKIIPrimaryProjectile>(ProjClass) == none
&& class<ZEDMKIISecondaryProjectile>(ProjClass) == none )
{
BaseDmg = class<LAWProj>(ProjClass).default.ImpactDamage;
DamType = class<LAWProj>(ProjClass).default.ImpactDamageType;
HSMult = Class<KFWeaponDamageType>(DamType).default.HeadShotDamageMult;
}
//handle the ZED gun projectiles (Uses HS Damage in Damtype)
else if ( class<ZEDGunProjectile>(ProjClass) != none || class<ZEDMKIIPrimaryProjectile>(ProjClass) != none
|| class<ZEDMKIISecondaryProjectile>(ProjClass) != none )
{
BaseDmg = class<LAWProj>(ProjClass).default.Damage;
DamType = class<LAWProj>(ProjClass).default.MyDamageType;
HSMult = Class<KFWeaponDamageType>(DamType).default.HeadShotDamageMult;
}
//now recast DamType as a KFDamType and check if projclass's MyDamageType does not check for headshots (fix cryo thrower)
KFDamType = class<KFWeaponDamageType>(DamType);
if (KFDamType.default.bCheckForHeadShots == false)
HSMult = 0;
}
Mult = WF.default.AmmoPerFire * ProjFireClass.default.ProjPerFire;
range = ProjClass.default.DamageRadius;
TopRadius = max(TopRadius, range);
if ( !bSetTopValuesOnly ) {
barRange.Value = barRange.High * range/TopRadius;
barRange.Caption = string(range/50) @ strMeters;
}
}
//melee
else if ( MeeleeFireClass != none ) {
BaseDmg = MeeleeFireClass.default.MeleeDamage;
DamType = MeeleeFireClass.default.hitDamageClass;
KFDamType = class<KFWeaponDamageType>(DamType);
HSMult = KFDamType.default.HeadShotDamageMult;
Mult = 1;
range = MeeleeFireClass.default.weaponRange;
TopRange = max(TopRange, range);
if ( !bSetTopValuesOnly ) {
barRange.Value = barRange.High * range/TopRange;
barRange.Caption = string(range/50) @ strMeters;
}
}
KFDamType = class<KFWeaponDamageType>(DamType);
if ( KFDamType != none && KFDamType.default.bDealBurningDamage && class<DamTypeMAC10MPInc>(KFDamType) == none )
BaseDmg *= 1.5; // stupid fire damage multiplier in KFMonster.TakeDamage()
//handles old non headshot calculations
if (!bHSDamage)
{
if ( BaseDmg > 0 && Perk != none )
PerkedValue = Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, DamType);
else
PerkedValue = BaseDmg;
//calculation for flares and huskguns
if ( class<FlareRevolverProjectile>(ProjClass) != none || class<HuskGunProjectile>(ProjClass) != none ) {
dmg = class<LAWProj>(ProjClass).default.ImpactDamage; //impact damage
//base dmg is burn damage (vanilla base 25)
//get bonus burn damage
BaseDmg = class<LAWProj>(ProjClass).default.Damage;
if ( Perk != none )
{
BaseDmg += Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, class<LAWProj>(ProjClass).default.MyDamageType); //attempt to fix wrong value
BaseDmg *= 0.92; //correction for some unknown reason
}
PerkedValue = BaseDmg+dmg; //damage is burn damage + impact damage
BaseDmg = dmg; //change base dmg to impact damage for display purposes
}
if ( Mult == 1 ) {
s = string(PerkedValue);
}
else {
s = Mult $ "x" $ PerkedValue @ "=" @ PerkedValue*Mult;
PerkedValue *= Mult;
BaseDmg *= Mult;
}
}
//calculate headshot damage
if (bHSDamage )
{
//handle hitscan weapons
//get perk boosted damage value
if ( BaseDmg > 0 && Perk != none )
PerkedValue = Perk.static.AddDamage(KFPRI, none, KFPawn(PlayerOwner().Pawn), BaseDmg, DamType);
else
PerkedValue = BaseDmg;
//get headshot damage
OldHSMult = HSMult; //store HSMult
HSMult *= Perk.static.GetHeadShotDamMulti(KFPRI, KFPawn(PlayerOwner().Pawn), DamType); //get perk boosted HS multiplier
//OldPerkedValue = PerkedValue; //store old perked value
PerkedValueHS = PerkedValue * HSMult; //hopefully this affects hitscan stuff only
if ( Mult == 1 ) {
s = string(PerkedValueHS);
}
else {
//s = Mult $ "x" $ PerkedValueHS @ "=" @ PerkedValueHS*Mult; //all ints
s = Mult $ "x("$PerkedValue@"*"@HSMult@") ="@PerkedValueHS*Mult; //all ints
PerkedValue *= Mult;
BaseDmg *= Mult;
}
}
TopDamage = max(TopDamage, PerkedValue);
//sets numbers in info box
if ( !bSetTopValuesOnly ) {
barDamage.Value = barDamage.High * GetBarPct(PerkedValue, TopDamage);
//handle setting highlight
if (!bHSDamage)
{
barDamage.SetHighlight(PerkedValue > BaseDmg);
}
else
{
barDamage.SetHighlight(HSMult > OldHSMult || (PerkedValue > BaseDmg));
}
if (!bHSDamage && BaseDmg > 0 && Mult == 1)
{
if ( PerkedValue != BaseDmg ) {
if ( PerkedValue > BaseDmg )
S @= "("$string(BaseDmg)$"+"$string(PerkedValue-BaseDmg)$")";
else
S @= "("$string(BaseDmg)$string(PerkedValue-BaseDmg)$")";
}
barDamage.Caption = S;
}
else if (HSMult > 0 && BaseDmg > 0 && Mult == 1)
{
//this is the headshots string display, PerkedDamage is the headshot damage
if ( PerkedValue > BaseDmg )
S @= "("$string(BaseDmg)$"+"$string(PerkedValue-BaseDmg)$")*"$string(HSMult)$"";
else
S @= "("$string(BaseDmg)$")*"$string(HSMult)$"";
}
if (bHSDamage && HSMult == 0 )
{
S @= "(No headshot damage)";
}
barDamage.Caption = S;
}
BaseDmg = PerkedValue;
if (!bHSDamage)
{
//do nothing
}
else
{
BaseDmg = PerkedValueHS; //use headshot damage
}
if ( BaseDmg > 0 ) {
// DPS
FireTime = WF.default.FireRate;
if ( ScrnPerk != none ) {
PerkBonus = ScrnPerk.Static.GetFireSpeedModStatic(KFPRI, NewBuyable.ItemWeaponClass);
FireTime /= PerkBonus;
barDPS.SetHighlight(PerkBonus > 1.0001);
}
else {
barDPS.SetHighlight(false);
}
dmg = BaseDmg / FireTime;
if ( MagCapacity > 1 )
dmg = fmin(dmg, BaseDmg * float(MagCapacity) / WF.default.AmmoPerFire); // in cases when magazine can be shot faster than 1s
TopDPS = max(TopDPS, dmg);
if ( !bSetTopValuesOnly ) {
barDPS.Value = barDPS.High * GetBarPct(dmg, TopDPS);
barDPS.Caption = int(dmg) $ "," @ FireTime $ strSecondsPerShot;
}
// DPM
MagCount = 0;
if ( MagCapacity <= 1 ) {
// no reload = no problem
ammo = 60.0 / FireTime;
}
else {
// how long does it takes to shot whole magazine?
MagTime = MagCapacity * FireTime / WF.default.AmmoPerFire;
if ( MagTime >= 60.0 )
ammo = 60.0 / FireTime; // insane magazine that requires > minute to reload
else if ( MagTime + ReloadTime >= 60.0 )
ammo = MagCapacity;
else {
MagCount = 60.0 / (MagTime + ReloadTime); // how many full magazines we can shoot in a minute?
if ( TotalAmmo > 0 )
MagCount = min(MagCount, ceil(float(TotalAmmo) / MagCapacity));
ammo = MagCount * MagCapacity;
// how meany bullets we can shoot from last reloaded magazine?
ammo += (60.0 - MagCount*(MagTime + ReloadTime)) / FireTime;
}
}
if ( TotalAmmo > 0 )
ammo = min(TotalAmmo / WF.default.AmmoPerFire, ammo);
dmg = ammo * BaseDmg;
TopDPM = max(TopDPM, dmg);
if ( !bSetTopValuesOnly ) {
if ( MagCount == 0 )
barDPM.SetHighLight(false);
barDPM.Value = barDPS.High * GetBarPct(dmg, TopDPM);
S = string(dmg/1000.0) $ "K";
if ( MagCount > 0 )
S $= Repl(StrReloadsInDPM, "%r", MagCount);
barDPM.Caption = S;
}
}
else if ( !bSetTopValuesOnly ) {
barDPS.Value = 0;
barDPM.Value = 0;
}
}
function Display(GUIBuyable NewBuyable)
{
local ScrnCustomPRI ScrnPRI;
// just in case
b_power.SetVisibility(false);
b_speed.SetVisibility(false);
b_range.SetVisibility(false);
ItemPower.SetVisibility(false);
ItemRange.SetVisibility(false);
ItemSpeed.SetVisibility(false);
LastBuyable = NewBuyable;
if ( NewBuyable != none ) {
ItemName.Caption = NewBuyable.ItemName;
ItemImage.Image = NewBuyable.ItemImage;
ItemImage.SetVisibility(true);
ScrnLogo.SetVisibility(false);
TourneyLogo.SetVisibility(false);
WeightLabel.Caption = Repl(Weight, "%i", int(NewBuyable.ItemWeight));
if ( NewBuyable.bSaleList && !KFPawn(PlayerOwner().Pawn).CanCarry(NewBuyable.ItemWeight) ) {
WeightLabel.TextColor.R=192;
WeightLabel.TextColor.G=32;
WeightLabel.TextColor.B=32;
}
else {
WeightLabel.TextColor.R=175;
WeightLabel.TextColor.G=176;
WeightLabel.TextColor.B=158;
}
FavoriteButton.SetVisibility(NewBuyable.bSaleList);
bFavorited = (NewBuyable.ItemPickupClass!=None && Class'SRClientSettings'.Static.IsFavorite( NewBuyable.ItemPickupClass ));
RefreshFavoriteButton();
OldPickupClass = NewBuyable.ItemPickupClass;
ch_FireMode0.SetVisibility(true);
ch_FireMode1.SetVisibility(true);
LoadStats(NewBuyable, byte(ch_FireMode1.IsChecked()), false, bHSDamage);
barDamage.SetVisibility(barDamage.Value > 0);
lblDamage.SetVisibility(barDamage.bVisible);
barDPS.SetVisibility(barDPS.Value > 0);
lblDPS.SetVisibility(barDPS.bVisible);
barDPM.SetVisibility(barDPM.Value > 0);
lblDPM.SetVisibility(barDPM.bVisible);
barRange.SetVisibility(barRange.Value > 0);
lblRange.SetVisibility(barRange.bVisible);
barMag.SetVisibility(barMag.Value > 0);
lblMag.SetVisibility(barMag.bVisible);
barAmmo.SetVisibility(barAmmo.Value > 0);
lblAmmo.SetVisibility(barAmmo.bVisible);
}
else {
ScrnPRI = class'ScrnCustomPRI'.static.FindMe(PlayerOwner().PlayerReplicationInfo);
if ( ScrnPRI != none && ScrnPRI.IsTourneyMember() ) {
ItemName.Caption = "Trophy Shop";
TourneyLogo.SetVisibility(true);
ScrnLogo.SetVisibility(false);
}
else {
ItemName.Caption = "ScrN Shop";
ScrnLogo.SetVisibility(true);
TourneyLogo.SetVisibility(false);
}
ItemImage.SetVisibility(false);
FavoriteButton.SetVisibility(false);
FavoriteButton.SetVisibility(false);
WeightLabel.Caption = "";
ch_FireMode0.SetVisibility(false);
ch_FireMode1.SetVisibility(false);
ch_HSDmgCheck.SetVisibility(false);
lblDamage.SetVisibility(false);
barDamage.SetVisibility(false);
lblDPS.SetVisibility(false);
barDPS.SetVisibility(false);
lblDPM.SetVisibility(false);
barDPM.SetVisibility(false);
lblRange.SetVisibility(false);
barRange.SetVisibility(false);
lblMag.SetVisibility(false);
barMag.SetVisibility(false);
lblAmmo.SetVisibility(false);
barAmmo.SetVisibility(false);
}
}
function FireModeChange(GUIComponent Sender)
{
if ( ch_FireMode1.IsChecked() == ch_FireMode0.IsChecked() ) {
if ( Sender == ch_FireMode0 )
ch_FireMode1.Checked(!ch_FireMode0.IsChecked());
else if ( Sender == ch_FireMode1 )
ch_FireMode0.Checked(!ch_FireMode1.IsChecked());
if ( ScrnTab_BuyMenu(MenuOwner) != none )
Display(ScrnTab_BuyMenu(MenuOwner).TheBuyable);
else
Display(LastBuyable);
}
}
function HSDamageToggle(GUIComponent Sender)
{
bHSDamage = ch_HSDmgCheck.IsChecked();
if ( ScrnTab_BuyMenu(MenuOwner) != none )
Display(ScrnTab_BuyMenu(MenuOwner).TheBuyable);
else
Display(LastBuyable);
}
defaultproperties
{
Begin Object Class=GUIImage Name=iLogo
Image=Texture'ScrnTex.HUD.ScrNBalanceLogo256'
ImageColor=(A=64)
ImageStyle=ISTY_Scaled
WinTop=0.150000
WinLeft=0.150000
WinWidth=0.700000
WinHeight=0.850000
RenderWeight=1.000000
bBoundToParent=True
bScaleToParent=True
End Object
ScrnLogo=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.iLogo'
Begin Object Class=GUIImage Name=TSCLogo
Image=Texture'ScrnTex.Tourney.TourneyMember'
ImageStyle=ISTY_Scaled
WinTop=0.150000
WinLeft=0.150000
WinWidth=0.700000
WinHeight=0.850000
RenderWeight=2.000000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
TourneyLogo=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.TSCLogo'
strSecondsPerShot="s/shot"
StrReloadsInDPM=", incl. %r reloads"
strMeters="meters"
Begin Object Class=GUILabel Name=DamageCap
Caption="Damage:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Weapon actual damage, including perk bonus"
WinTop=0.580000
WinLeft=0.050000
WinWidth=0.250000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblDamage=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DamageCap'
Begin Object Class=GUILabel Name=DPSCap
Caption="per second:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Damage per second"
WinTop=0.650000
WinLeft=0.070000
WinWidth=0.230000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblDPS=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPSCap'
Begin Object Class=GUILabel Name=DPMCap
Caption="per minute:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Damage per minute, including reloads"
WinTop=0.720000
WinLeft=0.070000
WinWidth=0.230000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblDPM=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPMCap'
Begin Object Class=GUILabel Name=RangeCap
Caption="Range:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Weapon range (for melee weapons) or blast radius (for explosives and fire)"
WinTop=0.790000
WinLeft=0.050000
WinWidth=0.250000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblRange=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.RangeCap'
Begin Object Class=GUILabel Name=MagCap
Caption="Magazine:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Ammo count in magazine"
WinTop=0.860000
WinLeft=0.050000
WinWidth=0.250000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblMag=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.MagCap'
Begin Object Class=GUILabel Name=AmmoCap
Caption="Total Ammo:"
TextColor=(B=158,G=176,R=175)
TextFont="UT2SmallFont"
VertAlign=TXTA_Center
Hint="Total amount of ammo that can be carried for this weapon"
WinTop=0.930000
WinLeft=0.050000
WinWidth=0.250000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
End Object
lblAmmo=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.AmmoCap'
Begin Object Class=ScrnGUIWeaponBar Name=DamageBar
BorderSize=3.000000
Hint="Weapon damage"
WinTop=0.580000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=DamageBar.InternalOnRendered
End Object
barDamage=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DamageBar'
Begin Object Class=ScrnGUIWeaponBar Name=DPSBar
BorderSize=3.000000
Hint="Damage per second or magazine (if able to shoot whole magazine"
WinTop=0.650000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=DPSBar.InternalOnRendered
End Object
barDPS=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPSBar'
Begin Object Class=ScrnGUIWeaponBar Name=DPMBar
BorderSize=3.000000
Hint="Damage per minute, including reloads"
WinTop=0.720000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=DPMBar.InternalOnRendered
End Object
barDPM=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.DPMBar'
Begin Object Class=ScrnGUIWeaponBar Name=RangeBar
BorderSize=3.000000
Hint="Weapon range (for melee weapons) or blast radius (for explosives and fire)"
WinTop=0.790000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=RangeBar.InternalOnRendered
End Object
barRange=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.RangeBar'
Begin Object Class=ScrnGUIWeaponBar Name=MagBar
BorderSize=3.000000
Hint="Ammo count in magazine"
WinTop=0.860000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=MagBar.InternalOnRendered
End Object
barMag=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.MagBar'
Begin Object Class=ScrnGUIWeaponBar Name=AmmoBar
BorderSize=3.000000
Hint="Total amount of ammo that can be carried for this weapon"
WinTop=0.930000
WinLeft=0.300000
WinWidth=0.650000
WinHeight=0.055000
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnRendered=AmmoBar.InternalOnRendered
End Object
barAmmo=ScrnGUIWeaponBar'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.AmmoBar'
Begin Object Class=moCheckBox Name=Mode0Check
CaptionWidth=0.950000
Caption="Primary Fire"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=Mode0Check.InternalOnCreateComponent
IniOption="@Internal"
Hint="Show primary fire stats"
WinTop=0.500000
WinLeft=0.050000
WinWidth=0.400000
RenderWeight=3.000000
TabOrder=0
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnChange=ScrnGUIBuyWeaponInfoPanel.FireModeChange
End Object
ch_FireMode0=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.Mode0Check'
Begin Object Class=moCheckBox Name=Mode1Check
bFlipped=True
CaptionWidth=0.950000
Caption="Secondary Fire"
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=Mode1Check.InternalOnCreateComponent
IniOption="@Internal"
Hint="Show secondary (alternate) fire stats"
WinTop=0.500000
WinLeft=0.500000
WinWidth=0.400000
RenderWeight=3.000000
TabOrder=1
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnChange=ScrnGUIBuyWeaponInfoPanel.FireModeChange
End Object
ch_FireMode1=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.Mode1Check'
Begin Object Class=moCheckBox Name=HSDmgCheck
bFlipped=True
CaptionWidth=0.950000
ComponentClassName="ScrnBalanceSrv.ScrnGUICheckBoxButton"
OnCreateComponent=Mode1Check.InternalOnCreateComponent
IniOption="@Internal"
Hint="Toggle headshot damage display"
WinTop=0.580000
WinLeft=0.250000
WinWidth=0.400000
RenderWeight=3.000000
TabOrder=2
bBoundToParent=True
bScaleToParent=True
bVisible=False
OnChange=ScrnGUIBuyWeaponInfoPanel.HSDamageToggle
End Object
ch_HSDmgCheck=moCheckBox'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.HSDmgCheck'
Begin Object Class=GUILabel Name=LWeight
TextAlign=TXTA_Right
TextColor=(B=158,G=176,R=175)
TextFont="UT2LargeFont"
WinTop=0.110000
WinLeft=0.050000
WinWidth=0.900000
WinHeight=0.100000
RenderWeight=3.000000
bBoundToParent=True
bScaleToParent=True
bNeverFocus=True
End Object
WeightLabel=GUILabel'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.LWeight'
Begin Object Class=GUIImage Name=IImage
ImageStyle=ISTY_Justified
WinTop=0.090000
WinLeft=0.200000
WinWidth=0.600000
WinHeight=0.574359
RenderWeight=2.000000
bBoundToParent=True
bScaleToParent=True
End Object
ItemImage=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.IImage'
Begin Object Class=GUIImage Name=LWeightBG
WinWidth=0.000000
bVisible=False
End Object
WeightLabelBG=GUIImage'ScrnBalanceSrv.ScrnGUIBuyWeaponInfoPanel.LWeightBG'
Weight="%i blocks"
}