예제 #1
0
        // reader から1つユニットを読み込む。
        // 返却したUnitDataはリストに追加されている状態。
        private UnitData LoadUnit(SrcDataReader reader, UnitData lastUd)
        {
            UnitData ud = null;

            try
            {
                int    ret;
                string buf, buf2;
                var    line_buf = "";

                // 空行をスキップ
                while (reader.HasMore && string.IsNullOrEmpty(line_buf))
                {
                    line_buf = reader.GetLine();
                }
                if (lastUd != null)
                {
                    lastUd.DataComment = reader.RawComment.Trim();
                }
                else
                {
                    DataComment = string.Join(Environment.NewLine + Environment.NewLine,
                                              new string[] {
                        DataComment,
                        reader.RawComment.Trim(),
                    }.Where(x => !string.IsNullOrEmpty(x)));
                }
                reader.ClearRawComment();
                if (reader.EOT)
                {
                    return(null);
                }

                // 名称
                string data_name;
                ret = Strings.InStr(line_buf, ",");
                if (ret > 0)
                {
                    data_name = Strings.Trim(Strings.Left(line_buf, ret - 1));
                    buf       = Strings.Mid(line_buf, ret + 1);
                }
                else
                {
                    data_name = line_buf;
                    buf       = "";
                }

                if (Strings.InStr(data_name, " ") > 0)
                {
                    throw reader.InvalidDataException(@"名称に半角スペースは使用出来ません。", data_name);
                }

                if (Strings.InStr(data_name, "(") > 0 || Strings.InStr(data_name, ")") > 0)
                {
                    throw reader.InvalidDataException(@"名称に全角括弧は使用出来ません。", data_name);
                }

                if (Strings.InStr(data_name, "\"") > 0)
                {
                    throw reader.InvalidDataException(@"名称に\は使用出来ません。", data_name);
                }

                if (IsDefined(data_name))
                {
                    ud = Item(data_name);
                    ud.Clear();
                }
                else
                {
                    ud = Add(data_name);
                }
                // 読み仮名
                ret = Strings.InStr(buf, ",");
                if (ret > 0)
                {
                    throw reader.InvalidDataException(@"読み仮名の後に余分なデータが指定されています。", data_name);
                }
                ud.KanaName = buf;

                // 愛称, 読み仮名, ユニットクラス, パイロット数, アイテム数
                line_buf = reader.GetLine();
                // 書式チェックのため、コンマの数を数えておく
                int comma_num = 0;
                var loopTo    = Strings.Len(line_buf);
                for (int i = 1; i <= loopTo; i++)
                {
                    if (Strings.Mid(line_buf, i, 1) == ",")
                    {
                        comma_num = (comma_num + 1);
                    }
                }

                if (comma_num < 3)
                {
                    throw reader.InvalidDataException(@"設定に抜けがあります。", data_name);
                }
                else if (comma_num > 4)
                {
                    throw reader.InvalidDataException(@"余分な「,」があります。", data_name);
                }

                // 愛称
                if (Strings.Len(line_buf) == 0)
                {
                    throw reader.InvalidDataException(@"愛称の設定が抜けています。", data_name);
                }

                ret         = Strings.InStr(line_buf, ",");
                buf2        = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf         = Strings.Mid(line_buf, ret + 1);
                ud.Nickname = buf2;

                // 読み仮名
                if (comma_num == 4)
                {
                    ret         = Strings.InStr(buf, ",");
                    buf2        = Strings.Trim(Strings.Left(buf, ret - 1));
                    buf         = Strings.Mid(buf, ret + 1);
                    ud.KanaName = buf2;
                }
                else
                {
                    ud.KanaName = GeneralLib.StrToHiragana(ud.Nickname);
                }

                // ユニットクラス
                ret  = Strings.InStr(buf, ",");
                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (!Information.IsNumeric(buf2))
                {
                    ud.Class = buf2;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"ユニットクラスの設定が間違っています。", data_name));
                    ud.Class = "汎用";
                }

                // パイロット数
                ret  = Strings.InStr(buf, ",");
                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (Strings.Left(buf2, 1) != "(")
                {
                    if (Information.IsNumeric(buf2))
                    {
                        ud.PilotNum = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99);
                    }
                    else
                    {
                        SRC.AddDataError(reader.InvalidData(@"パイロット数の設定が間違っています。", data_name));
                        ud.PilotNum = 1;
                    }
                    if (ud.PilotNum < 1)
                    {
                        SRC.AddDataError(reader.InvalidData(@"パイロット数の設定が間違っています。", data_name));
                        ud.PilotNum = 1;
                    }
                }
                else
                {
                    if (Strings.Right(buf2, 1) != ")")
                    {
                        throw reader.InvalidDataException(@"パイロット数の設定が間違っています。", data_name);
                    }

                    buf2 = Strings.Mid(buf2, 2, Strings.Len(buf2) - 2);
                    if (Information.IsNumeric(buf2))
                    {
                        ud.PilotNum = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99);
                    }
                    else
                    {
                        SRC.AddDataError(reader.InvalidData(@"パイロット数の設定が間違っています。", data_name));
                        ud.PilotNum = 1;
                    }

                    if (ud.PilotNum < 1)
                    {
                        SRC.AddDataError(reader.InvalidData(@"パイロット数の設定が間違っています。", data_name));
                        ud.PilotNum = 1;
                    }

                    // XXX 何で負数にしてるの?
                    ud.PilotNum = -ud.PilotNum;
                }

                // アイテム数
                buf = Strings.Trim(buf);
                if (Strings.Len(buf) == 0)
                {
                    throw reader.InvalidDataException(@"アイテム数の設定が抜けています。", data_name);
                }

                if (Information.IsNumeric(buf))
                {
                    ud.ItemNum = GeneralLib.MinLng(Conversions.ToInteger(buf), 99);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"アイテム数の設定が間違っています。", data_name));
                    ud.ItemNum = 4;
                }

                // 移動可能地形, 移動力, サイズ, 修理費, 経験値
                line_buf = reader.GetLine();

                // 移動可能地形
                ret = Strings.InStr(line_buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"移動力の設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf  = Strings.Mid(line_buf, ret + 1);
                if (!Information.IsNumeric(buf2))
                {
                    ud.Transportation = buf2;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"移動可能地形の設定が間違っています。", data_name));
                    ud.Transportation = "陸";
                }

                // 移動力
                ret = Strings.InStr(buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"サイズの設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (Information.IsNumeric(buf2))
                {
                    ud.Speed = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"移動力の設定が間違っています。", data_name));
                }

                // サイズ
                ret = Strings.InStr(buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"経験値の設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                switch (buf2 ?? "")
                {
                case "XL":
                case "LL":
                case "L":
                case "M":
                case "S":
                case "SS":
                {
                    ud.Size = buf2;
                    break;
                }

                default:
                {
                    SRC.AddDataError(reader.InvalidData(@"サイズの設定が間違っています。", data_name));
                    ud.Size = "M";
                    break;
                }
                }

                // 修理費
                ret = Strings.InStr(buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"経験値の設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (Information.IsNumeric(buf2))
                {
                    ud.Value = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"修理費の設定が間違っています。", data_name));
                }

                // 経験値
                buf = Strings.Trim(buf);
                if (Strings.Len(buf) == 0)
                {
                    throw reader.InvalidDataException(@"経験値の設定が抜けています。", data_name);
                }

                if (Information.IsNumeric(buf))
                {
                    ud.ExpValue = GeneralLib.MinLng(Conversions.ToInteger(buf), 9999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"経験値の設定が間違っています。", data_name));
                }

                // 特殊能力データ
                line_buf = LoadFeatureOuter(data_name, ud, reader, SRC);

                // 最大HP
                ret = Strings.InStr(line_buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"最大ENの設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf  = Strings.Mid(line_buf, ret + 1);
                if (Information.IsNumeric(buf2))
                {
                    ud.HP = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"最大HPの設定が間違っています。", data_name));
                    ud.HP = 1000;
                }

                // 最大EN
                ret = Strings.InStr(buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"装甲の設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (Information.IsNumeric(buf2))
                {
                    ud.EN = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"最大ENの設定が間違っています。", data_name));
                    ud.EN = 100;
                }

                // 装甲
                ret = Strings.InStr(buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"運動性の設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                buf  = Strings.Mid(buf, ret + 1);
                if (Information.IsNumeric(buf2))
                {
                    ud.Armor = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"装甲の設定が間違っています。", data_name));
                }

                // 運動性
                buf2 = Strings.Trim(buf);
                if (Strings.Len(buf2) == 0)
                {
                    throw reader.InvalidDataException(@"運動性の設定が抜けています。", data_name);
                }

                if (Information.IsNumeric(buf2))
                {
                    ud.Mobility = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"運動性の設定が間違っています。", data_name));
                }

                // 地形適応, ビットマップ
                line_buf = reader.GetLine();

                // 地形適応
                ret = Strings.InStr(line_buf, ",");
                if (ret == 0)
                {
                    throw reader.InvalidDataException(@"ビットマップの設定が抜けています。", data_name);
                }

                buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf  = Strings.Mid(line_buf, ret + 1);
                if (Strings.Len(buf2) == 4)
                {
                    ud.Adaption = buf2;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"地形適応の設定が間違っています。", data_name));
                    ud.Adaption = "AAAA";
                }

                // ビットマップ
                buf = Strings.Trim(buf);
                if (Strings.Len(buf) == 0)
                {
                    throw reader.InvalidDataException(@"ビットマップの設定が抜けています。", data_name);
                }

                if (Strings.LCase(Strings.Right(buf, 4)) == ".bmp")
                {
                    ud.Bitmap = buf;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"ビットマップの設定が間違っています。", data_name));
                    ud.IsBitmapMissing = true;
                }

                if (reader.EOT)
                {
                    return(ud);
                }

                // 武器データ
                line_buf = LoadWepon(data_name, ud, reader, SRC);

                if (line_buf != "===")
                {
                    return(ud);
                }

                // アビリティデータ
                line_buf = LoadAbility(data_name, ud, reader, SRC);
            }
            finally
            {
                if (ud != null)
                {
                    ud.Raw = reader.RawData;
                    reader.ClearRawData();
                }
            }
            return(ud);
        }