Beispiel #1
0
        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);
                    }
                }
            }
        }
Beispiel #2
0
        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 );
              }
            }
              }
        }