예제 #1
0
        protected override ValueType InvokeInternal(SRC SRC, ValueType etype, string[] @params, int pcount, bool[] is_term, out string str_result, out double num_result)
        {
            num_result = 0d;

            var buf = SRC.Expression.GetValueAsString(@params[1], is_term[1]);
            var i   = SRC.Expression.GetValueAsLong(@params[2], is_term[2]);

            str_result = GeneralLib.RightPaddedString(buf, i);
            return(ValueType.StringType);
        }
예제 #2
0
파일: Command.unitsp.cs 프로젝트: 7474/SRC
        // スペシャルパワーコマンドを開始
        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 = "ユニット選択";
        }
예제 #3
0
파일: Command.preview.cs 프로젝트: 7474/SRC
        // 「アビリティ一覧」コマンド
        private void AbilityListCommand()
        {
            LogDebug();

            GUI.LockGUI();
            while (true)
            {
                var currentAbility = GUI.AbilityListBox(SelectedUnit, new UnitAbilityList(AbilityListMode.List, SelectedUnit), Expression.Term("アビリティ", SelectedUnit) + "一覧", "一覧");
                if (currentAbility == null)
                {
                    SelectedAbility = 0;
                    // キャンセル
                    if (SRC.AutoMoveCursor)
                    {
                        GUI.RestoreCursorPos();
                    }

                    GUI.CloseListBox();
                    GUI.UnlockGUI();
                    CommandState = "ユニット選択";
                    return;
                }

                SelectedAbility = currentAbility.AbilityNo();
                // 指定されたアビリティの属性一覧を作成
                {
                    var list   = new List <string>();
                    var i      = 0;
                    var u      = SelectedUnit;
                    var aclass = currentAbility.Data.Class;
                    while (i <= Strings.Len(aclass))
                    {
                        i = (i + 1);
                        var buf    = GeneralLib.GetClassBundle(aclass, ref i);
                        var atype  = "";
                        var alevel = "";

                        // 非表示?
                        if (buf == "|")
                        {
                            break;
                        }

                        // M属性
                        if (Strings.Mid(aclass, i, 1) == "M")
                        {
                            i   = (i + 1);
                            buf = buf + Strings.Mid(aclass, i, 1);
                        }

                        // レベル指定
                        if (Strings.Mid(aclass, i + 1, 1) == "L")
                        {
                            i = (i + 2);
                            var c = Strings.Mid(aclass, i, 1);
                            while (Information.IsNumeric(c) || c == "." || c == "-")
                            {
                                alevel = alevel + c;
                                i      = (i + 1);
                                c      = Strings.Mid(aclass, i, 1);
                            }

                            i = (i - 1);
                        }

                        // 属性の名称
                        atype = Help.AttributeName(SelectedUnit, buf);
                        if (Strings.Len(atype) > 0)
                        {
                            if (Strings.Len(alevel) > 0)
                            {
                                list.Add(GeneralLib.RightPaddedString(buf + "L" + alevel, 8) + atype + "レベル" + alevel);
                            }
                            else
                            {
                                list.Add(GeneralLib.RightPaddedString(buf, 8) + atype);
                            }
                        }
                    }

                    if (!Map.IsStatusView)
                    {
                        list.Add("射程範囲");
                    }

                    if (list.Count > 0)
                    {
                        GUI.TopItem = 1;
                        while (true)
                        {
                            if (list.Count == 1 && list[0] == "射程範囲")
                            {
                                i = 1;
                            }
                            else
                            {
                                i = GUI.ListBox(new ListBoxArgs
                                {
                                    lb_caption = "アビリティ属性一覧",
                                    Items      = list.Select(x => new ListBoxItem(x)).ToList(),
                                    lb_info    = "属性    効果",
                                    lb_mode    = "連続表示",
                                });
                            }

                            if (i == 0)
                            {
                                // キャンセル
                                break;
                            }
                            else if (list[i - 1] == "射程範囲")
                            {
                                GUI.CloseListBox();

                                // 武器の射程を求めておく
                                var min_range = currentAbility.AbilityMinRange();
                                var max_range = currentAbility.AbilityMaxRange();
                                // 射程範囲表示
                                if ((max_range == 1 || currentAbility.IsAbilityClassifiedAs("P")) && !currentAbility.IsAbilityClassifiedAs("Q"))
                                {
                                    Map.AreaInReachable(SelectedUnit, max_range, u.Party + "の敵");
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M直"))
                                {
                                    Map.AreaInCross(u.x, u.y, min_range, max_range);
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M拡"))
                                {
                                    Map.AreaInWideCross(u.x, u.y, min_range, max_range);
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M扇"))
                                {
                                    Map.AreaInSectorCross(u.x, u.y, min_range, max_range, (int)currentAbility.AbilityLevel("M扇"));
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M全") || currentAbility.IsAbilityClassifiedAs("M線"))
                                {
                                    Map.AreaInRange(u.x, u.y, max_range, min_range, "すべて");
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M投"))
                                {
                                    max_range = ((int)(max_range + currentAbility.AbilityLevel("M投")));
                                    min_range = ((int)(min_range - currentAbility.AbilityLevel("M投")));
                                    min_range = GeneralLib.MaxLng(min_range, 1);
                                    Map.AreaInRange(u.x, u.y, max_range, min_range, "すべて");
                                }
                                else if (currentAbility.IsAbilityClassifiedAs("M移"))
                                {
                                    Map.AreaInMoveAction(SelectedUnit, max_range);
                                }
                                else
                                {
                                    Map.AreaInRange(u.x, u.y, max_range, min_range, u.Party + "の敵");
                                }

                                GUI.Center(u.x, u.y);
                                GUI.MaskScreen();

                                // 先行入力されていたクリックイベントを解消
                                GUI.DoEvents();
                                WaitClickMode     = true;
                                GUI.IsFormClicked = false;

                                // クリックされるまで待つ
                                while (!GUI.IsFormClicked)
                                {
                                    GUI.Sleep(25);
                                    if (GUI.IsRButtonPressed(true))
                                    {
                                        break;
                                    }
                                }

                                GUI.RedrawScreen();
                                if (list.Count == 1)
                                {
                                    break;
                                }
                            }
                            else
                            {
                                // 指定された属性の解説を表示
                                GUI.CloseListBox();
                                Help.AttributeHelp(SelectedUnit, GeneralLib.LIndex(list[i - 1], 1), currentAbility.AbilityNo(), true);
                            }
                        }
                    }
                }
            }
        }
예제 #4
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();
        }
예제 #5
0
        // スペシャルパワー検索コマンド
        private void SearchSpecialPowerCommand()
        {
            GUI.LockGUI();

            // イベント専用のコマンドを除いた全スペシャルパワーのリストを作成
            var allSpList = SRC.SPDList.Items
                            .Where(x => x.ShortName != "非表示")
                            .OrderBy(x => x.KanaName)
                            .ToList();

            // 個々のスペシャルパワーに対して、そのスペシャルパワーを使用可能なパイロットが
            // いるかどうか判定
            var pilotMap = allSpList.Select(x => new
            {
                spName = x.Name,
                pilots = SRC.PList.Items
                         .Where(p => p.Party == "味方" &&
                                p.Unit != null &&
                                p.Unit.Status == "出撃" &&
                                !p.Unit.IsConditionSatisfied("憑依") &&
                                p.IsSpecialPowerAvailable(x.Name)
                                // 本当に乗っている?
                                && p.Unit.AllPilots.Any(up => up == p))
                         .ToList(),
            }).ToDictionary(x => x.spName, x => x.pilots);

            while (true)
            {
                var list = allSpList.Select(x => new ListBoxItem(x.Name, x.Name)
                {
                    // 選択出来ないスペシャルパワーをマスク
                    ListItemFlag = !pilotMap[x.Name].Any(),
                    // スペシャルパワーの解説を設定
                    ListItemComment = x.Comment,
                }).ToList();
                var listArgs = new ListBoxArgs
                {
                    lb_caption = Expression.Term("スペシャルパワー") + "検索",
                    Items      = list,
                    HasFlag    = true,
                };
                // 検索するスペシャルパワーを選択
                GUI.TopItem = 1;
                var ret = GUI.MultiColumnListBox(listArgs, true);
                if (ret == 0)
                {
                    CancelCommand();
                    GUI.UnlockGUI();
                    return;
                }

                var sel = list[ret - 1].ListItemID;
                SelectedSpecialPower = sel;

                // 選択されたスペシャルパワーを使用できるパイロットの一覧を作成
                var pilots = pilotMap.ContainsKey(sel) ? pilotMap[sel] : new List <Pilot>();
                var list2  = pilots.Select(p =>
                {
                    var msg = GeneralLib.RightPaddedString(p.get_Nickname(false), 19)
                              + GeneralLib.RightPaddedString(SrcFormatter.Format(p.SP) + "/" + SrcFormatter.Format(p.MaxSP), 10);

                    msg += GeneralLib.RightPaddedString(string.Join("", p.SpecialPowerNames
                                                                    .Where(x => p.IsSpecialPowerAvailable(x))
                                                                    .Select(x => SRC.SPDList.Item(x).ShortName)), 12);

                    if (p.SP < p.SpecialPowerCost(SelectedSpecialPower))
                    {
                        msg += " " + Expression.Term("SP", p.Unit) + "不足";
                    }

                    if (p.Unit.Action == 0)
                    {
                        msg += " 行動済";
                    }
                    return(new ListBoxItem(msg, p.ID)
                    {
                        // XXX ここはフラグ立たない?
                    });
                }).ToList();

                SelectedSpecialPower = "";

                // 検索をかけるパイロットの選択
                GUI.TopItem = 1;
                GUI.EnlargeListBoxHeight();
                string caption2;
                string info2;
                if (Expression.IsOptionDefined("等身大基準"))
                {
                    caption2 = "ユニット選択";
                    info2    = "ユニット           " + Expression.Term("SP", null, 2) + "/Max" + Expression.Term("SP", null, 2) + "  " + Expression.Term("スペシャルパワー");
                }
                else
                {
                    caption2 = "パイロット選択";
                    info2    = "パイロット         " + Expression.Term("SP", null, 2) + "/Max" + Expression.Term("SP", null, 2) + "  " + Expression.Term("スペシャルパワー");
                }
                var ret2 = GUI.ListBox(new ListBoxArgs
                {
                    lb_caption = caption2,
                    lb_info    = info2,
                    Items      = list2,
                });

                GUI.ReduceListBoxHeight();

                // パイロットの乗るユニットを画面中央に表示
                if (ret2 > 0)
                {
                    var p = SRC.PList.Item(list2[ret2 - 1].ListItemID);
                    GUI.Center(p.Unit.x, p.Unit.y);
                    GUI.RefreshScreen();
                    Status.DisplayUnitStatus(p.Unit);

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

                    GUI.UnlockGUI();
                    return;
                }
            }
        }
예제 #6
0
        // ユニット一覧の表示
        private void UnitListCommand()
        {
            GUI.LockGUI();
            GUI.TopItem = 1;
            GUI.EnlargeListBoxHeight();
            GUI.ReduceListBoxWidth();

            // デフォルトのソート方法
            var uparty            = "味方";
            var sort_mode         = "レベル";
            var pilot_status_mode = false;

Beginning:
            ;

            // ユニット一覧のリストを作成
            var list = new List <ListBoxItem>();

            list.Add(new ListBoxItem("▽陣営変更・並べ替え▽", "▽陣営変更・並べ替え▽"));
            var units = SRC.UList.Items
                        .Where(u => u.Party0 == uparty && (u.Status == "出撃" || u.Status == "格納"))
                        .Where(u => !(Expression.IsOptionDefined("ユニット情報隠蔽") &&
                                      !u.IsConditionSatisfied("識別済み") &&
                                      (u.Party0 == "敵" || u.Party0 == "中立") ||
                                      u.IsConditionSatisfied("ユニット情報隠蔽")))
                        .Select(u =>
            {
                var msg = "";
                if (!u.IsFeatureAvailable("ダミーユニット"))
                {
                    // 通常のユニット表示
                    if (Expression.IsOptionDefined("等身大基準"))
                    {
                        // 等身大基準を使った場合のユニット表示
                        msg = GeneralLib.RightPaddedString(u.Nickname0, 33)
                              + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MainPilot().Level), 3)
                              + " ";
                    }
                    else
                    {
                        msg = GeneralLib.RightPaddedString(u.Nickname0, 23);
                        if (u.MainPilot().Nickname0 == "パイロット不在")
                        {
                            // パイロットが乗っていない場合
                            msg = GeneralLib.RightPaddedString(msg + "", 34) + GeneralLib.LeftPaddedString("", 2);
                        }
                        else
                        {
                            msg = GeneralLib.RightPaddedString(msg + u.MainPilot().get_Nickname(false), 34)
                                  + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MainPilot().Level), 2);
                        }

                        msg = GeneralLib.RightPaddedString(msg, 37);
                    }

                    if (u.IsConditionSatisfied("データ不明"))
                    {
                        msg = msg + "?????/????? ???/???";
                    }
                    else
                    {
                        msg = msg + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.HP), 5) + "/"
                              + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MaxHP), 5) + " "
                              + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.EN), 3) + "/"
                              + GeneralLib.LeftPaddedString(SrcFormatter.Format(u.MaxEN), 3);
                    }
                }
                else
                {
                    // パイロットステータス表示時
                    pilot_status_mode = true;
                    {
                        var p = u.MainPilot();
                        msg   = GeneralLib.RightPaddedString(p.get_Nickname(false), 21)
                                + GeneralLib.LeftPaddedString(SrcFormatter.Format(p.Level), 3)
                                + GeneralLib.LeftPaddedString(SrcFormatter.Format(p.SP) + "/" + SrcFormatter.Format(p.MaxSP), 9);
                        // 使用可能なスペシャルパワー一覧
                        msg += string.Join("", p.SpecialPowerNames
                                           .Where(x => p.SP > p.SpecialPowerCost(x))
                                           .Select(x => SRC.SPDList.Item(x).ShortName));
                    }
                }

                if (u.Action == 0)
                {
                    msg = msg + "済";
                }

                if (u.Status == "格納")
                {
                    msg = msg + "格";
                }

                return(new ListBoxItem(msg, u.ID));
            })
                        .ToList();

