[Mod] Settlements [settlements]

MoNTE48
Member
Posts: 323
Joined: Sat Apr 06, 2013 11:58
GitHub: MoNTE48
In-game: MoNTE48
Location: Internet

Re: [Mod] Settlements [settlements]

by MoNTE48 » Post

FaceDeer, Your work looks amazing.
Replacing mts with lua seems unnecessary for release, this makes the mod big, and simple players do not need it. Support for lua and mts schemes for development would be more useful.
Moreover, mts-> lua-> mts conversion is very simple.
It is also mandatory dependence in the store mod seems unnecessary for me, it could be optional. The rest is really cool!

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

Will it be possible to spawn settlements underground as well? I’m also trying to think in broader ways of what structures can be used other than buildings…

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

MoNTE48 wrote:FaceDeer, Your work looks amazing.
Replacing mts with lua seems unnecessary for release, this makes the mod big, and simple players do not need it. Support for lua and mts schemes for development would be more useful.
Moreover, mts-> lua-> mts conversion is very simple.
It is also mandatory dependence in the store mod seems unnecessary for me, it could be optional. The rest is really cool!
The lua schematics are actually necessary to support the varying node replacements that give each settlement a different wall material. When an .mts schematic is loaded replacements are done once and the result is cached, and cannot be re-done for that .mts until the server restarts. The original version of this mod that I started with actually converted the .mts schematic into a .lua schematic internally every single time it placed a building, which strikes me as a rather inefficient and unnecessary step. For development I left a bit of code in this mod that can be used to convert .mts into .lua, though you need to edit lua files to actually call it (it would be a mod security violation to use it routinely since it writes files into the mod's folder rather than the world folder).

If you're concerned about the mod's size, note that I removed four megabytes of high-resolution .png screenshots and replaced it with half a megabyte of smaller .jpegs, and the schematics folder is currently just 90 kilobytes in total, so it'll take a lot of schematics before there's a net increase in the mod's footprint compared to the previous version. :)

The commoditymarket mod is already an optional dependency, if it's not installed then the mod will replace those nodes with chests. If there are other merchant-type mods you'd like optional support for as well, let me know and I can have other nodes swapped in for them when available. That's another thing that's easier to do with .lua schematics, the "if modpath then blah" code is embedded right inside the schematic.
texmex wrote:Will it be possible to spawn settlements underground as well? I’m also trying to think in broader ways of what structures can be used other than buildings…
Not yet, the mod still relies on the mapgen heightfield object for finding the contours of the land it's placing stuff on. But my long-term goal is to use this to put stuff into DFCaverns, so eventually I'll need to change that. This release is basically just cleanup work to make the mod easier for me to work with in future.

I was going to add a "ruins" settlement type to the defaults, but I forgot about it until right before I was about to make that post last night and I decided I didn't want to hold off for another couple of days while I made the schematics and tested it out. I'll add that later. :)

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

Initial testing shows a very nice placement of cute, tight-knit communities.

My only disappoint so far is that it depends on MTG. In a wat that’s not a surprise since the schematic nodes comes from MTG as well but in my case I’d like to use a completely different set of nodes anyway, for a new game.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

texmex wrote:Initial testing shows a very nice placement of cute, tight-knit communities.

My only disappoint so far is that it depends on MTG. In a wat that’s not a surprise since the schematic nodes comes from MTG as well but in my case I’d like to use a completely different set of nodes anyway, for a new game.
Hopefully another thing that the lua-based schematics will be helpful with fixing. :) The hard dependencies are mostly to the nodes used in those schematics (it also uses the default mod's wooden shovel texture, and now that I think of it the special junglenode flooring that the NPC mobs mod looks for is also a "default" dependency I should move into a more encapsulated place) so you could eliminate those as hard dependencies by just disabling all the default settlement types.

I'll try to clean that up a bit later today, I bet I could make everything into optional dependencies.

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

FaceDeer wrote: I should move into a more encapsulated place) so you could eliminate those as hard dependencies by just disabling all the default settlement types
Cool! Ideal for me would be a mod split into a pure library mod and a content mod, but maybe you're into some slightly other philosophy. =)

User avatar
DrFrankenstone
Member
Posts: 231
Joined: Tue May 24, 2016 05:36
GitHub: treer
Location: Australia
Contact:

Re: [Mod] Settlements [settlements]

by DrFrankenstone » Post

FaceDeer wrote:The lua schematics are actually necessary to support the varying node replacements that give each settlement a different wall material. When an .mts schematic is loaded replacements are done once and the result is cached, and cannot be re-done for that .mts until the server restarts.
FWIW there are ways around that problem. The hack I use is here, and ShadMOrdre suggests another approach here.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

texmex wrote:
FaceDeer wrote: I should move into a more encapsulated place) so you could eliminate those as hard dependencies by just disabling all the default settlement types
Cool! Ideal for me would be a mod split into a pure library mod and a content mod, but maybe you're into some slightly other philosophy. =)
Heh. That's my general philosophy too, but often (as in this case) I start with a mod that does something very specific already and then I have to carefully peel the generic library out of it. That's how I extracted subterrane out of caverealms, for example. And other times I start with the generic library, but I create a few bits of content to test it with and those take on a life of their own. That happened with commoditymarkets, the default markets I created for it were originally just a couple of testbeds. So I'm not a purist, even though I try to make it work both ways.

I just did a marathon bit of reorganization of settlements' code, and in theory every other mod is now an optional dependency. If you don't have the default mod (and several of the other MTG mods) installed then none of the settlement types bundled with this mod will generate, and if you don't have the default mod the admin tools won't be registered right now (I need to whip up some custom art for those), but the mod should refrain from crashing or throwing any errirs. Note that I haven't actually tested that, though.
DrFrankenstone wrote: FWIW there are ways around that problem. The hack I use is here, and ShadMOrdre suggests another approach here.
Oh, your hack is beautiful and horrifying. I never would have thought of that. :)

I think I'm going to stick with lua schematics regardless, though. Your solution of creating "unique" filenames for every combination of replacements could get out of hand if someone defines a settlement that has a whole bunch of different possible replacements, for example in addition to randomly substituting wall materials one might also substitute the tree types that the frame is made out of and then you've got n^2 filenames to keep track of. Also, I still like being able to put code inside the schematic lua itself. If you look inside medeival_kingsmarket.lua, for example, I'm able to adapt to whether the commoditymarket:kings_market node is registered or the "vessels" mod is loaded and fix the schematic's contents on the fly. No need to worry about adding replacements for those nodes if they're not available, the schematic handles it automatically.

ShadMOrdre
Member
Posts: 1118
Joined: Mon Dec 29, 2014 08:07
Location: USA

Re: [Mod] Settlements [settlements]

by ShadMOrdre » Post

For what it's worth, here is an example of the direction I am headed with schematics. The idea is to create an "ontology" of codes that can be used as a singular point of reference for the node types available within schematics. This "ontology"code would essentially contain a Node Def code, a direction code, and a probability code; something like FurN or Mat009 or Str039 or Slb804. The first three letters are a specific node reference, in this case, furnace, 'material', stairs and slab. The first digit after the name is for the six cardinal directions, (north, east, south, west, up, down OR +z, +x, -z, -x, +y, -y), and could easily also be the letters 'NESWUD'. The second digit would be for the axial rotation along the corresponding cardinal direction. There are 24 possible rotations, and either the above or simply enumerating the rotations from 00 to 23 could also occupy the first and second digits. The third digit of the ontological code would be for probabilities. Except in specific circumstances, offering probabilities in percentages is more likely more efficient in the long run. Not many instance use a probability of 1/256 chance, and those cases can still be accomodated, if desired.

Long explanation, but hear me out please. By using something akin to the above proposal, lua tables can still be "viewable" images of the included schematic, and probably easy from which to "draw" a HUD image. It also makes lua schematic tables more efficient by making file sizes smaller. Most lua schems are outright serialized tables, and so include LOTS of white space, and large amounts of repetitive meta data. All that data can be compressed into a very standardized "ontological encoding". The lua tables can also be loaded into temporary variables, drawing the required node definitions from any of a set of predefined, or user defined, tables. These tables could also easily be filled with the relevant node defs from the registered_biomes table. All nodes, in all schematics could use the same data sets, or different data sets, all while using a single encoded "node def" within the actual lua table.

Long winded. I know. Here is an example of the direction I'm thinking, and have been using for over a year. This is also found in lib_mat / lib_eco, for all schematics in those mods. Trees became so trivial.

I have to post the actual schems using this in a second post.
Spoiler

Code: Select all

--Air, Lava, and Water constants used throughout schematics
		local __ = {name = "air", param2 = 0, prob = 0}
		local wt = {name = "lib_materials:liquid_water_river_source", param2 = 0, prob = 254}
		local lv = {name = "lib_materials:liquid_lava_source", param2 = 0, prob = 254}
		local lf = {name = "lib_materials:liquid_lava_flowing", param2 = 0, prob = 254}
		
