enemyStatus/FrozenEnemyStatus.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sandbox;
using static Sandbox.Connection;
public class FrozenEnemyStatus : EnemyStatus
{
public float Lifetime { get; set; }
public Player Player { get; set; }
public override void Init( Enemy enemy )
{
base.Init( enemy );
enemy.CreateFrozenVfx();
enemy.IsFrozen = true;
}
public void SetLifetime( float lifetime )
{
if ( lifetime > Lifetime )
{
Lifetime = lifetime;
}
}
public void SetTimeScale( float timeScale )
{
timeScale = MathF.Max( timeScale, 0.01f );
if ( Enemy is Boss )
timeScale = Utils.Map( timeScale, 1f, 0f, 1f, 0.4f );
if ( timeScale < Enemy.TimeScale )
{
Enemy.AnimSpeedModifier = timeScale;
Enemy.TimeScale = timeScale;
}
}
public override void Update( float dt )
{
if ( Enemy == null || !Enemy.IsValid() )
return;
if ( ElapsedTime > Lifetime )
Enemy.RemoveEnemyStatus( this );
//Enemy.Velocity *= (1f - Utils.Map( TimeScale, 0.6f, 0f, 3f, 15f ) * dt);
}
public override void StartDying()
{
Enemy.AnimSpeedModifier = 1f;
Enemy.TimeScale = 1f;
Enemy.IsFrozen = false;
if ( Player != null && Player.Stats[PlayerStat.FrozenShardsNum] > 0f )
{
int maxShardsNum = (int)Player.Stats[PlayerStat.FrozenShardsNum];
int numShards = Game.Random.Int( 0, maxShardsNum );
if ( numShards == 0 && Game.Random.Float( 0f, 1f ) < 0.15f )
numShards = 1;
//if(Game.Random.Float(0f, 1f) < 0.25f)
// numShards = Math.Max( numShards, Game.Random.Int( 1, maxShardsNum ));
if(numShards > 0)
{
Vector2 aimDir = (new Vector2( Game.Random.Float( -1f, 1f ), Game.Random.Float( -1f, 1f ) )).Normal;
Player.SpawnBulletRing( Enemy.Position2D, numShards, aimDir, damageMultMin: 0.1f, damageMultMax: 0.95f );
}
}
}
public override void Remove()
{
Enemy.AnimSpeedModifier = 1f;
Enemy.TimeScale = 1f;
Enemy.IsFrozen = false;
Enemy.RemoveFrozenVfx();
}
public override void Refresh()
{
ElapsedTime = 0f;
}
}