1
This commit is contained in:
@@ -3893,35 +3893,48 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ SuoDing 面板关闭时应用勾选结果(由 SuoDingPanel.OnHide 回调):
|
||||
/// 1. 打开锁定开关(toggle_Lock)
|
||||
/// 2. 直接激活自动锁定(跳过"先手动锁定一条鱼"的前提)
|
||||
/// 3. 有勾选 → 进入"图鉴锁定"模式:之后的锁定只从勾选的鱼里选目标
|
||||
/// ⭐ 一个都没勾 → 不进入图鉴模式(白名单不生效),等同于正常锁定,不会干扰正常玩法。
|
||||
/// 白名单(selectedSet)由面板 Toggle 实时同步;自动锁定仍按原有优先级
|
||||
/// ⭐ 图鉴/锁定面板关闭时应用勾选结果:
|
||||
/// 1. 一条都没勾选 → **不开启锁定功能**(锁定开关/图鉴模式/自动锁定全部保持原样,直接返回)
|
||||
/// 2. 有勾选 → 打开锁定开关 + 激活自动锁定 + 进入"图鉴锁定"模式(之后只锁勾选的鱼)
|
||||
/// 白名单由面板勾选列表实时同步;自动锁定仍按原有优先级
|
||||
/// (特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼)只从选中的鱼里选目标,选中的鱼死光则不锁定。
|
||||
/// </summary>
|
||||
public void ApplySuoDingSelection()
|
||||
{
|
||||
// ⭐ 一条都没勾选 → 不开启锁定功能:不碰锁定开关、不进图鉴模式、不激活自动锁定
|
||||
if (!HasSuoDingSelection())
|
||||
{
|
||||
_suoDingMode = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// 打开锁定开关(已打开则不变;关闭时 onValueChanged 的重置逻辑只在 !on 分支,不受影响)
|
||||
if (toggle_Lock != null && !toggle_Lock.isOn)
|
||||
toggle_Lock.isOn = true;
|
||||
|
||||
// ⭐ 有勾选才算"图鉴锁定"模式(默认全不选 → 保持正常锁定)
|
||||
var panel = subUIManager.Get<SuoDingPanel>(UIPanel.GameSuoDing);
|
||||
_suoDingMode = panel != null && panel.HasSelection;
|
||||
// ⭐ 有勾选 → 进入"图鉴锁定"模式:之后的锁定只从勾选的鱼里选目标
|
||||
_suoDingMode = true;
|
||||
|
||||
// ⭐ 面板选完即应用:自动锁定立即开始找目标
|
||||
_autoLockActivated = true;
|
||||
// ⭐ 三发模式:退出"等手动点击"状态,允许重新按勾选建位
|
||||
_tripleLockWaitManual = false;
|
||||
|
||||
// ⭐ 只有进入图鉴模式时,才把当前手动锁定的目标转为自动锁定(交给白名单筛选);
|
||||
// 正常锁定(没勾选)保持手动锁定不动,避免把玩家点的鱼放掉
|
||||
if (_suoDingMode && currSitData != null && currSitData.isManualLock)
|
||||
// ⭐ 进入图鉴模式后,把当前手动锁定的目标转为自动锁定(交给白名单筛选)
|
||||
if (currSitData != null && currSitData.isManualLock)
|
||||
currSitData.isManualLock = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ 图鉴/锁定面板当前是否勾选了至少一条鱼(决定关闭面板时是否开启锁定功能)。
|
||||
/// 通用 = 通用 SuoDing 面板的勾选;XJMH 覆写为原版 PW_SetLock 面板的勾选列表。
|
||||
/// </summary>
|
||||
protected virtual bool HasSuoDingSelection()
|
||||
{
|
||||
var panel = subUIManager.Get<SuoDingPanel>(UIPanel.GameSuoDing);
|
||||
return panel != null && panel.HasSelection;
|
||||
}
|
||||
|
||||
private void HandleAutoLock()
|
||||
{
|
||||
// ⭐ 退出倒计时期间屏蔽本地玩家自动锁定,其他玩家和机器人不受影响
|
||||
|
||||
@@ -8,7 +8,8 @@ using UnityEngine.UI;
|
||||
/// 单独锁定面板(SuoDing.prefab)。
|
||||
/// ⭐ 本阶段只做界面:
|
||||
/// - 单列表不分类,只显示 黄金鱼/特殊鱼/Boss鱼/特殊Boss(不含普通鱼)
|
||||
/// - 每个 item 带 Toggle(勾选=作为锁定目标),按锁定优先级排序显示
|
||||
/// - 每个 item 带 Toggle(勾选=作为锁定目标)
|
||||
/// - 两层排序:①鱼类型 特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼;②同类型内按最大爆奖倍数(与 item 显示同源)从大到小
|
||||
/// - 全选/取消全选 两个按钮
|
||||
/// - GetSelectedFishNumbers() 暴露选中列表,后续锁定功能从这里对接
|
||||
/// </summary>
|
||||
@@ -100,29 +101,77 @@ public class SuoDingPanel : SubUIBase
|
||||
}
|
||||
|
||||
// ② 过滤:只保留 黄金鱼/特殊鱼/Boss鱼/特殊Boss(不显示普通鱼)
|
||||
var filtered = new List<(string fishNumber, FishTypeEnum fishType)>();
|
||||
// 同时带上"最大爆奖倍数"(与 item 上显示的数字同源,第二层排序用)
|
||||
var filtered = new List<(string fishNumber, FishTypeEnum fishType, double multiple)>();
|
||||
foreach (var fn in fishNumbers)
|
||||
{
|
||||
if (!GameManager.Instance.dic_fishTypeConfigs.TryGetValue(fn, out var cfg)) continue;
|
||||
var t = (FishTypeEnum)cfg.fishType;
|
||||
if (t == FishTypeEnum.普通鱼) continue;
|
||||
filtered.Add((fn, t));
|
||||
filtered.Add((fn, t, GetShowMultiple(cfg.fishMultipleDesc, cfg.fishScore)));
|
||||
}
|
||||
|
||||
// ③ 排序:与自动锁定优先级一致 特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼,同类型按编号
|
||||
// ③ 两层排序(与 XJMH 锁定面板同口径):
|
||||
// 第一层:鱼类型 特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼
|
||||
// 第二层:同类型内按"最大爆奖倍数"从大到小;倍数相同再按鱼号
|
||||
filtered.Sort((a, b) =>
|
||||
{
|
||||
int pa = GetTypeSortOrder(a.fishType);
|
||||
int pb = GetTypeSortOrder(b.fishType);
|
||||
if (pa != pb) return pa.CompareTo(pb);
|
||||
int sc = b.multiple.CompareTo(a.multiple); // ⭐ 从大到小
|
||||
if (sc != 0) return sc;
|
||||
return CompareFishNumber(a.fishNumber, b.fishNumber);
|
||||
});
|
||||
|
||||
// ④ 实例化条目
|
||||
foreach (var (fishNumber, fishType) in filtered)
|
||||
foreach (var (fishNumber, fishType, _) in filtered)
|
||||
CreateItem(fishNumber, fishType);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取 item 上显示给玩家的"最大爆奖倍数"(排序用,保证顺序和 item 上的数字一致):
|
||||
/// 优先解析服务端文案 fishMultipleDesc(如"最高500倍"、"1.5万倍"),
|
||||
/// 解析不到数字时回退用 fishScore。
|
||||
/// ⭐ public static:XJMH 锁定面板(PW_SetLock)也用同一份口径排序。
|
||||
/// </summary>
|
||||
public static double GetShowMultiple(string fishMultipleDesc, long fishScore)
|
||||
{
|
||||
double v = ParseNumber(fishMultipleDesc);
|
||||
return v > 0 ? v : fishScore;
|
||||
}
|
||||
|
||||
/// <summary>从文案里解析第一个数字(支持小数与"万/亿"单位;解析不到返回 0)</summary>
|
||||
private static double ParseNumber(string s)
|
||||
{
|
||||
if (string.IsNullOrEmpty(s)) return 0;
|
||||
|
||||
int i = 0;
|
||||
while (i < s.Length && (s[i] < '0' || s[i] > '9')) i++; // 跳过前缀(如"最高")
|
||||
if (i >= s.Length) return 0;
|
||||
|
||||
int start = i;
|
||||
bool dot = false;
|
||||
while (i < s.Length && ((s[i] >= '0' && s[i] <= '9') || (s[i] == '.' && !dot)))
|
||||
{
|
||||
if (s[i] == '.') dot = true;
|
||||
i++;
|
||||
}
|
||||
|
||||
double v;
|
||||
if (!double.TryParse(s.Substring(start, i - start),
|
||||
System.Globalization.NumberStyles.Float,
|
||||
System.Globalization.CultureInfo.InvariantCulture, out v))
|
||||
return 0;
|
||||
|
||||
if (i < s.Length)
|
||||
{
|
||||
if (s[i] == '万') v *= 10000;
|
||||
else if (s[i] == '亿') v *= 100000000;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
private void TryAddFishNumber(HashSet<string> set, string fishNumber)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(fishNumber))
|
||||
|
||||
@@ -16660,7 +16660,7 @@ PrefabInstance:
|
||||
- target: {fileID: 3429558903206714841, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3783151213167614958, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
@@ -16670,7 +16670,7 @@ PrefabInstance:
|
||||
- target: {fileID: 3783151213167614958, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
propertyPath: m_IsActive
|
||||
value: 0
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6114408877341087527, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
@@ -16805,7 +16805,7 @@ PrefabInstance:
|
||||
- target: {fileID: 7125234996501131867, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 1
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7125234996501131867, guid: 6c8512965de208f498306fbdfeb8eb5b,
|
||||
type: 3}
|
||||
|
||||
@@ -2532,7 +2532,8 @@ public class GameMainPanel_XJMH : GameMainPanel_FishBase
|
||||
/// 收集锁定条目(与"帮助-图鉴"同一份数据源):
|
||||
/// 房间出鱼(spawnList + 鱼阵解析 + 按鱼号去重)→ 图鉴分类过滤;
|
||||
/// 去掉普通鱼(保留 黄金/特殊/Boss/特殊Boss,与通用锁定面板 SuoDing 口径一致);
|
||||
/// 排序按锁定优先级(特殊Boss→Boss→特殊→黄金,同类按分值升序,与通用锁定面板一致)。
|
||||
/// 排序两层:①锁定优先级(特殊Boss→Boss→特殊→黄金);②同类按"最大爆奖倍数"从大到小,
|
||||
/// 倍数取 item 上显示的数字(优先 fishMultipleDesc,回退 fishScore),与通用锁定面板 SuoDing 完全一致)。
|
||||
/// </summary>
|
||||
private List<XjmhLockCfg> CollectLockFishCfgs()
|
||||
{
|
||||
@@ -2561,11 +2562,32 @@ public class GameMainPanel_XJMH : GameMainPanel_FishBase
|
||||
}
|
||||
}
|
||||
|
||||
// ② 按锁定优先级排序 → 过滤普通鱼(rank 0) → 生成展示文本(与图鉴条目同口径)
|
||||
foreach (var e in entries.OrderByDescending(e => e.rank).ThenBy(e => e.score))
|
||||
// ② 两层排序 → 过滤普通鱼(rank 0) → 生成展示文本(与图鉴条目同口径)
|
||||
// ⭐ 第一层:锁定优先级 特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼
|
||||
// ⭐ 第二层:同类内按"最大爆奖倍数"从大到小
|
||||
// 倍数取 item 上显示的那个数字(优先 fishMultipleDesc,回退 fishScore),
|
||||
// 与通用锁定面板 SuoDing 共用 SuoDingPanel.GetShowMultiple,保证两块面板顺序一致
|
||||
var ordered = new List<(HelpTuJianEntry entry, double multiple)>();
|
||||
foreach (var e in entries)
|
||||
{
|
||||
if (e.rank == 0) continue;
|
||||
|
||||
string fn0 = e.detail != null ? e.detail.fishNumber : null;
|
||||
if (string.IsNullOrEmpty(fn0)) continue;
|
||||
if (!GameManager.Instance.dic_fishTypeConfigs.TryGetValue(fn0, out var cfg0)) continue;
|
||||
|
||||
ordered.Add((e, SuoDingPanel.GetShowMultiple(cfg0.fishMultipleDesc, cfg0.fishScore)));
|
||||
}
|
||||
|
||||
ordered.Sort((a, b) =>
|
||||
{
|
||||
int r = b.entry.rank.CompareTo(a.entry.rank); // 特殊Boss(4) 排最前
|
||||
if (r != 0) return r;
|
||||
return b.multiple.CompareTo(a.multiple); // ⭐ 最大爆奖倍数从大到小
|
||||
});
|
||||
|
||||
foreach (var (e, _) in ordered)
|
||||
{
|
||||
string fn = e.detail != null ? e.detail.fishNumber : null;
|
||||
if (string.IsNullOrEmpty(fn)) continue;
|
||||
if (!GameManager.Instance.dic_fishTypeConfigs.TryGetValue(fn, out var fishCfg)) continue;
|
||||
@@ -2751,6 +2773,12 @@ public class GameMainPanel_XJMH : GameMainPanel_FishBase
|
||||
return _xjLockSelected.Contains(m.monsterData?.fishTypeConfig?.fishNumber);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ 覆写父类:XJMH 用的是原版 PW_SetLock 面板,没有通用 SuoDingPanel。
|
||||
/// 一条都没勾选 → 关闭面板时不开启锁定功能(父类 ApplySuoDingSelection 会直接返回)。
|
||||
/// </summary>
|
||||
protected override bool HasSuoDingSelection() => _xjLockWhiteOn;
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ 覆写父类:XJMH 的锁定规则与通用玩法不同(不自动换目标):
|
||||
/// - 直接点锁定(手动点鱼)→ 不激活自动换目标:锁定的鱼死亡/消失后就空着,等玩家重新点;
|
||||
|
||||
Reference in New Issue
Block a user