예제 #1
0
        public bool Select_NextNamed()
        {
            bool           changed = false;
            MapObjectNamed toBeSelected = null, cur = null;

            MapObjectNamed[] selectedObjects = GetSelectionNamed();
            int i;

            if (SelectionNameless != null)
            {
                changed           = true;
                SelectionNameless = null;
            }

            if (selectedObjects.Count() == 0)
            {
                if (NamedObjects.Count == 0)
                {
                    return(changed);
                }
                NamedObjects[0].Selected = true;
                return(true);
            }

            if (selectedObjects.Count() == NamedObjects.Count)
            {
                if (NamedObjects.Count == 1)
                {
                    return(changed);
                }
                for (i = NamedObjects.Count - 1; i >= 0; i--)
                {
                    NamedObjects[i].Selected = false;
                }
                return(Select_NextNamed());
            }

            i = 0;
            bool foundSelected = false;

            while (toBeSelected == null)
            {
                cur = NamedObjects[i];
                if (!cur.Selected && foundSelected)
                {
                    toBeSelected = cur;
                }
                if (selectedObjects.Contains(cur))
                {
                    foundSelected = true;
                }
                i = (i + 1) % NamedObjects.Count;
            }
            for (i = NamedObjects.Count - 1; i >= 0; i--)
            {
                NamedObjects[i].Selected = false;
            }
            toBeSelected.Selected = true;
            return(true);
        }
예제 #2
0
 private void RemoveNamedObject(MapObjectNamed item)
 {
     if (item.Imported)
     {
         int j = 0;
         for (int i = 0; i < NamedObjects.Count && NamedObjects[i] != item; i++)
         {
             j += NamedObjects[i].Imported ? 1 : 0;
         }
         NamedIdList.RemoveAt(j);
     }
     NamedObjects.Remove(item);
 }
예제 #3
0
        public bool Select_AtPoint(int x, int z, int pixelsInOne, double y_scale = 0.0, bool additive = false, bool removative = false)
        {
            List <MapObjectNamed> objectsSelectedUnderCursor    = new List <MapObjectNamed>();
            List <MapObjectNamed> objectsUnderCursor            = new List <MapObjectNamed>();
            List <MapObjectNamed> objectsSelectedNotUnderCursor = new List <MapObjectNamed>();
            int  i;
            bool changed = false;

            if (_selectionNameless != null)
            {
                changed            = true;
                _selectionNameless = null;
            }

            foreach (MapObjectNamed item in NamedObjects)
            {
                if ((Math.Sqrt(Math.Pow(item.Coordinates.X_Scr - x, 2) + Math.Pow(item.Coordinates.Z_Scr - z, 2)) < item._selectionSize * (item._selectionAbsolute ? 1 : pixelsInOne)) ||
                    (Math.Sqrt(Math.Pow(item.Coordinates.X_Scr - x, 2) + Math.Pow(item.Coordinates.Z_Scr - item.Coordinates.Y_Scr * y_scale - z, 2)) < item._selectionSize * (item._selectionAbsolute ? 1 : pixelsInOne)))
                {
                    objectsUnderCursor.Add(item);
                    if (item.Selected)
                    {
                        objectsSelectedUnderCursor.Add(item);
                    }
                }
                else
                {
                    if (item.Selected)
                    {
                        objectsSelectedNotUnderCursor.Add(item);
                    }
                }
            }

            if (additive)
            {
                //if there are objects under cursor that are not selected and those that are => select them in usual order
                if (objectsUnderCursor.Count > objectsSelectedUnderCursor.Count && objectsSelectedUnderCursor.Count > 0)
                {
                    MapObjectNamed toBeSelected = null, cur = null;
                    i = 0;
                    bool foundSelected = false;
                    while (toBeSelected == null)
                    {
                        cur = objectsUnderCursor[i];
                        if (!cur.Selected && foundSelected)
                        {
                            toBeSelected = cur;
                        }
                        if (objectsSelectedUnderCursor.Contains(cur))
                        {
                            foundSelected = true;
                        }
                        i = (i + 1) % objectsUnderCursor.Count;
                    }
                    toBeSelected.Selected = true;
                    return(true);
                }

                //if there are objects under cursor that are not selected and none under cursor are selected => select first from the list
                if (objectsUnderCursor.Count > 0 && objectsSelectedUnderCursor.Count == 0)
                {
                    objectsUnderCursor[0].Selected = true;
                    return(true);
                }

                return(changed);
            }

            if (removative)
            {
                if (objectsSelectedUnderCursor.Count > 0)
                {
                    objectsSelectedUnderCursor[0].Selected = false;
                    return(true);
                }

                return(changed);
            }

            //If more than one selected total and at least one selected under cursor => deselect everything and try again
            if (objectsSelectedUnderCursor.Count + objectsSelectedNotUnderCursor.Count > 1 && objectsSelectedUnderCursor.Count > 0)
            {
                for (i = NamedObjects.Count - 1; i >= 0; i--)
                {
                    NamedObjects[i].Selected = false;
                }
                return(Select_AtPoint(x, z, pixelsInOne));
            }

            //If there is something to select under cursor and nothing is selected there => just select first (and deselect everything else)
            if (objectsUnderCursor.Count > 0 && objectsSelectedUnderCursor.Count == 0)
            {
                for (i = NamedObjects.Count - 1; i >= 0; i--)
                {
                    NamedObjects[i].Selected = false;
                }
                objectsUnderCursor[0].Selected = true;
                return(true);
            }

            //If only one object under cursor and its already selected => do nothing, let it remain selected
            if (objectsUnderCursor.Count == 1 && objectsSelectedUnderCursor.Count == 1)
            {
                return(changed);
            }

            //If there is something to select under cursor but something is already selected there = >  we will select the next unselected after a selected one
            if (objectsUnderCursor.Count > 0 && objectsSelectedUnderCursor.Count > 0)
            {
                MapObjectNamed toBeSelected = null, cur = null;
                i = 0;
                bool foundSelected = false;
                while (toBeSelected == null)
                {
                    cur = objectsUnderCursor[i];
                    if (!cur.Selected && foundSelected)
                    {
                        toBeSelected = cur;
                    }
                    if (objectsSelectedUnderCursor.Contains(cur))
                    {
                        foundSelected = true;
                    }
                    i = (i + 1) % objectsUnderCursor.Count;
                }
                for (i = NamedObjects.Count - 1; i >= 0; i--)
                {
                    NamedObjects[i].Selected = false;
                }
                toBeSelected.Selected = true;
                return(true);
            }

            //If there is nothing to select under cursor but something selected elsewhere - clear it
            if (objectsSelectedNotUnderCursor.Count > 0)
            {
                for (i = NamedObjects.Count - 1; i >= 0; i--)
                {
                    NamedObjects[i].Selected = false;
                }
                return(true);
            }

            //If nothing is or was selected
            if (objectsSelectedNotUnderCursor.Count == 0 && objectsUnderCursor.Count == 0)
            {
                return(changed);
            }

            throw new Exception("Select_AtPoint reached the end in normal mode! This means an error in function's logic.");
            //return false;
        }
