예제 #1
0
        private void B_LoadHouse_Click(object sender, EventArgs e)
        {
            var name = GetVillagerName(Houses[Index]);

            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)
            {
                WinFormsUtil.Error(MessageStrings.MsgCanceling, string.Format(MessageStrings.MsgDataSizeMismatchImport, fi.Length, expectLength));
                return;
            }

            var data    = File.ReadAllBytes(file);
            var h       = new VillagerHouse(data);
            var current = Houses[Index];

            h.NPC1                 = current.NPC1;
            Houses[Index]          = h;
            PG_Item.SelectedObject = h;
        }
예제 #2
0
        private static VillagerData AdaptVillager(VillagerInfo exist, VillagerData replace, bool prepMoveOut = false)
        {
            var ov = exist.Villager;
            var oh = exist.House;
            var nv = new Villager2(replace.Villager);

            _ = new VillagerHouse(replace.House)
            {
                NPC1 = oh.NPC1, NPC2 = oh.NPC2, BuildPlayer = oh.BuildPlayer
            };

            // Copy Memories
            var om = nv.GetMemory(0);
            var nm = ov.GetMemory(0);

            nm.PlayerId = om.PlayerId;
            nv.SetMemory(nm, 0);

            if (!prepMoveOut)
            {
                return(replace);
            }

            nv.MovingOut = true;
            return(replace);
        }
예제 #3
0
    private void loadVillagerData(Villager2 v, VillagerHouse vh, bool raw = false)
    {
        try
        {
            Villager2     newV  = v;
            VillagerHouse newVH = vh;
            VillagerHouse loadedVillagerHouse = GetCurrentLoadedVillagerHouse(); // non indexed so search for the correct one
            int           index = loadedVillagerHouses.IndexOf(loadedVillagerHouse);
            if (!raw && index != -1)
            {
                newV.SetMemories(loadedVillager.GetMemories());
                newV.SetEventFlagsSave(loadedVillager.GetEventFlagsSave());
                newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newV.InternalName);
            }

            if (index == -1)
            {
                //inject to earliest available house
                foreach (var house in loadedVillagerHouses)
                {
                    if (house.NPC1 == -1)
                    {
                        loadedVillagerHouse = house;
                        index      = loadedVillagerHouses.IndexOf(loadedVillagerHouse);
                        house.NPC1 = (sbyte)currentlyLoadedVillagerIndex;
                        break;
                    }
                }

                if (index == -1)
                {
                    throw new Exception("Selected villager has no house, and no houses are available.");
                }
            }

            // check if they are moving in
            if (loadedVillagerHouse.WallUniqueID == WallType.HouseWallNForSale || loadedVillagerHouse.WallUniqueID == WallType.HouseWallNSoldOut)
            {
                loadedVillagerHouse.WallUniqueID = newVH.WallUniqueID;
            }
            if (checkIfMovingIn(loadedVillagerHouse))
            {
                newVH = combineHouseOrders(newVH, loadedVillagerHouse);
            }
            newVH.NPC1 = loadedVillagerHouse.NPC1;

            loadedVillagerHouses[index] = newVH;
            loadedVillager = newV;
            loadedVillagerShellsList[currentlyLoadedVillagerIndex] = newV;

            TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newV.InternalName);
            setCurrentVillager(); // where the magic happens
            VillagerToUI(loadedVillager);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            PopupHelper.CreateError(e.Message, 2f);
        }
    }
예제 #4
0
    public void loadVillager(int index)
    {
        try
        {
            byte[] loaded = CurrentConnection.ReadBytes(CurrentVillagerAddress + (uint)(index * Villager.SIZE), Villager.SIZE);

            if (villagerIsNull(loaded))
            {
                return;
            }

            currentlyLoadedVillagerIndex = index;
            loadedVillager = new Villager(loaded);

            // get their house
            byte[] loadedHouse = CurrentConnection.ReadBytes(CurrentVillagerHouseAddress + (uint)(currentlyLoadedVillagerIndex * VillagerHouse.SIZE), VillagerHouse.SIZE);
            loadedVillagerHouse = new VillagerHouse(loadedHouse);

            VillagerToUI(loadedVillager);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            PopupHelper.CreateError(e.Message, 2f);
        }
    }
예제 #5
0
    private void loadVillagerData()
    {
        try
        {
            string newVillager   = Selector.LastSelectedVillager;
            byte[] villagerDump  = ((TextAsset)Resources.Load("DefaultVillagers/" + newVillager + "V")).bytes;
            byte[] villagerHouse = ((TextAsset)Resources.Load("DefaultVillagers/" + newVillager + "H")).bytes;
            if (villagerDump == null || villagerHouse == null)
            {
                return;
            }

            Villager newV = new Villager(villagerDump);
            newV.SetMemories(loadedVillager.GetMemories());
            newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newVillager);
            VillagerHouse newVH = new VillagerHouse(villagerHouse);
            newVH.NPC1 = loadedVillagerHouse.NPC1;


            loadedVillager      = newV;
            loadedVillagerHouse = newVH;

            SetCurrentVillager(true);
            TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newVillager);
            VillagerToUI(loadedVillager);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            PopupHelper.CreateError(e.Message, 2f);
        }
    }
