Advertisement
Moolah60

WW Message Tags

Nov 2nd, 2022
990
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 23.50 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Animal_Crossing_Text_Editor.Classes.Parser.NDS
  6. {
  7.     public static class MessageTags
  8.     {
  9.         private const byte TagChar = 0x1A;
  10.  
  11.         public sealed class MessageTag
  12.         {
  13.             public byte Group;
  14.             public ushort Index;
  15.             public int ArgsByteCount;
  16.  
  17.             public readonly Conversion Conversion;
  18.  
  19.             public MessageTag(byte group, ushort index, int argsByteCount, Conversion conversion)
  20.             {
  21.                 Group = group;
  22.                 Index = index;
  23.                 ArgsByteCount = argsByteCount;
  24.                 Conversion = conversion;
  25.             }
  26.  
  27.             public MessageTag(byte group, ushort index, int argsByteCount, Func<byte, ushort, byte[], string> b2s, Func<byte, ushort, byte[], int, byte[], int> s2b)
  28.                 : this(group, index, argsByteCount, (b2s, s2b)) { }
  29.         }
  30.  
  31.         public static string GetMessageTagString(byte group, ushort index, in byte[] arguments = null)
  32.         {
  33.             if (Tags.ContainsKey(group) && Tags[group].ContainsKey(index))
  34.             {
  35.                 return Tags[group][index].Conversion.Bytes2String(group, index, arguments);
  36.             }
  37.  
  38.             var argsStr = arguments?.Aggregate("", (result, i) => result + i.ToString("X2") + " ").Trim() ?? "";
  39.             return $"<Unk {group:X2}|{index:X4}|{argsStr}>";
  40.         }
  41.  
  42.         public sealed class Conversion
  43.         {
  44.             public Func<byte, ushort, byte[], int, byte[], int> String2Bytes;
  45.             public Func<byte, ushort, byte[], string> Bytes2String;
  46.  
  47.  
  48.  
  49.             public void ToBytes(byte group, ushort index, in byte[] args, ref int write_ofs, in byte[] data)
  50.             {
  51.                 int res = String2Bytes(group, index, args, write_ofs, data);
  52.                 write_ofs += res;
  53.             }
  54.  
  55.             public string ToString(byte group, ushort index, in byte[] args) => Bytes2String(group, index, args);
  56.  
  57.             public static implicit operator Conversion(Func<byte, ushort, byte[], int, byte[], int> s2b)
  58.             {
  59.                 return new Conversion() { String2Bytes = s2b };
  60.             }
  61.  
  62.             public static implicit operator Conversion(Func<byte, ushort, byte[], string> b2s)
  63.             {
  64.                 return new Conversion() { Bytes2String = b2s };
  65.             }
  66.  
  67.             public static implicit operator Conversion((Func<byte, ushort, byte[], string>, Func<byte, ushort, byte[], int, byte[], int>) methods)
  68.             {
  69.                 return new Conversion() { Bytes2String = methods.Item1, String2Bytes = methods.Item2 };
  70.             }
  71.         }
  72.  
  73.         private static readonly Func<byte, ushort, byte[], int, byte[], int> default_string2bytes = (group, index, args, i, data) =>
  74.         {
  75.             data[i] = TagChar;
  76.             data[i + 1] = 0x5;
  77.             data[i + 2] = group;
  78.             data[i + 3] = (byte)index;
  79.             data[i + 4] = (byte)(index >> 8);
  80.             return 5;
  81.         };
  82.  
  83.         public static readonly IReadOnlyDictionary<byte, IReadOnlyDictionary<ushort, MessageTag>> Tags = new Dictionary<byte, IReadOnlyDictionary<ushort, MessageTag>>()
  84.         {
  85.             {
  86.                 0x00, new Dictionary<ushort, MessageTag> // 00-0A
  87.                 {
  88.                     {
  89.                         0x0000,
  90.                         new MessageTag(0x00, 0x0000, 0,
  91.                         (_, __, ___) => "<Heart Symbol>",
  92.                         default_string2bytes)
  93.                     },
  94.                     {
  95.                         0x0001,
  96.                         new MessageTag(0x00, 0x0001, 0,
  97.                         (_, __, ___) => "<Music Note>",
  98.                         default_string2bytes)
  99.                     },
  100.                     {
  101.                         0x0002,
  102.                         new MessageTag(0x00, 0x0002, 0,
  103.                         (_, __, ___) => "<Player Initial>",
  104.                         default_string2bytes)
  105.                     },
  106.                     {
  107.                         0x0006,
  108.                         new MessageTag(0x00, 0x0006, 0,
  109.                         (_, __, ___) => "<Arrow Symbol>",
  110.                         default_string2bytes)
  111.                     },
  112.                     {
  113.                         0x0007,
  114.                         new MessageTag(0x00, 0x0007, 0,
  115.                         (_, __, ___) => "<Star Symbol>",
  116.                         default_string2bytes)
  117.                     },
  118.                     {
  119.                         0x0008,
  120.                         new MessageTag(0x00, 0x0008, 0,
  121.                         (_, __, ___) => "<Droplet Symbol>",
  122.                         default_string2bytes)
  123.                     },
  124.                 }
  125.             },
  126.  
  127.             {
  128.                 0x01, new Dictionary<ushort, MessageTag> //  0x00-0x10
  129.                 {
  130.                     {
  131.                         0x0000,
  132.                         new MessageTag(0x01, 0x0000, 2,
  133.                         (_, __, args) => $"<Pause [{BitConverter.ToUInt16(args, 0):X2}]>",
  134.                         (group, index, args, i, data) => {
  135.                             data[i] = TagChar;
  136.                             data[i + 1] = 0x5 + sizeof(ushort);
  137.                             data[i + 2] = group;
  138.                             data[i + 3] = (byte)index;
  139.                             data[i + 4] = (byte)(index >> 8);
  140.                             data[i + 5] = args[0];
  141.                             data[i + 6] = args[1];
  142.                             return 5 + sizeof(ushort);
  143.                         })
  144.                     },
  145.                     { 0x0001, new MessageTag(0x01, 0x0001, 0, (_, __, ___) => "<Press Button>", default_string2bytes) }, // Not sure about this one.
  146.                     { 0x0002, new MessageTag(0x01, 0x0002, 0, (_, __, ___) => "<No Text Delay>", default_string2bytes) },
  147.                     { 0x0003, new MessageTag(0x01, 0x0003, 0, (_, __, ___) => "<Resume Text Delay>", default_string2bytes) },
  148.                     //{ 0x0004, new MessageTag(0x01, 0x0004, 0, (_, __, ___) => "", default_string2bytes) },
  149.                     { 0x0008, new MessageTag(0x01, 0x0008, 0, (_, __, ___) => "<Small Vibration>", default_string2bytes) },
  150.                     { 0x0009, new MessageTag(0x01, 0x0009, 0, (_, __, ___) => "<Medium Vibration>", default_string2bytes) },
  151.                     { 0x000A, new MessageTag(0x01, 0x000A, 0, (_, __, ___) => "<Large Vibration>", default_string2bytes) },
  152.                 }
  153.             },
  154.  
  155.             {
  156.                 0x02, new Dictionary<ushort, MessageTag>
  157.                 {
  158.                     {
  159.                         0x0000,
  160.                         new MessageTag(0x02, 0x0000, 2,
  161.                         (_, __, args) => $"<Set Choices [{args[0]:X2}] [{args[1]:X2}]>",
  162.                         (group, index, args, i, data) => {
  163.                             data[i] = TagChar;
  164.                             data[i + 1] = 0x5 + 2 * sizeof(byte);
  165.                             data[i + 2] = group;
  166.                             data[i + 3] = (byte)index;
  167.                             data[i + 4] = (byte)(index >> 8);
  168.                             data[i + 5] = args[0];
  169.                             data[i + 6] = args[1];
  170.                             return 5 + 2 * sizeof(byte);
  171.                         })
  172.                     },
  173.                     {
  174.                         0x0001,
  175.                         new MessageTag(0x02, 0x0001, 3,
  176.                         (_, __, args) => $"<Set Choices [{args[0]:X2}] [{args[1]:X2}] [{args[2]:X2}]>",
  177.                         (group, index, args, i, data) => {
  178.                             data[i] = TagChar;
  179.                             data[i + 1] = 0x5 + 3 * sizeof(byte);
  180.                             data[i + 2] = group;
  181.                             data[i + 3] = (byte)index;
  182.                             data[i + 4] = (byte)(index >> 8);
  183.                             data[i + 5] = args[0];
  184.                             data[i + 6] = args[1];
  185.                             data[i + 7] = args[2];
  186.                             return 5 + 3 * sizeof(byte);
  187.                         })
  188.                     },
  189.                     {
  190.                         0x0002,
  191.                         new MessageTag(0x02, 0x0002, 4,
  192.                         (_, __, args) => $"<Set Choices [{args[0]:X2}] [{args[1]:X2}] [{args[2]:X2}] [{args[3]:X2}]>",
  193.                         (group, index, args, i, data) => {
  194.                             data[i] = TagChar;
  195.                             data[i + 1] = 0x5 + 4 * sizeof(byte);
  196.                             data[i + 2] = group;
  197.                             data[i + 3] = (byte)index;
  198.                             data[i + 4] = (byte)(index >> 8);
  199.                             data[i + 5] = args[0];
  200.                             data[i + 6] = args[1];
  201.                             data[i + 7] = args[2];
  202.                             data[i + 8] = args[3];
  203.                             return 5 + 4 * sizeof(byte);
  204.                         })
  205.                     },
  206.                 }
  207.             },
  208.  
  209.             {
  210.                 0x03, new Dictionary<ushort, MessageTag>
  211.                 {
  212.  
  213.                 }
  214.             },
  215.  
  216.             // String group
  217.             {
  218.                 0x04, new Dictionary<ushort, MessageTag> // 35
  219.                 {
  220.                     { 0x0000, new MessageTag(0x04, 0x0000, 0, (_, __, ___) => "<Player>", default_string2bytes) }, // Might default to nickname.
  221.                     { 0x0001, new MessageTag(0x04, 0x0001, 0, (_, __, ___) => "<NPC>", default_string2bytes) },
  222.                     { 0x0002, new MessageTag(0x04, 0x0002, 0, (_, __, ___) => "<Catchphrase>", default_string2bytes) },
  223.                     { 0x0003, new MessageTag(0x04, 0x0003, 0, (_, __, ___) => "<Town>", default_string2bytes) },
  224.                     { 0x0004, new MessageTag(0x04, 0x0004, 0, (_, __, ___) => "<Year>", default_string2bytes) },
  225.                     { 0x0005, new MessageTag(0x04, 0x0005, 0, (_, __, ___) => "<Month>", default_string2bytes) },
  226.                     { 0x0006, new MessageTag(0x04, 0x0006, 0, (_, __, ___) => "<Day>", default_string2bytes) },
  227.                     { 0x0007, new MessageTag(0x04, 0x0007, 0, (_, __, ___) => "<Weekday>", default_string2bytes) },
  228.                     { 0x0008, new MessageTag(0x04, 0x0008, 0, (_, __, ___) => "<Hour>", default_string2bytes) },
  229.                     { 0x0009, new MessageTag(0x04, 0x0009, 0, (_, __, ___) => "<Minute>", default_string2bytes) },
  230.                     { 0x000A, new MessageTag(0x04, 0x000A, 0, (_, __, ___) => "<Second>", default_string2bytes) },
  231.                     { 0x000B, new MessageTag(0x04, 0x000B, 0, (_, __, ___) => "<Gossip Villager 1>", default_string2bytes) },
  232.                     { 0x000C, new MessageTag(0x04, 0x000C, 0, (_, __, ___) => "<Gossip Villager 2>", default_string2bytes) },
  233.                     { 0x000D, new MessageTag(0x04, 0x000D, 0, (_, __, ___) => "<Gossip Villager 3>", default_string2bytes) },
  234.                     { 0x000E, new MessageTag(0x04, 0x000E, 0, (_, __, ___) => "<Gossip Villager 4>", default_string2bytes) },
  235.  
  236.                     // String 1 - 11
  237.                     { 0x000F, new MessageTag(0x04, 0x000F, 0, GetStringMessage, default_string2bytes) },
  238.                     { 0x0010, new MessageTag(0x04, 0x0010, 0, GetStringMessage, default_string2bytes) },
  239.                     { 0x0011, new MessageTag(0x04, 0x0011, 0, GetStringMessage, default_string2bytes) },
  240.                     { 0x0012, new MessageTag(0x04, 0x0012, 0, GetStringMessage, default_string2bytes) },
  241.                     { 0x0013, new MessageTag(0x04, 0x0013, 0, GetStringMessage, default_string2bytes) },
  242.                     { 0x0014, new MessageTag(0x04, 0x0014, 0, GetStringMessage, default_string2bytes) },
  243.                     { 0x0015, new MessageTag(0x04, 0x0015, 0, GetStringMessage, default_string2bytes) },
  244.                     { 0x0016, new MessageTag(0x04, 0x0016, 0, GetStringMessage, default_string2bytes) },
  245.                     { 0x0017, new MessageTag(0x04, 0x0017, 0, GetStringMessage, default_string2bytes) },
  246.                     { 0x0018, new MessageTag(0x04, 0x0018, 0, GetStringMessage, default_string2bytes) },
  247.                     { 0x0019, new MessageTag(0x04, 0x0019, 0, GetStringMessage, default_string2bytes) },
  248.  
  249.                     // Item String 1 - 4
  250.                     { 0x001A, new MessageTag(0x04, 0x001A, 0, GetItemStringMessage, default_string2bytes) },
  251.                     { 0x001B, new MessageTag(0x04, 0x001B, 0, GetItemStringMessage, default_string2bytes) },
  252.                     { 0x001C, new MessageTag(0x04, 0x001C, 0, GetItemStringMessage, default_string2bytes) },
  253.                     { 0x001D, new MessageTag(0x04, 0x001D, 0, GetItemStringMessage, default_string2bytes) },
  254.  
  255.                     { 0x001E, new MessageTag(0x04, 0x001E, 0, (_, __, ___) => "<Player Remembered Action>", default_string2bytes) },
  256.                     { 0x001F, new MessageTag(0x04, 0x001F, 0, (_, __, ___) => "<Player Nickname>", default_string2bytes) }, // Might use player name specifically.
  257.                     { 0x0020, new MessageTag(0x04, 0x0020, 0, (_, __, ___) => "<String Dummpy Proc 32>", default_string2bytes) },
  258.                     { 0x0021, new MessageTag(0x04, 0x0021, 0, (_, __, ___) => "<Yay Day Compliment>", default_string2bytes) },
  259.                     { 0x0022, new MessageTag(0x04, 0x0022, 0, (_, __, ___) => "<Hobby>", default_string2bytes) }
  260.                 }
  261.             },
  262.  
  263.             {
  264.                 0x05, new Dictionary<ushort, MessageTag>
  265.                 {
  266.  
  267.                 }
  268.             },
  269.  
  270.             {
  271.                 0x06, new Dictionary<ushort, MessageTag>
  272.                 {
  273.                     {
  274.                         0x0000,
  275.                         new MessageTag(0x06, 0x0000, 2,
  276.                         (_, __, args) => $"<Select Random Dialog from [{args[0]:X2}] [{args[1]:X2}]>",
  277.                         (group, index, args, i, data) => {
  278.                             data[i] = TagChar;
  279.                             data[i + 1] = 0x5 + 2 * sizeof(byte);
  280.                             data[i + 2] = group;
  281.                             data[i + 3] = (byte)index;
  282.                             data[i + 4] = (byte)(index >> 8);
  283.                             data[i + 5] = args[0];
  284.                             data[i + 6] = args[1];
  285.                             return 5 + 2 * sizeof(byte);
  286.                         })
  287.                     },
  288.                     {
  289.                         0x0001,
  290.                         new MessageTag(0x06, 0x0001, 3,
  291.                         (_, __, args) => $"<Select Random Dialog from [{args[0]:X2}] [{args[1]:X2}] [{args[2]:X2}]>",
  292.                         (group, index, args, i, data) => {
  293.                             data[i] = TagChar;
  294.                             data[i + 1] = 0x5 + 3 * sizeof(byte);
  295.                             data[i + 2] = group;
  296.                             data[i + 3] = (byte)index;
  297.                             data[i + 4] = (byte)(index >> 8);
  298.                             data[i + 5] = args[0];
  299.                             data[i + 6] = args[1];
  300.                             data[i + 7] = args[2];
  301.                             return 5 + 3 * sizeof(byte);
  302.                         })
  303.                     }
  304.                 }
  305.             },
  306.  
  307.             {
  308.                 0x07, new Dictionary<ushort, MessageTag>
  309.                 {
  310.                     { 0x0000, new MessageTag(0x07, 0x0000, 0, (_, __, ___) => "<Clear Reaction>", default_string2bytes) },
  311.                     { 0x0001, new MessageTag(0x07, 0x0001, 0, (_, __, ___) => "<Reaction (Annoyed)>", default_string2bytes) },
  312.                     { 0x0002, new MessageTag(0x07, 0x0002, 0, (_, __, ___) => "<Reaction (Shocked)>", default_string2bytes) },
  313.                     { 0x0003, new MessageTag(0x07, 0x0003, 0, (_, __, ___) => "<Reaction (Laughter)>", default_string2bytes) },
  314.                     { 0x0004, new MessageTag(0x07, 0x0004, 0, (_, __, ___) => "<Reaction (Amazed)>", default_string2bytes) },
  315.                     { 0x0005, new MessageTag(0x07, 0x0005, 0, (_, __, ___) => "<Reaction (Aggravation)>", default_string2bytes) },
  316.                     { 0x0006, new MessageTag(0x07, 0x0006, 0, (_, __, ___) => "<Reaction (Distress)>", default_string2bytes) },
  317.                     { 0x0007, new MessageTag(0x07, 0x0007, 0, (_, __, ___) => "<Reaction (Fearful)>", default_string2bytes) },
  318.                     { 0x0008, new MessageTag(0x07, 0x0008, 0, (_, __, ___) => "<Reaction (Sorrow)>", default_string2bytes) },
  319.                     { 0x0009, new MessageTag(0x07, 0x0009, 0, (_, __, ___) => "<Reaction (Cold Chill)>", default_string2bytes) },
  320.                     { 0x000A, new MessageTag(0x07, 0x000A, 0, (_, __, ___) => "<Reaction (Joy)>", default_string2bytes) },
  321.                     { 0x000B, new MessageTag(0x07, 0x000B, 0, (_, __, ___) => "<Reaction (Curiosity)>", default_string2bytes) },
  322.                     { 0x000C, new MessageTag(0x07, 0x000C, 0, (_, __, ___) => "<Reaction (Inspiration)>", default_string2bytes) },
  323.                     { 0x000D, new MessageTag(0x07, 0x000D, 0, (_, __, ___) => "<Reaction (Glee)>", default_string2bytes) },
  324.                     { 0x000E, new MessageTag(0x07, 0x000E, 0, (_, __, ___) => "<Reaction (Thought)>", default_string2bytes) },
  325.                     { 0x000F, new MessageTag(0x07, 0x000F, 0, (_, __, ___) => "<Reaction (Sadness)>", default_string2bytes) },
  326.                     { 0x0010, new MessageTag(0x07, 0x0010, 0, (_, __, ___) => "<Reaction (Heartbreak)>", default_string2bytes) },
  327.                     { 0x0011, new MessageTag(0x07, 0x0011, 0, (_, __, ___) => "<Reaction (Mischief)>", default_string2bytes) },
  328.                     { 0x0012, new MessageTag(0x07, 0x0012, 0, (_, __, ___) => "<Reaction (Sleepy)>", default_string2bytes) },
  329.                     { 0x0013, new MessageTag(0x07, 0x0013, 0, (_, __, ___) => "<Reaction (Love)>", default_string2bytes) },
  330.                     { 0x0014, new MessageTag(0x07, 0x0014, 0, (_, __, ___) => "<Reaction (Happiness)>", default_string2bytes) },
  331.                     { 0x0015, new MessageTag(0x07, 0x0015, 0, (_, __, ___) => "<Reaction (Intense)>", default_string2bytes) },
  332.                     { 0x0016, new MessageTag(0x07, 0x0016, 0, (_, __, ___) => "<Reaction (Worry)>", default_string2bytes) },
  333.                     { 0x0017, new MessageTag(0x07, 0x0017, 0, (_, __, ___) => "<Reaction (Bashfulness)>", default_string2bytes) },
  334.                     { 0x0018, new MessageTag(0x07, 0x0018, 0, (_, __, ___) => "<Reaction (Shaken)>", default_string2bytes) },
  335.                     { 0x0019, new MessageTag(0x07, 0x0019, 0, (_, __, ___) => "<Reaction (Agreement)>", default_string2bytes) },
  336.                     { 0x001A, new MessageTag(0x07, 0x001A, 0, (_, __, ___) => "<Reaction (Delight)>", default_string2bytes) },
  337.                     { 0x001B, new MessageTag(0x07, 0x001B, 0, (_, __, ___) => "<Reaction (Resignation)>", default_string2bytes) },
  338.                     { 0x001C, new MessageTag(0x07, 0x001C, 0, (_, __, ___) => "<Reaction (Sighing)>", default_string2bytes) },
  339.                     { 0x001D, new MessageTag(0x07, 0x001D, 0, (_, __, ___) => "<Reaction (Surprise)>", default_string2bytes) },
  340.                     { 0x001E, new MessageTag(0x07, 0x001E, 0, (_, __, ___) => "<Reaction (Spread Cards)>", default_string2bytes) },
  341.                     { 0x001F, new MessageTag(0x07, 0x001F, 0, (_, __, ___) => "<Reaction (Pick Card)>", default_string2bytes) },
  342.                     { 0x0020, new MessageTag(0x07, 0x0020, 0, (_, __, ___) => "<Reaction (Putaway Cards)>", default_string2bytes) },
  343.                     { 0x0021, new MessageTag(0x07, 0x0021, 0, (_, __, ___) => "<Reaction (Read Fortune)>", default_string2bytes) },
  344.                     { 0x0022, new MessageTag(0x07, 0x0022, 0, (_, __, ___) => "<Reaction (Gatekeeper Salute)>", default_string2bytes) },
  345.                     { 0x0023, new MessageTag(0x07, 0x0023, 0, (_, __, ___) => "<Reaction (Gatekeeper Attention)>", default_string2bytes) },
  346.                     { 0x0024, new MessageTag(0x07, 0x0024, 0, (_, __, ___) => "<Reaction (Gatekeeper Surprise)>", default_string2bytes) },
  347.                     { 0x0025, new MessageTag(0x07, 0x0025, 0, (_, __, ___) => "<Reaction (GateKeeper Curiosity)>", default_string2bytes) },
  348.                     { 0x0026, new MessageTag(0x07, 0x0026, 0, (_, __, ___) => "<Reaction (Gulliver Joy)>", default_string2bytes) },
  349.                     { 0x0027, new MessageTag(0x07, 0x0027, 0, (_, __, ___) => "<Reaction (Gulliver Sleepy)>", default_string2bytes) },
  350.                     { 0x0028, new MessageTag(0x07, 0x0028, 0, (_, __, ___) => "<Reaction (Sleeping Yawn)>", default_string2bytes) },
  351.                     { 0x0029, new MessageTag(0x07, 0x0029, 0, (_, __, ___) => "<Reaction (Resetti Aggravation)>", default_string2bytes) },
  352.                     { 0x002A, new MessageTag(0x07, 0x002A, 0, (_, __, ___) => "<Reaction (Resetti Worry)>", default_string2bytes) },
  353.                     { 0x002B, new MessageTag(0x07, 0x002B, 0, (_, __, ___) => "<Reaction (Resetti Cold Chill)>", default_string2bytes) },
  354.                     { 0x002C, new MessageTag(0x07, 0x002C, 0, (_, __, ___) => "<Reaction (Resetti Surprise)>", default_string2bytes) },
  355.                     { 0x002D, new MessageTag(0x07, 0x002D, 0, (_, __, ___) => "<Reaction (Resetti Intense)>", default_string2bytes) },
  356.                     { 0x002E, new MessageTag(0x07, 0x002E, 0, (_, __, ___) => "<Reaction (Resetti Distrust)>", default_string2bytes) },
  357.                     { 0x002F, new MessageTag(0x07, 0x002F, 0, (_, __, ___) => "<Reaction (Resetti Rage)>", default_string2bytes) },
  358.                     { 0x0030, new MessageTag(0x07, 0x0030, 0, (_, __, ___) => "<Reaction (Kapp'n 1)>", default_string2bytes) }, // TODO: Check these and further
  359.                     { 0x0031, new MessageTag(0x07, 0x0031, 0, (_, __, ___) => "<Reaction (Kapp'n 2)>", default_string2bytes) },
  360.                     { 0x0032, new MessageTag(0x07, 0x0032, 0, (_, __, ___) => "<Reaction (Kapp'n 3)>", default_string2bytes) },
  361.                     // 0x003B is the last entry
  362.                 }
  363.             },
  364.  
  365.             {
  366.                 0x0B, new Dictionary<ushort, MessageTag>
  367.                 {
  368.                     //{ 0x0000, (_, __, ___) => "" }
  369.                     { 0x0002, new MessageTag(0x0B, 0x0002, 0, (_, __, ___) => "<Cut Article>", default_string2bytes) },
  370.                     { 0x0003, new MessageTag(0x0B, 0x0003, 0, (_, __, ___) => "<Capitalize>", default_string2bytes) },
  371.                 }
  372.             },
  373.  
  374.             {
  375.                 0xFF, new Dictionary<ushort, MessageTag>
  376.                 {
  377.                     {
  378.                         0x0000,
  379.                         new MessageTag(0xFF, 0x0000, 1,
  380.                         (_, __, args) => $"<Line Color [{args[0]:X2}]>",
  381.                         (group, index, args, i, data) => {
  382.                             data[i] = TagChar;
  383.                             data[i + 1] = 0x5 + sizeof(byte);
  384.                             data[i + 2] = group;
  385.                             data[i + 3] = (byte)index;
  386.                             data[i + 4] = (byte)(index >> 8);
  387.                             data[i + 5] = args[0];
  388.                             return 5 + sizeof(byte);
  389.                         })
  390.                     }
  391.                 }
  392.             }
  393.         };
  394.  
  395.         private static string GetStringMessage(byte group, ushort index, byte[] arguments = null) => $"<String {index - 0x000E}>";
  396.         private static string GetItemStringMessage(byte group, ushort index, byte[] arguments = null) => $"<Item String {index - 0x0019}>";
  397.     }
  398. }
  399.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement