Example #1
0
    public static void SendDisplayItemListMenu(this NetState ns, ItemListMenu menu)
    {
        if (ns == null || menu == null)
        {
            return;
        }

        var question       = menu.Question?.Trim();
        var questionLength = question?.Length ?? 0;

        var entries       = menu.Entries;
        int entriesLength = (byte)entries.Length;

        var maxLength = 11 + questionLength;

        for (int i = 0; i < entriesLength; i++)
        {
            maxLength += 5 + entries[i].Name?.Length ?? 0; // could be trimmed
        }

        var writer = new SpanWriter(stackalloc byte[maxLength]);

        writer.Write((byte)0x7C); // Packet ID
        writer.Seek(2, SeekOrigin.Current);
        writer.Write(menu.Serial);
        writer.Write((ushort)0);

        writer.Write((byte)questionLength);

        if (question != null)
        {
            writer.WriteAscii(question);
        }

        writer.Write((byte)entriesLength);

        for (var i = 0; i < entriesLength; ++i)
        {
            var e = entries[i];

            writer.Write((ushort)e.ItemID);
            writer.Write((short)e.Hue);

            var name = e.Name?.Trim();

            if (name == null)
            {
                writer.Write((byte)0);
            }
            else
            {
                var nameLength = name.Length;
                writer.Write((byte)nameLength);
                writer.WriteAscii(name);
            }
        }

        writer.WritePacketLength();
        ns.Send(writer.Span);
    }
Example #2
0
        public static void SendDisplayItemListMenu(this NetState ns, ItemListMenu menu)
        {
            if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer))
            {
                return;
            }

            var writer = new CircularBufferWriter(buffer);

            writer.Write((byte)0x7C);           // Packet ID
            writer.Seek(2, SeekOrigin.Current); // Length
            writer.Write(menu.Serial);
            writer.Write((ushort)0);

            var question = menu.Question?.Trim();

            if (question == null)
            {
                writer.Write((byte)0);
            }
            else
            {
                var questionLength = question.Length;
                writer.Write((byte)questionLength);
                writer.WriteAscii(question);
            }

            var entries = menu.Entries;

            int entriesLength = (byte)entries.Length;

            writer.Write((byte)entriesLength);

            for (var i = 0; i < entriesLength; ++i)
            {
                var e = entries[i];

                writer.Write((ushort)e.ItemID);
                writer.Write((short)e.Hue);

                var name = e.Name?.Trim();

                if (name == null)
                {
                    writer.Write((byte)0);
                }
                else
                {
                    var nameLength = name.Length;
                    writer.Write((byte)nameLength);
                    writer.WriteAscii(name);
                }
            }

            writer.WritePacketLength();

            ns.Send(ref buffer, writer.Position);
        }
        public void TestDisplayItemListMenu()
        {
            var menu = new ItemListMenu(
                "Which item would you choose?",
                new[]
            {
                new ItemListEntry("Item 1", 0x01),
                new ItemListEntry("Item 2", 0x100),
                new ItemListEntry("Item 3", 0x1000, 250)
            }
                );

            var data = new DisplayItemListMenu(menu).Compile();

            var question       = menu.Question;
            var questionLength = Math.Min(255, question.Length);
            var entriesCount   = 0;
            var length         = 11 + questionLength;

            foreach (var entry in menu.Entries)
            {
                length += 5 + entry.Name.Length;
                if (entriesCount == 255)
                {
                    break;
                }

                entriesCount++;
            }

            Span <byte> expectedData = stackalloc byte[length];
            var         pos          = 0;

            expectedData.Write(ref pos, (byte)0x7C); // Packet ID
            expectedData.Write(ref pos, (ushort)length);
            expectedData.Write(ref pos, menu.Serial);
            expectedData.Write(ref pos, (ushort)0x00);
            expectedData.Write(ref pos, (byte)questionLength);
            expectedData.WriteAscii(ref pos, question, 255);
            expectedData.Write(ref pos, (byte)entriesCount);
            for (var i = 0; i < entriesCount; i++)
            {
                var entry = menu.Entries[i];
                expectedData.Write(ref pos, (ushort)entry.ItemID);
                expectedData.Write(ref pos, (ushort)entry.Hue);
                var name = entry.Name?.Trim() ?? "";
                expectedData.Write(ref pos, (byte)Math.Min(255, name.Length));
                expectedData.WriteAscii(ref pos, name, 255);
            }

            AssertThat.Equal(data, expectedData);
        }
        internal static void ItemListMenuPatch(ItemListMenu __instance, string ___title, int ___currentTab, int ___totalValueOfItems, List <Item> ___itemsToList)
        {
            try
            {
                int    x = Game1.getMouseX(true), y = Game1.getMouseY(true); // Mouse x and y position
                string toSpeak = " ", currentList = " ";

                for (int i = ___currentTab * __instance.itemsPerCategoryPage; i < ___currentTab * __instance.itemsPerCategoryPage + __instance.itemsPerCategoryPage; i++)
                {
                    if (i == 0)
                    {
                        currentList = ___title;
                    }

                    if (___itemsToList.Count > i)
                    {
                        if (___itemsToList[i] == null)
                        {
                            currentList = $"{currentList}, \n" + Game1.content.LoadString("Strings\\UI:ItemList_ItemsLostValue", ___totalValueOfItems);
                            continue;
                        }

                        currentList = $"{currentList}, \n {___itemsToList[i].Stack} {___itemsToList[i].DisplayName}";
                    }
                }

                if (__instance.okButton != null && __instance.okButton.containsPoint(x, y))
                {
                    toSpeak = $"Page {___currentTab + 1} of {((int)___itemsToList.Count / __instance.itemsPerCategoryPage) + 1} \n {currentList} \n ok button";
                }
                else if (__instance.forwardButton != null && __instance.forwardButton.containsPoint(x, y))
                {
                    toSpeak = "Next page button";
                }
                else if (__instance.backButton != null && __instance.backButton.containsPoint(x, y))
                {
                    toSpeak = "Previous page button";
                }

                if (itemListMenuQuery != toSpeak)
                {
                    itemListMenuQuery = toSpeak;
                    MainClass.ScreenReader.Say(toSpeak, true);
                }
            }
            catch (System.Exception e)
            {
                MainClass.ErrorLog($"Unable to narrate Text:\n{e.Message}\n{e.StackTrace}");
            }
        }
