| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | using LitJson; |
| | | |
| | | using UnityEngine; |
| | | public class AutoFightModel : GameSystemManager<AutoFightModel> |
| | | { |
| | | public int fightSpeed = 1; //战斗倍数:值越大越快,影响战斗表现,掉落速度等 |
| | | //战斗倍数:值越大越快,影响战斗表现,掉落速度等 |
| | | public int fightSpeed |
| | | { |
| | | get |
| | | { |
| | | int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Speed, 0); |
| | | return Math.Min(Math.Max(value, 1), maxSpeed); |
| | | } |
| | | set |
| | | { |
| | | QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Speed, value); |
| | | } |
| | | } |
| | | |
| | | public bool isAutoAttack; //自动攻击 |
| | | //消耗倍数 |
| | | public int fightCost |
| | | { |
| | | get |
| | | { |
| | | int value = QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.AutoFight_Cost, 0); |
| | | return Math.Min(Math.Max(value, 1), maxCost); |
| | | } |
| | | set |
| | | { |
| | | QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Cost, value); |
| | | } |
| | | } |
| | | |
| | | //自动模式, 真正点击战锤消耗开启,和休息(或无材料)停止 |
| | | public bool isPause = false; //如打BOSS的情况,暂停自动战斗 后续可以补充每X秒检测下是否有异常 |
| | | bool m_IsAutoAttack = false; |
| | | public bool isAutoAttack |
| | | { |
| | | get |
| | | { |
| | | return m_IsAutoAttack; |
| | | } |
| | | set |
| | | { |
| | | if (m_IsAutoAttack == value) |
| | | return; |
| | | m_IsAutoAttack = value; |
| | | Debug.Log("isAutoAttack:" + m_IsAutoAttack); |
| | | } |
| | | } |
| | | |
| | | //是否开启自动战斗设置 |
| | | public bool isAutoAttackSet |
| | | { |
| | | get |
| | | { |
| | | return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_Open, 0); |
| | | } |
| | | set |
| | | { |
| | | QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Open, value); |
| | | } |
| | | } |
| | | |
| | | //更好装备停止战斗 |
| | | public bool isStopFightByBetterEquip |
| | | { |
| | | get |
| | | { |
| | | return QuickSetting.Instance.GetQuickSettingBool(QuickSettingType.AutoFight_FightPower, 0); |
| | | } |
| | | set |
| | | { |
| | | QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_FightPower, value); |
| | | } |
| | | } |
| | | |
| | | |
| | | public event Action ChangeAutoEvent; |
| | | |
| | | public int maxSpeed = 3; //最高速度 |
| | | public int maxCost; //最高消耗 |
| | | public int[] autoCostWithBlessLV; //自动战斗消耗倍数关联祝福等级 |
| | | public int speed2UnlockMissionID; |
| | | public int speed3UnlockCTGID; |
| | | public override void Init() |
| | | { |
| | | ParseConfig(); |
| | | DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerInit; |
| | | BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField; |
| | | |
| | | EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast); |
| | | |
| | | } |
| | | |
| | | public override void Release() |
| | | { |
| | | BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField; |
| | | DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit; |
| | | |
| | | |
| | | } |
| | | |
| | | void ParseConfig() |
| | | { |
| | | var config = FuncConfigConfig.Get("AutoGuaji"); |
| | | autoCostWithBlessLV = JsonMapper.ToObject<int[]>(config.Numerical1); |
| | | speed2UnlockMissionID = int.Parse(config.Numerical2); |
| | | speed3UnlockCTGID = int.Parse(config.Numerical3); |
| | | maxCost = autoCostWithBlessLV.Length; |
| | | } |
| | | |
| | | |
| | | void BeforePlayerInit() |
| | | { |
| | | fightingHeroSkinID = 0; |
| | | heroGuid = ""; |
| | | } |
| | | |
| | | public void SaveAutoFightSetting() |
| | | { |
| | | if (PlayerDatas.Instance.baseData.UseHarmerCount != fightCost) |
| | | { |
| | | PlayerDatas.Instance.baseData.UseHarmerCount = fightCost; |
| | | BattleManager.Instance.MainFightRequest(1, (uint)fightCost); |
| | | } |
| | | |
| | | StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField; |
| | | |
| | | if (storyBattleField != null && storyBattleField.GetBattleMode() != BattleMode.Stop) |
| | | { |
| | | //战斗中改变模式 |
| | | isAutoAttack = isAutoAttackSet; |
| | | storyBattleField.AutoSetBattleMode(); |
| | | } |
| | | |
| | | QuickSetting.Instance.SendPackage(); |
| | | ChangeAutoEvent?.Invoke(); |
| | | } |
| | | |
| | | |
| | | //自动处理装备,需要等待穿戴返回false,其他情况返回true |
| | | public bool TryAutoFightDoEquip(ItemModel item) |
| | | { |
| | | if (!isAutoAttack) |
| | | return false; |
| | | |
| | | if (item == null) |
| | | return true; |
| | | |
| | | long showFightPower = FightPowerManager.Instance.GetFightPowerChange(item); |
| | | |
| | | if (showFightPower < 0) |
| | | { |
| | | EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | if (isStopFightByBetterEquip) |
| | | return false; |
| | | |
| | | EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)item.gridIndex }, 1); |
| | | return true; |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | #region 主线战斗(自动和手动) |
| | | |
| | | public void StartFight() |
| | | { |
| | | if (isAutoAttack) |
| | | return; |
| | | |
| | | StoryBattleField storyBattleField = BattleManager.Instance.storyBattleField; |
| | | if (storyBattleField == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (!UIHelper.CheckMoneyCount(41, PlayerDatas.Instance.baseData.UseHarmerCount, 2)) |
| | | { |
| | | if (storyBattleField.GetBattleMode() != BattleMode.Stop) |
| | | storyBattleField.HaveRest(); |
| | | return; |
| | | } |
| | | |
| | | |
| | | isAutoAttack = isAutoAttackSet; |
| | | |
| | | //手动会一直进入这个逻辑, 自动触发一次 |
| | | storyBattleField.AutoSetBattleMode(); |
| | | storyBattleField.operationAgent.DoNext(); |
| | | } |
| | | |
| | | void OnCreateBattleField(string guid, BattleField battleField) |
| | | { |
| | | if (string.IsNullOrEmpty(guid) && BattleManager.Instance.storyBattleField != null) |
| | | { |
| | | BattleManager.Instance.storyBattleField.ChangeBattleModeEvent -= ChangeBattleModeEvent; |
| | | BattleManager.Instance.storyBattleField.ChangeBattleModeEvent += ChangeBattleModeEvent; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | void ChangeBattleModeEvent(BattleMode _battleMode) |
| | | { |
| | | if (_battleMode == BattleMode.Stop) |
| | | { |
| | | isAutoAttack = false; |
| | | } |
| | | OnFightEvent?.Invoke(false); |
| | | } |
| | | |
| | | public int fightingHeroSkinID; //当前战斗的英雄皮肤ID |
| | | public string heroGuid; //战斗中的武将 |
| | | public event Action<bool> OnFightEvent; //战斗模式变更通知 战斗释放技能通知 |
| | | |
| | | |
| | | /// <summary> |
| | | /// 技能释放 通知UI处理 |
| | | /// </summary> |
| | | /// <param name="guid">空为主线</param> |
| | | /// <param name="skillConfig">用于怒气等显示</param> |
| | | /// <param name="teamHero">战斗中的武将</param> |
| | | void OnSkillCast(string guid, SkillConfig skillConfig, TeamHero teamHero) |
| | | { |
| | | if (!string.IsNullOrEmpty(guid)) |
| | | return; |
| | | |
| | | //防范回收报错 |
| | | if (teamHero == null) |
| | | return; |
| | | |
| | | //只通知玩家武将的战斗 |
| | | if (teamHero.NPCID != 0) |
| | | return; |
| | | |
| | | fightingHeroSkinID = teamHero.SkinID; |
| | | //战斗时没有GUID ,通过heroid查找 |
| | | var hero = TeamManager.Instance.GetTeam(TeamType.Story).GetHeroByHeroID(teamHero.heroId); |
| | | if (hero != null) |
| | | { |
| | | heroGuid = hero.guid; |
| | | } |
| | | else |
| | | { |
| | | heroGuid = ""; |
| | | } |
| | | OnFightEvent?.Invoke(true); |
| | | } |
| | | |
| | | public bool CanChallengeBoss() |
| | | { |
| | | //最后一波通过,且当前波还是最后一波;倒退只倒退波不会倒退关卡 |
| | | if (PlayerDatas.Instance.baseData.ExAttr2 != PlayerDatas.Instance.baseData.ExAttr1) |
| | | { |
| | | return false; |
| | | } |
| | | var value = PlayerDatas.Instance.baseData.ExAttr2; |
| | | var chapterID = value / 10000; |
| | | var levelNum = value % 10000 / 100; |
| | | var waveID = value % 100; |
| | | |
| | | var config = MainLevelConfig.GetMainLevelConfig(chapterID, levelNum); |
| | | if (waveID < MainLevelConfig.GetwaveCount(config)) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | } |