102 lines
2.7 KiB
Markdown
102 lines
2.7 KiB
Markdown
|
# Custom Rules for Rule Tile
|
|||
|
|
|||
|
__Contribution by:__ [johnsoncodehk](https://github.com/johnsoncodehk)
|
|||
|
|
|||
|
Use this template script to create new custom [Rule Tiles](RuleTile.md) with matching options that differ from the Rule Tile’s [default options](RuleTile.md#Usage) (namely **This** and **Not This**). This creates selectable options for each Rule in your custom __Rule Tile__.
|
|||
|
|
|||
|
## Template features
|
|||
|
|
|||
|
- Inheritable Rule Tile.
|
|||
|
- Customizable properties.
|
|||
|
- Expand or rewrite both neighbor Rules and the GUI display of the Rules.
|
|||
|
- Usable with by [RuleOverrideTile](RuleOverrideTile.md)
|
|||
|
- Create from a template script.
|
|||
|
- Neighbor Rules tooltips.
|
|||
|
- Backward compatible.
|
|||
|
|
|||
|
## Creating a custom Rule Tile script
|
|||
|
|
|||
|
Create a Custom Rule Tile script by going to __Assets > Create > Custom Rule Tile Script__. Name the newly created file when prompted. After creating the file, you can edit it to add new matching options and custom algorithms for testing matches.
|
|||
|
|
|||
|
### Examples
|
|||
|
|
|||
|
- Custom properties:
|
|||
|
|
|||
|
```csharp
|
|||
|
public class MyTile : RuleTile {
|
|||
|
public string tileId;
|
|||
|
public bool isWater;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
- Custom rules:
|
|||
|
|
|||
|
```csharp
|
|||
|
public class MyTile : RuleTile<MyTile.Neighbor> {
|
|||
|
public class Neighbor {
|
|||
|
public const int MyRule1 = 0;
|
|||
|
public const int MyRule2 = 1;
|
|||
|
}
|
|||
|
public override bool RuleMatch(int neighbor, TileBase tile) {
|
|||
|
switch (neighbor) {
|
|||
|
case Neighbor.MyRule1: return false;
|
|||
|
case Neighbor.MyRule2: return true;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
- Expansion rules
|
|||
|
|
|||
|
```csharp
|
|||
|
public class MyTile : RuleTile<MyTile.Neighbor> {
|
|||
|
public class Neighbor : RuleTile.TilingRule.Neighbor {
|
|||
|
// 0, 1, 2 is using in RuleTile.TilingRule.Neighbor
|
|||
|
public const int MyRule1 = 3;
|
|||
|
public const int MyRule2 = 4;
|
|||
|
}
|
|||
|
public override bool RuleMatch(int neighbor, TileBase tile) {
|
|||
|
switch (neighbor) {
|
|||
|
case Neighbor.MyRule1: return false;
|
|||
|
case Neighbor.MyRule2: return true;
|
|||
|
}
|
|||
|
return base.RuleMatch(neighbor, tile);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
- Siblings Tile 1
|
|||
|
|
|||
|
```csharp
|
|||
|
public class MyTile : RuleTile<MyTile.Neighbor> {
|
|||
|
public List<TileBase> sibings = new List<TileBase>();
|
|||
|
public class Neighbor : RuleTile.TilingRule.Neighbor {
|
|||
|
public const int Sibing = 3;
|
|||
|
}
|
|||
|
public override bool RuleMatch(int neighbor, TileBase tile) {
|
|||
|
switch (neighbor) {
|
|||
|
case Neighbor.Sibing: return sibings.Contains(tile);
|
|||
|
}
|
|||
|
return base.RuleMatch(neighbor, tile);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
- Siblings Tile 2
|
|||
|
|
|||
|
```csharp
|
|||
|
public class MyTile : RuleTile<MyTile.Neighbor> {
|
|||
|
public int siblingGroup;
|
|||
|
public class Neighbor : RuleTile.TilingRule.Neighbor {
|
|||
|
public const int Sibing = 3;
|
|||
|
}
|
|||
|
public override bool RuleMatch(int neighbor, TileBase tile) {
|
|||
|
MyTile myTile = tile as MyTile;
|
|||
|
switch (neighbor) {
|
|||
|
case Neighbor.Sibing: return myTile && myTile.siblingGroup == siblingGroup;
|
|||
|
}
|
|||
|
return base.RuleMatch(neighbor, tile);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|