Esempio n. 1
0
        //TODO: This whole method should be removed once file loading/saving works, and replaced with a 'Demo' map.
        /// <summary>
        ///     Generates 'Demo' grid and inserts it into the map manager.
        /// </summary>
        /// <param name="mapManager">The map manager to work with.</param>
        /// <param name="defManager">The definition manager to work with.</param>
        /// <param name="gridId">The ID of the grid to generate and insert into the map manager.</param>
        private static void NewDefaultMap(IMapManager mapManager, ITileDefinitionManager defManager, int gridId)
        {
            mapManager.SuppressOnTileChanged = true;
            try
            {
                Logger.Log("Cannot find map. Generating blank map.", LogLevel.Warning);
                var floor = defManager["Floor"].TileId;
                var wall  = defManager["Wall"].TileId;

                Debug.Assert(floor > 0);
                Debug.Assert(wall > 0);

                var grid = mapManager.GetGrid(gridId) ?? mapManager.CreateGrid(gridId);

                for (var y = -32; y <= 32; ++y)
                {
                    for (var x = -32; x <= 32; ++x)
                    {
                        if (Math.Abs(x) == 32 || Math.Abs(y) == 32 || Math.Abs(x) == 5 && Math.Abs(y) < 5 || Math.Abs(y) == 7 && Math.Abs(x) < 3)
                        {
                            grid.SetTile(x, y, new Tile(wall));
                        }
                        else
                        {
                            grid.SetTile(x, y, new Tile(floor));
                        }
                    }
                }
            }
            finally
            {
                mapManager.SuppressOnTileChanged = false;
            }
        }
Esempio n. 2
0
        public static void DeserializeGrid(IMapManagerInternal mapMan, MapId mapId, ref GridId?gridId, YamlMappingNode info,
                                           YamlSequenceNode chunks, IReadOnlyDictionary <ushort, string> tileDefMapping,
                                           ITileDefinitionManager tileDefinitionManager)
        {
            ushort csz  = 0;
            ushort tsz  = 0;
            float  sgsz = 0.0f;

            foreach (var kvInfo in info)
            {
                var key = kvInfo.Key.ToString();
                var val = kvInfo.Value.ToString();
                if (key == "chunksize")
                {
                    csz = ushort.Parse(val);
                }
                else if (key == "tilesize")
                {
                    tsz = ushort.Parse(val);
                }
                else if (key == "snapsize")
                {
                    sgsz = float.Parse(val);
                }
            }

            var grid = mapMan.CreateGridNoEntity(mapId, gridId);

            gridId = grid.Index;

            foreach (var chunkNode in chunks.Cast <YamlMappingNode>())
            {
                DeserializeChunk(mapMan, grid, chunkNode, tileDefMapping, tileDefinitionManager);
            }
        }
Esempio n. 3
0
        private Dictionary <string, Image> GetTileImages(
            ITileDefinitionManager tileDefinitionManager,
            IResourceCache resourceCache,
            int tileSize)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var images = new Dictionary <string, Image>();

            foreach (var definition in tileDefinitionManager)
            {
                var sprite = definition.SpriteName;

                if (string.IsNullOrEmpty(sprite))
                {
                    continue;
                }

                using var stream = resourceCache.ContentFileRead($"{TilesPath}{sprite}.png");
                Image tileImage = Image.Load <Rgba32>(stream);

                if (tileImage.Width != tileSize || tileImage.Height != tileSize)
                {
                    throw new NotSupportedException($"Unable to use tiles with a dimension other than {tileSize}x{tileSize}.");
                }

                images[sprite] = tileImage;
            }

            Console.WriteLine($"Indexed all tile images in {(int) stopwatch.Elapsed.TotalMilliseconds} ms");

            return(images);
        }
