Exemplo n.º 1
0
        private void RemoveForUnitAndNumber(Unit u, string iname, int inumber)
        {
            if (inumber < 1)
            {
                throw new EventErrorException(this, "指定されたアイテム番号「" + iname + "」が不正です");
            }

            if (inumber > u.CountItem())
            {
                throw new EventErrorException(this, "指定されたユニットは" + SrcFormatter.Format(u.CountItem()) + "個のアイテムしか持っていません");
            }

            var itm = u.Item(inumber);

            u.DeleteItem(itm);
            if (u.Status == "出撃")
            {
                if (!GUI.IsPictureVisible && !Map.IsStatusView)
                {
                    GUI.PaintUnitBitmap(Event.SelectedUnitForEvent);
                }
            }
            itm.Unit  = null;
            itm.Exist = false;
        }
Exemplo n.º 2
0
        // 「命令」コマンドを終了
        private void FinishOrderCommand()
        {
            switch (SelectedCommand ?? "")
            {
            case "移動命令":
            {
                SelectedUnit.Mode = SrcFormatter.Format(SelectedX) + " " + SrcFormatter.Format(SelectedY);
                break;
            }

            case "攻撃命令":
            case "護衛命令":
            {
                SelectedUnit.Mode = SelectedTarget.MainPilot().ID;
                break;
            }
            }

            if (ReferenceEquals(Status.DisplayedUnit, SelectedUnit))
            {
                Status.DisplayUnitStatus(SelectedUnit);
            }

            GUI.RedrawScreen();
            CommandState = "ユニット選択";
        }
Exemplo n.º 3
0
        // 特殊能力を追加
        public void AddSkill(string sname, double slevel, string sdata, int lv)
        {
            // データ定義が省略されている場合は前回と同じ物を使う
            if ((last_sname ?? "") == (sname ?? "") && Strings.Len(sdata) == 0)
            {
                sdata = last_sdata;
            }
            last_sname = sname;
            last_sdata = sdata;

            // エリアスが定義されている?
            if (SRC.ALDList.IsDefined(sname))
            {
                if (GeneralLib.LIndex(sdata, 1) != "解説")
                {
                    RegisterAlias(sname, slevel, sdata, lv);
                    return;
                }
            }

            // 特殊能力を登録
            {
                var sd = new SkillData();
                sd.Name           = sname;
                sd.Level          = slevel;
                sd.StrData        = sdata;
                sd.NecessaryLevel = lv;
                colSkill.Add(sd, sname + SrcFormatter.Format(colSkill.Count));
            }
        }
Exemplo n.º 4
0
        // 「ターン終了」コマンド
        private void EndTurnCommand()
        {
            // 行動していない味方ユニットの数を数える
            var stillActionUnits = SRC.UList.Items.Where(u => u.Party == "味方" && u.CanAction).ToList();

            // 行動していないユニットがいれば警告
            if (stillActionUnits.Any())
            {
                var ret = GUI.Confirm(
                    "行動していないユニットが" + SrcFormatter.Format(stillActionUnits.Count) + "体あります"
                    + Environment.NewLine
                    + "このターンを終了しますか?",
                    "終了",
                    GuiConfirmOption.OkCancel | GuiConfirmOption.Question
                    );
                if (ret == GuiDialogResult.Cancel)
                {
                    return;
                }
            }

            // 行動終了していないユニットに対して行動終了イベントを実施
            foreach (var currentSelectedUnit in stillActionUnits)
            {
                SelectedUnit = currentSelectedUnit;
                Event.HandleEvent("行動終了", currentSelectedUnit.MainPilot().ID);
                if (SRC.IsScenarioFinished)
                {
                    SRC.IsScenarioFinished = false;
                    return;
                }
            }

            // 各陣営のフェイズに移行
            SRC.StartTurn("敵");
            if (SRC.IsScenarioFinished)
            {
                SRC.IsScenarioFinished = false;
                return;
            }

            SRC.StartTurn("中立");
            if (SRC.IsScenarioFinished)
            {
                SRC.IsScenarioFinished = false;
                return;
            }

            SRC.StartTurn("NPC");
            if (SRC.IsScenarioFinished)
            {
                SRC.IsScenarioFinished = false;
                return;
            }

            // 味方フェイズに戻る
            SRC.StartTurn("味方");
            SRC.IsScenarioFinished = false;
        }
Exemplo n.º 5
0
Arquivo: Units.cs Projeto: 7474/SRC
 // 新規ユニットIDを作成
 public string CreateID(string uname)
 {
     do
     {
         IDCount = IDCount + 1;
     } while (IsDefined(uname + ":" + SrcFormatter.Format(IDCount)));
     return(uname + ":" + SrcFormatter.Format(IDCount));
 }
Exemplo n.º 6
0
        // 地形効果を追加
        public void AddFeature(string fdef)
        {
            FeatureData fd;
            string      ftype, fdata = default;
            double      flevel;
            int         i, j;
            string      buf;

            buf = fdef;

            // 地形効果の種類、レベル、データを切り出し
            flevel = Constants.DEFAULT_LEVEL;
            i      = Strings.InStr(buf, "Lv");
            j      = Strings.InStr(buf, "=");
            if (i > 0 && j > 0 && i > j)
            {
                i = 0;
            }

            if (i > 0)
            {
                ftype = Strings.Left(buf, i - 1);
                if (j > 0)
                {
                    flevel = Conversions.ToDouble(Strings.Mid(buf, i + 2, j - (i + 2)));
                    fdata  = Strings.Mid(buf, j + 1);
                }
                else
                {
                    flevel = Conversions.ToDouble(Strings.Mid(buf, i + 2));
                }
            }
            else if (j > 0)
            {
                ftype = Strings.Left(buf, j - 1);
                fdata = Strings.Mid(buf, j + 1);
            }
            else
            {
                ftype = buf;
            }

            // 地形効果を登録
            fd         = new FeatureData();
            fd.Name    = ftype;
            fd.Level   = flevel;
            fd.StrData = fdata;
            if (IsFeatureAvailable(ftype))
            {
                colFeature.Add(fd, ftype + SrcFormatter.Format(CountFeature()));
            }
            else
            {
                colFeature.Add(fd, ftype);
            }
        }
Exemplo n.º 7
0
        // ラベルを追加
        public void AddLabel(string lname, int eventDataId)
        {
            var    new_label = new LabelData(SRC);
            string lname2;

            new_label.Data        = lname;
            new_label.EventDataId = eventDataId;
            new_label.Enable      = true;
            if (new_label.Name == LabelType.NormalLabel)
            {
                // 登録済なら無視
                if (colNormalLabelList.Values.Any(x => x.EventDataId == eventDataId))
                {
                    return;
                }

                // 通常ラベルを追加
                if (FindNormalLabel0(lname) < 0)
                {
                    colNormalLabelList.Add(new_label, lname);
                }
                // 通常ラベルが重複定義されている場合は無視
            }
            else
            {
                // 登録済なら無視
                if (colEventLabelList.Values.Any(x => x.EventDataId == eventDataId))
                {
                    return;
                }

                // イベントラベルを追加
                // パラメータ間の文字列の違いによる不一致をなくすため、
                // 文字列を半角スペース一文字に直しておく
                lname2 = string.Join(" ", GeneralLib.ToList(lname));

                if (!IsLabelDefined(lname2))
                {
                    colEventLabelList.Add(new_label, lname2);
                }
                else
                {
                    var lname3 = lname2 + "(" + SrcFormatter.Format(eventDataId) + ")";
                    if (!IsLabelDefined(lname3))
                    {
                        colEventLabelList.Add(new_label, lname3);
                    }
                }
            }
        }
Exemplo n.º 8
0
        // 新しいアイテムIDを作成
        private string CreateID(string iname)
        {
            string CreateIDRet = default;

            bool localIsDefined2()
            {
                string argIndex1 = (string)(iname + "_" + SrcFormatter.Format(IDCount)); var ret = IsDefined2(argIndex1); return(ret);
            }

            do
            {
                IDCount = IDCount + 1;
            }while (localIsDefined2());
            CreateIDRet = iname + "_" + SrcFormatter.Format(IDCount);
            return(CreateIDRet);
        }
Exemplo n.º 9
0
        protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result)
        {
            str_result = "";
            num_result = 0d;

            // XXX 元は String -> String フォーマット
            // XXX 書式は多分合っていないのでヘルプ更新したほうが良いかも
            str_result = SrcFormatter.Format(SRC.Expression.GetValueAsDouble(@params[1], is_term[1]), SRC.Expression.GetValueAsString(@params[2], is_term[2]));
            if (etype == ValueType.NumericType)
            {
                num_result = GeneralLib.StrToDbl(str_result);
                return(ValueType.NumericType);
            }
            else
            {
                return(ValueType.StringType);
            }
        }
Exemplo n.º 10
0
        // 特殊能力を登録
        private void AddFeatures(IList <FeatureData> fdc, bool is_item = false)
        {
            if (fdc is null)
            {
                return;
            }

            foreach (FeatureData fd in fdc)
            {
                // アイテムで指定された下記の能力はアイテムそのものの属性なので
                // ユニット側には追加しない
                if (is_item)
                {
                    switch (fd.Name ?? "")
                    {
                    case "必要技能":
                    case "不必要技能":
                    case "表示":
                    case "非表示":
                    case "呪い":
                        continue;
                    }
                }

                // 封印されている?
                if (IsDisabled(fd.Name) || IsDisabled(GeneralLib.LIndex(fd.StrData, 1)))
                {
                    continue;
                }

                // 既にその能力が登録されている?
                if (!IsFeatureRegistered(fd.Name))
                {
                    colFeature.Add(fd, fd.Name);
                }
                else
                {
                    colFeature.Add(fd, fd.Name + ":" + SrcFormatter.Format(colFeature.Count));
                }

NextFeature:
                ;
            }
        }
Exemplo n.º 11
0
        // idx番目の引数の値を文字列として返す
        public string GetArgAsString(int idx)
        {
            var arg = GetArgRaw(idx);

            switch (arg.argType)
            {
            case Expressions.ValueType.UndefinedType:
                return(Expression.GetValueAsString(arg.strArg, true));

            case Expressions.ValueType.StringType:
                return(arg.strArg);

            case Expressions.ValueType.NumericType:
                return(SrcFormatter.Format(arg.dblArg));

            default:
                throw new InvalidOperationException();
            }
        }
Exemplo n.º 12
0
        public string FeatureNameWithLv()
        {
            var    fd             = this;
            string FeatureNameRet = default;

            if (Strings.Len(fd.StrData) > 0)
            {
                FeatureNameRet = GeneralLib.ListIndex(fd.StrData, 1);
            }
            else if (fd.Level > 0d)
            {
                FeatureNameRet = fd.Name + "Lv" + SrcFormatter.Format(fd.Level);
            }
            else
            {
                FeatureNameRet = fd.Name;
            }

            return(FeatureNameRet);
        }
Exemplo n.º 13
0
Arquivo: List.cs Projeto: 7474/SRC
        protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result)
        {
            str_result = "";
            num_result = 0d;

            var buf  = SRC.Expression.GetValueAsString(@params[1], is_term[1]);
            var buf2 = SRC.Expression.GetValueAsString(@params[2], is_term[2]);
            var num  = pcount < 3 ? 1 : SRC.Expression.GetValueAsLong(@params[3], is_term[3]);
            var num2 = GeneralLib.ListLength(buf);

            for (var i = num; i <= num2; i++)
            {
                if (GeneralLib.ListIndex(buf, i) == buf2)
                {
                    if (etype == ValueType.StringType)
                    {
                        str_result = SrcFormatter.Format(i);
                        return(ValueType.StringType);
                    }
                    else
                    {
                        num_result = i;
                        return(ValueType.NumericType);
                    }
                }
            }

            if (etype == ValueType.StringType)
            {
                str_result = "0";
                return(ValueType.StringType);
            }
            else
            {
                num_result = 0d;
                return(ValueType.NumericType);
            }
        }
