Inheritance: IWorldLoaded, ITickRender, IRender, IRadarSignature, ICreatePlayers
Beispiel #1
0
        public EditorActorBrush(EditorViewportControllerWidget editorWidget, ActorInfo actor, PlayerReference owner, WorldRenderer wr)
        {
            this.editorWidget = editorWidget;
            worldRenderer = wr;
            world = wr.World;
            editorLayer = world.WorldActor.Trait<EditorActorLayer>();

            Actor = actor;
            this.owner = owner;

            preview = editorWidget.Get<ActorPreviewWidget>("DRAG_ACTOR_PREVIEW");
            preview.GetScale = () => worldRenderer.Viewport.Zoom;
            preview.IsVisible = () => editorWidget.CurrentBrush == this;

            var buildingInfo = actor.Traits.GetOrDefault<BuildingInfo>();
            if (buildingInfo != null)
            {
                locationOffset = -FootprintUtils.AdjustForBuildingSize(buildingInfo);
                previewOffset = FootprintUtils.CenterOffset(world, buildingInfo);
            }

            var td = new TypeDictionary();
            td.Add(new FacingInit(facing));
            td.Add(new TurretFacingInit(facing));
            td.Add(new OwnerInit(owner.Name));
            td.Add(new RaceInit(owner.Race));
            preview.SetPreview(actor, td);

            // The preview widget may be rendered by the higher-level code before it is ticked.
            // Force a manual tick to ensure the bounds are set correctly for this first draw.
            Tick();
        }
Beispiel #2
0
        public EditorCursorLayer(Actor self, EditorCursorLayerInfo info)
        {
            this.info   = info;
            world       = self.World;
            editorLayer = self.Trait <EditorActorLayer>();

            Type = EditorCursorType.None;
        }
Beispiel #3
0
        public EditorCopyPasteBrush(EditorViewportControllerWidget editorWidget, WorldRenderer wr)
        {
            this.editorWidget = editorWidget;
            worldRenderer = wr;

            selectionLayer = wr.World.WorldActor.Trait<EditorSelectionLayer>();
            editorLayer = wr.World.WorldActor.Trait<EditorActorLayer>();
        }
Beispiel #4
0
        public EditorDefaultBrush(EditorViewportControllerWidget editorWidget, WorldRenderer wr)
        {
            this.editorWidget = editorWidget;
            worldRenderer = wr;
            world = wr.World;

            editorLayer = world.WorldActor.Trait<EditorActorLayer>();
            resources = world.WorldActor.TraitsImplementing<ResourceType>()
                .ToDictionary(r => r.Info.ResourceType, r => r);
        }
Beispiel #5
0
        public SaveMapLogic(Widget widget, Action onExit, Map map, EditorActorLayer editorActorLayer)
        {
            var title = widget.Get<TextFieldWidget>("TITLE");
            title.Text = map.Title;

            var author = widget.Get<TextFieldWidget>("AUTHOR");
            author.Text = map.Author;

            // TODO: This should use a multi-line textfield once they exist
            var description = widget.Get<TextFieldWidget>("DESCRIPTION");
            description.Text = map.Description;

            // TODO: This should use a multi-selection dropdown once they exist
            var visibilityDropdown = widget.Get<DropDownButtonWidget>("VISIBILITY_DROPDOWN");
            {
                var mapVisibility = new List<string>(Enum.GetNames(typeof(MapVisibility)));
                Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                {
                    var item = ScrollItemWidget.Setup(template,
                        () => visibilityDropdown.Text == option,
                        () => { visibilityDropdown.Text = option; });
                    item.Get<LabelWidget>("LABEL").GetText = () => option;
                    return item;
                };

                visibilityDropdown.Text = Enum.GetName(typeof(MapVisibility), map.Visibility);
                visibilityDropdown.OnClick = () =>
                    visibilityDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, mapVisibility, setupItem);
            }

            var directoryDropdown = widget.Get<DropDownButtonWidget>("DIRECTORY_DROPDOWN");
            {
                var mapDirectories = Game.ModData.Manifest.MapFolders.Keys.Select(ff =>
                {
                    var f = Platform.UnresolvePath(ff);
                    if (f.StartsWith("~"))
                        f = f.Substring(1);

                    return f;
                }).ToList();

                Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                {
                    var item = ScrollItemWidget.Setup(template,
                        () => directoryDropdown.Text == option,
                        () => directoryDropdown.Text = option);
                    item.Get<LabelWidget>("LABEL").GetText = () => option;
                    return item;
                };

                var mapDirectory = Platform.UnresolvePath(Path.GetDirectoryName(map.Path));
                var initialDirectory = mapDirectories.FirstOrDefault(f => f == mapDirectory);

                if (initialDirectory == null)
                    initialDirectory = mapDirectories.First();

                directoryDropdown.Text = initialDirectory;
                directoryDropdown.OnClick = () =>
                    directoryDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, mapDirectories, setupItem);
            }

            var filename = widget.Get<TextFieldWidget>("FILENAME");
            filename.Text = Path.GetFileNameWithoutExtension(map.Path);

            var fileTypes = new Dictionary<string, string>()
            {
                { ".oramap", ".oramap" },
                { "(unpacked)", "" }
            };

            var typeDropdown = widget.Get<DropDownButtonWidget>("TYPE_DROPDOWN");
            {
                Func<string, ScrollItemWidget, ScrollItemWidget> setupItem = (option, template) =>
                {
                    var item = ScrollItemWidget.Setup(template,
                        () => typeDropdown.Text == option,
                        () => typeDropdown.Text = option);
                    item.Get<LabelWidget>("LABEL").GetText = () => option;
                    return item;
                };

                typeDropdown.Text = Path.GetExtension(map.Path);
                if (string.IsNullOrEmpty(typeDropdown.Text))
                    typeDropdown.Text = fileTypes.First(t => t.Value == "").Key;

                typeDropdown.OnClick = () =>
                    typeDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 210, fileTypes.Keys, setupItem);
            }

            var close = widget.Get<ButtonWidget>("BACK_BUTTON");
            close.OnClick = () => { Ui.CloseWindow(); onExit(); };

            var save = widget.Get<ButtonWidget>("SAVE_BUTTON");
            save.OnClick = () =>
            {
                if (string.IsNullOrEmpty(filename.Text))
                    return;

                map.Title = title.Text;
                map.Description = description.Text;
                map.Author = author.Text;
                map.Visibility = (MapVisibility)Enum.Parse(typeof(MapVisibility), visibilityDropdown.Text);
                map.ActorDefinitions = editorActorLayer.Save();
                map.PlayerDefinitions = editorActorLayer.Players.ToMiniYaml();
                map.RequiresMod = Game.ModData.Manifest.Mod.Id;

                var combinedPath = Platform.ResolvePath(Path.Combine(directoryDropdown.Text, filename.Text + fileTypes[typeDropdown.Text]));
                map.Save(combinedPath);

                // Update the map cache so it can be loaded without restarting the game
                Game.ModData.MapCache[map.Uid].UpdateFromMap(map, MapClassification.User);

                Console.WriteLine("Saved current map at {0}", combinedPath);
                Ui.CloseWindow();
                onExit();
            };
        }