Esempio n. 4
0
            public MapContext(IMapManager maps, ITileDefinitionManager tileDefs, IServerEntityManagerInternal entities, IPauseManager pauseManager)
            {
                _mapManager            = maps;
                _tileDefinitionManager = tileDefs;
                _serverEntityManager   = entities;
                _pauseManager          = pauseManager;

                RootNode = new YamlMappingNode();
            }
Esempio n. 5
0
            public MapContext(IMapManager maps, ITileDefinitionManager tileDefs, IServerEntityManagerInternal entities, IPauseManager pauseManager, YamlMappingNode node, IMap targetMap)
            {
                _mapManager            = maps;
                _tileDefinitionManager = tileDefs;
                _serverEntityManager   = entities;
                _pauseManager          = pauseManager;

                RootNode  = node;
                TargetMap = targetMap;
            }
Esempio n. 6
0
            public MapContext(IMapManagerInternal maps, ITileDefinitionManager tileDefs, IServerEntityManagerInternal entities, IPauseManager pauseManager, IComponentFactory componentFactory, IComponentManager componentManager)
            {
                _mapManager            = maps;
                _tileDefinitionManager = tileDefs;
                _serverEntityManager   = entities;
                _pauseManager          = pauseManager;
                _componentFactory      = componentFactory;
                _componentManager      = componentManager;

                RootNode = new YamlMappingNode();
            }
        public TileSpawnWindow(ITileDefinitionManager tileDefinitionManager, IPlacementManager placementManager,
                               IResourceCache resourceCache)
        {
            __tileDefinitionManager = tileDefinitionManager;
            _placementManager       = placementManager;
            _resourceCache          = resourceCache;

            PerformLayout();

            Title = "Place Tiles";
        }
Esempio n. 8
0
            public MapContext(IMapManagerInternal maps, ITileDefinitionManager tileDefs, IServerEntityManagerInternal entities,
                              IPauseManager pauseManager, IComponentManager componentManager, IPrototypeManager prototypeManager, YamlMappingNode node, MapId targetMapId)
            {
                _mapManager            = maps;
                _tileDefinitionManager = tileDefs;
                _serverEntityManager   = entities;
                _pauseManager          = pauseManager;
                _componentManager      = componentManager;

                RootNode          = node;
                TargetMap         = targetMapId;
                _prototypeManager = prototypeManager;
            }
        public EscapeMenu(IClientConsole console,
                          ITileDefinitionManager tileDefinitionManager,
                          IPlacementManager placementManager,
                          IPrototypeManager prototypeManager,
                          IResourceCache resourceCache,
                          IConfigurationManager configSystem)
        {
            _configSystem           = configSystem;
            _console                = console;
            __tileDefinitionManager = tileDefinitionManager;
            _placementManager       = placementManager;
            _prototypeManager       = prototypeManager;
            _resourceCache          = resourceCache;

            PerformLayout();
        }
Esempio n. 10
0
        public EscapeMenu(IClientConsole console,
                          ITileDefinitionManager tileDefinitionManager,
                          IPlacementManager placementManager,
                          IPrototypeManager prototypeManager,
                          IResourceCache resourceCache,
                          IConfigurationManager configSystem, ILocalizationManager localizationManager)
        {
            _configSystem           = configSystem;
            _localizationManager    = localizationManager;
            _console                = console;
            __tileDefinitionManager = tileDefinitionManager;
            _placementManager       = placementManager;
            _prototypeManager       = prototypeManager;
            _resourceCache          = resourceCache;

            IoCManager.InjectDependencies(this);

            PerformLayout();
        }
