Compare commits

...
Author SHA1 Message Date
admin 0dc0a6d5e6 Load Shardok terrain textures by battle month 2026-06-17 07:26:15 -07:00
3 changed files with 64 additions and 21 deletions
@@ -36,6 +36,25 @@ namespace eagle0.Tests {
}
}
[Test]
public void TerrainTextureLabelsForMonthOnlyIncludeRelevantSeason() {
var julyLabels = ImageForTerrainTracker.RequiredAddressableLabelsForMonth(7).ToList();
var januaryLabels =
ImageForTerrainTracker.RequiredAddressableLabelsForMonth(1).ToList();
Assert.Contains("hex-plains", julyLabels);
Assert.Contains("hex-castle", julyLabels);
Assert.IsFalse(julyLabels.Contains("hex-winter-plains"));
Assert.IsFalse(julyLabels.Contains("hex-plains-full-snow"));
Assert.IsFalse(julyLabels.Contains("hex-winter-castle"));
Assert.Contains("hex-winter-plains", januaryLabels);
Assert.Contains("hex-plains-full-snow", januaryLabels);
Assert.Contains("hex-winter-castle", januaryLabels);
Assert.IsFalse(januaryLabels.Contains("hex-plains"));
Assert.IsFalse(januaryLabels.Contains("hex-castle"));
}
[Test]
public void SoundManagerRequiredCombatClipsResolveToAddressableSfx() {
var addressableSoundNames = AddressableAssetNamesForLabel(CombatSfxLabel);
@@ -74,6 +74,18 @@ namespace eagle0 {
}
}
public static IEnumerable<string> RequiredAddressableLabelsForMonth(int month) {
if (WINTER_MONTHS.Contains(month)) {
return winterTerrainLabels.Values.Concat(partialSnowTerrainLabels.Values)
.Concat(fullSnowTerrainLabels.Values)
.Concat(new[] { winterCastleLabel, iceLabel, thawingIceLabel })
.Distinct();
}
return terrainLabels.Values.Concat(new[] { castleLabel, iceLabel, thawingIceLabel })
.Distinct();
}
private Dictionary<TerrainType, List<Texture>> terrainImages;
private Dictionary<TerrainType, List<Texture>> winterTerrainImages;
private Dictionary<TerrainType, List<Texture>> partialSnowTerrainImages;
@@ -82,41 +94,42 @@ namespace eagle0 {
private List<Texture> winterCastleImages;
private List<Texture> iceImages;
private List<Texture> thawingIceImages;
private int? loadedMonth;
private int? loadingMonth;
void Awake() {
Instance = this;
StartCoroutine(LoadAsync());
void Awake() { Instance = this; }
public void EnsureLoadedForMonth(int month) {
if ((IsLoaded && loadedMonth == month) || loadingMonth == month) { return; }
IsLoaded = false;
loadedMonth = null;
loadingMonth = month;
StartCoroutine(LoadAsync(month));
}
private IEnumerator LoadAsync() {
private IEnumerator LoadAsync(int month) {
var loadedTextures = new Dictionary<string, List<Texture>>();
var uniqueLabels = new HashSet<string>();
foreach (var l in terrainLabels.Values) uniqueLabels.Add(l);
foreach (var l in winterTerrainLabels.Values) uniqueLabels.Add(l);
foreach (var l in partialSnowTerrainLabels.Values) uniqueLabels.Add(l);
foreach (var l in fullSnowTerrainLabels.Values) uniqueLabels.Add(l);
uniqueLabels.Add(castleLabel);
uniqueLabels.Add(winterCastleLabel);
uniqueLabels.Add(iceLabel);
uniqueLabels.Add(thawingIceLabel);
foreach (string label in uniqueLabels) {
foreach (string label in RequiredAddressableLabelsForMonth(month)) {
yield return AddressableLoader.LoadWithRetry<Texture>(
label,
results => { loadedTextures[label] = results.ToList(); },
() => { loadedTextures[label] = new List<Texture>(); });
}
if (loadingMonth != month) { yield break; }
terrainImages = BuildTerrainDict(terrainLabels, loadedTextures);
winterTerrainImages = BuildTerrainDict(winterTerrainLabels, loadedTextures);
partialSnowTerrainImages = BuildTerrainDict(partialSnowTerrainLabels, loadedTextures);
fullSnowTerrainImages = BuildTerrainDict(fullSnowTerrainLabels, loadedTextures);
castleImages = loadedTextures[castleLabel];
winterCastleImages = loadedTextures[winterCastleLabel];
iceImages = loadedTextures[iceLabel];
thawingIceImages = loadedTextures[thawingIceLabel];
castleImages = LoadedTextures(castleLabel, loadedTextures);
winterCastleImages = LoadedTextures(winterCastleLabel, loadedTextures);
iceImages = LoadedTextures(iceLabel, loadedTextures);
thawingIceImages = LoadedTextures(thawingIceLabel, loadedTextures);
loadedMonth = month;
loadingMonth = null;
IsLoaded = true;
}
@@ -124,10 +137,19 @@ namespace eagle0 {
Dictionary<TerrainType, string> labelMap,
Dictionary<string, List<Texture>> loadedTextures) {
var dict = new Dictionary<TerrainType, List<Texture>>();
foreach (var entry in labelMap) { dict[entry.Key] = loadedTextures[entry.Value]; }
foreach (var entry in labelMap) {
dict[entry.Key] = LoadedTextures(entry.Value, loadedTextures);
}
return dict;
}
static List<Texture> LoadedTextures(
string label,
Dictionary<string, List<Texture>> loadedTextures) {
return loadedTextures.TryGetValue(label, out var textures) ? textures
: new List<Texture>();
}
private Texture GetWinterImageForTerrain(Terrain terrain, int random) {
List<Texture> images = winterTerrainImages[terrain.Type];
@@ -579,6 +579,8 @@ namespace Shardok {
private IEnumerator SetUpGameAfterLoad(
ShardokGameModel shardokGameModel,
int setupGameGeneration) {
ImageForTerrainTracker.Instance.EnsureLoadedForMonth(shardokGameModel.Month);
// Wait for asset preloading to finish (runs on persistent Main Camera object)
while (!ImageForTerrainTracker.Instance.IsLoaded) {
if (!IsActiveSetup(shardokGameModel, setupGameGeneration)) { yield break; }