mirror of
				https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
				synced 2025-10-31 19:59:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			259 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C#
		
	
	
		
			Executable File
		
	
	
	
	
| using Godot;
 | |
| using Godot.Collections;
 | |
| 
 | |
| #nullable disable
 | |
| 
 | |
| /*
 | |
| 
 | |
| This is a lightweight wrapper for Better Terrain in C#.
 | |
| 
 | |
| It is not a C# implementation, it merely provides a type safe interface to access
 | |
| the BetterTerrain autoload from C#. If you are not using Godot in C#, you can ignore
 | |
| this file.
 | |
| 
 | |
| The interface is created for a specific tilemap node, which it uses to locate the
 | |
| autoload, and to fill in as a parameter to simplify all the subsequent calls.
 | |
| Very simple example:
 | |
| 
 | |
| ```
 | |
|     BetterTerrain betterTerrain;
 | |
| 
 | |
|     public override void _Ready()
 | |
|     {
 | |
|         TileMapLayer tileMapLayer = GetNode<TileMapLayer>("TileMapLayer");
 | |
|         betterTerrain = new BetterTerrain(tm);
 | |
| 
 | |
|         var coordinates = new Vector2I(0, 0);
 | |
|         betterTerrain.SetCell(coordinates, 1);
 | |
|         betterTerrain.UpdateTerrainCell(coordinates);
 | |
|     }
 | |
| ```
 | |
| 
 | |
| The functions available are the same as BetterTerrain's, though the TileMapLayer or
 | |
| TileSet parameters are automatically filled in. The help is not duplicated here,
 | |
| refer to the GDScript version for specifics.
 | |
| 
 | |
| */
 | |
| 
 | |
| public class BetterTerrain
 | |
| {
 | |
|     public enum TerrainType
 | |
|     {
 | |
|         MatchTiles = 0,
 | |
|         MatchVertices = 1,
 | |
|         Category = 2,
 | |
|         Decoration = 3
 | |
|     }
 | |
| 
 | |
|     public enum SymmetryType
 | |
|     {
 | |
|         None = 0,
 | |
|         Mirror = 1, // Horizontally mirror
 | |
|         Flip = 2, // Vertically flip
 | |
|         Reflect = 3, // All four reflections
 | |
|         RotateClockwise = 4,
 | |
|         RotateCounterClockwise = 5,
 | |
|         Rotate180 = 6,
 | |
|         RotateAll = 7, // All four rotated forms
 | |
|         All = 8 // All rotated and reflected forms
 | |
|     }
 | |
| 
 | |
|     private static readonly NodePath nodePath = new("/root/BetterTerrain");
 | |
|     private readonly Node betterTerrain;
 | |
|     private readonly TileMapLayer tileMapLayer;
 | |
| 
 | |
|     public BetterTerrain(TileMapLayer tileMapLayer)
 | |
|     {
 | |
|         this.tileMapLayer = tileMapLayer;
 | |
|         betterTerrain = tileMapLayer.GetNode(nodePath);
 | |
|     }
 | |
| 
 | |
|     public Array<Godot.Collections.Dictionary<string, Variant>> GetTerrainCategories()
 | |
|     {
 | |
|         return (Array<Godot.Collections.Dictionary<string, Variant>>)betterTerrain.Call(MethodName.GetTerrainCategories, tileMapLayer.TileSet);
 | |
|     }
 | |
| 
 | |
|     public bool AddTerrain(string name, Color color, TerrainType type, Array<int> categories = null, Godot.Collections.Dictionary<Variant, Variant> icon = null)
 | |
|     {
 | |
|         categories ??= new Array<int>();
 | |
|         icon ??= new Godot.Collections.Dictionary<Variant, Variant>();
 | |
|         return (bool)betterTerrain.Call(MethodName.AddTerrain, tileMapLayer.TileSet, name, color, (int)type, categories, icon);
 | |
|     }
 | |
| 
 | |
|     public bool RemoveTerrain(int index)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.RemoveTerrain, tileMapLayer.TileSet, index);
 | |
|     }
 | |
| 
 | |
|     public int TerrainCount()
 | |
|     {
 | |
|         return (int)betterTerrain.Call(MethodName.TerrainCount, tileMapLayer.TileSet);
 | |
|     }
 | |
| 
 | |
|     public Godot.Collections.Dictionary<string, Variant> GetTerrain(int index)
 | |
|     {
 | |
|         return (Godot.Collections.Dictionary<string, Variant>)betterTerrain.Call(MethodName.GetTerrain, tileMapLayer.TileSet, index);
 | |
|     }
 | |
| 
 | |