Esempio n. 11
0
        private Dictionary <string, List <Image> > GetTileImages(
            ITileDefinitionManager tileDefinitionManager,
            IResourceCache resourceCache,
            int tileSize)
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var images = new Dictionary <string, List <Image> >();

            foreach (var definition in tileDefinitionManager)
            {
                var sprite = definition.SpriteName;
                images[sprite] = new List <Image>(definition.Variants);

                if (string.IsNullOrEmpty(sprite))
                {
                    continue;
                }

                using var stream = resourceCache.ContentFileRead($"{TilesPath}{sprite}.png");
                Image tileSheet = Image.Load <Rgba32>(stream);

                if (tileSheet.Width != tileSize * definition.Variants || tileSheet.Height != tileSize)
                {
                    throw new NotSupportedException($"Unable to use tiles with a dimension other than {tileSize}x{tileSize}.");
                }

                for (var i = 0; i < definition.Variants; i++)
                {
                    var tileImage = tileSheet.Clone(o => o.Crop(new Rectangle(tileSize * i, 0, 32, 32)));
                    images[sprite].Add(tileImage);
                }
            }

            Console.WriteLine($"Indexed all tile images in {(int) stopwatch.Elapsed.TotalMilliseconds} ms");

            return(images);
        }
Esempio n. 12
0
        public TileSpawnWindow(ITileDefinitionManager tileDefinitionManager, IPlacementManager placementManager,
                               IResourceCache resourceCache)
        {
            __tileDefinitionManager = tileDefinitionManager;
            _placementManager       = placementManager;
            _resourceCache          = resourceCache;

            var vBox = new VBoxContainer();

            Contents.AddChild(vBox);
            var hBox = new HBoxContainer();

            vBox.AddChild(hBox);
            SearchBar = new LineEdit {
                PlaceHolder = "Search", SizeFlagsHorizontal = SizeFlags.FillExpand
            };
            SearchBar.OnTextChanged += OnSearchBarTextChanged;
            hBox.AddChild(SearchBar);

            ClearButton = new Button {
                Text = "Clear"
            };
            ClearButton.OnPressed += OnClearButtonPressed;
            hBox.AddChild(ClearButton);

            TileList = new ItemList {
                SizeFlagsVertical = SizeFlags.FillExpand
            };
            TileList.OnItemSelected   += TileListOnOnItemSelected;
            TileList.OnItemDeselected += TileListOnOnItemDeselected;
            vBox.AddChild(TileList);

            BuildTileList();

            _placementManager.PlacementChanged += OnPlacementCanceled;

            Title = "Place Tiles";
            SearchBar.GrabKeyboardFocus();
        }
Esempio n. 13
0
        public static void DeserializeChunk(IMapManager mapMan, IMapGridInternal grid,
                                            YamlMappingNode chunkData,
                                            IReadOnlyDictionary <ushort, string> tileDefMapping,
                                            ITileDefinitionManager tileDefinitionManager)
        {
            var indNode  = chunkData["ind"];
            var tileNode = chunkData["tiles"];

            var(chunkOffsetX, chunkOffsetY) = indNode.AsVector2i();
            var tileBytes = Convert.FromBase64String(tileNode.ToString());

            using var stream = new MemoryStream(tileBytes);
            using var reader = new BinaryReader(stream);

            mapMan.SuppressOnTileChanged = true;

            var chunk = grid.GetChunk(chunkOffsetX, chunkOffsetY);

            chunk.SuppressCollisionRegeneration = true;

            for (ushort y = 0; y < grid.ChunkSize; y++)
            {
                for (ushort x = 0; x < grid.ChunkSize; x++)
                {
                    var id      = reader.ReadUInt16();
                    var flags   = (TileRenderFlag)reader.ReadByte();
                    var variant = reader.ReadByte();

                    var defName = tileDefMapping[id];
                    id = tileDefinitionManager[defName].TileId;

                    var tile = new Tile(id, flags, variant);
                    chunk.SetTile(x, y, tile);
                }
            }

            chunk.SuppressCollisionRegeneration = false;
            mapMan.SuppressOnTileChanged        = false;
        }
        public EscapeMenu(IClientConsole console,
                          ITileDefinitionManager tileDefinitionManager,
                          IPlacementManager placementManager,
                          IPrototypeManager prototypeManager,
                          IResourceCache resourceCache,
                          IConfigurationManager configSystem, ILocalizationManager localizationManager)
        {
            _configSystem           = configSystem;
            _localizationManager    = localizationManager;
            _console                = console;
            __tileDefinitionManager = tileDefinitionManager;
            _placementManager       = placementManager;
            _prototypeManager       = prototypeManager;
            _resourceCache          = resourceCache;

            IoCManager.InjectDependencies(this);

            _sandboxManager.AllowedChanged      += AllowedChanged;
            _conGroupController.ConGroupUpdated += UpdateSpawnButtonStates;

            PerformLayout();

            UpdateSpawnButtonStates();
        }
