예제 #1
0
        public SimpleShip(int fireCooldown, float shipRadius,
            double mass, double hp,
            double mainEnginePower, double secondaryEnginePower, 
            float shieldRadius, int shieldActiveTime, int shieldCooldown ) : base()
        {

            radius = shipRadius;
            FireCooldown = fireCooldown;
            IsFiring = false;
            Mass = mass;

            Hp = hp;

            MaximumMainEnginePower = mainEnginePower;
            MainEnginePower = 0;
            MainEngineDirection = EngineDirection.up;

            MaximumSecondaryEnginePower = secondaryEnginePower;
            SecondaryEnginePower = 0;
            SecondaryEngineDirection = EngineDirection.left;

            IsSecondaryEngineOn = false;
            IsMainEngineOn = false;

            Shield = new SimpleShield(shieldRadius, shieldActiveTime, shieldCooldown);
            ShipHitBox = new SimpleHitBox(this, shipRadius);

            var shieldHitBox = Shield.MainHitBox as SimpleHitBox;
            shieldHitBox.GetLinkedHitBox().Add(ShipHitBox);
            MainHitBox = shieldHitBox;

            AddSlaveObject(Shield);
            Shield.SetMasterObject(this);
        }
예제 #2
0
 public Engine(String name, EngineDirection direction = EngineDirection.Rear)
     : base(name, null)
 {
     Features        = EngineFeatures.None;
     ThrustDirection = direction;
     Power           = WorldConversions.BaseEnginePower;
     int i = (int)direction;
 }
예제 #3
0
        private static EngineTile FindTarget(EngineParserState state, EngineDirection direction, int depth)
        {
            if (depth >= 16)
            {
                return(null);
            }

            var foundTile = StateParserUtils.Raycast(state, state.Position, direction);

            if (foundTile == null)
            {
                return(null);
            }
            return(foundTile.Type.IsCameleon() ? FindTarget(state, foundTile.Type.GetDirection(), depth + 1) : foundTile);
        }
예제 #4
0
 public void StartEngine (EngineType engine, EngineDirection direction,double enginePower,DateTime now)
 {
     if (enginePower < 0) throw new Exception("Engine power is negative");
     switch(engine)
     {
         case EngineType.main : 
             {
                 if (enginePower <= MaximumMainEnginePower) MainEnginePower = enginePower;
                 else throw new Exception("Engine power is above maximum level");
                 StartMainEngineTime = now;
                 IsMainEngineOn = true;
                 MainEngineDirection = direction;
                 break;
             }
         case EngineType.secondary:
             {
                 if (enginePower <= MaximumSecondaryEnginePower) SecondaryEnginePower = enginePower;
                 else throw new Exception ("Engine power is above maximum level");
                 StartSecondaryEngineTime = now;
                 IsSecondaryEngineOn = true;
                 SecondaryEngineDirection = direction;
                 break;
             }
         default:
             {
                 throw new Exception("Not implemnted engine type");
             }
     }
 }
예제 #5
0
 public void AddPowerToEngine(EngineType engine,EngineDirection direction, double powerPercent,DateTime now)
 {
     switch (engine)
     {
         case EngineType.main:
             {
                 if(IsMainEngineOn)
                 {
                     var powerDirection = 1;
                     if (direction != MainEngineDirection) powerDirection = -1;
                     var power = MainEnginePower + powerDirection* MaximumMainEnginePower * powerPercent/100;
                     if (power > MaximumMainEnginePower) MainEnginePower = MaximumMainEnginePower;
                     else if (power <= 0) { StopEngine(engine); }
                     else MainEnginePower = power;
                 }
                 else
                 {
                     StartEnginePercent(engine, direction, powerPercent/100, now);
                 }
                 break;
             }
         case EngineType.secondary:
             {
                 if (IsSecondaryEngineOn)
                 {
                     var powerDirection = 1;
                     if (direction != SecondaryEngineDirection) powerDirection = -1;
                     var power = SecondaryEnginePower + powerDirection * MaximumSecondaryEnginePower * powerPercent / 100;
                     if (power > MaximumSecondaryEnginePower) SecondaryEnginePower = MaximumSecondaryEnginePower;
                     else if (power <= 0) {  StopEngine(engine); }
                     else SecondaryEnginePower = power;
                 }
                 else
                 {
                     StartEnginePercent(engine,direction ,powerPercent/100, now);
                 }
                 break;
             }
         default:
             {
                 throw new Exception("Not implemnted engine type");
             }
     }
 }
예제 #6
0
 public void StartEnginePercent(EngineType engine, EngineDirection direction, double engiePowerPercent ,DateTime now)
 {
     
     switch (engine)
     {
         case EngineType.main:
             {
                 StartEngine(engine, direction, MaximumMainEnginePower * engiePowerPercent,now);
                 break;
             }
         case EngineType.secondary:
             {
                 StartEngine(engine, direction, MaximumSecondaryEnginePower * engiePowerPercent,now);
                 break;
             }
         default:
             {
                 throw new Exception("Not implemnted engine type");
             }
     }
 }
        public static EngineTile Raycast(EngineParserState state, ParserPosition startPosition, EngineDirection direction)
        {
            var currentPosition = startPosition.Position;

            currentPosition = new Point(currentPosition.X + direction.X, currentPosition.Y + direction.Y);
            while (state.IsValidPosition(currentPosition))
            {
                var tile = state[currentPosition];

                if (tile.Type != EngineGlyphType.Nothing)
                {
                    return(tile);
                }

                currentPosition = new Point(currentPosition.X + direction.X, currentPosition.Y + direction.Y);
            }

            return(null);
        }