private void B_LoadHouse_Click(object sender, EventArgs e) { var name = L_ExternalName.Text; using var ofd = new OpenFileDialog { Filter = "New Horizons Villager House (*.nhvh)|*.nhvh|All files (*.*)|*.*", FileName = $"{name}.nhvh", }; if (ofd.ShowDialog() != DialogResult.OK) { return; } var file = ofd.FileName; var fi = new FileInfo(file); const int expectLength = VillagerHouse.SIZE; if (fi.Length != expectLength) { var msg = $"Imported villager house's data length (0x{fi.Length:X}) does not match the required length (0x{expectLength:X})."; WinFormsUtil.Error("Cancelling:", msg); return; } var data = File.ReadAllBytes(file); var h = data.ToClass <VillagerHouse>(); SAV.SetVillagerHouse(h, VillagerIndex); }
private void B_ReplaceVillager_Click(object sender, EventArgs e) { if (!Clipboard.ContainsText()) { WinFormsUtil.Error(MessageStrings.MsgVillagerReplaceNoText); return; } var internalName = Clipboard.GetText(); if (!VillagerResources.IsVillagerDataKnown(internalName)) { internalName = GameInfo.Strings.VillagerMap.FirstOrDefault(z => string.Equals(z.Value, internalName, StringComparison.InvariantCultureIgnoreCase)).Key; if (internalName == default) { WinFormsUtil.Error(string.Format(MessageStrings.MsgVillagerReplaceUnknownName, internalName)); return; } } var index = VillagerIndex; var villager = Villagers[index]; if (villager is not Villager2 v2) { WinFormsUtil.Error(MessageStrings.MsgVillagerReplaceOutdatedSaveFormat); return; } var houses = SAV.GetVillagerHouses(); var houseIndex = Array.FindIndex(houses, z => z.NPC1 == index); var exist = new VillagerInfo(v2, houses[houseIndex]); var replace = VillagerSwap.GetReplacementVillager(exist, internalName); var nh = new VillagerHouse(replace.House); SAV.SetVillagerHouse(nh, houseIndex); var nv = new Villager2(replace.Villager); LoadVillager(Villagers[index] = nv); System.Media.SystemSounds.Asterisk.Play(); }