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); }
// スペシャルパワーコマンドを開始 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 = "ユニット選択"; }
// 「アビリティ一覧」コマンド 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); } } } } } }
// 「換装」コマンド 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(); }
// スペシャルパワー検索コマンド 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; } } }
// ユニット一覧の表示 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(); }
// 「発進」コマンドを開始 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 = "ターゲット選択"; } }