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; }
// 「命令」コマンドを終了 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 = "ユニット選択"; }
// 特殊能力を追加 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)); } }
// 「ターン終了」コマンド 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; }
// 新規ユニットIDを作成 public string CreateID(string uname) { do { IDCount = IDCount + 1; } while (IsDefined(uname + ":" + SrcFormatter.Format(IDCount))); return(uname + ":" + SrcFormatter.Format(IDCount)); }
// 地形効果を追加 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); } }
// ラベルを追加 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); } } } }
// 新しいアイテム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); }
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); } }
// 特殊能力を登録 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: ; } }
// 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(); } }
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); }
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); } }
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); }
// インターミッションコマンド「ユニットリスト」におけるユニットリストを作成する 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); }
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); }
// 特殊能力の名称 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); }
private void hscMP3Volume_Scroll(int newScrollValue) { Sound.Player.SoundVolume = newScrollValue / 100f; txtMP3Volume.Text = SrcFormatter.Format(newScrollValue); }
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); }
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); }
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)); }
// スペシャルパワー自爆による自爆 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: ; } } }
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); }
// 陣営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(); }
// 「換装」コマンド 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(); }
// アビリティに効果を追加 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)); } } }
// スペシャルパワーコマンドを開始 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 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)); } }
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; } } }
// 指定したレベルでの特殊能力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); }