SortList:
            ;

            // ソート
            if (Strings.InStr(sort_mode, "名称") == 0)
            {
                // 数値を使ったソート
                units = units.OrderByDescending(x =>
                {
                    var u = SRC.UList.Item(x.ListItemID);
                    switch (sort_mode)
                    {
                    case "HP": return(u.MaxHP);

                    case "EN": return(u.MaxEN);

                    case "レベル":
                    case "パイロットレベル": return(u.MainPilot()?.TotalExp ?? 0);

                    default: return(0);
                    }
                }).ToList();
            }
            else
            {
                // 数値以外を使ったソート
                units = units.OrderBy(x =>
                {
                    var u = SRC.UList.Item(x.ListItemID);
                    switch (sort_mode)
                    {
                    case "名称":
                    case "ユニット名称":
                        return(u.KanaName);

                    case "パイロット名称":
                        return(u.MainPilot()?.KanaName ?? "");

                    default: return("");
                    }
                }).ToList();
            }

            // リストを表示
            string caption;
            string info;

            if (pilot_status_mode)
            {
                caption = uparty + "パイロット一覧";
                info    = "パイロット名       レベル    " + Expression.Term("SP", null, 4) + "  " + Expression.Term("スペシャルパワー");
            }
            else if (Expression.IsOptionDefined("等身大基準"))
            {
                caption = uparty + "ユニット一覧";
                info    = "ユニット名                        Lv     " + Expression.Term("HP", null, 8) + Expression.Term("EN");;
            }
            else
            {
                caption = uparty + "ユニット一覧";
                info    = "ユニット               パイロット Lv     " + Expression.Term("HP", null, 8) + Expression.Term("EN");;
            }
            var ret = GUI.ListBox(new ListBoxArgs
            {
                HasFlag    = true,
                Items      = list.AppendRange(units).ToList(),
                lb_caption = caption,
                lb_info    = info,
                lb_mode    = "連続表示",
            });

            switch (ret)
            {
            case 0:
            {
                // キャンセル
                GUI.CloseListBox();
                GUI.ReduceListBoxHeight();
                GUI.EnlargeListBoxWidth();
                GUI.UnlockGUI();
                return;
            }

            case 1:
            {
                // 表示する陣営
                IList <ListBoxItem> sortItems = new List <ListBoxItem>
                {
                    new ListBoxItem("味方一覧", "味方一覧"),
                    new ListBoxItem("NPC一覧", "NPC一覧"),
                    new ListBoxItem("敵一覧", "敵一覧"),
                    new ListBoxItem("中立一覧", "中立一覧"),
                };
                if (pilot_status_mode)
                {
                    sortItems = sortItems.AppendRange(new ListBoxItem[] {
                            new ListBoxItem("パイロット名称で並べ替え", "パイロット名称で並べ替え"),
                            new ListBoxItem("レベルで並べ替え", "レベルで並べ替え"),
                            new ListBoxItem(Expression.Term("SP") + "で並べ替え", "SPで並べ替え"),
                        }).ToList();
                }
                else if (Expression.IsOptionDefined("等身大基準"))
                {
                    sortItems = sortItems.AppendRange(new ListBoxItem[] {
                            new ListBoxItem("名称で並べ替え", "名称で並べ替え"),
                            new ListBoxItem("レベルで並べ替え", "レベルで並べ替え"),
                            new ListBoxItem(Expression.Term("HP") + "で並べ替え", "HPで並べ替え"),
                            new ListBoxItem(Expression.Term("スペシャルパワー") + "で並べ替え", "スペシャルパワーで並べ替え"),
                        }).ToList();
                }
                else
                {
                    sortItems = sortItems.AppendRange(new ListBoxItem[] {
                            new ListBoxItem(Expression.Term("HP") + "で並べ替え", "HPで並べ替え"),
                            new ListBoxItem(Expression.Term("EN") + "で並べ替え", "ENで並べ替え"),
                            new ListBoxItem(Expression.Term("パイロットレベルで並べ替え"), "パイロットレベルで並べ替え"),
                            new ListBoxItem(Expression.Term("ユニット名称で並べ替え"), "ユニット名称で並べ替え"),
                            new ListBoxItem(Expression.Term("ユニット名称で並べ替え"), "ユニット名称で並べ替え"),
                        }).ToList();
                }
                var sortRes = GUI.ListBox(new ListBoxArgs
                    {
                        HasFlag    = false,
                        Items      = sortItems,
                        lb_caption = "選択",
                        lb_info    = "一覧表示方法",
                        lb_mode    = "連続表示",
                    });

                // 陣営を変更して再表示
                if (sortRes > 0)
                {
                    var sel = sortItems[sortRes - 1].ListItemID;
                    if (Strings.Right(sel, 2) == "一覧")
                    {
                        uparty = Strings.Left(sel, Strings.Len(sel) - 2);
                        goto Beginning;
                    }
                    else if (Strings.Right(sel, 5) == "で並べ替え")
                    {
                        sort_mode = Strings.Left(sel, Strings.Len(sel) - 5);
                        goto SortList;
                    }
                }

                goto SortList;
            }
            }

            GUI.CloseListBox();
            GUI.ReduceListBoxHeight();
            GUI.EnlargeListBoxWidth();

            // 選択されたユニットを画面中央に表示
            var uid = units[ret - 2].ListItemID;
            var u   = SRC.UList.Item(uid);

            GUI.Center(u.x, u.y);
            GUI.RefreshScreen();
            Status.DisplayUnitStatus(u);

            // カーソル自動移動
            if (SRC.AutoMoveCursor)
            {
                GUI.MoveCursorPos("ユニット選択", u);
            }
            GUI.UnlockGUI();
        }
