using System; using UnityEngine; /// /// 机器人AI配置 — 本地测试用 Inspector 调节,后续从后端 GameConfig / RoomChangeResponse 下发 /// public class BotConfig { [Header("全局")] [Tooltip("机器人总开关")] public bool enabled = true; [Tooltip("AI状态: active=正常 | idle=待机 | aggressive=激进")] public string aiState = "active"; [Tooltip("爆率因子: 1.0=正常, >1容易杀, <1难杀")] public float luckFactor = 1f; [Tooltip("状态刷新间隔(秒), 0=不自动刷新")] public float stateRefreshInterval; [Header("技能配置")] public BotSkillConfig skills = new BotSkillConfig(); [Header("active 状态参数")] public BotBehaviorConfig activeBehavior = new BotBehaviorConfig(); [Header("idle 状态参数")] public BotBehaviorConfig idleBehavior = new BotBehaviorConfig(); [Header("aggressive 状态参数")] public BotBehaviorConfig aggressiveBehavior = new BotBehaviorConfig(); [Header("倍数策略")] public BotMultiplierConfig multiplier = new BotMultiplierConfig(); [Header("Boss策略")] public BotBossStrategyConfig bossStrategy = new BotBossStrategyConfig(); [Header("退出条件")] public BotExitConfig exitCondition = new BotExitConfig(); } /// 机器人倍数(炮台档位)策略配置 [Serializable] public class BotMultiplierConfig { [Tooltip("进场初始炮台档位索引(对应 paoBeiList 的下标, 0=最低档)")] public int initialLevelIndex = 0; [Tooltip("低于此倍数(当前金币/进场金币) → 降档")] public float decreaseThreshold = 0.5f; [Tooltip("高于此倍数(当前金币/进场金币) → 升档")] public float increaseThreshold = 1.5f; [Tooltip("每次调整的档位数")] public int step = 1; [Tooltip("倍数检查间隔(秒)")] public float checkInterval = 3f; [Tooltip("最低保持档位索引(不会降到低于此值)")] public int minLevelIndex = 0; [Tooltip("最高保持档位索引(不会升到高于此值), -1=不限制")] public int maxLevelIndex = -1; } /// 机器人Boss策略配置 [Serializable] public class BotBossStrategyConfig { [Tooltip("视为Boss的鱼类型 (按 FishTypeEnum 的int值)")] public int[] bossFishTypes = { 2, 5 }; // Boss鱼=2, 特殊Boss=5 [Tooltip("无Boss时启用散射乱射模式")] public bool scatterWhenNoBoss = true; [Tooltip("无Boss时定点三发概率(0~1), 否则单射")] [Range(0f, 1f)] public float tripleShotProb = 0.5f; [Tooltip("有Boss时优先锁定最大倍率(赔率)的Boss")] public bool preferMaxMultiplierBoss = true; [Tooltip("Boss数量超过此值 → 开启散射模式")] public int scatterModeThreshold = 3; [Tooltip("Boss数量<=此值时随机狂暴技能概率(0~1)")] [Range(0f, 1f)] public float frenzyProb = 0.6f; [Tooltip("狂暴持续时间下限(秒)")] public float frenzyMinTime = 3f; [Tooltip("狂暴持续时间上限(秒)")] public float frenzyMaxTime = 8f; } /// 机器人退出条件配置 [Serializable] public class BotExitConfig { [Tooltip("金币超过此值时退出(盈利离场), 0=不检测")] public long exitWhenGoldAbove = 0; [Tooltip("金币低于此值时退出(输完离场)")] public long exitWhenGoldBelow = 100; [Tooltip("退出检查间隔(秒)")] public float checkInterval = 5f; [Tooltip("退出时是否发送离房网络消息")] public bool sendLeaveRoom = true; [Tooltip("退出后座位是否显示等待状态(等待下一个机器人)")] public bool showWaitingAfterExit = true; } /// 机器人当前行为模式 public enum BotBehaviorMode { Idle, // 待机(未开始) ScatterRandom, // 散射乱射(无Boss): 随机定点三发或单射 LockBoss, // 锁定Boss ScatterMode, // 散射模式(Boss数量>3) RandomFrenzy, // 随机狂暴(Boss数量<=3) Exited // 已退出 } /// 每个 bot 座位的运行时状态(进场金币/倍数/模式/退出) public class BotRuntimeState { // ===== 进场 ===== [Tooltip("进场时的金币(基准)")] public long entryGold; [Tooltip("进场时间")] public float entryTime; // ===== 倍数 ===== [Tooltip("当前炮台档位索引")] public int currentLevelIndex; [Tooltip("下次倍数检查时间")] public float nextMultiplierCheckTime; // ===== 行为模式 ===== [Tooltip("当前行为模式")] public BotBehaviorMode currentMode = BotBehaviorMode.Idle; [Tooltip("上次Boss检测时间")] public float lastBossCheckTime; // ===== 狂暴(Boss<=3时随机) ===== [Tooltip("狂暴是否激活")] public bool frenzyActive; [Tooltip("狂暴结束时间")] public float frenzyEndTime; // ===== 退出 ===== [Tooltip("下次退出检查时间")] public float nextExitCheckTime; [Tooltip("是否已退出")] public bool hasExited; /// 当前金币相对进场金币的倍数 public float GetGoldRatio(long currentGold) { return entryGold > 0 ? (float)currentGold / entryGold : 0f; } } /// /// 技能概率配置 — 每种技能独立随机,可以同时开多种 /// public class BotSkillConfig { [Header("刷新")] [Tooltip("每隔多少秒重新掷骰子决定技能组合")] public float skillRefreshInterval = 10f; [Space] [Header("锁定 - 自动瞄准最近鱼")] [Range(0f, 1f)] public float lockProb = 0f; public float lockMinTime = 5f; public float lockMaxTime = 20f; [Space] [Header("狂暴 - 开火速度翻倍")] [Range(0f, 1f)] public float frenzyProb = 0.3f; public float frenzyMinTime = 3f; public float frenzyMaxTime = 8f; [Space] [Header("三发散弹 - 一次3发")] [Range(0f, 1f)] public float tripleProb = 0.5f; public float tripleMinTime = 4f; public float tripleMaxTime = 12f; [Space] [Header("双倍炮 - 消耗翻倍")] [Range(0f, 1f)] public float doubleProb = 0f; public float doubleMinTime = 3f; public float doubleMaxTime = 6f; } /// /// 行为参数 — 每个 aiState 一组 /// public class BotBehaviorConfig { [Header("开火")] [Tooltip("开火间隔下限(秒)")] public float fireIntervalMin = 0.3f; [Tooltip("开火间隔上限(秒)")] public float fireIntervalMax = 1.2f; [Tooltip("开火概率(0~1): 每个 interval 触发开火的概率,0.9=经常开火偶尔停顿")] [Range(0f, 1f)] public float fireProb = 0.9f; [Header("旋转")] [Tooltip("炮台旋转速度(度/秒)")] public float rotateSpeed = 80f; [Header("目标")] [Tooltip("锁定保持时间下限(秒)")] public float targetHoldTimeMin = 2f; [Tooltip("锁定保持时间上限(秒)")] public float targetHoldTimeMax = 5f; [Tooltip("超时后切换目标的概率(0~1)")] [Range(0f, 1f)] public float targetSwitchChance = 0.7f; [Tooltip("优先高分鱼: 0=纯距离, 1=纯分数")] [Range(0f, 1f)] public float targetPreferHighScore; [Tooltip("允许打Boss")] public bool canTargetBoss = true; [Tooltip("允许打特殊鱼")] public bool canTargetSpecial = true; } /// /// 每个 bot 座位的技能运行时状态 /// public class BotSkillRuntime { public bool lockActive; public float lockEndTime; public bool frenzyActive; public float frenzyEndTime; public bool tripleActive; public float tripleEndTime; public bool doubleActive; public float doubleEndTime; public float nextRefreshTime; public bool HasAnySkill => lockActive || frenzyActive || tripleActive || doubleActive; }