Ejemplo n.º 1
0
        private void addPinToRoom(PinData pin)
        {
            string roomName = (pin.PinScene != null) ? pin.PinScene : PinData_S.All[pin.ID].SceneName;

            GameObject newPin = new GameObject("pin_rando");

            newPin.transform.parent      = this.custPinGroup.transform;
            newPin.layer                 = 30;
            newPin.transform.localScale *= 1.2f;

            SpriteRenderer sr = newPin.AddComponent <SpriteRenderer>();

            if (pin.isShop)
            {
                sr.sprite = Resources.Sprite("Map.shopPin");
            }
            else
            {
                sr.sprite = Resources.Sprite("Map.randoPin");
            }
            sr.sortingLayerName = "HUD";
            sr.size             = new Vector2(1f, 1f);

            Pin pinC = newPin.AddComponent <Pin>();

            pinC.PinData = pin;

            Vector3 vec = this.getRoomPos(roomName) + pin.Offset;

            newPin.transform.localPosition = new Vector3(vec.x, vec.y, (vec.z - 0.5f));
        }
        /// <summary>
        /// Parses our `pindata.xml` file.
        /// </summary>
        private static Dictionary <string, PinData> loadPinData(Stream stream)
        {
            Dictionary <string, PinData> retVal = new Dictionary <string, PinData>();

            XmlDocument xml = new XmlDocument();

            xml.Load(stream);
            foreach (XmlNode node in xml.SelectNodes("randomap/pin"))
            {
                PinData newPin = new PinData();
                newPin.ID = node.Attributes["name"].Value;
                foreach (XmlNode chld in node.ChildNodes)
                {
                    if (chld.NodeType == XmlNodeType.Comment)
                    {
                        continue;
                    }
                    switch (chld.Name)
                    {
                    case "pinScene":
                        newPin.PinScene = chld.InnerText;
                        break;

                    case "checkBool":
                        newPin.CheckBool = chld.InnerText;
                        break;

                    case "offsetX":
                        newPin.OffsetX = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "offsetY":
                        newPin.OffsetY = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "offsetZ":
                        newPin.OffsetZ = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "hasPrereq":
                        newPin.hasPrereq = XmlConvert.ToBoolean(chld.InnerText);
                        break;

                    case "isShop":
                        newPin.isShop = XmlConvert.ToBoolean(chld.InnerText);
                        break;

                    default:
                        logger.Error($"Pin '{newPin.ID}' in XML had node '{chld.Name}' not parsable!");
                        break;
                    }
                }
                retVal.Add(newPin.ID, newPin);
            }
            return(retVal);
        }
        public static string Get(PinData pinD)
        {
            if (dict == null)
            {
                Load(GameManager.instance.profileID);
            }

            string newName = "";

            if (dict.TryGetValue(pinD.ID, out newName))
            {
                return(newName);
            }
            else
            {
                return(pinD.OriginalName);
            }
        }
        private static void loadPinData(Stream stream)
        {
            pPinData = new Dictionary <string, PinData>();

            XmlDocument xml = new XmlDocument();

            xml.Load(stream);
            foreach (XmlNode node in xml.SelectNodes("randomap/pin"))
            {
                PinData newPin = new PinData();
                newPin.ID = node.Attributes["name"].Value;
                //Dev.Log("Load Pin Data: " + newPin.ID);
                string line = "";

                foreach (XmlNode chld in node.ChildNodes)
                {
                    switch (chld.Name)
                    {
                    case "pinScene":
                        line           += ", pinScene = " + chld.InnerText;
                        newPin.PinScene = chld.InnerText;
                        break;

                    case "checkType":
                        line            += ", checkType = " + chld.InnerText;
                        newPin.CheckType = selectCheckType(chld.InnerText);
                        break;

                    case "checkBool":
                        line            += ", checkBool = " + chld.InnerText;
                        newPin.CheckBool = chld.InnerText;
                        break;

                    case "prereq":
                        line            += ", prereq = " + chld.InnerText;
                        newPin.PrereqRaw = chld.InnerText;
                        break;

                    case "offsetX":
                        line          += ", offsetX = " + chld.InnerText;
                        newPin.OffsetX = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "offsetY":
                        line          += ", offsetY = " + chld.InnerText;
                        newPin.OffsetY = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "offsetZ":
                        line          += ", offsetZ = " + chld.InnerText;
                        newPin.OffsetZ = XmlConvert.ToSingle(chld.InnerText);
                        break;

                    case "hasPrereq":
                        line            += ", hasPrereq = " + chld.InnerText;
                        newPin.hasPrereq = XmlConvert.ToBoolean(chld.InnerText);
                        break;

                    case "isShop":
                        line         += ", isShop = " + chld.InnerText;
                        newPin.isShop = XmlConvert.ToBoolean(chld.InnerText);
                        break;

                    default:
                        DebugLog.Error("Pin '" + newPin.ID + "' in XML had node '" + chld.Name + "' not parsable!");
                        break;
                    }
                }

                pPinData.Add(newPin.ID, newPin);
                //Dev.Log(newPin.ID + " Pin added: " + pPinData.ContainsKey(newPin.ID));
            }
        }
        private static void loadItemData(XmlNodeList nodes)
        {
            foreach (XmlNode node in nodes)
            {
                string itemName = node.Attributes["name"].Value;
                if (!pPinData.ContainsKey(itemName))
                {
                    DebugLog.Error("Could not find item '" + itemName + "' in PinData Dict!");
                    continue;
                }

                PinData pinD = pPinData[itemName];
                foreach (XmlNode chld in node.ChildNodes)
                {
                    if (chld.Name == "sceneName")
                    {
                        pinD.SceneName = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "objectName")
                    {
                        pinD.OriginalName = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "itemLogic")
                    {
                        pinD.LogicRaw = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "boolName")
                    {
                        pinD.ObtainedBool = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "inChest")
                    {
                        pinD.InChest = true;
                        continue;
                    }

                    if (chld.Name == "newShiny")
                    {
                        pinD.NewShiny = true;
                        continue;
                    }

                    if (chld.Name == "x")
                    {
                        pinD.NewX = (int)XmlConvert.ToDouble(chld.InnerText);
                        continue;
                    }

                    if (chld.Name == "y")
                    {
                        pinD.NewY = (int)XmlConvert.ToDouble(chld.InnerText);
                        continue;
                    }

                    if (chld.Name == "pool")
                    {
                        pinD.Pool = chld.InnerText;
                        continue;
                    }
                }
            }
        }
        public static void Load(int saveSlot)
        {
            /*
             * GOOD LORD WHY REMOVE THE STRINGVALUES
             * foreach ( string val in RandomizerMod.RandomizerMod.Instance.Settings.StringValues.Values ) {
             *      if ( val.Contains( "newShinyName" ) ) {
             *              ObjectName newONC = JsonUtility.FromJson<ObjectName>( val );
             *              Add( newONC );
             *      }
             */
            dict = new Dictionary <string, string>();

            Platform.Current.ReadSaveSlot(saveSlot, (Action <byte[]>)(fileBytes =>
            {
                try {
                    SaveGameData data = JsonUtility.FromJson <SaveGameData>(!GameManager.instance.gameConfig.useSaveEncryption || Platform.Current.IsFileSystemProtected ? Encoding.UTF8.GetString(fileBytes) : Encryption.Decrypt((string)new BinaryFormatter().Deserialize((Stream) new MemoryStream(fileBytes))));
                    foreach (string key in data.modData["RandomizerMod"].StringValues.Keys)
                    {
                        JSONAction.Type type = JSONAction.Type.NONE;
                        type = getActionType(key);
                        if (type == JSONAction.Type.NONE)
                        {
                            continue;
                        }

                        string val            = data.modData["RandomizerMod"].StringValues[key];
                        JSONAction actionData = JsonUtility.FromJson <JSONAction>(val);
                        PinData pinD          = null;
                        string newName        = "";
                        switch (type)
                        {
                        case JSONAction.Type.AddShinyToChest:
                        case JSONAction.Type.ReplaceObjectWithShiny:
                            pinD = PinData_S.All.Values.Where(
                                pins => pins.SceneName == actionData.sceneName &&
                                pins.OriginalName == actionData.objectName
                                ).FirstOrDefault();
                            newName = actionData.newShinyName;
                            break;

                        case JSONAction.Type.CreateNewShiny:
                            pinD = PinData_S.All.Values.Where(
                                pins => pins.SceneName == actionData.sceneName &&
                                pins.NewX == (int)actionData.x &&
                                pins.NewY == (int)actionData.y &&
                                pins.NewShiny == true
                                ).FirstOrDefault();
                            newName = actionData.newShinyName;
                            break;

                        case JSONAction.Type.ChangeChestGeo:
                            pinD = PinData_S.All.Values.Where(
                                pins => pins.SceneName == actionData.sceneName &&
                                pins.InChest == true
                                ).FirstOrDefault();
                            newName = actionData.objectName;
                            break;

                        case JSONAction.Type.NONE:
                        default:
                            DebugLog.Error("What the crap just happened...? This enum is weeeeird.");
                            break;
                        }
                        if (pinD != null && newName != "")
                        {
                            //DebugLog.Write( "ONC Added: Item '" + pinD.ID + "' ObjectName '" + newName + "' Type '" + type + "'" );
                            Add(pinD.ID, newName);
                        }
                    }
                } catch (Exception ex) {
                    DebugLog.Error("Error trying to MANUALLY FREAKING LOAD the save data");
                    DebugLog.Error(ex.ToString());
                }
            }));
        }
        /// <summary>
        /// Loads items from RandomizerMod's item list, and merges it with our own pindata.xml
        /// </summary>
        /// <param name="nodes">The item nodes from Randomizer Mod's items.xml file</param>
        private void loadItemData(XmlNodeList nodes)
        {
            foreach (XmlNode node in nodes)
            {
                string itemName = node.Attributes["name"].Value;
                if (!pPinData.ContainsKey(itemName))
                {
                    //logger.Log($"RandomizerMod has an item.xml entry for {itemName} but there is no matching entry in RandoMapMod's pindata.xml. This is probably intentional to avoid pins that would otherwise mislead the player.");
                    continue;
                }

                PinData pinD = pPinData[itemName];
                foreach (XmlNode chld in node.ChildNodes)
                {
                    if (chld.Name == "sceneName")
                    {
                        pinD.SceneName = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "objectName")
                    {
                        pinD.OriginalName = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "itemLogic")
                    {
                        pinD.LogicRaw = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "boolName")
                    {
                        pinD.ObtainedBool = chld.InnerText;
                        continue;
                    }

                    if (chld.Name == "inChest")
                    {
                        pinD.InChest = true;
                        continue;
                    }

                    if (chld.Name == "newShiny")
                    {
                        pinD.NewShiny = true;
                        continue;
                    }

                    if (chld.Name == "x")
                    {
                        pinD.NewX = (int)XmlConvert.ToDouble(chld.InnerText);
                        continue;
                    }

                    if (chld.Name == "y")
                    {
                        pinD.NewY = (int)XmlConvert.ToDouble(chld.InnerText);
                        continue;
                    }

                    if (chld.Name == "pool")
                    {
                        pinD.Pool = chld.InnerText;
                        continue;
                    }
                }
            }
        }
        public void AddPinToRoom(PinData pinData, GameMap gameMap)
        {
            if (_pins.Any(pin => pin.PinData.ID == pinData.ID))
            {
                //Already in the list... Probably shouldn't add them.
                DebugLog.Warn($"Duplicate pin found for group: {pinData.ID} - Skipped.");
                return;
            }

            string roomName  = pinData.PinScene ?? ResourceHelper.PinData[pinData.ID].SceneName;
            Sprite pinSprite = pinData.IsShop ?
                               pinSprite                         = ResourceHelper.FetchSprite(ResourceHelper.Sprites.Shop) :
                                                       pinSprite = ResourceHelper.FetchSpriteByPool(pinData.Pool);

            GameObject newPin = new GameObject("pin_rando");

            if (pinSprite.name.StartsWith("req"))
            {
                if (HelperGroup == null)
                {
                    HelperGroup = new GameObject("Resource Helpers");
                    HelperGroup.transform.SetParent(this.transform);
                    //default to off
                    HelperGroup.SetActive(false);
                }

                newPin.transform.SetParent(HelperGroup.transform);
            }
            else
            {
                if (MainGroup == null)
                {
                    MainGroup = new GameObject("Main Group");
                    MainGroup.transform.SetParent(this.transform);
                    //default to off
                    MainGroup.SetActive(false);
                }

                newPin.transform.SetParent(MainGroup.transform);
            }
            newPin.layer = 30;
            newPin.transform.localScale *= 1.2f;

            SpriteRenderer sr = newPin.AddComponent <SpriteRenderer>();

            sr.sprite           = pinSprite;
            sr.sortingLayerName = "HUD";
            sr.size             = new Vector2(1f, 1f);

            Vector3 vec = __GetRoomPos() + pinData.Offset;

            newPin.transform.localPosition = new Vector3(vec.x, vec.y, vec.z - 1f + (vec.y / 100) + (vec.x / 100));

            //Disable to avoid the Pin component's OnEnable before setting the pindata...
            //   Yay Constructorless Components...
            newPin.SetActive(false);

            Pin pinC = newPin.AddComponent <Pin>();

            pinC.SetPinData(pinData);

            //Don't worry about this one. It just does some totally normal non-spoilery things.
            newPin.AddComponent <BoringPinThing>();

            newPin.SetActive(true);

            _pins.Add(pinC);

            Vector3 __GetRoomPos()
            {
                //@@OPTIMIZE: Should be indexed or hard-coded but it runs once per game session. Small gain.
                Vector3 pos      = new Vector3(-30f, -30f, -0.5f);
                bool    exitLoop = false;

                for (int index1 = 0; index1 < gameMap.transform.childCount; ++index1)
                {
                    GameObject areaObj = gameMap.transform.GetChild(index1).gameObject;
                    for (int index2 = 0; index2 < areaObj.transform.childCount; ++index2)
                    {
                        GameObject roomObj = areaObj.transform.GetChild(index2).gameObject;
                        if (roomObj.name == roomName)
                        {
                            pos      = roomObj.transform.position;
                            exitLoop = true;
                            break;
                        }
                    }
                    if (exitLoop)
                    {
                        break;
                    }
                }

                return(pos);
            }
        }