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

225 lines
6.7 KiB
Ucode

class ScrnAchievementEarnedMsg extends CriticalEventPlus
abstract;
var(Message) localized string EarnedString, InProgressString;
var texture BackGround;
var texture ProgressBarBackground;
var texture ProgressBarForeground;
var byte Align; // 0 - left, 1 - center, 2 - right
static function string GetString(
optional int Switch,
optional PlayerReplicationInfo RelatedPRI_1,
optional PlayerReplicationInfo RelatedPRI_2,
optional Object OptionalObject
)
{
local ScrnAchievements AchHandler;
local int AchIndex;
if ( !default.bComplexString ) {
AchHandler = ScrnAchievements(OptionalObject);
AchIndex = Switch;
if ( AchHandler == none || !AchHandler.IsUnlocked(AchIndex) )
return "";
return default.EarnedString $ ": " $ AchHandler.AchDefs[AchIndex].DisplayName;
}
return "";
}
static function RenderComplexMessage(
Canvas C,
out float XL,
out float YL,
optional String MessageString,
optional int Switch,
optional PlayerReplicationInfo RelatedPRI_1,
optional PlayerReplicationInfo RelatedPRI_2,
optional Object OptionalObject // must be ScrnAchievementInfo
)
{
local float X,Y, MaxWidth, MaxHeight, TextX, TextY, IconY;
local ScrnPlayerController P;
local ScrnAchievements AchHandler;
local int AchIndex;
local bool bUnlocked;
local float TextWidth, TextHeight;
local float OrgX, ClipX; //dunno if it should be restored, but just in case
local byte Style;
local float BarHeight, BarWidth, BarTop, BarLeft;
local int CurProg, MaxProg;
// don't draw a message if it is fully transparent
if ( c.DrawColor.A < 10 )
return;
// log("RenderComplexMessage: "
// @ "RelatedPRI_1="$RelatedPRI_1
// @ "OptionalObject="$OptionalObject
// , 'ScrnBalance');
if ( RelatedPRI_1 != none )
P = ScrnPlayerController(RelatedPRI_1.Owner);
AchHandler = ScrnAchievements(OptionalObject);
AchIndex = Switch;
if ( P == none || AchHandler == none || AchHandler.AchDefs[AchIndex].CurrentProgress <= 0 )
return;
CurProg = AchHandler.AchDefs[AchIndex].CurrentProgress;
MaxProg = AchHandler.AchDefs[AchIndex].MaxProgress;
bUnlocked = CurProg >= MaxProg;
ClipX = c.ClipX;
OrgX = c.OrgX;
Style = C.Style;
//test max width
C.Font = P.myHUD.LoadFontStatic(6);
C.StrLen( AchHandler.AchDefs[AchIndex].DisplayName, TextWidth, TextHeight);
MaxWidth = max(256, TextWidth + 104);
MaxHeight = 120;
BarHeight = 16;
if ( !bUnlocked )
MaxHeight += BarHeight;
//X = C.CurX;
switch ( default.Align ) {
case 0: X = C.OrgX; break;
case 1: X = (c.ClipX - C.OrgX - MaxWidth)/2; break;
default: X = c.ClipX - MaxWidth;
}
Y = C.ClipY - MaxHeight;
//background
C.SetPos(X, Y);
C.DrawTileStretched(default.BackGround, MaxWidth, MaxHeight);
c.OrgX = X;
c.ClipX = MaxWidth - 8;
// achievement earnied title
if ( bUnlocked )
MessageString = default.EarnedString;
else
MessageString = default.InProgressString;
C.Font = P.myHUD.LoadFontStatic(7);
C.SetDrawColor(127, 127, 127, c.DrawColor.A);
C.StrLen(MessageString, TextWidth, TextHeight);
C.SetPos((MaxWidth - TextWidth)/2, Y + 7);
C.DrawTextClipped(MessageString);
// PROGRESS BAR
if ( !bUnlocked ) {
// if not unlocked, draw a progress bar
BarWidth = c.ClipX - 5;
BarLeft = X + 6;
BarTop = c.ClipY - BarHeight - 6;
C.Style = ERenderStyle.STY_Alpha;
C.SetDrawColor(255, 255, 255, c.DrawColor.A);
C.SetPos(BarLeft, BarTop); //seems like DrawTileStretched doesn't use clip and org values
C.DrawTileStretched(default.ProgressBarBackground, BarWidth, BarHeight);
C.SetPos(BarLeft+2, BarTop+2);
C.DrawTileStretched(default.ProgressBarForeground, BarWidth * (float(CurProg) / float(MaxProg)) - 4, BarHeight-4);
C.Style = Style;
MessageString = CurProg$" / "$MaxProg;
C.SetDrawColor(92, 92, 92, c.DrawColor.A);
C.Font = P.myHUD.LoadFontStatic(7);
C.StrLen(MessageString, TextWidth, TextHeight);
C.SetPos((c.ClipX-TextWidth)/2, BarTop + (BarHeight - TextHeight)/2 );
C.DrawTextClipped(MessageString);
}
IconY = Y + 40;
TextX = 88;
TextY = IconY;
// ICON
C.SetDrawColor(255, 255, 255, c.DrawColor.A);
C.Style = ERenderStyle.STY_Alpha;
C.SetPos(16, TextY); //top align with the achievement name
C.DrawIcon(AchHandler.GetIcon(AchIndex), 1.0);
C.Style = Style;
c.OrgX += TextX;
c.ClipX -= TextX;
// achievement name
C.SetPos(0, TextY);
if ( bUnlocked )
C.SetDrawColor(50, 192, 50, c.DrawColor.A);
else
C.SetDrawColor(127, 127, 127, c.DrawColor.A);
C.Font = P.myHUD.LoadFontStatic(6);
C.StrLen(AchHandler.AchDefs[AchIndex].DisplayName, TextWidth, TextHeight);
C.DrawTextClipped(AchHandler.AchDefs[AchIndex].DisplayName);
//description
C.SetDrawColor(192, 192, 192, c.DrawColor.A);
C.SetPos(0, TextY + TextHeight*1.1);
C.Font = P.myHUD.LoadFontStatic(8);
//to do set positions
C.DrawText(AchHandler.AchDefs[AchIndex].Description);
//restore original values
c.OrgX = OrgX;
c.ClipX = ClipX;
C.Style = Style;
}
static function ClientReceive(
PlayerController P,
optional int Switch,
optional PlayerReplicationInfo RelatedPRI_1,
optional PlayerReplicationInfo RelatedPRI_2,
optional Object OptionalObject
)
{
local ScrnHUD hud;
local string s;
s = P.ConsoleCommand("get ini:Engine.Engine.ViewportManager TextureDetailWorld");
default.bComplexString = InStr(s, "Low") == -1;
Super.ClientReceive(P,Switch,RelatedPRI_1,RelatedPRI_2,OptionalObject);
hud = ScrnHUD(P.MyHUD);
if ( hud != none && hud.bCoolHud && !hud.bCoolHudLeftAlign)
default.Align = 0 ; // align left, if hud is in center
else
default.Align = 1 ; // align right
}
defaultproperties
{
EarnedString="Achievement Earned"
InProgressString="Achievement Progress"
Background=Texture'KF_InterfaceArt_tex.Menu.Med_border'
ProgressBarBackground=Texture'KF_InterfaceArt_tex.Menu.Innerborder'
ProgressBarForeground=Texture'InterfaceArt_tex.Menu.progress_bar'
Align=1
bComplexString=True
Lifetime=10
DrawColor=(G=255,R=255)
PosY=0.800000
FontSize=5
}