--Node Definitions
		local M0 = {name = "lib_materials:stone", param2 = 0, prob = 254}
		local M1 = {name = "lib_materials:stone_cobble", param2 = 0, prob = 254}
		local M2 = {name = "lib_materials:stone_brick", param2 = 0, prob = 254}
		local M3 = {name = "lib_materials:stone_block", param2 = 0, prob = 254}
		local M4 = {name = "lib_materials:stone_stucco", param2 = 0, prob = 254}
		local M5 = {name = "lib_materials:stone_brick_slab", param2 = 3, prob = 254}
		local M6 = {name = "lib_materials:stone_cobble_stairs", param2 = 0, prob = 254}
		local M7 = {name = "lib_materials:stone_brick_slab", param2 = 0, prob = 254}
		local M8 = {name = "", param2 = 0, prob = 254}
		local M9 = {name = "", param2 = 0, prob = 254}
		local MX = {name = "", param2 = 4, prob = 254}
		local MZ = {name = "", param2 = 8, prob = 254}

		local N0 = {name = "lib_materials:stone_sand", param2 = 0, prob = 254}
		local N1 = {name = "lib_materials:sand", param2 = 0, prob = 254}
		local N2 = {name = "lib_materials:stone_gravel", param2 = 0, prob = 254}
		local N3 = {name = "lib_materials:stone_cobble_mossy", param2 = 0, prob = 254}
		local N4 = {name = "lib_materials:stone_brick_mossy", param2 = 0, prob = 254}
		local N5 = {name = "lib_materials:stone_tile", param2 = 0, prob = 254}
		local N6 = {name = "lib_materials:stone_tile_with_dirt", param2 = 0, prob = 254}
		local N7 = {name = "lib_materials:stone_tile_mossy", param2 = 0, prob = 254}
		local N8 = {name = "lib_materials:stone_tile_crumbled", param2 = 0, prob = 254}
		local N9 = {name = "lib_ecology:tree_default_wood", param2 = 0, prob = 254}
		local NY = {name = "lib_ecology:tree_default_trunk", param2 = 0, prob = 254}
		local NZ = {name = "lib_ecology:tree_default_trunk", param2 = 4, prob = 254}
		local NX = {name = "lib_ecology:tree_default_trunk", param2 = 8, prob = 254}

	local S0 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 0, prob = 254}
	local S1 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 1, prob = 254}
	local S2 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 2, prob = 254}
	local S3 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 3, prob = 254}
	local S4 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 20, prob = 254}
	local S6 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 21, prob = 254}
	local S7 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 22, prob = 254}
	local S8 = {name = "lib_ecology:tree_default_wood_stairs", param2 = 23, prob = 254}
	local SN = {name = "lib_ecology:tree_default_wood_slab", param2 = 0, prob = 254}
	local SE = {name = "lib_ecology:tree_default_wood_slab", param2 = 1, prob = 254}
	local SW = {name = "lib_ecology:tree_default_wood_slab", param2 = 2, prob = 254}
	local S0 = {name = "lib_ecology:tree_default_wood_slab", param2 = 3, prob = 254}
	
	local Q0 = {name = "lib_materials:stone_cobble_stairs", param2 = 0, prob = 254}
	local Q1 = {name = "lib_materials:stone_cobble_stairs", param2 = 1, prob = 254}
	local Q2 = {name = "lib_materials:stone_cobble_stairs", param2 = 2, prob = 254}
	local Q3 = {name = "lib_materials:stone_cobble_stairs", param2 = 3, prob = 254}
	local Q5 = {name = "lib_materials:stone_cobble_stairs", param2 = 20, prob = 254}
	local Q6 = {name = "lib_materials:stone_cobble_stairs", param2 = 21, prob = 254}
	local Q7 = {name = "lib_materials:stone_cobble_stairs", param2 = 22, prob = 254}
	local Q8 = {name = "lib_materials:stone_cobble_stairs", param2 = 23, prob = 254}
	local QN = {name = "lib_materials:stone_cobble_slab", param2 = 0, prob = 254}
	local QE = {name = "lib_materials:stone_cobble_slab", param2 = 1, prob = 254}
	local QW = {name = "lib_materials:stone_cobble_slab", param2 = 2, prob = 254}
	local QS = {name = "lib_materials:stone_cobble_slab", param2 = 3, prob = 254}
	
		local JW = {name = "lib_ecology:tree_jungle_01_wood", param2 = 0, prob = 254}
		local PW = {name = "lib_ecology:tree_pine_01_wood", param2 = 0, prob = 254}
		

		local DD = {name = "lib_materials:dirt", param2 = 0, prob = 254}
		local DG = {name = "lib_materials:dirt_with_grass", param2 = 0, prob = 254}
		local GR = {name = "lib_materials:dirt_with_grass", param2 = 0, prob = 254}
		local G1 = {name = "lib_materials:glass", param2 = 0, prob = 254}

		local FF = {name = "lib_materials:dirt_with_soil_wet", param2 = 0, prob = 254}
		local CC = {name = "lib_ecology:plant_corn_5", param2 = 0, prob = 254}
		
		
		local F0 = {name = "lib_forge:furnace", param2 = 0, prob = 254}
		local F1 = {name = "lib_forge:furnace", param2 = 1, prob = 254}
		local F2 = {name = "lib_forge:furnace", param2 = 2, prob = 254}
		local F3 = {name = "lib_forge:furnace", param2 = 3, prob = 254}

		local C0 = {name = "lib_chests:chest", param2 = 0, prob = 254}
		local C1 = {name = "lib_chests:chest", param2 = 1, prob = 254}
		local C2 = {name = "lib_chests:chest", param2 = 2, prob = 254}
		local C3 = {name = "lib_chests:chest", param2 = 3, prob = 254}

		local L0 = {name = "lib_climbing:ladder_wood", param2 = 0, prob = 254}
		local L1 = {name = "lib_climbing:ladder_wood", param2 = 1, prob = 254}
		local L2 = {name = "lib_climbing:ladder_wood", param2 = 2, prob = 254}
		local L3 = {name = "lib_climbing:ladder_wood", param2 = 3, prob = 254}
		local L4 = {name = "lib_climbing:ladder_wood", param2 = 4, prob = 254}
		local L5 = {name = "lib_climbing:ladder_wood", param2 = 5, prob = 254}

		local DR = {name = "lib_ecology:tree_default_wood_door_centered_300_height_150_width_right", param2 = 1, prob = 254}
		local DL = {name = "lib_ecology:tree_default_wood_door_centered_300_height_150_width", param2 = 1, prob = 254}
		local D0 = {name = "lib_ecology:tree_default_wood_door_centered_with_window", param2 = 0, prob = 254}
		local D1 = {name = "lib_ecology:tree_default_wood_door_centered_with_window", param2 = 1, prob = 254}
		local D2 = {name = "lib_ecology:tree_default_wood_door_centered_with_window", param2 = 2, prob = 254}
		local D3 = {name = "lib_ecology:tree_default_wood_door_centered_with_window", param2 = 3, prob = 254}
		local D5 = {name = "lib_ecology:tree_default_wood_trapdoor_with_window", param2 = 0, prob = 254}
		local D6 = {name = "lib_ecology:tree_default_wood_trapdoor_with_window", param2 = 1, prob = 254}
		local D7 = {name = "lib_ecology:tree_default_wood_trapdoor_with_window", param2 = 2, prob = 254}
		local D8 = {name = "lib_ecology:tree_default_wood_trapdoor_with_window", param2 = 3, prob = 254}

		local TC = {name = "torch:torch_ceiling", param2 = 0, prob = 254}
		local TT = {name = "torch:torch", param2 = 1, prob = 254}
		local T1 = {name = "torch:torch_wall", param2 = 1, prob = 254}
		local T2 = {name = "torch:torch_wall", param2 = 2, prob = 254}
		local T3 = {name = "torch:torch_wall", param2 = 3, prob = 254}
		local T4 = {name = "torch:torch_wall", param2 = 4, prob = 254}
		local T5 = {name = "torch:torch_wall", param2 = 5, prob = 254}
		local T6 = {name = "decoblocks:lantern_wall", param2 = 2, prob = 254}
		local T7 = {name = "decoblocks:lantern_wall", param2 = 3, prob = 254}
		local T8 = {name = "decoblocks:lantern_wall", param2 = 4, prob = 254}
		local T9 = {name = "decoblocks:lantern_wall", param2 = 5, prob = 254}
		local T0 = {name = "decoblocks:lantern_ceiling", param2 = 0, prob = 254}

		local A0 = {name = "lib_forge:anvil", param2 = 0, prob = 254}
		local A1 = {name = "lib_forge:anvil", param2 = 1, prob = 254}
		local A2 = {name = "lib_forge:anvil", param2 = 2, prob = 254}
		local A3 = {name = "lib_forge:anvil", param2 = 3, prob = 254}
		local AA = {name = "decoblocks:altar", param2 = 2, prob = 254}

		local B0 = {name = "beds:bed_bottom", param2 = 0, prob = 254}
		local B1 = {name = "beds:bed_bottom", param2 = 1, prob = 254}
		local B2 = {name = "beds:bed_bottom", param2 = 2, prob = 254}
		local B3 = {name = "beds:bed_bottom", param2 = 3, prob = 254}
		local B5 = {name = "beds:bed_top", param2 = 0, prob = 254}
		local B6 = {name = "beds:bed_top", param2 = 1, prob = 254}
		local B7 = {name = "beds:bed_top", param2 = 2, prob = 254}
		local B8 = {name = "beds:bed_top", param2 = 3, prob = 254}
		local BN = {name = "default:bookshelf", param2 = 0, prob = 254}
		local BE = {name = "default:bookshelf", param2 = 1, prob = 254}
		local BS = {name = "default:bookshelf", param2 = 2, prob = 254}
		local BW = {name = "default:bookshelf", param2 = 3, prob = 254}

		local RB = {name = "lib_tools:ropebox", param2 = 3, prob = 254}
		local RP = {name = "lib_tools:box_rope", param2 = 0, prob = 254}

		local R1 = {name = "cottages:roof_wood", param2 = 1, prob = 254}
		local R3 = {name = "cottages:roof_wood", param2 = 3, prob = 254}
		local R5 = {name = "cottages:roof_connector_wood", param2 = 1, prob = 254}
		local R7 = {name = "cottages:roof_connector_wood", param2 = 3, prob = 254}

		local X0 = {name = "xpanes:bar_flat", param2 = 0, prob = 254}
		local X1 = {name = "xpanes:bar_flat", param2 = 1, prob = 254}
		local X2 = {name = "xpanes:bar_flat", param2 = 2, prob = 254}
		local X3 = {name = "xpanes:bar_flat", param2 = 3, prob = 254}
		local X5 = {name = "xpanes:framed_pane_flat", param2 = 0, prob = 254}
		local X6 = {name = "xpanes:framed_pane_flat", param2 = 1, prob = 254}
		local X7 = {name = "xpanes:framed_pane_flat", param2 = 2, prob = 254}
		local X8 = {name = "xpanes:framed_pane_flat", param2 = 3, prob = 254}

		local Z1 = {name = "lib_tools:cauldron_empty", param2 = 0, prob = 254}
		local Z2 = {name = "lib_ecology:tree_default_wood_table_basic_01", param2 = 0, prob = 254}
		local Z3 = {name = "lib_materials:metal_steel_block", param2 = 0, prob = 254}
		local Z4 = {name = "xpanes:bar_flat", param2 = 1, prob = 254}
		local Z5 = {name = "mg_villages:mob_workplace_marker", param2 = 0, prob = 254}
		local Z6 = {name = "cottages:shelf", param2 = 1, prob = 254}
		local Z7 = {name = "cottages:shelf", param2 = 3, prob = 254}
		local Z8 = {name = "cottages:table", param2 = 2, prob = 254}

		local I0 = {name = "air",param2 = 0,prob = 254}
		local I1 = {name = "air",param2 = 1,prob = 254}
		local I2 = {name = "air",param2 = 2,prob = 254}
		local I3 = {name = "air",param2 = 3,prob = 254}
		local I4 = {name = "",param2 = 0,prob = 254}
		local I5 = {name = "lib_tools:draft_table",param2 = 0,prob = 254}
		local I6 = {name = "decoblocks:vase",param2 = 0,prob = 254}
		local I7 = {name = "air",param2 = 0,prob = 254}
		local I8 = {name = "",param2 = 0,prob = 254}
		local I9 = {name = "",param2 = 0,prob = 254}

		local II = {name = "lib_ecology:tree_default_wood_fence",param2 = 0,prob = 254}

