Пример #1
0
        public override string Solve()
        {
            var banks = FileParser.GetData().ParseDelimitedInts('\t').ToArray();
            var seen  = new HashSet <int>();

            var key = banks.CreateHash();

            while (!seen.Contains(key))
            {
                seen.Add(key);
                key = GetNextHash(banks);
            }

            var count    = 0;
            var nextHash = 0;

            while (nextHash != key)
            {
                seen.Add(nextHash);
                nextHash = GetNextHash(banks);
                count++;
            }

            return(count.ToString());
        }
Пример #2
0
        public static void AddChestData(int room)
        {
            int group = room >> 8;

            room &= 0xff;

            FileParser chestFileParser = Project.GetFileWithLabel("chestDataGroupTable");
            Data       chestPointer    = chestFileParser.GetData("chestDataGroupTable", group * 2);
            string     pointerString   = chestPointer.GetValue(0);
            Data       chestGroupData  = Project.GetData(pointerString);

            Data newData = new Data(Project, ".db", new string[] { "$00" }, -1, null, new List <int> {
                -1
            });

            newData.EndsLine = false;
            chestFileParser.InsertComponentBefore(chestGroupData, newData);

            newData = new Data(Project, ".db", new string[] { Wla.ToByte((byte)room) }, -1, null, null);
            newData.PrintCommand = false;
            newData.EndsLine     = false;
            chestFileParser.InsertComponentBefore(chestGroupData, newData);

            newData = new Data(Project, ".db", new string[] { "$00" }, -1, null, null);
            newData.PrintCommand = false;
            newData.EndsLine     = false;
            chestFileParser.InsertComponentBefore(chestGroupData, newData);

            newData = new Data(Project, ".db", new string[] { "$00" }, -1, null, null);
            newData.PrintCommand = false;
            chestFileParser.InsertComponentBefore(chestGroupData, newData);
        }
Пример #3
0
        public static Data GetChestData(int room)
        {
            int group = room >> 8;

            room &= 0xff;

            FileParser chestFileParser = Project.GetFileWithLabel("chestDataGroupTable");
            Data       chestPointer    = chestFileParser.GetData("chestDataGroupTable", group * 2);
            string     pointerString   = chestPointer.GetValue(0);
            Data       chestGroupData  = Project.GetData(pointerString);

            while (chestGroupData.GetIntValue(0) != 0xff)
            {
                if (chestGroupData.NextData.GetIntValue(0) == room)
                {
                    return(chestGroupData);
                }
                for (int i = 0; i < 4; i++)
                {
                    chestGroupData = chestGroupData.NextData;
                }
            }

            return(null);
        }
Пример #4
0
        public static int GetNumLowIndices(int hIndex)
        {
            Data data = GetHighIndexDataBase(hIndex);

            if (!HighIndexUsesPointer(hIndex))
            {
                return(1);
            }
            data = data.NextData;
            FileParser parser = Project.GetFileWithLabel(data.GetValue(0));

            data = parser.GetData(data.GetValue(0));
            int count = 0;

            do
            {
                for (int i = 0; i < 4; i++)
                {
                    data = data.NextData;
                }
                count++;
            }while (data != null && parser.GetDataLabel(data) == null);

            return(count);
        }
Пример #5
0
        public static int GetNumHighIndices()
        {
            // Read until the first label after treasureData.
            FileParser parser = Project.GetFileWithLabel("treasureObjectData");
            Data       data   = parser.GetData("treasureObjectData");

            int count = 0;

            do
            {
                for (int i = 0; i < 4;)
                {
                    i   += data.Size;
                    data = data.NextData;
                }
                count++;
            }while (data != null && parser.GetDataLabel(data) == null);

            return(count);
        }
Пример #6
0
        public static void RemoveHighIndex(int hIndex)
        {
            if (hIndex >= GetNumHighIndices())
            {
                return;
            }

            Data       data   = GetHighIndexDataBase(hIndex);
            FileParser parser = data.FileParser;

            string pointerString = "";
            int    n             = 4;

            if (HighIndexUsesPointer(hIndex))
            {
                pointerString = data.NextData.GetValue(0);
                n             = 3;
            }

            for (int i = 0; i < n; i++)
            {
                Data d2 = data;
                data = data.NextData;

                parser.RemoveFileComponent(d2);
            }

            if (pointerString != "")
            {
                data = parser.GetData(pointerString);
                LynnaLab.Label l = parser.GetDataLabel(data);
                parser.RemoveFileComponent(l);
                do
                {
                    Data d2 = data;
                    data = data.NextData;
                    parser.RemoveFileComponent(d2);
                }while (data != null && parser.GetDataLabel(data) == null);
            }
        }
