using System; using System.Collections; using System.Collections.Generic; using System.Text; using LitJson; using UnityEngine; public class AutoFightModel : GameSystemManager { //战斗倍数:值越大越快,影响战斗表现,掉落速度等 public int fightSpeed { get { int value = QuickSetting.Instance.GetQuickSettingValue(QuickSettingType.AutoFight_Speed, 0); return Math.Min(Math.Max(value, 1), maxSpeed); } set { QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_Speed, value); } } //消耗倍数 public int fightCost { get { int value = QuickSetting.Instance.GetQuickSettingValue(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(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(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 (!ItemLogicUtility.CheckCurrencyCount(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 OnFightEvent; //战斗模式变更通知 战斗释放技能通知 /// /// 技能释放 通知UI处理 /// /// 空为主线 /// 用于怒气等显示 /// 战斗中的武将 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 }