Exemplo n.º 1
0
        public async Task <ActionResult <Resupply> > PostResupply(Resupply resupply)
        {
            _context.ActivityDomains.Add(resupply);
            await _context.SaveChangesAsync();

            return(CreatedAtAction("GetResupply", new { id = resupply.Id }, resupply));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> PutResupply(long id, Resupply resupply)
        {
            if (id != resupply.Id)
            {
                return(BadRequest());
            }

            _context.Entry(resupply).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ResupplyExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
Exemplo n.º 3
0
    private void Start()
    {
        var idle                 = new Idle(this);
        var moveToSupply         = new MoveToSupply(this);
        var moveToSupplyWait     = new MoveToSupplyWait(this);
        var moveToTarget         = new MoveToTarget(this);
        var moveToDock           = new MoveToDock(this);
        var requestTarget        = new RequestTarget(this, manager);
        var descendToTarget      = new DescendToTarget(this);
        var ascendFromTarget     = new AscendFromTarget(this);
        var descendToSupply      = new DescendToSupply(this);
        var descendToSupplyWait  = new DescendToSupplyWait(this);
        var ascendFromSupply     = new AscendFromSupply(this);
        var descendToDock        = new DescendToDock(this);
        var ascendToTransHeight  = new AscendToTransHeight(this);
        var waitAtSupply         = new WaitAtSupply(this);
        var alignToSupply        = new AlignToSupply(this);
        var alignToSupplyWait    = new AlignToSupplyWait(this);
        var alignToDock          = new AlignToDock(this);
        var alignToTarget        = new AlignToTarget(this);
        var resupply             = new Resupply(this);
        var buildBlock           = new BuildBlock(this);
        var navigateToDock       = new NavigateToDock(this);
        var navigateToSupply     = new NavigateToSupply(this);
        var navigateToSupplyWait = new NavigateToSupplyWait(this);
        var navigateToTarget     = new NavigateToTarget(this);

        _stateMachine.AddTransition(idle, requestTarget, IsRunning());
        _stateMachine.AddTransition(requestTarget, ascendToTransHeight, AssignedTarget());
        _stateMachine.AddTransition(requestTarget, navigateToDock, WaitForTarget());
        _stateMachine.AddTransition(navigateToDock, moveToDock, ApproxNaviTargetPos);
        _stateMachine.AddTransition(moveToDock, alignToDock, ReachedDockXZ());
        _stateMachine.AddTransition(alignToDock, descendToDock, ReachedNaviTargetRot);
        _stateMachine.AddTransition(descendToDock, idle, ReachedNaviTargetPos);
        _stateMachine.AddTransition(ascendToTransHeight, navigateToSupply, ReachedNaviPosSupplyIsCurrent());
        _stateMachine.AddTransition(ascendToTransHeight, navigateToSupplyWait, ReachedNaviPosSupplyIsWait());
        _stateMachine.AddTransition(navigateToSupply, moveToSupply, ApproxNaviTargetPos);
        _stateMachine.AddTransition(moveToSupply, alignToSupply, ReachedSupplyXZ());
        _stateMachine.AddTransition(navigateToSupplyWait, moveToSupplyWait, ApproxNaviTargetPos);
        _stateMachine.AddTransition(moveToSupplyWait, navigateToSupply, ReachedNaviPosSupplyIsCurrent());
        _stateMachine.AddTransition(moveToSupplyWait, alignToSupplyWait, ReachedNaviPosSupplyIsWait());
        _stateMachine.AddTransition(alignToSupplyWait, navigateToSupply, ReachedNaviRotSupplyIsCurrent());
        _stateMachine.AddTransition(alignToSupplyWait, descendToSupplyWait, ReachedNaviRotSupplyIsWait());
        _stateMachine.AddTransition(alignToSupply, descendToSupply, ReachedSupplyRot());
        _stateMachine.AddTransition(descendToSupplyWait, waitAtSupply, ReachedSupplyWait());
        _stateMachine.AddTransition(waitAtSupply, navigateToSupply, WaitForSupplyFinished());
        _stateMachine.AddTransition(descendToSupply, resupply, ReachedSupplyPosIsCurrent());
        _stateMachine.AddTransition(resupply, ascendFromSupply, () => true);
        _stateMachine.AddTransition(ascendFromSupply, navigateToTarget, ReachedTransHeight());
        _stateMachine.AddTransition(navigateToTarget, moveToTarget, ApproxNaviTargetPos);
        _stateMachine.AddTransition(moveToTarget, alignToTarget, ReachedTargetXZ());
        _stateMachine.AddTransition(alignToTarget, descendToTarget, ReachedTargetRot());
        _stateMachine.AddTransition(descendToTarget, buildBlock, ReachedTarget());
        _stateMachine.AddTransition(buildBlock, ascendFromTarget, () => true);
        _stateMachine.AddTransition(ascendFromTarget, requestTarget, ReachedTransHeight());
        _stateMachine.AddTransition(ascendFromTarget, navigateToDock, BatteryLow());
        _stateMachine.SetState(idle);

        Func <bool> IsRunning() => () => running && IsCharged();
        Func <bool> AssignedTarget() => () => target != null;

        Func <bool> WaitForTarget() => () =>
        target == null && Vector3.Distance(transform.position, dock.position) > PosTolerance;

        Func <bool> ReachedSupplyXZ() => () => target != null && supply != null &&
        ReachedNaviTargetPos();

        Func <bool> ReachedSupplyWait() => () => target != null && supply != null &&
        ReachedNaviTargetPos();

        Func <bool> WaitForSupplyFinished() => () => target != null && supply != null &&
        supply.IsDroneCurrent(this);

        Func <bool> ReachedTargetXZ() => () => target != null && ReachedNaviTargetPos();
        Func <bool> ReachedTargetRot() => () => target != null && ReachedNaviTargetRot();
        Func <bool> ReachedDockXZ() => () => target == null && ReachedNaviTargetPos();
        Func <bool> ReachedTarget() => () => target != null && ReachedNaviTargetPos();

        Func <bool> ReachedSupplyPosIsCurrent() => () =>
        supply != null && ReachedNaviTargetPos() && supply.IsDroneCurrent(this) &&
        Vector3.Distance(transform.position, supply.GetDroneAssignedTransform(this).position) <= PosTolerance;

        Func <bool> ReachedSupplyRot() => () => supply != null && ReachedNaviTargetRot();
        Func <bool> ReachedTransHeight() => () => Mathf.Abs(transform.position.y - TransHeight) < PosTolerance;
        Func <bool> BatteryLow() => () => ReachedTransHeight()() && _battery <= BatteryThreshold;
        Func <bool> ReachedNaviPosSupplyIsCurrent() => () => supply.IsDroneCurrent(this) && ReachedNaviTargetPos();
        Func <bool> ReachedNaviPosSupplyIsWait() => () => supply.IsDroneWaiting(this) && ReachedNaviTargetPos();
        Func <bool> ReachedNaviRotSupplyIsCurrent() => () => supply.IsDroneCurrent(this) && ReachedNaviTargetRot();
        Func <bool> ReachedNaviRotSupplyIsWait() => () => supply.IsDroneWaiting(this) && ReachedNaviTargetRot();

        bool ApproxNaviTargetPos() => Vector3.Distance(transform.position, _naviTarget.position) <= NavTolerance;
        bool ReachedNaviTargetPos() => Vector3.Distance(transform.position, _naviTarget.position) <= PosTolerance;

        bool ReachedNaviTargetRot() =>
        Mathf.Abs(transform.eulerAngles.y - _naviTarget.rotation.eulerAngles.y) <= RotTolerance;
    }
Exemplo n.º 4
0
        internal void Update()
        {
            Status.Update();
            Resupply.Update();
            ExpeditionStatus.Update(RawData.Expedition);

            var rState  = FleetState.None;
            var rSortie = KanColleGame.Current.Sortie;

            if (rSortie?.Fleet == this || Port.Fleets.CombinedFleetType != CombinedFleetType.None && rSortie?.Fleet.ID == 1 && ID == 2)
            {
                rState |= FleetState.Sortie;
            }
            else if (ExpeditionStatus.Expedition != null)
            {
                rState |= FleetState.Expedition;
            }
            else
            {
                rState |= FleetState.Idle;
            }

            Ship[] rShipsToBeRepaired = null;
            if ((rState & FleetState.Idle) != 0)
            {
                if (r_Ships.Any(r => r.Fuel.Current < r.Fuel.Maximum || r.Bullet.Current < r.Bullet.Maximum))
                {
                    rState |= FleetState.Unsupplied;
                }

                if (r_Ships.Any(r => Port.RepairDocks.Values.Any(rpDock => rpDock.Ship == r)))
                {
                    rState |= FleetState.Repairing;
                }

                if ((rState & FleetState.Repairing) == 0 && r_Ships.Any(r => (r.State & ShipState.HeavilyDamaged) != 0))
                {
                    rState |= FleetState.HeavilyDamaged;
                }

                if (r_Ships.Count > 0 && (ShipType)r_Ships[0].Info.Type.ID == ShipType.RepairShip)
                {
                    rShipsToBeRepaired = r_Ships.Take(2 + r_Ships[0].EquipedEquipment.Count(r => r.Info.Type == EquipmentType.ShipRepairFacility))
                                         .Where(r => r.DamageState != ShipDamageState.FullyHealthy && r.DamageState < ShipDamageState.ModeratelyDamaged && !Port.RepairDocks.Values.Any(rpDock => rpDock.Ship == r)).ToArray();
                    if (rShipsToBeRepaired.Length > 0)
                    {
                        rState |= FleetState.AnchorageRepair;
                    }
                }
            }

            if ((rState & FleetState.Sortie) == 0)
            {
                ConditionRegeneration.Update();
            }
            else
            {
                ConditionRegeneration.Reset();
            }

            if ((rState & FleetState.AnchorageRepair) != 0)
            {
                AnchorageRepair.Update(rShipsToBeRepaired);
            }
            else if ((State & FleetState.AnchorageRepair) != 0)
            {
                AnchorageRepair.Stop();
            }

            var rConditionType = ShipConditionType.HighMorale;

            foreach (var rShip in Ships)
            {
                if (rConditionType < rShip.ConditionType)
                {
                    rConditionType = rShip.ConditionType;
                }
            }

            switch (rConditionType)
            {
            case ShipConditionType.HighMorale:
                rState |= FleetState.HighMorale;
                break;

            case ShipConditionType.ModerateTired:
                rState |= FleetState.ModerateTired;
                break;

            case ShipConditionType.SeriouslyTired:
                rState |= FleetState.SeriouslyTired;
                break;
            }

            State = rState;
        }
Exemplo n.º 5
0
        internal void Update()
        {
            Status.Update();
            Resupply.Update();
            ExpeditionStatus.Update(RawData.Expedition);

            var rState  = FleetState.None;
            var rSortie = KanColleGame.Current.Sortie;

            if (rSortie?.Fleet == this ||
                Port.Fleets.CombinedFleetType != CombinedFleetType.None && rSortie?.Fleet.ID == 1 && ID == 2)
            {
                rState |= FleetState.Sortie;
            }
            else if (ExpeditionStatus.Expedition != null)
            {
                rState |= FleetState.Expedition;
            }
            else
            {
                rState |= FleetState.Idle;
            }

            Ship[] rShipsToBeRepaired = null;
            if ((rState & FleetState.Idle) == FleetState.Idle)
            {
                if (r_Ships.Any(r => r.Fuel.Current < r.Fuel.Maximum || r.Bullet.Current < r.Bullet.Maximum))
                {
                    rState |= FleetState.Unsupplied;
                }

                if (r_Ships.Any(r => Port.RepairDocks.Values.Any(rpDock => rpDock.Ship == r)))
                {
                    rState |= FleetState.Repairing;
                }

                if (r_Ships.Any(r => (r.State & ShipState.HeavilyDamaged) == ShipState.HeavilyDamaged))
                {
                    rState |= FleetState.HeavilyDamaged;
                }

                if (r_Ships.Count > 0 && (ShipType)r_Ships[0].Info.Type.ID == ShipType.RepairShip)
                {
                    rShipsToBeRepaired = r_Ships.Take(2 + r_Ships[0].EquipedEquipment.Count(r => r.Info.Type == EquipmentType.ShipRepairFacility))
                                         .Where(r => r.HP.Current != r.HP.Maximum && r.HP.Current / (double)r.HP.Maximum > .5 && !Port.RepairDocks.Values.Any(rpDock => rpDock.Ship == r)).ToArray();
                    if (rShipsToBeRepaired.Length > 0)
                    {
                        rState |= FleetState.AnchorageRepair;
                    }
                }
            }

            if ((rState & FleetState.Sortie) == 0)
            {
                ConditionRegeneration.Update();
            }
            else
            {
                ConditionRegeneration.Reset();
            }

            if ((rState & FleetState.AnchorageRepair) == FleetState.AnchorageRepair)
            {
                AnchorageRepair.Update(rShipsToBeRepaired);
            }
            else if ((State & FleetState.AnchorageRepair) == FleetState.AnchorageRepair)
            {
                AnchorageRepair.Stop();
            }

            State = rState;
        }