ShadMOrdre
Member
Posts: 1118
Joined: Mon Dec 29, 2014 08:07
Location: USA

Re: [Mod] Settlements [settlements]

by ShadMOrdre » Post

The following schematics were converted from Sokomine's mg_villages modpack, specifically, the Gambit and Cornernote village mods. All licensing and credits are according to that mod.
Spoiler

Code: Select all

towns_gambit.schem_gambit_shed_open_chests_x5_y5_z5_0 = {
	size = {x = 5,y = 5,z = 5},
	data = {
		DD, DD, DD, DD, DD,
		GR, DD, DD, DD, GR,
		II, NY, M1, NY, __,
		II, NY, N9, NY, __,
		S1, N9, N9, N9, S3,

		DD, DD, DD, DD, DD,
		N2, N2, DD, DD, GR,
		__, __, C1, N9, __,
		__, __, T5, N9, __,
		S1, N9, N9, N9, S3,

		DD, DD, DD, DD, DD,
		N2, N2, DD, DD, GR,
		__, __, C1, N9, __,
		__, __, __, N9, __,
		S1, N9, N9, N9, S3,

		DD, DD, DD, DD, DD,
		N2, N2, DD, DD, GR,
		__, __, C1, N9, __,
		__, __, T4, N9, __,
		S1, N9, N9, N9, S3,

		DD, DD, DD, DD, DD,
		GR, DD, DD, DD, GR,
		II, NY, M1, NY, __,
		II, NY, N9, NY, __,
		S1, N9, N9, N9, S3
	},
	yslice_prob = {
		{ypos = 0,prob = 254},
		{ypos = 1,prob = 254},
		{ypos = 2,prob = 254},
		{ypos = 3,prob = 254},
		{ypos = 4,prob = 254}
	}
}

towns_gambit.schem_gambit_tower_x7_y23_z7_270 = {
	size = {x = 7,y = 23,z = 7},
	data = {
		__, __, M1, M1, M1, __, __,
		__, __, Q0, Q0, Q0, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		SW, S0, S0, S0, S0, S0, SW,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, QW, Q0, Q0, Q0, QW, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, M1, M1, M1, M1, M1, __,
		__, M1, S2, S2, S2, M1, __,
		__, II, __, __, __, II, __,
		S1, II, __, __, __, II, S3,
		__, SW, S0, S0, S0, SW, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		M1, M1, N9, N9, N9, M1, M1,
		Q1, M1, __, S1, N9, M1, Q3,
		__, M1, __, __, S1, M1, __,
		__, M1, __, __, __, M1, __,
		__, M1, T3, __, __, M1, __,
		__, M1, N9, N9, __, M1, __,
		__, M1, __, NY, __, M1, __,
		__, M1, __, NY, __, M1, __,
		__, Q1, T5, NY, T5, Q3, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, M1, N9, N9, N9, M1, __,
		__, S3, __, __, __, S1, __,
		__, __, __, __, __, __, __,
		S1, __, __, __, __, __, S3,
		__, S1, __, T5, __, S3, __,
		__, __, SW, S0, SW, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		M1, M1, N9, N9, N9, M1, M1,
		Q1, M1, __, __, __, M1, Q3,
		__, M1, __, __, __, M1, __,
		__, M1, __, __, S0, M1, __,
		__, M1, __, __, __, M1, __,
		__, M1, N9, N9, __, M1, __,
		__, Q1, __, L5, __, Q3, __,
		__, __, __, L5, __, __, __,
		__, Q1, __, L5, __, Q3, __,
		__, __, NY, L5, NY, __, __,
		__, __, NY, L5, NY, __, __,
		__, __, NY, L5, NY, __, __,
		__, __, NY, L5, NY, __, __,
		__, __, NY, L5, NY, __, __,
		__, M1, N9, L5, N9, M1, __,
		__, S3, __, __, __, S1, __,
		__, __, __, __, __, __, __,
		S1, __, __, __, __, __, S3,
		__, S1, T3, __, T2, S3, __,
		__, __, S1, N9, S3, __, __,
		__, __, __, SW, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		M1, M1, N9, N9, N9, M1, M1,
		Q1, M1, __, __, __, M1, Q3,
		__, M1, __, __, __, M1, __,
		__, M1, __, __, __, M1, __,
		__, M1, __, __, S0, M1, __,
		__, M1, N9, S3, __, M1, __,
		__, M1, __, __, __, M1, __,
		__, M1, __, __, __, M1, __,
		__, Q1, __, __, __, Q3, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, __, NY, NY, NY, __, __,
		__, M1, N9, N9, N9, M1, __,
		__, S3, __, __, __, S1, __,
		__, __, __, __, __, __, __,
		S1, __, __, __, __, __, S3,
		__, S1, __, T4, __, S3, __,
		__, __, SW, S2, SW, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		__, NY, M1, N9, M1, NY, __,
		__, NY, M1, {param2 = 2,name = "doors:door_wood_b_1",prob = 254}, M1, NY, __,
		__, NY, M1, {param2 = 2,name = "doors:door_wood_t_1",prob = 254}, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, M1, M1, NY, __,
		__, NY, M1, Q2, M1, NY, __,
		__, NY, M1, __, M1, NY, __,
		__, QW, Q2, Q2, Q2, QW, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, M1, M1, M1, M1, M1, __,
		__, M1, S0, S0, S0, M1, __,
		__, II, __, __, __, II, __,
		S1, II, __, __, __, II, S3,
		__, SW, S2, S2, S2, SW, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,

		__, __, M1, S2, M1, __, __,
		__, __, Q2, __, Q2, __, __,
		__, __, __, __, __, __, __,
		__, __, Q1, QW, Q3, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		SW, S2, S2, S2, S2, S2, SW,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __,
		__, __, __, __, __, __, __
	},
	yslice_prob = {
		{ypos = 0,prob = 254},
		{ypos = 1,prob = 254},
		{ypos = 2,prob = 254},
		{ypos = 3,prob = 254},
		{ypos = 4,prob = 254},
		{ypos = 5,prob = 254},
		{ypos = 6,prob = 254},
		{ypos = 7,prob = 254},
		{ypos = 8,prob = 254},
		{ypos = 9,prob = 254},
		{ypos = 10,prob = 254},
		{ypos = 11,prob = 254},
		{ypos = 12,prob = 254},
		{ypos = 13,prob = 254},
		{ypos = 14,prob = 254},
		{ypos = 15,prob = 254},
		{ypos = 16,prob = 254},
		{ypos = 17,prob = 254},
		{ypos = 18,prob = 254},
		{ypos = 19,prob = 254},
		{ypos = 20,prob = 254},
		{ypos = 21,prob = 254},
		{ypos = 22,prob = 254}
	}
}
	