Exemplo n.º 14
0
Arquivo: ListBox.cs Projeto: 7474/SRC
        public void AddPartsToListBox()
        {
            var u = Commands.SelectedUnit;
            var t = Commands.SelectedTarget;

            // リストボックスにユニットやHPのゲージを追加
            Height             = Height + 35;
            labCaption.Top     = 42;
            lstItems.Top       = 69;
            imgPilot1.Visible  = true;
            labLevel1.Visible  = true;
            txtLevel1.Visible  = true;
            labMorale1.Visible = true;
            txtMorale1.Visible = true;
            picUnit1.Visible   = true;
            labHP1.Visible     = true;
            txtHP1.Visible     = true;
            picHP1.Visible     = true;
            labEN1.Visible     = true;
            txtEN1.Visible     = true;
            picEN1.Visible     = true;
            imgPilot2.Visible  = true;
            labLevel2.Visible  = true;
            txtLevel2.Visible  = true;
            labMorale2.Visible = true;
            txtMorale2.Visible = true;
            picUnit2.Visible   = true;
            labHP2.Visible     = true;
            txtHP2.Visible     = true;
            picHP2.Visible     = true;
            labEN2.Visible     = true;
            txtEN2.Visible     = true;
            picEN2.Visible     = true;

            // ユニット側の表示
            // XXX これリークしてく?
            imgPilot1.Image = MainForm.ImageBuffer.Get(SRC.FileSystem.PathCombine("Pilot", u.MainPilot().get_Bitmap(false)));

            txtLevel1.Text  = SrcFormatter.Format(u.MainPilot().Level);
            txtMorale1.Text = SrcFormatter.Format(u.MainPilot().Morale);

            using (var g = Graphics.FromImage(picUnit1.NewImageIfNull().Image))
            {
                MainForm.DrawUnit(g, SRC.Map.CellAtPoint(u.x, u.y), u, new Rectangle(0, 0, frmMain.MapCellPx, frmMain.MapCellPx));
            }
            picUnit1.Refresh();
            if (u.IsConditionSatisfied("データ不明"))
            {
                labHP1.Text = SRC.Expression.Term("HP", u: null);
                txtHP1.Text = "?????/?????";
            }
            else
            {
                labHP1.Text = SRC.Expression.Term("HP", u: null);
                if (u.HP < 100000)
                {
                    txtHP1.Text = SrcFormatter.Format(u.HP);
                }
                else
                {
                    txtHP1.Text = "?????";
                }

                if (u.MaxHP < 100000)
                {
                    txtHP1.Text = txtHP1.Text + "/" + SrcFormatter.Format(u.MaxHP);
                }
                else
                {
                    txtHP1.Text = txtHP1.Text + "/?????";
                }
            }
            picHP1.DrawBar((float)u.HP / u.MaxHP, BarBackBrush, BarForeBrush);
            if (u.IsConditionSatisfied("データ不明"))
            {
                labEN1.Text = SRC.Expression.Term("EN", u: null);
                txtEN1.Text = "???/???";
            }
            else
            {
                labEN1.Text = SRC.Expression.Term("EN", t);
                if (u.EN < 1000)
                {
                    txtEN1.Text = SrcFormatter.Format(u.EN);
                }
                else
                {
                    txtEN1.Text = "???";
                }

                if (u.MaxEN < 1000)
                {
                    txtEN1.Text = txtEN1.Text + "/" + SrcFormatter.Format(u.MaxEN);
                }
                else
                {
                    txtEN1.Text = txtEN1.Text + "/???";
                }
            }
            picEN1.DrawBar((float)u.EN / u.MaxEN, BarBackBrush, BarForeBrush);

            // ターゲット側の表示
            // XXX これリークしてく?
            imgPilot2.Image = MainForm.ImageBuffer.Get(SRC.FileSystem.PathCombine("Pilot", t.MainPilot().get_Bitmap(false)));

            txtLevel2.Text  = SrcFormatter.Format(t.MainPilot().Level);
            txtMorale2.Text = SrcFormatter.Format(t.MainPilot().Morale);

            using (var g = Graphics.FromImage(picUnit2.NewImageIfNull().Image))
            {
                MainForm.DrawUnit(g, SRC.Map.CellAtPoint(t.x, t.y), t, new Rectangle(0, 0, frmMain.MapCellPx, frmMain.MapCellPx));
            }
            picUnit2.Refresh();
            if (t.IsConditionSatisfied("データ不明"))
            {
                labHP2.Text = SRC.Expression.Term("HP", u: null);
                txtHP2.Text = "?????/?????";
            }
            else
            {
                labHP2.Text = SRC.Expression.Term("HP", t);
                if (t.HP < 100000)
                {
                    txtHP2.Text = SrcFormatter.Format(t.HP);
                }
                else
                {
                    txtHP2.Text = "?????";
                }

                if (t.MaxHP < 100000)
                {
                    txtHP2.Text = txtHP2.Text + "/" + SrcFormatter.Format(t.MaxHP);
                }
                else
                {
                    txtHP2.Text = txtHP2.Text + "/?????";
                }
            }
            picHP2.DrawBar((float)t.HP / t.MaxHP, BarBackBrush, BarForeBrush);
            if (t.IsConditionSatisfied("データ不明"))
            {
                labEN2.Text = SRC.Expression.Term("EN", u: null);
                txtEN2.Text = "???/???";
            }
            else
            {
                labEN2.Text = SRC.Expression.Term("EN", t);
                if (t.EN < 1000)
                {
                    txtEN2.Text = SrcFormatter.Format(t.EN);
                }
                else
                {
                    txtEN2.Text = "???";
                }

                if (t.MaxEN < 1000)
                {
                    txtEN2.Text = txtEN2.Text + "/" + SrcFormatter.Format(t.MaxEN);
                }
                else
                {
                    txtEN2.Text = txtEN2.Text + "/???";
                }
            }
            picEN2.DrawBar((float)t.EN / t.MaxEN, BarBackBrush, BarForeBrush);
        }
