mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 07:28:14 +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";
|
|
}
|
|
}
|