Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
222 changes: 133 additions & 89 deletions src/Brush.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
using HarmonyLib;
using Polytopia.Data;
using PolytopiaBackendBase.Common;
using PolytopiaMapManager.UI;
using PolytopiaMapManager.UI.Picker;
using UnityEngine;

namespace PolytopiaMapManager;

public static class Brush
{
internal static int chosenClimate = 0;
internal static SkinType chosenSkinType = SkinType.Default;
internal static Polytopia.Data.TerrainData.Type chosenTerrain = Polytopia.Data.TerrainData.Type.None;
internal static Polytopia.Data.ResourceData.Type chosenResource = Polytopia.Data.ResourceData.Type.None;
internal static TileData.EffectType chosenTileEffect = TileData.EffectType.None;
internal static ImprovementData.Type chosenBuilding = ImprovementData.Type.None;
private static float nextAllowedTimeForPopup = 0f;

[HarmonyPostfix]
Expand All @@ -24,106 +19,155 @@ private static void Tile_OnHoverStart(Tile __instance)
return;

GameState gameState = GameManager.GameState;
byte localPlayer = GameManager.LocalPlayer.Id;

if(chosenTerrain != Polytopia.Data.TerrainData.Type.None)
__instance.data.terrain = chosenTerrain;
HandleTerrain(__instance.data, (Polytopia.Data.TerrainData.Type)Editor.terrainPicker.chosenValue);
HandleResource(gameState, __instance.data, (ResourceData.Type)Editor.resourcePicker.chosenValue);
HandleTileEffect(__instance.data, (TileData.EffectType)Editor.tileEffectPicker.chosenValue);
HandleImprovement(gameState, __instance.data, (ImprovementData.Type)Editor.improvementPicker.chosenValue);
HandleBiome(__instance.data, Editor.biomePicker.chosenValue, Editor.biomePicker.chosenSkinType);

if(chosenResource != ResourceData.Type.None)
__instance.Render();
}

internal static void HandleTerrain(TileData tileData, Polytopia.Data.TerrainData.Type terrain)
{
if(terrain != Polytopia.Data.TerrainData.Type.None)
tileData.terrain = terrain;
}

internal static void HandleResource(GameState gameState, TileData tileData, ResourceData.Type resource)
{
if(resource == ResourceData.Type.None)
return;

if(resource == (ResourceData.Type)PickerBase.DESTROY_OPTION_ID)
{
if(chosenResource == (ResourceData.Type)PickerBase.DESTROY_OPTION_ID)
{
__instance.data.resource = null;
ActionUtils.CheckSurroundingArea(gameState, localPlayer, __instance.data);
}
else if(gameState.GameLogicData.TryGetData(chosenResource, out ResourceData data))
{
if(data.resourceTerrainRequirements.Contains(__instance.data.terrain))
{
__instance.data.resource = new ResourceState
tileData.resource = null;
return;
}

if(!gameState.GameLogicData.TryGetData(resource, out ResourceData data) && Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(Localization.Get("mapmaker.failed.retrieve", new Il2CppSystem.Object[] { tileData.resource}));
nextAllowedTimeForPopup = Time.time + 1f;
return;
}

if(!data.resourceTerrainRequirements.Contains(tileData.terrain) && Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(
Localization.Get(
"mapmaker.failed.creation",
new Il2CppSystem.Object[]
{
type = chosenResource
};
ActionUtils.CheckSurroundingArea(gameState, localPlayer, __instance.data);
}
else if(Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(Localization.Get("mapmaker.failed.creation", new Il2CppSystem.Object[] { Localization.Get(data.displayName, new Il2CppSystem.Object[] {} ),Localization.Get(__instance.data.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )}));
nextAllowedTimeForPopup = Time.time + 1f;
}
Localization.Get(data.displayName, new Il2CppSystem.Object[] {} ),
Localization.Get(tileData.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )
}
)
);
nextAllowedTimeForPopup = Time.time + 1f;
return;
}

tileData.resource = new ResourceState
{
type = resource
};
}