예제 #7
0
        // 「発進」コマンドを開始
        private void StartLaunchCommand()
        {
            // 母艦に搭載しているユニットの一覧を作成
            var list = SelectedUnit.UnitOnBoards.Select(onBoardUnit =>
            {
                return(new ListBoxItem
                {
                    Text = GeneralLib.RightPaddedString(onBoardUnit.Nickname0, 25)
                           + GeneralLib.RightPaddedString(onBoardUnit.MainPilot().get_Nickname(false), 17)
                           + GeneralLib.LeftPaddedString(SrcFormatter.Format(onBoardUnit.MainPilot().Level), 2)
                           + GeneralLib.RightPaddedString(SrcFormatter.Format(onBoardUnit.HP) + "/" + SrcFormatter.Format(onBoardUnit.MaxHP), 12)
                           + " " + GeneralLib.RightPaddedString(SrcFormatter.Format(onBoardUnit.EN) + "/" + SrcFormatter.Format(onBoardUnit.MaxEN), 8),
                    ListItemID = onBoardUnit.ID,
                    ListItemFlag = onBoardUnit.Action <= 0,
                });
            }).ToList();

            // どのユニットを発進させるか選択
            GUI.TopItem = 1;
            var ret = GUI.ListBox(new ListBoxArgs
            {
                HasFlag    = true,
                Items      = list,
                lb_caption = "ユニット選択",
                lb_info    = "ユニット名               パイロット       Lv "
                             + Expression.Term("HP", null, 8)
                             + Expression.Term("EN", null),
                lb_mode = "カーソル移動",
            });

            // キャンセルされた?
            if (ret == 0)
            {
                CancelCommand();
                return;
            }

            SelectedCommand = "発進";

            // ユニットの発進処理
            // XXX 発進後の合体がなんか変だった(バウ(MA))
            SelectedTarget = SRC.UList.Item(list[ret - 1].ListItemID);
            {
                var launchUnit = SelectedTarget;
                launchUnit.x = SelectedUnit.x;
                launchUnit.y = SelectedUnit.y;
                if (launchUnit.IsFeatureAvailable("テレポート") &&
                    (launchUnit.Data.Speed == 0 ||
                     GeneralLib.LIndex(launchUnit.FeatureData("テレポート"), 2) == "0"))
                {
                    // テレポートによる発進
                    Map.AreaInTeleport(SelectedTarget);
                }
                else if (launchUnit.IsFeatureAvailable("ジャンプ") &&
                         (launchUnit.Data.Speed == 0 ||
                          GeneralLib.LLength(launchUnit.FeatureData("ジャンプ")) < 2 ||
                          GeneralLib.LIndex(launchUnit.FeatureData("ジャンプ"), 2) == "0"))
                {
                    // ジャンプによる発進
                    Map.AreaInSpeed(SelectedTarget, true);
                }
                else
                {
                    // 通常移動による発進
                    Map.AreaInSpeed(SelectedTarget);
                }

                // 母艦を中央表示
                GUI.Center(launchUnit.x, launchUnit.y);

                // TODO 発進させるユニットを母艦の代わりに表示
                //// 発進させるユニットを母艦の代わりに表示
                //if (launchUnit.BitmapID == 0)
                //{
                //    var withBlock3 = SRC.UList.Item(launchUnit.Name);
                //    if ((SelectedTarget.Party0 ?? "") == (withBlock3.Party0 ?? "") && withBlock3.BitmapID != 0 && (SelectedTarget.get_Bitmap(false) ?? "") == (withBlock3.get_Bitmap(false) ?? ""))
                //    {
                //        SelectedTarget.BitmapID = withBlock3.BitmapID;
                //    }
                //    else
                //    {
                //        SelectedTarget.BitmapID = GUI.MakeUnitBitmap(SelectedTarget);
                //    }
                //}

                GUI.MaskScreen();
            }

            if (CommandState == "コマンド選択")
            {
                CommandState = "ターゲット選択";
            }
        }