//============================================================================= // 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 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 }