Esempio n. 1
0
        public Ship(ShipModelType s, LocatorService ls)
        {
            _model = s;

            StatBonuses = new ShipBonusHandler();

            Debuffs = new DebuffHandler();

            switch (ShipStats.ShieldType)
            {
            case ShieldTypes.QuickRegen:
                Shields = new QuickRegenShieldHandler(ShipStats, StatBonuses, Debuffs);
                break;

            case ShieldTypes.SlowRegen:
                Shields = new SlowRegenShieldHandler(ShipStats, StatBonuses, Debuffs);
                break;

            case ShieldTypes.NoRegen:
                Shields = new NoRegenShieldHandler(ShipStats, StatBonuses, Debuffs);
                break;
            }

            RecalculateModuleBonuses();

            Cargo = new CargoHandler_ReadOnlyVM <CargoHandlerModel>(s.Cargo);


            _playerLocator = ls.PlayerLocator;
            _areaLocator   = ls.AreaLocator;
            _teamLocator   = ls.TeamLocator;
        }
Esempio n. 2
0
        public Ship(ShipStats stats, LocatorService ls)
        {
            _model   = new ShipModelType();
            PosX     = 0;
            PosY     = 0;
            Rotation = 0;
            VelY     = 0;
            VelX     = 0;
            _weapons = new List <Weapon>();
            _model.MissileLauncherSlot = 0;
            _weapons.Add(new MissileLauncher(ProjectileTypes.AmbassadorMissile));



            TimeOfLastCollision = 0;
            TimeOfLastDamage    = 0;
            DoCombatUpdates     = false;

            HealthUpdatePeriod = 500;

            _model.PlayerID     = null;
            _simulatingPlayerID = null;
            IsNPC = false;


            _playerLocator = ls.PlayerLocator;
            _areaLocator   = ls.AreaLocator;
            _teamLocator   = ls.TeamLocator;


            _model.Modules = new List <Module>();
            StatBonuses    = new ShipBonusHandler();

            Debuffs = new DebuffHandler();

            switch (stats.ShieldType)
            {
            case ShieldTypes.QuickRegen:
                Shields = new QuickRegenShieldHandler(stats, StatBonuses, Debuffs);
                break;

            case ShieldTypes.SlowRegen:
                Shields = new SlowRegenShieldHandler(stats, StatBonuses, Debuffs);
                break;

            case ShieldTypes.NoRegen:
                Shields = new NoRegenShieldHandler(stats, StatBonuses, Debuffs);
                break;
            }
            ShipStats = stats;


            _model.Cargo = new CargoHandlerModel();
            Cargo        = new CargoHandler_ReadOnlyVM <CargoHandlerModel>(_model.Cargo);
            SetHealthAndShields(stats);
        }
Esempio n. 3
0
        async Task <TradeResult> _executeTrade(ShipShipTrade t)
        {
            if (t.IsProcessed || !t.Pending)
            {
                return(TradeResult.TradeAlreadyProcessed);
            }
            t.Pending = false;
            CargoHandler_ReadOnlyVM <CargoHandlerModel> cargoA = t.ShipA.GetCargo();
            CargoHandler_ReadOnlyVM <CargoHandlerModel> cargoB = t.ShipB.GetCargo();


            float holdsAfterTrade_A = cargoA.FilledHolds - t.CargoOffered_A.FilledHolds + t.CargoOffered_B.FilledHolds;
            float holdsAfterTrade_B = cargoB.FilledHolds - t.CargoOffered_B.FilledHolds + t.CargoOffered_A.FilledHolds;

            if (holdsAfterTrade_A > cargoA.TotalHolds)
            {
                t.IsProcessed = true;
                return(TradeResult.ShipANotEnoughCargoSpace);
            }

            if (holdsAfterTrade_B > cargoB.TotalHolds)
            {
                t.IsProcessed = true;
                return(TradeResult.ShipBNotEnoughCargoSpace);
            }


            CargoTransactionSequence ts = new CargoTransactionSequence();

            foreach (var v in t.CargoOffered_A.StatefulCargo)
            {
                ts.Add(new TransactionRemoveStatefulCargo(t.ShipA, StatefulCargoTypes.Null, v.Value.Id, true));
                ts.Add(new TransactionAddStatefulCargo(t.ShipB, null, true));
            }

            foreach (var v in t.CargoOffered_B.StatefulCargo)
            {
                ts.Add(new TransactionRemoveStatefulCargo(t.ShipB, StatefulCargoTypes.Null, v.Value.Id, true));
                ts.Add(new TransactionAddStatefulCargo(t.ShipA, null, true));
            }

            foreach (var v in t.CargoOffered_A.StatelessCargo)
            {
                ts.Add(new TransactionRemoveStatelessCargo(t.ShipA, v.Key, v.Value.Quantity));
                ts.Add(new TransactionAddStatelessCargo(t.ShipB, v.Key, v.Value.Quantity, true));
            }

            foreach (var v in t.CargoOffered_B.StatelessCargo)
            {
                ts.Add(new TransactionRemoveStatelessCargo(t.ShipB, v.Key, v.Value.Quantity));
                ts.Add(new TransactionAddStatelessCargo(t.ShipA, v.Key, v.Value.Quantity, true));
            }

            _cargoSynchronizer.RequestAtomicTransactionSequence(ts);

            var res = await ts.ResultTask;


            if (res == CargoResult.Success)
            {
                t.IsProcessed = true;

                //Record the trade in the DB, fire and forget
                t.DateTime = DateTime.Now;
                _databaseManager.SaveAsync(t);
                _databaseManager.SaveAsync((ISerializable)t.ShipA);
                _databaseManager.SaveAsync((ISerializable)t.ShipB);

                return(TradeResult.Success);
            }
            else
            {
                return(TradeResult.FailedReasonUnknown);//TODO: Implement translator
            }
        }