|     public bool SetTerrain(int index, string name, Color color, TerrainType type, Array<int> categories = null, Godot.Collections.Dictionary<Variant, Variant> icon = null)
 | |
|     {
 | |
|         categories ??= new Array<int>();
 | |
|         icon ??= new Godot.Collections.Dictionary<Variant, Variant>();
 | |
|         return (bool)betterTerrain.Call(MethodName.SetTerrain, tileMapLayer.TileSet, index, name, color, (int)type, categories, icon);
 | |
|     }
 | |
| 
 | |
|     public bool SwapTerrains(int index1, int index2)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.SwapTerrains, tileMapLayer.TileSet, index1, index2);
 | |
|     }
 | |
| 
 | |
|     public bool SetTileTerrainType(TileData tileData, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.SetTileTerrainType, tileMapLayer.TileSet, tileData, type);
 | |
|     }
 | |
| 
 | |
|     public int GetTileTerrainType(TileData tileData)
 | |
|     {
 | |
|         return (int)betterTerrain.Call(MethodName.GetTileTerrainType, tileData);
 | |
|     }
 | |
| 
 | |
|     public bool SetTileSymmetryType(TileData tileData, SymmetryType type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.SetTileSymmetryType, tileMapLayer.TileSet, tileData, (int)type);
 | |
|     }
 | |
| 
 | |
|     public SymmetryType GetTileSymmetryType(TileData tileData)
 | |
|     {
 | |
|         return (SymmetryType)(int)betterTerrain.Call(MethodName.GetTileSymmetryType, tileData);
 | |
|     }
 | |
| 
 | |
|     public Array<TileData> GetTilesInTerrain(int type)
 | |
|     {
 | |
|         return (Array<TileData>)betterTerrain.Call(MethodName.GetTilesInTerrain, tileMapLayer.TileSet, type);
 | |
|     }
 | |
| 
 | |
|     public Array<Godot.Collections.Dictionary<string, Variant>> GetTileSourcesInTerrain(int type)
 | |
|     {
 | |
|         return (Array<Godot.Collections.Dictionary<string, Variant>>)betterTerrain.Call(MethodName.GetTileSourcesInTerrain, tileMapLayer.TileSet, type);
 | |
|     }
 | |
| 
 | |
|     public bool AddTilePeeringType(TileData tileData, TileSet.CellNeighbor peering, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.AddTilePeeringType, tileMapLayer.TileSet, tileData, (int)peering, type);
 | |
|     }
 | |
| 
 | |
|     public bool RemoveTilePeeringType(TileData tileData, TileSet.CellNeighbor peering, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.RemoveTilePeeringType, tileMapLayer.TileSet, tileData, (int)peering, type);
 | |
|     }
 | |
| 
 | |
|     public Array<TileSet.CellNeighbor> TilePeeringKeys(TileData tileData)
 | |
|     {
 | |
|         return (Array<TileSet.CellNeighbor>)betterTerrain.Call(MethodName.TilePeeringKeys, tileData);
 | |
|     }
 | |
| 
 | |
|     public Array<int> TilePeeringTypes(TileData tileData, TileSet.CellNeighbor peering)
 | |
|     {
 | |
|         return (Array<int>)betterTerrain.Call(MethodName.TilePeeringTypes, tileData, (int)peering);
 | |
|     }
 | |
| 
 | |
|     public Array<TileSet.CellNeighbor> TilePeeringForType(TileData tileData, int type)
 | |
|     {
 | |
|         return (Array<TileSet.CellNeighbor>)betterTerrain.Call(MethodName.TilePeeringForType, tileData, type);
 | |
|     }
 | |
| 
 | |
|     public bool SetCell(Vector2I coordinate, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.SetCell, tileMapLayer, coordinate, type);
 | |
|     }
 | |
| 
 | |
|     public bool SetCells(Array<Vector2I> coordinates, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.SetCells, tileMapLayer, coordinates, type);
 | |
|     }
 | |
| 
 | |
|     public bool ReplaceCell(Vector2I coordinate, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.ReplaceCell, tileMapLayer, coordinate, type);
 | |
|     }
 | |
| 
 | |
|     public bool ReplaceCells(Array<Vector2I> coordinates, int type)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.ReplaceCells, tileMapLayer, coordinates, type);
 | |
|     }
 | |
| 
 | |
|     public int GetCell(Vector2I coordinate)
 | |
|     {
 | |
|         return (int)betterTerrain.Call(MethodName.GetCell, tileMapLayer, coordinate);
 | |
|     }
 | |
| 
 | |
|     public void UpdateTerrainCells(Array<Vector2I> cells, bool updateSurroundingCells = true)
 | |