Esempio n. 15
0
        public static MapGrid DeserializeGrid(IMapManagerInternal mapMan, MapId mapId, YamlMappingNode info,
                                              YamlSequenceNode chunks, IReadOnlyDictionary <ushort, string> tileDefMapping,
                                              ITileDefinitionManager tileDefinitionManager)
        {
            ushort csz  = 0;
            ushort tsz  = 0;
            float  sgsz = 0.0f;

            foreach (var kvInfo in info)
            {
                var key = kvInfo.Key.ToString();
                var val = kvInfo.Value.ToString();
                if (key == "chunksize")
                {
                    csz = ushort.Parse(val);
                }
                else if (key == "tilesize")
                {
                    tsz = ushort.Parse(val);
                }
                else if (key == "snapsize")
                {
                    sgsz = float.Parse(val, CultureInfo.InvariantCulture);
                }
            }

            //TODO: Pass in options
            var grid = mapMan.CreateUnboundGrid(mapId);

            foreach (var chunkNode in chunks.Cast <YamlMappingNode>())
            {
                DeserializeChunk(mapMan, grid, chunkNode, tileDefMapping, tileDefinitionManager);
            }

            return(grid);
        }
Esempio n. 16
0
 public TilePainter(ClientIntegrationInstance client, ServerIntegrationInstance server)
 {
     _sTileDefinitionManager = server.ResolveDependency <ITileDefinitionManager>();
     _cResourceCache         = client.ResolveDependency <IResourceCache>();
 }
Esempio n. 17
0
 public void Register(ITileDefinitionManager tileDefinitionManager)
 {
     _tileId = tileDefinitionManager.Register(this);
 }