예제 #6
0
        private string GetVillagerName(VillagerHouse house)
        {
            var villagerIndex = house.NPC1;
            var v             = (uint)villagerIndex >= Villagers.Count ? "???" : Villagers[villagerIndex].InternalName;
            var name          = GameInfo.Strings.GetVillager(v);

            return(name);
        }
예제 #7
0
    private VillagerHouse combineHouseOrders(VillagerHouse vNew, VillagerHouse vOld)
    {
        VillagerHouse vTmp = new VillagerHouse(vOld.Data);

        vTmp.OrderWallUniqueID = vNew.OrderWallUniqueID;
        vTmp.OrderRoofUniqueID = vNew.OrderRoofUniqueID;
        vTmp.OrderDoorUniqueID = vNew.OrderDoorUniqueID;
        return(vTmp);
    }
예제 #8
0
    public void WriteVillagerDataVillager(Villager2 v)
    {
        checkReloadVillager();
        VillagerHouse loadedVillagerHouse = loadedVillagerHouses.Find(x => x.NPC1 == (sbyte)currentlyLoadedVillagerIndex); // non indexed so search for the correct one
        int           index = loadedVillagerHouses.IndexOf(loadedVillagerHouse);

        if (index == -1)
        {
            throw new Exception("The villager having their house replaced doesn't have a house on your island."); // not sure why but it can get unloaded during the check
        }
        loadVillagerData(v, loadedVillagerHouse, true);
    }
예제 #9
0
        public static async Task <VillagerHelper> GenerateHelper(CrossBot bot, CancellationToken token)
        {
            LogUtil.LogInfo("Fetching villager data, please wait...", bot.Config.IP);
            // houses
            var housesData = await bot.Connection.ReadBytesAsync((uint)OffsetHelper.VillagerHouseAddress, ExpectedHouseSize, token).ConfigureAwait(false);

            var houses = new VillagerHouse[10];

            for (int i = 0; i < 10; ++i)
            {
                houses[i] = new VillagerHouse(housesData.Skip(i * VillagerHouse.SIZE).Take(VillagerHouse.SIZE).ToArray());
            }

            // villager shells
            var villagers = await GetVillagerShells(bot.Connection, true, token).ConfigureAwait(false);

            LogUtil.LogInfo("Villager data loaded...", bot.Config.IP);
            return(new VillagerHelper(bot, houses, villagers));
        }
예제 #10
0
        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();
        }
예제 #11
0
    private void loadVillagerData(Villager2 v, VillagerHouse vh, bool raw = false)
    {
        try
        {
            Villager2     newV  = v;
            VillagerHouse newVH = vh;
            if (!raw)
            {
                newV.SetMemories(loadedVillager.GetMemories());
                newV.SetEventFlagsSave(loadedVillager.GetEventFlagsSave());
                newV.CatchPhrase = GameInfo.Strings.GetVillagerDefaultPhrase(newV.InternalName);
            }

            VillagerHouse loadedVillagerHouse = GetCurrentLoadedVillagerHouse(); // non indexed so search for the correct one
            int           index = loadedVillagerHouses.IndexOf(loadedVillagerHouse);
            if (index == -1)
            {
                throw new Exception("The villager being replaced doesn't have a house on your island.");
            }

            // check if they are moving in
            if (checkIfMovingIn(loadedVillagerHouse))
            {
                newVH = combineHouseOrders(newVH, loadedVillagerHouse);
            }
            newVH.NPC1 = loadedVillagerHouse.NPC1;

            loadedVillagerHouses[index] = newVH;
            loadedVillager = newV;
            loadedVillagerShellsList[currentlyLoadedVillagerIndex] = newV;

            TenVillagers[currentlyLoadedVillagerIndex].texture = SpriteBehaviour.PullTextureFromParser(villagerSprites, newV.InternalName);
            setCurrentVillager(); // where the magic happens
            VillagerToUI(loadedVillager);
        }
        catch (Exception e)
        {
            Debug.LogError(e.Message);
            PopupHelper.CreateError(e.Message, 2f);
        }
    }
