[trim] fully-unreachable files deleted: 6 [trim] files edited: 55, files deleted: 0, nodes removed: 244 [type-trim] files edited: 1, types removed: 1 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
168 lines
4.9 KiB
C#
168 lines
4.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Wizard;
|
|
|
|
public class NetworkUserInfoData
|
|
{
|
|
public class NetworkUserInfo
|
|
{
|
|
public int Rank { get; private set; }
|
|
|
|
public bool IsMasterRank { get; private set; }
|
|
|
|
public int BattlePoint { get; private set; }
|
|
|
|
public int MasterPoint { get; private set; }
|
|
|
|
public int ClassId { get; private set; }
|
|
|
|
public int SubClassId { get; private set; } = 10;
|
|
|
|
public int CharaId { get; private set; }
|
|
|
|
public string MyRotationId { get; private set; } = "";
|
|
|
|
public string AvatarBattleId { get; private set; } = "";
|
|
|
|
public void SetParameter(Dictionary<string, object> info)
|
|
{
|
|
Rank = Convert.ToInt32(info["rank"]);
|
|
IsMasterRank = info.ContainsKey("isMasterRank") && Convert.ToInt32(info["isMasterRank"]) != 0;
|
|
BattlePoint = (info.ContainsKey("battlePoint") ? Convert.ToInt32(info["battlePoint"]) : 0);
|
|
MasterPoint = (info.ContainsKey("masterPoint") ? Convert.ToInt32(info["masterPoint"]) : 0);
|
|
ClassId = Convert.ToInt32(info["classId"]);
|
|
if (info.ContainsKey("subclassId"))
|
|
{
|
|
SubClassId = Convert.ToInt32(info["subclassId"]);
|
|
}
|
|
CharaId = Convert.ToInt32(info["charaId"]);
|
|
if (info.ContainsKey("rotationId"))
|
|
{
|
|
MyRotationId = Convert.ToString(info["rotationId"]);
|
|
}
|
|
AvatarBattleId = info["charaId"].ToString();
|
|
}
|
|
}
|
|
|
|
private Dictionary<string, object> _selfInfo = new Dictionary<string, object>();
|
|
|
|
private Dictionary<string, object> _oppoInfo = new Dictionary<string, object>();
|
|
|
|
public int TurnState { get; set; }
|
|
|
|
public NetworkUserInfo SelfBattleStartInfo { get; private set; }
|
|
|
|
public NetworkUserInfo OppoBattleStartInfo { get; private set; }
|
|
|
|
public NetworkUserInfoData()
|
|
{
|
|
TurnState = -1;
|
|
}
|
|
|
|
public void SetSelfInfo(Dictionary<string, object> info, bool isWatchReplayRecovery)
|
|
{
|
|
_selfInfo = info;
|
|
if (isWatchReplayRecovery)
|
|
{
|
|
SetNetworkSelfInfo(info);
|
|
}
|
|
if (_selfInfo != null && _selfInfo.ContainsKey("seed"))
|
|
{
|
|
LocalLog.AccumulateLastTraceLog("SetSelfInfo seed" + Convert.ToInt32(_selfInfo["seed"]));
|
|
}
|
|
}
|
|
|
|
// SetNetworkSelfInfo used to fan the received chara/skin/rotation info out to the
|
|
// process-wide GameMgr.DataMgr (production-only path). In the current headless world
|
|
// the only call site is the isWatchReplayRecovery=true branch of SetSelfInfo, which
|
|
// is never taken in either test seeder — so this is dead in every code path we run.
|
|
// Body preserved as documentation until a live-network path revives it, but the
|
|
// GameMgr/Data reach has been dropped so it can't ambient-race anymore.
|
|
public void SetNetworkSelfInfo(Dictionary<string, object> info)
|
|
{
|
|
if (SelfBattleStartInfo == null)
|
|
{
|
|
SelfBattleStartInfo = new NetworkUserInfo();
|
|
}
|
|
SelfBattleStartInfo.SetParameter(info);
|
|
// TODO(post-Phase-5b, revive-live-network): thread a mgr param through and fan out
|
|
// GetSelfCharaId/GetSelfSubClassId/GetSelfMyRotationId/GetSelfAvatarBattleId into
|
|
// mgr.GameMgr.GetDataMgr() + Data.RoomTwoPickBeforeBattleInfo once a caller exists.
|
|
if (_selfInfo != null && _selfInfo.ContainsKey("seed"))
|
|
{
|
|
LocalLog.AccumulateLastTraceLog("SetNetworkSelfInfo seed" + Convert.ToInt32(_selfInfo["seed"]));
|
|
}
|
|
}
|
|
|
|
public int GetFieldId()
|
|
{
|
|
return Convert.ToInt32(_selfInfo["fieldId"]);
|
|
}
|
|
|
|
public int GetRandomSeed()
|
|
{
|
|
if (_selfInfo == null || !_selfInfo.ContainsKey("seed"))
|
|
{
|
|
string text = "NotSeed ";
|
|
text = text + ((_selfInfo == null) ? "infoNull" : "noneKey") + " ";
|
|
if (_selfInfo != null)
|
|
{
|
|
foreach (KeyValuePair<string, object> item in _selfInfo)
|
|
{
|
|
text = text + item.Key + ":" + item.Value?.ToString() + " ";
|
|
}
|
|
}
|
|
LocalLog.AccumulateLastTraceLog(text);
|
|
return 0;
|
|
}
|
|
return Convert.ToInt32(_selfInfo["seed"]);
|
|
}
|
|
|
|
public int GetSelfViewerId()
|
|
{
|
|
return Convert.ToInt32(_selfInfo["viewerId"]);
|
|
}
|
|
|
|
public string GetSelfAvatarBattleId()
|
|
{
|
|
if (SelfBattleStartInfo == null)
|
|
{
|
|
return "";
|
|
}
|
|
return SelfBattleStartInfo.AvatarBattleId;
|
|
}
|
|
|
|
public int GetSelfChaosId()
|
|
{
|
|
// The `!IsNetworkBattle` guard is redundant with the dict-lookup below: in single-player
|
|
// paths `_selfInfo` is empty (no network setup), so the dict never contains "chaosId"
|
|
// and this returns -1 anyway. Removing the ambient reach.
|
|
if (_selfInfo.ContainsKey("chaosId"))
|
|
{
|
|
return Convert.ToInt32(_selfInfo["chaosId"]);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public string GetOpponentAvatarBattleId()
|
|
{
|
|
if (SelfBattleStartInfo == null)
|
|
{
|
|
return "";
|
|
}
|
|
return OppoBattleStartInfo.AvatarBattleId;
|
|
}
|
|
|
|
public int GetOpponentChaosId()
|
|
{
|
|
// See GetSelfChaosId — same rationale, the `!IsNetworkBattle` guard is redundant with
|
|
// the dict-lookup fallthrough (single-player paths never populate `_oppoInfo`).
|
|
if (_oppoInfo.ContainsKey("chaosId"))
|
|
{
|
|
return Convert.ToInt32(_oppoInfo["chaosId"]);
|
|
}
|
|
return -1;
|
|
}
|
|
}
|