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

214 lines
9.1 KiB
Ucode

class ScrnVetCommando extends ScrnVeterancyTypes
abstract;
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum)
{
if (ReqNum == 1)
return StatOther.RBullpupDamageStat;
// 0 and default
return StatOther.RStalkerKillsStat;
}
// Display enemy health bars
static function SpecialHUDInfo(KFPlayerReplicationInfo KFPRI, Canvas C)
{
local KFMonster KFEnemy;
local HUDKillingFloor HKF;
local float MaxDistance;
HKF = HUDKillingFloor(C.ViewPort.Actor.myHUD);
if ( HKF == none || Pawn(C.ViewPort.Actor.ViewTarget)==none || Pawn(C.ViewPort.Actor.ViewTarget).Health<=0 )
return;
MaxDistance = 800;
if ( class'ScrnBalance'.default.Mut.bHardcore )
MaxDistance *= 0.75;
foreach C.ViewPort.Actor.VisibleCollidingActors(class'KFMonster',KFEnemy,MaxDistance,C.ViewPort.Actor.CalcViewLocation)
{
if ( KFEnemy.Health > 0 && !KFEnemy.Cloaked() )
HKF.DrawHealthBar(C, KFEnemy, KFEnemy.Health, KFEnemy.HealthMax , 50.0);
}
}
static function bool ShowStalkers(KFPlayerReplicationInfo KFPRI)
{
return true;
}
static function float GetStalkerViewDistanceMulti(KFPlayerReplicationInfo KFPRI)
{
if ( class'ScrnBalance'.default.Mut.bHardcore )
return 0.75;
return 1.0;
}
static function float GetMagCapacityModStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other)
{
if ( ClassIsChildOf(Other, class'Bullpup')
|| ClassIsChildOf(Other, class'AK47AssaultRifle') || ClassIsChildOf(Other, class'MKb42AssaultRifle')
|| ClassIsChildOf(Other, class'M4AssaultRifle')
|| ClassIsChildOf(Other, class'SCARMK17AssaultRifle') || ClassIsChildOf(Other, class'FNFAL_ACOG_AssaultRifle')
|| ClassIsChildOf(Other, class'ThompsonSMG')
|| ClassIsInArray(default.PerkedAmmo, Other.default.FiremodeClass[0].default.AmmoClass) //v3 - custom weapon support
)
{
return 1.25; // 25% bigger assault rifle magazine
}
return 1.0;
}
static function float GetAmmoPickupMod(KFPlayerReplicationInfo KFPRI, KFAmmunition Other)
{
return AddExtraAmmoFor(KFPRI, Other.class);
}
static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType)
{
if ( ClassIsChildOf(AmmoType, class'ScrnBalanceSrv.ScrnM203MAmmo') )
return 1.0; // no extra medic grenades
if ( GetClientVeteranSkillLevel(KFPRI) > 0 ) {
if ( ClassIsChildOf(AmmoType, class'BullpupAmmo')
|| ClassIsChildOf(AmmoType, class'AK47Ammo')
|| ClassIsChildOf(AmmoType, class'SCARMK17Ammo' )
|| ClassIsChildOf(AmmoType, class'M4Ammo')
|| ClassIsChildOf(AmmoType, class'FNFALAmmo')
|| ClassIsChildOf(AmmoType, class'MKb42Ammo')
|| ClassIsChildOf(AmmoType, class'ThompsonAmmo')
|| ClassIsChildOf(AmmoType, class'ThompsonDrumAmmo')
|| ClassIsChildOf(AmmoType, class'SPThompsonAmmo')
|| ClassIsInArray(default.PerkedAmmo, AmmoType) //v3 - custom weapon support
)
{
return 1.25 + fmax(0.00, 0.05 * float(GetClientVeteranSkillLevel(KFPRI)-6)); // +10% per level above 6
}
}
return 1.0;
}
static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType)
{
if ( DmgType == default.DefaultDamageTypeNoBonus )
return InDamage;
if ( DmgType == default.DefaultDamageType
|| ClassIsChildOf(DmgType, class'DamTypeBullpup')
|| ClassIsChildOf(DmgType, class'DamTypeAK47AssaultRifle')
|| ClassIsChildOf(DmgType, class'DamTypeSCARMK17AssaultRifle')
|| ClassIsChildOf(DmgType, class'DamTypeM4AssaultRifle')
|| ClassIsChildOf(DmgType, class'DamTypeFNFALAssaultRifle')
|| ClassIsChildOf(DmgType, class'DamTypeMKb42AssaultRifle')
|| ClassIsChildOf(DmgType, class'DamTypeThompson')
|| ClassIsChildOf(DmgType, class'DamTypeThompsonDrum')
|| ClassIsChildOf(DmgType, class'DamTypeSPThompson')
|| ClassIsInArray(default.PerkedDamTypes, DmgType) //v3 - custom weapon support
)
{
// 20% base bonus + 5% per level
InDamage *= 1.20 + 0.05 * GetClientVeteranSkillLevel(KFPRI);
}
return InDamage;
}
static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType)
{
if ( class'ScrnBalance'.default.Mut.bHardcore && DmgType == class'DamTypeSlashingAttack' ) {
return InDamage * 3.5; // quad damage from Stalkers in hardcore mode
}
return InDamage;
}
static function float ModifyRecoilSpread(KFPlayerReplicationInfo KFPRI, WeaponFire Other, out float Recoil)
{
Recoil = 0.60;
return Recoil;
}
static function float GetReloadSpeedModifierStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other)
{
return 1.35; // Up to 35% faster reload speed for any weapon
}
// Set number times Zed Time can be extended
static function int ZedTimeExtensions(KFPlayerReplicationInfo KFPRI)
{
return min(10, 2 + GetClientVeteranSkillLevel(KFPRI)/3); // 2 base + 1 extention per 3 levels
}
// Change the cost of particular items
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item)
{
if ( Item == class'ScrnBalanceSrv.ScrnBullpupPickup' )
return 1.0; // price lowered to $200, no discount needed
if ( ClassIsChildOf(Item, class'BullpupPickup')
|| ClassIsChildOf(Item, class'AK47Pickup' )
|| ClassIsChildOf(Item, class'SCARMK17Pickup')
|| ClassIsChildOf(Item, class'M4Pickup')
|| ClassIsChildOf(Item, class'FNFAL_ACOG_Pickup')
|| ClassIsChildOf(Item, class'MKb42Pickup')
|| ClassIsChildOf(Item, class'ThompsonPickup')
|| ClassIsChildOf(Item, class'ThompsonDrumPickup')
|| ClassIsChildOf(Item, class'SPThompsonPickup')
|| ClassIsInArray(default.PerkedPickups, Item) //v3 - custom weapon support
)
{
// 30% base discount + 5% extra per level
return fmax(0.10, 0.70 - 0.05 * GetClientVeteranSkillLevel(KFPRI));
}
return 1.0;
}
static function string GetCustomLevelInfo( byte Level )
{
local string S;
S = Default.CustomLevelInfo;
ReplaceText(S, "%L", string(Level));
ReplaceText(S, "%x", GetPercentStr(0.20 + 0.05*Level));
ReplaceText(S, "%z", string(min(10, 2 + Level/3)));
ReplaceText(S, "%$", GetPercentStr(fmin(0.90, 0.30 + 0.05*Level)));
return S;
}
defaultproperties
{
progressArray0(0)=10
progressArray0(1)=30
progressArray0(2)=100
progressArray0(3)=325
progressArray0(4)=1200
progressArray0(5)=2400
progressArray0(6)=3600
progressArray1(0)=10000
progressArray1(1)=25000
progressArray1(2)=100000
progressArray1(3)=500000
progressArray1(4)=1500000
progressArray1(5)=3500000
progressArray1(6)=5500000
DefaultDamageType=Class'ScrnBalanceSrv.ScrnDamTypeCommando'
DefaultDamageTypeNoBonus=Class'ScrnBalanceSrv.ScrnDamTypeCommandoBase'
OnHUDIcons(0)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Gray',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Gray',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Gold',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(6)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Blood',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blood',DrawColor=(B=255,G=255,R=255,A=255))
SamePerkAch="OP_Commando"
SkillInfo="PERK SKILLS:|25% larger Assaut Rifle clip|100% faster reload with Tommy Guns|35% faster reload with all weapons|40% less recoil with all weapons|See cloaked enemies and health"
CustomLevelInfo="PERK BONUSES (LEVEL %L):|%x more damage with Assaut Rifles|Up to %z Zed-Time Extensions|%$ discount on Assaut Rifles"
NumRequirements=2
PerkIndex=3
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold'
VeterancyName="Commando"
Requirements(0)="Kill %x Stalkers/Shivers with Assault Rifles"
Requirements(1)="Deal %x damage with Assault Rifles"
}