예제 #12
0
        protected override void LoadContent()
        {
            new Registry();
            this.SpriteBatch = new SpriteBatch(this.GraphicsDevice);

            var data = SaveManager.Load("save");

            this.MapSeed = data?.Seed ?? new Random().Next();

            var town = this.AddMap(MapGenerator.GenerateTown(this.MapSeed, data == null));

            var villager = new Villager("Player", town, new Vector2(35.5F, 32.5F));

            town.AddObject(villager);

            var houseMap = this.AddMap(MapGenerator.GenerateHouse("House1", new Point(20, 20)));
            var house    = new VillagerHouse(0, town, new Vector2(20, 20), houseMap.Name);

            town.AddObject(house);

            if (data != null)
            {
                foreach (var map in data.Maps)
                {
                    map.Load(this.Maps);
                }
                this.Player = data.Player.Load(this.Maps);

                this.lastRealTimeUpdate = data.LastRealTimeUpdate;
                this.ForceRealTimeUpdate();
            }
            else
            {
                this.Player = new Player(town, new Vector2(22.5F, 22.5F));
                town.AddObject(this.Player);
            }

            this.Camera = new Camera(this.Player);
            this.Camera.FixPosition(this.CurrentMap);
        }
예제 #13
0
        public async Task <bool> InjectVillager(VillagerRequest vr, CancellationToken token)
        {
            var vd    = vr.Item;
            var index = vr.Index;

            if (VillagerHouses == null || VillagerShells == null || Connection == null || Bot == null)
            {
                return(false);
            }

            VillagerHouse?house = VillagerHouses.Find(x => x.NPC1 == (sbyte)index);

            if (house == null)
            {
                LogUtil.LogInfo($"House {index} requested but does not exist. Injecting to first available house", Bot.Config.IP);
                for (int i = 0; i < VillagerHouses.Count; ++i)
                {
                    if (VillagerHouses[i].HouseStatus == 0)
                    {
                        house = VillagerHouses[i];
                        break;
                    }
                }
            }

            if (house == null)
            {
                LogUtil.LogInfo($"No house found to inject to.", Bot.Config.IP);
                return(false);
            }

            var houseIndex = VillagerHouses.IndexOf(house);

            var villagerToInject   = (byte[])vd.Villager.Clone();
            var villagerAsVillager = new Villager2(villagerToInject);

            LogUtil.LogInfo($"Beginning injection for: {GameInfo.Strings.GetVillager(villagerAsVillager.InternalName)}", Bot.Config.IP);

            // update moving out state
            villagerAsVillager.MoveType  = 0;
            villagerAsVillager.MovingOut = true;
            ushort[] flags = villagerAsVillager.GetEventFlagsSave();
            flags[05] = 1; // flag 5 = MoveInCompletion
            flags[09] = 0; // flag 9 = AbandonedHouse
            flags[24] = 0; // flag 24 = ForceMoveOut
            villagerAsVillager.SetEventFlagsSave(flags);

            var houseToInject = (byte[])vd.House.Clone();
            var houseAsHouse  = new VillagerHouse(houseToInject)
            {
                HouseStatus = house.HouseStatus == 0 ? 2 : house.HouseStatus,
                NPC1        = house.NPC1 == -1 ? (sbyte)index : house.NPC1,
                NPC2        = house.NPC2
            };

            // inject villager
            await Connection.WriteBytesAsync(villagerAsVillager.Data, (uint)OffsetHelper.VillagerAddress + ((uint)index *Villager2.SIZE), token).ConfigureAwait(false);

            await Connection.WriteBytesAsync(villagerAsVillager.Data, (uint)OffsetHelper.VillagerAddress + ((uint)index *Villager2.SIZE) + (uint)OffsetHelper.BackupSaveDiff, token).ConfigureAwait(false);

            // inject house
            await Connection.WriteBytesAsync(houseAsHouse.Data, (uint)OffsetHelper.VillagerHouseAddress + ((uint)houseIndex *VillagerHouse.SIZE), token).ConfigureAwait(false);

            await Connection.WriteBytesAsync(houseAsHouse.Data, (uint)OffsetHelper.VillagerHouseAddress + ((uint)houseIndex *VillagerHouse.SIZE) + (uint)OffsetHelper.BackupSaveDiff, token).ConfigureAwait(false);

            LogUtil.LogInfo($"Villager injection complete.", Bot.Config.IP);
            vr.OnFinish?.Invoke(true);
            return(true);
        }
예제 #14
0
    // villager data

    public void WriteVillagerDataHouse(VillagerHouse vh)
    {
        checkReloadVillager();
        loadVillagerData(loadedVillager, vh, true);
    }
예제 #15
0
 private string GetHouseSummary(VillagerHouse house) => $"{GetVillagerName(house)}'s House";
예제 #16
0
 private bool checkIfMovingIn(VillagerHouse vOld) => vOld.WallUniqueID == WallType.HouseWallNSoldOut;
예제 #17
0
 public VillagerInfo(Villager2 villager, VillagerHouse house)
 {
     Villager = villager;
     House    = house;
 }