Пример #7
0
        public bool Execute()
        {
            var oldSoundTriggersPath = Path.Combine(AssistantEngine.DataDir, "Modules", "SoundNotify");
            if (!Directory.Exists(oldSoundTriggersPath))
            {
                return false;
            }

            _oldSoundTriggersPath = oldSoundTriggersPath;
            var newTriggersPath = _moduleTriggers.ModuleDataDir;

            var queueModFile = Path.Combine(oldSoundTriggersPath, "QueueSoundMod.txt");
            if (File.Exists(queueModFile))
            {
                try
                {
                    var file = new FileInfo(queueModFile);
                    file.CopyTo(Path.Combine(newTriggersPath, "QueueSoundMod.txt"), true);
                }
                catch (Exception exception)
                {
                    Logger.LogError("error while trying to copy queue sound modding file: " + queueModFile, this, exception);
                }
            }

            //var activeChars = new List<string>();
            var moduleSettingsFile = Path.Combine(oldSoundTriggersPath, "settings.xml");
            if (File.Exists(moduleSettingsFile))
            {
                try
                {
                    string xml = File.ReadAllText(moduleSettingsFile);
                    xml = GetRidOfThisSillyNamespace(xml);
                    XDocument doc = XDocument.Parse(xml);
                    //activeChars = doc.Root
                    //    .Element("ActiveCharacterNames")
                    //    .Elements("Elements")
                    //    .Select(element => element.Value)
                    //    .ToList();
                    _moduleTriggers.Settings.Value.GlobalVolume =
                        XmlConvert.ToSingle(doc.Root.Element("globalVolume").Value);
                    _moduleTriggers.Settings.Value.GlobalMute =
                        XmlConvert.ToBoolean(doc.Root.Element("GlobalMute").Value);
                }
                catch (Exception exception)
                {
                    Logger.LogError("error while trying to import old global soundnotify settings: " + moduleSettingsFile, this, exception);
                }
            }

            string[] allExistingPlayers = Directory.GetDirectories(oldSoundTriggersPath);
            foreach (var playerDir in allExistingPlayers)
            {
                var playerName = new FileInfo(playerDir).Name;
                var manager = new TriggerManager(_moduleTriggers, playerName, newTriggersPath);

                var playlistFile = Path.Combine(playerDir, "playlist.txt");
                if (File.Exists(playlistFile))
                {
                    var parser = new FileParser(playlistFile);
                    IEnumerable<TriggerData> triggerDatas = parser.GetData();
                    foreach (var triggerData in triggerDatas)
                    {
                        try
                        {
                            ITrigger trigger;
                            if (triggerData.IsRegex || triggerData.Condition.Contains('*'))
                            {
                                trigger = CreateRegexTrigger(triggerData);
                            }
                            else
                            {
                                trigger = CreateSimpleTrigger(triggerData);

                            }
                            manager.Settings.Value.AddTrigger(trigger);
                        }
                        catch (Exception exception)
                        {
                            Logger.LogError("Failed to create new trigger from parsed soundtrigger playlist!", this, exception);
                        }
                    }
                }

                var settingsFile = Path.Combine(playerDir, "settings.xml");
                if (File.Exists(settingsFile))
                {
                    try
                    {
                        string xml = File.ReadAllText(settingsFile);
                        xml = GetRidOfThisSillyNamespace(xml);
                        XDocument doc = XDocument.Parse(xml);
                        double delay = XmlConvert.ToDouble((doc.Root.Element("QueueDefDelay").Value));
                        bool soundEnabled = XmlConvert.ToBoolean(doc.Root.Element("QueueSoundEnabled").Value);
                        var soundNameElem = doc.Root.Element("QueueSoundName");
                        string soundName = soundNameElem == null ? string.Empty : soundNameElem.Value;
                        var trigger = new ActionQueueTrigger
                        {
                            NotificationDelay = delay,
                            Active = soundEnabled
                        };
                        trigger.AddNotifier(new SoundNotifier(soundName));
                        manager.Settings.Value.Muted = XmlConvert.ToBoolean(doc.Root.Element("Muted").Value);
                        manager.Settings.Value.AddTrigger(trigger);
                    }
                    catch (Exception exception)
                    {
                        Logger.LogError("error while parsing old soundnotify settings!", this, exception);
                    }
                }
                _moduleTriggers.AddManager(manager);
            }
            return true;
        }
Пример #8
0
        public static void AddSubIndex(int hIndex)
        {
            int n = GetNumLowIndices(hIndex);

            if (n >= 256)
            {
                return;
            }

            Data       data   = GetHighIndexDataBase(hIndex);
            FileParser parser = data.FileParser;

            if (!HighIndexUsesPointer(hIndex))
            {
                string pointerString = "treasureObjectData" + hIndex.ToString("x2");

                while (Project.HasLabel(pointerString))
                {
                    pointerString = "_" + pointerString;
                }

                parser.InsertParseableTextBefore(data,
                                                 new string[] {
                    "\t.db $80",
                    "\t.dw " + pointerString,
                    "\t.db $00",
                });

                string output = "\t.db";

                for (int i = 0; i < 4; i++)
                {
                    output += " " + data.GetValue(0);
                    Data d2 = data;
                    data = data.NextData;
                    parser.RemoveFileComponent(d2);
                }


                parser.InsertParseableTextAfter(null,
                                                new string[] {
                    pointerString + ":"
                });

                parser.InsertParseableTextAfter(null,
                                                new string[] { output });

                data = parser.GetData(pointerString);
            }
            else
            {
                data = Project.GetData(data.NextData.GetValue(0));
            }

            for (int i = 0; i < (n - 1) * 4 + 3; i++)
            {
                data = data.NextData;
            }

            parser.InsertParseableTextAfter(data,
                                            new string[] {
                "\t.db $00 $00 $00 $00",
            });
        }