public static MapData Create(int seed, TextureQueue textureQueue) { GC.KeepAlive(textureQueue); // SHUT UP ABOUT UNUSED PARAMETER!! var random = new Random(seed); CellBoard geometryBoard = GenerateGeometryBoard(random); (ConnectedArea playableSpace, Size boardSize) = geometryBoard.TrimToLargestDeadConnectedArea(); var internalDistances = playableSpace.DetermineInteriorEdgeDistance(Neighborhood.Moore); var sideDefCache = new ModelSequence <SideDef, SideDef>(s => s); // Seems silly, but what should be abstracted about it? var vertexCache = new ModelSequence <LatticePoint, Vertex>(ConvertToVertex); var sectorCache = new ModelSequence <SectorDescription, Sector>(ConvertToSector); var lineCache = new ModelSequence <LineDescription, LineDef>(ld => ConvertToLineDef(ld, sectorCache, sideDefCache)); var edges = GetEdges(boardSize, internalDistances); DrawEdges(edges, vertexCache, lineCache); var playerLogicalSpot = FindPlayerSpot(geometryBoard); return(new MapData( NameSpace: "Doom", LineDefs: lineCache.GetDefinitions().ToImmutableArray(), SideDefs: sideDefCache.GetDefinitions().ToImmutableArray(), Vertices: vertexCache.GetDefinitions().ToImmutableArray(), Sectors: sectorCache.GetDefinitions().ToImmutableArray(), Things: ImmutableArray.Create( Actor.Player1Start.MakeThing( x: playerLogicalSpot.X * LogicalUnitSize + LogicalUnitSize / 2, y: playerLogicalSpot.Y * LogicalUnitSize + LogicalUnitSize / 2, angle: 90)))); }
public void When_Ticked_then_Task_Logs_Tick_with_Debugger() { var modelSequence = new ModelSequence(null, new ModelOfAction <MyAction>(null), new ModelOfAction <MyAction>(null)); var executor = BTExecutorFactory.CreateBTExecutor(modelSequence); executor.Tick(); executor.Tick(); mockDebugger.Verify(m => m.LogTick(It.IsAny <MyAction>()), Times.Exactly(1)); }
public void When_running_then_one_tickable() { var modelSequence = new ModelSequence(null, new ModelOfAction <MyAction>(null), new ModelOfAction <MyAction>(null)); var executor = BTExecutorFactory.CreateBTExecutor(modelSequence); executor.Tick(); executor.Tick(); Assert.AreEqual(1, executor.TickableTasks.Count); }
public void When_failed_then_return() { var myfailingAction = new ModelOfAction <MyAction>(null); var modelSequence = new ModelSequence(null, myfailingAction, new ModelOfAction <MyAction>(null)); var executor = BTExecutorFactory.CreateBTExecutor(modelSequence); executor.Tick(); myfailingAction.Action.ReturnStatusForInternalTick = Status.Failure; executor.Tick(); executor.Tick(); Assert.AreEqual(Status.Failure, executor.GetStatus()); }
static (ImmutableArray <MapSquare>, ImmutableArray <Sector>, ImmutableArray <Tile>) CreateGeometry( Size size, ConnectedArea cave, CellBoard alternateFloor, CellBoard alternateCeiling, LightMap floorLight, LightMap ceilingLight, TextureQueue textureQueue, string texturePrefix) { var planeMap = new Canvas(size); double minLight = 0.2; double darkStep = (1 - minLight) / ceilingLight.Range.DarkLevels; double maxLight = 1.1; double lightStep = (maxLight - 1) / ceilingLight.Range.LightLevels; double GetAlpha(int light) => light switch { 0 => 0, int pos when pos > 0 => pos * lightStep, int neg when neg < 0 => - neg * darkStep, _ => throw new InvalidOperationException("Impossible") }; string GetTextureName(Corners corners, int light, bool isEastWest = false) { string name = $"t{(int)corners:D2}{light:+#;-#;#}{(isEastWest ? "dark" : "")}"; var patches = ImmutableArray.CreateBuilder <Patch>(); if (light > 0) { patches.Add( new Patch( $"{texturePrefix}{(int)corners:D2}", 0, 0, Blend: new ColorBlend("FFFFFF", GetAlpha(light)))); } else if (light < 0) { patches.Add( new Patch( $"{texturePrefix}{(int)corners:D2}", 0, 0, Blend: new ColorBlend("000000", GetAlpha(light)))); } else { patches.Add( new Patch( $"{texturePrefix}{(int)corners:D2}", 0, 0)); } if (isEastWest) { patches.Add( new Patch( $"{texturePrefix}{(int)corners:D2}", 0, 0, Blend: new ColorBlend("000000"), Style: RenderStyle.Translucent, Alpha: 0.075)); } textureQueue.Add(new CompositeTexture(name, 256, 256, patches.ToImmutable(), XScale: 4, YScale: 4)); return(name); } Corners GetCorners(CellBoard board, Position pos) => Corner.CreateFromUpperLeft( upperLeft: pos, on: p => board[p] == CellType.Dead); Corners GetSideCorners(Position left, Position right) => Corner.Create( topLeft: alternateCeiling[left] == CellType.Dead, topRight: alternateCeiling[right] == CellType.Dead, bottomLeft: alternateFloor[left] == CellType.Dead, bottomRight: alternateFloor[right] == CellType.Dead ); int GetSideLight(Position p) => (ceilingLight[p] + floorLight[p]) / 2; var sectorSequence = new ModelSequence <SectorDescription, Sector>(description => new Sector( TextureCeiling: GetTextureName(description.Ceiling, description.CeilingLight), TextureFloor: GetTextureName(description.Floor, description.FloorLight))); var tileSequence = new ModelSequence <TileDescription, Tile>(description => new Tile( TextureEast: GetTextureName(description.EastCorners, description.EastLight, isEastWest: true), TextureNorth: GetTextureName(description.NorthCorners, description.NorthLight), TextureWest: GetTextureName(description.WestCorners, description.WestLight, isEastWest: true), TextureSouth: GetTextureName(description.SouthCorners, description.SouthLight), TextureOverhead: GetTextureName(description.FloorCorners, 0))); for (int y = 0; y < size.Height; y++) { for (int x = 0; x < size.Width; x++) { var pos = new Position(x, y); int tileId = -1; if (!cave.Contains(pos)) { tileId = tileSequence.GetIndex(new TileDescription( NorthCorners: GetSideCorners(left: pos + Offset.Right, right: pos), EastCorners: GetSideCorners(left: pos + Offset.DownAndRight, right: pos + Offset.Right), SouthCorners: GetSideCorners(left: pos + Offset.Down, right: pos + Offset.DownAndRight), WestCorners: GetSideCorners(left: pos, right: pos + Offset.Down), FloorCorners: GetCorners(alternateFloor, pos), NorthLight: GetSideLight(pos + Offset.Up), EastLight: GetSideLight(pos + Offset.Right), SouthLight: GetSideLight(pos + Offset.Down), WestLight: GetSideLight(pos + Offset.Left))); } int sectorId = sectorSequence.GetIndex(new SectorDescription( Floor: GetCorners(alternateFloor, pos), Ceiling: GetCorners(alternateCeiling, pos), FloorLight: floorLight[pos], CeilingLight: ceilingLight[pos])); planeMap.Set(x, y, tile: tileId, sector: sectorId, zone: 0); } } return( planeMap.ToPlaneMap(), sectorSequence.GetDefinitions().ToImmutableArray(), tileSequence.GetDefinitions().ToImmutableArray()); }
/** * Creates an ExecutionSequence that is able to run a ModelSequence task and * that is managed by a BTExecutor. * * @param modelTask * the ModelSequence that this ExecutionSequence is going to run. * @param executor * the BTExecutor in charge of running this ExecutionSequence. * @param parent * the parent ExecutionTask of this task. */ public ExecutionSequence(ModelSequence modelTask, BTExecutor executor, ExecutionTask parent) : base(modelTask, executor, parent) { }