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

232 lines
6.3 KiB
Ucode

class KFPerkProgressList extends GUIVertList;
// Settings
var() float ItemBorder; // Percent of Width to leave blank inside Item Background
var() float ItemSpacing; // Number of Pixels between Items
var() float ProgressBarHeight; // Percent of Height to make Progress Bar's Height
var() float TextTopOffset; // Percent of Height to off Progress String from top of Progress Bar(typically negative)
// Display
var texture ItemBackground;
var texture ProgressBarBackground;
var texture ProgressBarForeground;
// Strings
var localized string OneThousandSuffix;
var localized string OneMillionSuffix;
var localized string DecimalPoint;
var localized string UnitDelimiter;
// State
var array<string> RequirementString;
var array<string> RequirementProgressString;
var array<float> RequirementProgress;
event InitComponent(GUIController MyController, GUIComponent MyOwner)
{
OnDrawItem = DrawPerk;
Super.InitComponent(MyController, MyOwner);
}
function InitList()
{
if ( bNotify )
{
CheckLinkedObjects(Self);
}
}
function PerkChanged(KFSteamStatsAndAchievements KFStatsAndAchievements, int NewPerkIndex)
{
local int i, Numerator, Denominator;
local float Progress;
if ( !KFStatsAndAchievements.bUsedCheats )
{
// Update the ItemCount and select the first item
ItemCount = KFStatsAndAchievements.GetPerkProgressDetailsCount(NewPerkIndex);
SetIndex(0);
RequirementString.Remove(0, RequirementString.Length);
RequirementProgressString.Remove(0, RequirementProgressString.Length);
RequirementProgress.Remove(0, RequirementProgress.Length);
for ( i = 0; i < ItemCount; i++ )
{
KFStatsAndAchievements.GetPerkProgressDetails(NewPerkIndex, i, Numerator, Denominator, Progress);
RequirementString[RequirementString.Length] = Repl(class'KFGameType'.default.LoadedSkills[NewPerkIndex].default.Requirements[i], "%x", FormatNumber(Denominator));
RequirementProgressString[RequirementProgressString.Length] = FormatNumber(Numerator)$"/"$FormatNumber(Denominator);
RequirementProgress[RequirementProgress.Length] = Progress;
}
}
if ( MyScrollBar != none )
{
MyScrollBar.AlignThumb();
}
}
function DrawPerk(Canvas Canvas, int CurIndex, float X, float Y, float Width, float Height, bool bSelected, bool bPending)
{
local float AspectRatio;
local float BorderSize;
local float TempX, TempY;
local float TempWidth, TempHeight;
local array<string> WrappedArray;
// Calculate the Aspect Ratio(Helps Widescreen)
AspectRatio = Canvas.ClipX / Canvas.ClipY;
// Calc BorderSize so we dont do it 10 times per draw
BorderSize = (3.0 - AspectRatio) * ItemBorder * Width;
// Offset for the Background
TempX = X;
TempY = Y + ItemSpacing / 2.0;
// Initialize the Canvas
Canvas.Style = 1;
Canvas.Font = class'ROHUD'.Static.GetSmallMenuFont(Canvas);
Canvas.SetDrawColor(255, 255, 255, 255);
// Draw Item Background
Canvas.SetPos(TempX, TempY);
Canvas.DrawTileStretched(ItemBackground, Width, Height - ItemSpacing);
// Offset Border
TempX += BorderSize;
TempY += ((3.0 - AspectRatio) * BorderSize) + (TextTopOffset * Height);
// Draw the Requirement string
Canvas.SetDrawColor(192, 192, 192, 255);
Canvas.WrapStringToArray(RequirementString[CurIndex], WrappedArray, Width - BorderSize * 2.0);
Canvas.SetPos(TempX, TempY);
Canvas.DrawText(WrappedArray[0]);
// Draw Second Line of Requirement string(if necessary)
if ( WrappedArray.Length > 1 )
{
Canvas.StrLen(WrappedArray[0], TempWidth, TempHeight);
Canvas.SetPos(TempX, TempY + (TempHeight * 0.8));
Canvas.DrawText(WrappedArray[1]);
}
// Get Width of Requirements Progress String
Canvas.StrLen(RequirementProgressString[CurIndex], TempWidth, TempHeight);
TempX = Width - TempWidth - BorderSize;
TempY = Y + Height - TempHeight;
// Draw the Requirement's Progress String
Canvas.SetPos(X + TempX + 2.0, TempY - 2.0);
Canvas.DrawText(RequirementProgressString[CurIndex]);
// Create gap between Progress Bar and Progress String
TempX -= ItemSpacing;
TempHeight = Y + Height - TempY - (BorderSize / 2.0) - (ItemSpacing / 2.0);
// Draw Progress Bar
Canvas.SetDrawColor(255, 255, 255, 255);
Canvas.SetPos(X + BorderSize, TempY);
Canvas.DrawTileStretched(ProgressBarBackground, TempX - BorderSize, TempHeight);
Canvas.SetPos(X + BorderSize + 3.0, TempY + 3.0);
Canvas.DrawTileStretched(ProgressBarForeground, (TempX - BorderSize - 6.0) * RequirementProgress[CurIndex], TempHeight - 6.0);
}
function string AddCommas(int Value)
{
local string StrValue;
if ( Value < 1000 )
{
return string(Value);
}
else
{
if ( Value >= 1000000 )
{
StrValue = string(Value / 1000000)$UnitDelimiter;
Value = Value % 1000000;
if ( Value < 10000 )
{
StrValue $= "00"$(Value / 1000);
}
else if ( Value < 100000 )
{
StrValue $= "0"$(Value / 1000);
}
else
{
StrValue $= (Value / 1000);
}
StrValue $= UnitDelimiter;
Value = Value % 1000;
}
else
{
StrValue = string(Value / 1000)$UnitDelimiter;
Value = Value % 1000;
}
if ( Value < 10 )
{
StrValue $= "00"$Value;
}
else if ( Value < 100 )
{
StrValue $= "0"$Value;
}
else
{
StrValue $= Value;
}
}
return StrValue;
}
function string FormatNumber(int Value)
{
if ( Value < 100000 )
{
// Anything less than 100,000 needs no formatting
return string(Value);
}
if ( Value < 1000000 )
{
// Anything between 100,000 and 1 million turns into ___K
return string(Value / 1000)$OneThousandSuffix;
}
// Anything over 1 million turns into _._M
return string(Value / 1000000)$DecimalPoint$string(int((Value % 1000000) / 100000))$OneMillionSuffix;
}
function float RequirementHeight(Canvas c)
{
return (MenuOwner.ActualHeight() / 3.0) - 1.0;
}
defaultproperties
{
ItemBorder=0.018
ItemSpacing=0.0
ProgressBarHeight=0.25
TextTopOffset=-0.14
ItemBackground=Texture'KF_InterfaceArt_tex.Menu.Thin_border'
ProgressBarBackground=Texture'KF_InterfaceArt_tex.Menu.Innerborder'
ProgressBarForeground=Texture'InterfaceArt_tex.Menu.progress_bar'
OneThousandSuffix="K"
OneMillionSuffix="M"
DecimalPoint="."
UnitDelimiter=","
FontScale=FNS_Medium
GetItemHeight=KFPerkProgressList.RequirementHeight
}