internal static void HandleTileEffect(TileData tileData, TileData.EffectType effectType)
{
if(effectType == TileData.EffectType.None)
return;

tileData.effects.Clear();

if(effectType == TileData.EffectType.Flooded)
{
if(tileData.isFloodable())
{
tileData.AddEffect(effectType);
if(Editor.biomePicker.chosenSkinType == SkinType.Swamp)
tileData.AddEffect(TileData.EffectType.Swamped);
}
else if(Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(Localization.Get("mapmaker.failed.retrieve", new Il2CppSystem.Object[] { __instance.data.resource}));
NotificationManager.Notify(
Localization.Get(
"mapmaker.failed.creation",
new Il2CppSystem.Object[]
{
Localization.Get($"tile.effect.{EnumCache<TileData.EffectType>.GetName(effectType)}"),
Localization.Get(tileData.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )
}
)
);
nextAllowedTimeForPopup = Time.time + 1f;
}
}
if(chosenTileEffect != TileData.EffectType.None)
else if(effectType == TileData.EffectType.Algae)
{
__instance.data.effects.Clear();
if(!__instance.data.HasEffect(chosenTileEffect))
if(tileData.IsWater)
{
if(chosenTileEffect == TileData.EffectType.Flooded)
{
if(__instance.data.isFloodable())
{
__instance.data.AddEffect(chosenTileEffect);
if(chosenSkinType == SkinType.Swamp)
__instance.data.AddEffect(TileData.EffectType.Swamped);
}
else if(Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(Localization.Get("mapmaker.failed.creation", new Il2CppSystem.Object[] { Localization.Get($"tile.effect.{EnumCache<TileData.EffectType>.GetName(chosenTileEffect)}"), Localization.Get(__instance.data.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )}));
nextAllowedTimeForPopup = Time.time + 1f;
}
}
else if(chosenTileEffect == TileData.EffectType.Algae)
{
if(__instance.data.IsWater)
{
__instance.data.AddEffect(chosenTileEffect);
if(chosenSkinType == SkinType.Cute)
__instance.data.AddEffect(TileData.EffectType.Foam);
}
else if(Time.time >= nextAllowedTimeForPopup)
{
NotificationManager.Notify(Localization.Get("mapmaker.failed.creation", new Il2CppSystem.Object[] { Localization.Get($"tile.effect.{EnumCache<TileData.EffectType>.GetName(chosenTileEffect)}"), Localization.Get(__instance.data.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )}));
nextAllowedTimeForPopup = Time.time + 1f;
}
}
tileData.AddEffect(effectType);
if(Editor.biomePicker.chosenSkinType == SkinType.Cute)
tileData.AddEffect(TileData.EffectType.Foam);
}
}
if(chosenBuilding != ImprovementData.Type.None && !__instance.data.HasImprovement(ImprovementData.Type.LightHouse))
{
if(chosenBuilding == (ImprovementData.Type)PickerBase.DESTROY_OPTION_ID)
{
__instance.data.improvement = null;
Data.Capital? capital = Loader.GetCapital(__instance.data.coordinates, Main.currCapitals);

if(capital != null)
Main.currCapitals.Remove(capital);
}
else if (gameState.GameLogicData.TryGetData(chosenBuilding, out ImprovementData improvementData))
else if(Time.time >= nextAllowedTimeForPopup)
{
ImprovementState improvementState = new ImprovementState
{
type = chosenBuilding,
borderSize = (ushort)improvementData.borderSize,
level = 0,
xp = 0,
production = 1,
founded = 0,
baseScore = 0,
founder = localPlayer
};
__instance.data.improvement = improvementState;
NotificationManager.Notify(
Localization.Get(
"mapmaker.failed.creation",
new Il2CppSystem.Object[]
{
Localization.Get($"tile.effect.{EnumCache<TileData.EffectType>.GetName(effectType)}"),
Localization.Get(tileData.terrain.GetDisplayName(), new Il2CppSystem.Object[] {} )
}
)
);
nextAllowedTimeForPopup = Time.time + 1f;
}
}
if(chosenClimate != 0)
}

internal static void HandleImprovement(GameState gameState, TileData tileData, ImprovementData.Type improvement)
{
if(improvement == ImprovementData.Type.None || tileData.HasImprovement(ImprovementData.Type.LightHouse))
return;

if(improvement == (ImprovementData.Type)PickerBase.DESTROY_OPTION_ID)
{
__instance.data.climate = chosenClimate;
__instance.data.Skin = chosenSkinType;
tileData.improvement = null;
Data.Capital? capital = Loader.GetCapital(tileData.coordinates, Main.currCapitals);

if(capital != null)
Main.currCapitals.Remove(capital);
return;
}
__instance.Render();

if (!gameState.GameLogicData.TryGetData(improvement, out ImprovementData improvementData))
return;

ImprovementState improvementState = new ImprovementState
{
type = improvement,
borderSize = (ushort)improvementData.borderSize,
level = 0,
xp = 0,
production = 1,
founded = 0,
baseScore = 0,
founder = gameState.CurrentPlayer
};
tileData.improvement = improvementState;
}

internal static void HandleBiome(TileData tileData, int climate, SkinType skinType)
{
if(Editor.biomePicker.chosenValue == 0)
return;

tileData.climate = climate;
tileData.Skin = skinType;
}
}
9 changes: 7 additions & 2 deletions src/IO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,13 @@ public static bool SaveMap(string name, ushort size, List<TileData> tiles, List<
return mapInfo;
}

