Alright then, four testers sounds like it'll be good enough! I'll be sending out DMs to Meph, Wokko, september and Nikitaw99 once the tileset is finished. Once Bitlands has been tested I'll be putting up a thread and throwing up the tileset+installer on GitHub.
Progress has been going smoothly. I've finished writing the 2500+ item and tile overrides which covers absolutely everything TWBT allows you to change except for buildings and workshops. As stated previously, Bitlands will not feature workshop overrides until I draw those and mifki adds proper workshop support. I will, however, be adding all of the single-tile buildings as well as multi-tile ones like axles and bridges.
With this semifinal update, I thought I'd highlight one of the biggest time-savers in Bitlands: the Python scripts. This is one of the more technical aspects so if you can't program then don't worry, this won't interfere with how you use the tileset and you can ignore this.
def floor(name, pos, varied, uniform=0):
x = pos[0]
y = pos[1]
prefix = ['Light', 'Dark', 'Dry', 'Dead'] if 'Grass' in name else ['']
for i in range(4):
for p in prefix:
tiles[x + i][y].append('%s%sFloor%s:%s' % (name, p, i + 1, varied[i]))
if uniform and uniform != varied[i]:
tiles[x + i][y].append('%s%sFloor%s:%s' % (name, p, i + 1, uniform))
Defined in overrides.py are a bunch of functions like this which allow me to quickly generate all overrides of a type. You input the tile type of the floor, the position on the tileset and what the varied/uniform tiles of the floor are. The function generates all of the overrides in a simplified format like "GrassLightFloor:46" and adds it to a giant 2D array called tiles[][]. In the final step (not shown) the script iterates through tiles[][] and writes all the overrides in it. An example output after calling floor('Grass', [8, 4], [46, 44, 96, 39], 46):
[OVERRIDE:46:T:GrassLightFloor1:tiles:72]
[OVERRIDE:46:T:GrassDarkFloor1:tiles:72]
[OVERRIDE:46:T:GrassDryFloor1:tiles:72]
[OVERRIDE:46:T:GrassDeadFloor1:tiles:72]
[OVERRIDE:44:T:GrassLightFloor2:tiles:73]
[OVERRIDE:46:T:GrassLightFloor2:tiles:73]
[OVERRIDE:44:T:GrassDarkFloor2:tiles:73]
[OVERRIDE:46:T:GrassDarkFloor2:tiles:73]
[OVERRIDE:44:T:GrassDryFloor2:tiles:73]
[OVERRIDE:46:T:GrassDryFloor2:tiles:73]
[OVERRIDE:44:T:GrassDeadFloor2:tiles:73]
[OVERRIDE:46:T:GrassDeadFloor2:tiles:73]
[OVERRIDE:96:T:GrassLightFloor3:tiles:74]
[OVERRIDE:46:T:GrassLightFloor3:tiles:74]
[OVERRIDE:96:T:GrassDarkFloor3:tiles:74]
[OVERRIDE:46:T:GrassDarkFloor3:tiles:74]
[OVERRIDE:96:T:GrassDryFloor3:tiles:74]
[OVERRIDE:46:T:GrassDryFloor3:tiles:74]
[OVERRIDE:96:T:GrassDeadFloor3:tiles:74]
[OVERRIDE:46:T:GrassDeadFloor3:tiles:74]
[OVERRIDE:39:T:GrassLightFloor4:tiles:75]
[OVERRIDE:46:T:GrassLightFloor4:tiles:75]
[OVERRIDE:39:T:GrassDarkFloor4:tiles:75]
[OVERRIDE:46:T:GrassDarkFloor4:tiles:75]
[OVERRIDE:39:T:GrassDryFloor4:tiles:75]
[OVERRIDE:46:T:GrassDryFloor4:tiles:75]
[OVERRIDE:39:T:GrassDeadFloor4:tiles:75]
[OVERRIDE:46:T:GrassDeadFloor4:tiles:75]
Bootstrapping like this instead of directly writing overrides has a number of advantages: it allows me to specify the x, y coordinates of tiles rather than the absolute tile indexes, so it's easy to update positions if I move something in the tileset. It makes writing overrides more organized and less error-prone than writing them one-by-one. Things like ANY_ENCASED variations or material tags can be automatically generated. If I want to add, say, more wall materials it's as simple as adding one more line to the script.
All of the scripts used to generate Bitlands will be included in the download in case people want to modify them for their own tileset.