Files
SVSimServer/SVSim.BattleEngine/Engine/NetworkUserInfoData.cs
gamer147 c9628dee01 cull(engine-cleanup): pass-8 phase-2 cascade round 1
[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>
2026-07-03 21:18:18 -04:00

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;
}
}