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()); }
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); }
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); }
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); }
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); }
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); } }
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; }
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", }); }