| | |
| | | // 除道具解锁外,其他方式暂默认永久 |
| | | // 1 - 默认解锁,即创角就可用的 |
| | | // 2 - 道具解锁,支持时效、升级, Value配物品ID |
| | | // 3 - 关联武将解锁,Value配武将ID |
| | | public bool IsUnlock(PhantasmPavilionType type, int id) |
| | | { |
| | | // 配置表中不存在,视为未解锁 |
| | | if (!Has(type, id)) |
| | | return false; |
| | | if (!Has(type, id)) return false; |
| | | |
| | | int unlockWayValue = GetUnlockWay(type, id); |
| | | int unlockValue = GetUnlockValue(type, id); |
| | | // 解锁方式无效 |
| | | if (!Enum.IsDefined(typeof(PhantasmPavilionUnlockWay), unlockWayValue)) |
| | | return false; |
| | | var unlockWay = (PhantasmPavilionUnlockWay)unlockWayValue; |
| | | |
| | | switch (unlockWay) |
| | | if (unlockWayValue == 1) return true; // 1 - 默认解锁 |
| | | |
| | | if (unlockWayValue == 2) // 2 - 道具解锁 |
| | | { |
| | | case PhantasmPavilionUnlockWay.Activate: |
| | | return true; |
| | | case PhantasmPavilionUnlockWay.Hero: |
| | | bool hasHero = HeroManager.Instance.HasHero(unlockValue); |
| | | return hasHero; |
| | | case PhantasmPavilionUnlockWay.Item: |
| | | // 封包里没有 |
| | | if (!TryGetInfo(type, id, out var info)) |
| | | return false; |
| | | // 玩家数据中的状态是“未激活” |
| | | if (!info.State) |
| | | return false; |
| | | // 是否为“已过期的道具” |
| | | if (IsExpired(info, unlockWay)) |
| | | return false; |
| | | return true; |
| | | case PhantasmPavilionUnlockWay.Skin: |
| | | bool hasSkin = HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue); |
| | | return hasSkin; |
| | | case PhantasmPavilionUnlockWay.Model: |
| | | // 如果对应的形象已解锁,则该头像也解锁 |
| | | return IsUnlock(PhantasmPavilionType.Model, unlockValue); |
| | | default: |
| | | return false; |
| | | if (!TryGetInfo(type, id, out var info)) return false; |
| | | if (!info.State) return false; |
| | | if (IsExpired(info, PhantasmPavilionUnlockWay.Item)) return false; |
| | | return true; |
| | | } |
| | | |
| | | // 3、4、5及以上全部交给分发函数按表格类型独立处理 |
| | | return CheckTableSpecificUnlock(type, unlockWayValue, unlockValue); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获得当前状态 |
| | | /// </summary> |
| | | /// <returns>0 - 未激活, 1 - 可激活, 2 - 已激活</returns> |
| | | public PhantasmPavilionState GetUnLockState(PhantasmPavilionType type, int id) |
| | | { |
| | | // 配置表中不存在,视为“未激活” |
| | | if (!Has(type, id)) |
| | | return PhantasmPavilionState.Locked; |
| | | if (!Has(type, id)) return PhantasmPavilionState.Locked; |
| | | |
| | | // 已经解锁 |
| | | if (IsUnlock(type, id)) |
| | | return PhantasmPavilionState.Activated; |
| | | // 如果已经满足解锁条件,直接返回 Activated |
| | | if (IsUnlock(type, id)) return PhantasmPavilionState.Activated; |
| | | |
| | | // 运行到这里,说明物品是“未激活”或“已过期”状态 (IsUnlock 返回 false) |
| | | // 无效的解锁方式 |
| | | int unlockWayValue = GetUnlockWay(type, id); |
| | | if (!Enum.IsDefined(typeof(PhantasmPavilionUnlockWay), unlockWayValue)) |
| | | return PhantasmPavilionState.Locked; |
| | | |
| | | var unlockWay = (PhantasmPavilionUnlockWay)unlockWayValue; |
| | | int unlockValue = GetUnlockValue(type, id); |
| | | |
| | | switch (unlockWay) |
| | | // 只有道具解锁(2)存在"未激活但材料足够"的特有中间状态 |
| | | if (unlockWayValue == 2) |
| | | { |
| | | // 检查道具激活条件 |
| | | case PhantasmPavilionUnlockWay.Item: |
| | | return CheckCanActivateByItem(type, id, unlockValue) |
| | | ? PhantasmPavilionState.CanActivate |
| | | : PhantasmPavilionState.Locked; |
| | | // 检查武将激活条件 |
| | | case PhantasmPavilionUnlockWay.Hero: |
| | | int heroID = unlockValue; |
| | | return HeroManager.Instance.HasHero(heroID) |
| | | ? PhantasmPavilionState.Activated |
| | | : PhantasmPavilionState.Locked; |
| | | case PhantasmPavilionUnlockWay.Skin: |
| | | return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue) |
| | | ? PhantasmPavilionState.Activated |
| | | : PhantasmPavilionState.Locked; |
| | | case PhantasmPavilionUnlockWay.Model: |
| | | return IsUnlock(PhantasmPavilionType.Model, unlockValue) |
| | | ? PhantasmPavilionState.Activated |
| | | : PhantasmPavilionState.Locked; |
| | | default: |
| | | return PhantasmPavilionState.Locked; |
| | | return CheckCanActivateByItem(type, id, unlockValue) |
| | | ? PhantasmPavilionState.CanActivate |
| | | : PhantasmPavilionState.Locked; |
| | | } |
| | | |
| | | // 其他关联解锁如果不满足 IsUnlock,则必定是 Locked 状态 |
| | | return PhantasmPavilionState.Locked; |
| | | } |
| | | |
| | | |
| | | // 检查是否满足“通过道具激活”的条件 |
| | | private bool CheckCanActivateByItem(PhantasmPavilionType type, int id, int itemId) |
| | |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据所属表格(Type)解析 UnlockWay 的特定含义并判断是否满足条件 (排除 UnlockWay 1 和 2) |
| | | /// </summary> |
| | | public bool CheckTableSpecificUnlock(PhantasmPavilionType type, int unlockWay, int unlockValue) |
| | | { |
| | | switch (type) |
| | | { |
| | | case PhantasmPavilionType.Face: |
| | | // 头像表独有的 UnlockWay 解析规则 |
| | | if (unlockWay == 3) return HeroManager.Instance.HasHero(unlockValue); |
| | | if (unlockWay == 4) return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue); |
| | | if (unlockWay == 5) return IsUnlock(PhantasmPavilionType.Model, unlockValue); // 关联形象 |
| | | break; |
| | | |
| | | case PhantasmPavilionType.FacePic: |
| | | case PhantasmPavilionType.ChatBox: |
| | | case PhantasmPavilionType.Title: |
| | | case PhantasmPavilionType.Model: |
| | | // 其他表目前的共有解析规则 |
| | | if (unlockWay == 3) return HeroManager.Instance.HasHero(unlockValue); |
| | | if (unlockWay == 4) return HeroUIManager.Instance.IsHeroSkinActive(HeroConfig.GetHeroIDBySkinID(unlockValue), unlockValue); |
| | | break; |
| | | } |
| | | return false; |
| | | } |
| | | public void CheckTimeOut() |
| | | { |
| | | bool isTimeOut = false; |