1
0
KF2-Dev-Scripts/KFGame/Classes/KFGFxTraderContainer_ItemDetails.uc
2024-01-23 19:25:12 +03:00

379 lines
12 KiB
Ucode

//=============================================================================
// KFGFxTraderContainer_ItemDetails
//=============================================================================
// Class Description
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Author 8/23/2013
//=============================================================================
class KFGFxTraderContainer_ItemDetails extends KFGFxObject_Container
DependsOn(KFGFxObject_TraderItems);
/** The maximum RPM value, used for scaling the stats bar */
var const float MAX_RPM;
/** The maximum number of objects that can be penetrated value, used for scaling the stats bar */
var const float MAX_PENETRATION;
var KFGFxMenu_Trader MyTraderMenu;
var localized string DamageTitle, FireRateTitle, RangeTitle, PenetrationTitle, BlockTitle, ParryTitle;
var localized string AccuracyTitle, CapacityTitle, MagTitle;
var localized string HealAmountTitle, HealRechargeTitle;
var localized string BuyString, SellString, CannotSellString, CannotBuyString;
var localized string FavoriteString, UnfavoriteString;
var localized string UpgradeCostString, UpgradeString;
var GFxObject DetailsContainer;
/** Max stat values used to calculate stat bars */
const WeaponStatMax_Damage = 990.f;
const WeaponStatMax_FireRate = 800.f;
const WeaponStatMax_Penetration = 4.f;
const WeaponStatMax_Range = 100.f;
const WeaponStatMax_Block = 1.f;
const WeaponStatMax_Parry = 10.f;
const WeaponStatMax_HealAmount = 50.f;
const WeaponStatMax_HealRechargeSpeed = 10.f; // charge per second
var KFPlayerController KFPC;
function Initialize( KFGFxObject_Menu NewParentMenu )
{
super.Initialize( NewParentMenu );
MyTraderMenu = KFGFxMenu_Trader( NewParentMenu );
DetailsContainer = GetObject("detailedStats");
KFPC = KFPlayerController(GetPC());
LocalizeContainer();
}
function LocalizeContainer()
{
local GFxObject LocalizedObject;
LocalizedObject = CreateObject("Object");
LocalizedObject.SetString("damageTitle", DamageTitle);
LocalizedObject.SetString("fireRateTitle", FireRateTitle);
LocalizedObject.SetString("penetrationTitle", PenetrationTitle);
LocalizedObject.SetString("accuracyTitle", AccuracyTitle);
LocalizedObject.SetString("capacityTitle", CapacityTitle);
LocalizedObject.SetString("magTitle", MagTitle);
LocalizedObject.SetString("upgradeCost", UpgradeCostString);
LocalizedObject.SetString("favorite", UpgradeString);
LocalizedObject.SetString("unfavorite", UnfavoriteString);
SetObject("localizeContainer", LocalizedObject);
}
function SetDetailsVisible(string DetailName, bool bVisible)
{
if(DetailsContainer != none)
{
DetailsContainer.GetObject(DetailName$"Title").SetVisible(bVisible);
DetailsContainer.GetObject(DetailName$"Bar").SetVisible(bVisible);
DetailsContainer.GetObject(DetailName$"Value").SetVisible(false);
}
}
function SetDetailsText(string DetailName, string NewName)
{
if(DetailsContainer != none)
{
DetailsContainer.GetObject(DetailName$"Title").SetString("text", NewName);
}
}
function SetShopItemDetails(out STraderItem TraderItem, int ItemPrice, bool bCanCarry, bool bCanBuy)
{
local GFxObject ItemData;
ItemData = CreateObject("Object");
ItemData.SetInt("price", ItemPrice);
ItemData.SetBool("bUsingBuyLabel", true);
ItemData.SetString("buyOrSellLabel", BuyString);
ItemData.SetString("cannotBuyOrSellLabel", CannotBuyString);
ItemData.SetBool("bCanCarry", bCanCarry);
ItemData.SetBool("bCanBuyOrSell", bCanBuy);
ItemData.SetBool("bCanFavorite", true);
ItemData.SetBool("bCanUpgrade", false);
SetGenericItemDetails(TraderItem, ItemData);
}
function SetPlayerItemDetails(out STraderItem TraderItem, int ItemPrice, optional int UpgradeLevel = INDEX_NONE)
{
local GFxObject ItemData;
local int CanAffordIndex, CanCarryIndex;
KFPC.GetPurchaseHelper().CanUpgrade(TraderItem, CanCarryIndex, CanAffordIndex);
ItemData = CreateObject("Object");
ItemData.SetInt("price", ItemPrice);
ItemData.SetBool("bUsingBuyLabel", false);
ItemData.SetString("buyOrSellLabel", SellString);
ItemData.SetString("cannotBuyOrSellLabel", CannotSellString);
ItemData.SetBool("bCanUpgrade", true);
ItemData.SetBool("bCanBuyUpgrade", CanAffordIndex > 0);
ItemData.SetBool("bCanCarryUpgrade", CanCarryIndex > 0);
if (UpgradeLevel > INDEX_NONE)
{
if (TraderItem.WeaponDef.static.GetUpgradePrice(UpgradeLevel) == INDEX_NONE)
{
ItemData.SetInt("upgradePrice", 0);
ItemData.SetInt("upgradeWeight", 0);
ItemData.SetBool("bCanUpgrade", false);
}
else
{
ItemData.SetInt("upgradePrice", TraderItem.WeaponDef.static.GetUpgradePrice(UpgradeLevel));
ItemData.SetInt("upgradeWeight", TraderItem.WeaponUpgradeWeight[UpgradeLevel + 1] - TraderItem.WeaponUpgradeWeight[UpgradeLevel]);
}
}
else
{
ItemData.SetInt("upgradePrice", 0);
ItemData.SetInt("upgradeWeight", 0);
}
ItemData.SetInt("weaponTier", UpgradeLevel);
ItemData.SetBool("bCanCarry", true);
ItemData.SetBool("bCanBuyOrSell", KFPC.GetPurchaseHelper().IsSellable(TraderItem));
ItemData.SetBool("bHideStats", (TraderItem.WeaponStats.Length == 0));
ItemData.SetBool("bCanFavorite", true);//KFPC.GetPurchaseHelper().IsSellable(TraderItem));
SetGenericItemDetails(TraderItem, ItemData, UpgradeLevel);
}
function string GetLocalizedStatString( TraderWeaponStat Stat )
{
switch( Stat )
{
case TWS_Damage:
return DamageTitle;
case TWS_RateOfFire:
return FireRateTitle;
case TWS_Range:
return RangeTitle;
case TWS_Penetration:
return PenetrationTitle;
case TWS_Block:
return BlockTitle;
case TWS_Parry:
return ParryTitle;
case TWS_MagazineSize:
return MagTitle;
case TWS_AmmoCapacity:
return CapacityTitle;
case TWS_HealAmount:
return HealAmountTitle;
case TWS_RechargeTime:
return HealRechargeTitle;
};
return "";
}
function float GetStatMax( TraderWeaponStat Stat )
{
switch( Stat )
{
case TWS_Damage:
return WeaponStatMax_Damage;
case TWS_RateOfFire:
return WeaponStatMax_FireRate;
case TWS_Range:
return WeaponStatMax_Range;
case TWS_Penetration:
return WeaponStatMax_Penetration;
case TWS_Block:
return WeaponStatMax_Block;
case TWS_Parry:
return WeaponStatMax_Parry;
// case TWS_MagazineSize:
// return MagTitle;
// case TWS_AmmoCapacity:
// return CapacityTitle;
case TWS_HealAmount:
return WeaponStatMax_HealAmount;
case TWS_RechargeTime:
return WeaponStatMax_HealRechargeSpeed;
};
return 1.f;
}
function SetGenericItemDetails(const out STraderItem TraderItem, out GFxObject ItemData, optional int UpgradeLevel = INDEX_NONE)
{
local KFPerk CurrentPerk;
local int FinalMaxSpareAmmoCount;
local int FinalMagazineCapacity;
local Float DamageValue;
local Float NextDamageValue;
//@todo: rename flash objects to something more generic, like stat0text, stat0bar, etc.
if( TraderItem.WeaponStats.Length >= TWS_Damage && TraderItem.WeaponStats.length > 0)
{
DamageValue = TraderItem.WeaponStats[TWS_Damage].StatValue * (UpgradeLevel > INDEX_NONE ? TraderItem.WeaponUpgradeDmgMultiplier[UpgradeLevel] : 1.0f);
SetDetailsVisible("damage", true);
SetDetailsText("damage", GetLocalizedStatString(TraderItem.WeaponStats[TWS_Damage].StatType));
ItemData.SetInt("damageValue", DamageValue);
ItemData.SetInt("damagePercent", (FMin(DamageValue / GetStatMax(TraderItem.WeaponStats[TWS_Damage].StatType), 1.f) ** 0.5f) * 100.f);
if (UpgradeLevel + 1 < ArrayCount(TraderItem.WeaponUpgradeDmgMultiplier))
{
NextDamageValue = TraderItem.WeaponStats[TWS_Damage].StatValue * TraderItem.WeaponUpgradeDmgMultiplier[UpgradeLevel + 1];
ItemData.SetInt("damageUpgradePercent", (FMin(NextDamageValue / GetStatMax(TraderItem.WeaponStats[TWS_Damage].StatType), 1.f) ** 0.5f) * 100.f);
}
else
{
NextDamageValue = DamageValue;
ItemData.SetInt("damageUpgradePercent", (FMin(DamageValue / GetStatMax(TraderItem.WeaponStats[TWS_Damage].StatType), 1.f) ** 0.5f) * 100.f);
}
//`log("THIS IS THE old DAMAGE VALUE: " @((FMin(DamageValue / GetStatMax(TraderItem.WeaponStats[TWS_Damage].StatType), 1.f) ** 0.5f) * 100.f));
//`log("THIS IS THE NEXT DAMAGE VALUE: " @((FMin(NextDamageValue / GetStatMax(TraderItem.WeaponStats[TWS_Damage].StatType), 1.f) ** 0.5f) * 100.f));
}
else
{
SetDetailsVisible("damage", false);
}
if( TraderItem.WeaponStats.Length >= TWS_Penetration )
{
SetDetailsVisible("penetration", true);
SetDetailsText("penetration", GetLocalizedStatString(TraderItem.WeaponStats[TWS_Penetration].StatType));
if(TraderItem.TraderFilter != FT_Melee)
{
ItemData.SetInt("penetrationValue", TraderItem.WeaponStats[TWS_Penetration].StatValue);
ItemData.SetInt("penetrationPercent", (FMin(TraderItem.WeaponStats[TWS_Penetration].StatValue / GetStatMax(TraderItem.WeaponStats[TWS_Penetration].StatType), 1.f) ** 0.5f) * 100.f);
}
else
{
SetDetailsVisible("penetration", false);
}
}
else
{
SetDetailsVisible("penetration", false);
}
if( TraderItem.WeaponStats.Length >= TWS_RateOfFire )
{
SetDetailsVisible("fireRate", true);
SetDetailsText("fireRate", GetLocalizedStatString(TraderItem.WeaponStats[TWS_RateOfFire].StatType));
if(TraderItem.TraderFilter != FT_Melee)
{
ItemData.SetInt("fireRateValue", TraderItem.WeaponStats[TWS_RateOfFire].StatValue);
ItemData.SetInt("fireRatePercent", FMin(TraderItem.WeaponStats[TWS_RateOfFire].StatValue / GetStatMax(TraderItem.WeaponStats[TWS_RateOfFire].StatType), 1.f) * 100.f);
}
else
{
SetDetailsVisible("fireRate", false);
}
}
else
{
SetDetailsVisible("fireRate", false);
}
//actually range?
if( TraderItem.WeaponStats.Length >= TWS_Range )
{
SetDetailsVisible("accuracy", true);
SetDetailsText("accuracy", GetLocalizedStatString(TraderItem.WeaponStats[TWS_Range].StatType));
ItemData.SetInt("accuracyValue", TraderItem.WeaponStats[TWS_Range].StatValue);
ItemData.SetInt("accuracyPercent", FMin(TraderItem.WeaponStats[TWS_Range].StatValue / GetStatMax(TraderItem.WeaponStats[TWS_Range].StatType), 1.f) * 100.f);
}
else
{
SetDetailsVisible("accuracy", false);
}
ItemData.SetString("type", TraderItem.WeaponDef.static.GetItemName());
ItemData.SetString("name", TraderItem.WeaponDef.static.GetItemCategory());
ItemData.SetString("description", TraderItem.WeaponDef.static.GetItemDescription());
CurrentPerk = KFPlayerController(GetPC()).CurrentPerk;
if( CurrentPerk != none )
{
FinalMaxSpareAmmoCount = TraderItem.MaxSpareAmmo;
FinalMagazineCapacity = TraderItem.MagazineCapacity;
CurrentPerk.ModifyMagSizeAndNumber(none, FinalMagazineCapacity, TraderItem.AssociatedPerkClasses,, TraderItem.ClassName);
// When a perk calculates total available weapon ammo, it expects MaxSpareAmmo+MagazineCapacity
CurrentPerk.ModifyMaxSpareAmmoAmount(none, FinalMaxSpareAmmoCount, TraderItem,);
FinalMaxSpareAmmoCount += FinalMagazineCapacity;
}
else
{
FinalMaxSpareAmmoCount = TraderItem.MaxSpareAmmo;
FinalMagazineCapacity = TraderItem.MagazineCapacity;
}
ItemData.SetInt("ammoCapacity", FinalMaxSpareAmmoCount);
ItemData.SetInt("magSizeValue", FinalMagazineCapacity);
ItemData.SetInt("weight", MyTraderMenu.GetDisplayedBlocksRequiredFor(TraderItem));
ItemData.SetBool("bIsFavorite", MyTraderMenu.GetIsFavorite(TraderItem.ClassName));
ItemData.SetString("texturePath", "img://"$TraderItem.WeaponDef.static.GetImagePath());
if( TraderItem.AssociatedPerkClasses.length > 0 && TraderItem.AssociatedPerkClasses[0] != none )
{
ItemData.SetString("perkIconPath", "img://"$TraderItem.AssociatedPerkClasses[0].static.GetPerkIconPath());
//secondary perk icon
if( TraderItem.AssociatedPerkClasses.length > 1 )
{
ItemData.SetString("perkIconPathSecondary", "img://"$TraderItem.AssociatedPerkClasses[1].static.GetPerkIconPath());
}
}
else
{
ItemData.SetString("perkIconPath", "img://"$class'KFGFxObject_TraderItems'.default.OffPerkIconPath);
}
SetObject("itemData", ItemData);
}
defaultproperties
{
MAX_RPM=1000
MAX_PENETRATION=5
}