--Fortress Schematic Node Definitions
S0 = {name = "stairs:stair_cobble", param2 = 0, prob = 254}
S1 = {name = "stairs:stair_cobble", param2 = 1, prob = 254}
S2 = {name = "stairs:stair_cobble", param2 = 2, prob = 254}
S3 = {name = "stairs:stair_cobble", param2 = 3, prob = 254}


towns_gambit.schem_bldg_fortress_x25_y22_z23_r90 = {
	size = {x = 25,y = 22,z = 23},
	data = {
		M2, M2, M2, M2, M2, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M2, M2, M2, M2, M2,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, __, M1, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __, M1,
		T1, __, T1, __, T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1, __, T1, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2,
		M1, M1, M1, M1, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M1, M1, M1, M1,
		M1, F2, S3, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, F1, M1,
		M1, S3, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, S2, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, C2, S3, __, M1,
		M1, __, __, M0, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, S3, __, __, M1,
		M1, __, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, M1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2,
		M1, M1, M1, M1, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M1, M1, M1, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, S2, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		M1, S0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1,
		M1, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, M2, M2,
		M1, M1, M1, M1, M1, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, M1, M1, M1, M1, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, C3, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, S0, M0, M0, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M0, M0, M0, M1,
		M1, __, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, M1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, M2, M2,
		M1, M1, M1, N3, M1, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M1, M1, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M0, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M0, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, __, M1, M1,
		M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1,
		T1, __, __, __, T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1, __, __, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, NY, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, NY, NY, M0, __, __,
		__, M0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T4, M0, __, __,
		__, M0, M0, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, T4, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, M0, M0, M0, NY, M0, __, __,
		__, M0, __, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M0, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M0, M0, M0, NY, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M1, __, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M1, __, M1, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, __, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, M1, __, M1, __, M1, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, T1, __, T1, __, T1, __, T1, __, T1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M1, M1, __,
		__, M0, M0, NY, M0, M0, M0, NY, M0, NY, NY, NY, NY, NY, NY, NY, M0, NY, M0, M0, M0, NY, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, M0, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M0, M1, __,
		__, M1, __, M1, __, __, __, __, M0, TC, __, __, __, __, __, TC, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, NY, NY, NY, NY, NY, NY, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, TC, __, __, __, __, __, TC, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, NY, NY, NY, NY, NY, NY, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, M0, M0, M0, N1, N1, N1, N1, N1, N1, N1, NY, M1, M1, S3,
		__, M0, M0, NY, M0, M0, M0, NY, M0, NY, M0, M0, M0, M0, M0, NY, M0, NY, NY, NY, NY, NY, M1, S3, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, DR, __, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, M0, M0, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M0, M1, __,
		__, M1, __, M1, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, M0, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, M0, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, T1, __, __, __, __, __, __, __, T1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, M0, L3, M0, N1, N1, N1, N1, N1, N1, N1, N9, M1, M1, S3,
		__, M0, M0, NY, M0, M0, M0, NY, M0, NY, M0, M0, L3, M0, M0, NY, NY, NY, N9, N9, N9, N9, M1, S3, __,
		__, M0, __, M0, __, __, __, __, __, __, __, NY, L3, __, __, __, __, __, __, __, __, __, __, __, __,
		__, M0, __, M0, __, __, __, __, __, __, __, NY, L3, __, __, __, __, __, __, __, __, __, __, __, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, NY, L3, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, M0, M0, M0, __, __, __, __, M0, __, __, NY, L3, __, __, __, M0, __, __, __, __, M1, M0, M1, __,
		__, M1, __, M1, __, __, __, __, M0, __, __, NY, L3, __, __, __, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, L3, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, NY, L3, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, NY, L3, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, NY, L3, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, NY, L3, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, NY, L3, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, L3, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, M1, __, __, __, M1, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, M1, __, M1, __, M1, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, M0, M0, M0, N1, N1, N1, N1, N1, N1, N1, NY, M1, M1, S3,
		__, M0, M0, NY, M0, M0, M0, NY, M0, NY, M0, M0, M0, M0, M0, NY, M0, NY, NY, NY, NY, NY, M1, S3, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, DL, __, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, M0, __, M0, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, M0, M0, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M0, M1, __,
		__, M1, __, M1, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, M0, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, NY, M0, M0, M0, M0, M0, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, L5, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, L5, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, T1, __, __, __, __, __, L5, __, T1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, L5, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, L5, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, L5, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M1, M1, __,
		__, M0, M0, NY, M0, M0, M0, NY, M0, NY, NY, NY, NY, NY, NY, NY, M0, NY, M0, M0, M0, NY, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, __, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M1, M1, __,
		__, M0, M0, M0, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, M1, M0, M1, __,
		__, M1, __, M1, __, __, __, __, M0, TC, __, __, __, __, __, TC, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, NY, NY, NY, NY, NY, NY, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, TC, __, __, __, __, __, TC, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, NY, NY, NY, NY, NY, NY, NY, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M0, M0, M0, NY, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, __, M0, __, __, __, __, M0, M0, M0, M1, __, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, M0, __, __,
		__, M1, __, M1, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, __, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M1, M1, M1, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, M1, __, M1, __, M1, __, M1, __, M1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, T1, __, T1, __, T1, __, T1, __, T1, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, M0, M0, M0, NY, M0, __, __,
		__, M0, __, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, T5, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		__, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, __, __,
		__, M0, M0, NY, NY, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, NY, NY, M0, __, __,
		__, M0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M0, M0, M0, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M0, __, __,
		__, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, M2, M2,
		M1, M1, M1, M1, M1, NY, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, NY, M1, M1, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M0, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M0, M1, M1,
		M1, M1, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, __, M1, M1,
		M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, __, __, M1,
		T1, __, __, __, T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1, __, __, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, N1, M2, M2, M2,
		M1, M1, M1, M1, M1, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, NY, M1, M1, M1, M1, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, __, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, T5, __, C1, M1,
		M1, M0, M0, M0, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M0, M0, S2, M1,
		M1, M1, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, M1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2,
		M1, M1, M1, M1, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M1, M1, M1, M1,
		M1, S0, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		M1, __, __, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, __, S2, M1,
		M1, __, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, __, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1,
		T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2, M2,
		M1, M1, N3, M1, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M1, M1, N3, M1,
		M1, F3, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, S1, F0, M1,
		M1, S0, __, __, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, S1, M1,
		M1, __, S1, C0, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, __, __, __, M1,
		M1, __, __, S1, M1, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M0, M1, M0, __, __, M1,
		M1, __, __, __, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, M1, __, __, __, M1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,

		M2, M2, M2, M2, M2, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M2, M2, M2, M2, M2,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, N3, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, M1, M1, M1, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, M1, M1, M1, M1,
		M1, __, M1, __, M1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, M1, __, M1, __, M1,
		T1, __, T1, __, T1, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T1, __, T1, __, T1,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
		__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __
	},
	yslice_prob = {
		{ypos = 0,prob = 254},
		{ypos = 1,prob = 254},
		{ypos = 2,prob = 254},
		{ypos = 3,prob = 254},
		{ypos = 4,prob = 254},
		{ypos = 5,prob = 254},
		{ypos = 6,prob = 254},
		{ypos = 7,prob = 254},
		{ypos = 8,prob = 254},
		{ypos = 9,prob = 254},
		{ypos = 10,prob = 254},
		{ypos = 11,prob = 254},
		{ypos = 12,prob = 254},
		{ypos = 13,prob = 254},
		{ypos = 14,prob = 254},
		{ypos = 15,prob = 254},
		{ypos = 16,prob = 254},
		{ypos = 17,prob = 254},
		{ypos = 18,prob = 254},
		{ypos = 19,prob = 254},
		{ypos = 20,prob = 254},
		{ypos = 21,prob = 254}
	}
}