예제 #4
0
        public object AddObject(string type, int posX = 0, int posY = 0, int posZ = 0, int angle = 0, bool makeSelected = false)
        {
            MapObjectNamed    mo  = null;
            MapObjectNameless nmo = null;

            switch (type)
            {
            case "station":
                mo = new MapObjectNamed_station(posX, posY, posZ, makeSelected, angle);
                break;

            case "neutral":
                mo = new MapObjectNamed_neutral(posX, posY, posZ, makeSelected, angle);
                break;

            case "player":
                mo = new MapObjectNamed_player(posX, posY, posZ, makeSelected, angle);
                break;

            case "monster":
                mo = new MapObjectNamed_monster(posX, posY, posZ, makeSelected, angle);
                break;

            case "Anomaly":
                mo = new MapObjectNamed_Anomaly(posX, posY, posZ, "", makeSelected);
                break;

            case "blackHole":
                mo = new MapObjectNamed_blackHole(posX, posY, posZ, "", makeSelected);
                break;

            case "enemy":
                mo = new MapObjectNamed_enemy(posX, posY, posZ, makeSelected, angle);
                break;

            case "genericMesh":
                mo = new MapObjectNamed_genericMesh(posX, posY, posZ, makeSelected, angle);
                break;

            case "whale":
                mo = new MapObjectNamed_whale(posX, posY, posZ, makeSelected, angle);
                break;

            case "nameless":
                nmo = new MapObjectNameless(posX, posY, posZ, "");
                break;

            case "nebulas":
                nmo = new MapObjectNameless(posX, posY, posZ, "nebulas");
                break;

            case "asteroids":
                nmo = new MapObjectNameless(posX, posY, posZ, "asteroids");
                break;

            case "mines":
                nmo = new MapObjectNameless(posX, posY, posZ, "mines");
                break;

            default:
                break;
            }

            if (mo == null && nmo == null)
            {
                throw new NotImplementedException("Attempting to add object of unknown type " + type);
            }

            if (mo != null)
            {
                NamedObjects.Add(mo);
                return(mo);
            }
            else
            {
                NamelessObjects.Add(nmo);
                if (makeSelected)
                {
                    Select_None();
                    SelectionNameless = nmo;
                }
                return(nmo);
            }
        }
예제 #5
0
        public void FromXml(string text)
        {
            XmlDocument xDoc = new XmlDocument();

            try
            {
                xDoc.LoadXml(text);
            }
            catch (Exception ex)
            {
                Log.Add("Failed to load space map from xml for the following reasons:");
                Log.Add(ex);
                return;
            }

            XmlNode root = null;

            foreach (XmlNode node in xDoc.ChildNodes)
            {
                if (node.Name == "createInput" ||
                    node.Name == "statementInput" ||
                    node.Name == "bgInput" ||
                    node.Name == "output")
                {
                    root = node;
                }
            }

            if (root == null)
            {
                Log.Add("Failed to load space map from xml for the following reasons:");
                Log.Add("Root node \"createInput\" or \"statementInput\" or \"bgInput\" or \"output\"not found!");
                return;
            }

            if (root.Name == "createInput" || root.Name == "bgInput" || root.Name == "output")
            {
                bool bg = root.Name == "bgInput";

                if (!bg)
                {
                    Clear();
                }
                foreach (XmlNode item in root.ChildNodes)
                {
                    MapObjectNamed    mo  = MapObjectNamed.NewFromXml(item);
                    MapObjectNameless nmo = MapObjectNameless.NewFromXml(item);

                    if (bg)
                    {
                        if (mo != null)
                        {
                            BacgkroundNamedObjects.Add(mo);
                        }
                        if (nmo != null)
                        {
                            BackgroundNamelessObjects.Add(nmo);
                        }
                    }
                    else
                    {
                        if (mo != null)
                        {
                            NamedObjects.Add(mo);
                        }
                        if (nmo != null)
                        {
                            NamelessObjects.Add(nmo);
                        }
                    }
                }
            }

            if (root.Name == "statementInput")
            {
                Clear();

                SelectionSpecial = MapObjectSpecial.NewFromXml(root.ChildNodes[0]);
            }
        }