Esempio n. 18
0
 private static Vector2 CalculateMovement(ITileDefinitionManager tileDefinitionManager, IMapManager mapManager, PhysicsComponent velocity, float frameTime, IEntity entity)
 {
     if (velocity.Deleted)
     {
         // Help crashes.
         return(default);
Esempio n. 19
0
        private static void HandleMovement(IMapManager mapManager, ITileDefinitionManager tileDefinitionManager, IEntity entity, float frameTime)
        {
            if (entity.Deleted)
            {
                // Ugh let's hope this fixes the crashes.
                return;
            }

            var velocity = entity.GetComponent <PhysicsComponent>();

            if (velocity.DidMovementCalculations)
            {
                velocity.DidMovementCalculations = false;
                return;
            }

            if (velocity.AngularVelocity == 0 && velocity.LinearVelocity == Vector2.Zero)
            {
                return;
            }

            var transform = entity.Transform;

            if (ContainerHelpers.IsInContainer(transform.Owner))
            {
                transform.Parent.Owner.SendMessage(transform, new RelayMovementEntityMessage(entity));
                velocity.LinearVelocity = Vector2.Zero;
                return;
            }

            var     velocityConsumers = velocity.GetVelocityConsumers();
            var     initialMovement   = velocity.LinearVelocity;
            int     velocityConsumerCount;
            float   totalMass;
            Vector2 lowestMovement;
            var     tile =
                mapManager.GetGrid(entity.Transform.GridID).GetTileRef(entity.Transform.GridPosition).Tile;
            bool hasGravity = mapManager.GetGrid(entity.Transform.GridID).HasGravity&& !tile.IsEmpty;

            do
            {
                velocityConsumerCount = velocityConsumers.Count;
                totalMass             = 0;
                lowestMovement        = initialMovement;
                var   copy          = new List <Vector2>(velocityConsumers.Count);
                float totalFriction = 0;
                foreach (var consumer in velocityConsumers)
                {
                    var movement = lowestMovement;
                    totalMass += consumer.Mass;
                    if (hasGravity)
                    {
                        totalFriction += GetFriction(tileDefinitionManager, mapManager, consumer.Owner);
                        movement      *= velocity.Mass / (totalMass != 0 ? totalMass + (totalMass * totalFriction) : 1);
                    }
                    consumer.AngularVelocity = velocity.AngularVelocity;
                    consumer.LinearVelocity  = movement;
                    copy.Add(CalculateMovement(tileDefinitionManager, mapManager, consumer, frameTime, consumer.Owner) / frameTime);
                }

                copy.Sort(LengthComparer);
                lowestMovement    = copy[0];
                velocityConsumers = velocity.GetVelocityConsumers();
            } while (velocityConsumers.Count != velocityConsumerCount);

            velocity.ClearVelocityConsumers();

            foreach (var consumer in velocityConsumers)
            {
                consumer.LinearVelocity          = lowestMovement;
                consumer.DidMovementCalculations = true;
            }

            velocity.DidMovementCalculations = false;
        }
        public static void DeserializeGrid(IMapManager mapMan, IMap map, ref GridId?gridId, YamlMappingNode info, YamlSequenceNode chunks, IReadOnlyDictionary <ushort, string> tileDefMapping, ITileDefinitionManager tileDefinitionManager)
        {
            ushort csz      = 0;
            ushort tsz      = 0;
            float  sgsz     = 0.0f;
            var    worldPos = Vector2.Zero;

            foreach (var kvInfo in info)
            {
                var key = kvInfo.Key.ToString();
                var val = kvInfo.Value.ToString();
                if (key == "chunksize")
                {
                    csz = ushort.Parse(val);
                }
                else if (key == "tilesize")
                {
                    tsz = ushort.Parse(val);
                }
                else if (key == "snapsize")
                {
                    sgsz = float.Parse(val);
                }
                else if (key == "worldpos")
                {
                    worldPos = kvInfo.Value.AsVector2();
                }
            }

            var grid = map.CreateGrid(gridId, csz, sgsz);

            gridId = grid.Index;

            foreach (YamlMappingNode chunkNode in chunks.Cast <YamlMappingNode>())
            {
                DeserializeChunk(mapMan, grid, chunkNode, tileDefMapping, tileDefinitionManager);
            }
        }
Esempio n. 21
0
        private static void DeserializeChunk(IMapManager mapMan, IMapGrid grid, YamlMappingNode chunk, IReadOnlyDictionary <ushort, string> tileDefMapping, ITileDefinitionManager tileDefinitionManager)
        {
            var indNode  = chunk["ind"];
            var tileNode = chunk["tiles"];

            var(chunkOffsetX, chunkOffsetY) = indNode.AsVector2i() * grid.ChunkSize;
            var tileBytes = Convert.FromBase64String(tileNode.ToString());

            using (var stream = new MemoryStream(tileBytes))
                using (var reader = new BinaryReader(stream))
                {
                    mapMan.SuppressOnTileChanged = true;

                    for (var y = 0; y < grid.ChunkSize; y++)
                    {
                        for (var x = 0; x < grid.ChunkSize; x++)
                        {
                            var id   = reader.ReadUInt16();
                            var data = reader.ReadUInt16();

                            var defName = tileDefMapping[id];
                            id = tileDefinitionManager[defName].TileId;

                            var tile = new Tile(id, data);
                            grid.SetTile(new MapIndices(chunkOffsetX + x, chunkOffsetY + y), tile);
                        }
                    }

                    mapMan.SuppressOnTileChanged = false;
                }
        }