|     {
 | |
|         betterTerrain.Call(MethodName.UpdateTerrainCells, tileMapLayer, cells, updateSurroundingCells);
 | |
|     }
 | |
| 
 | |
|     public void UpdateTerrainCell(Vector2I cell, bool updateSurroundingCells = true)
 | |
|     {
 | |
|         betterTerrain.Call(MethodName.UpdateTerrainCell, tileMapLayer, cell, updateSurroundingCells);
 | |
|     }
 | |
| 
 | |
|     public void UpdateTerrainArea(Rect2I area, bool updateSurroundingCells = true)
 | |
|     {
 | |
|         betterTerrain.Call(MethodName.UpdateTerrainArea, tileMapLayer, area, updateSurroundingCells);
 | |
|     }
 | |
| 
 | |
|     public Godot.Collections.Dictionary<Variant, Variant> CreateTerrainChangeset(Godot.Collections.Dictionary<Vector2I, int> paint)
 | |
|     {
 | |
|         return (Godot.Collections.Dictionary<Variant, Variant>)betterTerrain.Call(MethodName.CreateTerrainChangeset, tileMapLayer, paint);
 | |
|     }
 | |
| 
 | |
|     public bool IsTerrainChangesetReady(Godot.Collections.Dictionary<Variant, Variant> changeset)
 | |
|     {
 | |
|         return (bool)betterTerrain.Call(MethodName.IsTerrainChangesetReady, changeset);
 | |
|     }
 | |
| 
 | |
|     public void WaitForTerrainChangeset(Godot.Collections.Dictionary<Variant, Variant> changeset)
 | |
|     {
 | |
|         betterTerrain.Call(MethodName.WaitForTerrainChangeset, changeset);
 | |
|     }
 | |
| 
 | |
|     public void ApplyTerrainChangeset(Godot.Collections.Dictionary<Variant, Variant> changeset)
 | |
|     {
 | |
|         betterTerrain.Call(MethodName.ApplyTerrainChangeset, changeset);
 | |
|     }
 | |
| 
 | |
|     private static class MethodName
 | |
|     {
 | |
|         public static readonly StringName GetTerrainCategories = "get_terrain_categories";
 | |
|         public static readonly StringName AddTerrain = "add_terrain";
 | |
|         public static readonly StringName RemoveTerrain = "remove_terrain";
 | |
|         public static readonly StringName TerrainCount = "terrain_count";
 | |
|         public static readonly StringName GetTerrain = "get_terrain";
 | |
|         public static readonly StringName SetTerrain = "set_terrain";
 | |
|         public static readonly StringName SwapTerrains = "swap_terrains";
 | |
|         public static readonly StringName SetTileTerrainType = "set_tile_terrain_type";
 | |
|         public static readonly StringName GetTileTerrainType = "get_tile_terrain_type";
 | |
|         public static readonly StringName SetTileSymmetryType = "set_tile_symmetry_type";
 | |
|         public static readonly StringName GetTileSymmetryType = "get_tile_symmetry_type";
 | |
|         public static readonly StringName GetTilesInTerrain = "get_tiles_in_terrain";
 | |
|         public static readonly StringName GetTileSourcesInTerrain = "get_tile_sources_in_terrain";
 | |
|         public static readonly StringName AddTilePeeringType = "add_tile_peering_type";
 | |
|         public static readonly StringName RemoveTilePeeringType = "remove_tile_peering_type";
 | |
|         public static readonly StringName TilePeeringKeys = "tile_peering_keys";
 | |
|         public static readonly StringName TilePeeringTypes = "tile_peering_types";
 | |
|         public static readonly StringName TilePeeringForType = "tile_peering_for_type";
 | |
|         public static readonly StringName SetCell = "set_cell";
 | |
|         public static readonly StringName SetCells = "set_cells";
 | |
|         public static readonly StringName ReplaceCell = "replace_cell";
 | |
|         public static readonly StringName ReplaceCells = "replace_cells";
 | |
|         public static readonly StringName GetCell = "get_cell";
 | |
|         public static readonly StringName UpdateTerrainCells = "update_terrain_cells";
 | |
|         public static readonly StringName UpdateTerrainCell = "update_terrain_cell";
 | |
|         public static readonly StringName UpdateTerrainArea = "update_terrain_area";
 | |
|         public static readonly StringName CreateTerrainChangeset = "create_terrain_changeset";
 | |
|         public static readonly StringName IsTerrainChangesetReady = "is_terrain_changeset_ready";
 | |
|         public static readonly StringName WaitForTerrainChangeset = "wait_for_terrain_changeset";
 | |
|         public static readonly StringName ApplyTerrainChangeset = "apply_terrain_changeset";
 | |
|     }
 | |
| }
 | 
