Esempio n. 1
0
        public static void Init()
        {
            for (int i = 0; i < Entries; i++)
            {
                cc[i] = new CC();
            }

            cc[0].value       = 0xffff;
            cc[0].args        = 0;
            cc[0].description = "Ends the text block";
            cc[0].tag         = "end";

            cc[1].value       = 0xff01;
            cc[1].args        = 0;
            cc[1].description = "Line break";
            cc[1].tag         = "break";

            cc[2].value       = 0xff02;
            cc[2].args        = 0;
            cc[2].description = "End choice selection";
            cc[2].tag         = "endchoices";

            cc[3].value       = 0xff03;
            cc[3].args        = 1;
            cc[3].description = "Wait for player; XXXX is always 0xFF00";
            cc[3].tag         = "wait";

            cc[4].value       = 0xff04;
            cc[4].args        = 1;
            cc[4].description = "Pause for XXXX frames";
            cc[4].tag         = "pause";

            cc[5].value       = 0xff05;
            cc[5].args        = 1;
            cc[5].description = "Change text color; for XXXX, 0=normal, 3=blue";
            cc[5].tag         = "color";

            cc[6].value       = 0xff06;
            cc[6].args        = 1;
            cc[6].description = "Begin choice menu of XXXX choices";
            cc[6].tag         = "menu";

            cc[7].value       = 0xff07;
            cc[7].args        = 0;
            cc[7].description = "Event";
            cc[7].tag         = "event";

            cc[8].value       = 0xff08;
            cc[8].args        = 1;
            cc[8].description = "Play sound XX";
            cc[8].tag         = "sound";

            cc[9].value       = 0xff0b;
            cc[9].args        = 0;
            cc[9].description = "Alternate font between normal and Mr. Saturn";
            cc[9].tag         = "alternatefont";

            cc[10].value       = 0xff0c;
            cc[10].args        = 1;
            cc[10].description = "Unknown";

            cc[11].value       = 0xff21;
            cc[11].args        = 1;
            cc[11].description = "Display name of item XXXX";
            cc[11].tag         = "item";

            cc[12].value       = 0xff22;
            cc[12].args        = 1;
            cc[12].description = "Display character name XXXX";

            cc[13].value       = 0xff23;
            cc[13].args        = 1;
            cc[13].description = "Display character name XXXX";

            cc[14].value       = 0xff24;
            cc[14].args        = 1;
            cc[14].description = "Enemy name";
            cc[14].tag         = "enemyname";

            cc[15].value       = 0xff25;
            cc[15].args        = 1;
            cc[15].description = "Unknown";

            cc[16].value       = 0xff26;
            cc[16].args        = 2;
            cc[16].description = "Display character name XXXX with YYYY amount of succeeding dashes";
            cc[16].tag         = "ー";

            cc[17].value       = 0xff42;
            cc[17].args        = 1;
            cc[17].description = "Unknown";

            cc[18].value       = 0xff45;
            cc[18].args        = 0;
            cc[18].description = "Favorite Food";
            cc[18].tag         = "favfood";

            cc[19].value       = 0xff46;
            cc[19].args        = 0;
            cc[19].description = "Favorite Thing";
            cc[19].tag         = "favthing";

            cc[20].value       = 0xff47;
            cc[20].args        = 0;
            cc[20].description = "Player name";
            cc[20].tag         = "playername";

            cc[21].value       = 0xff48;
            cc[21].args        = 0;
            cc[21].description = "Factory name";
            cc[21].tag         = "factoryname";

            cc[22].value       = 0xff80;
            cc[22].args        = 1;
            cc[22].description = "Unknown";

            cc[23].value       = 0xff81;
            cc[23].args        = 0;// 1
            cc[23].description = "Unknown";

            cc[24].value       = 0xff0a;
            cc[24].args        = 0;
            cc[24].description = "Center (H)";
            cc[24].tag         = "center";

            cc[25].value       = 0xff09;
            cc[25].args        = 0;
            cc[25].description = "Center (H + V)";

            cc[26].value       = 0xff83;
            cc[26].args        = 0;
            cc[26].description = "Unknown";

            cc[27].value       = 0xff82;
            cc[27].args        = 0;
            cc[27].description = "Amount";

            cc[28].value       = 0xff84;
            cc[28].args        = 0;
            cc[28].description = "Unknown";

            cc[29].value       = 0xffe1;
            cc[29].args        = 1;
            cc[29].description = "Display XXXX status icon";
            cc[29].tag         = "icon";

            cc[30].value       = 0xffa0;
            cc[30].args        = 0;
            cc[30].description = "Unknown";

            cc[31].value       = 0xffa1;
            cc[31].args        = 0;
            cc[31].description = "Unknown";

            cc[32].value       = 0xffa2;
            cc[32].args        = 0;
            cc[32].description = "Unknown";

            cc[33].value       = 0xffa3;
            cc[33].args        = 0;
            cc[33].description = "Unknown";

            cc[34].value       = 0xff44;
            cc[34].args        = 0;
            cc[34].description = "Unknown";

            CCLookup.Clear();
            for (int i = 0; i < Entries; i++)
            {
                CCLookup.Add(cc[i].value, cc[i]);
            }
        }
        public static string GetText(int offset, int length, TextType texttype, bool ignorecc)
        {
            string ret = string.Empty;

            switch (texttype)
            {
            case TextType.Japanese:
                List <byte> stringBytes = new List <byte>();

                for (int i = 0; i < length; i++)
                {
                    ushort ch = Rom.ReadUShort(offset);

                    if (ch == 0xFFFF)
                    {
                        if (!ignorecc)
                        {
                            stringBytes.AppendString("[FFFF]");
                        }
                        break;
                    }

                    offset += 2;

                    if (ch >= 0xEF00)
                    {
                        if (!ignorecc)
                        {
                            stringBytes.AppendString("[" + ch.ToString("X4"));
                            if (ch == 0xff22)
                            {
                            }
                            if (M3CC.CCLookup.ContainsKey(ch))
                            {
                                CC c = M3CC.CCLookup[ch];
                                for (int j = 0; j < c.args; j++)
                                {
                                    stringBytes.AppendString(" " + Rom.ReadUShort(offset).ToString("X4"));
                                    offset += 2;
                                }
                            }
                            stringBytes.AppendString("]");
                        }

                        if ((ch == 0xFF01) || (ch == 0xFF32) || (ch == 0xFF03))
                        {
                            // Newline
                            stringBytes.AppendString(Environment.NewLine);
                        }

                        continue;
                    }

                    ch = (ushort)(ch % JapaneseMap.Length);
                    ushort code = JapaneseMap[ch];
                    stringBytes.Add((byte)((code >> 8) & 0xFF));
                    stringBytes.Add((byte)(code & 0xFF));
                }

                byte[] converted = Encoding.Convert(SJIS, Unicode, stringBytes.ToArray());
                ret = Unicode.GetString(converted);
                break;

            case TextType.EnglishWide:
                for (int i = 0; i < length; i++)
                {
                    ushort ch = Rom.ReadUShort(offset);

                    if (ch == 0xFFFF)
                    {
                        break;
                    }

                    offset += 2;

                    if (ch >= 0xEF00)
                    {
                        if (ignorecc)
                        {
                            if ((ch == 0xFF01) || (ch == 0xFF32) || (ch == 0xFF03))
                            {
                                // Newline
                                ret += Environment.NewLine;
                            }
                        }

                        else
                        {
                            ret += "[" + ch.ToString("X4") + "]";
                        }

                        continue;
                    }

                    ch  &= 0xFF;
                    ret += EnglishMap[ch];
                }
                break;

            case TextType.EnglishShort:
            case TextType.EnglishShortRaw:

                bool obfuscated = texttype == TextType.EnglishShort;

                for (int i = 0; i < length; i++)
                {
                    byte ch = Rom.DecodeByte(offset, obfuscated);

                    // Check for control codes
                    if (ch == 0xEF)
                    {
                        // EF is a custom control code
                        ret += "[EF";
                        ret += Rom.DecodeByte(offset + 1, obfuscated).ToString("X2") + "]";
                        offset++;
                    }

                    else if (ch >= 0xF0)
                    {
                        // Special case: 0xFF = end
                        if (ch == 0xFF)
                        {
                            ret += "[FFFF]";
                            break;
                        }

                        // Else: get the cc length
                        int cclen = ch & 0xF;

                        // Get the control byte
                        byte ccbyte    = Rom.DecodeByte(offset + 1, obfuscated);
                        bool doNewLine = ((ccbyte == 0x01) || (ccbyte == 0x32) || (ccbyte == 0x03));

                        // Print the result
                        ret += "[FF" + ccbyte.ToString("X2");

                        // Get the arguments
                        ushort[] args = new ushort[cclen];
                        for (int j = 0; j < cclen; j++)
                        {
                            ret += " " + Rom.DecodeUShort(offset + 2 + (j << 1), obfuscated).ToString("X4");
                        }

                        ret += "]";

                        if (doNewLine)
                        {
                            ret += Environment.NewLine;
                        }

                        offset += 1 + (cclen << 1);
                    }

                    else
                    {
                        ret += EnglishMap[ch];
                    }

                    offset++;
                }
                break;
            }

            return(ret);
        }