status/SatelliteLaserStatus.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;
[Status(7, 0, 0.8f, 0, false )]
public class SatelliteLaserStatus : Status
{
private TimeSince _timeSinceShoot;
private float _nextShootTime;
public SatelliteLaserStatus()
{
Title = "Attack Satellite";
IconPath = "textures/icons/satellite_laser.png";
}
public override void Init(Player player)
{
base.Init(player);
ShouldUpdate = true;
_timeSinceShoot = 0f;
_nextShootTime = Game.Random.Float( 1f, 2f );
}
public override void Refresh()
{
Description = GetDescription(Level);
}
public override void Update(float dt)
{
base.Update(dt);
if( _timeSinceShoot > _nextShootTime )
{
Shoot();
_timeSinceShoot = 0f;
_nextShootTime = Game.Random.Float( 1f, 5f );
}
}
void Shoot()
{
var laser = Manager.Instance.SpawnSatelliteLaser( Manager.Instance.MouseWorldPos );
laser.Damage = GetDmgForLevel( Level );
Manager.Instance.PlaySfxNearby( "laser_hit", Manager.Instance.MouseWorldPos, pitch: Game.Random.Float( 1.4f, 1.5f ), volume: 0.6f, maxDist: 7.5f );
}
public override string GetDescription(int newLevel)
{
return string.Format( "Periodically shoot a {0} dmg laser at your cursor", GetDmgForLevel(Level));
}
public override string GetUpgradeDescription(int newLevel)
{
return newLevel > 1 ? string.Format( "Periodically shoot a {0}→{1} dmg laser at your cursor ", GetDmgForLevel(newLevel - 1), GetDmgForLevel(newLevel)) : GetDescription(newLevel);
}
public float GetDmgForLevel(int level)
{
return 6 + level * 5 + MathX.FloorToInt(MathF.Pow(level, 2.2f)) + (level == 7 ? 10 : 0);
}
}