using System.Collections.Generic; using System.IO; using Arrowgene.Ddon.Client.Data; using Arrowgene.Ddon.Client.Resource; using Arrowgene.Ddon.Shared; using Arrowgene.Logging; namespace Arrowgene.Ddon.Client { public class ClientResourceRepository { private static readonly ILogger Logger = LogProvider.Logger(typeof(ClientResourceRepository)); public FieldAreaList FieldAreaList { get; private set; } public AreaStageList AreaStageList { get; private set; } public AreaList AreaList { get; private set; } public StageList StageList { get; private set; } public LandListLal LandList { get; private set; } public StageToSpot StageToSpot { get; private set; } public GuiMessage FieldAreaNames { get; private set; } public WarpLocationList WarpLocationList { get; private set; } public WarpLocationList WarpLocationListRim { get; private set; } public Dictionary StageLocations { get; private set; } public Dictionary> StageOmMarker { get; private set; } public Dictionary> StageSceMarker { get; private set; } public Dictionary> StageNpcMarker { get; private set; } public Dictionary> StageEctMarker { get; private set; } public Dictionary> StageAdJoin { get; private set; } public Dictionary> StageSpots { get; private set; } public ClientData Data { get; private set; } private DirectoryInfo _directory; public ClientResourceRepository() { // Nested Data = new ClientData(); // Flat Lookup StageLocations = new Dictionary(); StageOmMarker = new Dictionary>(); StageSceMarker = new Dictionary>(); StageNpcMarker = new Dictionary>(); StageEctMarker = new Dictionary>(); StageAdJoin = new Dictionary>(); StageSpots = new Dictionary>(); // Client Resources AreaStageList = new AreaStageList(); AreaList = new AreaList(); StageList = new StageList(); FieldAreaList = new FieldAreaList(); LandList = new LandListLal(); StageToSpot = new StageToSpot(); } public void Load(DirectoryInfo romDirectory) { _directory = romDirectory; if (_directory == null || !_directory.Exists) { Logger.Error("Rom Path Invalid"); return; } WarpLocationList = GetResource("ui/gui_cmn.arc", "ui/03_warp/warpLocationList", "wal"); WarpLocationListRim = GetResource("ui/uGUIRimWarp.arc", "ui/03_warp/lobbyWarpLocationList", "wal"); LandList = GetResource("base.arc", "scr/land_list"); AreaStageList = GetResource("base.arc", "scr/area_stage_list"); AreaList = GetResource("base.arc", "scr/area_list"); StageList = GetResource("base.arc", "scr/stage_list"); FieldAreaList = GetResource("game_common.arc", "etc/FieldArea/field_area_list"); StageToSpot = GetFile("game_common.arc", "param/stage_to_spot"); FieldAreaNames = GetResource("game_common.arc", "ui/00_message/common/field_area_name", "gmd"); foreach (StageList.Info sli in StageList.StageInfos) { LocationData lcd = GetResource_NoLog( $"stage/st{sli.StageNo:0000}/st{sli.StageNo:0000}.arc", $"scr/st{sli.StageNo:0000}/etc/st{sli.StageNo:0000}", "lcd" ); if (lcd != null) { if (!StageLocations.ContainsKey(sli.StageNo)) { StageLocations.Add(sli.StageNo, lcd); } } } foreach (FieldAreaList.FieldAreaInfo fai in FieldAreaList.FieldAreaInfos) { GuiMessage.Entry areaName = FieldAreaNames.Entries[(int) fai.GmdIdx]; FieldAreaMarkerInfo omMarker = GetResource_NoLog( $"/FieldArea/FieldArea{fai.FieldAreaId:000}_marker.arc", $"etc/FieldArea/FieldArea{fai.FieldAreaId:000}_marker_om", "fmi" ); if (omMarker != null) { AddMarker(omMarker.MarkerInfos, StageOmMarker); } FieldAreaMarkerInfo sceMarker = GetResource_NoLog( $"/FieldArea/FieldArea{fai.FieldAreaId:000}_marker.arc", $"etc/FieldArea/FieldArea{fai.FieldAreaId:000}_marker_sce", "fmi" ); if (sceMarker != null) { AddMarker(sceMarker.MarkerInfos, StageSceMarker); } FieldAreaMarkerInfo npcMarker = GetResource_NoLog( $"/FieldArea/FieldArea{fai.FieldAreaId:000}_marker.arc", $"etc/FieldArea/FieldArea{fai.FieldAreaId:000}_marker_npc", "fmi" ); if (npcMarker != null) { AddMarker(npcMarker.MarkerInfos, StageNpcMarker); } FieldAreaMarkerInfo ectMarker = GetResource_NoLog( $"/FieldArea/FieldArea{fai.FieldAreaId:000}_marker.arc", $"etc/FieldArea/FieldArea{fai.FieldAreaId:000}_marker_ect", "fmi" ); if (ectMarker != null) { AddMarker(ectMarker.MarkerInfos, StageEctMarker); } FieldAreaAdjoinList adjoin = GetResource_NoLog( $"/FieldArea/FieldArea{fai.FieldAreaId:000}_marker.arc", $"etc/FieldArea/FieldArea{fai.FieldAreaId:000}_adjoin", "faa" ); if (adjoin != null) { AddAdjoin(adjoin.AdjoinInfos, StageAdJoin); } } foreach (StageToSpot.Entry sts in StageToSpot.Entries) { if (!StageSpots.ContainsKey(sts.StageNo)) { StageSpots[sts.StageNo] = new List(); } StageSpots[sts.StageNo].Add(sts); } // Land -> Area -> Stage -> Spot // for each land foreach (LandListLal.LandInfo land in LandList.LandInfos) { LandData landData = Data.ProvideLand(land.LandId); // for each area in the land foreach (uint areaId in land.AreaIds) { AreaData areaData = Data.ProvideArea(areaId); landData.AddArea(areaData); foreach (AreaStageList.AreaInfoStage ais in AreaStageList.AreaInfoStages) { // find stages that belong to this area if (ais.AreaId == areaId) { foreach (StageList.Info sli in StageList.StageInfos) { if (sli.StageNo == ais.StageNo) { StageData stageData = Data.ProvideStage(sli.StageNo); stageData.AddOmMarker(StageOmMarker); stageData.AddEctMarker(StageEctMarker); stageData.AddNpcMarker(StageNpcMarker); stageData.AddSceMarker(StageSceMarker); stageData.AddAdJoin(StageAdJoin); stageData.AddLocations(StageLocations); stageData.AddSpots(StageSpots); areaData.AddStage(stageData); } } } } } } } private void AddMarker(List markers, Dictionary> dst) { foreach (FieldAreaMarkerInfo.MarkerInfo marker in markers) { if (!dst.ContainsKey((uint) marker.StageNo)) { dst[(uint) marker.StageNo] = new List(); } dst[(uint) marker.StageNo].Add(marker); } } private void AddAdjoin(List adjoins, Dictionary> dst) { foreach (FieldAreaAdjoinList.AdjoinInfo adjoin in adjoins) { if (!dst.ContainsKey((uint) adjoin.DestinationStageNo)) { dst[(uint) adjoin.DestinationStageNo] = new List(); } dst[(uint) adjoin.DestinationStageNo].Add(adjoin); } } private T GetFile(string arcPath, string filePath, string ext = null) where T : ClientFile, new() { return ArcArchive.GetFile(_directory, arcPath, filePath, ext); } private T GetResource(string arcPath, string filePath, string ext = null) where T : ResourceFile, new() { return ArcArchive.GetResource(_directory, arcPath, filePath, ext); } private T GetResource_NoLog(string arcPath, string filePath, string ext = null) where T : ResourceFile, new() { return ArcArchive.GetResource_NoLog(_directory, arcPath, filePath, ext); } } }