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)); }
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)); } }
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)); }
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)); } } } }
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)); }