internal static string[] GetAllMaps()
internal static List<string> GetAllMaps()
{
return Directory.GetFiles(MAPS_PATH, "*.json");
List<string> names = new();
foreach (var rawName in Directory.GetFiles(MAPS_PATH, "*.json"))
{
names.Add(Path.GetFileNameWithoutExtension(rawName));
}
return names;
}
}
11 changes: 2 additions & 9 deletions src/UI/Menu/GameSetup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,15 +143,8 @@ private static void GameSetupScreen_CreateGameModeList(GameSetupScreen __instanc
{
types.Add(value.ToString());
}
string[] maps = IO.GetAllMaps();
visualMaps = new();
int num = 1;
if (maps.Length > 0)
{
visualMaps = maps.Select(map => Path.GetFileNameWithoutExtension(map)).ToList();
num++;
}
__instance.CreateHorizontalList("gamesettings.generationtype", types.ToArray(), new Action<int>(OnMapGenTypeChanged), 0, null, maps.Length + 1, (Il2CppSystem.Action)OnTriedSelectDisabledMapGenType);
visualMaps = IO.GetAllMaps();
__instance.CreateHorizontalList("gamesettings.generationtype", types.ToArray(), new Action<int>(OnMapGenTypeChanged), 0, null, visualMaps.Count + 1, (Il2CppSystem.Action)OnTriedSelectDisabledMapGenType);
}
}

Expand Down
21 changes: 11 additions & 10 deletions src/UI/Picker/BiomePicker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace PolytopiaMapManager.UI.Picker;
internal class BiomePicker : PickerBase
{
internal SkinType chosenSkinType = SkinType.Default;
internal override string HeaderKey => "mapmaker.choose.climate";
internal static List<TribeType> excludedTribes = new()
{
Expand All @@ -24,20 +25,20 @@ internal override void Update(GameLogicData gameLogicData)
if(button == null)
return;

if(Brush.chosenClimate != 0)
if(chosenValue != 0)
{
TribeType tribeType = gameLogicData.GetTribeTypeFromStyle(Brush.chosenClimate);
TribeType tribeType = gameLogicData.GetTribeTypeFromStyle(chosenValue);
string spriteName;
if (Brush.chosenSkinType == SkinType.Default)
if (chosenSkinType == SkinType.Default)
{
spriteName = EnumCache<TribeType>.GetName(tribeType);
}
else
{
spriteName = EnumCache<SkinType>.GetName(Brush.chosenSkinType);
spriteName = EnumCache<SkinType>.GetName(chosenSkinType);
}
button.iconSpriteHandle.Request(SpriteData.GetHeadSpriteAddress(spriteName));
button.BG.color = ColorUtil.SetAlphaOnColor(ColorUtil.ColorFromInt(gameLogicData.GetTribeColor(tribeType, Brush.chosenSkinType)), 1f);
button.BG.color = ColorUtil.SetAlphaOnColor(ColorUtil.ColorFromInt(gameLogicData.GetTribeColor(tribeType, chosenSkinType)), 1f);
}
else
{
Expand All @@ -57,20 +58,20 @@ void OnClick(int id)
{
id *= -1;
SkinType skinType = (SkinType)id;
Brush.chosenClimate = Loader.GetTribeClimateFromSkin(skinType, gameState.GameLogicData);
Brush.chosenSkinType = skinType;
chosenValue = Loader.GetTribeClimateFromSkin(skinType, gameState.GameLogicData);
chosenSkinType = skinType;
}
else
{
if((TribeType)id != TribeType.None)
{
Brush.chosenClimate = Loader.GetTribeClimateFromType((TribeType)id, gameState.GameLogicData);
chosenValue = Loader.GetTribeClimateFromType((TribeType)id, gameState.GameLogicData);
}
else
{
Brush.chosenClimate = 0;
chosenValue = 0;
}
Brush.chosenSkinType = SkinType.Default;
chosenSkinType = SkinType.Default;
}
this.Update(gameState.GameLogicData);
Editor.resourcePicker.Update(gameState.GameLogicData);
Expand Down
4 changes: 2 additions & 2 deletions src/UI/Picker/ImprovementPicker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ internal class ImprovementPicker : PickerBase

internal override Sprite GetIcon(GameLogicData gameLogicData)
{
return base.GetSprite((int)Brush.chosenBuilding, SpriteData.ImprovementToString(Brush.chosenBuilding), gameLogicData);
return base.GetSprite(chosenValue, SpriteData.ImprovementToString((ImprovementData.Type)chosenValue), gameLogicData);
}

internal override void CreatePopupButtons(ref float num, SelectViewmodePopup selectViewmodePopup, GameState gameState)
Expand All @@ -35,7 +35,7 @@ internal override void CreatePopupButtons(ref float num, SelectViewmodePopup sel

void OnClick(int id)
{
Brush.chosenBuilding = (ImprovementData.Type)id;
chosenValue = id;
Update(gameState.GameLogicData);
}

Expand Down
Loading