/// <summary> /// 获得法术定义 /// </summary> /// <param name="worksheet"></param> /// <param name="rowCount"></param> /// <returns></returns> private static void GetAbilityDefine(ref AbilityCard.AbilityDefine Ability, dynamic worksheet, ref int rowCount) { Ability.MainAbilityDefine = GetEffectDefine(worksheet, ref rowCount); //追加效果 String NextLine = worksheet.Cells(rowCount + 1, 2).Text; if (!String.IsNullOrEmpty(NextLine) && NextLine == "追加条件") { rowCount++; //当前行是追加条件 Ability.AppendEffectCondition = worksheet.Cells(rowCount, 3).Text; rowCount++; //当前行是第一效果的标题栏 Ability.AppendAbilityDefine = GetEffectDefine(worksheet, ref rowCount); } }
/// <summary> /// 法术的导入 /// </summary> /// <param name="target"></param> /// <param name="workbook"></param> private void Ability(dynamic workbook) { if (Directory.Exists(XmlFolderPicker.SelectedPathOrFileName + "\\Ability\\")) { Directory.Delete(XmlFolderPicker.SelectedPathOrFileName + "\\Ability\\", true); } Directory.CreateDirectory(XmlFolderPicker.SelectedPathOrFileName + "\\Ability\\"); //法术的导入 dynamic worksheet = workbook.Sheets(2); int rowCount = 4; Engine.Card.AbilityCard Ability; while (!String.IsNullOrEmpty(worksheet.Cells(rowCount, 2).Text)) { //当前行肯定是卡牌基本情报 Ability = new AbilityCard(); Ability.序列号 = worksheet.Cells(rowCount, 2).Text; Ability.名称 = worksheet.Cells(rowCount, 3).Text; Ability.描述 = worksheet.Cells(rowCount, 4).Text; Ability.职业 = CardUtility.GetEnum<Engine.Utility.CardUtility.ClassEnum>(worksheet.Cells(rowCount, 9).Text, Engine.Utility.CardUtility.ClassEnum.中立); Ability.使用成本 = CardUtility.GetInt(worksheet.Cells(rowCount, 10).Text); Ability.过载 = CardUtility.GetInt(worksheet.Cells(rowCount, 11).Text); Ability.是否启用 = true; rowCount++; //当前行肯定是选择条件 Ability.效果选择类型 = CardUtility.GetEnum<AbilityCard.效果选择类型枚举>(worksheet.Cells(rowCount, 3).Text, Engine.Card.AbilityCard.效果选择类型枚举.无需选择); Ability.FirstAbilityDefine.描述 = worksheet.Cells(rowCount, 4).Text; Ability.SecondAbilityDefine.描述 = worksheet.Cells(rowCount, 5).Text; rowCount++; GetAbilityDefine(ref Ability.FirstAbilityDefine, worksheet, ref rowCount); if (Ability.效果选择类型 != Engine.Card.AbilityCard.效果选择类型枚举.无需选择) { rowCount++; //当前行是第一效果的标题栏 GetAbilityDefine(ref Ability.SecondAbilityDefine, worksheet, ref rowCount); } XmlSerializer xml = new XmlSerializer(typeof(Engine.Card.AbilityCard)); String XmlFilename = XmlFolderPicker.SelectedPathOrFileName + "\\Ability\\" + Ability.序列号 + ".xml"; xml.Serialize(new StreamWriter(XmlFilename), Ability); rowCount++; } }
/// <summary> /// 运行法术 /// </summary> /// <param name="ability"></param> /// <param name="ConvertPosDirect"></param> /// <param name="Ability"></param> /// <param name="TargetPosInfo"></param> /// <returns></returns> private List<String> RunAbilityEffect(GameManager game, Boolean ConvertPosDirect, AbilityCard.AbilityDefine Ability) { List<String> Result = new List<string>(); //对象选择处理 if (Ability.MainAbilityDefine.AbliltyPosPicker.EffictTargetSelectMode == CardUtility.TargetSelectModeEnum.指定 || Ability.MainAbilityDefine.AbliltyPosPicker.EffictTargetSelectMode == CardUtility.TargetSelectModeEnum.横扫 || Ability.MainAbilityDefine.AbliltyPosPicker.EffictTargetSelectMode == CardUtility.TargetSelectModeEnum.相邻) { Ability.MainAbilityDefine.AbliltyPosPicker.SelectedPos = game.GetSelectTarget(Ability.MainAbilityDefine.AbliltyPosPicker); } else { if (ConvertPosDirect) { switch (Ability.MainAbilityDefine.AbliltyPosPicker.EffectTargetSelectDirect) { case CardUtility.TargetSelectDirectEnum.本方: Ability.MainAbilityDefine.AbliltyPosPicker.EffectTargetSelectDirect = CardUtility.TargetSelectDirectEnum.对方; break; case CardUtility.TargetSelectDirectEnum.对方: Ability.MainAbilityDefine.AbliltyPosPicker.EffectTargetSelectDirect = CardUtility.TargetSelectDirectEnum.本方; break; case CardUtility.TargetSelectDirectEnum.双方: break; default: break; } } } //取消处理 if (Ability.MainAbilityDefine.AbliltyPosPicker.SelectedPos.Postion == -1) { Result.Clear(); return Result; } //法术伤害对于攻击型效果的加成 if (Ability.MainAbilityDefine.效果条件 == CardUtility.strIgnore && Ability.MainAbilityDefine.EffectCount > 1) { Ability.MainAbilityDefine.EffectCount += game.MyInfo.BattleField.AbilityDamagePlus; } //按照回数执行效果 for (int cnt = 0; cnt < Ability.MainAbilityDefine.EffectCount; cnt++) { //系统法术 switch (Ability.MainAbilityDefine.TrueAtomicEffect.AtomicEffectType) { case AtomicEffectDefine.AtomicEffectEnum.卡牌: case AtomicEffectDefine.AtomicEffectEnum.水晶: case AtomicEffectDefine.AtomicEffectEnum.召唤: case AtomicEffectDefine.AtomicEffectEnum.武器: Result.AddRange(RunGameSystemEffect(game, ConvertPosDirect, Ability.MainAbilityDefine.TrueAtomicEffect, Ability.MainAbilityDefine.AbliltyPosPicker)); break; case AtomicEffectDefine.AtomicEffectEnum.控制: Result.AddRange(ControlEffect.RunEffect(game, Ability.MainAbilityDefine.AbliltyPosPicker.SelectedPos.ToString())); break; default: Result.AddRange(Effecthandler.RunSingleEffect(Ability.MainAbilityDefine, game, GameManager.RandomSeed)); break; } GameManager.RandomSeed++; Result.AddRange(game.Settle()); } //追加条件计算 if (Ability.AppendAbilityDefine == null || (!ExpressHandler.AppendAbilityCondition(game,Ability))) { return Result; } //按照回数执行追加效果 //继承主效果的选定位置信息 Ability.AppendAbilityDefine.AbliltyPosPicker.SelectedPos = Ability.MainAbilityDefine.AbliltyPosPicker.SelectedPos; for (int cnt = 0; cnt < Ability.AppendAbilityDefine.EffectCount; cnt++) { //系统法术 switch (Ability.AppendAbilityDefine.TrueAtomicEffect.AtomicEffectType) { case AtomicEffectDefine.AtomicEffectEnum.卡牌: case AtomicEffectDefine.AtomicEffectEnum.水晶: case AtomicEffectDefine.AtomicEffectEnum.召唤: case AtomicEffectDefine.AtomicEffectEnum.武器: Result.AddRange(RunGameSystemEffect(game, ConvertPosDirect, Ability.AppendAbilityDefine.TrueAtomicEffect, Ability.AppendAbilityDefine.AbliltyPosPicker)); break; case AtomicEffectDefine.AtomicEffectEnum.控制: Result.AddRange(ControlEffect.RunEffect(game, Ability.AppendAbilityDefine.AbliltyPosPicker.SelectedPos.ToString())); break; default: Result.AddRange(Effecthandler.RunSingleEffect(Ability.AppendAbilityDefine, game, GameManager.RandomSeed)); break; } GameManager.RandomSeed++; Result.AddRange(game.Settle()); } return Result; }