1
0
KF2-Dev-Scripts/KFGame/Classes/KFGFxTraderContainer_PlayerInventory.uc
2022-11-28 00:49:25 +03:00

293 lines
12 KiB
Ucode

//=============================================================================
// KFGFxTraderContainer_PlayerInventory
//=============================================================================
// This class holds all of the functions and variables corresponding to the
// players inventory list ( What you currently own ). This class will add
// and remove local item references to the array "OwnedItemList." The player
// will not receive any changed values to his inventory until the menu is
// closed and the the server is told to update the new purchases
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
// - Greg Felber 8/14/2013
//=============================================================================
class KFGFxTraderContainer_PlayerInventory extends KFGFxObject_Container
DependsOn(KFGFxObject_TraderItems)
DependsOn(KFGFxMenu_Trader);
enum EButtonStates
{
BS_Enabled,
BS_MaxCapacity,
BS_CantAfford
};
var KFGFxMenu_Trader MyTraderMenu; // Reference to the movie player that owns us
var localized string FillString, MagString, AutoFillString, BuyGrenadeString, ChangePerkString;
var localized string ArmorString;
var KFPlayerController KFPC;
var Float LowAmmoPercentThreshold;
//==============================================================
// Initialization
//==============================================================
function Initialize( KFGFxObject_Menu NewParentMenu )
{
super.Initialize( NewParentMenu );
KFPC = KFPlayerController(GetPC());
MyTraderMenu = KFGFxMenu_Trader( NewParentMenu );
LocalizeContainer();
UpdateLock();
}
function LocalizeContainer()
{
local GFxOBject LocalizedObject;
LocalizedObject = CreateObject("Object");
LocalizedObject.SetString("autoFill", AutoFillString);
LocalizedObject.SetString("armorLabel", FillString);
LocalizedObject.SetString("fillLabel", FillString);
LocalizedObject.SetString("magLabel", MagString);
LocalizedObject.SetString("changePerk", ChangePerkString);
LocalizedObject.SetString("grenadeLabel", BuyGrenadeString);
LocalizedObject.SetString("armorBuyLabel", class'KFAutoPurchaseHelper'.default.ArmorMagSize$"X");
//Prompt strings
LocalizedObject.SetString("sellPrompt", Localize("KFGFxTraderContainer_ItemDetails", "SellString", "KFGame"));
LocalizedObject.SetString("perkPrompt", Localize("KFGFxTraderContainer_PlayerInventory", "PerkPrompt", "KFGameConsole"));
SetObject("localizeStrings", LocalizedObject);
}
//Updates the ablility to change the perk
function UpdateLock()
{
local bool bLocked;
if (KFPC != none)
{
bLocked = !KFPC.CanUpdatePerkInfo() || KFGameReplicationInfo(KFPC.WorldInfo.GRI).IsRandomPerkMode();
SetBool("perkChangeLocked", bLocked);
}
}
//==============================================================
// Update Item List
//==============================================================
// Grab all the items currently in our inventory chain, and add them to the inventory list
function RefreshPlayerInventory()
{
local byte MagSize, SlotIndex;
local float PricePerRound;
local int AmmoCount, MaxAmmoCount, PricePerMag;
local int FillAmmoCost, BlocksRequired, AutoFillCost;
local string TextureLocation;
local GFxObject InfoSlot, MagSlot, FillSlot, SellSlot;
local GFxObject InfoDataProvider, FillDataProvider, MagDataProvider, SellDataProvider; // This array of information is sent to ActionScript to update the item data
local SItemInformation ItemInfo;
InfoDataProvider = CreateArray();
FillDataProvider = CreateArray();
MagDataProvider = CreateArray();
SellDataProvider = CreateArray();
SetArmorInfo(KFPC.GetPurchaseHelper().ArmorItem, AutoFillCost);
SetGrenadeInfo(KFPC.GetPurchaseHelper().GrenadeItem, AutoFillCost);
// Iterate through all the items to get the auto fill cost, and update the items
// for the page we are currently on
for ( SlotIndex = 0; SlotIndex < MyTraderMenu.OwnedItemList.Length; SlotIndex++ )
{
InfoSlot = CreateObject("Object");
MagSlot = CreateObject("Object");
FillSlot = CreateObject("Object");
SellSlot = CreateObject("Object");
ItemInfo = MyTraderMenu.OwnedItemList[SlotIndex];
FillAmmoCost = KFPC.GetPurchaseHelper().GetFillAmmoCost(ItemInfo);
if( ItemInfo.bIsSecondaryAmmo )
{
TextureLocation = ItemInfo.DefaultItem.SecondaryAmmoImagePath;
AmmoCount = ItemInfo.SecondaryAmmoCount;
MaxAmmoCount = ItemInfo.MaxSecondaryAmmo;
MagSize = ItemInfo.DefaultItem.WeaponDef.default.SecondaryAmmoMagSize;
PricePerMag = ItemInfo.DefaultItem.WeaponDef.default.SecondaryAmmoMagPrice;
PricePerRound = ( MagSize > 0 ) ? float(PricePerMag) / float(MagSize) : 0.f;
BlocksRequired = -1; // This will hide the weight and
SetItemInfo( InfoSlot, ItemInfo.DefaultItem.WeaponDef, "SecondaryAmmo", TextureLocation, AmmoCount, MaxAmmoCount, BlocksRequired, true, 0, ItemInfo.DefaultItem.bCanBuyAmmo);
SetMagInfo( MagSlot, AmmoCount, MaxAmmoCount, MagSize, PricePerMag, PricePerRound, FillAmmoCost, ItemInfo.DefaultItem.bCanBuyAmmo);
SetFillInfo( FillSlot, AmmoCount, MaxAmmoCount, PricePerRound, FillAmmoCost, AutoFillCost, ItemInfo.DefaultItem.bCanBuyAmmo );
}
else
{
// @temp: Use LastPerkClass to determine correct knife image
TextureLocation = ItemInfo.DefaultItem.WeaponDef.static.GetImagePath();
AmmoCount = ItemInfo.SpareAmmoCount;
MaxAmmoCount = ItemInfo.MaxSpareAmmo;
MagSize = ItemInfo.MagazineCapacity;
PricePerMag = ItemInfo.AmmoPricePerMagazine;
PricePerRound = ( MagSize > 0 ) ? float(PricePerMag) / float(MagSize) : 0.f;
BlocksRequired = MyTraderMenu.GetDisplayedBlocksRequiredFor(ItemInfo.DefaultItem, ItemInfo.ItemUpgradeLevel);
SetItemInfo( InfoSlot, ItemInfo.DefaultItem.WeaponDef, "ItemName", TextureLocation, AmmoCount, MaxAmmoCount, BlocksRequired, false, KFPC.GetPurchaseHelper().GetItemUpgradeLevelByClassName(ItemInfo.DefaultItem.ClassName), ItemInfo.DefaultItem.bCanBuyAmmo );
SetMagInfo( MagSlot, AmmoCount, MaxAmmoCount, MagSize, PricePerMag, PricePerRound, FillAmmoCost, ItemInfo.DefaultItem.bCanBuyAmmo );
SetFillInfo( FillSlot, AmmoCount, MaxAmmoCount, PricePerRound, FillAmmoCost, AutoFillCost, ItemInfo.DefaultItem.bCanBuyAmmo );
}
SetSellInfo(SellSlot, ItemInfo.SellPrice, ItemInfo.SellPrice > 0);
InfoDataProvider.SetElementObject( SlotIndex, InfoSlot );
MagDataProvider.SetElementObject( SlotIndex, MagSlot );
FillDataProvider.SetElementObject( SlotIndex, FillSlot );
SellDataProvider.SetElementObject( SlotIndex, SellSlot );
}
SetAutoFill(AutoFillCost);
SetObject("itemData", InfoDataProvider);
SetObject("magData", MagDataProvider);
SetObject("fillData", FillDataProvider);
SetObject("sellData", SellDataProvider);
}
function SetArmorInfo(out SItemInformation ArmorInfo, out int AutoFillCost)
{
local GFxObject SlotObject;
local int FillCost, ChunkCost;
local int ButtonState;
FillCost = KFPC.GetPurchaseHelper().GetFillArmorCost();
ChunkCost = KFPC.GetPurchaseHelper().GetChunkArmorCost();
SlotObject = CreateObject( "Object" );
SlotObject.SetInt("magCost", ChunkCost);
SlotObject.SetInt("cost", FillCost);
SlotObject.SetString("itemName", ArmorString);
SlotObject.SetString("itemSource", "img://"$ArmorInfo.DefaultItem.WeaponDef.static.GetImagePath());
SlotObject.SetString("itemAmmo", ArmorInfo.SpareAmmoCount$"/"$ArmorInfo.MaxSpareAmmo);
SlotObject.SetBool("lowAmmo", (ArmorInfo.MaxSpareAmmo > 0) ? (float(ArmorInfo.SpareAmmoCount) / float(ArmorInfo.MaxSpareAmmo)) <= LowAmmoPercentThreshold : false);
ButtonState = GetButtonState( ArmorInfo.AmmoPricePerMagazine, ArmorInfo.SpareAmmoCount, ArmorInfo.MaxSpareAmmo, true );
SlotObject.Setint("buttonState", ButtonState );
SlotObject.Setint("magButtonState", ButtonState );
SetObject("armorInfo", SlotObject);
AutoFillCost += FillCost;
}
function SetGrenadeInfo(out SItemInformation GrenadeInfo, out int AutoFillCost)
{
local GFxObject SlotObject;
local int FillCost;
local int MagCost;
local int ButtonState;
local int AmmoPricePerMagazine;
AmmoPricePerMagazine = GrenadeInfo.AmmoPricePerMagazine;
SlotObject = CreateObject("Object");
SlotObject.SetString("itemSource", "img://" $ GrenadeInfo.DefaultItem.WeaponDef.static.GetImagePath());
SlotObject.SetString("itemName", GrenadeInfo.DefaultItem.WeaponDef.static.GetItemName());
FillCost = KFPC.GetPurchaseHelper().GetFillGrenadeCost();
MagCost = (GrenadeInfo.SpareAmmoCount != GrenadeInfo.MaxSpareAmmo) ? GrenadeInfo.AmmoPricePerMagazine : 0;
SlotObject.SetInt("magCost", MagCost);
SlotObject.SetInt("fillCost", FillCost);
SlotObject.SetBool("lowAmmo", (GrenadeInfo.MaxSpareAmmo > 0) ? (float(GrenadeInfo.SpareAmmoCount) / float(GrenadeInfo.MaxSpareAmmo)) <= LowAmmoPercentThreshold : false);
SlotObject.SetString("itemAmmo", GrenadeInfo.SpareAmmoCount $"/"$GrenadeInfo.MaxSpareAmmo);
ButtonState = GetButtonState(AmmoPricePerMagazine, GrenadeInfo.SpareAmmoCount, GrenadeInfo.MaxSpareAmmo, true);
SlotObject.Setint("magButtonState", ButtonState);
SlotObject.Setint("fillButtonState", ButtonState);
SetObject("grenadeInfo", SlotObject);
AutoFillCost += FillCost;
}
function SetItemInfo(out GFxObject InfoSlot, class<KFWeaponDefinition> WeaponDef, string ItemKeyString, string TextureLocation, int AmmoCount, int MaxAmmoCount, int BlocksRequired, optional bool bSecondaryAmmo, optional int UpgradeLevel, optional bool bCanBuyAmmo = true )
{
local string ItemTexPath;
InfoSlot.SetString( "itemName", WeaponDef.static.GetItemLocalization(ItemKeyString) );
InfoSlot.SetString( "itemAmmo", AmmoCount $"/" $(bCanBuyAmmo ? MaxAmmoCount : 0 ));
InfoSlot.Setint( "itemWeight", BlocksRequired );
InfoSlot.Setint("weaponTier", UpgradeLevel);
InfoSlot.SetBool("lowAmmo", (MaxAmmoCount > 0) ? (float(AmmoCount) / float(MaxAmmoCount)) <= LowAmmoPercentThreshold : false );
InfoSlot.SetBool("isSubAmmo", bSecondaryAmmo );
ItemTexPath = "img://"$TextureLocation;
InfoSlot.SetString( "itemSource", ItemTexPath );
}
function SetMagInfo(out GFxObject MagSlot, int AmmoCount, int MaxAmmoCount, byte AmmoMagSize, int PricePerMag, float PricePerRound, int FillAmmoCost, bool bCanBuyAmmo)
{
local int MagCost;
local bool bBuyPartialMag;
bBuyPartialMag = AmmoCount + AmmoMagSize > MaxAmmoCount;
MagCost = ( bBuyPartialMag ) ? FillAmmoCost : PricePerMag;
MagSlot.SetString("label", MagString);
MagSlot.SetInt("buttonValue", MagCost);
MagSlot.SetInt("buttonState", GetButtonState( PricePerRound, AmmoCount, MaxAmmoCount, bCanBuyAmmo));
}
function SetFillInfo(out GFxObject FillSlot, int AmmoCount, int MaxAmmoCount, float PricePerRound, int FillAmmoCost, out int AutoFillCost, bool bCanBuyAmmo)
{
FillSlot.SetString("label", FillString);
FillSlot.SetInt("buttonValue", FillAmmoCost);
FillSlot.SetInt("buttonState", GetButtonState( PricePerRound, AmmoCount, MaxAmmoCount, bCanBuyAmmo ));
AutoFillCost += FillAmmoCost;
}
// Sell list data being added to trader menu, setup the data - HSL
function SetSellInfo(out GFxObject SellSlot, int SellPrice, bool bCanSell)
{
SellSlot.SetString("label", Localize("KFGFxTraderContainer_ItemDetails", "SellString", "KFGame"));
SellSlot.SetInt("buttonValue", SellPrice);
SellSlot.SetBool("buttonState", bCanSell);
}
function SetAutoFill(int AutoFillCost)
{
local GFxObject AutoFillObject;
AutoFillObject = CreateObject("Object");
AutoFillObject.SetInt("buttonValue", AutoFillCost);
// Only disable this button if we have all the ammo
AutoFillObject.SetInt("buttonState", GetButtonState(0, 0, AutoFillCost, true));
SetObject("autoFillCost", AutoFillObject);
}
// Change the look of the button dependant on if we can afford it, or are at max capacity
function int GetButtonState( float Price, int SpareAmmoCount, int MaxSpareAmmoCount, bool bCanBuyAmmo )
{
if ( SpareAmmoCount >= MaxSpareAmmoCount || !bCanBuyAmmo)
{
return BS_MaxCapacity;
}
else if ( KFPC.GetPurchaseHelper().TotalDosh < Price )
{
return BS_CantAfford;
}
return BS_Enabled;
}
DefaultProperties
{
LowAmmoPercentThreshold=0.5f
}