Example #5
0
        public DisplayItemListMenu(ItemListMenu menu) : base(0x7C)
        {
            EnsureCapacity(256);

            Stream.Write(((IMenu)menu).Serial);
            Stream.Write((short)0);

            var question = menu.Question;

            if (question == null)
            {
                Stream.Write((byte)0);
            }
            else
            {
                var questionLength = question.Length;
                Stream.Write((byte)questionLength);
                Stream.WriteAsciiFixed(question, questionLength);
            }

            var entries = menu.Entries;

            int entriesLength = (byte)entries.Length;

            Stream.Write((byte)entriesLength);

            for (var i = 0; i < entriesLength; ++i)
            {
                var e = entries[i];

                Stream.Write((ushort)e.ItemID);
                Stream.Write((short)e.Hue);

                var name = e.Name;

                if (name == null)
                {
                    Stream.Write((byte)0);
                }
                else
                {
                    var nameLength = name.Length;
                    Stream.Write((byte)nameLength);
                    Stream.WriteAsciiFixed(name, nameLength);
                }
            }
        }
Example #6
0
        public void TestDisplayItemListMenu()
        {
            var menu = new ItemListMenu(
                "Which item would you choose?",
                new[]
            {
                new ItemListEntry("Item 1", 0x01),
                new ItemListEntry("Item 2", 0x100),
                new ItemListEntry("Item 3", 0x1000, 250)
            }
                );

            string question       = menu.Question?.Trim() ?? "";
            int    questionLength = Math.Min(255, question.Length);

            int length = 11 + questionLength + menu.Entries.Sum(entry => 5 + entry.Name?.Trim().Length ?? 0);

            Span <byte> data = new DisplayItemListMenu(menu).Compile();

            Span <byte> expectedData = stackalloc byte[length];

            int pos = 0;

            expectedData[pos++] = 0x7C; // Packet ID
            ((ushort)length).CopyTo(ref pos, expectedData);
            menu.Serial.CopyTo(ref pos, expectedData);
            pos += 2; // ((ushort)0x00).CopyTo(ref pos, expectedData);
            expectedData[pos++] = (byte)questionLength;
            question.CopyASCIITo(ref pos, expectedData);
            expectedData[pos++] = (byte)menu.Entries.Length;
            for (int i = 0; i < menu.Entries.Length; i++)
            {
                var entry = menu.Entries[i];
                ((ushort)entry.ItemID).CopyTo(ref pos, expectedData);
                ((ushort)entry.Hue).CopyTo(ref pos, expectedData);
                string name = entry.Name?.Trim() ?? "";

                expectedData[pos++] = (byte)name.Length;
                name.CopyASCIITo(ref pos, expectedData);
            }

            AssertThat.Equal(data, expectedData);
        }
        // Methods
        public DisplayItemListMenu(ItemListMenu menu) : base(124)
        {
            int           num3;
            ItemListEntry entry1;
            string        text2;
            int           num4;

            base.EnsureCapacity(256);
            this.m_Stream.Write(menu.Serial);
            this.m_Stream.Write(((short)0));
            string text1 = menu.Question;

            if (text1 == null)
            {
                text1 = "";
            }
            int num1 = ((byte)text1.Length);

            this.m_Stream.Write(((byte)num1));
            this.m_Stream.WriteAsciiFixed(text1, num1);
            ItemListEntry[] entryArray1 = menu.Entries;
            int             num2        = ((byte)entryArray1.Length);

            this.m_Stream.Write(((byte)num2));
            for (num3 = 0; (num3 < num2); ++num3)
            {
                entry1 = entryArray1[num3];
                this.m_Stream.Write(((short)(entry1.ItemID & 16383)));
                this.m_Stream.Write(((short)entry1.Hue));
                text2 = entry1.Name;
                if (text2 == null)
                {
                    text2 = "";
                }
                num4 = ((byte)text2.Length);
                this.m_Stream.Write(((byte)num4));
                this.m_Stream.WriteAsciiFixed(text2, num4);
            }
        }