// 特殊能力を追加 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 int SpecialPowerCostInternal(string sname) { // 基本消費SP値 var SpecialPowerCostRet = Data.SpecialPowerCost(sname); // 特殊能力による消費SP値修正 if (IsSkillAvailable("超能力") || IsSkillAvailable("集中力")) { SpecialPowerCostRet = (int)(0.8d * SpecialPowerCostRet); } if (IsSkillAvailable("知覚強化")) { SpecialPowerCostRet = (int)(1.2d * SpecialPowerCostRet); } // SP消費減少能力 if (Unit is object) { if (Unit.CountPilot() > 0) { if (ReferenceEquals(Unit.MainPilot(), this)) { if (Unit.IsConditionSatisfied("SP消費減少付加") || Unit.IsConditionSatisfied("SP消費減少付加2")) { var adata = SkillData("SP消費減少"); var loopTo = GeneralLib.LLength(adata); for (var i = 2; i <= loopTo; i++) { if ((sname ?? "") == (GeneralLib.LIndex(adata, i) ?? "")) { return((int)((10d - SkillLevel("SP消費減少", "")) * SpecialPowerCostRet / 10L)); } } } } } } foreach (var skill in colSkill.List.Where(x => x.Name == "SP消費減少")) { var adata = skill.StrData; var loopTo2 = GeneralLib.LLength(adata); for (var j = 2; j <= loopTo2; j++) { if ((sname ?? "") == (GeneralLib.LIndex(adata, j) ?? "")) { return((int)((10d - skill.LevelOrDefault(1d)) * SpecialPowerCostRet / 10L)); } } } return(SpecialPowerCostRet); }
// 「補給」コマンドを終了 private void FinishSupplyCommand() { GUI.LockGUI(); GUI.OpenMessageForm(SelectedTarget, SelectedUnit); var currentUnit = SelectedUnit; // 選択内容を変更 Event.SelectedUnitForEvent = SelectedUnit; Event.SelectedTargetForEvent = SelectedTarget; // 補給メッセージ&特殊効果 if (currentUnit.IsMessageDefined("補給")) { currentUnit.PilotMessage("補給", msg_mode: ""); } if (currentUnit.IsAnimationDefined("補給", currentUnit.FeatureName("補給装置"))) { currentUnit.PlayAnimation("補給", currentUnit.FeatureName("補給装置")); } else { currentUnit.SpecialEffect("補給", currentUnit.FeatureName("補給装置")); } GUI.DisplaySysMessage(currentUnit.Nickname + "は" + SelectedTarget.Nickname + "に" + currentUnit.FeatureName("補給装置") + "を使った。"); // 補給を実施 SelectedTarget.FullSupply(); SelectedTarget.IncreaseMorale(-10); if (Information.IsNumeric(GeneralLib.LIndex(currentUnit.FeatureData("補給装置"), 2))) { currentUnit.EN = currentUnit.EN - Conversions.ToInteger(GeneralLib.LIndex(currentUnit.FeatureData("補給装置"), 2)); } GUI.UpdateMessageForm(SelectedTarget, SelectedUnit); GUI.DisplaySysMessage(SelectedTarget.Nickname + "の弾数と" + Expression.Term("EN", SelectedTarget) + "が全快した。"); // 経験値を獲得 currentUnit.GetExp(SelectedTarget, "補給", exp_mode: ""); if (GUI.MessageWait < 10000) { GUI.Sleep(GUI.MessageWait); } // 形態変化のチェック SelectedTarget.Update(); SelectedTarget.CurrentForm().CheckAutoHyperMode(); SelectedTarget.CurrentForm().CheckAutoNormalMode(); GUI.CloseMessageForm(); // 行動終了 WaitCommand(); }
// 使い捨てアイテムによる武器かどうかを返す public bool IsItem() { bool IsItemRet = default; var loopTo = GeneralLib.LLength(NecessarySkill); for (int i = 1; i <= loopTo; i++) { if (GeneralLib.LIndex(NecessarySkill, i) == "アイテム") { IsItemRet = true; return(IsItemRet); } } return(IsItemRet); }
// 能力の置き換え名を取得する public string ReplaceTypeName(string aname) { AliasDataType alias = this; var aliasElem = alias.Elements.FirstOrDefault(x => GeneralLib.LIndex(x.strAliasData, 1) == aname); if (aliasElem != null) { aname = aliasElem.strAliasType; } else { aname = alias.Elements.First().strAliasType; } return(aname); }
// 特殊能力を登録 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: ; } }
protected override int ExecInternal() { Unit u; switch (ArgNum) { case 1: { u = Event.SelectedUnitForEvent; break; } case 2: { u = GetArgAsUnit(2); break; } default: throw new EventErrorException(this, "Splitコマンドの引数の数が違います"); } if (!u.IsFeatureAvailable("分離")) { throw new EventErrorException(this, u.Name + "は分離できません"); } u.Split(); // 分離形態の1番目のユニットをメインユニットに設定 var su = SRC.UList.Item(GeneralLib.LIndex(u.FeatureData("分離"), 2)); // 変数のアップデート // XXX 元はSavedStateは更新していなかったけれど更新してる UpdateSelectedState(u, su); return(EventData.NextID); }
// 指定したレベルでの特殊能力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); }
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 static string LoadWepon(string data_name, IUnitDataElements ud, SrcDataReader reader, SRC SRC) { int ret; string buf; string buf2; string line_buf = reader.GetLine(); // アビリティとの区切り文字かアイテムの解説行で終了 while (Strings.Len(line_buf) > 0 && line_buf != "===" && !line_buf.StartsWith("*")) { // 武器名 ret = Strings.InStr(line_buf, ","); if (ret == 0) { throw reader.InvalidDataException(@"武器データの終りには空行を置いてください。", data_name); } string wname = Strings.Trim(Strings.Left(line_buf, ret - 1)); buf = Strings.Mid(line_buf, ret + 1); if (string.IsNullOrEmpty(wname)) { throw reader.InvalidDataException(@"武器名の設定が間違っています。", data_name); } // 武器を登録 WeaponData wd = ud.AddWeapon(wname); // 攻撃力 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の最小射程が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { wd.Power = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99999); } else if (buf == "-") { wd.Power = 0; } else { SRC.AddDataError(reader.InvalidData(@wname + "の攻撃力の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.Power = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 最小射程 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の最大射程の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { wd.MinRange = Conversions.ToInteger(buf2); } else { SRC.AddDataError(reader.InvalidData(@wname + "の最小射程の設定が間違っています。", data_name)); wd.MinRange = 1; if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.MinRange = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 最大射程 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の命中率の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { wd.MaxRange = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99); } else { SRC.AddDataError(reader.InvalidData(@wname + "の最大射程の設定が間違っています。", data_name)); wd.MaxRange = 1; if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.MaxRange = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 命中率 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の弾数の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { int n = Conversions.ToInteger(buf2); if (n > 999) { n = 999; } else if (n < -999) { n = -999; } wd.Precision = n; } else { SRC.AddDataError(reader.InvalidData(@wname + "の命中率の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.Precision = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 弾数 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の消費ENの設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { wd.Bullet = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99); } else { SRC.AddDataError(reader.InvalidData(@wname + "の弾数の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.Bullet = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // 消費EN ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の必要気力が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { wd.ENConsumption = GeneralLib.MinLng(Conversions.ToInteger(buf2), 999); } else { SRC.AddDataError(reader.InvalidData(@wname + "の消費ENの設定が間違っています。", data_name)); { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.ENConsumption = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // 必要気力 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の地形適応が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { int n = Conversions.ToInteger(buf2); if (n > 1000) { n = 1000; } else if (n < 0) { n = 0; } wd.NecessaryMorale = n; } else { SRC.AddDataError(reader.InvalidData(@wname + "の必要気力の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.NecessaryMorale = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // 地形適応 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "のクリティカル率が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Strings.Len(buf2) == 4) { wd.Adaption = buf2; } else { SRC.AddDataError(reader.InvalidData(@wname + "の地形適応の設定が間違っています。", data_name)); wd.Adaption = "----"; if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.Adaption = GeneralLib.LIndex(buf2, 1); } } // クリティカル率 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@wname + "の武器属性が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { int n = Conversions.ToInteger(buf2); if (n > 999) { n = 999; } else if (n < -999) { n = -999; } wd.Critical = n; } else { SRC.AddDataError(reader.InvalidData(@wname + "のクリティカル率の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; wd.Critical = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 武器属性 buf = Strings.Trim(buf); if (Strings.Len(buf) == 0) { SRC.AddDataError(reader.InvalidData(@wname + "の武器属性の設定が間違っています。", data_name)); } if (Strings.Right(buf, 1) == ")") { // 必要技能 ret = Strings.InStr(buf, "> "); if (ret > 0) { if (ret > 0) { wd.NecessarySkill = Strings.Mid(buf, ret + 2); buf = Strings.Trim(Strings.Left(buf, ret + 1)); ret = Strings.InStr(wd.NecessarySkill, "("); wd.NecessarySkill = Strings.Mid(wd.NecessarySkill, ret + 1, Strings.Len(wd.NecessarySkill) - ret - 1); } } else { ret = Strings.InStr(buf, "("); if (ret > 0) { wd.NecessarySkill = Strings.Trim(Strings.Mid(buf, ret + 1, Strings.Len(buf) - ret - 1)); buf = Strings.Trim(Strings.Left(buf, ret - 1)); } } } if (Strings.Right(buf, 1) == ">") { // 必要条件 ret = Strings.InStr(buf, "<"); if (ret > 0) { wd.NecessaryCondition = Strings.Trim(Strings.Mid(buf, ret + 1, Strings.Len(buf) - ret - 1)); buf = Strings.Trim(Strings.Left(buf, ret - 1)); } } wd.Class = buf; if (wd.Class == "-") { wd.Class = ""; } if (Strings.InStr(wd.Class, "Lv") > 0) { SRC.AddDataError(reader.InvalidData(@wname + "の属性のレベル指定が間違っています。", data_name)); } if (reader.EOT) { return(""); } line_buf = reader.GetLine(); } return(line_buf); }
public static string LoadAbility(string data_name, IUnitDataElements ud, SrcDataReader reader, SRC SRC) { int ret; string buf; string buf2; string line_buf = reader.GetLine(); // アイテムの解説行で終了 while (Strings.Len(line_buf) > 0 && !line_buf.StartsWith("*")) { // アビリティ名 ret = Strings.InStr(line_buf, ","); if (ret == 0) { throw reader.InvalidDataException(@"アビリティデータの終りに空行を置いてください。", data_name); } string sname = Strings.Trim(Strings.Left(line_buf, ret - 1)); buf = Strings.Mid(line_buf, ret + 1); if (string.IsNullOrEmpty(sname)) { throw reader.InvalidDataException(@"アビリティ名の設定が間違っています。", data_name); } // アビリティを登録 AbilityData sd = ud.AddAbility(sname); // 効果 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@sname + "の射程の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); sd.SetEffect(buf2); // 射程 sd.MinRange = 0; ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@sname + "の回数の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (Information.IsNumeric(buf2)) { sd.MaxRange = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99); } else if (buf2 == "-") { sd.MaxRange = 0; } else { SRC.AddDataError(reader.InvalidData(@sname + "の射程の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; sd.MaxRange = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } // 回数 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@sname + "の消費ENの設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { sd.Stock = GeneralLib.MinLng(Conversions.ToInteger(buf2), 99); } else { SRC.AddDataError(reader.InvalidData(@sname + "の回数の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; sd.Stock = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // 消費EN ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@sname + "の必要気力の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { sd.ENConsumption = GeneralLib.MinLng(Conversions.ToInteger(buf2), 999); } else { SRC.AddDataError(reader.InvalidData(@sname + "の消費ENの設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; sd.ENConsumption = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // 必要気力 ret = Strings.InStr(buf, ","); if (ret == 0) { throw reader.InvalidDataException(@sname + "のアビリティ属性の設定が抜けています。", data_name); } buf2 = Strings.Trim(Strings.Left(buf, ret - 1)); buf = Strings.Mid(buf, ret + 1); if (buf2 != "-") { if (Information.IsNumeric(buf2)) { int n = Conversions.ToInteger(buf2); if (n > 1000) { n = 1000; } else if (n < 0) { n = 0; } sd.NecessaryMorale = n; } else { SRC.AddDataError(reader.InvalidData(@sname + "の必要気力の設定が間違っています。", data_name)); if (GeneralLib.LLength(buf2) > 1) { buf = GeneralLib.LIndex(buf2, 2) + "," + buf; sd.NecessaryMorale = GeneralLib.StrToLng(GeneralLib.LIndex(buf2, 1)); } } } // アビリティ属性 buf = Strings.Trim(buf); if (Strings.Len(buf) == 0) { SRC.AddDataError(reader.InvalidData(@sname + "のアビリティ属性の設定が間違っています。", data_name)); } if (Strings.Right(buf, 1) == ")") { // 必要技能 ret = Strings.InStr(buf, "> "); if (ret > 0) { if (ret > 0) { sd.NecessarySkill = Strings.Mid(buf, ret + 2); buf = Strings.Trim(Strings.Left(buf, ret + 1)); ret = Strings.InStr(sd.NecessarySkill, "("); sd.NecessarySkill = Strings.Mid(sd.NecessarySkill, ret + 1, Strings.Len(sd.NecessarySkill) - ret - 1); } } else { ret = Strings.InStr(buf, "("); if (ret > 0) { sd.NecessarySkill = Strings.Trim(Strings.Mid(buf, ret + 1, Strings.Len(buf) - ret - 1)); buf = Strings.Trim(Strings.Left(buf, ret - 1)); } } } if (Strings.Right(buf, 1) == ">") { // 必要条件 ret = Strings.InStr(buf, "<"); if (ret > 0) { sd.NecessaryCondition = Strings.Trim(Strings.Mid(buf, ret + 1, Strings.Len(buf) - ret - 1)); buf = Strings.Trim(Strings.Left(buf, ret - 1)); } } sd.Class = buf; if (sd.Class == "-") { sd.Class = ""; } if (Strings.InStr(sd.Class, "Lv") > 0) { SRC.AddDataError(reader.InvalidData(@sname + "の属性のレベル指定が間違っています。", data_name)); } line_buf = reader.GetLine(); } return(line_buf); }
protected override int ExecInternal() { 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 sname0 = GetArgAsString(3); // エリアスが定義されている? var sarray = new List <string>(); if (SRC.ALDList.IsDefined(sname0)) { var alias = SRC.ALDList.Item(sname0); sarray = alias.Elements.Select(x => x.strAliasType).ToList(); } else { sarray.Add(sname0); } foreach (var sname in sarray) { var sname2 = ""; var vname = "Ability(" + pname + "," + sname + ")"; if (GeneralLib.LLength(Expression.GetValueAsString(vname)) >= 2) { // 必要技能用変数を削除 sname2 = GeneralLib.LIndex(Expression.GetValueAsString(vname), 2); var vname2 = "Ability(" + pname + "," + sname2 + ")"; Expression.UndefineVariable(vname2); } // レベル設定用変数を削除 Expression.UndefineVariable(vname); // 特殊能力一覧作成用変数を削除 vname = "Ability(" + pname + ")"; if (Expression.IsGlobalVariableDefined(vname)) { var buf = Expression.GetValueAsString(vname); var slist = ""; var loopTo2 = GeneralLib.LLength(buf); for (var j = 1; j <= loopTo2; j++) { if ((GeneralLib.LIndex(buf, j) ?? "") != (sname ?? "") && (GeneralLib.LIndex(buf, j) ?? "") != (sname2 ?? "")) { slist = slist + " " + GeneralLib.LIndex(buf, j); } } if (GeneralLib.LLength(slist) > 0) { slist = Strings.Trim(slist); Expression.SetVariableAsString(vname, slist); } else { Expression.UndefineVariable(vname); } } } // パイロットやユニットのステータスをアップデート 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); }
// データファイル fname からデータをロード public void Load(ref string fname) { short FileNumber; short i, ret; int line_num; var line_buf = default(string); string pilot_list; Dialog d; DialogData dd; string err_msg; string pname, msg; ; #error Cannot convert OnErrorGoToStatementSyntax - see comment for details /* Cannot convert OnErrorGoToStatementSyntax, CONVERSION ERROR: Conversion for OnErrorGoToLabelStatement not implemented, please report this issue in 'On Error GoTo ErrorHandler' at character 2594 * * * Input: * * On Error GoTo ErrorHandler * */ FileNumber = (short)FileSystem.FreeFile(); FileSystem.FileOpen(FileNumber, fname, OpenMode.Input, OpenAccess.Read); line_num = 0; while (true) { do { if (FileSystem.EOF((int)FileNumber)) { FileSystem.FileClose((int)FileNumber); return; } GeneralLib.GetLine(ref FileNumber, ref line_buf, ref line_num); }while (Strings.Len(line_buf) == 0); // UPGRADE_NOTE: オブジェクト dd をガベージ コレクトするまでこのオブジェクトを破棄することはできません。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6E35BFF6-CD74-4B09-9689-3E1A43DF8969"' をクリックしてください。 dd = null; // パイロット名一覧 if ((int)GeneralLib.LLength(ref line_buf) == 0) { ; #error Cannot convert ErrorStatementSyntax - see comment for details /* Cannot convert ErrorStatementSyntax, CONVERSION ERROR: Conversion for ErrorStatement not implemented, please report this issue in 'Error(0)' at character 3503 * * * Input: * Error(0) * */ } pilot_list = ""; var loopTo = GeneralLib.LLength(ref line_buf); for (i = (short)1; i <= loopTo; i++) { pilot_list = pilot_list + " " + GeneralLib.LIndex(ref line_buf, i); } pilot_list = Strings.Trim(pilot_list); object argIndex2 = (object)pilot_list; if (IsDefined(ref argIndex2)) { object argIndex1 = (object)pilot_list; Delete(ref argIndex1); } dd = Add(ref pilot_list); GeneralLib.GetLine(ref FileNumber, ref line_buf, ref line_num); while (Strings.Len(line_buf) > 0) { // シチューション d = dd.AddDialog(ref line_buf); while (true) { if (FileSystem.EOF((int)FileNumber)) { FileSystem.FileClose((int)FileNumber); return; } GeneralLib.GetLine(ref FileNumber, ref line_buf, ref line_num); // 話者 ret = (short)Strings.InStr(line_buf, ","); if ((int)ret == 0) { break; } pname = Strings.Left(line_buf, (int)ret - 1); // 指定した話者のデータが存在するかチェック。 // ただし合体技のパートナーは場合は他の作品のパイロットであることも // あるので話者チェックを行わない。 if (Strings.Left(pname, 1) != "@") { bool localIsDefined() { object argIndex1 = (object)pname; var ret = SRC.PDList.IsDefined(ref argIndex1); return(ret); } bool localIsDefined1() { object argIndex1 = (object)pname; var ret = SRC.NPDList.IsDefined(ref argIndex1); return(ret); } if (!localIsDefined() & !localIsDefined1() & pname != "システム") { err_msg = "パイロット「" + pname + "」が定義されていません。"; ; #error Cannot convert ErrorStatementSyntax - see comment for details /* Cannot convert ErrorStatementSyntax, CONVERSION ERROR: Conversion for ErrorStatement not implemented, please report this issue in 'Error(0)' at character 4922 * * * Input: * Error(0) * */ } } // メッセージ if (Strings.Len(line_buf) == (int)ret) { err_msg = "メッセージが定義されていません。"; ; #error Cannot convert ErrorStatementSyntax - see comment for details /* Cannot convert ErrorStatementSyntax, CONVERSION ERROR: Conversion for ErrorStatement not implemented, please report this issue in 'Error(0)' at character 5092 * * * Input: * Error(0) * */ } msg = Strings.Trim(Strings.Mid(line_buf, (int)ret + 1)); d.AddMessage(ref pname, ref msg); } } } ErrorHandler: ; if (line_num == 0) { string argmsg = fname + "が開けません。"; GUI.ErrorMessage(ref argmsg); } else { FileSystem.FileClose((int)FileNumber); if (dd is null) { string argdname = ""; GUI.DataErrorMessage(ref err_msg, ref fname, (short)line_num, ref line_buf, ref argdname); } else { GUI.DataErrorMessage(ref err_msg, ref fname, (short)line_num, ref line_buf, ref dd.Name); } } SRC.TerminateSRC(); }
// Copyright (C) 1997-2012 Kei Sakamoto / Inui Tetsuyuki // 本プログラムはフリーソフトであり、無保証です。 // 本プログラムはGNU General Public License(Ver.3またはそれ以降)が定める条件の下で // 再頒布または改変することができます。 // Flashファイルの再生 public static void PlayFlash(ref string fname, ref short fx, ref short fy, ref short fw, ref short fh, ref string opt) { short i; bool is_VisibleEnd; // FLASHが使用できない場合はエラー if (!GUI.IsFlashAvailable) { string argmsg = "Flashファイルの読み込み中にエラーが発生しました。" + Constants.vbCrLf + "「Macromedia Flash Player」がインストールされていません。" + Constants.vbCrLf + "次のURLから、最新版のFlash Playerをインストールしてください。" + Constants.vbCrLf + "http://www.macromedia.com/shockwave/download/download.cgi?P5_Language=Japanese&Lang=Japanese&P1_Prod_Version=ShockwaveFlash&Lang=Japanese"; GUI.ErrorMessage(ref argmsg); return; } // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Enable の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 if (!My.MyProject.Forms.frmMain.FlashObject.Enable) { string argmsg1 = "Flashファイルの読み込み中にエラーが発生しました。" + Constants.vbCrLf + "「Macromedia Flash Player」がインストールされていません。" + Constants.vbCrLf + "次のURLから、最新版のFlash Playerをインストールしてください。" + Constants.vbCrLf + "http://www.macromedia.com/shockwave/download/download.cgi?P5_Language=Japanese&Lang=Japanese&P1_Prod_Version=ShockwaveFlash&Lang=Japanese"; GUI.ErrorMessage(ref argmsg1); return; } is_VisibleEnd = false; var loopTo = GeneralLib.LLength(ref opt); for (i = 1; i <= loopTo; i++) { switch (GeneralLib.LIndex(ref opt, i) ?? "") { case "保持": { is_VisibleEnd = true; break; } } } { var withBlock = My.MyProject.Forms.frmMain.FlashObject; // 一旦非表示 // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Visible の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Visible = false; // Flashオブジェクトの位置・サイズ設定 // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Left の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Left = fx; // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Top の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Top = fy; // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Width の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Width = fw; // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Height の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Height = fh; // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Visible の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Visible = true; // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.ZOrder の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.ZOrder(); // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.LoadMovie の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.LoadMovie(SRC.ScenarioPath + fname); // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Playing の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 while (withBlock.Playing & !GUI.IsRButtonPressed(true)) { Application.DoEvents(); } // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.StopMovie の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 My.MyProject.Forms.frmMain.FlashObject.StopMovie(); if (!is_VisibleEnd) { // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.ClearMovie の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.ClearMovie(); // UPGRADE_WARNING: オブジェクト frmMain.FlashObject.Visible の既定プロパティを解決できませんでした。 詳細については、'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' をクリックしてください。 withBlock.Visible = false; } } }
protected override int ExecInternal() { var opt = ""; var num = ArgNum; if (num > 1) { if (GetArgAsString(num) == "非同期") { opt = "非同期"; num = (num - 1); } } var pname = ""; var uparty = ""; var ucount = 0; switch (num) { case 2: { pname = GetArgAsString(2); if (pname == "味方" || pname == "NPC" || pname == "敵" || pname == "中立") { uparty = pname; foreach (Unit u in SRC.UList.Items) { if ((u.Party0 ?? "") == (uparty ?? "")) { if (u.Status == "出撃") { u.Escape(opt); ucount = (ucount + 1); } else if (u.Status == "破壊") { if (1 <= u.x && u.x <= Map.MapWidth && 1 <= u.y && u.y <= Map.MapHeight) { if (ReferenceEquals(u, Map.MapDataForUnit[u.x, u.y])) { // 破壊キャンセルで画面上に残っていた u.Escape(opt); } } } } } } else { var u = SRC.UList.Item2(pname); if (u is null) { if (!SRC.PList.IsDefined(pname)) { throw new EventErrorException(this, "「" + pname + "」というパイロットが見つかりません"); } u = SRC.PList.Item(pname).Unit; } if (u is object) { if (u.Status == "出撃") { ucount = 1; } u.Escape(opt); uparty = u.Party0; } } break; } case 1: { { var withBlock2 = Event.SelectedUnitForEvent; if (withBlock2.Status == "出撃") { ucount = 1; } withBlock2.Escape(opt); uparty = withBlock2.Party0; } break; } default: { throw new EventErrorException(this, "Escapeコマンドの引数の数が違います"); } } // Escapeコマンドによって全滅したかを判定 if (uparty != "NPC" && uparty != "味方" && ucount > 0) { foreach (Unit u in SRC.UList.Items) { if ((u.Party0 ?? "") == (uparty ?? "") && (u.Status == "出撃" || u.Status == "格納") && !u.IsConditionSatisfied("憑依")) { return(EventData.NextID); } } // 戦闘時以外のイベント中の撤退は無視 foreach (var m in Event.EventQue) { if (m == "プロローグ" || m == "エピローグ" || m == "スタート" || GeneralLib.LIndex(m, 1) == "マップ攻撃破壊") { return(EventData.NextID); } } // 後で全滅イベントを実行 Event.RegisterEvent("全滅", uparty); } return(EventData.NextID); }
// 「アビリティ」コマンドを開始 // is_item=True の場合は「アイテム」コマンドによる使い捨てアイテムのアビリティ private void StartAbilityCommand(bool is_item = false) { string cap; GUI.LockGUI(); // 使用するアビリティを選択 if (is_item) { cap = "アイテム選択"; } else { cap = Expression.Term("アビリティ", SelectedUnit) + "選択"; } UnitAbility unitAbility; if (CommandState == "コマンド選択") { unitAbility = GUI.AbilityListBox(SelectedUnit, new UnitAbilityList(AbilityListMode.BeforeMove, SelectedUnit), cap, "移動前", is_item); } else { unitAbility = GUI.AbilityListBox(SelectedUnit, new UnitAbilityList(AbilityListMode.AfterMove, SelectedUnit), cap, "移動後", is_item); } // キャンセル if (unitAbility == null) { SelectedAbility = 0; if (SRC.AutoMoveCursor) { GUI.RestoreCursorPos(); } CancelCommand(); GUI.UnlockGUI(); return; } SelectedAbility = unitAbility.AbilityNo(); var currentUnit = SelectedUnit; // アビリティ専用BGMがあればそれを演奏 if (currentUnit.IsFeatureAvailable("アビリティBGM")) { var BGM = currentUnit.Features.Where(x => x.Name == "アビリティBGM") .Where(x => GeneralLib.LIndex(x.Data, 1) == unitAbility.Data.Name) .Select(x => Sound.SearchMidiFile(Strings.Mid(x.Data, Strings.InStr(x.Data, " ") + 1))) .FirstOrDefault(); if (!string.IsNullOrEmpty(BGM)) { Sound.ChangeBGM(BGM); } } // 射程0のアビリティはその場で実行 if (unitAbility.Data.MaxRange == 0) { SelectedTarget = SelectedUnit; // 変身アビリティであるか判定 var is_transformation = unitAbility.Data.Effects.Any(x => x.EffectType == "変身"); SelectedAbilityName = unitAbility.Data.Name; // 使用イベント Event.HandleEvent("使用", SelectedUnit.MainPilot().ID, SelectedAbilityName); if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; GUI.UnlockGUI(); return; } if (SRC.IsCanceled) { SRC.IsCanceled = false; WaitCommand(); return; } // アビリティを実行 SelectedUnit.ExecuteAbility(unitAbility, SelectedUnit); SelectedUnit = SelectedUnit.CurrentForm(); GUI.CloseMessageForm(); // 破壊イベント { var withBlock1 = SelectedUnit; if (withBlock1.Status == "破壊") { if (withBlock1.CountPilot() > 0) { Event.HandleEvent("破壊", withBlock1.MainPilot().ID); if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; GUI.UnlockGUI(); return; } if (SRC.IsCanceled) { SRC.IsCanceled = false; GUI.UnlockGUI(); return; } } WaitCommand(); return; } } // 使用後イベント { var withBlock2 = SelectedUnit; if (withBlock2.CountPilot() > 0) { Event.HandleEvent("使用後", withBlock2.MainPilot().ID, SelectedAbilityName); if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; GUI.UnlockGUI(); return; } if (SRC.IsCanceled) { SRC.IsCanceled = false; GUI.UnlockGUI(); return; } } } // 変身アビリティの場合は行動終了しない if (!is_transformation || CommandState == "移動後コマンド選択") { WaitCommand(); } else { if (SelectedUnit.Status == "出撃") { // カーソル自動移動 if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ユニット選択", SelectedUnit); } Status.DisplayUnitStatus(SelectedUnit); } else { Status.ClearUnitStatus(); } CommandState = "ユニット選択"; GUI.UnlockGUI(); } return; } // アビリティの射程を求めておく var min_range = unitAbility.AbilityMinRange(); var max_range = unitAbility.AbilityMaxRange(); { // マップ型アビリティかどうかで今後のコマンド処理の進行の仕方が異なる if (is_item) { if (unitAbility.IsAbilityClassifiedAs("M")) { SelectedCommand = "マップアイテム"; } else { SelectedCommand = "アイテム"; } } else { if (unitAbility.IsAbilityClassifiedAs("M")) { SelectedCommand = "マップアビリティ"; } else { SelectedCommand = "アビリティ"; } } // アビリティの効果範囲を設定 if (unitAbility.IsAbilityClassifiedAs("M直")) { Map.AreaInCross(currentUnit.x, currentUnit.y, min_range, max_range); } else if (unitAbility.IsAbilityClassifiedAs("M拡")) { Map.AreaInWideCross(currentUnit.x, currentUnit.y, min_range, max_range); } else if (unitAbility.IsAbilityClassifiedAs("M扇")) { Map.AreaInSectorCross(currentUnit.x, currentUnit.y, min_range, max_range, (int)unitAbility.AbilityLevel("M扇")); } else if (unitAbility.IsAbilityClassifiedAs("M移")) { Map.AreaInMoveAction(SelectedUnit, max_range); } else { Map.AreaInRange(currentUnit.x, currentUnit.y, max_range, min_range, "すべて"); } // 射程1の合体技はパートナーで相手を取り囲んでいないと使用できない if (unitAbility.IsAbilityClassifiedAs("合") && !unitAbility.IsAbilityClassifiedAs("M") && unitAbility.Data.MaxRange == 1) { foreach (var t in Map.AdjacentUnit(currentUnit)) { if (currentUnit.IsAlly(t)) { var partners = unitAbility.CombinationPartner(t.x, t.y); if (partners.Count == 0) { Map.MaskData[t.x, t.y] = true; } } } } } // ユニットがいるマスの処理 if (!unitAbility.IsAbilityClassifiedAs("M投") && !unitAbility.IsAbilityClassifiedAs("M線") && !unitAbility.IsAbilityClassifiedAs("M移")) { var loopTo2 = GeneralLib.MinLng(currentUnit.x + max_range, Map.MapWidth); for (var i = GeneralLib.MaxLng(currentUnit.x - max_range, 1); i <= loopTo2; i++) { var loopTo3 = GeneralLib.MinLng(currentUnit.y + max_range, Map.MapHeight); for (var j = GeneralLib.MaxLng(currentUnit.y - max_range, 1); j <= loopTo3; j++) { if (!Map.MaskData[i, j]) { var t = Map.MapDataForUnit[i, j]; if (t is object) { // 有効? if (unitAbility.IsAbilityEffective(t)) { Map.MaskData[i, j] = false; } else { Map.MaskData[i, j] = true; } } } } } } // 支援専用アビリティは自分には使用できない if (!Map.MaskData[currentUnit.x, currentUnit.y]) { if (unitAbility.IsAbilityClassifiedAs("援")) { Map.MaskData[currentUnit.x, currentUnit.y] = true; } } if (!Expression.IsOptionDefined("大型マップ")) { GUI.Center(currentUnit.x, currentUnit.y); } GUI.MaskScreen(); if (CommandState == "コマンド選択") { CommandState = "ターゲット選択"; } else { CommandState = "移動後ターゲット選択"; } // カーソル自動移動を行う? if (!SRC.AutoMoveCursor) { GUI.UnlockGUI(); return; } // 自分から最も近い味方ユニットを探す { Unit t = null; foreach (Unit u in SRC.UList.Items) { if (u.Status == "出撃" && u.Party == "味方") { if (Map.MaskData[u.x, u.y] == false && !ReferenceEquals(u, SelectedUnit)) { if (t is null) { t = u; } else if (Math.Pow(Math.Abs((SelectedUnit.x - u.x)), 2d) + Math.Pow(Math.Abs((SelectedUnit.y - u.y)), 2d) < Math.Pow(Math.Abs((SelectedUnit.x - t.x)), 2d) + Math.Pow(Math.Abs((SelectedUnit.y - t.y)), 2d)) { t = u; } } } } // 適当がユニットがなければ自分自身を選択 if (t is null) { t = SelectedUnit; } // カーソルを移動 GUI.MoveCursorPos("ユニット選択", t); // ターゲットのステータスを表示 if (!ReferenceEquals(SelectedUnit, t)) { Status.DisplayUnitStatus(t); } } GUI.UnlockGUI(); }
// 戦闘アニメを再生 public void PlayAnimation(string main_situation, string sub_situation = "", bool keep_message_form = false) { var in_bulk = false; // 戦闘アニメデータを検索 var anime = AnimationData(main_situation, sub_situation); // 見つからなかった場合は一括指定を試してみる if (string.IsNullOrEmpty(anime)) { switch (Strings.Right(main_situation, 4) ?? "") { case "(準備)": case "(攻撃)": case "(命中)": { anime = AnimationData(Strings.Left(main_situation, Strings.Len(main_situation) - 4), sub_situation); in_bulk = true; break; } case "(発動)": { anime = AnimationData(Strings.Left(main_situation, Strings.Len(main_situation) - 4), sub_situation); break; } } } anime = anime.Trim(); // 表示キャンセル if (string.IsNullOrEmpty(anime) || anime == "-") { return; } // マウスの右ボタンでキャンセル if (GUI.IsRButtonPressed()) { // アニメの終了処理はキャンセルしない if (main_situation != "終了" && Strings.Right(main_situation, 4) != "(終了)") { // 式評価のみ行う Expression.FormatMessage(ref anime); return; } } // メッセージウィンドウは表示されている? var is_message_form_opened = GUI.MessageFormVisible; // TODO Impl オブジェクト色等 //// オブジェクト色等を記録しておく //prev_obj_color = Event.ObjColor; //prev_obj_fill_color = Event.ObjFillColor; //prev_obj_fill_style = Event.ObjFillStyle; //prev_obj_draw_width = Event.ObjDrawWidth; //prev_obj_draw_option = Event.ObjDrawOption; //// オブジェクト色等をデフォルトに戻す //Event.ObjColor = ColorTranslator.ToOle(Color.White); //Event.ObjFillColor = ColorTranslator.ToOle(Color.White); //Event.ObjFillStyle = vbFSTransparent; //Event.ObjDrawWidth = 1; //Event.ObjDrawOption = ""; // 検索するシチュエーションが武器名かどうか調べる var is_weapon = Weapons.Any(w => main_situation == w.Name + "(攻撃)"); // 検索するシチュエーションがアビリティかどうか調べる var is_ability = Abilities.Any(a => main_situation == a.Data.Name + "(発動)"); // イベント用ターゲットを記録しておく var prev_selected_target = Event.SelectedTargetForEvent; // 攻撃でもアビリティでもない場合、ターゲットが設定されていなければ // 自分自身をターゲットに設定する // (発動アニメではアニメ表示にSelectedTargetForEventが使われるため) if (!is_weapon && !is_ability) { if (Event.SelectedTargetForEvent is null) { Event.SelectedTargetForEvent = this; } } // アニメ指定を分割 var animes = anime.Split(";").ToList(); try { var need_refresh = false; var wait_time = 0; var sname = ""; var buf = ""; foreach (var a in animes) { var animepart = a; // 最後に実行されたのがサブルーチン呼び出しかどうかを判定するため // サブルーチン名をあらかじめクリアしておく sname = ""; // 式評価 Expression.FormatMessage(ref animepart); // 画面クリア? if (Strings.LCase(animepart) == "clear") { GUI.ClearPicture(); need_refresh = true; goto NextAnime; } // 戦闘アニメ以外の特殊効果 switch (Strings.LCase(Strings.Right(GeneralLib.LIndex(animepart, 1), 4)) ?? "") { case ".wav": case ".mp3": { // 効果音 Sound.PlayWave(animepart); if (wait_time > 0) { if (need_refresh) { GUI.UpdateScreen(); need_refresh = false; } GUI.Sleep(wait_time); wait_time = 0; } goto NextAnime; } case ".bmp": case ".jpg": case ".gif": case ".png": { // カットインの表示 if (wait_time > 0) { animepart = (wait_time / 100d) + ";" + animepart; wait_time = 0; need_refresh = false; } else if (Strings.Left(animepart, 1) == "@") { need_refresh = false; } else { need_refresh = true; } GUI.DisplayBattleMessage("-", animepart, msg_mode: ""); goto NextAnime; } } switch (Strings.LCase(GeneralLib.LIndex(animepart, 1)) ?? "") { case "line": case "circle": case "arc": case "oval": case "color": case "fillcolor": case "fillstyle": case "drawwidth": { // 画面処理コマンド if (wait_time > 0) { animepart = (wait_time / 100d) + ";" + animepart; wait_time = 0; need_refresh = false; } else { need_refresh = true; } GUI.DisplayBattleMessage("-", animepart, msg_mode: ""); goto NextAnime; } case "center": { // 指定したユニットを中央表示 buf = Expression.GetValueAsString(GeneralLib.ListIndex(animepart, 2)); if (SRC.UList.IsDefined(buf)) { { var withBlock = SRC.UList.Item(buf); GUI.Center(withBlock.x, withBlock.y); GUI.RedrawScreen(); need_refresh = false; } } goto NextAnime; } case "keep": { // そのまま終了 break; } } // ウェイト? if (Information.IsNumeric(animepart)) { wait_time = (int)(100d * Conversions.ToDouble(animepart)); goto NextAnime; } // サブルーチンの呼び出しが確定 // 戦闘アニメ再生用のサブルーチン名を作成 sname = GeneralLib.LIndex(animepart, 1); if (Strings.Left(sname, 1) == "@") { sname = Strings.Mid(sname, 2); } else if (is_weapon) { // 武器名の場合 sname = "戦闘アニメ_" + sname + "攻撃"; } else { // その他の場合 // 括弧を含んだ武器名に対応するため、"("は後ろから検索 var idx = GeneralLib.InStr2(main_situation, "("); // 変形系のシチュエーションではサフィックスを無視 if (idx > 0) { switch (Strings.Left(main_situation, idx - 1) ?? "") { case "変形": case "ハイパーモード": case "ノーマルモード": case "パーツ分離": case "合体": case "分離": { idx = 0; break; } } } // 武器名(攻撃無効化)の場合もサフィックスを無視 if (idx > 0) { if (Strings.Mid(main_situation, idx) == "(攻撃無効化)") { idx = 0; } } if (idx > 0) { // サフィックスあり sname = "戦闘アニメ_" + sname + Strings.Mid(main_situation, idx + 1, Strings.Len(main_situation) - idx - 1); } else { sname = "戦闘アニメ_" + sname + "発動"; } } // サブルーチンが見つからなかった if (Event.FindNormalLabel(sname) == 0) { if (in_bulk) { // 一括指定を利用している場合 switch (Strings.Right(main_situation, 4) ?? "") { case "(準備)": { // 表示をキャンセル goto NextAnime; } case "(攻撃)": { // 複数のアニメ指定がある場合は諦めて他のものを使う if (animes.Count > 1) { goto NextAnime; } // そうでなければ「デフォルト」を使用 sname = "戦闘アニメ_デフォルト攻撃"; break; } case "(命中)": { // 複数のアニメ指定がある場合は諦めて他のものを使う if (animes.Count > 1) { goto NextAnime; } // そうでなければ「ダメージ」を使用 sname = "戦闘アニメ_ダメージ命中"; break; } } } else { if (wait_time > 0) { animepart = (wait_time / 100d) + ";" + animepart; wait_time = 0; } if (!GUI.MessageFormVisible) { if (ReferenceEquals(Commands.SelectedTarget, this)) { GUI.OpenMessageForm(this, u2: null); } else { GUI.OpenMessageForm(Commands.SelectedTarget, this); } } GUI.DisplayBattleMessage("-", animepart, msg_mode: ""); goto NextAnime; } } sname = "`" + sname + "`"; // 引数の構築 sname = sname + "," + string.Join(",", GeneralLib.ToList(animepart).Skip(1)); if (in_bulk) { sname = sname + ",`一括指定`"; } // 戦闘アニメ再生前にウェイトを入れる if (need_refresh) { GUI.UpdateScreen(); need_refresh = false; } if (wait_time > 0) { GUI.Sleep(wait_time); wait_time = 0; } // 画像描画が行われたかどうかの判定のためにフラグを初期化 GUI.IsPictureDrawn = false; // 戦闘アニメ再生 Event.SaveBasePoint(); Expression.CallFunction("Call(" + sname + ")", Expressions.ValueType.StringType, out buf, out _); Event.RestoreBasePoint(); // 画像を消去しておく if (GUI.IsPictureDrawn && Strings.LCase(buf) != "keep") { GUI.ClearPicture(); GUI.UpdateScreen(); } NextAnime: ; } // 戦闘アニメ再生後にウェイトを入れる? if (need_refresh) { GUI.UpdateScreen(); need_refresh = false; } if (wait_time > 0) { GUI.Sleep(wait_time); wait_time = 0; } // 画像を消去しておく if (GUI.IsPictureDrawn && string.IsNullOrEmpty(sname) && Strings.InStr(main_situation, "(準備)") == 0 && Strings.LCase(anime) != "keep") { GUI.ClearPicture(); GUI.UpdateScreen(); } // 最初から表示されていたのでなければメッセージウィンドウを閉じる if (!is_message_form_opened && !keep_message_form) { GUI.CloseMessageForm(); } //// オブジェクト色等を元に戻す //Event.ObjColor = prev_obj_color; //Event.ObjFillColor = prev_obj_fill_color; //Event.ObjFillStyle = prev_obj_fill_style; //Event.ObjDrawWidth = prev_obj_draw_width; //Event.ObjDrawOption = prev_obj_draw_option; // イベント用ターゲットを元に戻す Event.SelectedTargetForEvent = prev_selected_target; } catch (Exception ex) { // TODO Handle error //if (Strings.Len(Event.EventErrorMessage) > 0) //{ // Event.DisplayEventErrorMessage(Event.CurrentLineNum, Event.EventErrorMessage); // Event.EventErrorMessage = ""; //} //else //{ // Event.DisplayEventErrorMessage(Event.CurrentLineNum, ""); //} Event.DisplayEventErrorMessage(Event.CurrentLineNum, ex.Message); } }
// スペシャルパワー自爆による自爆 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: ; } } }
// 「ジャンプ」コマンドを終了 private void FinishJumpCommand() { // MOD END MARGE int ret; GUI.LockGUI(); { var u = SelectedUnit; PrevUnitX = u.x; PrevUnitY = u.y; PrevUnitArea = u.Area; PrevUnitEN = u.EN; // ジャンプ後に着艦or合体する場合はプレイヤーに確認を取る if (!ConfirmMoveFinish(u)) { return; } // メッセージを表示 if (u.IsMessageDefined("ジャンプ(" + u.FeatureName("ジャンプ") + ")")) { GUI.OpenMessageForm(u1: null, u2: null); u.PilotMessage("ジャンプ(" + u.FeatureName("ジャンプ") + ")", msg_mode: ""); GUI.CloseMessageForm(); } else if (u.IsMessageDefined("ジャンプ")) { GUI.OpenMessageForm(u1: null, u2: null); u.PilotMessage("ジャンプ", msg_mode: ""); GUI.CloseMessageForm(); } // アニメ表示 if (u.IsAnimationDefined("ジャンプ", u.FeatureName("ジャンプ"))) { u.PlayAnimation("ジャンプ", u.FeatureName("ジャンプ")); } else if (u.IsSpecialEffectDefined("ジャンプ", u.FeatureName("ジャンプ"))) { u.SpecialEffect("ジャンプ", u.FeatureName("ジャンプ")); } else { Sound.PlayWave("Swing.wav"); } // ENを消費 if (GeneralLib.LLength(u.FeatureData("ジャンプ")) == 2) { u.EN = PrevUnitEN - Conversions.ToInteger(GeneralLib.LIndex(u.FeatureData("ジャンプ"), 2)); } // ユニットを移動 u.Move(SelectedX, SelectedY, true, false, true); GUI.RedrawScreen(); // 移動後に着艦または合体した? if (!ReferenceEquals(Map.MapDataForUnit[SelectedX, SelectedY], SelectedUnit)) { if (Map.MapDataForUnit[SelectedX, SelectedY].IsFeatureAvailable("母艦") && !u.IsFeatureAvailable("母艦") && u.CountPilot() > 0) { // 着艦メッセージ表示 if (u.IsMessageDefined("着艦(" + u.Name + ")")) { GUI.OpenMessageForm(u1: null, u2: null); u.PilotMessage("着艦(" + u.Name + ")", msg_mode: ""); GUI.CloseMessageForm(); } else if (u.IsMessageDefined("着艦")) { GUI.OpenMessageForm(u1: null, u2: null); u.PilotMessage("着艦", msg_mode: ""); GUI.CloseMessageForm(); } u.SpecialEffect("着艦", u.Name); // 収納イベント SelectedTarget = Map.MapDataForUnit[SelectedX, SelectedY]; Event.HandleEvent("収納", u.MainPilot().ID); } else { // 合体後のユニットを選択 SelectedUnit = Map.MapDataForUnit[SelectedX, SelectedY]; // 合体イベント Event.HandleEvent("合体", SelectedUnit.MainPilot().ID, SelectedUnit.Name); } // 移動後の収納・合体イベントでステージが終了することがあるので if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; GUI.UnlockGUI(); return; } if (SRC.IsCanceled) { SRC.IsCanceled = false; Status.ClearUnitStatus(); GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } // 残り行動数を減少させる SelectedUnit.UseAction(); // 持続期間が「移動」のスペシャルパワー効果を削除 SelectedUnit.RemoveSpecialPowerInEffect("移動"); Status.DisplayUnitStatus(Map.MapDataForUnit[SelectedX, SelectedY]); GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } // ADD START MARGE SelectedUnitMoveCost = 100; // ADD END MARGE } CommandState = "移動後コマンド選択"; GUI.UnlockGUI(); ProceedCommand(); }
// 指定したレベルでの特殊能力Nameの名称 public string SkillName(short lv, ref string sname) { string SkillNameRet = default; short 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(ref 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 != SRC.DEFAULT_LEVEL & Strings.InStr(SkillNameRet, "Lv") == 0) { SkillNameRet = SkillNameRet + "Lv" + Microsoft.VisualBasic.Compatibility.VB6.Support.Format(sd.Level); } } } } NextLoop: ; } // レベル非表示用の括弧を削除 if (Strings.Left(SkillNameRet, 1) == "(") { SkillNameRet = Strings.Mid(SkillNameRet, 2, Strings.Len(SkillNameRet) - 2); } return(SkillNameRet); }
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); }
// 「アビリティ一覧」コマンド 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); } } } } } }
// 「変形」コマンド private void TransformCommand() { // MOD START MARGE //// If MainWidth <> 15 Then //if (GUI.NewGUIMode) //{ // // MOD END MARGE // Status.ClearUnitStatus(); //} GUI.LockGUI(); var fdata = SelectedUnit.FeatureData("変形"); if (Map.IsStatusView) { // ユニットステータスコマンドの場合 var forms = GeneralLib.ToL(fdata).Skip(1) .Select(x => SelectedUnit.OtherForm(x)) .Where(x => x.IsAvailable()) .Select(x => new ListBoxItem { ListItemID = x.Name, Text = x.Nickname0, }).ToList(); var ret = 1; if (forms.Count > 1) { GUI.TopItem = 1; ret = GUI.ListBox(new ListBoxArgs { lb_caption = SelectedUnit.IsHero() ? "変身先" : "変形先", lb_info = "名前", lb_mode = "カーソル移動", Items = forms, }); if (ret == 0) { CancelCommand(); GUI.UnlockGUI(); return; } } var uname = forms[ret - 1].ListItemID; var targetUnit = SRC.UDList.Item(uname); // 変形を実施 var u = SelectedUnit; u.Transform(uname); // ユニットリストの表示を更新 Event.MakeUnitList(smode: ""); // ステータスウィンドウの表示を更新 Status.DisplayUnitStatus(u.CurrentForm()); // コマンドを終了 // XXX RedrawScreen 元はしてなかった気がする GUI.RedrawScreen(); GUI.UnlockGUI(); CommandState = "ユニット選択"; return; } { // 変形可能な形態の一覧を作成 var forms = GeneralLib.ToL(fdata).Skip(1) .Select(x => SelectedUnit.OtherForm(x)) .Where(x => x.IsAvailable()) .Select(x => new ListBoxItem { ListItemID = x.Name, Text = x.Nickname0, ListItemFlag = !(x.IsAbleToEnter(SelectedUnit.x, SelectedUnit.y) || Map.IsStatusView) }).ToList(); // 変形先の形態を選択 int ret; if (forms.Count() == 1) { if (forms.First().ListItemFlag) { GUI.Confirm("この地形では" + GeneralLib.LIndex(fdata, 1) + "できません", "", GuiConfirmOption.Ok); CancelCommand(); GUI.UnlockGUI(); return; } ret = 1; } else { GUI.TopItem = 1; ret = GUI.ListBox(new ListBoxArgs { lb_caption = SelectedUnit.IsHero() ? "変身先" : "変形先", lb_info = "名前", lb_mode = "カーソル移動", HasFlag = true, Items = forms, }); if (ret == 0) { CancelCommand(); GUI.UnlockGUI(); return; } } var uname = forms[ret - 1].ListItemID; var targetUnit = SRC.UDList.Item(uname); string BGM; { var u = SelectedUnit; // ダイアログでメッセージを表示させるため追加パイロットをあらかじめ作成 AddAdditionalPilotIfNotExist(uname, u); // BGMの変更 if (u.IsFeatureAvailable("変形BGM")) { foreach (var fd in u.Features.Where(x => x.Name == "変形BGM") .Where(x => GeneralLib.LIndex(x.Data, 1) == uname)) { BGM = Sound.SearchMidiFile(Strings.Mid(fd.Data, Strings.InStr(fd.Data, " ") + 1)); if (Strings.Len(BGM) > 0) { Sound.ChangeBGM(BGM); GUI.Sleep(500); } break; } } // メッセージを表示 SelectedUnit.PilotMassageIfDefined(new string[] { "変形(" + u.Name + "=>" + uname + ")", "変形(" + uname + ")", "変形(" + u.FeatureName("変形") + ")", }); // アニメ表示 SelectedUnit.PlayAnimationIfDefined(new string[] { "変形(" + u.Name + "=>" + uname + ")", "変形(" + uname + ")", "変形(" + u.FeatureName("変形") + ")", }); } // 変形 var prev_uname = SelectedUnit.Name; SelectedUnit.Transform(uname); SelectedUnit = Map.MapDataForUnit[SelectedUnit.x, SelectedUnit.y]; // 変形をキャンセルする? if (SelectedUnit.Action == 0) { var confirmRet = GUI.Confirm( "この形態ではこれ以上の行動が出来ません。" + Constants.vbCr + Constants.vbLf + "それでも変形しますか?", "変形", GuiConfirmOption.OkCancel | GuiConfirmOption.Question); if (confirmRet == GuiDialogResult.Cancel) { SelectedUnit.Transform(prev_uname); SelectedUnit = Map.MapDataForUnit[SelectedUnit.x, SelectedUnit.y]; if (SelectedUnit.IsConditionSatisfied("消耗")) { SelectedUnit.DeleteCondition("消耗"); } } GUI.RedrawScreen(); } // 変形イベント { Event.HandleEvent("変形", SelectedUnit.CurrentForm().MainPilot().ID, SelectedUnit.CurrentForm().Name); } if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; Status.ClearUnitStatus(); GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } SRC.IsCanceled = false; // ハイパーモード・ノーマルモードの自動発動をチェック SelectedUnit.CurrentForm().CheckAutoHyperMode(); SelectedUnit.CurrentForm().CheckAutoNormalMode(); // カーソル自動移動 if (SelectedUnit.Status == "出撃") { if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ユニット選択", SelectedUnit); } Status.DisplayUnitStatus(SelectedUnit); } // XXX RedrawScreen 元はしてなかった気がする GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); } }
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 void AddSkill(ref string sname, double slevel, string sdata, short lv) { SkillData sd; short i; ; // データ定義が省略されている場合は前回と同じ物を使う if ((last_sname ?? "") == (sname ?? "") & Strings.Len(sdata) == 0) { sdata = last_sdata; } last_sname = sname; last_sdata = sdata; // エリアスが定義されている? object argIndex2 = sname; if (SRC.ALDList.IsDefined(ref argIndex2)) { if (GeneralLib.LIndex(ref sdata, 1) != "解説") { object argIndex1 = sname; { var withBlock = SRC.ALDList.Item(ref argIndex1); var loopTo = withBlock.Count; for (i = 1; i <= loopTo; i++) { // エリアスの定義に従って特殊能力定義を置き換える sd = new SkillData(); sd.Name = withBlock.get_AliasType(i); string localLIndex() { string arglist = withBlock.get_AliasData(i); var ret = GeneralLib.LIndex(ref arglist, 1); withBlock.get_AliasData(i) = arglist; return(ret); } if (localLIndex() == "解説") { if (!string.IsNullOrEmpty(sdata)) { sd.Name = GeneralLib.LIndex(ref sdata, 1); } } if (withBlock.get_AliasLevelIsPlusMod(i)) { if (slevel == SRC.DEFAULT_LEVEL) { slevel = 1d; } sd.Level = slevel + withBlock.get_AliasLevel(i); } else if (withBlock.get_AliasLevelIsMultMod(i)) { if (slevel == SRC.DEFAULT_LEVEL) { slevel = 1d; } sd.Level = slevel * withBlock.get_AliasLevel(i); } else if (slevel != SRC.DEFAULT_LEVEL) { sd.Level = slevel; } else { sd.Level = withBlock.get_AliasLevel(i); } sd.StrData = withBlock.get_AliasData(i); if (!string.IsNullOrEmpty(sdata)) { string localLIndex1() { string arglist = withBlock.get_AliasData(i); var ret = GeneralLib.LIndex(ref arglist, 1); withBlock.get_AliasData(i) = arglist; return(ret); } if (withBlock.get_AliasData(i) != "非表示" & localLIndex1() != "解説") { string localListTail() { string arglist = withBlock.get_AliasData(i); var ret = GeneralLib.ListTail(ref arglist, 2); withBlock.get_AliasData(i) = arglist; return(ret); } sd.StrData = Strings.Trim(sdata + " " + localListTail()); } } if (withBlock.get_AliasLevelIsPlusMod(i) | withBlock.get_AliasLevelIsMultMod(i)) { sd.StrData = sd.StrData + "Lv" + Microsoft.VisualBasic.Compatibility.VB6.Support.Format(slevel); } sd.NecessaryLevel = lv; colSkill.Add(sd, sname + Microsoft.VisualBasic.Compatibility.VB6.Support.Format(colSkill.Count)); } } return; } } // 特殊能力を登録 sd = new SkillData(); sd.Name = sname; sd.Level = slevel; sd.StrData = sdata; sd.NecessaryLevel = lv; colSkill.Add(sd, sname + Microsoft.VisualBasic.Compatibility.VB6.Support.Format(colSkill.Count)); }
// 「ハイパーモード」コマンド private void HyperModeCommand() { //// MOD START MARGE //// If MainWidth <> 15 Then //if (GUI.NewGUIMode) //{ // // MOD END MARGE // Status.ClearUnitStatus(); //} GUI.LockGUI(); var uname = GeneralLib.LIndex(SelectedUnit.FeatureData("ハイパーモード"), 2); var fname = SelectedUnit.FeatureName("ハイパーモード"); if (Map.IsStatusView) { // ユニットステータスコマンドの場合 if (!SelectedUnit.IsFeatureAvailable("ハイパーモード")) { uname = GeneralLib.LIndex(SelectedUnit.FeatureData("ノーマルモード"), 1); } // ハイパーモードを発動 SelectedUnit.Transform(uname); // ユニットリストの表示を更新 Event.MakeUnitList(smode: ""); // ステータスウィンドウの表示を更新 Status.DisplayUnitStatus(SelectedUnit.CurrentForm()); // コマンドを終了 GUI.UnlockGUI(); CommandState = "ユニット選択"; return; } // ハイパーモードを発動可能かどうかチェック { var withBlock1 = SelectedUnit.OtherForm(uname); if (!withBlock1.IsAbleToEnter(SelectedUnit.x, SelectedUnit.y) && !string.IsNullOrEmpty(Map.MapFileName)) { GUI.Confirm("この地形では変形できません", "", GuiConfirmOption.Ok); GUI.UnlockGUI(); CancelCommand(); return; } } // ダイアログでメッセージを表示させるため追加パイロットをあらかじめ作成 AddAdditionalPilotIfNotExist(uname, SelectedUnit); { // BGMを変更 if (SelectedUnit.IsFeatureAvailable("ハイパーモードBGM")) { var loopTo11 = SelectedUnit.CountFeature(); for (var i = 1; i <= loopTo11; i++) { var fdata = SelectedUnit.Feature(i).Data; if (SelectedUnit.Feature(i).Name == "ハイパーモードBGM" && (GeneralLib.LIndex(fdata, 1) ?? "") == uname) { var BGM = Sound.SearchMidiFile(Strings.Mid(fdata, Strings.InStr(fdata, " ") + 1)); if (Strings.Len(BGM) > 0) { Sound.ChangeBGM(BGM); GUI.Sleep(500); } break; } } } // メッセージを表示 SelectedUnit.PilotMassageIfDefined(new string[] { "ハイパーモード(" + SelectedUnit.Name + "=>" + uname + ")", "ハイパーモード(" + uname + ")", "ハイパーモード(" + fname + ")" }); // アニメ表示 SelectedUnit.PlayAnimation(new string[] { "ハイパーモード(" + SelectedUnit.Name + "=>" + uname + ")", "ハイパーモード(" + uname + ")", "ハイパーモード(" + fname + ")", "ハイパーモード", }); } // ハイパーモード発動 SelectedUnit.Transform(uname); // ハイパーモード・ノーマルモードの自動発動をチェック SelectedUnit.CurrentForm().CheckAutoHyperMode(); SelectedUnit.CurrentForm().CheckAutoNormalMode(); SelectedUnit = Map.MapDataForUnit[SelectedUnit.x, SelectedUnit.y]; // 変形イベント { var withBlock4 = SelectedUnit.CurrentForm(); Event.HandleEvent("変形", withBlock4.MainPilot().ID, withBlock4.Name); } if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; Status.ClearUnitStatus(); GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } SRC.IsCanceled = false; // カーソル自動移動 if (SelectedUnit.Status == "出撃") { if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ユニット選択", SelectedUnit); } Status.DisplayUnitStatus(SelectedUnit); } CommandState = "ユニット選択"; GUI.UnlockGUI(); }
// 「特殊能力一覧」コマンド private void FeatureListCommand() { LogDebug(); GUI.LockGUI(); // 表示する特殊能力名一覧の作成 var list = new List <ListBoxItem <ItemKind> >(); var currentUnit = SelectedUnit; // 武器・防具クラス if (Expression.IsOptionDefined("アイテム交換")) { if (currentUnit.IsFeatureAvailable("武器クラス") || currentUnit.IsFeatureAvailable("防具クラス")) { list.Add(new ListBoxItem <ItemKind>("武器・防具クラス", "武器・防具クラス")); } } var p = SelectedUnit.MainPilot(); // パイロット特殊能力 var loopTo = p.CountSkill(); for (var i = 1; i <= loopTo; i++) { string fname = ""; switch (p.Skill(i) ?? "") { case "得意技": case "不得手": { fname = p.Skill(i); break; } default: { fname = p.SkillName(i); break; } } // 非表示の能力は除く if (Strings.InStr(fname, "非表示") > 0) { continue; } // 既に表示されていればスキップ if (list.Any(x => x.Text == fname)) { continue; } // リストに追加 list.Add(new ListBoxItem <ItemKind>(fname, "" + i) { ListItemObject = ItemKind.Pilot, }); } // 付加・強化されたパイロット用特殊能力 foreach (var cond in currentUnit.Conditions) { // パイロット能力付加または強化? if (Strings.Right(cond.Name, 3) != "付加2" && Strings.Right(cond.Name, 3) != "強化2") { continue; } var ftype = Strings.Left(cond.Name, Strings.Len(cond.Name) - 3); // 非表示の能力? switch (GeneralLib.LIndex(cond.StrData, 1) ?? "") { case "非表示": case "解説": continue; } // 有効時間が残っている? if (!cond.IsEnable) { continue; } // 表示名称 var fname = currentUnit.MainPilot().SkillName(ftype); if (Strings.InStr(fname, "非表示") > 0) { continue; } // 既に表示していればスキップ if (list.Any(x => x.Text == fname)) { continue; } // リストに追加 list.Add(new ListBoxItem <ItemKind>(fname, ftype) { ListItemObject = ItemKind.Pilot, }); } // ユニット用特殊能力 // 付加された特殊能力より先に固有の特殊能力を表示 foreach (var i in Enumerable.Range( currentUnit.AdditionalFeaturesNum + 1, currentUnit.AllFeatures.Count - currentUnit.AdditionalFeaturesNum) .AppendRange(Enumerable.Range(1, currentUnit.AdditionalFeaturesNum))) { var fd = currentUnit.AllFeature(i); var fname = fd.FeatureName(currentUnit); // 非表示の特殊能力を排除 if (string.IsNullOrEmpty(fname)) { continue; } // 合体の場合は合体後の形態が作成されていなければならない if (fd.Name == "合体" && !SRC.UList.IsDefined(GeneralLib.LIndex(fd.Data, 2))) { continue; } // 既に表示していればスキップ if (list.Any(x => x.Text == fname)) { continue; } // リストに追加 list.Add(new ListBoxItem <ItemKind>(fname, "" + i) { ListItemObject = ItemKind.Unit, }); } // アビリティで付加・強化されたパイロット用特殊能力 foreach (var cond in currentUnit.Conditions) { // パイロット能力付加または強化? if (Strings.Right(cond.Name, 2) != "付加" && Strings.Right(cond.Name, 2) != "強化") { continue; } var ftype = Strings.Left(cond.Name, Strings.Len(cond.Name) - 2); // 非表示の能力? if (ftype == "メッセージ") { continue; } switch (GeneralLib.LIndex(cond.StrData, 1) ?? "") { case "非表示": case "解説": continue; } // 有効時間が残っている? if (!cond.IsEnable) { continue; } // 表示名称 var fname = currentUnit.MainPilot().SkillName0(ftype); if (string.IsNullOrEmpty(fname)) { continue; } if (Strings.InStr(fname, "非表示") > 0) { continue; } // 付加されたユニット用特殊能力として既に表示していればスキップ if (list.Any(x => x.Text == fname)) { continue; } fname = currentUnit.MainPilot().SkillName(ftype); string fname0; if (Strings.InStr(fname, "Lv") > 0) { fname0 = Strings.Left(fname, Strings.InStr(fname, "Lv") - 1); } else { fname0 = fname; } // パイロット用特殊能力として既に表示していればスキップ if (list.Any(x => x.Text == fname || x.Text == fname0)) { continue; } // リストに追加 list.Add(new ListBoxItem <ItemKind>(fname, ftype) { ListItemObject = ItemKind.Pilot, }); } switch (list.Count) { case 0: break; case 1: { if (SRC.AutoMoveCursor) { GUI.SaveCursorPos(); } var retItem = list.First(); if (retItem.ListItemID == "武器・防具クラス") { Help.FeatureHelp(SelectedUnit, "武器・防具クラス", false); } else if (retItem.ListItemObject == ItemKind.Unit) { Help.FeatureHelp(SelectedUnit, GeneralLib.StrToLng(retItem.ListItemID), GeneralLib.StrToLng(retItem.ListItemID) <= SelectedUnit.AdditionalFeaturesNum); } else { Help.SkillHelp(SelectedUnit.MainPilot(), retItem.ListItemID); } if (SRC.AutoMoveCursor) { GUI.RestoreCursorPos(); } } break; default: { GUI.TopItem = 1; var ret = GUI.ListBox(new ListBoxArgs { lb_caption = "特殊能力一覧", Items = list.Cast <ListBoxItem>().ToList(), lb_info = "能力名", lb_mode = "表示のみ", }); if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ダイアログ"); } while (true) { ret = GUI.ListBox(new ListBoxArgs { lb_caption = "特殊能力一覧", Items = list.Cast <ListBoxItem>().ToList(), lb_info = "能力名", lb_mode = "連続表示", }); GUI.CloseListBox(); if (ret == 0) { break; } var retItem = list[ret - 1]; if (retItem.ListItemID == "武器・防具クラス") { Help.FeatureHelp(SelectedUnit, "武器・防具クラス", false); } else if (retItem.ListItemObject == ItemKind.Unit) { Help.FeatureHelp(SelectedUnit, GeneralLib.StrToLng(retItem.ListItemID), GeneralLib.StrToLng(retItem.ListItemID) <= SelectedUnit.AdditionalFeaturesNum); } else { Help.SkillHelp(SelectedUnit.MainPilot(), retItem.ListItemID); } } if (SRC.AutoMoveCursor) { GUI.RestoreCursorPos(); } break; } } CommandState = "ユニット選択"; GUI.UnlockGUI(); }
// 「変身解除」コマンド private void CancelTransformationCommand() { //// MOD START MARGE //// If MainWidth <> 15 Then //if (GUI.NewGUIMode) //{ // // MOD END MARGE // Status.ClearUnitStatus(); //} GUI.LockGUI(); { var u = SelectedUnit; if (Map.IsStatusView) { // ユニットステータスコマンドの場合 u.Transform(GeneralLib.LIndex(u.FeatureData("ノーマルモード"), 1)); Event.MakeUnitList(smode: ""); Status.DisplayUnitStatus(u.CurrentForm()); GUI.UnlockGUI(); CommandState = "ユニット選択"; return; } string caption, info; if (u.IsHero()) { caption = "変身を解除しますか?"; info = "変身解除"; } else { caption = "特殊モードを解除しますか?"; info = "特殊モード解除"; } var confirmRes = GUI.Confirm(caption, info, GuiConfirmOption.OkCancel | GuiConfirmOption.Question); if (confirmRes == GuiDialogResult.Cancel) { GUI.UnlockGUI(); CancelCommand(); return; } u.Transform(GeneralLib.LIndex(u.FeatureData("ノーマルモード"), 1)); SelectedUnit = Map.MapDataForUnit[u.x, u.y]; } // カーソル自動移動 if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ユニット選択", SelectedUnit); } Status.DisplayUnitStatus(SelectedUnit); GUI.RedrawScreen(); // 変形イベント Event.HandleEvent("変形", SelectedUnit.MainPilot().ID, SelectedUnit.Name); SRC.IsScenarioFinished = false; SRC.IsCanceled = false; CommandState = "ユニット選択"; GUI.UnlockGUI(); }
// アイテムが使用可能か? public bool IsAvailable(ref Unit u) { bool IsAvailableRet = default; short j, i, k; string iclass; string sname, fdata; IsAvailableRet = false; // イベントコマンド「Disable」 string argvname = "Disable(" + Name + ")"; if (Expression.IsGlobalVariableDefined(ref argvname)) { return(IsAvailableRet); } // 装備個所に適合しているか switch (Part() ?? "") { case "片手": case "両手": case "盾": { object argIndex1 = "装備個所"; if (Strings.InStr(u.FeatureData(ref argIndex1), "腕") == 0) { return(IsAvailableRet); } break; } case "肩": case "両肩": { object argIndex2 = "装備個所"; if (Strings.InStr(u.FeatureData(ref argIndex2), "肩") == 0) { return(IsAvailableRet); } break; } case "体": { object argIndex3 = "装備個所"; if (Strings.InStr(u.FeatureData(ref argIndex3), "体") == 0) { return(IsAvailableRet); } break; } case "頭": { object argIndex4 = "装備個所"; if (Strings.InStr(u.FeatureData(ref argIndex4), "頭") == 0) { return(IsAvailableRet); } break; } } // 武器クラス or 防具クラスに属しているか? switch (Part() ?? "") { case "武器": case "片手": case "両手": { iclass = u.WeaponProficiency() + " 固定 汎用"; var loopTo = GeneralLib.LLength(ref iclass); for (i = 1; i <= loopTo; i++) { if ((Class0() ?? "") == (GeneralLib.LIndex(ref iclass, i) ?? "")) { IsAvailableRet = true; break; } } break; } case "盾": case "体": case "頭": { iclass = u.ArmorProficiency() + " 固定 汎用"; var loopTo1 = GeneralLib.LLength(ref iclass); for (i = 1; i <= loopTo1; i++) { if ((Class0() ?? "") == (GeneralLib.LIndex(ref iclass, i) ?? "")) { IsAvailableRet = true; break; } } break; } default: { // その他のアイテムは常に利用可能 IsAvailableRet = true; break; } } if (!IsAvailableRet) { return(IsAvailableRet); } // 技能チェックが必要? string argfname = "必要技能"; string argfname1 = "不必要技能"; if (!IsFeatureAvailable(ref argfname) & !IsFeatureAvailable(ref argfname1)) { return(IsAvailableRet); } // 必要技能をチェック var loopTo2 = CountFeature(); for (i = 1; i <= loopTo2; i++) { object argIndex15 = i; switch (Feature(ref argIndex15) ?? "") { case "必要技能": { string localFeatureData1() { object argIndex1 = i; var ret = FeatureData(ref argIndex1); return(ret); } bool localIsNecessarySkillSatisfied() { string argnabilities = hs6a6e2af77d324e3587224eb7d4498ee9(); Pilot argp = null; var ret = u.IsNecessarySkillSatisfied(ref argnabilities, p: ref argp); return(ret); } if (!localIsNecessarySkillSatisfied()) { // アイテム自身により必要技能に指定された能力が封印されていた場合は // 必要技能を満たしていると判定させるため、チェックする必要がある。 var loopTo3 = u.CountItem(); for (j = 1; j <= loopTo3; j++) { Item localItem() { object argIndex1 = j; var ret = u.Item(ref argIndex1); return(ret); } if (ReferenceEquals(this, localItem())) { break; } } if (j > u.CountItem()) { // 既に装備しているのでなければ装備しない IsAvailableRet = false; return(IsAvailableRet); } if (u.CountPilot() > 0) { string localFeatureData() { object argIndex1 = i; var ret = FeatureData(ref argIndex1); return(ret); } string argsname = localFeatureData(); sname = u.MainPilot().SkillType(ref argsname); } else { object argIndex5 = i; sname = FeatureData(ref argIndex5); } // 必要技能が「~装備」? if (Strings.Right(sname, 2) == "装備") { if ((Strings.Left(sname, Strings.Len(sname) - 2) ?? "") == (Name ?? "") | (Strings.Left(sname, Strings.Len(sname) - 2) ?? "") == (Class0() ?? "")) { goto NextLoop; } } // 封印する能力が必要技能になっている? var loopTo4 = CountFeature(); for (j = 1; j <= loopTo4; j++) { object argIndex6 = j; switch (Feature(ref argIndex6) ?? "") { case "パイロット能力付加": case "パイロット能力強化": { break; } default: { goto NextLoop1; break; } } // 封印する能力名 object argIndex7 = j; fdata = FeatureData(ref argIndex7); if (Strings.Left(fdata, 1) == "\"") { fdata = Strings.Mid(fdata, 2, Strings.Len(fdata) - 2); } if (Strings.InStr(fdata, "=") > 0) { fdata = Strings.Left(fdata, Strings.InStr(fdata, "=") - 1); } // 必要技能と封印する能力が一致している? if ((fdata ?? "") == (sname ?? "")) { goto NextLoop; } if (u.CountPilot() > 0) { object argIndex9 = fdata; if (SRC.ALDList.IsDefined(ref argIndex9)) { object argIndex8 = fdata; { var withBlock = SRC.ALDList.Item(ref argIndex8); var loopTo5 = withBlock.Count; for (k = 1; k <= loopTo5; k++) { if ((withBlock.get_AliasType(k) ?? "") == (sname ?? "")) { goto NextLoop; } } } } else if ((u.MainPilot().SkillType(ref fdata) ?? "") == (sname ?? "")) { goto NextLoop; } } NextLoop1: ; } // 必要技能が満たされていなかった IsAvailableRet = false; return(IsAvailableRet); } break; } case "不必要技能": { string localFeatureData3() { object argIndex1 = i; var ret = FeatureData(ref argIndex1); return(ret); } string argnabilities = localFeatureData3(); Pilot argp = null; if (u.IsNecessarySkillSatisfied(ref argnabilities, p: ref argp)) { // アイテム自身により不必要技能が満たされている場合は不必要技能を // 無視させるため、チェックする必要がある。 var loopTo6 = u.CountItem(); for (j = 1; j <= loopTo6; j++) { Item localItem1() { object argIndex1 = j; var ret = u.Item(ref argIndex1); return(ret); } if (ReferenceEquals(this, localItem1())) { break; } } if (j > u.CountItem()) { // 既に装備しているのでなければ装備しない IsAvailableRet = false; return(IsAvailableRet); } if (u.CountPilot() > 0) { string localFeatureData2() { object argIndex1 = i; var ret = FeatureData(ref argIndex1); return(ret); } string argsname1 = localFeatureData2(); sname = u.MainPilot().SkillType(ref argsname1); } else { object argIndex10 = i; sname = FeatureData(ref argIndex10); } // 不必要技能が「~装備」? if (Strings.Right(sname, 2) == "装備") { if ((Strings.Left(sname, Strings.Len(sname) - 2) ?? "") == (Name ?? "") | (Strings.Left(sname, Strings.Len(sname) - 2) ?? "") == (Class0() ?? "")) { goto NextLoop; } } // 付加する能力が不必要技能になっている? var loopTo7 = CountFeature(); for (j = 1; j <= loopTo7; j++) { object argIndex11 = j; switch (Feature(ref argIndex11) ?? "") { case "パイロット能力付加": case "パイロット能力強化": { break; } default: { goto NextLoop2; break; } } // 付加する能力名 object argIndex12 = j; fdata = FeatureData(ref argIndex12); if (Strings.Left(fdata, 1) == "\"") { fdata = Strings.Mid(fdata, 2, Strings.Len(fdata) - 2); } if (Strings.InStr(fdata, "=") > 0) { fdata = Strings.Left(fdata, Strings.InStr(fdata, "=") - 1); } // 必要技能と付加する能力が一致している? if ((fdata ?? "") == (sname ?? "")) { goto NextLoop; } if (u.CountPilot() > 0) { object argIndex14 = fdata; if (SRC.ALDList.IsDefined(ref argIndex14)) { object argIndex13 = fdata; { var withBlock1 = SRC.ALDList.Item(ref argIndex13); var loopTo8 = withBlock1.Count; for (k = 1; k <= loopTo8; k++) { if ((withBlock1.get_AliasType(k) ?? "") == (sname ?? "")) { goto NextLoop; } } } } else if ((u.MainPilot().SkillType(ref fdata) ?? "") == (sname ?? "")) { goto NextLoop; } } NextLoop2: ; } // 不必要技能が満たされていた IsAvailableRet = false; return(IsAvailableRet); } break; } } NextLoop: ; } return(IsAvailableRet); }
// 「分離」コマンド private void SplitCommand() { string uname, tname, fname; //// MOD START MARGE //// If MainWidth <> 15 Then //if (GUI.NewGUIMode) //{ // // MOD END MARGE // Status.ClearUnitStatus(); //} GUI.LockGUI(); if (Map.IsStatusView) { // ユニットステータスコマンドの場合 // 分離を実施 { var u = SelectedUnit; if (u.IsFeatureAvailable("パーツ分離")) { tname = GeneralLib.LIndex(u.FeatureData("パーツ分離"), 2); u.Transform(tname); } else { u.Split(); } SRC.UList.CheckAutoHyperMode(); SRC.UList.CheckAutoNormalMode(); Status.DisplayUnitStatus(Map.MapDataForUnit[u.x, u.y]); } // ユニットリストの表示を更新 Event.MakeUnitList(smode: ""); // コマンドを終了 CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } { var u = SelectedUnit; if (u.IsFeatureAvailable("パーツ分離")) { // パーツ分離を行う場合 var confirmRes = GUI.Confirm("パーツを分離しますか?", "パーツ分離", GuiConfirmOption.OkCancel | GuiConfirmOption.Question); if (confirmRes == GuiDialogResult.Cancel) { GUI.UnlockGUI(); CancelCommand(); return; } tname = GeneralLib.LIndex(u.FeatureData("パーツ分離"), 2); if (!u.OtherForm(tname).IsAbleToEnter(u.x, u.y)) { GUI.Confirm("この地形では分離できません", "分離", GuiConfirmOption.Ok); GUI.UnlockGUI(); CancelCommand(); return; } // BGM変更 if (u.IsFeatureAvailable("分離BGM")) { var BGM = Sound.SearchMidiFile(u.FeatureData("分離BGM")); if (Strings.Len(BGM) > 0) { Sound.StartBGM(u.FeatureData("分離BGM")); GUI.Sleep(500); } } fname = u.FeatureName("パーツ分離"); // メッセージを表示 SelectedUnit.PilotMassageIfDefined(new string[] { "分離(" + u.Name + ")", "分離(" + fname + ")", "分離", }); // アニメ表示 SelectedUnit.PlayAnimation(new string[] { "分離(" + u.Name + ")", "分離(" + fname + ")", "分離", }); // パーツ分離 uname = u.Name; u.Transform(tname); SelectedUnit = Map.MapDataForUnit[u.x, u.y]; Status.DisplayUnitStatus(SelectedUnit); } else { // 通常の分離を行う場合 var confirmRes = GUI.Confirm("分離しますか?", "分離", GuiConfirmOption.OkCancel | GuiConfirmOption.Question); if (confirmRes == GuiDialogResult.Cancel) { GUI.UnlockGUI(); CancelCommand(); return; } // BGM変更 if (u.IsFeatureAvailable("分離BGM")) { var BGM = Sound.SearchMidiFile(u.FeatureData("分離BGM")); if (Strings.Len(BGM) > 0) { Sound.StartBGM(u.FeatureData("分離BGM")); GUI.Sleep(500); } } fname = u.FeatureName("分離"); // メッセージを表示 SelectedUnit.PilotMassageIfDefined(new string[] { "分離(" + u.Name + ")", "分離(" + fname + ")", "分離", }); // アニメ表示 SelectedUnit.PlayAnimation(new string[] { "分離(" + u.Name + ")", "分離(" + fname + ")", "分離", }); // 分離 uname = u.Name; u.Split(); // 選択ユニットを再設定 SelectedUnit = SRC.UList.Item(GeneralLib.LIndex(u.FeatureData("分離"), 2)); Status.DisplayUnitStatus(SelectedUnit); } } // 分離イベント Event.HandleEvent("分離", SelectedUnit.MainPilot().ID, uname); if (SRC.IsScenarioFinished) { SRC.IsScenarioFinished = false; Status.ClearUnitStatus(); GUI.RedrawScreen(); CommandState = "ユニット選択"; GUI.UnlockGUI(); return; } SRC.IsCanceled = false; // カーソル自動移動 if (SRC.AutoMoveCursor) { GUI.MoveCursorPos("ユニット選択", SelectedUnit); } // ハイパーモード&ノーマルモードの自動発動チェック SRC.UList.CheckAutoHyperMode(); SRC.UList.CheckAutoNormalMode(); CommandState = "ユニット選択"; GUI.UnlockGUI(); // XXX RedrawScreen 元はしてなかった気がする GUI.RedrawScreen(); }