Shad

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

The lua schematics format I've been using is actually quite similar to that, with less "informative" variable names (they're just n1, n2, n3, etc.). It keeps the size and in-memory footprint down considerably and makes it easy to manually edit when all I want to do is change one node or one node type without having to fire up the game to do it.

I did think a bit about trying to come up with variable names that were better but in the end just went "eh, that's what IDEs and/or search-and-replace is for". :) Maybe if I work with schematics more in the future I'll continue refining schemsave's output. For now the amount of time I'd spend improving schemsave would be way more than the amount of time I'd save working with its current output.

Anyway, regarding the settlements mod itself; I'm going to put a bow on the current version at my github repo and call that "done" for now. Release candidate 1 for version 1.0, as it were. I added some additional administrative commands and tools, splitting the settlement and building generating tools into two separate tools to prevent accidents (I kept accidentally placing igloos or whatever when I wanted to create a settlement), and threw in a simple set of ruins that appears out in tundra areas (tundras were completely barren so I thought it might be nice to have something show up there from time to time). I'll bugfix whatever bugs people find, maybe put in a few more minor features if someone suggests something and I slap my forehead at how I could have overlooked that need, maybe do a little more documentation of the commands and API. But I need to take a rest from this and work on other mods for a while.

Eventually I'll do an "underground" revamp of it for use in giant caverns or other such exotic mapgens, but that'll be a 2.0 kind of thing.

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

Image

Will it be possible to accomodate space between trunks but not shave the trees?
Attachments
screenshot_20200116_205059.png
screenshot_20200116_205059.png (899.73 KiB) Viewed 1075 times

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

In the settlement schematic info tables (eg in settlements_default.lua), check out the "platform_clear_above = false" parameter. That will cause settlements to not carve out a cavity above the platform where it's placing the building schematic. The schematic itself will still overwrite the trees where it directly overlaps, though, which could mean pieces of trunk would be left hovering over the roof. You could also add "force_place = false" to the schematic info, in which case the building would leave the tree in place and only build where there's air. I could see that working for ruins, not sure if it'll be good for most other sorts of structures. I used that flag with the jungle tree huts, if you look inside the schematic for the jungle trees you'll see that most of the actual nodes have per-node force-place enabled. That way the tree and hut gets built, and the air inside the hut is force-built so there isn't foliage filling the interior, but if there are adjacent trees they don't get a big box carved out of them. If you don't mind the possibility of half a tree resting on top of the roof then that might work for these huts.

Maybe some sort of per-node-type override on the platform_clear_above process, where foliage specifically could be left in place? You might get a blob of foliage hovering over the roof with a hollow core where the trunk once was, but that's perhaps less immersion-breaking than a whole half of a tree floating up there. And I could look into triggering the leaf decay process, as I recall that involves triggering node timers and I've already done something like that to get the wheat in the gardens to start growing. Orphaned leaf blobs would quickly disappear then.

If you want the trees to prevent the placement of buildings so that they only appear in pre-existing clearings, there's not really an existing option for that. There's the "ignore_surface_materials" property, but that's only used by the find-ground-level function that tests a single coordinate rather than something searching a building's footprint for obstructions. I'd have to get a lot more sophisticated with the code that is evaluating building locations and I fear that most forests would not provide enough building locations within a single chunk to put a viable settlement. Some of the bigger buildings would probably never find a place to build. Not sure how I'd go about this.

If you want the carve-outs to be *larger*, so that trees aren't crowded right up next to buildings and the platforms are more prominent, I could swing that. You'd still get shaved trunks, though.

MoNTE48
Member
Posts: 323
Joined: Sat Apr 06, 2013 11:58
GitHub: MoNTE48
In-game: MoNTE48
Location: Internet

Re: [Mod] Settlements [settlements]

by MoNTE48 » Post

Another thing that would be really cool to expect from you is the separation of modpack framework (API) and schematics. So that you can easily use only the API, if someone does not need standard settlements for his subgame.
I think this should not be too complicated in the current state of the code.
This is what tenplus1 did with its mobs_redo -> divided it into API, mobs_animal, mobs_monster.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

MoNTE48 wrote:Another thing that would be really cool to expect from you is the separation of modpack framework (API) and schematics. So that you can easily use only the API, if someone does not need standard settlements for his subgame.
I think this should not be too complicated in the current state of the code.
This is what tenplus1 did with its mobs_redo -> divided it into API, mobs_animal, mobs_monster.
Yeah, it's already almost there - I divided it into an API and a bunch of default settlement registrations, I could turn this into a modpack just by moving a few files around.

I've been hearing that request a lot, so I think I'll go ahead and just do it. :)

Edit: Done. Surprisingly, that went as easily as I was expecting it would go. Usually there's one last squirrelly dependency hidden away somewhere when you actually try doing that.

MoNTE48
Member
Posts: 323
Joined: Sat Apr 06, 2013 11:58
GitHub: MoNTE48
In-game: MoNTE48
Location: Internet

Re: [Mod] Settlements [settlements]

by MoNTE48 » Post

Thanks, great job! Really.

But small question: why do you need intllib if only MT5 is supported, which has its own `minetest.translate` and` minetest.get_translator`? intllib is deprecated for MT5.

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

FaceDeer wrote:Maybe some sort of per-node-type override on the platform_clear_above process, where foliage specifically could be left in place? You might get a blob of foliage hovering over the roof with a hollow core where the trunk once was, but that's perhaps less immersion-breaking than a whole half of a tree floating up there. And I could look into triggering the leaf decay process, as I recall that involves triggering node timers and I've already done something like that to get the wheat in the gardens to start growing. Orphaned leaf blobs would quickly disappear then.
This is what I had i mind too!

Great to see a pure API mod being carved out! But please, no modpacks. Building a dependency chain for a custom game on the API mod becomes impossible with modpacks.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

MoNTE48 wrote:But small question: why do you need intllib if only MT5 is supported, which has its own `minetest.translate` and` minetest.get_translator`? intllib is deprecated for MT5.
Because a couple of years ago, after quite a lot of annoying fiddling with incompatible Windows xgettext binaries and environment paths and whatnot, I managed to get a single-click "update/generate all the .po files necessary" pipeline working on my computer for intllib. It let me get into the habit of wrapping all user-facing strings in S() and generating templates for anyone who wanted to do some translation to work with.

I don't have a one-click pipeline like that set up for the new translation system, and last time I went poking around for one I didn't see any obvious clues on the forums on how to set one up. So right now I face the dilemma of either continuing to use intllib for now, or not wrapping user-facing strings in S() and going back to do that at some point in the future when I sort that out. I'd rather continue wrapping user-facing strings in S(), it seems like closer to "best practice" than not doing it. You don't need intllib, it's listed as an optional dependency.

Do you happen to know of a convenient Windows solution for generating the newer style of translation template?
texmex wrote: Great to see a pure API mod being carved out! But please, no modpacks. Building a dependency chain for a custom game on the API mod becomes impossible with modpacks.
I don't see why it's impossible. Have your game-specific settlement definition mod have "depends=settlements" and just ignore the others. If you don't have the "default" mod then Minetest won't let the other settlement definition mods run anyway even if you tried since it's a hard dependency for those.

I guess I could split this up into a bunch of separate repos, but at the moment I'd rather not. The API is brand new so if I introduce any changes (such as the modifications to clearing the air above schematics we were discussing) it means all the default settlement defs keep in sync rather than worrying about people updating one but not the other repo. The default settlement defs can't be used with any mod other than settlements so they would gain nothing from being separate mods, either. It just seems like a lot of hassle right now when my goal at the moment is to extricate myself from working on this mod for a little while so I can do some other stuff instead.

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

FaceDeer wrote:I don't see why it's impossible. Have your game-specific settlement definition mod have "depends=settlements" and just ignore the others. If you don't have the "default" mod then Minetest won't let the other settlement definition mods run anyway even if you tried since it's a hard dependency for those.

I guess I could split this up into a bunch of separate repos, but at the moment I'd rather not. The API is brand new so if I introduce any changes (such as the modifications to clearing the air above schematics we were discussing) it means all the default settlement defs keep in sync rather than worrying about people updating one but not the other repo. The default settlement defs can't be used with any mod other than settlements so they would gain nothing from being separate mods, either. It just seems like a lot of hassle right now when my goal at the moment is to extricate myself from working on this mod for a little while so I can do some other stuff instead.
I empathize with this, of course. I shouldn't have written about dependency but rather about mod repo automation. For a large game with a lot of third-party mods I use git submodules to add them to the project. This way I don't have to handle the files of those mods at all, just pull them with the project. Maybe it's niche, I don't know.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

texmex wrote: I empathize with this, of course. I shouldn't have written about dependency but rather about mod repo automation. For a large game with a lot of third-party mods I use git submodules to add them to the project. This way I don't have to handle the files of those mods at all, just pull them with the project. Maybe it's niche, I don't know.
No, I've done that myself on other occasions. Conceptually it's a nice, clean way of managing situations like this where multiple mods are composed together into groups.

However, managing git submodules is rather a pain with the tools git has available. I have to go re-learn the shell commands for it every time I want to update stuff and sweat through "am I about to hose my repo?" moments when hitting "enter." So maybe later once settlements is nice and stable again. :)

Anyway, I just tried adding some of that special-purpose leafdecay stuff we talked about earlier. It's not perfect. I added the ability to have plaform generation omit specific node groups when carving out space above the building, so it'll remove trunks and stone and whatnot but leave anything with group:leafdecay behind. And then there's a property on settlements that goes through the map chunk post-generation and triggers the timer on all leafdecay nodes. See the settlements_medieval mod for example usage, it doesn't have to be just the "leafdecay" group.

Remaining problems: there are air nodes above parts of medieval building roofs that are part of the schematic, so you still get some cuboid spaces carved out. There are tree trunks incorporated into some medieval building schematics that prevent leaf decay near them. And you still get chunks of branches and trunks hanging in space sometimes. But dealing with edge cases of edge cases is getting a bit much right now, so some of that is "eh, maybe fix later someday". If you're making your own settlements then you can make the roof-air have prob=0 in your schematics, that should fix the cubiod air spaces for you. I'll do that for the default schematics eventually too.

User avatar
texmex
Member
Posts: 1753
Joined: Mon Jul 11, 2016 21:08
GitHub: tacotexmex
In-game: tacotexmex

Re: [Mod] Settlements [settlements]

by texmex » Post

FaceDeer wrote:However, managing git submodules is rather a pain with the tools git has available. I have to go re-learn the shell commands for it every time I want to update stuff and sweat through "am I about to hose my repo?" moments when hitting "enter." So maybe later once settlements is nice and stable again. :)
I didn't mean that I wanted you to start using submodules. I meant that if you publish each mod as its own repo (mobs_redo style) then I myself can choose to only link, for instance, the API mod as a submodule in MY project :)
FaceDeer wrote:Anyway, I just tried adding some of that special-purpose leafdecay stuff we talked about earlier. It's not perfect. I added the ability to have plaform generation omit specific node groups when carving out space above the building, so it'll remove trunks and stone and whatnot but leave anything with group:leafdecay behind. And then there's a property on settlements that goes through the map chunk post-generation and triggers the timer on all leafdecay nodes. See the settlements_medieval mod for example usage, it doesn't have to be just the "leafdecay" group.

Remaining problems: there are air nodes above parts of medieval building roofs that are part of the schematic, so you still get some cuboid spaces carved out. There are tree trunks incorporated into some medieval building schematics that prevent leaf decay near them. And you still get chunks of branches and trunks hanging in space sometimes. But dealing with edge cases of edge cases is getting a bit much right now, so some of that is "eh, maybe fix later someday". If you're making your own settlements then you can make the roof-air have prob=0 in your schematics, that should fix the cubiod air spaces for you. I'll do that for the default schematics eventually too.
I trying to try this new feature out but it turns out that settlements seem to be placed by "true" randomness and not "pseudo" randomness based on seed. Hence no new settlement appears in the same place as an old one after purging map.sqlite. I think reproducability is a nice feature, for developers and players alike. I built around the principle of world reproducability in most things I create. It's really easy, because you only need to replace whatever you use in math.randomseed with the world seed. How about it? :D

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

texmex wrote: I didn't mean that I wanted you to start using submodules. I meant that if you publish each mod as its own repo (mobs_redo style) then I myself can choose to only link, for instance, the API mod as a submodule in MY project :)
Sure, but I'm a believer in making something available that users can drop into their mods folder and "it just works" so I'd want to provide a bundle of my own when I do that. :)
texmex wrote: I trying to try this new feature out but it turns out that settlements seem to be placed by "true" randomness and not "pseudo" randomness based on seed. Hence no new settlement appears in the same place as an old one after purging map.sqlite. I think reproducability is a nice feature, for developers and players alike. I built around the principle of world reproducability in most things I create. It's really easy, because you only need to replace whatever you use in math.randomseed with the world seed. How about it? :D
It actually isn't as easy as that. The question of whether a settlement gets generated in a given map chunk is a combination of "Is this chunk physically capable of hosting a settlement?" and "Is this chunk far enough away from all other existing settlements?" Since the first question can't be answered without generating the chunk in question, the second question can't be made deterministic until all possible mapchunks have been generated. Instead, the mod just checks if a chunk is far enough away from already-existing settlements. That works fine since future settlement placement will also take into account the distance from the settlement being placed now, but it means that in a sense the "seed" determining the placement of settlements includes the exact order in which mapchunks get generated. This pattern isn't quite a simple Poisson distribution.

It also has a subtle (and honestly unintended) benefit of preferentially placing settlements near the routes where players go. If a player grabs a boat and explores a sea, you'll get a lot of coastal settlements. At least, I hope that's considered a benefit since I can't think of an easy way to remove that bias. :)

Anyway, there's one area where I could make the randomness deterministic - the layout of the buildings inside each settlement. Currently if you use "/deleteblocks" to wipe and regenerate a map chunk that contains a settlement the settlement will be rebuilt with a new random layout (though retaining the old name). I figured that was kind of a feature, since an admin can look at a settlement and if he doesn't like it can redo the generation until he gets one that he likes better, so if I made it deterministic I'd also want to add some method of overriding the determinism.

I've also got a couple of tools admins can use to forcibly generate a settlement in a specific location, if they want to set up something specific for players.

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

I just pushed a fairly big change to my version of this mod, I split the code that was creating HUD waypoint markers for settlements out into a separate mod of its own called named_waypoints. That mod is now a hard dependency for settlements, even if you don't want to have the HUD markers visible to players (the same code is also used for keeping track of how far away existing settlements are, preventing them from being spawned too close together).

I did this because I want to reuse this basic mechanism for some of my other mods - for example, I've got an update to magma_conduits ready to push that will put names on the volcanoes it generates. But in the process I did a bunch of work on making the waypoints easier to manage, there's now an administrative command "/named_waypoints" that brings up a UI for visiting and modifying all existing waypoints with the click of a button.

I added upgrade code that should in theory be able to upgrade existing worlds that were created with older versions of settlements, but as with any major update to a mapgen mod make sure you back up and test out a well-established world before rolling it out.

User avatar
FreeGamers
Member
Posts: 650
Joined: Sat May 25, 2019 00:15
GitHub: is proprietary I use NotABug
Location: United States
Contact:

Re: [Mod] Settlements [settlements]

by FreeGamers » Post

FaceDeer, a critical bug has been discovered.

Code: Select all

2020-02-05 03:02:19: ERROR[Main]: ServerError: AsyncErr: ServerThread::run Lua: Runtime error from mod 'settlements' in callback LuaABM::trigger(): ..../mods/lib_world/settlements/settlements/bookgen.lua:90: attempt to call upvalue 'bookshelf_on_construct' (a nil value)
2020-02-05 03:02:19: ERROR[Main]: stack traceback:
2020-02-05 03:02:19: ERROR[Main]:       ..../mods/lib_world/settlements/settlements/bookgen.lua:90: in function <..../mods/lib_world/settlements/settlements/bookgen.lua:56>
FreeGamers.org has moved to MeseCraft.net | FreeGamers on this forum is now MeseCraft

FaceDeer
Member
Posts: 506
Joined: Sat Aug 29, 2015 19:01
GitHub: FaceDeer

Re: [Mod] Settlements [settlements]

by FaceDeer » Post

Interesting. A one-off, or something happening consistently? Just based on this callstack I think it's a result of not including the default mod as an optional dependency, which would result in the load order being undefined and bookshelves not being registered yet on some loads but not others.

I've pushed a fix that both adds default as an optional dependency and nil-checks the bookshelf on-construct function before calling it, so the crash should be prevented now.

Post Reply

Who is online

Users browsing this forum: Bing [Bot] and 25 guests