using System.Collections; using Godot; public partial class ship : CharacterBody2D { public enum ShipType { FIGHTER, INTERCEPTOR, GUARDIAN } [Signal] public delegate void LaserShotEventHandler(Area2D Laser); //[Export] //public Vector2 ScreenSize; [Export] public int Health { get; set; } = 100; [Export] public int MaxHealth { get; set; } = 100; [Export] public int MaxSpeed { get; set;} = 300; [Export] public int MainSpeed { get; set; } = 20; [Export] public int StrafeSpeed { get; set; } = 5; [Export] public float RotationSpeed { get; set; } = 2f; [Export] public ShipType type; public Node2D LaserSpawn = null; protected int _rotationDirection; protected readonly PackedScene LaserScene = GD.Load("res://scenes/laser.tscn"); public virtual void ShootLaser() { Node2D Laser = LaserScene.Instantiate(); Laser.Position = LaserSpawn.GlobalPosition; Laser.Rotation = Rotation; EmitSignal(SignalName.LaserShot, Laser); } public void SetShipStats() { switch (type) { case ShipType.INTERCEPTOR: MaxSpeed = 450; MainSpeed = 35; StrafeSpeed = 10; RotationSpeed = 4f; MaxHealth = 75; break; case ShipType.GUARDIAN: MaxSpeed = 200; MainSpeed = 10; StrafeSpeed = 3; RotationSpeed = 1f; MaxHealth = 250; break; } } public virtual void ShipDamage(int damage) { Health -= damage; if (Health < 0){ Health = 0;} } public override void _Ready() { //ScreenSize = GetViewportRect().Size; LaserSpawn = GetNode("LaserSpawn"); } public override void _PhysicsProcess(double delta) { // Common movement logic for all ships Rotation += _rotationDirection * RotationSpeed * (float)delta; Velocity.LimitLength(MaxSpeed); MoveAndSlide(); } }