Skip to content

Instantly share code, notes, and snippets.

@vmedea
Last active December 5, 2022 23:23
Show Gist options
  • Save vmedea/afefa201e328db1d9253fe0d1812fbbb to your computer and use it in GitHub Desktop.
Save vmedea/afefa201e328db1d9253fe0d1812fbbb to your computer and use it in GitHub Desktop.
Godot tile data instancing plugin for consistent tile configurations
# Tile data instancing plugin for consistent tile configurations.
# Part of "Xenomusa" (C) Mara Huldra 2022
# SPDX-License-Identifier: MIT
@tool
extends EditorPlugin
# Avaiable tileset templates
enum TemplateType {
TERRAIN = 0, # 7x7 terrain template
WALL = 1, # 4x4 wall template
}
# Terrain tile collision type.
# Could ostensibly also be used for occlusion.
enum CollisionType {
PASS = 0, # Always pass
BLOCK_OFF = 1, # "off" terrain is blocker
BLOCK_ON = 2, # "on" terrain is blocker
BLOCK = 3, # Always block
}
# Polygon generation mode.
enum PolygonMode {
BASIC,
DIAG,
}
# Bitmask format to neighbour (depending on terrain mode, so that it only sets valid connectivity bits).
# bit, neighbour
var bitmaskbits = {
TileSet.TERRAIN_MODE_MATCH_CORNERS_AND_SIDES: [
[0b100000000, TileSet.CELL_NEIGHBOR_TOP_LEFT_CORNER],
[0b010000000, TileSet.CELL_NEIGHBOR_TOP_SIDE],
[0b001000000, TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER],
[0b000100000, TileSet.CELL_NEIGHBOR_LEFT_SIDE],
#0b000010000 (self bit)
[0b000001000, TileSet.CELL_NEIGHBOR_RIGHT_SIDE],
[0b000000100, TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_CORNER],
[0b000000010, TileSet.CELL_NEIGHBOR_BOTTOM_SIDE],
[0b000000001, TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER],
],
TileSet.TERRAIN_MODE_MATCH_SIDES: [
[0b010000000, TileSet.CELL_NEIGHBOR_TOP_SIDE],
[0b000100000, TileSet.CELL_NEIGHBOR_LEFT_SIDE],
#0b000010000 (self bit)
[0b000001000, TileSet.CELL_NEIGHBOR_RIGHT_SIDE],
[0b000000010, TileSet.CELL_NEIGHBOR_BOTTOM_SIDE],
],
TileSet.TERRAIN_MODE_MATCH_CORNERS: [
[0b100000000, TileSet.CELL_NEIGHBOR_TOP_LEFT_CORNER],
[0b001000000, TileSet.CELL_NEIGHBOR_TOP_RIGHT_CORNER],
#0b000010000 (self bit)
[0b000000100, TileSet.CELL_NEIGHBOR_BOTTOM_LEFT_CORNER],
[0b000000001, TileSet.CELL_NEIGHBOR_BOTTOM_RIGHT_CORNER],
],
}
# 7x7 terrain template
# subcoord, bitmask
var tile_template_terrain = [
[Vector2i(0, 0), 0b000011011],
[Vector2i(1, 0), 0b000111111],
[Vector2i(2, 0), 0b000110110],
[Vector2i(3, 0), 0b000010010],
[Vector2i(4, 0), 0b111111110],
[Vector2i(5, 0), 0b111111010],
[Vector2i(6, 0), 0b111111011],
[Vector2i(0, 1), 0b011011011],
[Vector2i(1, 1), 0b111111111],
[Vector2i(2, 1), 0b110110110],
[Vector2i(3, 1), 0b010010010],
[Vector2i(4, 1), 0b110111110],
[Vector2i(5, 1), 0b010111010],
[Vector2i(6, 1), 0b011111011],
[Vector2i(0, 2), 0b011011000],
[Vector2i(1, 2), 0b111111000],
[Vector2i(2, 2), 0b110110000],
[Vector2i(3, 2), 0b010010000],
[Vector2i(4, 2), 0b110111111],
[Vector2i(5, 2), 0b010111111],
[Vector2i(6, 2), 0b011111111],
[Vector2i(0, 3), 0b000011000],
[Vector2i(1, 3), 0b000111000],
[Vector2i(2, 3), 0b000110000],
[Vector2i(3, 3), 0b000010000],
[Vector2i(4, 3), 0b000111110],
[Vector2i(5, 3), 0b000111010],
[Vector2i(6, 3), 0b000111011],
[Vector2i(0, 4), 0b011011010],
[Vector2i(1, 4), 0b110110010],
[Vector2i(2, 4), 0b011111110],
[Vector2i(3, 4), 0b110111011],
[Vector2i(4, 4), 0b110111000],
[Vector2i(5, 4), 0b010111000],
[Vector2i(6, 4), 0b011111000],
[Vector2i(0, 5), 0b010011010],
[Vector2i(1, 5), 0b010110010],
[Vector2i(2, 5), 0b000011010],
[Vector2i(3, 5), 0b000110010],
[Vector2i(4, 5), 0b110111010],
[Vector2i(5, 5), 0b011111010],
[Vector2i(0, 6), 0b010011011],
[Vector2i(1, 6), 0b010110110],
[Vector2i(2, 6), 0b010011000],
[Vector2i(3, 6), 0b010110000],
[Vector2i(4, 6), 0b010111110],
[Vector2i(5, 6), 0b010111011],
]
# 4x4 wall template
# subcoord, bitmask
var tile_template_wall = [
[Vector2i(0, 0), 0b000011010],
[Vector2i(1, 0), 0b000111010],
[Vector2i(2, 0), 0b000110010],
[Vector2i(3, 0), 0b000010010],
[Vector2i(0, 1), 0b010011010],
[Vector2i(1, 1), 0b010111010],
[Vector2i(2, 1), 0b010110010],
[Vector2i(3, 1), 0b010010010],
[Vector2i(0, 2), 0b010011000],
[Vector2i(1, 2), 0b010111000],
[Vector2i(2, 2), 0b010110000],
[Vector2i(3, 2), 0b010010000],
[Vector2i(0, 3), 0b000011000],
[Vector2i(1, 3), 0b000111000],
[Vector2i(2, 3), 0b000110000],
[Vector2i(3, 3), 0b000010000],
]
# Template from template type enum
var template_types = {
TemplateType.TERRAIN: tile_template_terrain,
TemplateType.WALL: tile_template_wall,
}
# Map from bitmask to the respective collision polygons. Basic 3x3 grid.
# bitmask, polygons
var polygons_from_bitmask_basic = {
# Block inside
0b000011011: [[Vector2i(1,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4)]],
0b000111111: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b000110110: [[Vector2i(0,1), Vector2i(3,1), Vector2i(3,4), Vector2i(0,4)]],
0b000010010: [[Vector2i(1,1), Vector2i(3,1), Vector2i(3,4), Vector2i(1,4)]],
0b111111110: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(0,4)]],
0b111111010: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b111111011: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b011011011: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4)]],
0b111111111: [[Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,0)]],
0b110110110: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,4), Vector2i(0,4)]],
0b010010010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(1,4)]],
0b110111110: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(0,4)]],
0b010111010: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b011111011: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b011011000: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(1,3)]],
0b111111000: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(0,3)]],
0b110110000: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,3), Vector2i(0,3)]],
0b010010000: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,3), Vector2i(1,3)]],
0b110111111: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b010111111: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b011111111: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b000011000: [[Vector2i(4,1), Vector2i(4,3), Vector2i(1,3), Vector2i(1,1)]],
0b000111000: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b000110000: [[Vector2i(0,1), Vector2i(3,1), Vector2i(3,3), Vector2i(0,3)]],
0b000010000: [[Vector2i(1,1), Vector2i(3,1), Vector2i(3,3), Vector2i(1,3)]],
0b000111110: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(0,4)]],
0b000111010: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b000111011: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b011011010: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4)]],
0b110110010: [[Vector2i(3,0), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3), Vector2i(0,0)]],
0b011111110: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(0,4)]],
0b110111011: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b110111000: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b010111000: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b011111000: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(0,3)]],
0b010011010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4)]],
0b010110010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3), Vector2i(0,1), Vector2i(1,1)]],
0b000011010: [[Vector2i(1,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4)]],
0b000110010: [[Vector2i(0,1), Vector2i(3,1), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b110111010: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b011111010: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
0b010011011: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4)]],
0b010110110: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(0,4)]],
0b010011000: [[Vector2i(1,0), Vector2i(1,3), Vector2i(4,3), Vector2i(4,1), Vector2i(3,1), Vector2i(3,0)]],
0b010110000: [[Vector2i(3,0), Vector2i(3,3), Vector2i(0,3), Vector2i(0,1), Vector2i(1,1), Vector2i(1,0)]],
0b010111110: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,3), Vector2i(3,4), Vector2i(0,4)]],
0b010111011: [[Vector2i(0,1), Vector2i(1,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(1,3), Vector2i(0,3)]],
# Block outside
0b111100100: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(1,1), Vector2i(1,4), Vector2i(0,4)]],
0b111000000: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,0), Vector2i(0,0)]],
0b111001001: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(3,1), Vector2i(0,1)]],
0b111101101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(3,1), Vector2i(1,1), Vector2i(1,4), Vector2i(0,4)]],
0b000000001: [[Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b000000101: [[Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b000000100: [[Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)]],
0b000000000: [],
0b001001001: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b101101101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b001000001: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101000101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b100000100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b000000111: [[Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b001001111: [[Vector2i(0,3), Vector2i(3,3), Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b101101111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,3), Vector2i(3,3), Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b001000000: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)]],
0b101000000: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)]],
0b100000000: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)]],
0b111100111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(1,1), Vector2i(1,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b111000111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b111001111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,3), Vector2i(3,3), Vector2i(3,1), Vector2i(0,1)]],
0b111101111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(1,1), Vector2i(1,3), Vector2i(3,3), Vector2i(3,1), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b111000001: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111000101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111000100: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b001001101: [[Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b100000001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b001000100: [[Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)]],
0b001000111: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b101000111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(4,0), Vector2i(4,1), Vector2i(3,1), Vector2i(3,0)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b100000111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b101100101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101001101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
0b111100101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(1,1), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111001101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(3,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
0b001000101: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b100000101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101100100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)]],
0b101001001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b101100111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)], [Vector2i(4,0), Vector2i(4,1), Vector2i(3,1), Vector2i(3,0)]],
0b101001111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,3), Vector2i(3,3)]],
0b101000001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(3,3), Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101000100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,1), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1), Vector2i(3,1)], [Vector2i(0,3), Vector2i(1,3), Vector2i(1,4), Vector2i(0,4)]],
}
# Map from bitmask to the respective collision polygons. 3x3 grid with diagonals, for better shorelines.
var polygons_from_bitmask_diag = {
# Block inside
0b000011011: [[Vector2i(2,2), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4)]],
0b000111111: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b000110110: [[Vector2i(0,1), Vector2i(2,2), Vector2i(3,4), Vector2i(0,4)]],
0b000010010: [[Vector2i(2,1), Vector2i(3,4), Vector2i(1,4)]],
0b111111110: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,4), Vector2i(0,4)]],
0b111111010: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b111111011: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4), Vector2i(0,3)]],
0b011011011: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4)]],
0b111111111: [[Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,0)]],
0b110110110: [[Vector2i(0,0), Vector2i(3,0), Vector2i(3,4), Vector2i(0,4)]],
0b010010010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(1,4)]],
0b110111110: [[Vector2i(0,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(0,4)]],
0b010111010: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b011111011: [[Vector2i(0,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(1,4), Vector2i(0,3)]],
0b011011000: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(2,2)]],
0b111111000: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,3), Vector2i(0,3)]],
0b110110000: [[Vector2i(0,0), Vector2i(3,0), Vector2i(2,2), Vector2i(0,3)]],
0b010010000: [[Vector2i(1,0), Vector2i(3,0), Vector2i(2,3)]],
0b110111111: [[Vector2i(0,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b010111111: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,4), Vector2i(0,4)]],
0b011111111: [[Vector2i(0,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b000011000: [[Vector2i(4,1), Vector2i(4,3), Vector2i(1,2)]],
0b000111000: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b000110000: [[Vector2i(0,1), Vector2i(3,2), Vector2i(0,3)]],
0b000010000: [[Vector2i(2,1), Vector2i(3,2), Vector2i(2,3), Vector2i(1,2)]],
0b000111110: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(0,4)]],
0b000111010: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b000111011: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(0,3)]],
0b011011010: [[Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4)]],
0b110110010: [[Vector2i(3,0), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3), Vector2i(0,0)]],
0b011111110: [[Vector2i(0,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,4), Vector2i(0,4)]],
0b110111011: [[Vector2i(0,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(0,3)]],
0b110111000: [[Vector2i(0,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b010111000: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(0,3)]],
0b011111000: [[Vector2i(0,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(0,3)]],
0b010011010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4)]],
0b010110010: [[Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3), Vector2i(0,1)]],
0b000011010: [[Vector2i(2,2), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4)]],
0b000110010: [[Vector2i(0,1), Vector2i(2,2), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b110111010: [[Vector2i(0,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b011111010: [[Vector2i(0,1), Vector2i(1,0), Vector2i(4,0), Vector2i(4,3), Vector2i(3,4), Vector2i(1,4), Vector2i(0,3)]],
0b010011011: [[Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4)]],
0b010110110: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(3,4), Vector2i(0,4)]],
0b010011000: [[Vector2i(1,0), Vector2i(2,2), Vector2i(4,3), Vector2i(4,1), Vector2i(3,0)]],
0b010110000: [[Vector2i(3,0), Vector2i(2,2), Vector2i(0,3), Vector2i(0,1), Vector2i(1,0)]],
0b010111110: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,3), Vector2i(3,4), Vector2i(0,4)]],
0b010111011: [[Vector2i(0,1), Vector2i(1,0), Vector2i(3,0), Vector2i(4,1), Vector2i(4,4), Vector2i(1,4), Vector2i(0,3)]],
# Block outside
0b111100100: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(2,2), Vector2i(1,4), Vector2i(0,4)]],
0b111000000: [[Vector2i(0,1), Vector2i(4,1), Vector2i(4,0), Vector2i(0,0)]],
0b111001001: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(2,2), Vector2i(0,1)]],
0b111101101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(2,1), Vector2i(1,4), Vector2i(0,4)]],
0b000000001: [[Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b000000101: [[Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b000000100: [[Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)]],
0b000000000: [],
0b001001001: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b101101101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b001000001: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101000101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b100000100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(2,2), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b000000111: [[Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b001001111: [[Vector2i(0,3), Vector2i(2,2), Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b101101111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(2,3), Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4)]],
0b001000000: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)]],
0b101000000: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)]],
0b100000000: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)]],
0b111100111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(1,2), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b111000111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b111001111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,3), Vector2i(3,2), Vector2i(0,1)]],
0b111101111: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,2), Vector2i(3,2), Vector2i(2,1), Vector2i(1,2), Vector2i(2,3), Vector2i(3,2), Vector2i(4,2), Vector2i(4,4), Vector2i(0,4)]],
0b111000001: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111000101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111000100: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
0b100100101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b001001101: [[Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b100000001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b001000100: [[Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)]],
0b001000111: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b101000111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(4,0), Vector2i(4,1), Vector2i(3,0)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b100000111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(0,3), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)]],
0b101100101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101001101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
0b111100101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,1), Vector2i(2,2), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b111001101: [[Vector2i(0,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4), Vector2i(2,2), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
0b001000101: [[Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b100000101: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101100100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(1,4), Vector2i(0,4)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)]],
0b101001001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(3,4)]],
0b101100111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(2,2), Vector2i(4,3), Vector2i(4,4), Vector2i(0,4)], [Vector2i(4,0), Vector2i(4,1), Vector2i(3,0)]],
0b101001111: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,4), Vector2i(0,4), Vector2i(0,3), Vector2i(2,2)]],
0b101000001: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(4,3), Vector2i(4,4), Vector2i(3,4)]],
0b101000100: [[Vector2i(0,0), Vector2i(1,0), Vector2i(0,1)], [Vector2i(3,0), Vector2i(4,0), Vector2i(4,1)], [Vector2i(0,3), Vector2i(1,4), Vector2i(0,4)]],
}
# Polygon generation modes, from enum.
var polygon_modes = {
PolygonMode.BASIC: polygons_from_bitmask_basic,
PolygonMode.DIAG: polygons_from_bitmask_diag,
}
# Actual tileset templates to instantiate.
var instance_table = [
# Source 0
# Holes
{
source_id = 0,
base_tile = Vector2i(14, 7),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -10,
collision_stop_x3 = 10,
collision_stop_y1 = -10,
collision_stop_y3 = 10,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 7,
terrain_off = -1,
},
# Grey stone floor
{
source_id = 0,
base_tile = Vector2i(7, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.PASS,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 6,
terrain_off = -1,
},
# Source 1
# Water<->LightPurpleTerrain shoreline
{
source_id = 1,
base_tile = Vector2i(0, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_OFF,
collision_polygon = PolygonMode.DIAG,
collision_stop_x1 = -5.5,
collision_stop_x3 = 5.5,
collision_stop_y1 = -5.5,
collision_stop_y3 = 5.5,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 2,
terrain_off = 0,
},
# Ground<->Hot lava shoreline
{
source_id = 1,
base_tile = Vector2i(7, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.DIAG,
collision_stop_x1 = -8,
collision_stop_x3 = 11,
collision_stop_y1 = -7,
collision_stop_y3 = 7,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 4,
terrain_off = 1,
},
# Ground<->Cold lava shoreline
{
source_id = 1,
base_tile = Vector2i(7, 7),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.PASS,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 3,
terrain_off = 1,
},
# Ground<->Purple terrain shoreline
{
source_id = 1,
base_tile = Vector2i(0, 14),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.PASS,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 2,
terrain_off = 1,
},
# Cold lava<->Hot lava shoreline
{
source_id = 1,
base_tile = Vector2i(7, 14),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -11,
collision_stop_x3 = 11,
collision_stop_y1 = -11,
collision_stop_y3 = 11,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 4,
terrain_off = 3,
},
# Purple block building
{
source_id = 1,
base_tile = Vector2i(0, 21),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 2,
terrain_on = 6,
terrain_off = -1,
},
# Source 2
# Water<->Ground shoreline
{
source_id = 2,
base_tile = Vector2i(7, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_OFF,
collision_polygon = PolygonMode.DIAG,
collision_stop_x1 = -10,
collision_stop_x3 = 10,
collision_stop_y1 = -10,
collision_stop_y3 = 10,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 0,
terrain_on = 1,
terrain_off = 0,
},
# Purple shrub 1
{
source_id = 2,
base_tile = Vector2i(42, 7),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -5.5,
collision_stop_x3 = 5.5,
collision_stop_y1 = -5.5,
collision_stop_y3 = 5.5,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 2,
terrain_off = -1,
},
# Purple shrub 2
{
source_id = 2,
base_tile = Vector2i(49, 14),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -5.5,
collision_stop_x3 = 5.5,
collision_stop_y1 = -5.5,
collision_stop_y3 = 5.5,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 3,
terrain_off = -1,
},
# Brown shrub
{
source_id = 2,
base_tile = Vector2i(42, 14),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -5.5,
collision_stop_x3 = 5.5,
collision_stop_y1 = -5.5,
collision_stop_y3 = 5.5,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 4,
terrain_off = -1,
},
# Source 3
# Building front 1
{
source_id = 3,
base_tile = Vector2i(0, 7),
template_type = TemplateType.WALL,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 1,
terrain_on = 0,
terrain_off = -1,
},
# Building front 2
{
source_id = 3,
base_tile = Vector2i(4, 7),
template_type = TemplateType.WALL,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 1,
terrain_on = 1,
terrain_off = -1,
},
# Building front 3
{
source_id = 3,
base_tile = Vector2i(8, 7),
template_type = TemplateType.WALL,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 1,
terrain_on = 8,
terrain_off = -1,
},
# Building front 4
{
source_id = 3,
base_tile = Vector2i(12, 7),
template_type = TemplateType.WALL,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 1,
terrain_on = 9,
terrain_off = -1,
},
# Building roof 1
{
source_id = 3,
base_tile = Vector2i(0, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_OFF,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -2,
collision_stop_x3 = 2,
collision_stop_y1 = -8,
collision_stop_y3 = 8,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 2,
terrain_on = 7,
terrain_off = -1,
},
# Building roof 2
{
source_id = 3,
base_tile = Vector2i(14, 0),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_OFF,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -2,
collision_stop_x3 = 2,
collision_stop_y1 = -8,
collision_stop_y3 = 8,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 2,
terrain_on = 8,
terrain_off = -1,
},
# Source 6
# Crystals overlay
{
source_id = 6,
base_tile = Vector2i(0, 4),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.BLOCK_ON,
collision_polygon = PolygonMode.BASIC,
collision_stop_x1 = -5.5,
collision_stop_x3 = 5.5,
collision_stop_y1 = -5.5,
collision_stop_y3 = 5.5,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 0,
terrain_off = -1,
},
# Purple haze
{
source_id = 6,
base_tile = Vector2i(7, 4),
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.PASS,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 1,
terrain_off = -1,
},
# Dark haze
{
source_id = 6,
base_tile = Vector2i(7, 4),
alternative = 1,
template_type = TemplateType.TERRAIN,
do_set_collision = true,
physics_layer = 0,
collision_type = CollisionType.PASS,
collision_polygon = PolygonMode.BASIC,
do_set_occluder = false,
do_set_terrain = true,
terrain_set = 3,
terrain_on = 8,
terrain_off = -1,
},
]
func _enter_tree():
print("Running tileset templater plugin")
var tileset: TileSet = load("res://tilesets/game.tres")
for op in instance_table:
var alternative: int = 0
if "alternative" in op:
alternative = op["alternative"]
print("Instantiating tile template to source %s base coordinate %s alternative %s..." % [op.source_id, op.base_tile, alternative])
var source = tileset.get_source(op.source_id) as TileSetAtlasSource
if source == null:
printerr("Tile source %s is not a TileAtlasSource" % [op.source_id])
return
for rec in template_types[op.template_type]:
var subcoord: Vector2i = rec[0]
var bitmask: int = rec[1]
var data: TileData = source.get_tile_data(op.base_tile + subcoord, alternative)
if data != null:
if op.do_set_collision:
var collision_bitmask = 0
if op.collision_type & CollisionType.BLOCK_ON:
collision_bitmask |= bitmask
if op.collision_type & CollisionType.BLOCK_OFF:
# XXX: inversion formula would be different for non-3x3 tile formats
collision_bitmask |= (~bitmask) & 0x1ff
var polygons = polygon_modes[op.collision_polygon][collision_bitmask]
data.set_collision_polygons_count(op.physics_layer, polygons.size())
# Expand polygons to tile size and possibly custom stops.
var xstops = [-tileset.tile_size.x / 2, -tileset.tile_size.x / 6, 0, tileset.tile_size.x / 6, tileset.tile_size.x / 2]
var ystops = [-tileset.tile_size.y / 2, -tileset.tile_size.y / 6, 0, tileset.tile_size.y / 6, tileset.tile_size.y / 2]
if "collision_stop_x1" in op:
xstops[1] = op.collision_stop_x1
if "collision_stop_x3" in op:
xstops[3] = op.collision_stop_x3
if "collision_stop_y1" in op:
ystops[1] = op.collision_stop_y1
if "collision_stop_y3" in op:
ystops[3] = op.collision_stop_y3
for pid in polygons.size():
var points: PackedVector2Array = PackedVector2Array()
for point in polygons[pid]:
points.append(Vector2(xstops[point[0]], ystops[point[1]]))
data.set_collision_polygon_points(op.physics_layer, pid, points)
if op.do_set_occluder:
# data.set_occluder ...
pass
if op.do_set_terrain:
data.terrain_set = op.terrain_set
data.terrain = op.terrain_on
for bitinfo in bitmaskbits[tileset.get_terrain_set_mode(op.terrain_set)]:
if rec[1] & bitinfo[0]:
data.set_terrain_peering_bit(bitinfo[1], op.terrain_on)
else:
data.set_terrain_peering_bit(bitinfo[1], op.terrain_off)
else:
printerr("Tile %s:%s:%s has no associated data" % [op.source_id, subcoord, alternative])
print("Successfully set all tile information.")
func _exit_tree():
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment