Ejemplo n.º 1
0
        public async Task <IActionResult> Edit(int id, [Bind("Id,LakeId,Year,Value")] UndergroundFlow surfaceFlow)
        {
            if (id != surfaceFlow.Id)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(surfaceFlow);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UndergroundFlowExists(surfaceFlow.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(surfaceFlow));
        }
Ejemplo n.º 2
0
        private IEnumerable <SolidRouteState> GenerateUnderFlow(Func <Searchspace, IPhysicalBuilding, double> costFunction)
        {
            Vector2 nextpos  = _position + _direction.ToVector();
            var     building = new UndergroundFlow(((FlowBuilding)_building).Item, nextpos, _depth, _direction);

            building.Previous.Add(Building);
            if (_undergroundLength < 4)
            {
                yield return(new SolidRouteState(building, _cost + costFunction(_space, building), nextpos, _space.AddRoute(building), RoutingCoordinate.CoordinateType.Underflow, _depth, _direction, _undergroundLength + 1));
            }
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> Create([Bind("Id,LakeId,Year,Value")] UndergroundFlow surfaceFlow)
        {
            if (ModelState.IsValid)
            {
                _context.Add(surfaceFlow);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(surfaceFlow));
        }
Ejemplo n.º 4
0
        public IEnumerable <FluidRouteState> NextStates(Func <Searchspace, IPhysicalBuilding, double> costFunction, Building pipeToGround, Building pipe)
        {
            if (_depth == Depth.Fluid)
            {
                Vector2 nextPos = _position + _direction.ToVector();

                if (_undergroundLength < 9)
                {
                    // Continue
                    var flow = new UndergroundFlow(FlowBuilding.Item, nextPos, Depth.Fluid, _direction);
                    flow.Previous.Add(_building);
                    yield return(new FluidRouteState(flow, _cost + costFunction(_space, flow), flow.Position, _space.AddRoute(flow), flow.FlowDepth, flow.Rotation, false, _undergroundLength + 1));
                }

                // Surface
                var surface = new Pipe(FlowBuilding.Item, pipeToGround, nextPos, _direction.Invert());
                surface.Previous.Add(_building);
                yield return(new FluidRouteState(surface, _cost + costFunction(_space, surface), surface.Position, _space.AddRoute(surface), Depth.None, _direction, true));
            }
            else
            {
                if (HasJustSurfaced)
                {
                    Vector2 nextPos = _position + _direction.ToVector();
                    // Continue
                    var cont = new FlowBuilding(FlowBuilding.Item, pipe, nextPos, BuildingRotation.North);
                    cont.Previous.Add(_building);
                    yield return(new FluidRouteState(cont, _cost + costFunction(_space, cont), cont.Position, _space.AddRoute(cont)));

                    // Dive
                    var dive = new FlowBuilding(FlowBuilding.Item, pipeToGround, nextPos, _direction);
                    dive.Previous.Add(_building);
                    yield return(new FluidRouteState(dive, _cost + costFunction(_space, dive), dive.Position, _space.AddRoute(dive), Depth.Fluid, _direction));
                }
                else
                {
                    BuildingRotation[] rotations = new BuildingRotation[] { BuildingRotation.North, BuildingRotation.East, BuildingRotation.South, BuildingRotation.West };
                    foreach (var rotation in rotations)
                    {
                        Vector2 nextPos = _position + rotation.ToVector();

                        // Straight
                        var cont = new FlowBuilding(FlowBuilding.Item, pipe, nextPos, BuildingRotation.North);
                        cont.Previous.Add(_building);
                        yield return(new FluidRouteState(cont, _cost + costFunction(_space, cont), cont.Position, _space.AddRoute(cont)));

                        // Dive
                        var dive = new FlowBuilding(FlowBuilding.Item, pipeToGround, nextPos, rotation);
                        dive.Previous.Add(_building);
                        yield return(new FluidRouteState(dive, _cost + costFunction(_space, dive), dive.Position, _space.AddRoute(dive), Depth.Fluid, rotation));
                    }
                }
            }
        }
Ejemplo n.º 5
0
        public void UndergroundCollisions()
        {
            var item = new Item("test");
            var lib  = new Library();

            lib.AddItem(item);
            lib.Initialize();

            var flow   = new UndergroundFlow(new ItemAmount(item, 1), Vector2.One, Depth.Normal, BuildingRotation.South);
            var grader = new SolutionGrader();

            var space = new Searchspace(new Vector2(4, 4));

            space = space.AddRoute(flow);
            Assert.AreEqual(0, flow.CalculateCost(space, grader));

            var flow2    = new UndergroundFlow(new ItemAmount(item, 1), Vector2.One, Depth.Fast, BuildingRotation.South);
            var newSpace = space.AddRoute(flow2);

            Assert.AreEqual(0, flow.CalculateCost(newSpace, grader));

            flow2    = new UndergroundFlow(new ItemAmount(item, 1), Vector2.One, Depth.Normal, BuildingRotation.South);
            newSpace = space.AddRoute(flow2);
            Assert.IsTrue(flow.CalculateCost(newSpace, grader) > 0);

            flow2    = new UndergroundFlow(new ItemAmount(item, 1), Vector2.One, Depth.Normal, BuildingRotation.North);
            newSpace = space.AddRoute(flow2);
            Assert.IsTrue(flow.CalculateCost(newSpace, grader) > 0);

            flow2    = new UndergroundFlow(new ItemAmount(item, 1), Vector2.One, Depth.Normal, BuildingRotation.East);
            newSpace = space.AddRoute(flow2);
            Assert.AreEqual(0, flow.CalculateCost(newSpace, grader));

            var building = new PhysicalFlowBuilding(new ItemAmount(item, 1), new Building("test1"), Vector2.One, BuildingRotation.North);

            newSpace = space.AddRoute(building);
            Assert.AreEqual(0, flow.CalculateCost(newSpace, grader));
        }