Skip to content

Commit 7ac84ff

Browse files
Attract resource type and terrain type support in gld (#88)
* Can now choose which resource to attract and on which terrain. * Remove _postfix
1 parent 319b08d commit 7ac84ff

2 files changed

Lines changed: 96 additions & 3 deletions

File tree

src/Loader.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public static void LoadLocalizationFile(Mod mod, Mod.File file)
273273
{
274274
Loc.BuildAndLoadLocalization(JsonSerializer
275275
.Deserialize<Dictionary<string, Dictionary<string, string>>>(file.bytes)!);
276-
Plugin.logger.LogInfo($"Registried localization from {mod.id} mod");
276+
Plugin.logger.LogInfo($"Registered localization from {mod.id} mod");
277277
}
278278
catch (Exception e)
279279
{
@@ -451,8 +451,24 @@ public static void LoadGameLogicDataPatch(Mod mod, JObject gld, JObject patch)
451451
Main.embarkNames[unitId] = embarkUnitId;
452452
}
453453
}
454+
foreach (JToken jtoken in patch.SelectTokens("$.improvementData.*").ToArray())
455+
{
456+
JObject token = jtoken.Cast<JObject>();
457+
if (token["attractsResource"] != null)
458+
{
459+
string improvementId = Util.GetJTokenName(token);
460+
string attractsId = token["attractsResource"].ToString();
461+
Main.attractsResourceNames[improvementId] = attractsId;
462+
}
463+
if (token["attractsToTerrain"] != null)
464+
{
465+
string improvementId = Util.GetJTokenName(token);
466+
string attractsId = token["attractsToTerrain"].ToString();
467+
Main.attractsTerrainNames[improvementId] = attractsId;
468+
}
469+
}
454470
gld.Merge(patch, new() { MergeArrayHandling = MergeArrayHandling.Replace, MergeNullValueHandling = MergeNullValueHandling.Merge });
455-
Plugin.logger.LogInfo($"Registried patch from {mod.id} mod");
471+
Plugin.logger.LogInfo($"Registered patch from {mod.id} mod");
456472
}
457473
catch (Exception e)
458474
{

src/Managers/Main.cs

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ public static class Main
1919
internal static Dictionary<string, string> embarkNames = new();
2020
internal static Dictionary<UnitData.Type, UnitData.Type> embarkOverrides = new();
2121
internal static bool currentlyEmbarking = false;
22-
22+
internal static Dictionary<string, string> attractsResourceNames = new();
23+
internal static Dictionary<string, string> attractsTerrainNames = new();
24+
internal static Dictionary<ImprovementData.Type, ResourceData.Type> attractsResourceOverrides = new();
25+
internal static Dictionary<ImprovementData.Type, Polytopia.Data.TerrainData.Type> attractsTerrainOverrides = new();
2326

2427
[HarmonyPrefix]
2528
[HarmonyPatch(typeof(GameLogicData), nameof(GameLogicData.AddGameLogicPlaceholders))]
@@ -47,6 +50,34 @@ private static void GameLogicData_Parse(GameLogicData __instance, JObject rootOb
4750
Plugin.logger.LogError($"Embark unit type for {entry.Key} is not valid: {entry.Value}");
4851
}
4952
}
53+
foreach (KeyValuePair<string, string> entry in attractsResourceNames)
54+
{
55+
try
56+
{
57+
ImprovementData.Type improvement = EnumCache<ImprovementData.Type>.GetType(entry.Key);
58+
ResourceData.Type resource = EnumCache<ResourceData.Type>.GetType(entry.Value);
59+
attractsResourceOverrides[improvement] = resource;
60+
Plugin.logger.LogInfo($"Improvement {entry.Key} now attracts {entry.Value}");
61+
}
62+
catch
63+
{
64+
Plugin.logger.LogError($"Improvement {entry.Key} resource type is not valid: {entry.Value}");
65+
}
66+
}
67+
foreach (KeyValuePair<string, string> entry in attractsTerrainNames)
68+
{
69+
try
70+
{
71+
ImprovementData.Type improvement = EnumCache<ImprovementData.Type>.GetType(entry.Key);
72+
Polytopia.Data.TerrainData.Type terrain = EnumCache<Polytopia.Data.TerrainData.Type>.GetType(entry.Value);
73+
attractsTerrainOverrides[improvement] = terrain;
74+
Plugin.logger.LogInfo($"Improvement {entry.Key} now attracts on {entry.Value}");
75+
}
76+
catch
77+
{
78+
Plugin.logger.LogError($"Improvement {entry.Key} terrain type is not valid: {entry.Value}");
79+
}
80+
}
5081
fullyInitialized = true;
5182
}
5283
}
@@ -211,6 +242,52 @@ private static bool ActionUtils_TrainUnit(ref UnitState __result, GameState game
211242
return true;
212243
}
213244

245+
[HarmonyPostfix]
246+
[HarmonyPatch(typeof(StartTurnAction), nameof(StartTurnAction.Execute))]
247+
private static void StartTurnAction_Execute(StartTurnAction __instance, GameState state)
248+
{
249+
for (int i = state.ActionStack.Count - 1; i >= 0; i--)
250+
{
251+
if (state.ActionStack[i].GetActionType() == ActionType.CreateResource)
252+
{
253+
state.ActionStack.RemoveAt(i);
254+
}
255+
}
256+
for (int i = 0; i < state.Map.Tiles.Length; i++)
257+
{
258+
TileData tileData = state.Map.Tiles[i];
259+
if (tileData.owner == __instance.PlayerId && tileData.improvement != null && state.CurrentTurn > 0U)
260+
{
261+
ImprovementData improvementData;
262+
state.GameLogicData.TryGetData(tileData.improvement.type, out improvementData);
263+
if (improvementData != null)
264+
{
265+
if (improvementData.HasAbility(ImprovementAbility.Type.Attract) && tileData.improvement.GetAge(state) % improvementData.growthRate == 0)
266+
{
267+
ResourceData.Type resourceType = ResourceData.Type.Game;
268+
if (attractsResourceOverrides.TryGetValue(tileData.improvement.type, out ResourceData.Type newType))
269+
{
270+
resourceType = newType;
271+
}
272+
Polytopia.Data.TerrainData.Type targetTerrain = Polytopia.Data.TerrainData.Type.Forest;
273+
if (attractsTerrainOverrides.TryGetValue(tileData.improvement.type, out Polytopia.Data.TerrainData.Type newTerrain))
274+
{
275+
targetTerrain = newTerrain;
276+
}
277+
foreach (TileData tileData2 in state.Map.GetArea(tileData.coordinates, 1, true, false))
278+
{
279+
if (tileData2.owner == __instance.PlayerId && tileData2.improvement == null && tileData2.resource == null && tileData2.terrain == targetTerrain)
280+
{
281+
state.ActionStack.Add(new CreateResourceAction(__instance.PlayerId, resourceType, tileData2.coordinates, CreateResourceAction.CreateReason.Attract));
282+
break;
283+
}
284+
}
285+
}
286+
}
287+
}
288+
}
289+
}
290+
214291
internal static void Init()
215292
{
216293
stopwatch.Start();

0 commit comments

Comments
 (0)