Exemplo n.º 15
0
        // インターミッションコマンド「ユニットリスト」におけるユニットリストを作成する
        public void MakeUnitList(string smode = "")
        {
            // リストのソート項目を設定
            if (!string.IsNullOrEmpty(smode))
            {
                key_type = smode;
            }

            if (string.IsNullOrEmpty(key_type))
            {
                key_type = "HP";
            }

            // マウスカーソルを砂時計に
            GUI.ChangeStatus(GuiStatus.WaitCursor);

            // あらかじめ撤退させておく
            foreach (Unit u in SRC.UList.Items)
            {
                if (u.Status == "出撃")
                {
                    u.Escape();
                }
            }

            // マップをクリア
            Map.LoadMapData("");
            GUI.SetupBackground("", "ステータス");

            // ユニット一覧を作成
            var target_unit_list = SRC.UList.Items
                .Where(u => u.Status == "出撃" || u.Status == "待機")
                .Select(u =>
                {
                    int key = 0;
                    // ソートする項目にあわせてソートの際の優先度を決定
                    switch (key_type ?? "")
                    {
                        case "ランク":
                            key = u.Rank;
                            break;
                        case "HP":
                            key = u.HP;
                            break;
                        case "EN":
                            key = u.EN;
                            break;
                        case "装甲":
                            key = u.get_Armor("");
                            break;
                        case "運動性":
                            key = u.get_Mobility("");
                            break;
                        case "移動力":
                            key = u.Speed;
                            break;
                        case "最大攻撃力":
                            key = u.Weapons.Where(w => w.IsWeaponMastered()
                                    && !u.IsDisabled(w.Name)
                                    && !w.IsWeaponClassifiedAs("合"))
                                .Select(w => w.WeaponPower(""))
                                .Append(0)
                                .Max();
                            break;

                        case "最長射程":
                            key = u.Weapons.Where(w => w.IsWeaponMastered()
                                    && !u.IsDisabled(w.Name)
                                    && !w.IsWeaponClassifiedAs("合"))
                                .Select(w => w.WeaponMaxRange())
                                .Append(0)
                                .Max();
                            break;
                        case "レベル":
                            key = u.MainPilot().Level;
                            break;
                        case "SP":
                            key = u.MainPilot().MaxSP;
                            break;
                        case "格闘":
                            key = u.MainPilot().Infight;
                            break;
                        case "射撃":
                            key = u.MainPilot().Shooting;
                            break;
                        case "命中":
                            key = u.MainPilot().Hit;
                            break;
                        case "回避":
                            key = u.MainPilot().Dodge;
                            break;
                        case "技量":
                            key = u.MainPilot().Technique;
                            break;
                        case "反応":
                            key = u.MainPilot().Intuition;
                            break;
                    }
                    return new
                    {
                        Unit = u,
                        Key = key,
                        StrKey = Expression.IsOptionDefined("等身大基準")
                            ? u.MainPilot().KanaName
                            : u.KanaName,
                    };
                }).ToList();
            var unit_list = target_unit_list
                .OrderByDescending(x => key_type != "名称" ? x.Key : 0)
                .OrderBy(x => key_type == "名称" ? x.StrKey : "")
                .ToList();

            // Font Regular 9pt 背景
            GUI.SetDrawString(DrawStringMode.Status);

            GUI.PermanentStringMode = true;
            GUI.HCentering = false;
            GUI.VCentering = false;

            // ユニットのリストを作成
            var xx = 1;
            var yy = 1;
            foreach (var item in unit_list)
            {
                var u = item.Unit;
                // ユニット出撃位置を折り返す
                if (xx > 15)
                {
                    xx = 1;
                    yy = (short)(yy + 1);
                    if (yy > 40)
                    {
                        // ユニット数が多すぎるため、一部のパイロットが表示出来ません
                        break;
                    }
                }

                // パイロットが乗っていない場合はダミーパイロットを乗せる
                if (u.CountPilot() == 0)
                {
                    var p = SRC.PList.Add("ステータス表示用ダミーパイロット(ザコ)", 1, "味方", gid: "");
                    p.Ride(u);
                }

                // 出撃
                u.UsedAction = 0;
                u.StandBy(xx, yy);

                // プレイヤーが操作できないように
                u.AddCondition("非操作", -1, cdata: "");

                // ユニットの愛称を表示
                GUI.DrawString((string)u.Nickname, 32 * xx + 2, 32 * yy - 31);

                // ソート項目にあわせてユニットのステータスを表示
                switch (key_type ?? "")
                {
                    case "ランク":
                        {
                            GUI.DrawString("RK" + SrcFormatter.Format(item.Key) + " " + Expression.Term("HP", u) + SrcFormatter.Format(u.HP) + " " + Expression.Term("EN", u) + SrcFormatter.Format(u.EN), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "HP":
                    case "EN":
                    case "名称":
                        {
                            GUI.DrawString(Expression.Term("HP", u) + SrcFormatter.Format(u.HP) + " " + Expression.Term("EN", u) + SrcFormatter.Format(u.EN), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "装甲":
                        {
                            GUI.DrawString(Expression.Term("装甲", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "運動性":
                        {
                            GUI.DrawString(Expression.Term("運動性", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "移動力":
                        {
                            GUI.DrawString(Expression.Term("移動力", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "最大攻撃力":
                        {
                            GUI.DrawString("攻撃力" + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "最長射程":
                        {
                            GUI.DrawString("射程" + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "レベル":
                        {
                            GUI.DrawString("Lv" + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "SP":
                        {
                            GUI.DrawString(Expression.Term("SP", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "格闘":
                        {
                            GUI.DrawString(Expression.Term("格闘", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "射撃":
                        {
                            if (u.MainPilot().HasMana())
                            {
                                GUI.DrawString(Expression.Term("魔力", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            }
                            else
                            {
                                GUI.DrawString(Expression.Term("射撃", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            }

                            break;
                        }

                    case "命中":
                        {
                            GUI.DrawString(Expression.Term("命中", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "回避":
                        {
                            GUI.DrawString(Expression.Term("回避", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "技量":
                        {
                            GUI.DrawString(Expression.Term("技量", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }

                    case "反応":
                        {
                            GUI.DrawString(Expression.Term("反応", u) + SrcFormatter.Format(item.Key), 32 * xx + 2, 32 * yy - 15);
                            break;
                        }
                }

                // 表示位置を右に5マスずらす
                xx = xx + 5;
            }

            // フォントの設定を戻しておく
            GUI.ResetDrawString();

            GUI.PermanentStringMode = false;
            GUI.RedrawScreen();

            // マウスカーソルを元に戻す
            GUI.ChangeStatus(GuiStatus.Default);
        }
Exemplo n.º 16
0
        protected override int ExecInternal()
        {
            switch (ArgNum)
            {
            case 2:
                if (!Expression.IsGlobalVariableDefined("次ステージ"))
                {
                    Expression.DefineGlobalVariable("次ステージ");
                }
                Expression.SetVariableAsString("次ステージ", GetArgAsString(2));
                break;

            case 1:
                break;

            default:
                throw new EventErrorException(this, "Continueコマンドの引数の数が違います");
            }

            SRC.GUIStatus.ClearUnitStatus();

            // 追加経験値を得るパイロットや破壊されたユニットがいなければ処理をスキップ
            var n = 0;

            foreach (Unit u in SRC.UList.Items)
            {
                if (u.Party0 == "味方")
                {
                    if (u.Status == "出撃" || u.Status == "格納" || u.Status == "破壊")
                    {
                        n = 1;
                        break;
                    }
                }
            }

            if (n == 0)
            {
                SRC.Turn = 0;
            }

            // 追加経験値を収得
            if (SRC.Turn > 0 && !Expression.IsOptionDefined("追加経験値無効"))
            {
                GUI.OpenMessageForm(u1: null, u2: null);
                n = 0;
                var msg = "";
                foreach (Pilot p in SRC.PList.Items)
                {
                    if (p.Party != "味方")
                    {
                        goto NextPilot;
                    }

                    if (p.MaxSP == 0)
                    {
                        goto NextPilot;
                    }

                    if (p.Unit is null)
                    {
                        goto NextPilot;
                    }

                    if (p.Unit.Status != "出撃" && p.Unit.Status != "格納")
                    {
                        goto NextPilot;
                    }

                    var plevel = p.Level;
                    p.Exp = p.Exp + 2 * p.SP;

                    // 追加パイロットや暴走時パイロットに関する処理
                    if (p.Unit.CountPilot() > 0 && !p.IsSupport(p.Unit))
                    {
                        // 追加パイロットがメインパイロットの場合
                        if (ReferenceEquals(p, p.Unit.Pilots.First()) && !ReferenceEquals(p, p.Unit.MainPilot()) && p.Unit.MainPilot().MaxSP > 0)
                        {
                            goto NextPilot;
                        }

                        // 追加パイロットがメインパイロットではなくなった場合
                        if (!ReferenceEquals(p, p.Unit.MainPilot()))
                        {
                            // 自分がユニットのパイロット一覧に含まれているか判定
                            if (!p.Unit.Pilots.Contains(p))
                            {
                                goto NextPilot;
                            }
                        }
                    }

                    if (plevel == p.Level)
                    {
                        msg = msg + ";" + p.get_Nickname(false) + " 経験値 +" + SrcFormatter.Format(2 * p.SP);
                    }
                    else
                    {
                        msg = msg + ";" + p.get_Nickname(false) + " 経験値 +" + SrcFormatter.Format(2 * p.SP) + " レベルアップ!(Lv" + SrcFormatter.Format(p.Level) + ")";
                    }

                    n = (n + 1);
                    if (n == 4)
                    {
                        GUI.DisplayMessage("システム", Strings.Mid(msg, 2));
                        msg = "";
                        n   = 0;
                    }

NextPilot:
                    ;
                }

                if (n > 0)
                {
                    GUI.DisplayMessage("システム", Strings.Mid(msg, 2));
                }

                GUI.CloseMessageForm();
            }

            GUI.MainFormHide();

            // エピローグイベントを実行
            if (Event.IsEventDefined("エピローグ"))
            {
                // ハイパーモードや変身、能力コピーを解除
                foreach (Unit u in SRC.UList.Items.CloneList())
                {
                    if (u.Status != "他形態" && u.Status != "旧主形態" && u.Status != "旧形態")
                    {
                        if (u.IsFeatureAvailable("ノーマルモード"))
                        {
                            u.Transform(GeneralLib.LIndex(u.FeatureData("ノーマルモード"), 1));
                        }
                    }
                }

                if (Event.IsEventDefined("エピローグ", true))
                {
                    SRC.Sound.StopBGM();
                    SRC.Sound.StartBGM(SRC.Sound.BGMName("Briefing"));
                }

                SRC.Stage = "エピローグ";
                Event.HandleEvent("エピローグ");
            }

            GUI.MainFormHide();

            // インターミッションに移行
            if (!SRC.IsSubStage)
            {
                SRC.InterMission.InterMissionCommand();
                if (!SRC.IsSubStage)
                {
                    if (string.IsNullOrEmpty(Expression.GetValueAsString("次ステージ")))
                    {
                        throw new EventErrorException(this, "次のステージのファイル名が設定されていません");
                    }

                    SRC.StartScenario(Expression.GetValueAsString("次ステージ"));
                }
                else
                {
                    SRC.IsSubStage = false;
                }
            }

            SRC.IsScenarioFinished = true;
            return(-1);
        }
Exemplo n.º 17
0
        // 特殊能力の名称
        public string FeatureName(Unit unit)
        {
            FeatureData fd = this;

            // 非表示の能力
            switch (fd.Name ?? "")
            {
            case "ノーマルモード":
            case "パーツ合体":
            case "換装":
            case "制限時間":
            case "制御不可":
            case "主形態":
            case "他形態":
            case "合体制限":
            case "格闘武器":
            case "迎撃武器":
            case "合体技":
            case "変形技":
            case "ランクアップ":
            case "追加パイロット":
            case "暴走時パイロット":
            case "追加サポート":
            case "装備個所":
            case "ハードポイント":
            case "武器クラス":
            case "防具クラス":
            case "BGM":
            case "武器BGM":
            case "アビリティBGM":
            case "合体BGM":
            case "分離BGM":
            case "変形BGM":
            case "ハイパーモードBGM":
            case "ユニット画像":
            case "パイロット画像":
            case "パイロット愛称":
            case "パイロット読み仮名":
            case "性別":
            case "性格変更":
            case "吸収":
            case "無効化":
            case "耐性":
            case "弱点":
            case "有効":
            case "特殊効果無効化":
            case "アイテム所有":
            case "レアアイテム所有":
            case "ラーニング可能技":
            case "改造費修正":
            case "最大改造数":
            case "パイロット能力付加":
            case "パイロット能力強化":
            case "非表示":
            case "攻撃属性":
            case "射程延長":
            case "武器強化":
            case "命中率強化":
            case "CT率強化":
            case "特殊効果発動率強化":
            case "必要技能":
            case "不必要技能":
            case "ダミーユニット":
            case "地形ユニット":
            case "召喚解除コマンド名":
            case "変身解除コマンド名":
            case "1人乗り可能":
            case "特殊効果":
            case "戦闘アニメ":
            case "パイロット地形適応変更":
            case "メッセージクラス":
            case "用語名":
            case "発光":
                // ユニット用特殊能力
                return("");

            case "愛称変更":
            case "読み仮名変更":
            case "サイズ変更":
            case "地形適応変更":
            case "地形適応固定変更":
            case "空中移動":
            case "陸上移動":
            case "水中移動":
            case "宇宙移動":
            case "地中移動":
            case "修理費修正":
            case "経験値修正":
            case "最大弾数増加":
            case "EN消費減少":
            case "V-UP":
            case "大型アイテム":
            case "呪い":
                // アイテム用特殊能力
                return("");
            }

            // 拡大画像能力は「拡大画像(文字列)」といった指定もあるので他の非表示能力と異なる
            // 判定方法を使う
            if (Strings.InStr(fd.Name, "拡大画像") == 1)
            {
                return("");
            }

            string resultName;

            if (Strings.Len(fd.StrData) > 0)
            {
                // 別名の指定あり
                resultName = GeneralLib.ListIndex(fd.StrData, 1);
                if (resultName == "非表示" || resultName == "解説")
                {
                    resultName = "";
                }
            }
            else if (fd.Level == Constants.DEFAULT_LEVEL)
            {
                // レベル指定なし
                resultName = fd.Name;
            }
            else if (fd.Level >= 0d)
            {
                // レベル指定あり
                resultName = fd.Name + "Lv" + SrcFormatter.Format(fd.Level);
                if (fd.Name == "射撃強化")
                {
                    if (unit.CountPilot() > 0)
                    {
                        if (unit.MainPilot().HasMana())
                        {
                            resultName = "魔力強化Lv" + SrcFormatter.Format(fd.Level);
                        }
                    }
                }
            }
            else
            {
                // マイナスのレベル指定
                switch (fd.Name ?? "")
                {
                case "格闘強化":
                    resultName = "格闘低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    break;

                case "射撃強化":
                    resultName = "射撃低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    if (unit.CountPilot() > 0)
                    {
                        if (unit.MainPilot().HasMana())
                        {
                            resultName = "魔力低下Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                        }
                    }

                    break;

                case "命中強化":
                    resultName = "命中低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    break;

                case "回避強化":
                    resultName = "回避低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    break;

                case "技量強化":
                    resultName = "技量低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    break;

                case "反応強化":
                    resultName = "反応低下" + "Lv" + SrcFormatter.Format(Math.Abs(fd.Level));
                    break;

                default:
                    resultName = fd.Name + "Lv" + SrcFormatter.Format(fd.Level);
                    break;
                }
            }

            return(resultName);
        }
Exemplo n.º 18
0
 private void hscMP3Volume_Scroll(int newScrollValue)
 {
     Sound.Player.SoundVolume = newScrollValue / 100f;
     txtMP3Volume.Text        = SrcFormatter.Format(newScrollValue);
 }
Exemplo n.º 19
0
        protected override int ExecInternal()
        {
            // マウスカーソルを砂時計に
            GUI.ChangeStatus(GuiStatus.WaitCursor);

            // パイロットがどのユニットに乗っていたか記録しておく
            foreach (Unit u in SRC.UList.Items)
            {
                if (u.Status == "出撃")
                {
                    // あらかじめ撤退させておく
                    u.Escape("非同期");
                }

                if (u.Status == "待機")
                {
                    if (Strings.InStr(u.Name, "ステータス表示用") == 0)
                    {
                        foreach (var p in u.AllRawPilots)
                        {
                            Expression.SetVariableAsString("搭乗ユニット[" + p.ID + "]", u.ID);
                        }
                    }
                }
            }

            // マップをクリア
            Map.LoadMapData("");
            GUI.SetupBackground("", "ステータス");

            // ユニット一覧を作成
            var target_pilot_list = SRC.PList.Items
                                    .Where(p => p.Alive && !p.Away)
                                    // 追加パイロットは勘定に入れない
                                    // 追加サポートは勘定に入れない
                                    .Where(p => !p.IsAdditionalPilot && !p.IsAdditionalSupport)
                                    .ToList();
            IList <Pilot> pilot_list;

            var key_type = GetArgAsString(2);

            if (key_type != "名称")
            {
                pilot_list = target_pilot_list.OrderByDescending(p =>
                {
                    switch (key_type)
                    {
                    case "レベル":
                        return(p.Level);

                    case "SP":
                        return(p.MaxSP);

                    case "格闘":
                        return(p.Infight);

                    case "射撃":
                        return(p.Shooting);

                    case "命中":
                        return(p.Hit);

                    case "回避":
                        return(p.Dodge);

                    case "技量":
                        return(p.Technique);

                    case "反応":
                        return(p.Intuition);

                    default:
                        throw new EventErrorException(this, "MakePilotListコマンドの引数が違います");
                    }
                }).ToList();
            }
            else
            {
                pilot_list = target_pilot_list.OrderBy(p => p.KanaName).ToList();
            }

            // Font Regular 9pt 背景
            GUI.SetDrawString(DrawStringMode.Status);

            GUI.PermanentStringMode = true;
            GUI.HCentering          = false;
            GUI.VCentering          = false;
            var xx = 1;
            var yy = 1;

            foreach (var p in pilot_list)
            {
                // ユニット出撃位置を折り返す
                if (xx > 15)
                {
                    xx = 1;
                    yy = (yy + 1);
                    if (yy > 40)
                    {
                        // パイロット数が多すぎるため、一部のパイロットが表示出来ません
                        break;
                    }
                }

                // ダミーユニットに載せる
                Unit u;
                if (p.Unit is null)
                {
                    if (SRC.UDList.IsDefined(p.Name + "ステータス表示用ユニット"))
                    {
                        u = SRC.UList.Add(p.Name + "ステータス表示用ユニット", 0, "味方");
                    }
                    else
                    {
                        u = SRC.UList.Add("ステータス表示用ダミーユニット", 0, "味方");
                    }

                    p.Ride(u);
                }
                else if (!p.Unit.IsFeatureAvailable("ダミーユニット"))
                {
                    p.GetOff();
                    if (SRC.UDList.IsDefined(p.Name + "ステータス表示用ユニット"))
                    {
                        u = SRC.UList.Add(p.Name + "ステータス表示用ユニット", 0, "味方");
                    }
                    else
                    {
                        u = SRC.UList.Add("ステータス表示用ダミーユニット", 0, "味方");
                    }

                    p.Ride(u);
                }
                else
                {
                    u = p.Unit;
                }

                // 出撃
                u.UsedAction = 0;
                u.StandBy(xx, yy, "非同期");

                // プレイヤーが操作できないように
                u.AddCondition("非操作", -1, cdata: "");

                // パイロットの愛称を表示
                // TODO セルサイズ
                GUI.DrawString(p.get_Nickname(false), 32 * xx + 2, 32 * yy - 31);
                switch (key_type ?? "")
                {
                case "レベル":
                case "名称":
                {
                    GUI.DrawString("Lv" + SrcFormatter.Format(p.Level), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "SP":
                {
                    GUI.DrawString(Expression.Term("SP", u) + SrcFormatter.Format(p.MaxSP), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "格闘":
                {
                    GUI.DrawString(Strings.Left(Expression.Term("格闘", u), 1) + SrcFormatter.Format(p.Infight), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "射撃":
                {
                    if (p.HasMana())
                    {
                        GUI.DrawString(Strings.Left(Expression.Term("魔力", u), 1) + SrcFormatter.Format(p.Shooting), 32 * xx + 2, 32 * yy - 15);
                    }
                    else
                    {
                        GUI.DrawString(Strings.Left(Expression.Term("射撃", u), 1) + SrcFormatter.Format(p.Shooting), 32 * xx + 2, 32 * yy - 15);
                    }

                    break;
                }

                case "命中":
                {
                    GUI.DrawString(Strings.Left(Expression.Term("命中", u), 1) + SrcFormatter.Format(p.Hit), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "回避":
                {
                    GUI.DrawString(Strings.Left(Expression.Term("回避", u), 1) + SrcFormatter.Format(p.Dodge), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "技量":
                {
                    GUI.DrawString(Strings.Left(Expression.Term("技量", u), 1) + SrcFormatter.Format(p.Technique), 32 * xx + 2, 32 * yy - 15);
                    break;
                }

                case "反応":
                {
                    GUI.DrawString(Strings.Left(Expression.Term("反応", u), 1) + SrcFormatter.Format(p.Intuition), 32 * xx + 2, 32 * yy - 15);
                    break;
                }
                }

                // 表示位置を右に3マスずらす
                xx = (xx + 3);
            }

            // フォントの設定を戻しておく
            GUI.ResetDrawString();

            GUI.PermanentStringMode = false;
            GUI.RedrawScreen();

            // マウスカーソルを元に戻す\
            GUI.ChangeStatus(GuiStatus.Default);
            return(EventData.NextID);
        }
Exemplo n.º 20
0
        public PilotData LoadPilot(SrcDataReader reader, PilotData lastPd)
        {
            PilotData pd = null;

            try
            {
                string buf, buf2;

                string data_name = "";
                string line_buf  = "";
                // 空行をスキップ
                while (reader.HasMore && string.IsNullOrEmpty(line_buf))
                {
                    line_buf = reader.GetLine();
                }
                if (lastPd != null)
                {
                    lastPd.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);
                }

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

                // 名称
                data_name = line_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 (IsDefined2(data_name))
                {
                    // すでに定義済みのパイロットの場合はデータを置き換え
                    pd = Item(data_name);
                    pd.Clear();
                }
                else
                {
                    pd = Add(data_name);
                }

                // 愛称, 読み仮名, 性別, クラス, 地形適応, 経験値
                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 > 5)
                {
                    throw reader.InvalidDataException(@"余分な「,」があります。", data_name);
                }

                // 愛称
                int ret = Strings.InStr(line_buf, ",");
                buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf  = Strings.Mid(line_buf, ret + 1);
                if (Strings.Len(buf2) == 0)
                {
                    throw reader.InvalidDataException(@"愛称の設定が抜けています。", data_name);
                }

                pd.Nickname = buf2;
                switch (comma_num)
                {
                case 4:
                {
                    // 読み仮名 or 性別
                    ret  = Strings.InStr(buf, ",");
                    buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                    buf  = Strings.Mid(buf, ret + 1);
                    switch (buf2 ?? "")
                    {
                    case "男性":
                    case "女性":
                    case "-":
                    {
                        pd.KanaName = GeneralLib.StrToHiragana(pd.Nickname);
                        pd.Sex      = buf2;
                        break;
                    }

                    default:
                    {
                        pd.KanaName = buf2;
                        break;
                    }
                    }

                    break;
                }

                case 5:
                {
                    // 読み仮名
                    ret  = Strings.InStr(buf, ",");
                    buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                    buf  = Strings.Mid(buf, ret + 1);
                    switch (buf2 ?? "")
                    {
                    case "男性":
                    case "女性":
                    case "-":
                    {
                        SRC.AddDataError(reader.InvalidData(@"読み仮名の設定が抜けています。", data_name));
                        pd.KanaName = GeneralLib.StrToHiragana(pd.Nickname);
                        break;
                    }

                    default:
                    {
                        pd.KanaName = buf2;
                        break;
                    }
                    }

                    // 性別
                    ret  = Strings.InStr(buf, ",");
                    buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                    buf  = Strings.Mid(buf, ret + 1);
                    switch (buf2 ?? "")
                    {
                    case "男性":
                    case "女性":
                    case "-":
                    {
                        pd.Sex = buf2;
                        break;
                    }

                    default:
                    {
                        SRC.AddDataError(reader.InvalidData(@"性別の設定が間違っています。", data_name));
                        break;
                    }
                    }

                    break;
                }

                default:
                {
                    pd.KanaName = GeneralLib.StrToHiragana(pd.Nickname);
                    break;
                }
                }

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

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

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

                // 特殊能力データ
                line_buf = reader.GetLine();
                if (line_buf == "特殊能力なし")
                {
                    line_buf = reader.GetLine();
                }
                else if (line_buf == "特殊能力")
                {
                    // 新形式による特殊能力表記
                    line_buf = reader.GetLine();
                    buf      = line_buf;
                    int    i      = 0;
                    string aname  = "";
                    string adata  = "";
                    double alevel = Constants.DEFAULT_LEVEL;
                    while (true)
                    {
                        i = (i + 1);

                        // コンマの位置を検索
                        ret = Strings.InStr(buf, ",");
                        // 「"」が使われているか検索
                        int ret2 = Strings.InStr(buf, "\"");
                        if (ret2 < ret && ret2 > 0)
                        {
                            // 「"」が見つかった場合、次の「"」後のコンマを検索
                            bool in_quote = true;
                            int  j        = (ret2 + 1);
                            while (j <= Strings.Len(buf))
                            {
                                switch (Strings.Mid(buf, j, 1) ?? "")
                                {
                                case "\"":
                                {
                                    in_quote = !in_quote;
                                    break;
                                }

                                case ",":
                                {
                                    if (!in_quote)
                                    {
                                        buf2 = Strings.Left(buf, j - 1);
                                        buf  = Strings.Mid(buf, j + 1);
                                    }

                                    break;
                                }
                                }

                                j = (j + 1);
                            }

                            if (j == Strings.Len(buf))
                            {
                                buf2 = buf;
                                buf  = "";
                            }

                            in_quote = false;
                        }
                        else if (ret > 0)
                        {
                            // コンマが見つかったらコンマまでの文字列を切り出す
                            buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                            buf  = Strings.Trim(Strings.Mid(buf, ret + 1));

                            // コンマの後ろの文字列が空白の場合
                            if (string.IsNullOrEmpty(buf))
                            {
                                if (i % 2 == 1)
                                {
                                    throw reader.InvalidDataException(@"行末の「,」の後に特殊能力指定が抜けています。", data_name);
                                }
                                else
                                {
                                    throw reader.InvalidDataException(@"行末の「,」の後に特殊能力レベル指定が抜けています。", data_name);
                                };
                            }
                        }
                        else
                        {
                            // 行末の文字列
                            buf2 = buf;
                            buf  = "";
                        }

                        if (i % 2 == 1)
                        {
                            // 特殊能力名&レベル

                            if (Information.IsNumeric(buf2))
                            {
                                if (i == 1)
                                {
                                    // 特殊能力の指定は終り。能力値の指定へ
                                    buf = buf2 + ", " + buf;
                                    break;
                                }
                                else
                                {
                                    SRC.AddDataError(reader.InvalidData(@"行頭から" + SrcFormatter.Format((object)((i + 1) / 2)) + "番目の特殊能力名の設定が間違っています。", data_name));
                                }
                            }

                            if (Strings.InStr(buf2, " ") > 0)
                            {
                                if (Strings.Left(buf2, 4) != "先手必勝" && Strings.Left(buf2, 6) != "SP消費減少" && Strings.Left(buf2, 12) != "スペシャルパワー自動発動" && Strings.Left(buf2, 4) != "ハンター" && Strings.InStr(buf2, "=解説 ") == 0)
                                {
                                    if (string.IsNullOrEmpty(aname))
                                    {
                                        throw reader.InvalidDataException(@"行頭から" + SrcFormatter.Format((object)((i + 1) / 2)) + "番目の特殊能力「" + Strings.Trim(Strings.Left(buf2, Strings.InStr(buf2, " "))) + "」の指定の後に「,」が抜けています。", data_name);
                                    }
                                    else
                                    {
                                        throw reader.InvalidDataException(@"特殊能力「" + aname + "」のレベル指定の後に「,」が抜けています。", data_name);
                                    };
                                }
                            }

                            // 特殊能力の別名指定がある?
                            int j = Strings.InStr(buf2, "=");
                            if (j > 0)
                            {
                                adata = Strings.Mid(buf2, j + 1);
                                buf2  = Strings.Left(buf2, j - 1);
                            }
                            else
                            {
                                adata = "";
                            }

                            // 特殊能力のレベル指定を切り出す
                            j = Strings.InStr(buf2, "Lv");
                            switch (j)
                            {
                            case 0:
                            {
                                // 指定なし
                                aname  = buf2;
                                alevel = Constants.DEFAULT_LEVEL;
                                break;
                            }

                            case 1:
                            {
                                // レベル指定のみあり
                                if (!Information.IsNumeric(Strings.Mid(buf2, j + 2)))
                                {
                                    SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "」のレベル指定が不正です。", data_name));
                                }

                                alevel = Conversions.ToDouble(Strings.Mid(buf2, j + 2));
                                if (string.IsNullOrEmpty(aname))
                                {
                                    SRC.AddDataError(reader.InvalidData(@"行頭から" + SrcFormatter.Format((object)((i + 1) / 2)) + "番目の特殊能力名の設定が間違っています。", data_name));
                                }

                                break;
                            }

                            default:
                            {
                                // 特殊能力名とレベルの両方が指定されている
                                aname  = Strings.Left(buf2, j - 1);
                                alevel = Conversions.ToDouble(Strings.Mid(buf2, j + 2));
                                break;
                            }
                            }
                        }
                        // 特殊能力修得レベル
                        else if (Information.IsNumeric(buf2))
                        {
                            pd.AddSkill(aname, alevel, adata, Conversions.ToInteger(buf2));
                        }
                        else
                        {
                            if (alevel > 0d)
                            {
                                SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "Lv" + SrcFormatter.Format((object)alevel) + "」の修得レベルが間違っています。", data_name));
                            }
                            else
                            {
                                SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "」の修得レベルが間違っています。", data_name));
                            }

                            pd.AddSkill(aname, alevel, adata, 1);
                        }

                        if (string.IsNullOrEmpty(buf))
                        {
                            // ここでこの行は終り

                            // iが奇数の場合は修得レベルが抜けている
                            if (i % 2 == 1)
                            {
                                if (alevel > 0d)
                                {
                                    SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "Lv" + SrcFormatter.Format((object)alevel) + "」の修得レベルが間違っています。", data_name));
                                }
                                else
                                {
                                    SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "」の修得レベルが間違っています。", data_name));
                                }
                            }

                            line_buf = reader.GetLine();
                            buf      = line_buf;
                            i        = 0;
                            aname    = "";
                        }
                    }
                }
                else if (Strings.InStr(line_buf, "特殊能力,") == 1)
                {
                    // 旧形式による特殊能力表記
                    buf = Strings.Mid(line_buf, 6);
                    int    i      = 0;
                    string aname  = "";
                    string adata  = "";
                    double alevel = Constants.DEFAULT_LEVEL;
                    do
                    {
                        i = (i + 1);

                        // コンマの位置を検索
                        ret = Strings.InStr(buf, ",");
                        // 「"」が使われているか検索
                        int ret2 = Strings.InStr(buf, "\"");
                        if (ret2 < ret && ret2 > 0)
                        {
                            // 「"」が見つかった場合、次の「"」後のコンマを検索
                            bool in_quote = true;
                            int  j        = (ret2 + 1);
                            while (j <= Strings.Len(buf))
                            {
                                switch (Strings.Mid(buf, j, 1) ?? "")
                                {
                                case "\"":
                                {
                                    in_quote = !in_quote;
                                    break;
                                }

                                case ",":
                                {
                                    if (!in_quote)
                                    {
                                        buf2 = Strings.Left(buf, j - 1);
                                        buf  = Strings.Mid(buf, j + 1);
                                    }

                                    break;
                                }
                                }

                                j = (j + 1);
                            }

                            if (j == Strings.Len(buf))
                            {
                                buf2 = buf;
                                buf  = "";
                            }

                            in_quote = false;
                        }
                        else if (ret > 0)
                        {
                            // コンマが見つかったらコンマまでの文字列を切り出す
                            buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                            buf  = Strings.Mid(buf, ret + 1);

                            // コンマの後ろの文字列が空白の場合
                            if (string.IsNullOrEmpty(buf))
                            {
                                if (i % 2 == 1)
                                {
                                    throw reader.InvalidDataException(@"行末の「,」の後に特殊能力指定が抜けています。", data_name);
                                }
                                else
                                {
                                    throw reader.InvalidDataException(@"行末の「,」の後に特殊能力レベル指定が抜けています。", data_name);
                                };
                            }
                        }
                        else
                        {
                            // 行末の文字列
                            buf2 = buf;
                            buf  = "";
                        }

                        if (i % 2 == 1)
                        {
                            // 特殊能力名&レベル

                            if (Strings.InStr(buf2, " ") > 0)
                            {
                                if (string.IsNullOrEmpty(aname))
                                {
                                    throw reader.InvalidDataException(@"行頭から" + SrcFormatter.Format((object)((i + 1) / 2)) + "番目の特殊能力の指定の後に「,」が抜けています。", data_name);
                                }
                                else
                                {
                                    throw reader.InvalidDataException(@"特殊能力「" + aname + "」のレベル指定の後に「,」が抜けています。", data_name);
                                };
                            }

                            // 特殊能力の別名指定がある?
                            int j = Strings.InStr(buf2, "=");
                            if (j > 0)
                            {
                                adata = Strings.Mid(buf2, j + 1);
                                buf2  = Strings.Left(buf2, j - 1);
                            }
                            else
                            {
                                adata = "";
                            }

                            // 特殊能力のレベル指定を切り出す
                            j = Strings.InStr(buf2, "Lv");
                            switch (j)
                            {
                            case 0:
                            {
                                // 指定なし
                                aname  = buf2;
                                alevel = Constants.DEFAULT_LEVEL;
                                break;
                            }

                            case 1:
                            {
                                // レベル指定のみあり
                                if (!Information.IsNumeric(Strings.Mid(buf2, j + 2)))
                                {
                                    throw reader.InvalidDataException(@"特殊能力「" + aname + "」のレベル指定が不正です", data_name);
                                }

                                alevel = Conversions.ToDouble(Strings.Mid(buf2, j + 2));
                                if (string.IsNullOrEmpty(aname))
                                {
                                    throw reader.InvalidDataException(@"行頭から" + SrcFormatter.Format((object)((i + 1) / 2)) + "番目の特殊能力の名前「" + buf2 + "」が不正です", data_name);
                                }

                                break;
                            }

                            default:
                            {
                                // 特殊能力名とレベルの両方が指定されている
                                aname  = Strings.Left(buf2, j - 1);
                                alevel = Conversions.ToDouble(Strings.Mid(buf2, j + 2));
                                break;
                            }
                            }
                        }
                        // 特殊能力修得レベル
                        else if (Information.IsNumeric(buf2))
                        {
                            pd.AddSkill(aname, alevel, adata, Conversions.ToInteger(buf2));
                        }
                        else
                        {
                            if (alevel > 0d)
                            {
                                SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "Lv" + SrcFormatter.Format((object)alevel) + "」の修得レベルが間違っています。", data_name));
                            }
                            else
                            {
                                SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "」の修得レベルが間違っています。", data_name));
                            }

                            pd.AddSkill(aname, alevel, adata, 1);
                        }
                    }while (ret > 0);

                    // iが奇数の場合は修得レベルが抜けている
                    if (i % 2 == 1)
                    {
                        if (alevel > 0d)
                        {
                            SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "Lv" + SrcFormatter.Format((object)alevel) + "」の修得レベルが間違っています。", data_name));
                        }
                        else
                        {
                            SRC.AddDataError(reader.InvalidData(@"特殊能力「" + aname + "」の修得レベルが間違っています。", data_name));
                        }
                    }

                    line_buf = reader.GetLine();
                }
                else
                {
                    throw reader.InvalidDataException(@"特殊能力の設定が抜けています。", data_name);
                }

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

                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))
                {
                    pd.Infight = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                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);
                if (Information.IsNumeric(buf2))
                {
                    pd.Shooting = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                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);
                if (Information.IsNumeric(buf2))
                {
                    pd.Hit = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                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);
                if (Information.IsNumeric(buf2))
                {
                    pd.Dodge = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                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);
                if (Information.IsNumeric(buf2))
                {
                    pd.Technique = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                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);
                if (Information.IsNumeric(buf2))
                {
                    pd.Intuition = GeneralLib.MinLng(Conversions.ToInteger(buf2), 9999);
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"反応の設定が間違っています。", data_name));
                }

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

                if (Strings.InStr(buf2, ",") > 0)
                {
                    SRC.AddDataError(reader.InvalidData(@"行末に余分なコンマが付けられています。", data_name));
                    buf2 = Strings.Trim(Strings.Left(buf2, Strings.InStr(buf2, ",") - 1));
                }

                if (!Information.IsNumeric(buf2))
                {
                    pd.Personality = buf2;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"性格の設定が間違っています。", data_name));
                }

                // スペシャルパワー
                line_buf = reader.GetLine();
                switch (line_buf ?? "")
                {
                // スペシャルパワーを持っていない
                case "SPなし":
                case "精神なし":
                {
                    break;
                }

                case var @case when @case == "":
                {
                    throw reader.InvalidDataException(@"スペシャルパワーの設定が抜けています。", data_name);
                }

                default:
                {
                    ret = Strings.InStr(line_buf, ",");
                    if (ret == 0)
                    {
                        throw reader.InvalidDataException(@"SP値の設定が抜けています。", data_name);
                    }

                    buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                    buf  = Strings.Mid(line_buf, ret + 1);
                    if (buf2 != "SP" && buf2 != "精神")
                    {
                        throw reader.InvalidDataException(@"スペシャルパワーの設定が抜けています。", data_name);
                    }

                    // SP値
                    ret = Strings.InStr(buf, ",");
                    if (ret > 0)
                    {
                        buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                        buf  = Strings.Mid(buf, ret + 1);
                    }
                    else
                    {
                        buf2 = Strings.Trim(buf);
                        buf  = "";
                    }

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

                    // スペシャルパワーと獲得レベル
                    ret = Strings.InStr(buf, ",");
                    string sname = "";
                    while (ret > 0)
                    {
                        sname = Strings.Trim(Strings.Left(buf, ret - 1));
                        int sp_cost = 0;
                        buf = Strings.Mid(buf, ret + 1);

                        // SP消費量
                        if (Strings.InStr(sname, "=") > 0)
                        {
                            sp_cost = GeneralLib.StrToLng(Strings.Mid(sname, Strings.InStr(sname, "=") + 1));
                            sname   = Strings.Left(sname, Strings.InStr(sname, "=") - 1);
                        }
                        else
                        {
                            sp_cost = 0;
                        }

                        ret = Strings.InStr(buf, ",");
                        if (ret == 0)
                        {
                            buf2 = Strings.Trim(buf);
                            buf  = "";
                        }
                        else
                        {
                            buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                            buf  = Strings.Mid(buf, ret + 1);
                        }

                        if (string.IsNullOrEmpty(sname))
                        {
                            SRC.AddDataError(reader.InvalidData(@"スペシャルパワーの指定が抜けています。", data_name));
                        }
                        // TODO ビューワでSP設定しとく
                        //else if (!SRC.SPDList.IsDefined(sname))
                        //{
                        //    SRC.AddDataError(reader.InvalidData(@sname + "というスペシャルパワーは存在しません。", data_name));
                        //}
                        else if (!Information.IsNumeric(buf2))
                        {
                            SRC.AddDataError(reader.InvalidData(@"スペシャルパワー「" + sname + "」の獲得レベルが間違っています。", data_name));
                            pd.AddSpecialPower(sname, 1, sp_cost);
                        }
                        else
                        {
                            pd.AddSpecialPower(sname, Conversions.ToInteger(buf2), sp_cost);
                        }

                        ret = Strings.InStr(buf, ",");
                    }

                    if (!string.IsNullOrEmpty(buf))
                    {
                        SRC.AddDataError(reader.InvalidData(@"スペシャルパワー「" + Strings.Trim(sname) + "」の獲得レベル指定が抜けています。", data_name));
                    }

                    break;
                }
                }

                // ビットマップ, MIDI
                line_buf = reader.GetLine();

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

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

                buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                buf  = Strings.Mid(line_buf, ret + 1);
                if (Strings.LCase(Strings.Right(buf2, 4)) == ".bmp")
                {
                    pd.Bitmap = buf2;
                }
                else
                {
                    SRC.AddDataError(reader.InvalidData(@"ビットマップの設定が間違っています。", data_name));
                    pd.IsBitmapMissing = true;
                }

                // MIDI
                buf  = Strings.Trim(buf);
                buf2 = buf;
                while (Strings.Right(buf2, 1) == ")")
                {
                    buf2 = Strings.Left(buf2, Strings.Len(buf2) - 1);
                }
                switch (Strings.LCase(Strings.Right(buf2, 4)) ?? "")
                {
                case ".mid":
                case ".mp3":
                case ".wav":
                case "-":
                {
                    pd.BGM = buf;
                    break;
                }

                case var case1 when case1 == "":
                {
                    SRC.AddDataError(reader.InvalidData(@"MIDIの設定が抜けています。", data_name));
                    pd.Bitmap = "-.mid";
                    break;
                }

                default:
                {
                    SRC.AddDataError(reader.InvalidData(@"MIDIの設定が間違っています。", data_name));
                    pd.Bitmap = "-.mid";
                    break;
                }
                }

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

                line_buf = reader.GetLine();
                if (line_buf != "===")
                {
                    return(pd);
                }

                // 特殊能力データ
                line_buf = UnitDataList.LoadFeature(data_name, pd, reader, SRC);


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

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

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

                // アビリティデータ
                line_buf = UnitDataList.LoadAbility(data_name, pd, reader, SRC);
            }
            finally
            {
                if (pd != null)
                {
                    pd.Raw = reader.RawData;
                    reader.ClearRawData();
                }
            }
            return(pd);
        }
Exemplo n.º 21
0
        private void frmConfiguration_Load(object eventSender, EventArgs eventArgs)
        {
            // ダイアログを初期化

            //// メッセージスピード
            //cboMessageSpeed.Items.Add("手動送り");
            //cboMessageSpeed.Items.Add("低速");
            //cboMessageSpeed.Items.Add("普通");
            //cboMessageSpeed.Items.Add("高速");
            //cboMessageSpeed.Items.Add("超高速");
            //cboMessageSpeed.Items.Add("神の領域");
            //switch (GUI.MessageWait)
            //{
            //    case 0:
            //        {
            //            cboMessageSpeed.Text = "神の領域";
            //            break;
            //        }

            //    case 200:
            //        {
            //            cboMessageSpeed.Text = "超高速";
            //            break;
            //        }

            //    case 400:
            //        {
            //            cboMessageSpeed.Text = "高速";
            //            break;
            //        }

            //    case 700:
            //        {
            //            cboMessageSpeed.Text = "普通";
            //            break;
            //        }

            //    case 1000:
            //        {
            //            cboMessageSpeed.Text = "低速";
            //            break;
            //        }

            //    case 10000000:
            //        {
            //            cboMessageSpeed.Text = "手動送り";
            //            break;
            //        }
            //}

            // 戦闘アニメ表示
            if (SRC.BattleAnimation)
            {
                chkBattleAnimation.CheckState = CheckState.Checked;
            }
            else
            {
                chkBattleAnimation.CheckState = CheckState.Unchecked;
            }

            //bool localFileExists() { string argfname = SRC.AppPath + @"Lib\汎用戦闘アニメ\include.eve";
            //    var ret = SRC.FileSystem.FileExists(argfname);
            //    return ret; }

            //if (!localFileExists())
            //{
            //    chkBattleAnimation.CheckState = CheckState.Indeterminate; // 無効
            //}

            // 拡張戦闘アニメ表示
            if (SRC.ExtendedAnimation)
            {
                chkExtendedAnimation.CheckState = CheckState.Checked;
            }
            else
            {
                chkExtendedAnimation.CheckState = CheckState.Unchecked;
            }

            if ((int)chkBattleAnimation.CheckState == 1)
            {
                chkExtendedAnimation.Enabled = true;
            }
            else
            {
                chkExtendedAnimation.Enabled = false;
            }

            // 武器準備アニメ表示
            if (SRC.WeaponAnimation)
            {
                chkWeaponAnimation.CheckState = CheckState.Checked;
            }
            else
            {
                chkWeaponAnimation.CheckState = CheckState.Unchecked;
            }

            if ((int)chkBattleAnimation.CheckState == 1)
            {
                chkWeaponAnimation.Enabled = true;
            }
            else
            {
                chkWeaponAnimation.Enabled = false;
            }

            // 移動アニメ表示
            if (SRC.MoveAnimation)
            {
                chkMoveAnimation.CheckState = CheckState.Checked;
            }
            else
            {
                chkMoveAnimation.CheckState = CheckState.Unchecked;
            }

            // スペシャルパワーアニメ表示
            if (SRC.SpecialPowerAnimation)
            {
                chkSpecialPowerAnimation.CheckState = CheckState.Checked;
            }
            else
            {
                chkSpecialPowerAnimation.CheckState = CheckState.Unchecked;
            }

            // マウスカーソルの自動移動
            if (SRC.AutoMoveCursor)
            {
                chkAutoMoveCursor.CheckState = CheckState.Checked;
            }
            else
            {
                chkAutoMoveCursor.CheckState = CheckState.Unchecked;
            }

            // マス目の表示
            if (SRC.ShowSquareLine)
            {
                chkShowSquareLine.CheckState = CheckState.Checked;
            }
            else
            {
                chkShowSquareLine.CheckState = CheckState.Unchecked;
            }

            //// 味方フェイズ開始時のターン表示
            //if (Strings.LCase(GeneralLib.ReadIni("Option", "Turn")) == "on")
            //{
            //    chkShowTurn.CheckState = CheckState.Checked;
            //}
            //else
            //{
            //    chkShowTurn.CheckState = CheckState.Unchecked;
            //}

            //// 敵フェイズ中にBGMを変更しない
            //if (SRC.KeepEnemyBGM)
            //{
            //    chkKeepEnemyBGM.CheckState = CheckState.Checked;
            //}
            //else
            //{
            //    chkKeepEnemyBGM.CheckState = CheckState.Unchecked;
            //}

            //// MIDI演奏にDirectMusicを使用する
            //if (Strings.LCase(GeneralLib.ReadIni("Option", "UseDirectMusic")) == "on")
            //{
            //    chkUseDirectMusic.CheckState = CheckState.Checked;
            //}
            //else
            //{
            //    chkUseDirectMusic.CheckState = CheckState.Unchecked;
            //}

            //// MIDI音源リセットの種類
            //cboMidiReset.Items.Add("None");
            //cboMidiReset.Items.Add("GM");
            //cboMidiReset.Items.Add("GS");
            //cboMidiReset.Items.Add("XG");
            //cboMidiReset.Text = SRC.MidiResetType;

            // MP3音量
            SavedMP3Volume    = Sound.Player.SoundVolume;
            txtMP3Volume.Text = SrcFormatter.Format((int)(Sound.Player.SoundVolume * 100));
        }
Exemplo n.º 22
0
        // スペシャルパワー自爆による自爆
        public void SuicidalExplosion(bool is_event = false)
        {
            PilotMessage("自爆", msg_mode: "");
            GUI.DisplaySysMessage(Nickname + "は自爆した。");

            // ダメージ量設定
            var dmg = HP;

            // 効果範囲の設定
            Map.AreaInRange(x, y, 1, 1, "");
            Map.MaskData[x, y] = true;

            // 爆発
            GUI.EraseUnitBitmap(x, y);
            Effect.ExplodeAnimation(Size, x, y);

            // パーツ分離できれば自爆後にパーツ分離
            if (IsFeatureAvailable("パーツ分離"))
            {
                var uname = GeneralLib.LIndex(FeatureData("パーツ分離"), 2);
                if (OtherForm(uname).IsAbleToEnter(x, y))
                {
                    Transform(uname);
                    {
                        var cf = CurrentForm();
                        cf.HP         = cf.MaxHP;
                        cf.UsedAction = cf.MaxAction();
                    }

                    var fname = FeatureName("パーツ分離");
                    if (!SysMessageIfDefined(new string[]
                    {
                        "破壊時分離(" + Name + ")",
                        "破壊時分離(" + fname + ")",
                        "破壊時分離",
                        "分離(" + Name + ")",
                        "分離(" + fname + ")",
                        "分離",
                    }))
                    {
                        GUI.DisplaySysMessage(Nickname + "は破壊されたパーツを分離させた。");
                    }
                    goto SkipSuicide;
                }
            }

            // 自分を破壊
            HP = 0;
            GUI.UpdateMessageForm(this, u2: null);
            // 既に爆発アニメーションを表示しているので
            AddCondition("破壊キャンセル", 1, cdata: "");
            Map.MapDataForUnit[x, y] = null;
            Die();
            if (!is_event)
            {
                var u = Commands.SelectedUnit;
                Commands.SelectedUnit = this;
                Event.HandleEvent("破壊", MainPilot().ID);
                Commands.SelectedUnit = u;
                if (SRC.IsScenarioFinished)
                {
                    SRC.IsScenarioFinished = false;
                    return;
                }
            }

SkipSuicide:
            ;


            // 周りのエリアに爆発効果を適用
            var loopTo = Map.MapWidth;

            for (var i = 1; i <= loopTo; i++)
            {
                var loopTo1 = Map.MapHeight;
                for (var j = 1; j <= loopTo1; j++)
                {
                    if (Map.MaskData[i, j])
                    {
                        goto NextLoop;
                    }

                    var t = Map.MapDataForUnit[i, j];
                    if (t is null)
                    {
                        goto NextLoop;
                    }

                    {
                        GUI.ClearMessageForm();
                        if (CurrentForm().Party == "味方" || CurrentForm().Party == "NPC")
                        {
                            GUI.UpdateMessageForm(t, CurrentForm());
                        }
                        else
                        {
                            GUI.UpdateMessageForm(CurrentForm(), t);
                        }

                        // ダメージの適用
                        var prev_hp = t.HP;
                        int tdmg;
                        if (t.IsConditionSatisfied("無敵"))
                        {
                            tdmg = 0;
                        }
                        else if (t.IsConditionSatisfied("不死身"))
                        {
                            t.HP = GeneralLib.MaxLng(t.HP - dmg, 10);
                            tdmg = prev_hp - t.HP;
                        }
                        else
                        {
                            t.HP = t.HP - dmg;
                            tdmg = prev_hp - t.HP;
                        }

                        // 特殊能力「不安定」による暴走チェック
                        if (t.IsFeatureAvailable("不安定"))
                        {
                            if (t.HP <= t.MaxHP / 4 && !t.IsConditionSatisfied("暴走"))
                            {
                                t.AddCondition("暴走", -1, cdata: "");
                                t.Update();
                            }
                        }

                        // ダメージを受ければ眠りからさめる
                        if (t.IsConditionSatisfied("睡眠"))
                        {
                            t.DeleteCondition("睡眠");
                        }

                        if (CurrentForm().Party == "味方" || CurrentForm().Party == "NPC")
                        {
                            GUI.UpdateMessageForm(t, CurrentForm());
                        }
                        else
                        {
                            GUI.UpdateMessageForm(CurrentForm(), t);
                        }

                        if (t.HP > 0)
                        {
                            GUI.DrawSysString(t.x, t.y, SrcFormatter.Format(tdmg));
                            GUI.RefreshScreen();
                        }

                        if (t.HP == 0)
                        {
                            if (t.IsUnderSpecialPowerEffect("復活"))
                            {
                                t.HP = t.MaxHP;
                                t.RemoveSpecialPowerInEffect("破壊");
                                GUI.DisplaySysMessage(t.Nickname + "は復活した!");
                                goto NextLoop;
                            }

                            if (t.IsFeatureAvailable("パーツ分離"))
                            {
                                var uname = GeneralLib.LIndex(t.FeatureData("パーツ分離"), 2);
                                if (t.OtherForm(uname).IsAbleToEnter(t.x, t.y))
                                {
                                    t.Transform(uname);
                                    {
                                        var cf = t.CurrentForm();
                                        cf.HP         = cf.MaxHP;
                                        cf.UsedAction = cf.MaxAction();
                                    }

                                    GUI.DisplaySysMessage(t.Nickname + "は破壊されたパーツを分離させた。");
                                    goto NextLoop;
                                }
                            }

                            t.Die();
                        }

                        if (!is_event)
                        {
                            var u = Commands.SelectedUnit;
                            Commands.SelectedUnit   = t.CurrentForm();
                            Commands.SelectedTarget = this;
                            if (t.Status == "破壊")
                            {
                                GUI.DisplaySysMessage((string)(t.Nickname + "は破壊された"));
                                Event.HandleEvent("破壊", t.MainPilot().ID);
                            }
                            else
                            {
                                GUI.DisplaySysMessage(t.Nickname + "は" + tdmg + "のダメージを受けた。;" + "残りHPは" + SrcFormatter.Format(t.HP) + "(損傷率 = " + 100 * (t.MaxHP - t.HP) / t.MaxHP + "%)");
                                Event.HandleEvent("損傷率", t.MainPilot().ID, "" + (int)(100 - t.HP * 100 / t.MaxHP));
                            }

                            Commands.SelectedUnit = u;
                            if (SRC.IsScenarioFinished)
                            {
                                SRC.IsScenarioFinished = false;
                                return;
                            }
                        }
                    }

NextLoop:
                    ;
                }
            }
        }
Exemplo n.º 23
0
        protected override int ExecInternal()
        {
            if (ArgNum != 4 && ArgNum != 5)
            {
                throw new EventErrorException(this, "SetSkillコマンドの引数の数が違います");
            }

            var pname = GetArgAsString(2);

            if (SRC.PList.IsDefined(pname))
            {
                pname = SRC.PList.Item(pname).ID;
            }
            else if (SRC.PDList.IsDefined(pname))
            {
                pname = SRC.PDList.Item(pname).Name;
            }
            else
            {
                throw new EventErrorException(this, "「" + pname + "」というパイロットが見つかりません");
            }

            var sname  = GetArgAsString(3);
            var slevel = GetArgAsDouble(4);
            var sdata  = "";

            if (ArgNum == 5)
            {
                sdata = GetArgAsString(5);
            }

            // エリアスが定義されている?
            var sList = new List <SkillData>();

            if (SRC.ALDList.IsDefined(sname))
            {
                {
                    var alias = SRC.ALDList.Item(sname);
                    foreach (var elm in alias.Elements)
                    {
                        var sd = new SkillData();
                        sList.Add(sd);

                        if (GeneralLib.LIndex(elm.strAliasData, 1) == "解説")
                        {
                            if (string.IsNullOrEmpty(sdata))
                            {
                                sd.Name = elm.strAliasType;
                            }
                            else
                            {
                                sd.Name = GeneralLib.LIndex(sdata, 1);
                            }

                            if (slevel == 0d)
                            {
                                sd.Level = 0d;
                            }
                            else
                            {
                                sd.Level = Constants.DEFAULT_LEVEL;
                            }

                            sd.StrData = elm.strAliasData;
                        }
                        else
                        {
                            sd.Name = elm.strAliasType;
                            if (slevel == -1)
                            {
                                sd.Level = elm.dblAliasLevel;
                            }
                            else if (elm.blnAliasLevelIsPlusMod)
                            {
                                sd.Level = slevel + elm.dblAliasLevel;
                            }
                            else if (elm.blnAliasLevelIsMultMod)
                            {
                                sd.Level = slevel * elm.dblAliasLevel;
                            }
                            else
                            {
                                sd.Level = slevel;
                            }

                            if (string.IsNullOrEmpty(sdata))
                            {
                                sd.StrData = elm.strAliasData;
                            }
                            else
                            {
                                sd.StrData = Strings.Trim(sdata + " " + GeneralLib.ListTail(elm.strAliasData, 2));
                            }

                            if (elm.blnAliasLevelIsPlusMod || elm.blnAliasLevelIsPlusMod)
                            {
                                sd.StrData = Strings.Trim(GeneralLib.LIndex(sd.StrData, 1) + "Lv" + SrcFormatter.Format(slevel) + " " + GeneralLib.ListTail(sd.StrData, 2));
                            }
                        }
                    }
                }
            }
            else
            {
                sList.Add(new SkillData
                {
                    Name    = sname,
                    Level   = slevel,
                    StrData = sdata,
                });
            }

            foreach (var sd in sList)
            {
                sname  = sd.Name;
                slevel = sd.Level;
                sdata  = sd.StrData;
                if (string.IsNullOrEmpty(sname))
                {
                    continue;
                }

                string slist;
                // アビリティ一覧表示用にSetSkillが適用された能力の一覧用変数を作成
                if (!Expression.IsGlobalVariableDefined("Ability(" + pname + ")"))
                {
                    Expression.DefineGlobalVariable("Ability(" + pname + ")");
                    slist = sname;
                }
                else
                {
                    slist = Conversions.ToString(Event.GlobalVariableList["Ability(" + pname + ")"].StringValue);
                    if (!GeneralLib.ToL(slist).Contains(sname))
                    {
                        slist = slist + " " + sname;
                    }
                }

                Expression.SetVariableAsString("Ability(" + pname + ")", slist);

                // 今回SetSkillが適用された能力sname用変数を作成
                var vname = "Ability(" + pname + "," + sname + ")";
                if (!Expression.IsGlobalVariableDefined(vname))
                {
                    Expression.DefineGlobalVariable(vname);
                }

                if (!string.IsNullOrEmpty(sdata))
                {
                    // 別名指定があった場合
                    Expression.SetVariableAsString(vname, SrcFormatter.Format(slevel) + " " + sdata);

                    // 必要技能用
                    if (sdata != "非表示" && GeneralLib.LIndex(sdata, 1) != "解説")
                    {
                        vname = "Ability(" + pname + "," + GeneralLib.LIndex(sdata, 1) + ")";
                        if (!Expression.IsGlobalVariableDefined(vname))
                        {
                            Expression.DefineGlobalVariable(vname);
                        }

                        Expression.SetVariableAsString(vname, SrcFormatter.Format(slevel));
                    }
                }
                else
                {
                    Expression.SetVariableAsString(vname, SrcFormatter.Format(slevel));
                }
            }

            // パイロットやユニットのステータスをアップデート
            if (SRC.PList.IsDefined(pname))
            {
                {
                    var withBlock1 = SRC.PList.Item(pname);
                    withBlock1.Update();
                    if (withBlock1.Unit is object)
                    {
                        withBlock1.Unit.Update();
                        if (withBlock1.Unit.Status == "出撃")
                        {
                            SRC.PList.UpdateSupportMod(withBlock1.Unit);
                        }
                    }
                }
            }
            return(EventData.NextID);
        }
Exemplo n.º 24
0
Arquivo: SRC.play.cs Projeto: 7474/SRC
        // 陣営upartyのフェイズを実行
        public void StartTurn(string uparty)
        {
            // TODO Impl StartTurn
            Stage         = uparty;
            Sound.BossBGM = false;
            if (uparty == "味方")
            {
                do
                {
                    // 味方フェイズ
                    Stage = "味方";

                    // ターン数を進める
                    if (!Map.IsStatusView)
                    {
                        Turn      = Turn + 1;
                        TotalTurn = TotalTurn + 1;
                    }

                    // 状態回復
                    foreach (var currentUnit in UList.Items)
                    {
                        Commands.SelectedUnit = currentUnit;
                        switch (currentUnit.Status)
                        {
                        case "出撃":
                        case "格納":
                        {
                            if ((currentUnit.Party ?? "") == (uparty ?? ""))
                            {
                                if (Map.IsStatusView)
                                {
                                    currentUnit.UsedAction = 0;
                                }
                                else
                                {
                                    currentUnit.Rest();
                                }

                                if (IsScenarioFinished)
                                {
                                    GUI.UnlockGUI();
                                    return;
                                }
                            }
                            else
                            {
                                currentUnit.UsedAction = 0;
                            }

                            break;
                        }

                        case "旧主形態":
                        case "旧形態":
                        {
                            currentUnit.UsedAction = 0;
                            break;
                        }
                        }
                    }

                    // 味方が敵にかけたスペシャルパワーを解除
                    foreach (var currentU in UList.Items)
                    {
                        switch (currentU.Status)
                        {
                        case "出撃":
                        case "格納":
                        {
                            currentU.RemoveSpecialPowerInEffect("敵ターン");
                            break;
                        }
                        }
                    }

                    GUI.RedrawScreen();

                    // 味方フェイズ用BGMを演奏
                    if (!Map.IsStatusView)
                    {
                        var terrain = Map.Terrain(1, 1);
                        switch (terrain?.Class ?? "")
                        {
                        case "屋内":
                            Sound.StartBGM(Sound.BGMName("Map3"));
                            break;

                        case "宇宙":
                            Sound.StartBGM(Sound.BGMName("Map5"));
                            break;

                        default:
                            if (terrain?.Name == "壁")
                            {
                                Sound.StartBGM(Sound.BGMName("Map3"));
                            }
                            else
                            {
                                Sound.StartBGM(Sound.BGMName("Map1"));
                            }
                            break;
                        }
                    }

                    // ターンイベント
                    Event.IsUnitCenter = false;
                    Event.HandleEvent("ターン", Turn.ToString(), "味方");
                    if (IsScenarioFinished)
                    {
                        GUI.UnlockGUI();
                        return;
                    }

                    // 操作可能なユニットがいるかどうかチェック
                    if (UList.Items.Count(x => x.Party == "味方" && x.CanAction) > 0 ||
                        Expression.IsOptionDefined("味方フェイズ強制発動"))
                    {
                        break;
                    }

                    // CPUが操作するユニットがいるかどうかチェック
                    if (UList.Items.Count(x => x.Party != "味方" && x.Status == "出撃") > 0)
                    {
                        break;
                    }

                    // 敵フェイズ
                    StartTurn("敵");
                    if (IsScenarioFinished)
                    {
                        IsScenarioFinished = false;
                        return;
                    }

                    // 中立フェイズ
                    StartTurn("中立");
                    if (IsScenarioFinished)
                    {
                        IsScenarioFinished = false;
                        return;
                    }

                    // NPCフェイズ
                    StartTurn("NPC");
                    if (IsScenarioFinished)
                    {
                        IsScenarioFinished = false;
                        return;
                    }
                }while (true);
            }
            else
            {
                // 味方フェイズ以外

                // 状態回復
                foreach (var currentUnit in UList.Items)
                {
                    Commands.SelectedUnit = currentUnit;
                    switch (currentUnit.Status)
                    {
                    case "出撃":
                    case "格納":
                    {
                        if ((currentUnit.Party ?? "") == (uparty ?? ""))
                        {
                            currentUnit.Rest();
                            if (IsScenarioFinished)
                            {
                                GUI.UnlockGUI();
                                return;
                            }
                        }
                        else
                        {
                            currentUnit.UsedAction = 0;
                        }

                        break;
                    }

                    case "旧主形態":
                    case "旧形態":
                    {
                        currentUnit.UsedAction = 0;
                        break;
                    }
                    }
                }

                // 敵ユニットが味方にかけたスペシャルパワーを解除
                foreach (var currentUnit in UList.Items)
                {
                    switch (currentUnit.Status)
                    {
                    case "出撃":
                    case "格納":
                    {
                        currentUnit.RemoveSpecialPowerInEffect("敵ターン");
                        break;
                    }
                    }
                }

                GUI.RedrawScreen();

                // 敵(NPC)フェイズ用BGMを演奏
                var terrain = Map.Terrain(1, 1);
                if (Stage == "NPC")
                {
                    switch (terrain?.Class ?? "")
                    {
                    case "屋内":
                        Sound.StartBGM(Sound.BGMName("Map3"));
                        break;

                    case "宇宙":
                        Sound.StartBGM(Sound.BGMName("Map5"));
                        break;

                    default:
                        if (terrain?.Name == "壁")
                        {
                            Sound.StartBGM(Sound.BGMName("Map3"));
                        }
                        else
                        {
                            Sound.StartBGM(Sound.BGMName("Map1"));
                        }
                        break;
                    }
                }
                else
                {
                    switch (terrain?.Class ?? "")
                    {
                    case "屋内":
                        Sound.StartBGM(Sound.BGMName("Map4"));
                        break;

                    case "宇宙":
                        Sound.StartBGM(Sound.BGMName("Map6"));
                        break;

                    default:
                        if (terrain?.Name == "壁")
                        {
                            Sound.StartBGM(Sound.BGMName("Map4"));
                        }
                        else
                        {
                            Sound.StartBGM(Sound.BGMName("Map2"));
                        }
                        break;
                    }
                }

                // ターンイベント
                Event.HandleEvent("ターン", Turn.ToString(), uparty);
                if (IsScenarioFinished)
                {
                    GUI.UnlockGUI();
                    return;
                }
            }

            int  max_lv;
            Unit max_unit = null;

            if (uparty == "味方")
            {
                // 味方フェイズのプレイヤーによるユニット操作前の処理

                // ターン数を表示
                if (Turn > 1 && Expression.IsOptionDefined("デバッグ"))
                {
                    GUI.DisplayTelop("ターン" + SrcFormatter.Format(Turn));
                }

                // 通常のステージでは母艦ユニットまたはレベルがもっとも高い
                // ユニットを中央に配置
                if (!Map.IsStatusView && !Event.IsUnitCenter)
                {
                    foreach (Unit currentUnit in UList.Items)
                    {
                        if (currentUnit.Party == "味方" && currentUnit.Status == "出撃" && currentUnit.Action > 0)
                        {
                            if (currentUnit.IsFeatureAvailable("母艦"))
                            {
                                GUI.Center(currentUnit.x, currentUnit.y);
                                GUIStatus.DisplayUnitStatus(currentUnit);
                                GUI.RedrawScreen();
                                GUI.UnlockGUI();
                                return;
                            }
                        }
                    }

                    max_lv = 0;
                    foreach (Unit cuttentUnit in UList.Items)
                    {
                        if (cuttentUnit.Party == "味方" && cuttentUnit.Status == "出撃")
                        {
                            if (cuttentUnit.MainPilot().Level > max_lv)
                            {
                                max_unit = cuttentUnit;
                                max_lv   = cuttentUnit.MainPilot().Level;
                            }
                        }
                    }

                    if (max_unit != null)
                    {
                        GUI.Center(max_unit.x, max_unit.y);
                    }
                }

                // ステータスを表示
                if (!Map.IsStatusView)
                {
                    GUIStatus.DisplayGlobalStatus();
                }

                // プレイヤーによる味方ユニット操作に移行
                GUI.RedrawScreen();
                GUI.UnlockGUI();
                return;
            }

            GUI.LockGUI();

            CPUOperation(uparty);

            if (IsScenarioFinished)
            {
                return;
            }

            // ステータスウィンドウの表示を消去
            GUIStatus.ClearUnitStatus();
        }
Exemplo n.º 25
0
        // 「換装」コマンド
        public void ExchangeFormCommand()
        {
            GUI.LockGUI();
            var fd = SelectedUnit.Feature("換装");

            // 選択可能な換装先のリストを作成
            var uList = fd.DataL.Select(x => SelectedUnit.OtherForm(x))
                        .Where(x => x.IsAvailable())
                        .Select(u =>
            {
                // 各形態の表示内容を作成
                var msg = "";
                msg    += (u.Nickname == SelectedUnit.Nickname0)
                        ? GeneralLib.RightPaddedString(u.Name, 27)
                        : GeneralLib.RightPaddedString(u.Nickname0, 27);
                // ユニットに関する情報
                msg += GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MaxHP), 6);
                msg += GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MaxEN), 5);
                msg += GeneralLib.LeftPaddedString(SrcFormatter.Format(u.get_Armor("")), 5);
                msg += GeneralLib.LeftPaddedString(SrcFormatter.Format(u.get_Mobility("")), 5);

                var weapons = u.Weapons.Where(uw => uw.IsDisplayFor(WeaponListMode.List)).ToList();
                // 最大攻撃力
                var maxPower = weapons.Max(uw => uw.WeaponPower(""));
                msg         += GeneralLib.LeftPaddedString("" + maxPower, 7);
                // 最大射程
                var maxRange = weapons.Max(uw => uw.WeaponMaxRange());
                msg         += GeneralLib.LeftPaddedString("" + maxRange, 5);

                // 換装先が持つ特殊能力一覧
                var comment = string.Join(" ", u.Features
                                          .Select(fd => fd.FeatureName(u))
                                          .Where(x => !string.IsNullOrEmpty(x))
                                          .Distinct());
                return(new ListBoxItem(msg, u.ID)
                {
                    ListItemComment = comment,
                });
            })
                        .ToList();

            // どの形態に換装するかを選択
            GUI.TopItem = 1;
            var tfRet = GUI.ListBox(new ListBoxArgs
            {
                Items      = uList,
                lb_caption = "変更先選択",
                lb_info    = "ユニット                     "
                             + Expression.Term("HP", null, 4) + " " + Expression.Term("EN", null, 4) + " "
                             + Expression.Term("装甲", null, 4) + " " + Expression.Term("運動", u: null) + " 適応 攻撃力 射程",
                lb_mode = "連続表示,コメント",
            });

            // キャンセル?
            if (tfRet == 0)
            {
                CancelCommand();
                GUI.UnlockGUI();
                return;
            }

            // 換装を実施
            SelectedUnit.Transform(SelectedUnit.OtherForm(uList[tfRet - 1].ListItemID).Name);

            // ユニットリストの再構築
            Event.MakeUnitList(smode: "");

            // カーソル自動移動
            if (SRC.AutoMoveCursor)
            {
                GUI.MoveCursorPos("ユニット選択", SelectedUnit.CurrentForm());
            }

            Status.DisplayUnitStatus(SelectedUnit.CurrentForm());

            CommandState = "ユニット選択";
            GUI.UnlockGUI();
        }
Exemplo n.º 26
0
        // アビリティに効果を追加
        public void SetEffect(string elist)
        {
            elist = (elist ?? "").Trim();
            foreach (var eelm in GeneralLib.ToList(elist))
            {
                var    dat = new AbilityEffect();
                var    buf = eelm;
                var    j   = Strings.InStr(buf, "Lv");
                var    k   = Strings.InStr(buf, "=");
                string etype;
                string elevel;
                string edata;
                if (j > 0 && (k == 0 || j < k))
                {
                    // レベル指定のある効果(データ指定があるものを含む)
                    dat.Name = Strings.Left(buf, j - 1);
                    if (k > 0)
                    {
                        // データ指定があるもの
                        dat.Level = Conversions.ToDouble(Strings.Mid(buf, j + 2, k - (j + 2)));
                        buf       = Strings.Mid(buf, k + 1);
                        if (Strings.Left(buf, 1) == "\"")
                        {
                            buf = Strings.Mid(buf, 2, Strings.Len(buf) - 2);
                        }

                        j = Strings.InStr(buf, "Lv");
                        k = Strings.InStr(buf, "=");
                        if (j > 0 && (k == 0 || j < k))
                        {
                            // データ指定内にレベル指定がある
                            etype = Strings.Left(buf, j - 1);
                            if (k > 0)
                            {
                                elevel = Strings.Mid(buf, j + 2, k - (j + 2));
                                edata  = Strings.Mid(buf, k + 1);
                            }
                            else
                            {
                                elevel = Strings.Mid(buf, j + 2);
                                edata  = "";
                            }
                        }
                        else if (k > 0)
                        {
                            // データ指定内にデータ指定がある
                            etype  = Strings.Left(buf, k - 1);
                            elevel = "";
                            edata  = Strings.Mid(buf, k + 1);
                        }
                        else
                        {
                            // 単純なデータ指定
                            etype  = buf;
                            elevel = "";
                            edata  = "";
                        }

                        if (dat.Name == "付加" && string.IsNullOrEmpty(elevel))
                        {
                            elevel = SrcFormatter.Format(Constants.DEFAULT_LEVEL);
                        }

                        dat.Data = Strings.Trim(etype + " " + elevel + " " + edata);
                    }
                    else
                    {
                        // データ指定がないもの
                        dat.Level = Conversions.ToDouble(Strings.Mid(buf, j + 2));
                    }
                }
                else if (k > 0)
                {
                    // データ指定を含む効果
                    dat.Name = Strings.Left(buf, k - 1);
                    buf      = Strings.Mid(buf, k + 1);
                    if (Strings.Asc(buf) == 34) // "
                    {
                        buf = Strings.Mid(buf, 2, Strings.Len(buf) - 2);
                    }

                    j = Strings.InStr(buf, "Lv");
                    k = Strings.InStr(buf, "=");
                    if (dat.Name == "解説")
                    {
                        // 解説の指定
                        etype  = buf;
                        elevel = "";
                        edata  = "";
                    }
                    else if (j > 0)
                    {
                        // データ指定内にレベル指定がある
                        etype = Strings.Left(buf, j - 1);
                        if (k > 0)
                        {
                            elevel = Strings.Mid(buf, j + 2, k - (j + 2));
                            edata  = Strings.Mid(buf, k + 1);
                        }
                        else
                        {
                            elevel = Strings.Mid(buf, j + 2);
                            edata  = "";
                        }
                    }
                    else if (k > 0)
                    {
                        // データ指定内にデータ指定がある
                        etype  = Strings.Left(buf, k - 1);
                        elevel = "";
                        edata  = Strings.Mid(buf, k + 1);
                    }
                    else
                    {
                        // 単純なデータ指定
                        etype  = buf;
                        elevel = "";
                        edata  = "";
                    }

                    if (dat.Name == "付加" && string.IsNullOrEmpty(elevel))
                    {
                        elevel = SrcFormatter.Format(Constants.DEFAULT_LEVEL);
                    }

                    dat.Data = Strings.Trim(etype + " " + elevel + " " + edata);
                }
                else
                {
                    // 効果名のみ
                    dat.Name = buf;
                }

                j = 1;
                foreach (AbilityEffect dat2 in colEffects)
                {
                    if ((dat.Name ?? "") == (dat2.Name ?? ""))
                    {
                        j = (j + 1);
                    }
                }

                if (j == 1)
                {
                    colEffects.Add(dat, dat.Name);
                }
                else
                {
                    colEffects.Add(dat, dat.Name + SrcFormatter.Format(j));
                }
            }
        }
Exemplo n.º 27
0
        // スペシャルパワーコマンドを開始
        private void StartSpecialPowerCommand()
        {
            GUI.LockGUI();
            SelectedCommand = "スペシャルパワー";
            {
                var u = SelectedUnit;

                // スペシャルパワーを使用可能なパイロットの一覧を作成
                var pilots    = u.PilotsHaveSpecialPower();
                var listItems = pilots.Select(p =>
                {
                    return(new ListBoxItem
                    {
                        Text = GeneralLib.RightPaddedString(p.get_Nickname(false), 17)
                               + GeneralLib.RightPaddedString($"{p.SP}/{p.MaxSP}", 8)
                               + string.Join("", Enumerable.Range(1, p.CountSpecialPower).Select(i =>
                        {
                            var sname = p.get_SpecialPower(i);
                            if (p.SP >= p.SpecialPowerCost(sname))
                            {
                                return SRC.SPDList.Item(sname).ShortName;
                            }
                            else
                            {
                                return "";
                            }
                        })),
                    });
                }).ToList();

                GUI.TopItem = 1;
                int i;
                if (pilots.Count > 1)
                {
                    // どのパイロットを使うか選択
                    if (Expression.IsOptionDefined("等身大基準"))
                    {
                        i = GUI.ListBox(new ListBoxArgs
                        {
                            Items      = listItems,
                            HasFlag    = false,
                            lb_caption = "キャラクター選択",
                            lb_info    = "キャラクター     " + Expression.Term("SP", SelectedUnit, 2) + "/Max" + Expression.Term("SP", SelectedUnit, 2),
                            lb_mode    = "連続表示,カーソル移動"
                        });
                    }
                    else
                    {
                        i = GUI.ListBox(new ListBoxArgs
                        {
                            Items      = listItems,
                            HasFlag    = false,
                            lb_caption = "パイロット選択",
                            lb_info    = "パイロット       " + Expression.Term("SP", SelectedUnit, 2) + "/Max" + Expression.Term("SP", SelectedUnit, 2),
                            lb_mode    = "連続表示,カーソル移動"
                        });
                    }
                }
                else
                {
                    // 一人しかいないので選択の必要なし
                    i = 1;
                }

                // 誰もスペシャルパワーを使えなければキャンセル
                if (i == 0)
                {
                    GUI.CloseListBox();
                    if (SRC.AutoMoveCursor)
                    {
                        GUI.RestoreCursorPos();
                    }

                    GUI.UnlockGUI();
                    CancelCommand();
                    return;
                }

                // スペシャルパワーを使うパイロットを設定
                SelectedPilot = pilots[i - 1];
                // そのパイロットのステータスを表示
                if (pilots.Count > 1)
                {
                    Status.DisplayPilotStatus(SelectedPilot);
                }
            }

            {
                var p = SelectedPilot;
                // 使用可能なスペシャルパワーの一覧を作成
                var spList = p.SpecialPowerNames.Select(sname =>
                {
                    var cost = p.SpecialPowerCost(sname);
                    var spd  = SRC.SPDList.Item(sname);

                    return(new ListBoxItem
                    {
                        Text = GeneralLib.RightPaddedString(sname, 13) + GeneralLib.LeftPaddedString("" + cost, 3) + " " + spd.Comment,
                        ListItemFlag = p.SP < cost || !p.IsSpecialPowerUseful(sname),
                    });
                }).ToList();

                // どのコマンドを使用するかを選択
                GUI.TopItem = 1;
                var i = GUI.ListBox(new ListBoxArgs
                {
                    Items      = spList,
                    HasFlag    = true,
                    lb_caption = Expression.Term("スペシャルパワー", SelectedUnit) + "選択",
                    lb_info    = "名称         消費" + Expression.Term("SP", SelectedUnit) + "(" + p.get_Nickname(false) + " " + Expression.Term("SP", SelectedUnit) + "=" + SrcFormatter.Format(p.SP) + "/" + SrcFormatter.Format(p.MaxSP) + ")",
                    lb_mode    = "カーソル移動(行きのみ)"
                });
                // キャンセル
                if (i == 0)
                {
                    Status.DisplayUnitStatus(SelectedUnit);
                    // カーソル自動移動
                    if (SRC.AutoMoveCursor)
                    {
                        GUI.MoveCursorPos("ユニット選択", SelectedUnit);
                    }

                    GUI.UnlockGUI();
                    CancelCommand();
                    return;
                }

                // 使用するスペシャルパワーを設定
                SelectedSpecialPower = SelectedPilot.get_SpecialPower(i);
            }

            // 味方スペシャルパワー実行の効果により他のパイロットが持っているスペシャルパワーを
            // 使う場合は記録しておき、後で消費SPを倍にする必要がある
            // TODO Impl 夢
            //if (SRC.SPDList.Item(SelectedSpecialPower).EffectType(1) == "味方スペシャルパワー実行")
            if (false)
            {
                //// スペシャルパワー一覧
                //list = new string[1];
                //var loopTo6 = SRC.SPDList.Count();
                //for (i = 1; i <= loopTo6; i++)
                //{
                //    {
                //        var withBlock5 = SRC.SPDList.Item(i);
                //        if (withBlock5.EffectType(1) != "味方スペシャルパワー実行" && withBlock5.intName != "非表示")
                //        {
                //            Array.Resize(list, Information.UBound(list) + 1 + 1);
                //            Array.Resize(strkey_list, Information.UBound(list) + 1);
                //            list[Information.UBound(list)] = withBlock5.Name;
                //            strkey_list[Information.UBound(list)] = withBlock5.KanaName;
                //        }
                //    }
                //}

                //GUI.ListItemFlag = new bool[Information.UBound(list) + 1];

                //// ソート
                //var loopTo7 = (Information.UBound(strkey_list) - 1);
                //for (i = 1; i <= loopTo7; i++)
                //{
                //    max_item = i;
                //    max_str = strkey_list[i];
                //    var loopTo8 = Information.UBound(strkey_list);
                //    for (j = (i + 1); j <= loopTo8; j++)
                //    {
                //        if (Strings.StrComp(strkey_list[j], max_str, (CompareMethod)1) == -1)
                //        {
                //            max_item = j;
                //            max_str = strkey_list[j];
                //        }
                //    }

                //    if (max_item != i)
                //    {
                //        buf = list[i];
                //        list[i] = list[max_item];
                //        list[max_item] = buf;
                //        buf = strkey_list[i];
                //        strkey_list[i] = max_str;
                //        strkey_list[max_item] = buf;
                //    }
                //}

                //// スペシャルパワーを使用可能なパイロットがいるかどうかを判定
                //var loopTo9 = Information.UBound(list);
                //for (i = 1; i <= loopTo9; i++)
                //{
                //    GUI.ListItemFlag[i] = true;
                //    foreach (Pilot currentP in SRC.PList)
                //    {
                //        p = currentP;
                //        if (p.Party == "味方")
                //        {
                //            if (p.Unit is object)
                //            {
                //                if (p.Unit.Status == "出撃" && !p.Unit.IsConditionSatisfied("憑依"))
                //                {
                //                    // 本当に乗っている?
                //                    found = false;
                //                    {
                //                        var withBlock6 = p.Unit;
                //                        if (ReferenceEquals(p, withBlock6.MainPilot()))
                //                        {
                //                            found = true;
                //                        }
                //                        else
                //                        {
                //                            var loopTo10 = withBlock6.CountPilot();
                //                            for (j = 2; j <= loopTo10; j++)
                //                            {
                //                                Pilot localPilot1() { object argIndex1 = j; var ret = withBlock6.Pilot(argIndex1); return ret; }

                //                                if (ReferenceEquals(p, localPilot1()))
                //                                {
                //                                    found = true;
                //                                    break;
                //                                }
                //                            }

                //                            var loopTo11 = withBlock6.CountSupport();
                //                            for (j = 1; j <= loopTo11; j++)
                //                            {
                //                                Pilot localSupport() { object argIndex1 = j; var ret = withBlock6.Support(argIndex1); return ret; }

                //                                if (ReferenceEquals(p, localSupport()))
                //                                {
                //                                    found = true;
                //                                    break;
                //                                }
                //                            }

                //                            if (ReferenceEquals(p, withBlock6.AdditionalSupport()))
                //                            {
                //                                found = true;
                //                            }
                //                        }
                //                    }

                //                    if (found)
                //                    {
                //                        if (p.IsSpecialPowerAvailable(list[i]))
                //                        {
                //                            GUI.ListItemFlag[i] = false;
                //                            break;
                //                        }
                //                    }
                //                }
                //            }
                //        }
                //    }
                //}

                //// 各スペシャルパワーが使用可能か判定
                //{
                //    var withBlock7 = SelectedPilot;
                //    var loopTo12 = Information.UBound(list);
                //    for (i = 1; i <= loopTo12; i++)
                //    {
                //        if (!GUI.ListItemFlag[i] && withBlock7.SP >= 2 * withBlock7.SpecialPowerCost(list[i]))
                //        {
                //            if (!withBlock7.IsSpecialPowerUseful(list[i]))
                //            {
                //                GUI.ListItemFlag[i] = true;
                //            }
                //        }
                //        else
                //        {
                //            GUI.ListItemFlag[i] = true;
                //        }
                //    }
                //}

                //// スペシャルパワーの解説を設定
                //GUI.ListItemComment = new string[Information.UBound(list) + 1];
                //var loopTo13 = Information.UBound(list);
                //for (i = 1; i <= loopTo13; i++)
                //{
                //    SpecialPowerData localItem4() { var tmp = list; object argIndex1 = tmp[i]; var ret = SRC.SPDList.Item(argIndex1); return ret; }

                //    GUI.ListItemComment[i] = localItem4().Comment;
                //}

                //// 検索するスペシャルパワーを選択
                //GUI.TopItem = 1;
                //ret = GUI.MultiColumnListBox(Expression.Term(argtname7, u: argu) + "検索", list, true);
                //if (ret == 0)
                //{
                //    SelectedSpecialPower = "";
                //    CancelCommand();
                //    GUI.UnlockGUI();
                //    return;
                //}

                //// スペシャルパワー使用メッセージ
                //if (SelectedUnit.IsMessageDefined(SelectedSpecialPower))
                //{
                //    GUI.OpenMessageForm(u1: null1, u2: null2);
                //    SelectedUnit.PilotMessage(SelectedSpecialPower, msg_mode: "");
                //    GUI.CloseMessageForm();
                //}

                //SelectedSpecialPower = list[ret];
                //WithDoubleSPConsumption = true;
            }
            else
            {
                WithDoubleSPConsumption = false;
            }

            var sd = SRC.SPDList.Item(SelectedSpecialPower);

            // ターゲットを選択する必要があるスペシャルパワーの場合
            switch (sd.TargetType ?? "")
            {
            case "味方":
            case "敵":
            case "任意":
            {
                // マップ上のユニットからターゲットを選択する
                GUI.OpenMessageForm(null, null);
                GUI.DisplaySysMessage(SelectedPilot.get_Nickname(false) + "は" + SelectedSpecialPower + "を使った。;" + "ターゲットを選んでください。");
                GUI.CloseMessageForm();

                // ターゲットのエリアを設定
                for (var i = 1; i <= Map.MapWidth; i++)
                {
                    for (var j = 1; j <= Map.MapHeight; j++)
                    {
                        Map.MaskData[i, j] = true;
                        var u = Map.MapDataForUnit[i, j];
                        if (u is null)
                        {
                            goto NextLoop;
                        }

                        // 陣営が合っている?
                        switch (sd.TargetType ?? "")
                        {
                        case "味方":
                        {
                            {
                                var withBlock8 = u;
                                if (withBlock8.Party != "味方" && withBlock8.Party0 != "味方" && withBlock8.Party != "NPC" && withBlock8.Party0 != "NPC")
                                {
                                    goto NextLoop;
                                }
                            }

                            break;
                        }

                        case "敵":
                        {
                            {
                                var withBlock9 = u;
                                if (withBlock9.Party == "味方" && withBlock9.Party0 == "味方" || withBlock9.Party == "NPC" && withBlock9.Party0 == "NPC")
                                {
                                    goto NextLoop;
                                }
                            }

                            break;
                        }
                        }

                        // スペシャルパワーを適用可能?
                        if (!sd.Effective(SelectedPilot, u))
                        {
                            goto NextLoop;
                        }

                        Map.MaskData[i, j] = false;
NextLoop:
                        ;
                    }
                }

                GUI.MaskScreen();
                CommandState = "ターゲット選択";
                GUI.UnlockGUI();
                return;
            }

            case "破壊味方":
            {
                // 破壊された味方ユニットの中からターゲットを選択する
                GUI.OpenMessageForm(null, null);
                GUI.DisplaySysMessage(SelectedPilot.get_Nickname(false) + "は" + SelectedSpecialPower + "を使った。;" + "復活させるユニットを選んでください。");
                GUI.CloseMessageForm();

                // 破壊された味方ユニットのリストを作成
                var units = SRC.UList.Items
                            .Where(u => u.Party0 == "味方" && u.Status == "破壊" && (u.CountPilot() > 0 || u.Data.PilotNum == 0))
                            .Select(u => new ListBoxItem
                    {
                        Text = GeneralLib.RightPaddedString(u.Nickname, 28)
                               + GeneralLib.RightPaddedString(u.MainPilot().get_Nickname(false), 18)
                               + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MainPilot().Level), 3),
                        ListItemID = u.ID,
                    }).ToList();

                GUI.TopItem = 1;
                var ret = GUI.ListBox(new ListBoxArgs
                    {
                        Items      = units,
                        lb_caption = "ユニット選択",
                        lb_info    = "ユニット名                  パイロット     レベル",
                        lb_mode    = "",
                    });

                if (ret == 0)
                {
                    GUI.UnlockGUI();
                    CancelCommand();
                    return;
                }

                SelectedTarget = SRC.UList.Item(units[ret - 1].ListItemID);
                break;
            }
            }

            // 自爆を選択した場合は確認を取る
            if (sd.IsEffectAvailable("自爆"))
            {
                var ret = GUI.Confirm("自爆させますか?", "自爆", GuiConfirmOption.OkCancel | GuiConfirmOption.Question);
                if (ret == GuiDialogResult.Ok)
                {
                    GUI.UnlockGUI();
                    return;
                }
            }

            // 使用イベント
            Event.HandleEvent("使用", SelectedUnit.MainPilot().ID, SelectedSpecialPower);
            if (SRC.IsScenarioFinished)
            {
                SRC.IsScenarioFinished = false;
                GUI.UnlockGUI();
                return;
            }

            if (SRC.IsCanceled)
            {
                SRC.IsCanceled = false;
                GUI.UnlockGUI();
                return;
            }

            // スペシャルパワーを使用
            if (WithDoubleSPConsumption)
            {
                SelectedPilot.UseSpecialPower(SelectedSpecialPower, 2d);
            }
            else
            {
                SelectedPilot.UseSpecialPower(SelectedSpecialPower);
            }

            SelectedUnit = SelectedUnit.CurrentForm();

            // カーソル自動移動
            if (SRC.AutoMoveCursor)
            {
                GUI.MoveCursorPos("ユニット選択", SelectedUnit);
            }

            // ステータスウィンドウを更新
            Status.DisplayUnitStatus(SelectedUnit);

            // 使用後イベント
            Event.HandleEvent("使用後", SelectedUnit.MainPilot().ID, SelectedSpecialPower);
            if (SRC.IsScenarioFinished)
            {
                SRC.IsScenarioFinished = false;
            }

            if (SRC.IsCanceled)
            {
                SRC.IsCanceled = false;
            }

            SelectedSpecialPower = "";
            GUI.UnlockGUI();
            CommandState = "ユニット選択";
        }
Exemplo n.º 28
0
        private void RegisterAlias(string sname, double slevel, string sdata, int lv)
        {
            var aliasData = SRC.ALDList.Item(sname);

            foreach (var aliasElement in aliasData.Elements)
            {
                // エリアスの定義に従って特殊能力定義を置き換える
                var sd = new SkillData();
                sd.Name = aliasElement.strAliasType;

                if (GeneralLib.LIndex(aliasElement.strAliasData, 1) == "解説")
                {
                    if (!string.IsNullOrEmpty(sdata))
                    {
                        sd.Name = GeneralLib.LIndex(sdata, 1);
                    }
                }

                if (aliasElement.blnAliasLevelIsPlusMod)
                {
                    if (slevel == Constants.DEFAULT_LEVEL)
                    {
                        slevel = 1d;
                    }

                    sd.Level = slevel + aliasElement.dblAliasLevel;
                }
                else if (aliasElement.blnAliasLevelIsMultMod)
                {
                    if (slevel == Constants.DEFAULT_LEVEL)
                    {
                        slevel = 1d;
                    }

                    sd.Level = slevel * aliasElement.dblAliasLevel;
                }
                else if (slevel != Constants.DEFAULT_LEVEL)
                {
                    sd.Level = slevel;
                }
                else
                {
                    sd.Level = aliasElement.dblAliasLevel;
                }

                sd.StrData = aliasElement.strAliasData;
                if (!string.IsNullOrEmpty(sdata))
                {
                    if (aliasElement.strAliasData != "非表示" && GeneralLib.LIndex(aliasElement.strAliasData, 1) != "解説")
                    {
                        sd.StrData = Strings.Trim(sdata + " " + GeneralLib.ListTail(aliasElement.strAliasData, 2));
                    }
                }

                if (aliasElement.blnAliasLevelIsPlusMod || aliasElement.blnAliasLevelIsMultMod)
                {
                    sd.StrData = sd.StrData + "Lv" + SrcFormatter.Format(slevel);
                }

                sd.NecessaryLevel = lv;
                colSkill.Add(sd, sname + SrcFormatter.Format(colSkill.Count));
            }
        }
Exemplo n.º 29
0
        public void Load(string fname, Stream stream)
        {
            using (var reader = new SrcDataReader(fname, stream))
            {
                bool   in_quote;
                string line_buf;
                while (reader.HasMore)
                {
                    line_buf = reader.GetLine();
                    if (string.IsNullOrEmpty(line_buf))
                    {
                        continue;
                    }

                    // 番号
                    int data_id;
                    if (Information.IsNumeric(line_buf))
                    {
                        data_id = Conversions.ToInteger(line_buf);
                    }
                    else
                    {
                        throw reader.InvalidDataException("番号の設定が間違っています。", line_buf);
                    }

                    if (data_id < 0 || data_id >= Map.MAX_TERRAIN_DATA_NUM)
                    {
                        throw reader.InvalidDataException("番号の設定が間違っています。", line_buf);
                    }

                    TerrainData td = new TerrainData
                    {
                        ID = data_id,
                    };

                    // 名称, 画像ファイル名
                    line_buf = reader.GetLine();

                    // 名称
                    var ret = Strings.InStr(line_buf, ",");
                    if (ret == 0)
                    {
                        throw reader.InvalidDataException("画像ファイル名が抜けています。", line_buf);
                    }

                    var data_name = Strings.Trim(Strings.Left(line_buf, ret - 1));
                    td.Name = data_name;
                    var buf = Strings.Mid(line_buf, ret + 1);

                    // 画像ファイル名
                    td.Bitmap = Strings.Trim(buf);
                    if (Strings.Len(td.Bitmap) == 0)
                    {
                        throw reader.InvalidDataException("画像ファイル名が指定されていません。", data_name);
                    }

                    // 地形タイプ, 移動コスト, 命中修正, ダメージ修正
                    line_buf = reader.GetLine();

                    // 地形タイプ
                    ret = Strings.InStr(line_buf, ",");
                    if (ret == 0)
                    {
                        throw reader.InvalidDataException("移動コストが抜けています。", data_name);
                    }

                    var buf2 = Strings.Trim(Strings.Left(line_buf, ret - 1));
                    buf      = Strings.Mid(line_buf, ret + 1);
                    td.Class = buf2;

                    // 移動コスト
                    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 (buf2 == "-")
                    {
                        td.MoveCost = 1000;
                    }
                    else if (Information.IsNumeric(buf2))
                    {
                        // 0.5刻みの移動コストを使えるようにするため、実際の2倍の値で記録する
                        td.MoveCost = (int)(2d * Conversions.ToDouble(buf2));
                    }

                    if (td.MoveCost <= 0)
                    {
                        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);
                    if (Information.IsNumeric(buf2))
                    {
                        td.HitMod = Conversions.ToInteger(buf2);
                    }
                    else
                    {
                        SRC.AddDataError(reader.InvalidData("命中修正の設定が間違っています。", data_name));
                    }

                    // ダメージ修正
                    ret = Strings.InStr(buf, ",");
                    if (ret > 0)
                    {
                        throw reader.InvalidDataException("余分な「,」が指定されています。", data_name);
                    }

                    buf2 = Strings.Trim(buf);
                    if (Information.IsNumeric(buf2))
                    {
                        td.DamageMod = Conversions.ToInteger(buf2);
                    }
                    else
                    {
                        SRC.AddDataError(reader.InvalidData("ダメージ修正の設定が間違っています。", data_name));
                    }

                    // 地形効果
                    line_buf = reader.GetLine();
                    while (Strings.Len(line_buf) > 0)
                    {
                        buf = line_buf;
                        var i = 0;
                        while (Strings.Len(buf) > 0)
                        {
                            i        = (i + 1);
                            ret      = 0;
                            in_quote = false;
                            var loopTo = Strings.Len(buf);
                            for (var j = 1; j <= loopTo; j++)
                            {
                                switch (Strings.Mid(buf, j, 1) ?? "")
                                {
                                case ",":
                                {
                                    if (!in_quote)
                                    {
                                        ret = j;
                                        break;
                                    }

                                    break;
                                }

                                case "\"":
                                {
                                    in_quote = !in_quote;
                                    break;
                                }
                                }
                            }

                            if (ret > 0)
                            {
                                buf2 = Strings.Trim(Strings.Left(buf, ret - 1));
                                buf  = Strings.Trim(Strings.Mid(buf, ret + 1));
                            }
                            else
                            {
                                buf2 = buf;
                                buf  = "";
                            }

                            if (!string.IsNullOrEmpty(buf2))
                            {
                                td.AddFeature(buf2);
                            }
                            else
                            {
                                SRC.AddDataError(reader.InvalidData("行頭から" + SrcFormatter.Format((object)i) + "番目の地形効果の設定が間違っています。", data_name));
                            }
                        }
                        if (reader.HasMore)
                        {
                            line_buf = reader.GetLine();
                        }
                        else
                        {
                            break;
                        }
                    }
                    TerrainList[data_id] = td;
                }
            }
        }
Exemplo n.º 30
0
        // 指定したレベルでの特殊能力Nameの名称
        public string SkillName(int lv, string sname)
        {
            string SkillNameRet = default;
            int    lv2;

            SkillNameRet = sname;
            lv2          = 0;
            foreach (SkillData sd in colSkill)
            {
                if ((sname ?? "") == (sd.Name ?? ""))
                {
                    if (sd.NecessaryLevel > lv)
                    {
                        break;
                    }

                    if (sd.NecessaryLevel > lv2)
                    {
                        lv2 = sd.NecessaryLevel;
                        if (Strings.Len(sd.StrData) > 0)
                        {
                            SkillNameRet = GeneralLib.LIndex(sd.StrData, 1);
                            switch (SkillNameRet ?? "")
                            {
                            case "非表示":
                            {
                                return(SkillNameRet);
                            }

                            case "解説":
                            {
                                SkillNameRet = "非表示";
                                return(SkillNameRet);
                            }
                            }

                            if (sname == "階級")
                            {
                                goto NextLoop;
                            }
                        }
                        else
                        {
                            SkillNameRet = sname;
                        }

                        if (sname != "同調率" && sname != "霊力")
                        {
                            if (sd.Level != Constants.DEFAULT_LEVEL && Strings.InStr(SkillNameRet, "Lv") == 0)
                            {
                                SkillNameRet = SkillNameRet + "Lv" + SrcFormatter.Format(sd.Level);
                            }
                        }
                    }
                }

NextLoop:
                ;
            }

            // レベル非表示用の括弧を削除
            if (Strings.Left(SkillNameRet, 1) == "(")
            {
                SkillNameRet = Strings.Mid(SkillNameRet, 2, Strings.Len(SkillNameRet) - 2);
            }

            return(SkillNameRet);
        }