Added the ability to associate simple commodities with resource maps Added resource placement to zone generator Added crafting blueprints and stat addressing system Refactored Thrusters and Shields into Behaviors Fixed server losing database connection Updated icons
172 lines
No EOL
6 KiB
C#
172 lines
No EOL
6 KiB
C#
|
|
|
|
using MessagePack;
|
|
using Newtonsoft.Json;
|
|
using Unity.Mathematics;
|
|
|
|
[InspectableField, MessagePackObject, JsonObject(MemberSerialization.OptIn)]
|
|
public class LauncherBehaviorData : IItemBehaviorData
|
|
{
|
|
[InspectablePrefab, JsonProperty("missile"), Key(9)]
|
|
public string MissilePrefab;
|
|
|
|
[InspectableAnimationCurve, JsonProperty("guidance"), Key(10)]
|
|
public float4[] GuidanceCurve;
|
|
|
|
[InspectableAnimationCurve, JsonProperty("thrustCurve"), Key(11)]
|
|
public float4[] ThrustCurve;
|
|
|
|
[InspectableAnimationCurve, JsonProperty("liftCurve"), Key(12)]
|
|
public float4[] LiftCurve;
|
|
|
|
[InspectableField, JsonProperty("thrust"), Key(13)]
|
|
public PerformanceStat Thrust = new PerformanceStat();
|
|
|
|
[InspectableField, JsonProperty("lockAngle"), Key(14)]
|
|
public float LockAngle;
|
|
|
|
[InspectableField, JsonProperty("frequency"), Key(15)]
|
|
public float DodgeFrequency;
|
|
|
|
[InspectableField, JsonProperty("launchSpeed"), Key(16)]
|
|
public PerformanceStat LaunchSpeed = new PerformanceStat();
|
|
|
|
[InspectableField, JsonProperty("missileSpeed"), Key(17)]
|
|
public PerformanceStat MissileSpeed = new PerformanceStat();
|
|
|
|
[InspectableField, JsonProperty("lockOnTime"), Key(18)]
|
|
public PerformanceStat LockOnTime = new PerformanceStat();
|
|
|
|
public IItemBehavior CreateInstance(GameContext context, Ship ship, Gear item)
|
|
{
|
|
return new LauncherBehavior(context, this, ship, item);
|
|
}
|
|
}
|
|
|
|
public class LauncherBehavior : IActivatedItemBehavior
|
|
{
|
|
private bool _locking;
|
|
private float _lockingTimer;
|
|
private float _cooldown; // normalized
|
|
private bool _locked;
|
|
|
|
private LauncherBehaviorData _launcher;
|
|
public Ship Ship { get; }
|
|
public Gear Item { get; }
|
|
public GameContext Context { get; }
|
|
private float _firingVisibility;
|
|
|
|
public LauncherBehavior(GameContext context, LauncherBehaviorData m, Ship ship, Gear item)
|
|
{
|
|
Context = context;
|
|
_launcher = m;
|
|
Ship = ship;
|
|
Item = item;
|
|
// _audio = hp.Proxy.GetComponent<AudioSource>();
|
|
// if(_audio==null)
|
|
// _audio = hp.Proxy.gameObject.AddComponent<AudioSource>();
|
|
// _audio.clip = _launcher.BeepSound;
|
|
// _audio.loop = true;
|
|
// _audio.volume = .5f;
|
|
}
|
|
|
|
public void Activate()
|
|
{
|
|
_locking = true;
|
|
_lockingTimer = 1;
|
|
}
|
|
|
|
private void Fire(long b)
|
|
{
|
|
|
|
// _firingVisibility += _launcher.Visibility.Evaluate(Hardpoint);
|
|
// Hardpoint.Temperature += _launcher.Heat.Evaluate(Hardpoint) / Hardpoint.HeatCapacity;
|
|
// var inst = GameObject.Instantiate(_launcher.MissilePrefab).transform;
|
|
// var missile = inst.GetComponent<Bullet>();
|
|
// missile.Target = Hardpoint.Ship.Ship.Target;
|
|
// missile.Source = Hardpoint.Ship.Ship.Hitpoints;
|
|
// missile.Lifetime = _launcher.Range.Evaluate(Hardpoint) / _launcher.MissileSpeed.Evaluate(Hardpoint);
|
|
// missile.Damage = _launcher.Damage.Evaluate(Hardpoint);
|
|
// inst.position = Hardpoint.Proxy.position;
|
|
// inst.rotation = Hardpoint.Proxy.rotation;
|
|
// inst.GetComponent<Rigidbody>().velocity = _launcher.LaunchSpeed.Evaluate(Hardpoint) * Hardpoint.Proxy.forward;
|
|
// Physics.IgnoreCollision(Hardpoint.Ship.Ship.GetComponent<Collider>(), inst.GetComponent<Collider>());
|
|
// var proj = inst.gameObject.AddComponent<GuidedProjectile>();
|
|
// proj.GuidanceCurve = _launcher.GuidanceCurve;
|
|
// proj.ThrustCurve = _launcher.ThrustCurve;
|
|
// proj.LiftCurve = _launcher.LiftCurve;
|
|
// proj.TopSpeed = _launcher.MissileSpeed.Evaluate(Hardpoint);
|
|
// proj.Frequency = _launcher.DodgeFrequency;
|
|
// proj.Target = Hardpoint.Ship.Ship.Target;
|
|
// proj.Source = Hardpoint.Ship.Ship.Hitpoints;
|
|
// proj.Thrust = _launcher.Thrust.Evaluate(Hardpoint);
|
|
// _audio.PlayOneShot(_launcher.Sounds.RandomElement());
|
|
// Debug.Log($"Firing bullet {b}");
|
|
}
|
|
|
|
public void Deactivate()
|
|
{
|
|
// if (_lockingTimer < 0)
|
|
// {
|
|
// Fire(0);
|
|
// if(_launcher.BurstCount>1)
|
|
// Observable.Interval(TimeSpan.FromSeconds(_launcher.BurstTime.Evaluate(Hardpoint) / (_launcher.BurstCount-1))).Take(_launcher.BurstCount-1)
|
|
// .Subscribe(l => Fire(l+1));
|
|
// _lockingTimer = _cooldown = 1;
|
|
// _locking = _locked = false;
|
|
// _audio.Stop();
|
|
// }
|
|
// _locking = false;
|
|
// _lockingTimer = 1;
|
|
}
|
|
|
|
public void Initialize()
|
|
{
|
|
}
|
|
|
|
public void Update(float delta)
|
|
{
|
|
// if (Ship.Target == null)
|
|
// return;
|
|
//
|
|
// if (_locking && _cooldown < 0)
|
|
// {
|
|
// //if the crosshair stays under a certain LockOnBuffer distance for a certain amount of time (LockOnTime)
|
|
// if (acos(Vector2.Dot(Ship.Direction, (Ship.Target.transform.position-Ship.transform.position).normalized)) * Mathf.Rad2Deg < _launcher.LockOnDegrees)
|
|
// {
|
|
// var d = delta / _launcher.LockOnTime.Evaluate(Hardpoint);
|
|
// _lockingTimer -= d;
|
|
// if (!_locked && _lockingTimer < 0)
|
|
// {
|
|
// _locked = true;
|
|
// _audio.Play();
|
|
// } else if(Mathf.Repeat(_lockingTimer,1.0f/(_launcher.Beeps+1))-d<0)
|
|
// GameManager.Instance.InterfaceAudio.PlayOneShot(_launcher.BeepSound);
|
|
// }
|
|
// else
|
|
// {
|
|
// _lockingTimer = 1;
|
|
// _audio.Stop();
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// _cooldown -= delta / _launcher.Cooldown.Evaluate(Hardpoint);
|
|
// }
|
|
//
|
|
//
|
|
// if (_firingVisibility > 0.01f)
|
|
// {
|
|
// Hardpoint.Ship.Visibility += _firingVisibility;
|
|
// _firingVisibility = 0;
|
|
// }
|
|
|
|
|
|
}
|
|
|
|
public void FixedUpdate(float delta)
|
|
{
|
|
}
|
|
|
|
public IItemBehaviorData Data => _launcher;
|
|
} |