public void HandleChanges(bool Dynamic, int StepNumber) { StaticState.Changes = new LinkedList <GenericGridWorldDynamicState>( ); Unit u = StaticState.InitialDynamicState.FindUnit(0); Step Changes = StaticState.Next(StepNumber); if (Changes != null && Changes.Changes != null) { foreach (Coord c in Changes.Changes) { if (StaticState.Tiles[c.Y][c.X] is PassableTile <GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if (!(u.X == c.X && u.Y == c.Y) || StaticState.Map.ChangeList.BlockOnAgent) { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } } else if (StaticState.Tiles[c.Y][c.X] is BlockedTile <GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if (StaticState.Tiles[c.Y][c.X].LastChoke) { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new ChokeTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } else { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new PassableTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } } else if (StaticState.Tiles[c.Y][c.X] is ChokeTile <GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if (!(u.X == c.X && u.Y == c.Y) || StaticState.Map.ChangeList.BlockOnAgent) { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; newTile.LastChoke = true; StaticState.Tiles[c.Y][c.X] = newTile; } } } } foreach (var row in StaticState.Tiles) { foreach (var t in row) { var tile = t; if (!tile.BeenExplored && tile.Visible(StaticState)) { tile.BeenExplored = true; } if (Dynamic) { bool isGoal = tile.X == u.DstX && tile.Y == u.DstY || tile.X == u.X && tile.Y == u.Y; ; if (!isGoal && tile is PassableTile <GenericGridWorldStaticState, GenericGridWorldDynamicState> && gen.Next( ) % ChangeChance == 0) { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( tile.X, tile.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = tile.LastPassable; newTile.BeenExplored = tile.BeenExplored; newTile.Hits = tile.Hits; tile = newTile; StaticState.Tiles[tile.Y][tile.X] = tile; } else if (!isGoal && tile is BlockedTile <GenericGridWorldStaticState, GenericGridWorldDynamicState> && gen.Next( ) % ChangeChance == 0) { Tile <GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new PassableTile <GenericGridWorldStaticState, GenericGridWorldDynamicState>( tile.X, tile.Y, StaticState.Height, StaticState.Width); newTile.LastPassable = tile.LastPassable; newTile.BeenExplored = tile.BeenExplored; newTile.Hits = tile.Hits; tile = newTile; StaticState.Tiles[tile.Y][tile.X] = tile; } } bool nowPassable = tile.IsPassable(StaticState, false); if (tile.LastPassable != nowPassable) { tile.LastPassable = nowPassable; var ds = new GenericGridWorldDynamicState( ); var ut = u.Clone( ) as Unit; ds.hash ^= ut.GetHashCode( ); ut.X = tile.X; ut.Y = tile.Y; ds.hash ^= ut.GetHashCode( ); ds.AddWorldObject(ut); StaticState.Changes.AddFirst(ds); } } } }
public void HandleChanges( bool Dynamic, int StepNumber ) { StaticState.Changes = new LinkedList<GenericGridWorldDynamicState>( ); Unit u = StaticState.InitialDynamicState.FindUnit( 0 ); Step Changes = StaticState.Next( StepNumber ); if ( Changes != null && Changes.Changes != null ) { foreach ( Coord c in Changes.Changes ) { if ( StaticState.Tiles[c.Y][c.X] is PassableTile<GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if ( !( u.X == c.X && u.Y == c.Y ) || StaticState.Map.ChangeList.BlockOnAgent ) { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } } else if ( StaticState.Tiles[c.Y][c.X] is BlockedTile<GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if ( StaticState.Tiles[c.Y][c.X].LastChoke ) { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new ChokeTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } else { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new PassableTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; StaticState.Tiles[c.Y][c.X] = newTile; } } else if ( StaticState.Tiles[c.Y][c.X] is ChokeTile<GenericGridWorldStaticState, GenericGridWorldDynamicState> ) { if ( !( u.X == c.X && u.Y == c.Y ) || StaticState.Map.ChangeList.BlockOnAgent ) { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( c.X, c.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = StaticState.Tiles[c.Y][c.X].LastPassable; newTile.BeenExplored = StaticState.Tiles[c.Y][c.X].BeenExplored; newTile.Hits = StaticState.Tiles[c.Y][c.X].Hits; newTile.LastChoke = true; StaticState.Tiles[c.Y][c.X] = newTile; } } } } foreach ( var row in StaticState.Tiles ) { foreach ( var t in row ) { var tile = t; if ( !tile.BeenExplored && tile.Visible( StaticState ) ) { tile.BeenExplored = true; } if ( Dynamic ) { bool isGoal = tile.X == u.DstX && tile.Y == u.DstY || tile.X == u.X && tile.Y == u.Y; ; if ( !isGoal && tile is PassableTile<GenericGridWorldStaticState, GenericGridWorldDynamicState> && gen.Next( )%ChangeChance == 0 ) { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new BlockedTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( tile.X, tile.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = tile.LastPassable; newTile.BeenExplored = tile.BeenExplored; newTile.Hits = tile.Hits; tile = newTile; StaticState.Tiles[tile.Y][tile.X] = tile; } else if ( !isGoal && tile is BlockedTile<GenericGridWorldStaticState, GenericGridWorldDynamicState> && gen.Next( )%ChangeChance == 0 ) { Tile<GenericGridWorldStaticState, GenericGridWorldDynamicState> newTile = new PassableTile<GenericGridWorldStaticState, GenericGridWorldDynamicState>( tile.X, tile.Y, StaticState.Height, StaticState.Width ); newTile.LastPassable = tile.LastPassable; newTile.BeenExplored = tile.BeenExplored; newTile.Hits = tile.Hits; tile = newTile; StaticState.Tiles[tile.Y][tile.X] = tile; } } bool nowPassable = tile.IsPassable( StaticState, false ); if ( tile.LastPassable != nowPassable ) { tile.LastPassable = nowPassable; var ds = new GenericGridWorldDynamicState( ); var ut = u.Clone( ) as Unit; ds.hash ^= ut.GetHashCode( ); ut.X = tile.X; ut.Y = tile.Y; ds.hash ^= ut.GetHashCode( ); ds.AddWorldObject( ut ); StaticState.Changes.AddFirst( ds ); } } } }