Pixel-Composer/scripts/binder_gamemaker_tile/binder_gamemaker_tile.gml
2024-12-16 18:03:02 +07:00

99 lines
2.4 KiB
Text

function GMRoom_Tile(_room, _gm, _raw) : GMRoom_Layer(_room, _gm, _raw) constructor {
index = 1;
tiles = raw.tiles;
tilesetId = raw.tilesetId;
tileset = noone;
static link = function() {
tileset = gmBinder.getResourceFromPath(struct_try_get(tilesetId, "path", ""));
array_foreach(layers, function(l) /*=>*/ {return l.link()});
}
static doRefreshPreview = function() {
}
static setArray = function(arr) {
var _ww = tiles.SerialiseWidth;
var _hh = tiles.SerialiseHeight;
arr = array_verify(arr, _ww * _hh);
var _ctil = [];
var _type = arr[0];
var _runn = 1;
for( var j = 1, m = array_length(arr); j < m; j++ ) {
if(arr[j] == _type) _runn++
else {
array_push(_ctil, -_runn, _type);
_type = arr[j];
_runn = 1;
}
}
array_push(_ctil, -_runn, _type);
if(array_length(_ctil) < array_length(arr)) {
tiles.TileCompressedData = _ctil;
tiles.TileDataFormat = 1;
} else {
tiles.TileSerialiseData = arr;
struct_remove(tiles, "TileDataFormat");
}
}
static resizeBBOX = function(bbox) {
var _form = struct_try_get(tiles, "TileDataFormat", 0);
var _ow = tiles.SerialiseWidth;
var _oh = tiles.SerialiseHeight;
var _nw = bbox[2] - bbox[0];
var _nh = bbox[3] - bbox[1];
var _dx = -bbox[0];
var _dy = -bbox[1];
var _grdo = ds_grid_create(_ow, _oh);
var _grdn = ds_grid_create(_nw, _nh);
var _data;
if(_form == 0) {
_data = tiles.TileSerialiseData;
} else if(_form == 1) {
var _d = tiles.TileCompressedData;
var _amo, _til, _i = 0;
for( var i = 0, n = array_length(_d); i < n; i += 2 ) {
_amo = -_d[i + 0];
_til = _d[i + 1];
_til = max(0, _til + bool(_til));
repeat(_amo) _data[_i++] = _til;
}
}
var _i = 0;
for( var i = 0; i < _oh; i++ )
for( var j = 0; j < _ow; j++ )
ds_grid_set(_grdo, j, i, _data[_i++]);
ds_grid_set_grid_region(_grdn, _grdo, max(-_dx, 0), max(-_dy, 0), _ow - 1, _oh - 1, max(_dx, 0), max(_dy, 0));
var _dn = array_create(_nw * _nh);
var _i = 0;
for( var i = 0; i < _oh; i++ )
for( var j = 0; j < _ow; j++ )
_dn[i++] = ds_grid_get(_grdn, j, i);
ds_grid_destroy(_grdo);
ds_grid_destroy(_grdn);
tiles.SerialiseWidth = _nw;
tiles.SerialiseHeight = _nh;
setArray(_dn);
}
}