sorcery  Check-in [72eebac4bc]

Overview
Comment:add writing stand for editing codexes; add scissors, ink, erasure fluid, pens; touch up codex UI; add many recipe notes; add craft divination type for crafttools; defuckulate fucktarded crafttool impl; enhance table library with missing features like lua's table.unpack; many bug fixes and enhancements; blood for the blood god
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 72eebac4bc5efbd10e1defef57906dd3ce87fae6ccd11f3f30f13ec1b02df248
User & Date: lexi on 2020-09-26 18:49:51
Other Links: manifest | tags
Context
2020-09-29
12:40
* remove former hacky registration system, replace with consistent and flexible API; rewrite metal/gem generation to take advantage of this new API; tweaks to init system to enable world-local tweaks to lore and sorcery behavior * initial documentation commit * initial steps towards calendar - add default date format, astrolabe; prepare infra for division/melding/transmutation spells, various tweaks and fixes check-in: 3f6a913e4e user: lexi tags: trunk
2020-09-26
18:49
add writing stand for editing codexes; add scissors, ink, erasure fluid, pens; touch up codex UI; add many recipe notes; add craft divination type for crafttools; defuckulate fucktarded crafttool impl; enhance table library with missing features like lua's table.unpack; many bug fixes and enhancements; blood for the blood god check-in: 72eebac4bc user: lexi tags: trunk
2020-09-24
23:07
add blood god, add gravitator, add hand-drawn ore images, add mana hud display for enchanted items, various tweaks and enhancements check-in: f165d9e39f user: lexi tags: trunk
Changes

Modified cookbook.lua from [89adffa44b] to [f535fa81e6].

    31     31   		vessel = { caption = 'Any Bottle', cnitem = 'vessels:glass_bottle' };
    32     32   		flower = { caption = 'Any Flower', cnitem = 'flowers:rose' };
    33     33   		mushroom = { caption = 'Any Mushroom', cnitem = 'flowers:mushroom_brown' };
    34     34   		water_bucket = { caption = 'Water Bucket', cnitem = 'bucket:bucket_water' };
    35     35   		sorcery_ley_cable = { caption = 'Cable', cnitem = 'sorcery:cable_vidrium' };
    36     36   	};
    37     37   }
           38  +sorcery.cookbook.constants = constants
    38     39   
    39     40   local slot3x3 = {
    40     41   	{0,0}, {1,0}, {2,0};
    41     42   	{0,1}, {1,1}, {2,1};
    42     43   	{0,2}, {1,2}, {2,2};
    43     44   }
    44     45   local props_builtin = function(item)
................................................................................
    82     83   	return names[math.random(#names)]
    83     84   end end
    84     85   local find_builtin = function(out)
    85     86   	local rec = {}
    86     87   	local i = minetest.get_craft_recipe(out)
    87     88   	if i == nil or i.items == nil or #i.items == 0 then return nil end
    88     89   	local w = (i.width == 0) and 3 or i.width
    89         -	for j=1,#i.items do
           90  +	-- for j=1,#i.items do
           91  +	for j,item in pairs(i.items) do
    90     92   		local row = math.floor((j-1) / w)
    91     93   		local col = (j-1) % w
    92     94   		if i.items[j] then
    93     95   			rec[1 + (row * 3) + col] = i.items[j]
    94     96   		end
    95     97   	end
    96     98   	return rec
................................................................................
   157    159   		end
   158    160   	end;
   159    161   }
   160    162   sorcery.cookbook.classes = {
   161    163   	craft = {
   162    164   		name = 'Crafting Guide';
   163    165   		node = 'xdecor:workbench';
   164         -		booksuf = 'Manual';
          166  +		booksuf = 'Codex';
   165    167   		w = 3, h = 3;
   166    168   		chance = 2;
   167    169   		slots = slot3x3;
   168    170   		pick = pick_builtin('normal');
   169    171   		find = find_builtin;
   170         -		desc = desc_builtin;
   171    172   		props = props_builtin;
   172    173   		apply_exclusions = true;
   173    174   	};
   174    175   	-- smelt = {
   175    176   	-- 	w = 3, h = 3;
   176    177   	-- 	slots = slot3x3;
   177    178   	-- };
................................................................................
   234    235   		w = 1, h = 2;
   235    236   		pick = function(restrict)
   236    237   			cache:populate_grindables()
   237    238   			local i = cache.grindables[math.random(#cache.grindables)]
   238    239   			local pd = sorcery.itemclass.get(i, 'grindable')
   239    240   			return pd.powder
   240    241   		end;
   241         -		desc = desc_builtin;
   242    242   		props = props_builtin;
   243    243   		slots = {
   244    244   			{0,1},
   245    245   			{0,0};
   246    246   		};
   247    247   		find = function(out)
   248    248   			cache:populate_grindables()
................................................................................
   377    377   		end
   378    378   	end
   379    379   	local img, ot
   380    380   	local props = k.props(result)
   381    381   	if props.note then
   382    382   		local nx, ny, nw, nh
   383    383   		if notes_right then
   384         -			nx = 5 ny = 0
   385         -			nw = 3 nh = 3
          384  +			nx = 5.25 ny = 0
          385  +			nw = 4 nh = 3
   386    386   		else
   387    387   			nx = 0 ny = 3
   388    388   			nw = 4 nh = 1
   389    389   		end
   390    390   		t = t .. string.format([[
   391         -			textarea[%f,%f;%f,%f;;;%s]
          391  +			hypertext[%f,%f;%f,%f;note;<global valign=middle halign=justify size=20>%s]
   392    392   		]], nx,ny,nw,nh, minetest.formspec_escape(props.note))
   393    393   	end
   394    394   	if k.icon then img = k.icon(result) end
   395    395   	if k.outdesc then ot = k.outdesc(result) else ot = desc_builtin(result) end
   396    396   		-- image[%f,%f;1,1;gui_furnace_arrow_bg.png^[transformR270]
   397    397   	return t .. string.format([[
   398    398   		item_image[%f,%f;1,1;%s]tooltip[%f,%f;1,1;%s]
................................................................................
   468    468   	type = 'shapeless';
   469    469   	recipe = {
   470    470   		'sorcery:cookbook';
   471    471   		'default:book';
   472    472   	};
   473    473   	output = 'sorcery:cookbook';
   474    474   };
          475  +
          476  +-- erase cookbooks in the usual way
          477  +minetest.register_craft {
          478  +	type = 'shapeless';
          479  +	recipe = {
          480  +		'sorcery:cookbook';
          481  +		'bucket:bucket_water';
          482  +	};
          483  +	output = 'default:book';
          484  +	replacements = {
          485  +		{'bucket:bucket_water','bucket:bucket_empty'};
          486  +	};
          487  +};
   475    488   
   476    489   local m = sorcery.lib.marshal
   477    490   local encbook, decbook = m.transcoder {
   478    491   	pages = m.g.array(8, m.g.struct {
   479    492   		kind = m.t.str;
   480    493   		name = m.t.str;
   481    494   	})
................................................................................
   483    496   
   484    497   local bookprops = function(stack)
   485    498   	local meta = stack:get_meta()
   486    499   	if meta:contains('cookbook') then
   487    500   		return decbook(sorcery.lib.str.meta_dearmor(meta:get_string('cookbook'),true))
   488    501   	else return {pages={}} end
   489    502   end
          503  +
          504  +sorcery.cookbook.get = bookprops
          505  +sorcery.cookbook.set = function(stack,props)
          506  +	local meta = stack:get_meta()
          507  +	meta:set_string('cookbook', sorcery.lib.str.meta_armor(encbook(props),true))
          508  +end
          509  +
          510  +sorcery.cookbook.defaults = {
          511  +	indesc = desc_builtin;
          512  +	outdesc = desc_builtin;
          513  +	title = desc_builtin;
          514  +	props = props_builtin;
          515  +	pick = pick_builtin;
          516  +	find = find_builtin;
          517  +}
          518  +
          519  +sorcery.cookbook.recfn = function(class,fn)
          520  +	local c = sorcery.cookbook.classes[class]
          521  +	if c[fn] then return c[fn] end
          522  +	return sorcery.cookbook.defaults[fn]
          523  +end
   490    524   
   491    525   local bookform_ctx = {}
   492    526   local bookform = function(stack,user)
   493    527   	bookform_ctx[user:get_player_name()] = user:get_wield_index()
   494    528   
   495    529   	local meta = stack:get_meta()
   496    530   	local book = bookprops(stack)
................................................................................
   498    532   	local curpage = meta:contains("pagenr") and meta:get_int("pagenr") or 1
   499    533   
   500    534   	local pgofs = (curpage - 1) * constants.recipes_per_cookbook_page
   501    535   	local form = string.format([[
   502    536   		formspec_version[3] 
   503    537   		size[10,12]real_coordinates[true]
   504    538   		box[0,0;10,1;#580C39FF]label[0.4,0.5;%s]
   505         -		button_exit[3,11;4,1;quit;Page %u/%u]
          539  +		style[pgind;border=false]
          540  +		style[pgind:hovered;content_offset=0,0]
          541  +		button[3,11;4,1;pgind;Page %u/%u]
   506    542   	]], minetest.formspec_escape(meta:get_string('description')),
   507    543   	    curpage, pagect)
          544  +		-- using an extremely dishonorable trick to fake centered text
   508    545   	
   509    546   	if curpage > 1      then form = form .. 'button[0,11;3,1;pageback;< Back]' end
   510    547   	if curpage < pagect then form = form .. 'button[7,11;3,1;pagenext;Next >]' end
   511    548   
   512    549   	local coords = {
   513         -		{2,1.3};
   514         -		{2,4.5};
   515         -		{2,7.7};
          550  +		{0.85,1.3};
          551  +		{0.85,4.5};
          552  +		{0.85,7.7};
   516    553   		-- {0,1.3}, {4, 1.3};
   517    554   		-- {0,4.7}, {4, 4.7};
   518    555   		-- {0,8.1}, {4, 8.1};
   519    556   	}
   520    557   	for i=pgofs,(pgofs + constants.recipes_per_cookbook_page-1) do
   521    558   		local maxw, maxh = 3, 2
   522    559   		if not book.pages[i+1] then break end

Modified crafttools.lua from [569141ccf4] to [68741b438c].

     1      1   minetest.register_on_craft(function(stack,crafter,recipe,grid)
     2         -	local ctoolclass = {
     3         -		[1] = 200;
     4         -		[2] = 100;
     5         -		[3] = 50;
     6         -		[4] = 10;
     7         -		[5] = 5;
     8         -	}
     9      2   	for i=1,grid:get_size('craft') do
    10      3   		local s = grid:get_stack('craft',i)
    11      4   		local v = minetest.get_item_group(s:get_name(),'crafttool')
    12      5   		if v ~= 0 then
    13         -			local dmg = 65536 / ctoolclass[v]
            6  +			local dmg = 65536 / v
    14      7   			local tool = recipe[i] 
    15      8   			tool:add_wear(dmg)
    16      9   			grid:set_stack('craft',i,tool)
    17     10   		end
    18     11   	end
    19     12   	return nil
    20     13   end)
    21     14   
    22         -if minetest.get_modpath('xdecor') then
    23         -	local og = minetest.registered_tools['xdecor:hammer'].groups
    24         -	og.crafttool = 2
    25         -	minetest.override_item('xdecor:hammer', {groups = og})
           15  +local mod_override = function(mod,name,val)
           16  +	if minetest.get_modpath(mod) then
           17  +		local id = mod..':'..name
           18  +		local og = minetest.registered_tools[id].groups
           19  +		og.crafttool = val
           20  +		minetest.override_item(id, {groups = og})
           21  +	end
    26     22   end
           23  +
           24  +mod_override('xdecor',     'hammer',     70)
           25  +mod_override('screwdriver','screwdriver',40)
    27     26   
    28     27   minetest.register_tool('sorcery:vice', {
    29     28   	description = 'Vice';
    30     29   	inventory_image = 'sorcery_vice.png';
    31         -	group = { crafttool = 3; }
           30  +	group = { crafttool = 100; }
    32     31   })
    33     32   minetest.register_craft {
    34     33   	output = 'sorcery:vice';
    35     34   	recipe = {
    36     35   		{'default:steel_ingot','sorcery:screw_steel','default:steel_ingot'};
    37     36   		{'default:bronze_ingot','sorcery:screw_steel','default:bronze_ingot'};
    38     37   		{'default:tin_ingot','default:tin_ingot','default:tin_ingot'};
    39     38   	};
    40     39   }
    41     40   -- chisel

Modified data/gods.lua from [7a41dba628] to [90d2603045].

   139    139   		idol = {
   140    140   			desc = "Blood Idol";
   141    141   			width = 0.7;
   142    142   			height = 1.3;
   143    143   			tex = {
   144    144   				"default_obsidian.png";
   145    145   				"default_gold_block.png";
   146         -				"default_bronze_block.png^[multiply:#C32F2F";
          146  +				"default_copper_block.png";
          147  +				-- "default_bronze_block.png^[multiply:#C32F2F";
   147    148   				"default_bronze_block.png";
   148    149   				"default_tin_block.png";
   149    150   			};
   150    151   		};
   151    152   		sacrifice = {
   152    153   			["sorcery:blood"] = 3;
   153    154   			["bonemeal:bone"] = 9;

Modified data/metals.lua from [3567f41644] to [970d414eec].

    19     19   return {
    20     20   	tin = {
    21     21   		ingot = 'default:tin_ingot';
    22     22   		block = 'default:tinblock';
    23     23   		tone = {172,172,172};
    24     24   		no_tools = true; no_armor = true; grindhead = true;
    25     25   		hardness = 2;
           26  +		level = 0;
    26     27   	};
    27     28   	copper = {
    28     29   		dye = 'orange';
    29     30   		ingot = 'default:copper_ingot';
    30     31   		block = 'default:copperblock';
    31     32   		tone = {255,176,61};
    32     33   		no_tools = true; no_armor = true;
    33     34   		hardness = 2;
    34     35   		conduct = 0.3;
           36  +		level = 0;
    35     37   	};
    36     38   	brass = {
    37     39   		tone = {255,226,87};
    38     40   		dye = 'bright_orange';
    39     41   		artificial = true;
    40     42   		no_tools = true; no_armor = true;
    41     43   		hardness = 3;
           44  +		level = 0; 
    42     45   		mix = {
    43     46   			metals = {
    44     47   				silver = 1;
    45     48   				copper = 4;
    46     49   			};
    47     50   		};
    48     51   	};
................................................................................
    50     53   		ingot = 'default:bronze_ingot';
    51     54   		block = 'default:bronzeblock';
    52     55   		dye = 'dark_orange';
    53     56   		artificial = true;
    54     57   		tone = {229,115,52};
    55     58   		items = default_items('bronze');
    56     59   		hardness = 4;
           60  +		durability = 300;
    57     61   		maxenergy = 150;
           62  +		speed = 1.4;
           63  +		level = 0;
    58     64   		slots = {
    59     65   			{affinity = {'counterpraxic'}; confluence = 0.7};
    60     66   		};
    61     67   		mix = {
    62     68   			metals = {
    63     69   				copper = 4;
    64     70   				tin = 1;
................................................................................
    67     73   	};
    68     74   	steel = {
    69     75   		ingot = 'default:steel_ingot';
    70     76   		block = 'default:steelblock';
    71     77   		tone = {240,240,240};
    72     78   		items = default_items('steel');
    73     79   		maxenergy = 200;
           80  +		durability = 500;
    74     81   		hardness = 5;
           82  +		speed = 1.9;
           83  +		level = 1;
    75     84   		slots = {
    76     85   			{affinity = {'praxic'}; confluence = 0.5};
    77     86   		};
    78     87   	};
    79     88   	aluminum = {
    80     89   		tone = {196,64,32}, alpha = 128;
    81     90   		dye = 'red';
................................................................................
    82     91   		meltpoint = 1;
    83     92   		rarity = 12; depth = 158;
    84     93   		power = 3; speed = 2.4;
    85     94   		durability = 700; cooktime = 25;
    86     95   		hardness = 6;
    87     96   		armor_weight = 0.3;
    88     97   		maxenergy = 400;
           98  +		level = 1;
           99  +		maxlevel = 2;
    89    100   		slots = {
    90    101   			{affinity = {'syncretic'}; confluence = 0.7};
    91    102   			{affinity = {'praxic'}; confluence = 0.4};
    92    103   		};
    93    104   	};
    94    105   	levitanium = {
    95    106   		tone = {17,255,191}, alpha = 40;
    96    107   		dye = 'bright_blue';
    97    108   		meltpoint = 4;
    98    109   		hardness = 3;
          110  +		level = 1;
    99    111   		rarity = 17; depth = 870;
   100    112   		power = 1; durability = 50; cooktime = 70;
   101    113   		armor_weight = -2.2; armor_protection = 1;
   102    114   		maxenergy = 5000;
   103    115   		no_tools = true;
   104    116   	};
   105    117   	platinum = {
   106    118   		tone = {255,233,118}, alpha = 50;
   107    119   		meltpoint = 1;
   108    120   		rarity = 15; depth = 580;
   109    121   		power = 4; speed = 3;
   110    122   		hardness = 6;
          123  +		level = 2;
   111    124   		durability = 1400; cooktime = 40;
   112    125   		armor_weight = 0.7;
   113    126   		maxenergy = 1000;
   114    127   		slots = {
   115    128   			{affinity = {'praxic','counterpraxic'}; confluence = 0.3};
   116    129   			{affinity = {'counterpraxic'}; confluence = 0.8};
   117    130   		}
................................................................................
   118    131   	};
   119    132   	gold = {
   120    133   		dye = 'yellow';
   121    134   		ingot = 'default:gold_ingot';
   122    135   		block = 'default:goldblock';
   123    136   		tone = {255,225,47};
   124    137   		hardness = 1;
          138  +		level = 1;
   125    139   		maxenergy = 3000;
   126    140   		slots = {
   127    141   			{affinity = {'praxic','counterpraxic'}; confluence = 1.4};
   128    142   			{affinity = {'praxic','counterpraxic'}; confluence = 1.2};
   129    143   		}
   130    144   	};
   131    145   	silver = {
   132    146   		tone = {218,255,246};
   133    147   		dye = 'white';
   134    148   		maxenergy = 2000;
   135    149   		hardness = 1;
          150  +		level = 1;
   136    151   		depth = 380; rarity = 13.5;
   137    152   		no_armor = true; no_tools = true;
   138    153   		power = 1; cooktime = 8; hardness = 1;
   139    154   	};
   140    155   	electrum = {
   141    156   		tone = {212, 255, 0}, alpha = 80;
   142    157   		artificial = true;
   143    158   		hardness = 1;
   144    159   		conduct = 2;
          160  +		level = 1;
   145    161   		dye = 'bright_green';
   146    162   		mix = {
   147    163   			metals = {
   148    164   				silver = 1;
   149    165   				gold = 1;
   150    166   			};
   151    167   		};
................................................................................
   158    174   		speed = 2.8;
   159    175   		power = 4;
   160    176   		hardness = 8;
   161    177   		meltpoint = 4;
   162    178   		cooktime = 100;
   163    179   		durability = 2700;
   164    180   		maxenergy = 1500;
          181  +		level = 2;
          182  +		maxlevel = 3;
   165    183   		slots = {
   166    184   			{affinity = {'counterpraxic'}, confluence = 0.6};
   167    185   			{affinity = {'praxic','counterpraxic'}, confluence = 1};
   168    186   			{affinity = {'praxic'}, confluence = 0.5};
   169    187   		};
   170    188   	};
   171    189   	cobalt = {
................................................................................
   174    192   		rarity = 17;
   175    193   		durabilty = 900;
   176    194   		hardness = 6;
   177    195   		power = 3;
   178    196   		speed = 3.5;
   179    197   		cooktime = 30;
   180    198   		maxenergy = 3500;
          199  +		level = 2;
   181    200   		slots = {
   182    201   			{
   183    202   				affinity = {'counterpraxic'};
   184    203   				confluence = 0.65;
   185    204   				interference = {speed = 1};
   186    205   			};
   187    206   		}
................................................................................
   188    207   	};
   189    208   	lithium = {
   190    209   		tone = {255,252,93}, alpha = 80;
   191    210   		dye = 'yellow';
   192    211   		rarity = 13;
   193    212   		hardness = 2;
   194    213   		fuel = 80;
          214  +		level = 1;
   195    215   		no_tools = true;
   196    216   		no_armor = true;
   197    217   	};
   198    218   	vidrium = {
   199    219   		tone = {119,185,221}, alpha = 140;
   200    220   		artificial = true;
   201    221   		dye = 'cyan';
   202    222   		hardness = 1;
   203    223   		durability = 300;
   204    224   		meltpoint = 2;
   205    225   		cooktime = 20;
   206    226   		no_tools = true, no_armor = true;
   207    227   		conduct = 5;
          228  +		level = 1;
   208    229   		mix = {
   209    230   			metals = {
   210    231   				lithium = 2;
   211    232   				tin = 4;
   212    233   				gold = 1;
   213    234   			}
   214    235   		};
................................................................................
   220    241   	iridium = {
   221    242   		tone = {209,88,241}, alpha = 80;
   222    243   		dye = 'purple';
   223    244   		rarity = 18;
   224    245   		meltpoint = 3;
   225    246   		cooktime = 340;
   226    247   		hardness = 7;
          248  +		level = 3;
   227    249   		maxenergy = 1800;
   228    250   		conduct = 10;
   229    251   		durability = 1900;
   230    252   		speed = 3;
   231    253   		img = {
   232    254   			-- ingot = 'sorcery_iridium_ingot.png';
   233    255   			-- block = 'sorcery_iridium_block.png';
................................................................................
   241    263   		tone = {255,64,175}, alpha = 70;
   242    264   		cooktime = 120;
   243    265   		artificial = true;
   244    266   		durability = 3400;
   245    267   		speed = 3.1;
   246    268   		hardness = 9;
   247    269   		power = 5;
          270  +		level = 4;
   248    271   		mix = {
   249    272   			metals = {
   250    273   				platinum = 4;
   251    274   				aluminum = 4;
   252    275   				tin = 1;
   253    276   			};
   254    277   		};
................................................................................
   264    287   	impervium = {
   265    288   		tone = {226,255,107}, alpha = 90;
   266    289   		cooktime = 260;
   267    290   		meltpoint = 5;
   268    291   		artificial = true;
   269    292   		speed = 2.1;
   270    293   		hardness = 15;
          294  +		level = 4;
          295  +		maxlevel = 5;
   271    296   		durability = 5300;
   272    297   		maxenergy = 2300;
   273    298   		watercool = true;
   274    299   		mix = {
   275    300   			metals = {
   276    301   				duranium = 4;
   277    302   				iridium = 2;
................................................................................
   287    312   	eternium = {
   288    313   		tone = {156,82,222}, alpha = 100;
   289    314   		cooktime = 500;
   290    315   		meltpoint = 6;
   291    316   		artificial = true;
   292    317   		speed = 2;
   293    318   		hardness = 10;
          319  +		level = 4;
   294    320   		maxenergy = 1200;
   295    321   		durability = 8100;
   296    322   		watercool = true;
   297    323   		mix = {
   298    324   			metals = {
   299    325   				iridium = 2;
   300    326   				tungsten = 2;
................................................................................
   315    341   		tone = {114,255,214}, alpha = 120;
   316    342   		meltpoint = 3;
   317    343   		cooktime = 330;
   318    344   		artificial = true;
   319    345   		maxenergy = 4000;
   320    346   		hardness = 7;
   321    347   		durability = 3300;
          348  +		level = 5;
   322    349   		conduct = 20;
   323    350   		speed = 3.4;
   324    351   		slots = {
   325    352   			{affinity={'praxic'}, confluence = 0.7};
   326    353   			{affinity={'counterpraxic'}, confluence = 1.2};
   327    354   			{affinity={'cognic'}, confluence = 1.1};
   328    355   		};
................................................................................
   337    364   	draconium = {
   338    365   		tone = {255,20,80}, alpha = 110;
   339    366   		artificial=true;
   340    367   		meltpoint = 5;
   341    368   		cooktime = 120;
   342    369   		hardness = 8;
   343    370   		maxconduct = 15;
          371  +		level = 2;
   344    372   		speed = 1.7;
   345    373   		maxenergy = 2200;
   346    374   		durability = 1500;
   347    375   		slots = {
   348    376   			{affinity={'praxic'},confluence=3};
   349    377   			{affinity={'syncretic'},confluence=2};
   350    378   		};
................................................................................
   358    386   		artificial=true;
   359    387   		hardness = 20;
   360    388   		meltpoint = 6;
   361    389   		cooktime = 240;
   362    390   		maxenergy = 800;
   363    391   		durability = 4000;
   364    392   		speed = 3.0;
          393  +		level = 3;
          394  +		maxlevel = 4;
   365    395   		slots = {};
   366    396   	};
   367    397   };

Modified data/spells.lua from [0d89fbd301] to [c7b64d56d8].

   475    475   							   restrict.group = 'sorcery_worship'
   476    476   						   elseif mod == sorcery.data.metals.gold.parts.powder then
   477    477   							   restrict.group = 'sorcery_grease'
   478    478   						   elseif mod == sorcery.data.metals.silver.parts.powder then
   479    479   							   restrict.group = 'sorcery_oil'
   480    480   						   elseif mod == sorcery.data.metals.electrum.parts.powder then
   481    481   							   restrict.group = 'sorcery_extract'
          482  +						   elseif mod == sorcery.data.metals.steel.parts.powder then
          483  +							   restrict.group = 'crafttool'
   482    484   						   elseif mod == 'farming:sugar' then
   483    485   							   restrict.mod = 'farming'
   484    486   						   else return false end
   485    487   					   end
   486    488   				   elseif ink1 == 'black' and ink2 == 'white' then kind = 'infuse'
   487    489   					   if mod then
   488    490   						   if mod == sorcery.data.metals.gold.parts.powder then

Modified depends.txt from [37d6e3fb32] to [77f19ef08b].

            1  +default
            2  +tnt?
     1      3   farming
     2      4   xdecor
            5  +basic_materials
     3      6   vessels
     4      7   late
     5      8   instant_ores
            9  +screwdriver

Modified disassembly.lua from [5131b0247b] to [5366481e82].

    43     43   	tiles = {
    44     44   		'default_copper_block.png';
    45     45   		'default_wood.png';
    46     46   		'default_steel_block.png';
    47     47   		'default_stone.png';
    48     48   		'default_gold_block.png';
    49     49   		'default_coal_block.png';
           50  +	};
           51  +	_sorcery = {
           52  +		recipe = {
           53  +			note = 'Destroy a device or object to learn how it is crafted';
           54  +		};
    50     55   	};
    51     56   	after_dig_node = sorcery.lib.node.purge_container;
    52     57   	on_construct = function(pos)
    53     58   		local m = minetest.get_meta(pos)
    54     59   		local i = m:get_inventory()
    55     60   		i:set_size('item',1)
    56     61   		i:set_size('paper',1)
................................................................................
    63     68   			list[current_player;main;0.25,2;8,4]
    64     69   
    65     70   			list[context;item;0.25,0.5;1,1;]
    66     71   			list[context;paper;2.25,0.5;1,1;]
    67     72   			list[context;ink;4.25,0.5;3,1;]
    68     73   			list[context;output;9,0.5;1,1;]
    69     74   
    70         -			listring[current_player;main] listring[context;item]
           75  +			listring[context;output]
    71     76   			listring[current_player;main] listring[context;paper]
    72     77   			listring[current_player;main] listring[context;ink]
           78  +			listring[current_player;main] listring[context;item]
           79  +			listring[current_player;main]
    73     80   		]])
    74     81   	end;
    75     82   	on_metadata_inventory_put = update_disassembler;
    76     83   	on_metadata_inventory_take = function(pos,list,idx,stack,user)
    77     84   		local m = minetest.get_meta(pos)
    78     85   		local i = m:get_inventory()
    79     86   		local paper = i:get_stack('paper',1)
    80     87   		local item = i:get_stack('item',1)
    81     88   
    82     89   		if list == 'output' then
    83     90   			local count = stack:get_count()
           91  +			local leftover = sorcery.data.infusion_leftovers[item:get_name()]
           92  +			local lstack if leftover then
           93  +				lstack = ItemStack(leftover)
           94  +				lstack:set_count(lstack:get_count() * count)
           95  +				-- this slightly idiosyncratic code is used to ensure that
           96  +				-- itemstrings can be used in the infusion leftovers table
           97  +			end
    84     98   			item:take_item(count)
    85         -			i:set_stack('item',1,item)
           99  +			if item:get_count() > 0 then
          100  +				if leftover then
          101  +					lstack = user:get_inventory():add_item(lstack)
          102  +					if lstack:get_count() > 0 then minetest.add_item(pos,lstack) end
          103  +				end
          104  +				i:set_stack('item',1,item)
          105  +			else
          106  +				if leftover then
          107  +					i:set_stack('item',1,lstack)
          108  +				else
          109  +					i:set_stack('item',1,ItemStack())
          110  +				end
          111  +			end
    86    112   			for j=1,i:get_size('ink') do
    87    113   				local ink = i:get_stack('ink',j)
    88    114   				ink:take_item(count)
    89    115   				i:set_stack('ink',j,ink)
    90    116   			end
    91    117   		end
    92    118   

Modified farcaster.lua from [6f8ef41220] to [af0360a5f2].

    19     19   				if tune then return 0.3 else return 0 end
    20     20   			end
    21     21   		};
    22     22   		attune = {
    23     23   			class = 'sorcery:raycaster', accepts = 'sorcery:raycaster';
    24     24   			source = true, target = true, reciprocal = true;
    25     25   		};
           26  +		recipe = {
           27  +			note = 'Bridges ley-nets by beam. Line of sight between attuned casters required. Constant power draw of <b>0.3 thaum</b>.';
           28  +		};
    26     29   		farcaster = {
    27     30   			partner = function(pos)
    28     31   				local tune = sorcery.attunement.verify(pos)
    29     32   				if not tune then return nil end
    30     33   				minetest.load_area(tune.partner)
    31     34   				local vis = false
    32     35   				local ignored
................................................................................
    78     81   				end
    79     82   			end;
    80     83   		};
    81     84   		attune = {
    82     85   			class = 'sorcery:farcaster', accepts = 'sorcery:farcaster';
    83     86   			source = true, target = true, reciprocal = true;
    84     87   		};
           88  +		recipe = {
           89  +			note = 'Bridges ley-nets by nonlocality. Power draw increases <b>2 thaum/km</b> in distance between caster units.';
           90  +		};
    85     91   		farcaster = {
    86     92   			partner = function(pos)
    87     93   				local tune = sorcery.attunement.verify(pos)
    88     94   				if not tune then return nil end
    89     95   
    90     96   				return tune.partner
    91     97   			end;

Modified harvester.lua from [81d31df3a3] to [61997cebcf].

    88     88   			list[context;charge;2.5,0;3,1;]
    89     89   			list[current_player;main;0,1.3;8,4;]
    90     90   			listring[]
    91     91   		]])
    92     92   	end;
    93     93   	on_metadata_inventory_put = update_inv;
    94     94   	on_metadata_inventory_move = update_inv;
           95  +
           96  +	_sorcery = {
           97  +		recipe = {
           98  +			info = "Standalone recharger for wands, amulets, and enchanted tools that draws on the ambient force from the local leylines";
           99  +		};
          100  +	};
    95    101   })
    96    102   
    97    103   minetest.register_craftitem('sorcery:harvester_receptacle', {
    98    104   	description = 'Harvester Receptacle';
    99    105   	inventory_image = 'sorcery_harvester_receptacle.png';
   100    106   })
   101    107   
................................................................................
   107    113   		{'stairs:slab_stone','stairs:slab_stone','stairs:slab_stone'};
   108    114   	};
   109    115   }
   110    116   
   111    117   minetest.register_craftitem('sorcery:accumulator', {
   112    118   	description = 'Accumulator';
   113    119   	inventory_image = 'sorcery_accumulator.png';
          120  +	_sorcery = {
          121  +		recipe = {
          122  +			info = 'Captures and channels ambient ley current';
          123  +		};
          124  +	};
   114    125   })
   115    126   
   116    127   minetest.register_craft {
   117    128   	output = 'sorcery:accumulator';
   118    129   	recipe = {
   119    130   		{'default:tin_ingot', 'default:tin_ingot', 'default:tin_ingot'};
   120    131   		{'sorcery:gem_amethyst','sorcery:gem_emerald','sorcery:gem_amethyst'};

Modified infuser.lua from [994388d832] to [0d2fb4d9eb].

   208    208   		"default_bronze_block.png",
   209    209   		"default_tin_block.png",
   210    210   	};
   211    211   	paramtype2 = 'facedir';
   212    212   	groups = {
   213    213   		cracky = 2, oddly_breakable_by_hand = 1, heavy = 1;
   214    214   		sorcery_alchemy = 1, sorcery_magitech = 1;
          215  +	};
          216  +	_sorcery = {
          217  +		recipe = {
          218  +			note = 'Infuse special ingredients into liquids to create and alter powerful potions';
          219  +		};
   215    220   	};
   216    221   	selection_box = {
   217    222   		type = 'fixed';
   218    223   		fixed = {
   219    224   			-0.37, -0.5, -0.37,
   220    225   			 0.37,  0.5,  0.37
   221    226   		};

Modified itemclass.lua from [c60971c6b0] to [25dadd17e3].

    42     42   			compat = 'grindables';
    43     43   			subclass = {'metallic'};
    44     44   			conform = {
    45     45   				metallic = function(m)
    46     46   					if m and m.data and m.data.parts and m.data.parts.powder then
    47     47   						return {
    48     48   							hardness = m.data.hardness;
    49         -							value = m.value or 1, grindcost = 1;
           49  +							grindcost = 1;
           50  +							grindvalue = m.value or 1;
    50     51   							powder = m.data.parts.powder;
    51     52   						}
    52     53   					end
    53     54   				end;
    54     55   			};
    55     56   			predicate = function(name)
    56     57   				local def = minetest.registered_items[name]._sorcery
    57     58   				if not def then return nil end
    58     59   				def = def.material
    59     60   				if def and def.grindvalue then
    60         -					return def end
           61  +					return {
           62  +						hardness = def.data.hardness;
           63  +						grindcost = def.grindcost or 1;
           64  +						grindvalue = def.grindvalue;
           65  +						powder = def.powder or def.data.parts.powder;
           66  +					}
           67  +				end
    61     68   			end;
    62     69   		};
    63     70   		metal = {
    64     71   			predicate = function(name)
    65     72   				-- metallookup is a table of 'primary' metal
    66     73   				-- items, like ingots, fragments, and powders
    67     74   				return sorcery.data.metallookup[name]
................................................................................
    71     78   			subclass = {'metal'};
    72     79   			predicate = function(name)
    73     80   				-- matreg is a registry binding crafted items,
    74     81   				-- like armors and tools, to the material they
    75     82   				-- are made out of
    76     83   				local mat = sorcery.matreg.lookup[name]
    77     84   				if mat and mat.metal then return mat end
           85  +				local prop = minetest.registered_items[name]._sorcery
           86  +				if prop and prop.material and prop.material.metal then
           87  +					return prop.material
           88  +				end
    78     89   			end;
    79     90   		};
    80     91   		ore = {
    81     92   			groups = { 'ore' };
    82     93   			compat = 'ore';
    83     94   			predicate = function(name)
    84     95   				-- maybe revise this at some point once sorcery is extricated

Modified leylines.lua from [0e41979f02] to [58178ad533].

    61     61   	};
    62     62   	groups = {
    63     63   		sorcery_ley_device = 1;
    64     64   		cracky = 3;
    65     65   	};
    66     66   	_sorcery = {
    67     67   		ley = { mode = 'signal'; power = 100 };
           68  +		recipe = { note = 'Conducts up to <b>100 thaum</b>' };
    68     69   	};
    69     70   })
    70     71   minetest.register_craft {
    71     72   	output = 'sorcery:conduit 4';
    72     73   	recipe = {
    73     74   		{'default:copper_ingot', 'default:copper_ingot',  'default:copper_ingot'};
    74     75   		{'default:copper_ingot', 'sorcery:electrumblock', 'default:copper_ingot'};
................................................................................
   160    161   		paramtype2 = 'facedir';
   161    162   		groups = {
   162    163   			cracky = 2;
   163    164   			choppy = 1;
   164    165   			sorcery_ley_device = 1;
   165    166   		};
   166    167   		_sorcery = {
   167         -			ley = { mode = 'signal'; power = 50; }
          168  +			ley = { mode = 'signal'; power = 50 };
          169  +			recipe = { note = 'Conducts up to <b>50 thaum</b>' };
   168    170   		};
   169    171   		tiles = tiles;
   170    172   	})
   171    173   	minetest.register_craft {
   172    174   		output = id .. ' 4';
   173    175   		recipe = {
   174    176   			{item, 'sorcery:conduit'};
................................................................................
   206    208   			drawtype = 'nodebox';
   207    209   			groups = {
   208    210   				sorcery_ley_device = 1; snappy = 3; attached = 1;
   209    211   				sorcery_ley_cable = 1;
   210    212   			};
   211    213   			_sorcery = {
   212    214   				ley = { mode = 'signal', power = metal.conduct };
   213         -				recipe = { note = 'Conducts up to ' .. metal.conduct .. ' thaum/sec'; };
          215  +				recipe = { note = 'Conducts up to <b>' .. metal.conduct .. ' thaum</b>'; };
   214    216   			};
   215    217   			sunlight_propagates = true;
   216    218   			node_box = {
   217    219   				type = 'connected';
   218    220   				disconnected   = { -0.05, -0.35, -0.40; 0.05, -0.25, 0.40 };
   219    221   				connect_front  = { -0.05, -0.35, -0.50; 0.05, -0.25, 0.05 };
   220    222   				connect_back   = { -0.05, -0.35, -0.05; 0.05, -0.25, 0.50 };
................................................................................
   320    322   				power = function(pos,time)
   321    323   					return sorcery.ley.field_to_current(sorcery.ley.estimate(pos).force, time);
   322    324   				end;
   323    325   				affinity = function(pos)
   324    326   					return sorcery.ley.estimate(pos).aff
   325    327   				end;
   326    328   			};
          329  +			recipe = {
          330  +				note = 'Captures radiant force and suffuses it through distribution net. Energy production varies with local leyline strength.';
          331  +			};
   327    332   		};
   328    333   	})
   329    334   end
   330    335   
   331    336   minetest.register_craft {
   332    337   	output = 'sorcery:condenser';
   333    338   	recipe = {
................................................................................
   784    789   			ley = {
   785    790   				mode = 'produce', affinity = {'praxic'};
   786    791   				power = function(pos,delta)
   787    792   					local meta = minetest.get_meta(pos)
   788    793   					return meta:get_float('power') * delta;
   789    794   				end;
   790    795   			};
          796  +			recipe = {
          797  +				note = 'Temporarily provide up to <b>' ..tostring(constants.generator_max_energy_output) .. ' thaum</b> of ley-force from heat by burning fuel';
          798  +			};
   791    799   		};
   792    800   	})
   793    801   end

Modified lib/tbl.lua from [5997708826] to [5046584198].

    55     55   	return ks
    56     56   end
    57     57   
    58     58   fn.pick = function(lst)
    59     59   	local keys = fn.keys(lst)
    60     60   	return keys[math.random(#keys)]
    61     61   end
           62  +
           63  +fn.unpack = function(tbl,i)
           64  +	if i and #tbl == i then return tbl[i] end
           65  +	i = i or 1
           66  +	return tbl[i], fn.unpack(tbl, i+1)
           67  +end
           68  +
           69  +fn.each = function(tbl,fn)
           70  +	local r = {}
           71  +	for k,v in pairs(tbl) do
           72  +		r[#r+1] = fn(v,k)
           73  +	end
           74  +	return r
           75  +end
           76  +
           77  +fn.each_o = function(tbl,fn)
           78  +	local keys = fn.keys(tbl)
           79  +	table.sort(keys)
           80  +	return fn.each(keys, function(k,i)
           81  +		return fn(tbl[k],k,i)
           82  +	end)
           83  +end
           84  +
           85  +fn.iter = function(tbl,fn)
           86  +	for i=1,#tbl do
           87  +		fn(tbl[i], i)
           88  +	end
           89  +end
           90  +
           91  +fn.map = function(tbl,fn)
           92  +	local new = {}
           93  +	for k,v in pairs(tbl) do
           94  +		local nv, nk = fn(v, k)
           95  +		new[nk or k] = nv
           96  +	end
           97  +	return new
           98  +end
           99  +
          100  +fn.fold = function(tbl,fn,acc)
          101  +	if #tbl == 0 then
          102  +		fn.each_o(tbl, function(v)
          103  +			acc = fn(acc, v, k)
          104  +		end)
          105  +	else
          106  +		for i=0,#tbl do
          107  +			acc = fn(acc,tbl[i],i)
          108  +		end
          109  +	end
          110  +	return acc
          111  +end
    62    112   
    63    113   return fn

Modified metallurgy-cold.lua from [e432fc7b5e] to [c145d6a94a].

   345    345   	local id = 'sorcery:mill_grindhead_' .. name
   346    346   	minetest.register_tool(id,{
   347    347   		description = sorcery.lib.str.capitalize(name) .. ' Grinding Head';
   348    348   		inventory_image = sorcery.lib.image('sorcery_mill_grindhead.png'):multiply(sorcery.lib.color(metal.tone)):render();
   349    349   		groups = { sorcery_mill_grindhead = 1, sorcery_metallurgy = 1 };
   350    350   		_proto = {
   351    351   			metal = name;
          352  +		};
          353  +		_sorcery = {
          354  +			recipe = {
          355  +				note = 'Needed by mills in order to operate. The stronger the metal, the longer the head lasts, the harder the materials it can pulverize, and the faster it grinds.';
          356  +			};
   352    357   		};
   353    358   	});
   354    359   	minetest.register_craft {
   355    360   		output = id;
   356    361   		recipe = {
   357    362   			{f,i,f};
   358    363   			{i,'',i};

Modified metallurgy-hot.lua from [222da491b8] to [c9beb59240].

   412    412   			tiles = {
   413    413   				'sorcery_smelter_top_' .. tostring(kind.size) .. '.png';
   414    414   				'sorcery_smelter_bottom.png';
   415    415   				'sorcery_smelter_side.png';
   416    416   				'sorcery_smelter_side.png';
   417    417   				'sorcery_smelter_side.png';
   418    418   				'sorcery_smelter_front' .. ((active and '_hot') or '') .. '.png';
          419  +			};
          420  +			_sorcery = {
          421  +				recipe = {
          422  +					note = 'Smelt alloys from raw metals combined in various ratios';
          423  +				};
   419    424   			};
   420    425   		})
   421    426   	end
   422    427   	minetest.register_craft {
   423    428   		recipe = recipe;
   424    429   		output = id;
   425    430   	}

Added models/sorcery-writing-stand.obj version [67a1cd621a].

            1  +# Blender v2.82 (sub 7) OBJ File: 'writing-stand.blend'
            2  +# www.blender.org
            3  +mtllib sorcery-writing-stand.mtl
            4  +o ink_Cube.011
            5  +v -0.316540 -0.332319 -0.197674
            6  +v -0.339437 -0.332319 -0.153270
            7  +v -0.383842 -0.332319 -0.176167
            8  +v -0.360945 -0.332319 -0.220572
            9  +v -0.316540 -0.339532 -0.197674
           10  +v -0.339437 -0.339532 -0.153270
           11  +v -0.383842 -0.339532 -0.176167
           12  +v -0.360945 -0.339532 -0.220572
           13  +vt 1.000000 1.000000
           14  +vt 1.000000 0.000000
           15  +vt 0.000000 0.000000
           16  +vt 0.000000 1.000000
           17  +vt 1.000000 1.000000
           18  +vt 0.000000 1.000000
           19  +vt 0.000000 0.000000
           20  +vt 1.000000 0.000000
           21  +vn 0.0000 -1.0000 -0.0000
           22  +vn 0.0000 1.0000 0.0000
           23  +vn 0.4583 0.0000 -0.8888
           24  +vn 0.8888 0.0000 0.4583
           25  +vn -0.8888 0.0000 -0.4583
           26  +vn -0.4583 0.0000 0.8888
           27  +g ink_Cube.011_ink
           28  +usemtl ink
           29  +s off
           30  +f 3/1/1 4/2/1 1/3/1 2/4/1
           31  +f 7/5/2 6/6/2 5/7/2 8/8/2
           32  +f 3/1/3 2/4/3 6/6/3 7/5/3
           33  +f 4/2/4 3/1/4 7/5/4 8/8/4
           34  +f 2/4/5 1/3/5 5/7/5 6/6/5
           35  +f 1/3/6 4/2/6 8/8/6 5/7/6
           36  +o wood_Cube.014
           37  +v -0.348948 -0.277485 -0.211664
           38  +v -0.321989 -0.279657 -0.196141
           39  +v -0.355224 -0.292284 -0.202835
           40  +v -0.328265 -0.294456 -0.187312
           41  +v -0.273207 -0.398159 -0.360099
           42  +v -0.246248 -0.400332 -0.344577
           43  +v -0.252524 -0.415131 -0.335748
           44  +v -0.279483 -0.412958 -0.351270
           45  +v -0.345859 -0.280020 -0.208026
           46  +v -0.326953 -0.281543 -0.197141
           47  +v -0.331354 -0.291921 -0.190950
           48  +v -0.350260 -0.290398 -0.201835
           49  +v 0.025418 -0.500000 0.319472
           50  +v -0.006255 -0.500000 0.180570
           51  +v 0.147454 -0.500000 0.291645
           52  +v 0.115781 -0.500000 0.152743
           53  +v 0.115781 -0.468359 0.152743
           54  +v -0.006255 -0.468359 0.180570
           55  +v 0.025418 -0.468359 0.319472
           56  +v 0.147454 -0.468359 0.291645
           57  +v 0.096556 -0.468359 0.188214
           58  +v 0.026446 -0.468359 0.204201
           59  +v 0.044643 -0.468359 0.284001
           60  +v 0.114753 -0.468359 0.268015
           61  +v 0.096556 -0.179958 0.188214
           62  +v 0.026446 -0.179958 0.204201
           63  +v 0.044643 -0.179958 0.284001
           64  +v 0.114753 -0.179958 0.268015
           65  +v 0.114753 -0.377388 0.268015
           66  +v 0.114753 -0.458476 0.268015
           67  +v 0.096556 -0.458476 0.188214
           68  +v 0.096556 -0.377388 0.188214
           69  +v 0.110770 -0.395135 0.250550
           70  +v 0.110770 -0.440729 0.250550
           71  +v 0.100539 -0.440729 0.205679
           72  +v 0.100539 -0.395135 0.205679
           73  +v 0.145454 -0.179958 0.163194
           74  +v -0.028464 -0.179958 0.202852
           75  +v -0.004255 -0.179958 0.309022
           76  +v 0.169664 -0.179958 0.269364
           77  +v 0.145454 -0.126606 0.163194
           78  +v -0.028464 -0.036922 0.202852
           79  +v -0.004255 0.046263 0.309022
           80  +v 0.169664 -0.043421 0.269364
           81  +v 0.056318 -0.500000 -0.227711
           82  +v -0.117600 -0.500000 -0.188054
           83  +v -0.093391 -0.500000 -0.081884
           84  +v 0.080528 -0.500000 -0.121541
           85  +v 0.056319 -0.431639 -0.227711
           86  +v -0.117600 -0.341955 -0.188054
           87  +v -0.093391 -0.258770 -0.081884
           88  +v 0.080528 -0.348454 -0.121541
           89  +v 0.155509 -0.440729 0.240348
           90  +v 0.200247 -0.440729 0.230147
           91  +v 0.190016 -0.440729 0.185277
           92  +v 0.145277 -0.440729 0.195478
           93  +v 0.155509 -0.395135 0.240348
           94  +v 0.200247 -0.395135 0.230147
           95  +v 0.145277 -0.395135 0.195478
           96  +v 0.190015 -0.395135 0.185277
           97  +v 0.073362 -0.440729 -0.119907
           98  +v 0.073362 -0.395135 -0.119907
           99  +v 0.080528 -0.440729 -0.121541
          100  +v 0.080528 -0.395135 -0.121541
          101  +v 0.118100 -0.395135 -0.130108
          102  +v 0.118100 -0.440729 -0.130108
          103  +v 0.056319 -0.459216 -0.227711
          104  +v 0.056319 -0.482622 -0.227711
          105  +v -0.117600 -0.460428 -0.188054
          106  +v -0.117600 -0.407126 -0.188054
          107  +v -0.093391 -0.358359 -0.081884
          108  +v -0.093391 -0.439649 -0.081884
          109  +v 0.046967 -0.459216 -0.257427
          110  +v 0.042793 -0.482622 -0.275730
          111  +v -0.135573 -0.460428 -0.278169
          112  +v -0.131399 -0.407126 -0.259866
          113  +v 0.043006 -0.459216 -0.291300
          114  +v 0.043006 -0.482622 -0.291300
          115  +v -0.135360 -0.460428 -0.293739
          116  +v -0.135360 -0.407126 -0.293739
          117  +v 0.050708 -0.430911 -0.277148
          118  +v -0.127658 -0.378822 -0.279588
          119  +v 0.051271 -0.430911 -0.291187
          120  +v -0.127095 -0.378822 -0.293626
          121  +v 0.041878 -0.500000 -0.291042
          122  +v -0.141385 -0.500000 -0.292365
          123  +v 0.485994 -0.500000 0.214450
          124  +v 0.454321 -0.500000 0.075548
          125  +v 0.363958 -0.500000 0.242277
          126  +v 0.332285 -0.500000 0.103375
          127  +v 0.332285 -0.468359 0.103375
          128  +v 0.454321 -0.468359 0.075548
          129  +v 0.485994 -0.468359 0.214450
          130  +v 0.363958 -0.468359 0.242277
          131  +v 0.364986 -0.468359 0.127006
          132  +v 0.435096 -0.468359 0.111019
          133  +v 0.453293 -0.468359 0.190819
          134  +v 0.383183 -0.468359 0.206806
          135  +v 0.364986 -0.179958 0.127006
          136  +v 0.435096 -0.179958 0.111019
          137  +v 0.453293 -0.179958 0.190819
          138  +v 0.383183 -0.179958 0.206806
          139  +v 0.383183 -0.377388 0.206806
          140  +v 0.383183 -0.458476 0.206806
          141  +v 0.364986 -0.458476 0.127006
          142  +v 0.364986 -0.377388 0.127006
          143  +v 0.379200 -0.395135 0.189341
          144  +v 0.379200 -0.440729 0.189341
          145  +v 0.368969 -0.440729 0.144471
          146  +v 0.368969 -0.395135 0.144471
          147  +v 0.244985 -0.395135 0.219945
          148  +v 0.244985 -0.440729 0.219945
          149  +v 0.234754 -0.440729 0.175075
          150  +v 0.234754 -0.395135 0.175075
          151  +v 0.310076 -0.179958 0.125656
          152  +v 0.483994 -0.179958 0.085999
          153  +v 0.508203 -0.179958 0.192169
          154  +v 0.334285 -0.179958 0.231827
          155  +v 0.310076 -0.126606 0.125656
          156  +v 0.483994 -0.036922 0.085999
          157  +v 0.508203 0.046263 0.192169
          158  +v 0.334285 -0.043421 0.231827
          159  +v 0.251974 -0.179958 0.250595
          160  +v 0.227765 -0.179958 0.144425
          161  +v 0.251974 -0.086934 0.250595
          162  +v 0.227765 -0.170899 0.144425
          163  +v 0.220940 -0.500000 -0.265249
          164  +v 0.394858 -0.500000 -0.304906
          165  +v 0.419068 -0.500000 -0.198736
          166  +v 0.245149 -0.500000 -0.159079
          167  +v 0.220940 -0.431639 -0.265249
          168  +v 0.394858 -0.341955 -0.304906
          169  +v 0.419068 -0.258770 -0.198736
          170  +v 0.245149 -0.348454 -0.159079
          171  +v 0.162839 -0.500000 -0.140310
          172  +v 0.138629 -0.500000 -0.246480
          173  +v 0.162839 -0.391967 -0.140310
          174  +v 0.138629 -0.475931 -0.246480
          175  +v 0.334462 -0.440729 0.199543
          176  +v 0.289724 -0.440729 0.209744
          177  +v 0.279492 -0.440729 0.164874
          178  +v 0.324230 -0.440729 0.154672
          179  +v 0.334462 -0.395135 0.199543
          180  +v 0.289724 -0.395135 0.209744
          181  +v 0.324230 -0.395135 0.154672
          182  +v 0.279492 -0.395135 0.164874
          183  +v 0.252315 -0.440729 -0.160713
          184  +v 0.252315 -0.395135 -0.160713
          185  +v 0.245149 -0.440729 -0.159079
          186  +v 0.245149 -0.395135 -0.159079
          187  +v 0.207577 -0.395135 -0.150511
          188  +v 0.207577 -0.440729 -0.150511
          189  +v 0.220940 -0.459215 -0.265249
          190  +v 0.220940 -0.482622 -0.265249
          191  +v 0.394858 -0.460428 -0.304906
          192  +v 0.394858 -0.407126 -0.304906
          193  +v 0.419068 -0.358359 -0.198736
          194  +v 0.419068 -0.439649 -0.198736
          195  +v 0.162839 -0.473265 -0.140310
          196  +v 0.162839 -0.437254 -0.140310
          197  +v 0.138629 -0.486021 -0.246480
          198  +v 0.138629 -0.494044 -0.246480
          199  +v 0.216485 -0.459216 -0.296081
          200  +v 0.212312 -0.482622 -0.314384
          201  +v 0.371989 -0.460428 -0.393905
          202  +v 0.376162 -0.407126 -0.375602
          203  +v 0.205370 -0.459215 -0.328323
          204  +v 0.205370 -0.482622 -0.328323
          205  +v 0.365047 -0.460428 -0.407844
          206  +v 0.365047 -0.407126 -0.407844
          207  +v 0.204564 -0.430911 -0.312231
          208  +v 0.364241 -0.378822 -0.391752
          209  +v 0.197972 -0.430911 -0.324638
          210  +v 0.357649 -0.378822 -0.404159
          211  +v 0.206499 -0.500000 -0.328580
          212  +v 0.371073 -0.500000 -0.409218
          213  +vt 0.424217 -0.000000
          214  +vt 0.424217 1.000000
          215  +vt 0.575783 1.000000
          216  +vt 0.575783 -0.000000
          217  +vt 0.455431 -0.000000
          218  +vt 0.455431 1.000000
          219  +vt 0.544569 1.000000
          220  +vt 0.544569 -0.000000
          221  +vt 0.575783 -0.000000
          222  +vt 0.575783 1.000000
          223  +vt 0.424217 1.000000
          224  +vt 0.424217 -0.000000
          225  +vt 0.544569 -0.000000
          226  +vt 0.544569 1.000000
          227  +vt 0.455431 1.000000
          228  +vt 0.455431 -0.000000
          229  +vt 0.544569 0.424217
          230  +vt 0.544569 0.575783
          231  +vt 0.531255 0.553144
          232  +vt 0.531255 0.446856
          233  +vt 0.455431 0.575783
          234  +vt 0.455431 0.424217
          235  +vt 0.468745 0.446856
          236  +vt 0.468745 0.553144
          237  +vt 0.407565 1.427836
          238  +vt 0.407565 1.202985
          239  +vt 0.605112 1.202985
          240  +vt 0.605112 1.427836
          241  +vt 0.407565 1.202985
          242  +vt 0.407565 1.427836
          243  +vt 0.449593 1.380000
          244  +vt 0.449593 1.250822
          245  +vt 0.407565 0.372190
          246  +vt 0.605112 0.372190
          247  +vt 0.605112 0.422128
          248  +vt 0.407565 0.422128
          249  +vt 0.605112 0.372190
          250  +vt 0.407565 0.372190
          251  +vt 0.407565 0.422128
          252  +vt 0.605112 0.422128
          253  +vt 1.202985 0.372190
          254  +vt 1.427836 0.372190
          255  +vt 1.427836 0.422128
          256  +vt 1.202985 0.422128
          257  +vt 1.427836 0.372190
          258  +vt 1.202985 0.372190
          259  +vt 1.202985 0.422128
          260  +vt 1.427836 0.422128
          261  +vt 0.449593 0.422128
          262  +vt 0.563085 0.422128
          263  +vt 0.563085 0.877301
          264  +vt 0.449593 0.877301
          265  +vt 0.449593 0.565705
          266  +vt 0.449593 0.437726
          267  +vt 0.605112 1.427836
          268  +vt 0.605112 1.202985
          269  +vt 0.563085 1.250822
          270  +vt 0.563085 1.380000
          271  +vt 0.449593 1.380000
          272  +vt 0.563085 1.380000
          273  +vt 0.647106 1.401343
          274  +vt 0.365571 1.401343
          275  +vt 0.563085 0.422128
          276  +vt 0.449593 0.422128
          277  +vt 0.449593 0.437726
          278  +vt 0.449593 0.565705
          279  +vt 0.449593 0.877301
          280  +vt 0.563085 0.877301
          281  +vt 1.250822 0.565705
          282  +vt 1.380000 0.565705
          283  +vt 1.380000 0.877301
          284  +vt 1.250822 0.877301
          285  +vt 1.380000 0.422128
          286  +vt 1.250822 0.422128
          287  +vt 1.250822 0.877301
          288  +vt 1.380000 0.877301
          289  +vt 1.250822 0.422128
          290  +vt 1.380000 0.422128
          291  +vt 1.380000 0.437726
          292  +vt 1.250822 0.437726
          293  +vt 1.351728 0.465735
          294  +vt 1.279093 0.465735
          295  +vt 0.304750 1.279093
          296  +vt 0.304750 1.351728
          297  +vt 0.232329 1.351728
          298  +vt 0.232329 1.279093
          299  +vt 1.279093 0.537695
          300  +vt 1.351728 0.537695
          301  +vt 0.304750 0.465735
          302  +vt 0.304750 0.537695
          303  +vt 0.232329 0.537695
          304  +vt 0.232329 0.465735
          305  +vt 0.304750 1.351728
          306  +vt 0.304750 1.279093
          307  +vt 0.232329 1.279093
          308  +vt 0.232329 1.351728
          309  +vt 0.304750 0.537695
          310  +vt 0.304750 0.465735
          311  +vt 0.232329 0.465735
          312  +vt 0.232329 0.537695
          313  +vt 0.365571 1.229478
          314  +vt 0.232329 1.401343
          315  +vt 0.232329 1.229478
          316  +vt 0.563085 1.250822
          317  +vt 0.449593 1.250822
          318  +vt 0.647106 1.229478
          319  +vt 0.365571 1.401343
          320  +vt 0.647106 1.401343
          321  +vt 0.647106 1.229478
          322  +vt 0.365571 1.229478
          323  +vt 1.401343 0.877301
          324  +vt 1.229478 0.877301
          325  +vt 1.229478 1.105982
          326  +vt 1.401343 1.238500
          327  +vt 0.365571 0.877301
          328  +vt 0.647106 0.877301
          329  +vt 0.647106 1.238500
          330  +vt 0.365571 1.096955
          331  +vt 0.647106 0.877301
          332  +vt 0.365571 0.877301
          333  +vt 0.365571 0.964437
          334  +vt 0.647106 1.105982
          335  +vt 0.232329 1.024115
          336  +vt 0.232329 0.877301
          337  +vt 0.232329 0.877301
          338  +vt 0.232329 0.891598
          339  +vt 0.232329 1.229478
          340  +vt 0.232329 1.401343
          341  +vt 0.365571 0.596692
          342  +vt 0.647106 0.596692
          343  +vt 0.647106 0.768557
          344  +vt 0.365571 0.768557
          345  +vt 0.232329 0.768557
          346  +vt 0.232329 0.596692
          347  +vt 0.365571 0.768557
          348  +vt 0.647106 0.768557
          349  +vt 0.647106 0.596692
          350  +vt 0.365571 0.596692
          351  +vt 0.768557 0.595737
          352  +vt 0.596692 0.518769
          353  +vt 0.596692 0.624561
          354  +vt 0.768557 0.757079
          355  +vt 0.365571 0.372190
          356  +vt 0.365571 0.465735
          357  +vt 0.377171 0.465735
          358  +vt 0.377171 0.537695
          359  +vt 0.365571 0.537695
          360  +vt 0.365571 0.615534
          361  +vt 0.647106 0.757079
          362  +vt 0.647106 0.595737
          363  +vt 0.647106 0.467441
          364  +vt 0.647106 0.372190
          365  +vt 0.647106 0.518769
          366  +vt 0.365571 0.436559
          367  +vt 0.365571 0.483016
          368  +vt 0.647106 0.624561
          369  +vt 0.232329 0.372190
          370  +vt 0.232329 0.414386
          371  +vt 0.232329 0.471221
          372  +vt 0.232329 0.542695
          373  +vt 0.304750 0.537695
          374  +vt 0.304750 0.465735
          375  +vt 0.365571 0.399617
          376  +vt 0.365571 0.372190
          377  +vt 0.232329 0.372190
          378  +vt 0.232329 0.381591
          379  +vt 0.232329 0.596692
          380  +vt 0.232329 0.768557
          381  +vt 0.449593 0.537695
          382  +vt 0.449593 0.465735
          383  +vt 0.377171 0.465735
          384  +vt 0.377171 0.537695
          385  +vt 1.279093 0.465735
          386  +vt 1.279093 0.537695
          387  +vt 0.768557 0.537695
          388  +vt 0.768557 0.465735
          389  +vt 0.449593 1.351728
          390  +vt 0.449593 1.279093
          391  +vt 0.377171 1.279093
          392  +vt 0.377171 1.351728
          393  +vt 0.449593 0.465735
          394  +vt 0.449593 0.537695
          395  +vt 0.377171 0.537695
          396  +vt 0.377171 0.465735
          397  +vt 0.449593 1.279093
          398  +vt 0.449593 1.351728
          399  +vt 0.377171 1.351728
          400  +vt 0.377171 1.279093
          401  +vt 0.377171 0.768557
          402  +vt 0.365571 0.768557
          403  +vt 0.304750 0.768557
          404  +vt 0.304750 0.768557
          405  +vt 0.365571 0.768557
          406  +vt 0.377171 0.768557
          407  +vt 1.279093 0.537695
          408  +vt 1.279093 0.465735
          409  +vt 0.768557 0.465735
          410  +vt 0.768557 0.537695
          411  +vt 0.232329 0.394253
          412  +vt 0.232329 0.410177
          413  +vt 0.647106 0.372190
          414  +vt 0.647106 0.434646
          415  +vt 0.596692 0.434646
          416  +vt 0.451720 0.434646
          417  +vt 0.481348 0.518769
          418  +vt 0.768557 0.372190
          419  +vt 0.596692 0.372190
          420  +vt 0.768557 0.467441
          421  +vt 0.647106 0.427836
          422  +vt 0.365571 0.494173
          423  +vt 0.596692 0.399617
          424  +vt 0.596692 0.436559
          425  +vt 0.547686 0.436559
          426  +vt 0.518057 0.399617
          427  +vt 0.365571 0.596692
          428  +vt 0.647106 0.596692
          429  +vt 0.643142 0.481348
          430  +vt 0.369535 0.547686
          431  +vt 0.637352 0.434646
          432  +vt 0.363744 0.399617
          433  +vt 0.363744 0.436559
          434  +vt 0.637352 0.518769
          435  +vt 0.494173 0.436559
          436  +vt 0.494173 0.399617
          437  +vt 0.351067 0.481231
          438  +vt 0.624674 0.563441
          439  +vt 0.427836 0.434646
          440  +vt 0.427836 0.518769
          441  +vt 0.356858 0.518652
          442  +vt 0.630465 0.452314
          443  +vt 0.624674 0.430910
          444  +vt 0.351067 0.497247
          445  +vt 0.369535 0.436559
          446  +vt 0.643142 0.518769
          447  +vt 0.630465 0.563441
          448  +vt 0.356858 0.481231
          449  +vt 0.518652 0.481231
          450  +vt 0.497247 0.481231
          451  +vt 0.430910 0.563441
          452  +vt 0.452314 0.563441
          453  +vt 0.647106 0.372190
          454  +vt 0.365571 0.372190
          455  +vt 0.427836 0.372190
          456  +vt 0.596692 0.372190
          457  +vt 0.494173 0.372190
          458  +vt 0.057094 1.427836
          459  +vt -0.140454 1.427836
          460  +vt -0.140454 1.202985
          461  +vt 0.057094 1.202985
          462  +vt 0.057094 1.202985
          463  +vt 0.015066 1.250822
          464  +vt 0.015066 1.380000
          465  +vt 0.057094 1.427836
          466  +vt 0.057094 0.372190
          467  +vt 0.057094 0.422128
          468  +vt -0.140454 0.422128
          469  +vt -0.140454 0.372190
          470  +vt -0.140454 0.372190
          471  +vt -0.140454 0.422128
          472  +vt 0.057094 0.422128
          473  +vt 0.057094 0.372190
          474  +vt 1.202985 0.372190
          475  +vt 1.202985 0.422128
          476  +vt 1.427836 0.422128
          477  +vt 1.427836 0.372190
          478  +vt 1.427836 0.372190
          479  +vt 1.427836 0.422128
          480  +vt 1.202985 0.422128
          481  +vt 1.202985 0.372190
          482  +vt 0.015066 0.422128
          483  +vt 0.015066 0.437726
          484  +vt 0.015066 0.565705
          485  +vt 0.015066 0.877301
          486  +vt -0.098426 0.877301
          487  +vt -0.098426 0.422128
          488  +vt -0.140454 1.427836
          489  +vt -0.098426 1.380000
          490  +vt -0.098426 1.250822
          491  +vt -0.140454 1.202985
          492  +vt 0.015066 1.380000
          493  +vt 0.099087 1.401343
          494  +vt -0.182447 1.401343
          495  +vt -0.098426 1.380000
          496  +vt -0.098426 0.422128
          497  +vt -0.098426 0.877301
          498  +vt 0.015066 0.877301
          499  +vt 0.015066 0.565705
          500  +vt 0.015066 0.437726
          501  +vt 0.015066 0.422128
          502  +vt 1.250822 0.565705
          503  +vt 1.250822 0.877301
          504  +vt 1.380000 0.877301
          505  +vt 1.380000 0.565705
          506  +vt 1.380000 0.422128
          507  +vt 1.380000 0.877301
          508  +vt 1.250822 0.877301
          509  +vt 1.250822 0.422128
          510  +vt 1.250822 0.422128
          511  +vt 1.250822 0.437726
          512  +vt 1.380000 0.437726
          513  +vt 1.380000 0.422128
          514  +vt 1.279093 0.465735
          515  +vt 1.351728 0.465735
          516  +vt 0.159908 1.279093
          517  +vt 0.159908 1.351728
          518  +vt 1.351728 0.537695
          519  +vt 1.279093 0.537695
          520  +vt 1.279093 0.465735
          521  +vt 1.279093 0.537695
          522  +vt 1.351728 0.537695
          523  +vt 1.351728 0.465735
          524  +vt 0.159908 0.465735
          525  +vt 0.159908 0.537695
          526  +vt 0.159908 1.351728
          527  +vt 0.159908 1.279093
          528  +vt 0.159908 0.537695
          529  +vt 0.159908 0.465735
          530  +vt 0.099087 1.229478
          531  +vt -0.098426 1.250822
          532  +vt -0.182447 1.229478
          533  +vt 0.015066 1.250822
          534  +vt 0.099087 1.401343
          535  +vt 0.099087 1.229478
          536  +vt -0.182447 1.229478
          537  +vt -0.182447 1.401343
          538  +vt 1.401343 0.877301
          539  +vt 1.401343 1.238500
          540  +vt 1.229478 1.105982
          541  +vt 1.229478 0.877301
          542  +vt 0.099087 0.877301
          543  +vt 0.099087 1.096955
          544  +vt -0.182447 1.238500
          545  +vt -0.182447 0.877301
          546  +vt -0.182447 0.877301
          547  +vt -0.182447 1.105982
          548  +vt 0.099087 0.964437
          549  +vt 0.099087 0.877301
          550  +vt 1.229478 0.877301
          551  +vt 1.229478 0.891598
          552  +vt 1.401343 1.024115
          553  +vt 1.401343 0.877301
          554  +vt 0.099087 0.596692
          555  +vt 0.099087 0.768557
          556  +vt -0.182447 0.768557
          557  +vt -0.182447 0.596692
          558  +vt 0.099087 0.768557
          559  +vt 0.099087 0.596692
          560  +vt -0.182447 0.596692
          561  +vt -0.182447 0.768557
          562  +vt 0.768557 0.595737
          563  +vt 0.768557 0.757079
          564  +vt 0.596692 0.624561
          565  +vt 0.596692 0.518769
          566  +vt 0.099087 0.372190
          567  +vt -0.182447 0.372190
          568  +vt -0.182447 0.467441
          569  +vt -0.182447 0.595737
          570  +vt -0.182447 0.757079
          571  +vt 0.099087 0.615534
          572  +vt 0.099087 0.537695
          573  +vt 0.087487 0.537695
          574  +vt 0.087487 0.465735
          575  +vt 0.099087 0.465735
          576  +vt -0.182447 0.518769
          577  +vt -0.182447 0.624561
          578  +vt 0.099087 0.483016
          579  +vt 0.099087 0.436559
          580  +vt 0.596692 0.394253
          581  +vt 0.596692 0.410177
          582  +vt 0.768557 0.542695
          583  +vt 0.768557 0.471221
          584  +vt 0.159908 0.465735
          585  +vt 0.159908 0.537695
          586  +vt 0.099087 0.399617
          587  +vt 0.099087 0.372190
          588  +vt 0.015066 0.537695
          589  +vt 0.087487 0.537695
          590  +vt 0.087487 0.465735
          591  +vt 0.015066 0.465735
          592  +vt 1.279093 0.465735
          593  +vt 0.768557 0.465735
          594  +vt 0.768557 0.537695
          595  +vt 1.279093 0.537695
          596  +vt 0.015066 1.351728
          597  +vt 0.087487 1.351728
          598  +vt 0.087487 1.279093
          599  +vt 0.015066 1.279093
          600  +vt 0.015066 0.465735
          601  +vt 0.087487 0.465735
          602  +vt 0.087487 0.537695
          603  +vt 0.015066 0.537695
          604  +vt 0.015066 1.279093
          605  +vt 0.087487 1.279093
          606  +vt 0.087487 1.351728
          607  +vt 0.015066 1.351728
          608  +vt 0.159908 0.768557
          609  +vt 0.099087 0.768557
          610  +vt 0.087487 0.768557
          611  +vt 0.087487 0.768557
          612  +vt 0.099087 0.768557
          613  +vt 0.159908 0.768557
          614  +vt 1.279093 0.537695
          615  +vt 0.768557 0.537695
          616  +vt 0.768557 0.465735
          617  +vt 1.279093 0.465735
          618  +vt 0.596692 0.372190
          619  +vt 0.596692 0.381591
          620  +vt 0.768557 0.414386
          621  +vt 0.768557 0.372190
          622  +vt -0.182447 0.372190
          623  +vt -0.182447 0.434646
          624  +vt 0.481348 0.518769
          625  +vt 0.451720 0.434646
          626  +vt 0.596692 0.434646
          627  +vt 0.768557 0.372190
          628  +vt 0.768557 0.467441
          629  +vt 0.596692 0.372190
          630  +vt 0.099087 0.494173
          631  +vt -0.182447 0.427836
          632  +vt 0.596692 0.399617
          633  +vt 0.518057 0.399617
          634  +vt 0.547686 0.436559
          635  +vt 0.596692 0.436559
          636  +vt 0.099087 0.596692
          637  +vt 0.095124 0.547686
          638  +vt -0.178483 0.481348
          639  +vt -0.182447 0.596692
          640  +vt -0.172693 0.434646
          641  +vt -0.172693 0.518769
          642  +vt 0.100914 0.436559
          643  +vt 0.100914 0.399617
          644  +vt 0.494173 0.399617
          645  +vt 0.494173 0.436559
          646  +vt -0.160016 0.563441
          647  +vt 0.113592 0.481231
          648  +vt 0.427836 0.518769
          649  +vt 0.427836 0.434646
          650  +vt 0.107801 0.518652
          651  +vt 0.113592 0.497247
          652  +vt -0.160016 0.430910
          653  +vt -0.165806 0.452314
          654  +vt 0.095124 0.436559
          655  +vt 0.107801 0.481231
          656  +vt -0.165806 0.563441
          657  +vt -0.178483 0.518769
          658  +vt 0.497247 0.481231
          659  +vt 0.518652 0.481231
          660  +vt 0.452314 0.563441
          661  +vt 0.430910 0.563441
          662  +vt -0.182447 0.372190
          663  +vt 0.099087 0.372190
          664  +vt 0.427836 0.372190
          665  +vt 0.596692 0.372190
          666  +vt 0.494173 0.372190
          667  +vn 0.3422 0.8069 -0.4814
          668  +vn 0.8645 -0.0697 0.4978
          669  +vn -0.3422 -0.8069 0.4814
          670  +vn -0.8645 0.0697 -0.4978
          671  +vn -0.3681 0.5865 0.7214
          672  +vn 0.0000 1.0000 0.0000
          673  +vn -0.0000 -1.0000 0.0000
          674  +vn -0.2223 0.0000 -0.9750
          675  +vn 0.2223 -0.0000 0.9750
          676  +vn -0.9750 0.0000 0.2223
          677  +vn 0.9750 0.0000 -0.2223
          678  +vn -0.2364 -0.7379 0.6321
          679  +vn -0.2467 -0.7333 0.6335
          680  +vn 0.9813 -0.0054 -0.1925
          681  +vn -0.9590 -0.0248 0.2822
          682  +vn -0.2769 -0.9588 0.0631
          683  +vn -0.0137 -0.0000 0.9999
          684  +vn -0.9954 0.0592 0.0754
          685  +vn 0.9968 -0.0261 -0.0756
          686  +vn -0.2802 -0.9599 -0.0112
          687  +vn -0.1499 -0.5518 -0.8204
          688  +vn -0.9708 0.2297 0.0689
          689  +vn 0.9708 -0.2297 -0.0689
          690  +vn 0.0086 -0.0297 -0.9995
          691  +vn 0.9886 -0.1501 0.0135
          692  +vn 0.9771 -0.0341 -0.2099
          693  +vn 0.9667 0.0815 -0.2428
          694  +vn -0.9978 0.0646 -0.0136
          695  +vn 0.4871 -0.7379 0.4671
          696  +vn 0.4969 -0.7333 0.4640
          697  +vn -0.9677 -0.0054 0.2519
          698  +vn 0.9866 -0.0248 -0.1614
          699  +vn 0.2769 -0.9588 -0.0631
          700  +vn 0.4458 -0.0000 0.8951
          701  +vn 0.9297 0.0592 -0.3635
          702  +vn -0.9310 -0.0261 0.3640
          703  +vn 0.2476 -0.9599 -0.1316
          704  +vn -0.2205 -0.5518 -0.8043
          705  +vn 0.9047 0.2297 -0.3588
          706  +vn -0.9047 -0.2297 0.3588
          707  +vn -0.4410 -0.0297 -0.8970
          708  +vn -0.8850 -0.1501 0.4407
          709  +vn -0.9715 -0.0341 0.2345
          710  +vn -0.9763 0.0815 0.2003
          711  +vn 0.8933 0.0646 -0.4449
          712  +vn 0.3681 -0.5865 -0.7214
          713  +g wood_Cube.014_wood.001
          714  +usemtl wood.001
          715  +s off
          716  +f 13/9/7 9/10/7 10/11/7 14/12/7
          717  +f 14/13/8 10/14/8 12/15/8 15/16/8
          718  +f 15/17/9 12/18/9 11/19/9 16/20/9
          719  +f 16/21/10 11/22/10 9/23/10 13/24/10
          720  +f 11/25/11 12/26/11 19/27/11 20/28/11
          721  +f 10/29/11 9/30/11 17/31/11 18/32/11
          722  +f 9/30/11 11/25/11 20/28/11 17/31/11
          723  +f 12/26/11 10/29/11 18/32/11 19/27/11
          724  +f 23/33/12 24/34/12 22/35/12 21/36/12
          725  +f 25/37/13 28/38/13 32/39/13 29/40/13
          726  +f 23/41/14 21/42/14 27/43/14 28/44/14
          727  +f 22/45/15 24/46/15 25/47/15 26/48/15
          728  +f 24/49/16 23/50/16 28/51/16 25/52/16
          729  +f 21/53/17 22/54/17 26/55/17 27/56/17
          730  +f 32/57/14 31/58/14 35/59/14 36/60/14 37/61/14 38/62/14
          731  +f 27/63/13 26/64/13 30/65/13 31/66/13
          732  +f 28/38/13 27/63/13 31/66/13 32/39/13
          733  +f 26/64/13 25/37/13 29/40/13 30/65/13
          734  +f 36/67/12 35/68/12 47/69/12 48/70/12
          735  +f 30/71/15 29/72/15 39/73/15 40/74/15 33/75/15 34/76/15
          736  +f 40/77/16 37/78/16 36/79/16 33/80/16
          737  +f 31/81/17 30/82/17 34/83/17 35/84/17
          738  +f 29/85/16 32/86/16 38/87/16 39/88/16
          739  +f 39/88/16 38/87/16 42/89/16 43/90/16
          740  +f 63/91/12 62/92/12 120/93/12 121/94/12
          741  +f 37/78/16 40/77/16 44/95/16 41/96/16
          742  +f 40/77/16 39/88/16 43/90/16 44/95/16
          743  +f 38/87/16 37/78/16 41/96/16 42/89/16
          744  +f 62/97/14 66/98/14 119/99/14 120/100/14
          745  +f 66/101/13 68/102/13 122/103/13 119/104/13
          746  +f 68/105/15 63/106/15 121/107/15 122/108/15
          747  +f 45/109/12 48/70/12 131/110/12 132/111/12
          748  +f 34/112/12 33/113/12 45/109/12 46/114/12
          749  +f 33/113/12 36/67/12 48/70/12 45/109/12
          750  +f 35/68/12 34/112/12 46/114/12 47/69/12
          751  +f 52/115/18 51/116/18 50/117/18 49/118/18
          752  +f 47/119/17 46/120/17 50/121/17 51/122/17
          753  +f 48/123/14 47/124/14 51/125/14 52/126/14
          754  +f 46/127/15 45/128/15 49/129/15 50/130/15
          755  +f 48/123/14 52/126/14 133/131/14 131/132/14
          756  +f 49/129/15 45/128/15 132/133/15 134/134/15
          757  +f 52/115/19 49/118/19 134/135/19 133/136/19
          758  +f 53/137/12 54/138/12 55/139/12 56/140/12
          759  +f 53/137/12 56/140/12 143/141/12 144/142/12
          760  +f 60/143/18 59/144/18 58/145/18 57/146/18
          761  +f 79/147/17 78/148/17 58/149/17 59/150/17
          762  +f 56/151/15 71/152/15 69/153/15 70/154/15 72/155/15 60/156/15 59/157/15 79/158/15 80/159/15 55/160/15
          763  +f 78/161/15 75/162/15 57/163/15 58/164/15
          764  +f 56/151/15 143/165/15 167/166/15 168/167/15 145/168/15 60/156/15 72/155/15 73/169/15 74/170/15 71/152/15
          765  +f 76/171/15 53/172/15 144/173/15 170/174/15
          766  +f 60/143/19 57/146/19 146/175/19 145/176/19
          767  +f 44/177/15 43/178/15 64/179/15 67/180/15
          768  +f 63/181/16 68/182/16 73/183/16 74/184/16
          769  +f 41/185/13 44/186/13 67/187/13 65/188/13
          770  +f 65/188/13 67/187/13 68/102/13 66/101/13
          771  +f 42/189/14 41/190/14 65/191/14 61/192/14
          772  +f 61/192/14 65/191/14 66/98/14 62/97/14
          773  +f 43/193/12 42/194/12 61/195/12 64/196/12
          774  +f 64/196/12 61/195/12 62/92/12 63/91/12
          775  +f 68/102/13 67/187/13 70/197/13 72/198/13 73/199/13
          776  +f 64/196/12 63/91/12 74/200/12 71/201/12 69/202/12
          777  +f 67/203/17 64/204/17 69/205/17 70/206/17
          778  +f 57/163/15 75/162/15 169/207/15 146/208/15
          779  +f 75/162/15 76/171/15 170/174/15 169/207/15
          780  +f 54/209/15 53/172/15 76/171/15 77/210/15
          781  +f 78/148/20 77/211/20 83/212/20 84/213/20
          782  +f 55/214/17 54/215/17 77/211/17 80/216/17
          783  +f 80/216/17 77/211/17 78/148/17 79/147/17
          784  +f 53/137/13 54/138/13 94/217/13 93/218/13
          785  +f 76/219/21 75/220/21 81/221/21 82/222/21
          786  +f 75/223/22 78/224/22 84/225/22 81/226/22
          787  +f 87/227/23 86/228/23 85/229/23 88/230/23
          788  +f 82/222/24 81/221/24 85/231/24 86/232/24
          789  +f 88/230/23 85/229/23 91/233/23 92/234/23
          790  +f 84/213/25 83/212/25 87/235/25 88/236/25
          791  +f 89/237/26 90/238/26 92/239/26 91/240/26
          792  +f 81/241/27 84/242/27 90/243/27 89/244/27
          793  +f 85/231/28 81/221/28 89/245/28 91/246/28
          794  +f 84/213/29 88/236/29 92/247/29 90/248/29
          795  +f 94/249/30 87/227/30 86/228/30 93/250/30
          796  +f 87/235/31 83/212/31 94/251/31
          797  +f 54/215/32 94/251/32 83/212/32 77/211/32
          798  +f 53/252/33 93/253/33 82/222/33 76/219/33
          799  +f 86/232/34 93/253/34 82/222/34
          800  +f 97/254/12 95/255/12 96/256/12 98/257/12
          801  +f 99/258/13 103/259/13 106/260/13 102/261/13
          802  +f 97/262/14 102/263/14 101/264/14 95/265/14
          803  +f 96/266/15 100/267/15 99/268/15 98/269/15
          804  +f 98/270/17 99/271/17 102/272/17 97/273/17
          805  +f 95/274/16 101/275/16 100/276/16 96/277/16
          806  +f 106/278/14 112/279/14 111/280/14 110/281/14 109/282/14 105/283/14
          807  +f 101/284/13 105/285/13 104/286/13 100/287/13
          808  +f 102/261/13 106/260/13 105/285/13 101/284/13
          809  +f 100/287/13 104/286/13 103/259/13 99/258/13
          810  +f 110/288/12 126/289/12 125/290/12 109/291/12
          811  +f 104/292/15 108/293/15 107/294/15 114/295/15 113/296/15 103/297/15
          812  +f 114/298/17 107/299/17 110/300/17 111/301/17
          813  +f 105/302/16 109/303/16 108/304/16 104/305/16
          814  +f 103/306/17 113/307/17 112/308/17 106/309/17
          815  +f 113/307/17 117/310/17 116/311/17 112/308/17
          816  +f 149/312/12 121/94/12 120/93/12 148/313/12
          817  +f 111/301/17 115/314/17 118/315/17 114/298/17
          818  +f 114/298/17 118/315/17 117/310/17 113/307/17
          819  +f 112/308/17 116/311/17 115/314/17 111/301/17
          820  +f 121/316/17 122/317/17 119/318/17 120/319/17
          821  +f 148/320/14 120/100/14 119/99/14 152/321/14
          822  +f 152/322/13 119/104/13 122/103/13 154/323/13
          823  +f 154/324/15 122/108/15 121/107/15 149/325/15
          824  +f 123/326/12 132/111/12 131/110/12 126/289/12
          825  +f 108/327/12 124/328/12 123/326/12 107/329/12
          826  +f 107/329/12 123/326/12 126/289/12 110/288/12
          827  +f 109/291/12 125/290/12 124/328/12 108/327/12
          828  +f 130/330/35 127/331/35 128/332/35 129/333/35
          829  +f 125/334/16 129/335/16 128/336/16 124/337/16
          830  +f 126/338/14 130/339/14 129/340/14 125/341/14
          831  +f 124/342/15 128/343/15 127/344/15 123/345/15
          832  +f 132/346/17 134/347/17 133/348/17 131/349/17
          833  +f 126/338/14 131/132/14 133/131/14 130/339/14
          834  +f 127/344/15 134/134/15 132/133/15 123/345/15
          835  +f 130/330/36 133/136/36 134/135/36 127/331/36
          836  +f 135/350/12 138/351/12 137/352/12 136/353/12
          837  +f 135/350/12 144/142/12 143/141/12 138/351/12
          838  +f 142/354/35 139/355/35 140/356/35 141/357/35
          839  +f 165/358/16 141/359/16 140/360/16 164/361/16
          840  +f 138/362/15 137/363/15 166/364/15 165/365/15 141/366/15 142/367/15 158/368/15 156/369/15 155/370/15 157/371/15
          841  +f 164/372/15 140/373/15 139/374/15 161/375/15
          842  +f 169/376/17 146/377/17 145/378/17 168/379/17
          843  +f 138/362/15 157/371/15 160/380/15 159/381/15 158/368/15 142/367/15 145/168/15 168/167/15 167/166/15 143/165/15
          844  +f 162/382/15 170/174/15 144/173/15 135/383/15
          845  +f 142/354/36 145/176/36 146/175/36 139/355/36
          846  +f 118/384/15 153/385/15 150/386/15 117/387/15
          847  +f 149/388/17 160/389/17 159/390/17 154/391/17
          848  +f 115/392/13 151/393/13 153/394/13 118/395/13
          849  +f 151/393/13 152/322/13 154/323/13 153/394/13
          850  +f 116/396/14 147/397/14 151/398/14 115/399/14
          851  +f 147/397/14 148/320/14 152/321/14 151/398/14
          852  +f 117/400/12 150/401/12 147/402/12 116/403/12
          853  +f 150/401/12 149/312/12 148/313/12 147/402/12
          854  +f 154/323/13 159/404/13 158/405/13 156/406/13 153/394/13
          855  +f 150/401/12 155/407/12 157/408/12 160/409/12 149/312/12
          856  +f 153/410/16 156/411/16 155/412/16 150/413/16
          857  +f 139/374/15 146/208/15 169/207/15 161/375/15
          858  +f 161/375/15 169/207/15 170/174/15 162/382/15
          859  +f 144/414/17 170/415/17 167/416/17 143/417/17
          860  +f 170/415/17 169/376/17 168/379/17 167/416/17
          861  +f 136/418/15 163/419/15 162/382/15 135/383/15
          862  +f 164/361/37 174/420/37 173/421/37 163/422/37
          863  +f 137/423/16 166/424/16 163/422/16 136/425/16
          864  +f 166/424/16 165/358/16 164/361/16 163/422/16
          865  +f 135/350/13 183/426/13 184/427/13 136/353/13
          866  +f 162/428/38 172/429/38 171/430/38 161/431/38
          867  +f 161/432/39 171/433/39 174/434/39 164/435/39
          868  +f 177/436/40 178/437/40 175/438/40 176/439/40
          869  +f 172/429/41 176/440/41 175/441/41 171/430/41
          870  +f 178/437/40 182/442/40 181/443/40 175/438/40
          871  +f 174/420/42 178/444/42 177/445/42 173/421/42
          872  +f 179/446/43 181/447/43 182/448/43 180/449/43
          873  +f 171/450/44 179/451/44 180/452/44 174/453/44
          874  +f 175/441/45 181/454/45 179/455/45 171/430/45
          875  +f 174/420/46 180/456/46 182/457/46 178/444/46
          876  +f 184/458/47 183/459/47 176/439/47 177/436/47
          877  +f 177/445/48 184/460/48 173/421/48
          878  +f 136/425/49 163/422/49 173/421/49 184/460/49
          879  +f 135/461/50 162/428/50 172/429/50 183/462/50
          880  +f 176/440/51 172/429/51 183/462/51
          881  +f 16/20/52 13/9/52 14/13/52 15/17/52
          882  +f 17/31/11 20/28/11 19/27/11 18/32/11
          883  +o gold_Cube.015
          884  +v -0.273207 -0.398159 -0.360099
          885  +v -0.246248 -0.400332 -0.344577
          886  +v -0.252524 -0.415131 -0.335748
          887  +v -0.279483 -0.412958 -0.351270
          888  +v -0.192325 -0.481063 -0.444578
          889  +v -0.223545 -0.478547 -0.462554
          890  +v -0.243622 -0.399334 -0.344048
          891  +v -0.198996 -0.499335 -0.434146
          892  +v -0.250890 -0.416472 -0.333824
          893  +v -0.230216 -0.496819 -0.452121
          894  +v -0.282109 -0.413956 -0.351799
          895  +v -0.274841 -0.396818 -0.362023
          896  +v -0.244824 -0.499368 -0.220592
          897  +v -0.244824 -0.342933 -0.220592
          898  +v -0.316520 -0.499368 -0.081554
          899  +v -0.316520 -0.342933 -0.081554
          900  +v -0.383862 -0.499368 -0.292288
          901  +v -0.383862 -0.342933 -0.292288
          902  +v -0.455558 -0.499368 -0.153250
          903  +v -0.455558 -0.342933 -0.153250
          904  +v -0.290427 -0.342933 -0.206019
          905  +v -0.331093 -0.342933 -0.127157
          906  +v -0.409954 -0.342933 -0.167823
          907  +v -0.369289 -0.342933 -0.246684
          908  +v -0.290427 -0.316475 -0.206019
          909  +v -0.331093 -0.316475 -0.127157
          910  +v -0.409954 -0.316475 -0.167823
          911  +v -0.369289 -0.316475 -0.246684
          912  +v -0.316540 -0.316475 -0.197674
          913  +v -0.339437 -0.316475 -0.153270
          914  +v -0.383842 -0.316475 -0.176167
          915  +v -0.360945 -0.316475 -0.220572
          916  +v -0.316540 -0.332319 -0.197674
          917  +v -0.339437 -0.332319 -0.153270
          918  +v -0.383842 -0.332319 -0.176167
          919  +v -0.360945 -0.332319 -0.220572
          920  +v -0.316540 -0.425754 -0.197674
          921  +v -0.339437 -0.425754 -0.153270
          922  +v -0.383842 -0.425754 -0.176167
          923  +v -0.360945 -0.425754 -0.220572
          924  +vt 0.544569 0.575783
          925  +vt 0.544569 0.424217
          926  +vt 0.551613 0.412241
          927  +vt 0.551613 0.587759
          928  +vt 0.455431 0.424217
          929  +vt 0.455431 0.575783
          930  +vt 0.448387 0.587759
          931  +vt 0.448387 0.412241
          932  +vt 0.576208 0.000000
          933  +vt 0.576208 1.000000
          934  +vt 0.423792 1.000000
          935  +vt 0.423792 0.000000
          936  +vt 0.629579 0.000000
          937  +vt 0.629579 1.000000
          938  +vt 0.370421 1.000000
          939  +vt 0.370421 0.000000
          940  +vt 0.423792 0.000000
          941  +vt 0.423792 1.000000
          942  +vt 0.576208 1.000000
          943  +vt 0.576208 0.000000
          944  +vt 0.370421 0.000000
          945  +vt 0.370421 1.000000
          946  +vt 0.629579 1.000000
          947  +vt 0.629579 0.000000
          948  +vt 0.393131 0.671643
          949  +vt 0.606869 0.678412
          950  +vt 0.606869 0.328357
          951  +vt 0.393131 0.321588
          952  +vt 0.000000 0.000000
          953  +vt 0.000000 1.000000
          954  +vt 1.000000 1.000000
          955  +vt 1.000000 0.000000
          956  +vt 0.000000 0.000000
          957  +vt 0.000000 1.000000
          958  +vt 1.000000 1.000000
          959  +vt 1.000000 0.000000
          960  +vt 0.000000 1.000000
          961  +vt 0.000000 0.000000
          962  +vt 1.000000 0.000000
          963  +vt 1.000000 1.000000
          964  +vt 0.072331 0.927669
          965  +vt 0.927669 0.927669
          966  +vt 0.927669 0.072331
          967  +vt 0.072331 0.072331
          968  +vt 0.000000 0.000000
          969  +vt 0.216403 0.216403
          970  +vt 0.216403 0.783597
          971  +vt 0.000000 0.350907
          972  +vt 1.000000 0.350907
          973  +vt 1.000000 0.649093
          974  +vt 0.000000 0.649093
          975  +vt 1.000000 0.000000
          976  +vt 0.783597 0.216403
          977  +vt 0.783597 0.783597
          978  +vt 1.000000 0.000000
          979  +vt 1.000000 1.000000
          980  +vt 0.781535 0.781535
          981  +vt 0.781535 0.218465
          982  +vt 1.000000 0.350907
          983  +vt 0.000000 0.350907
          984  +vt 0.000000 0.649093
          985  +vt 1.000000 0.649093
          986  +vt 0.000000 0.350907
          987  +vt 0.000000 0.649093
          988  +vt 1.000000 0.350907
          989  +vt 1.000000 0.649093
          990  +vt 1.000000 0.658562
          991  +vt 0.000000 0.658562
          992  +vt 0.000000 0.341438
          993  +vt 1.000000 0.341438
          994  +vt 0.000000 1.000000
          995  +vt 0.000000 0.000000
          996  +vt 0.218465 0.218465
          997  +vt 0.218465 0.781535
          998  +vt 1.000000 0.658562
          999  +vt 1.000000 0.341438
         1000  +vt 1.000000 0.658562
         1001  +vt 0.000000 0.658562
         1002  +vt 0.000000 0.341438
         1003  +vt 1.000000 0.341438
         1004  +vt 0.000000 0.658562
         1005  +vt 0.000000 0.341438
         1006  +vt 0.000000 0.341438
         1007  +vt 1.000000 0.341438
         1008  +vt 0.000000 0.341438
         1009  +vt 0.000000 0.341438
         1010  +vt 1.000000 0.341438
         1011  +vt 1.000000 0.341438
         1012  +vn -0.3681 0.5865 0.7214
         1013  +vn -0.3681 0.5865 0.7215
         1014  +vn -0.8690 0.0552 -0.4917
         1015  +vn -0.3443 -0.8035 0.4856
         1016  +vn 0.8690 -0.0552 0.4917
         1017  +vn 0.3422 0.8069 -0.4814
         1018  +vn 0.3793 -0.5593 -0.7371
         1019  +vn 0.8888 0.0000 0.4583
         1020  +vn -0.4583 -0.0000 0.8888
         1021  +vn -0.8888 -0.0000 -0.4583
         1022  +vn 0.4583 0.0000 -0.8888
         1023  +vn 0.0000 -1.0000 0.0000
         1024  +vn 0.0000 1.0000 0.0000
         1025  +g gold_Cube.015_gold
         1026  +usemtl gold
         1027  +s off
         1028  +f 187/463/53 188/464/53 195/465/53 193/466/53
         1029  +f 185/467/54 186/468/54 191/469/54 196/470/54
         1030  +f 188/464/53 185/467/53 196/470/53 195/465/53
         1031  +f 194/471/55 195/472/55 196/473/55 190/474/55
         1032  +f 192/475/56 193/476/56 195/477/56 194/478/56
         1033  +f 189/479/57 191/480/57 193/481/57 192/482/57
         1034  +f 190/483/58 196/484/58 191/485/58 189/486/58
         1035  +f 186/468/53 187/463/53 193/466/53 191/469/53
         1036  +f 189/487/59 192/488/59 194/489/59 190/490/59
         1037  +f 197/491/60 198/492/60 200/493/60 199/494/60
         1038  +f 199/495/61 200/496/61 204/497/61 203/498/61
         1039  +f 203/498/62 204/497/62 202/499/62 201/500/62
         1040  +f 201/501/63 202/502/63 198/492/63 197/491/63
         1041  +f 199/503/64 203/504/64 201/505/64 197/506/64
         1042  +f 200/496/65 198/507/65 205/508/65 206/509/65
         1043  +f 205/510/63 208/511/63 212/512/63 209/513/63
         1044  +f 198/507/65 202/514/65 208/515/65 205/508/65
         1045  +f 204/497/65 200/496/65 206/509/65 207/516/65
         1046  +f 202/514/65 204/497/65 207/516/65 208/515/65
         1047  +f 212/517/65 211/518/65 215/519/65 216/520/65
         1048  +f 207/521/61 206/522/61 210/523/61 211/524/61
         1049  +f 208/525/62 207/521/62 211/524/62 212/526/62
         1050  +f 206/527/60 205/510/60 209/513/60 210/528/60
         1051  +f 214/529/62 213/530/62 217/531/62 218/532/62
         1052  +f 210/533/65 209/534/65 213/535/65 214/536/65
         1053  +f 209/534/65 212/517/65 216/520/65 213/535/65
         1054  +f 211/518/65 210/533/65 214/536/65 215/519/65
         1055  +f 213/530/61 216/537/61 220/538/61 217/531/61
         1056  +f 215/539/63 214/540/63 218/541/63 219/542/63
         1057  +f 216/543/60 215/539/60 219/542/60 220/544/60
         1058  +f 219/542/63 218/541/63 222/545/63 223/546/63
         1059  +f 220/544/60 219/542/60 223/546/60 224/547/60
         1060  +f 218/532/62 217/531/62 221/548/62 222/549/62
         1061  +f 217/531/61 220/538/61 224/550/61 221/548/61
         1062  +f 221/548/65 224/550/65 223/546/65 222/545/65
         1063  +f 188/464/53 187/463/53 186/468/53 185/467/53
         1064  +o steel_Cube.016
         1065  +v -0.345859 -0.280020 -0.208026
         1066  +v -0.326953 -0.281543 -0.197141
         1067  +v -0.331354 -0.291921 -0.190950
         1068  +v -0.350260 -0.290398 -0.201835
         1069  +v -0.353622 -0.267651 -0.192812
         1070  +v -0.334716 -0.269174 -0.181927
         1071  +v -0.339118 -0.279552 -0.175735
         1072  +v -0.358023 -0.278029 -0.186620
         1073  +v -0.354893 -0.270648 -0.191024
         1074  +v -0.335988 -0.272171 -0.180138
         1075  +v -0.337846 -0.276555 -0.177523
         1076  +v -0.356752 -0.275031 -0.188409
         1077  +v -0.361055 -0.257837 -0.173929
         1078  +v -0.346108 -0.259041 -0.165323
         1079  +v -0.347967 -0.263424 -0.162708
         1080  +v -0.362914 -0.262220 -0.171314
         1081  +vt 0.753081 -0.031154
         1082  +vt 0.246919 -0.031154
         1083  +vt 0.246919 0.456970
         1084  +vt 0.753081 0.456970
         1085  +vt 0.351158 0.246919
         1086  +vt 0.648842 0.246919
         1087  +vt 0.562862 0.246919
         1088  +vt 0.437138 0.246919
         1089  +vt 0.351158 -0.031154
         1090  +vt 0.648842 -0.031154
         1091  +vt 0.648842 0.456970
         1092  +vt 0.351158 0.456970
         1093  +vt 0.648842 -0.031154
         1094  +vt 0.351158 -0.031154
         1095  +vt 0.351158 0.456970
         1096  +vt 0.648842 0.456970
         1097  +vt 0.246919 -0.031154
         1098  +vt 0.753081 -0.031154
         1099  +vt 0.753081 0.456970
         1100  +vt 0.246919 0.456970
         1101  +vt 0.246919 0.456970
         1102  +vt 0.753081 0.456970
         1103  +vt 0.700094 0.968846
         1104  +vt 0.299906 0.968846
         1105  +vt 0.648842 0.753081
         1106  +vt 0.351158 0.753081
         1107  +vt 0.437138 0.753081
         1108  +vt 0.562862 0.753081
         1109  +vt 0.562862 0.700094
         1110  +vt 0.437138 0.700094
         1111  +vt 0.437138 0.299906
         1112  +vt 0.562862 0.299906
         1113  +vt 0.753081 0.456970
         1114  +vt 0.246919 0.456970
         1115  +vt 0.299906 0.968846
         1116  +vt 0.700094 0.968846
         1117  +vt 0.437138 0.456970
         1118  +vt 0.562862 0.456970
         1119  +vt 0.562862 0.968846
         1120  +vt 0.437138 0.968846
         1121  +vt 0.562862 0.456970
         1122  +vt 0.437138 0.456970
         1123  +vt 0.437138 0.968846
         1124  +vt 0.562862 0.968846
         1125  +vn 0.3422 0.8069 -0.4814
         1126  +vn 0.0000 0.7071 -0.7071
         1127  +vn -0.8645 0.0697 -0.4978
         1128  +vn 0.8645 -0.0697 0.4978
         1129  +vn -0.3422 -0.8069 0.4814
         1130  +vn 0.0000 -1.0000 0.0000
         1131  +vn -0.3681 0.5865 0.7214
         1132  +vn -0.8978 0.1297 -0.4208
         1133  +vn 0.8220 -0.0089 0.5694
         1134  +vn 0.3681 -0.5865 -0.7214
         1135  +g steel_Cube.016_steel
         1136  +usemtl steel
         1137  +s off
         1138  +f 226/551/66 225/552/66 229/553/66 230/554/66
         1139  +f 229/555/67 232/556/67 236/557/67 233/558/67
         1140  +f 225/559/68 228/560/68 232/561/68 229/562/68
         1141  +f 227/563/69 226/564/69 230/565/69 231/566/69
         1142  +f 228/567/70 227/568/70 231/569/70 232/570/70
         1143  +f 236/571/70 235/572/70 239/573/70 240/574/70
         1144  +f 231/575/71 230/576/71 234/577/71 235/578/71
         1145  +f 232/556/72 231/575/72 235/578/72 236/557/72
         1146  +f 230/576/72 229/555/72 233/558/72 234/577/72
         1147  +f 239/579/72 238/580/72 237/581/72 240/582/72
         1148  +f 234/583/66 233/584/66 237/585/66 238/586/66
         1149  +f 233/587/73 236/588/73 240/589/73 237/590/73
         1150  +f 235/591/74 234/592/74 238/593/74 239/594/74
         1151  +f 225/559/75 226/564/75 227/568/75 228/560/75
         1152  +o book_Cube.017
         1153  +v 0.433852 -0.378962 -0.407961
         1154  +v 0.566656 0.075573 0.174455
         1155  +v 0.421077 -0.361852 -0.418401
         1156  +v 0.553881 0.092683 0.164014
         1157  +v 0.408630 -0.352919 -0.388531
         1158  +v 0.532099 0.069664 0.152943
         1159  +v -0.197414 -0.378962 -0.264017
         1160  +v -0.064609 0.075573 0.318398
         1161  +v 0.135629 -0.481882 -0.259637
         1162  +v 0.268434 -0.027346 0.322778
         1163  +v -0.190427 -0.361852 -0.278963
         1164  +v -0.057623 0.092683 0.303452
         1165  +v 0.265234 -0.008431 0.308745
         1166  +v 0.132429 -0.462966 -0.273670
         1167  +v -0.166263 -0.352919 -0.257442
         1168  +v -0.042794 0.069664 0.284032
         1169  +v 0.260566 -0.024407 0.288275
         1170  +v 0.137097 -0.446990 -0.253199
         1171  +v -0.022239 -0.497668 -0.023755
         1172  +v -0.022239 -0.409943 -0.023755
         1173  +v -0.108186 -0.497668 0.490735
         1174  +v -0.108186 -0.409943 0.490735
         1175  +v -0.407411 -0.497668 -0.088099
         1176  +v -0.407411 -0.409943 -0.088099
         1177  +v -0.493358 -0.497668 0.426391
         1178  +v -0.493358 -0.409943 0.426391
         1179  +v -0.022239 -0.475201 -0.023755
         1180  +v -0.022239 -0.432410 -0.023755
         1181  +v -0.108186 -0.432410 0.490735
         1182  +v -0.108186 -0.475201 0.490735
         1183  +v -0.493358 -0.432410 0.426391
         1184  +v -0.493358 -0.475201 0.426391
         1185  +v -0.407411 -0.432410 -0.088099
         1186  +v -0.407411 -0.475201 -0.088099
         1187  +v -0.130727 -0.497668 0.486632
         1188  +v -0.130727 -0.409943 0.486632
         1189  +v -0.044780 -0.497668 -0.027858
         1190  +v -0.044780 -0.409943 -0.027858
         1191  +v -0.044780 -0.475201 -0.027858
         1192  +v -0.044780 -0.432410 -0.027858
         1193  +v -0.130727 -0.475201 0.486632
         1194  +v -0.130727 -0.432410 0.486632
         1195  +v -0.475525 -0.432410 0.408332
         1196  +v -0.475525 -0.475201 0.408332
         1197  +v -0.396412 -0.432410 -0.065251
         1198  +v -0.396412 -0.475201 -0.065251
         1199  +v -0.127313 -0.475201 0.466191
         1200  +v -0.127313 -0.432410 0.466191
         1201  +v -0.048199 -0.475201 -0.007391
         1202  +v -0.048199 -0.432410 -0.007391
         1203  +v -0.065352 -0.409777 -0.061571
         1204  +v -0.065352 -0.345480 -0.061571
         1205  +v -0.059758 -0.409777 0.460018
         1206  +v -0.059758 -0.345480 0.460018
         1207  +v -0.455839 -0.409777 -0.057382
         1208  +v -0.455839 -0.345480 -0.057382
         1209  +v -0.450245 -0.409776 0.464207
         1210  +v -0.450245 -0.345480 0.464207
         1211  +v -0.065352 -0.393309 -0.061571
         1212  +v -0.065352 -0.361947 -0.061571
         1213  +v -0.059758 -0.361947 0.460018
         1214  +v -0.059758 -0.393309 0.460018
         1215  +v -0.450245 -0.361947 0.464207
         1216  +v -0.450245 -0.393309 0.464207
         1217  +v -0.455839 -0.361947 -0.057382
         1218  +v -0.455839 -0.393309 -0.057382
         1219  +v -0.082669 -0.409777 0.459931
         1220  +v -0.082669 -0.345480 0.459931
         1221  +v -0.088264 -0.409777 -0.061658
         1222  +v -0.088264 -0.345480 -0.061658
         1223  +v -0.088264 -0.393309 -0.061658
         1224  +v -0.088264 -0.361947 -0.061658
         1225  +v -0.082669 -0.393309 0.459931
         1226  +v -0.082669 -0.361947 0.459931
         1227  +v -0.435854 -0.361947 0.443301
         1228  +v -0.435854 -0.393309 0.443301
         1229  +v -0.441004 -0.361947 -0.036817
         1230  +v -0.441004 -0.393309 -0.036817
         1231  +v -0.082892 -0.393309 0.439209
         1232  +v -0.082892 -0.361947 0.439209
         1233  +v -0.088041 -0.393309 -0.040909
         1234  +v -0.088041 -0.361947 -0.040909
         1235  +vt 0.290580 0.000000
         1236  +vt 0.708362 0.000000
         1237  +vt 0.708362 0.035148
         1238  +vt 0.315593 0.035148
         1239  +vt 0.708362 1.000000
         1240  +vt 0.290580 1.000000
         1241  +vt 0.315593 0.964852
         1242  +vt 0.708362 0.964852
         1243  +vt 0.277079 1.000000
         1244  +vt 0.708362 1.000000
         1245  +vt 0.708362 0.000000
         1246  +vt 0.277079 0.000000
         1247  +vt 0.708362 0.395063
         1248  +vt 0.708362 0.426728
         1249  +vt 0.290580 0.595994
         1250  +vt 0.277079 0.567352
         1251  +vt 0.277079 0.567352
         1252  +vt 0.290580 0.595994
         1253  +vt 0.708362 0.426728
         1254  +vt 0.708362 0.395063
         1255  +vt 0.000000 0.567352
         1256  +vt 0.000000 0.595994
         1257  +vt 1.000000 0.595994
         1258  +vt 1.000000 0.567352
         1259  +vt 0.290580 0.000000
         1260  +vt 0.315593 0.035148
         1261  +vt 0.315593 0.964852
         1262  +vt 0.290580 1.000000
         1263  +vt 0.277079 1.000000
         1264  +vt 0.277079 0.000000
         1265  +vt 0.277079 0.567352
         1266  +vt 0.290580 0.595994
         1267  +vt 0.277079 0.567352
         1268  +vt 0.290580 0.595994
         1269  +vt 0.000000 0.567352
         1270  +vt 1.000000 0.567352
         1271  +vt 1.000000 0.595994
         1272  +vt 0.000000 0.595994
         1273  +vt -0.498724 0.540990
         1274  +vt -0.498724 0.584036
         1275  +vt 0.500638 0.584036
         1276  +vt 0.500638 0.540990
         1277  +vt 0.500000 0.540990
         1278  +vt 0.500000 0.584036
         1279  +vt 1.204279 0.584036
         1280  +vt 1.204279 0.540990
         1281  +vt 0.500638 0.540990
         1282  +vt 0.500638 0.584036
         1283  +vt -0.498724 0.584036
         1284  +vt -0.498724 0.540990
         1285  +vt 0.500000 0.540990
         1286  +vt 0.500000 0.584036
         1287  +vt 0.456108 0.584036
         1288  +vt 0.456108 0.540990
         1289  +vt 0.500000 0.500000
         1290  +vt 1.204279 0.500638
         1291  +vt 1.204279 -0.498724
         1292  +vt 0.500000 -0.499362
         1293  +vt 0.500000 0.500000
         1294  +vt 0.456108 0.500638
         1295  +vt 0.456108 -0.498724
         1296  +vt 0.500000 -0.499362
         1297  +vt 0.500000 0.415964
         1298  +vt 0.500000 0.459010
         1299  +vt 0.456108 0.459010
         1300  +vt 0.456108 0.415964
         1301  +vt 0.500638 0.415964
         1302  +vt 0.500638 0.459010
         1303  +vt -0.498724 0.459010
         1304  +vt -0.498724 0.415964
         1305  +vt 1.204279 -0.498724
         1306  +vt 1.204279 0.500638
         1307  +vt 1.176281 0.460883
         1308  +vt 1.176281 -0.459020
         1309  +vt 0.500000 0.415964
         1310  +vt 0.500000 0.459010
         1311  +vt 1.204279 0.459010
         1312  +vt 1.204279 0.415964
         1313  +vt 1.204279 -0.498724
         1314  +vt 0.500000 -0.499362
         1315  +vt 0.500000 -0.459607
         1316  +vt 1.176281 -0.459020
         1317  +vt -0.498724 0.415964
         1318  +vt -0.498724 0.459010
         1319  +vt 0.500638 0.459010
         1320  +vt 0.500638 0.415964
         1321  +vt 0.456108 0.459010
         1322  +vt 0.456108 0.540990
         1323  +vt 0.456108 0.415964
         1324  +vt 0.500000 0.500000
         1325  +vt 0.500000 0.460296
         1326  +vt 1.204279 0.415964
         1327  +vt 1.204279 0.459010
         1328  +vt 1.204279 0.500638
         1329  +vt 1.204279 -0.498724
         1330  +vt 0.456108 0.500638
         1331  +vt 0.456108 -0.498724
         1332  +vt 1.204279 0.540990
         1333  +vt 1.204279 0.584036
         1334  +vt 0.456108 0.584036
         1335  +vt -0.499362 0.540990
         1336  +vt -0.499362 0.459010
         1337  +vt -0.459607 0.459010
         1338  +vt -0.459607 0.540990
         1339  +vt 0.460296 0.540990
         1340  +vt 0.460296 0.459010
         1341  +vt 0.500000 0.500000
         1342  +vt 1.204279 0.500638
         1343  +vt 1.176281 0.460883
         1344  +vt 0.500000 0.460296
         1345  +vt 0.500000 -0.499362
         1346  +vt 0.500000 -0.459607
         1347  +vt -0.498724 0.540990
         1348  +vt -0.498724 0.584036
         1349  +vt 0.500638 0.584036
         1350  +vt 0.500638 0.540990
         1351  +vt 0.500000 0.540990
         1352  +vt 0.500000 0.584036
         1353  +vt 1.204279 0.584036
         1354  +vt 1.204279 0.540990
         1355  +vt 0.500638 0.540990
         1356  +vt 0.500638 0.584036
         1357  +vt -0.498724 0.584036
         1358  +vt -0.498724 0.540990
         1359  +vt 0.500000 0.540990
         1360  +vt 0.500000 0.584036
         1361  +vt 0.456108 0.584036
         1362  +vt 0.456108 0.540990
         1363  +vt 0.500000 0.500000
         1364  +vt 1.204279 0.500638
         1365  +vt 1.204279 -0.498724
         1366  +vt 0.500000 -0.499362
         1367  +vt 0.500000 0.500000
         1368  +vt 0.456108 0.500638
         1369  +vt 0.456108 -0.498724
         1370  +vt 0.500000 -0.499362
         1371  +vt 0.500000 0.415964
         1372  +vt 0.500000 0.459010
         1373  +vt 0.456108 0.459010
         1374  +vt 0.456108 0.415964
         1375  +vt 0.500638 0.415964
         1376  +vt 0.500638 0.459010
         1377  +vt -0.498724 0.459010
         1378  +vt -0.498724 0.415964
         1379  +vt 1.204279 -0.498724
         1380  +vt 1.204279 0.500638
         1381  +vt 1.176281 0.460883
         1382  +vt 1.176281 -0.459020
         1383  +vt 0.500000 0.415964
         1384  +vt 0.500000 0.459010
         1385  +vt 1.204279 0.459010
         1386  +vt 1.204279 0.415964
         1387  +vt 1.204279 -0.498724
         1388  +vt 0.500000 -0.499362
         1389  +vt 0.500000 -0.459607
         1390  +vt 1.176281 -0.459020
         1391  +vt -0.498724 0.415964
         1392  +vt -0.498724 0.459010
         1393  +vt 0.500638 0.459010
         1394  +vt 0.500638 0.415964
         1395  +vt 0.456108 0.459010
         1396  +vt 0.456108 0.540990
         1397  +vt 0.456108 0.415964
         1398  +vt 0.500000 0.500000
         1399  +vt 0.500000 0.460296
         1400  +vt 1.204279 0.415964
         1401  +vt 1.204279 0.459010
         1402  +vt 1.204279 0.500638
         1403  +vt 1.204279 -0.498724
         1404  +vt 0.456108 0.500638
         1405  +vt 0.456108 -0.498724
         1406  +vt 1.204279 0.540990
         1407  +vt 1.204279 0.584036
         1408  +vt 0.456108 0.584036
         1409  +vt -0.499362 0.540990
         1410  +vt -0.499362 0.459010
         1411  +vt -0.459607 0.459010
         1412  +vt -0.459607 0.540990
         1413  +vt 0.460296 0.540990
         1414  +vt 0.460296 0.459010
         1415  +vt 0.500000 0.500000
         1416  +vt 1.204279 0.500638
         1417  +vt 1.176281 0.460883
         1418  +vt 0.500000 0.460296
         1419  +vt 0.500000 -0.499362
         1420  +vt 0.500000 -0.459607
         1421  +vn -0.4853 0.7515 -0.4469
         1422  +vn -0.4932 0.7243 -0.4818
         1423  +vn 0.4867 -0.7390 0.4658
         1424  +vn -0.1769 -0.6055 -0.7759
         1425  +vn 0.1769 0.6055 0.7759
         1426  +vn 0.8245 0.3393 -0.4528
         1427  +vn -0.5375 0.7199 -0.4392
         1428  +vn 0.2436 0.7516 -0.6131
         1429  +vn 0.2356 0.7243 -0.6480
         1430  +vn -0.2367 -0.7390 0.6307
         1431  +vn 0.2379 0.7387 -0.6307
         1432  +vn -0.9393 0.3393 -0.0506
         1433  +vn 0.2939 0.7199 -0.6288
         1434  +vn -0.4878 0.7387 -0.4652
         1435  +vn 0.9863 0.0000 0.1648
         1436  +vn -0.1639 -0.0000 0.9865
         1437  +vn -0.9863 -0.0000 -0.1648
         1438  +vn 0.1791 0.0000 -0.9838
         1439  +vn -0.0000 -1.0000 -0.0000
         1440  +vn -0.0000 1.0000 0.0000
         1441  +vn -0.1791 0.0000 0.9838
         1442  +vn 0.1639 0.0000 -0.9865
         1443  +vn 0.9999 -0.0000 -0.0107
         1444  +vn 0.0116 -0.0000 0.9999
         1445  +vn -0.9999 0.0000 0.0107
         1446  +vn 0.0038 0.0000 -1.0000
         1447  +vn -0.0038 -0.0000 1.0000
         1448  +vn -0.0116 -0.0000 -0.9999
         1449  +g book_Cube.017_book
         1450  +usemtl book
         1451  +s off
         1452  +f 243/595/76 254/596/76 258/597/76 245/598/76
         1453  +f 253/599/77 244/600/77 246/601/77 257/602/77
         1454  +f 242/603/78 250/604/78 249/605/78 241/606/78
         1455  +f 249/607/79 254/608/79 243/609/79 241/610/79
         1456  +f 242/611/80 244/612/80 253/613/80 250/614/80
         1457  +f 241/615/81 243/616/81 244/617/81 242/618/81
         1458  +f 244/600/82 243/595/82 245/598/82 246/601/82
         1459  +f 251/619/83 255/620/83 258/597/83 254/596/83
         1460  +f 253/599/84 257/602/84 256/621/84 252/622/84
         1461  +f 248/623/85 247/624/85 249/605/85 250/604/85
         1462  +f 249/607/79 247/625/79 251/626/79 254/608/79
         1463  +f 257/602/86 258/597/86 255/620/86 256/621/86
         1464  +f 248/627/80 250/614/80 253/613/80 252/628/80
         1465  +f 247/629/87 248/630/87 252/631/87 251/632/87
         1466  +f 252/622/88 256/621/88 255/620/88 251/619/88
         1467  +f 258/597/89 257/602/89 246/601/89 245/598/89
         1468  +f 268/633/90 260/634/90 262/635/90 269/636/90
         1469  +f 282/637/91 276/638/91 266/639/91 271/640/91
         1470  +f 271/641/92 266/642/92 264/643/92 273/644/92
         1471  +f 280/645/93 278/646/93 260/647/93 268/648/93
         1472  +f 275/649/94 265/650/94 263/651/94 277/652/94
         1473  +f 276/653/95 262/654/95 260/655/95 278/656/95
         1474  +f 277/657/93 279/658/93 267/659/93 259/660/93
         1475  +f 279/658/93 280/645/93 268/648/93 267/659/93
         1476  +f 265/661/92 272/662/92 274/663/92 263/664/92
         1477  +f 274/665/95 272/666/95 284/667/95 286/668/95
         1478  +f 275/669/91 281/670/91 272/671/91 265/672/91
         1479  +f 273/673/94 280/674/94 290/675/94 285/676/94
         1480  +f 259/677/90 267/678/90 270/679/90 261/680/90
         1481  +f 267/678/90 268/633/90 269/636/90 270/679/90
         1482  +f 270/681/96 269/682/96 282/637/96 281/670/96
         1483  +f 261/683/96 270/681/96 281/670/96 275/669/96
         1484  +f 272/666/95 281/684/95 287/685/95 284/667/95
         1485  +f 263/686/97 274/687/97 279/658/97 277/657/97
         1486  +f 266/688/95 276/653/95 278/656/95 264/689/95
         1487  +f 261/690/94 275/649/94 277/652/94 259/691/94
         1488  +f 273/692/97 264/693/97 278/646/97 280/645/97
         1489  +f 269/682/96 262/694/96 276/638/96 282/637/96
         1490  +f 280/695/92 279/696/92 289/697/92 290/698/92
         1491  +f 281/670/92 282/637/92 288/699/92 287/700/92
         1492  +f 282/701/94 271/702/94 283/703/94 288/704/94
         1493  +f 271/702/94 273/673/94 285/676/94 283/703/94
         1494  +f 279/705/95 274/665/95 286/668/95 289/706/95
         1495  +f 300/707/98 292/708/98 294/709/98 301/710/98
         1496  +f 314/711/99 308/712/99 298/713/99 303/714/99
         1497  +f 303/715/100 298/716/100 296/717/100 305/718/100
         1498  +f 312/719/101 310/720/101 292/721/101 300/722/101
         1499  +f 307/723/94 297/724/94 295/725/94 309/726/94
         1500  +f 308/727/95 294/728/95 292/729/95 310/730/95
         1501  +f 309/731/101 311/732/101 299/733/101 291/734/101
         1502  +f 311/732/101 312/719/101 300/722/101 299/733/101
         1503  +f 297/735/100 304/736/100 306/737/100 295/738/100
         1504  +f 306/739/95 304/740/95 316/741/95 318/742/95
         1505  +f 307/743/99 313/744/99 304/745/99 297/746/99
         1506  +f 305/747/94 312/748/94 322/749/94 317/750/94
         1507  +f 291/751/98 299/752/98 302/753/98 293/754/98
         1508  +f 299/752/98 300/707/98 301/710/98 302/753/98
         1509  +f 302/755/102 301/756/102 314/711/102 313/744/102
         1510  +f 293/757/102 302/755/102 313/744/102 307/743/102
         1511  +f 304/740/95 313/758/95 319/759/95 316/741/95
         1512  +f 295/760/103 306/761/103 311/732/103 309/731/103
         1513  +f 298/762/95 308/727/95 310/730/95 296/763/95
         1514  +f 293/764/94 307/723/94 309/726/94 291/765/94
         1515  +f 305/766/103 296/767/103 310/720/103 312/719/103
         1516  +f 301/756/102 294/768/102 308/712/102 314/711/102
         1517  +f 312/769/100 311/770/100 321/771/100 322/772/100
         1518  +f 313/744/100 314/711/100 320/773/100 319/774/100
         1519  +f 314/775/94 303/776/94 315/777/94 320/778/94
         1520  +f 303/776/94 305/747/94 317/750/94 315/777/94
         1521  +f 311/779/95 306/739/95 318/742/95 321/780/95
         1522  +f 317/750/94 322/749/94 320/778/94 315/777/94
         1523  +f 318/742/95 316/741/95 319/759/95 321/780/95
         1524  +f 319/759/100 320/778/100 322/772/100 321/780/100
         1525  +f 287/700/92 288/699/92 290/698/92 289/697/92
         1526  +f 286/668/95 284/667/95 287/700/95 289/706/95
         1527  +f 285/676/94 290/675/94 288/699/94 283/703/94
         1528  +o paper_Cube.018
         1529  +v 0.408630 -0.351585 -0.388531
         1530  +v 0.394118 -0.324203 -0.406592
         1531  +v 0.517587 0.098380 0.134882
         1532  +v 0.532099 0.070998 0.152943
         1533  +v -0.166263 -0.351585 -0.257442
         1534  +v -0.161014 -0.324203 -0.280009
         1535  +v -0.037545 0.098380 0.261465
         1536  +v 0.255629 0.006115 0.266622
         1537  +v 0.132160 -0.416469 -0.274852
         1538  +v -0.042794 0.070998 0.284032
         1539  +v 0.260566 -0.023072 0.288275
         1540  +v 0.137097 -0.445656 -0.253199
         1541  +v -0.475525 -0.432410 0.408332
         1542  +v -0.475525 -0.475201 0.408332
         1543  +v -0.396412 -0.432410 -0.065251
         1544  +v -0.396412 -0.475201 -0.065251
         1545  +v -0.127313 -0.475201 0.466191
         1546  +v -0.127313 -0.432410 0.466191
         1547  +v -0.048199 -0.475201 -0.007391
         1548  +v -0.048199 -0.432410 -0.007391
         1549  +v -0.435854 -0.361947 0.443301
         1550  +v -0.435854 -0.393309 0.443301
         1551  +v -0.441004 -0.361947 -0.036817
         1552  +v -0.441004 -0.393309 -0.036817
         1553  +v -0.082892 -0.393309 0.439209
         1554  +v -0.082892 -0.361947 0.439209
         1555  +v -0.088041 -0.393309 -0.040909
         1556  +v -0.088041 -0.361947 -0.040909
         1557  +vt 0.000000 0.554134
         1558  +vt 0.000000 0.603438
         1559  +vt 1.000000 0.603438
         1560  +vt 1.000000 0.554134
         1561  +vt 0.284410 0.554134
         1562  +vt 0.298932 0.603438
         1563  +vt 0.706877 0.437305
         1564  +vt 0.706877 0.384751
         1565  +vt 0.706877 0.384751
         1566  +vt 0.706877 0.437305
         1567  +vt 0.298932 0.603438
         1568  +vt 0.284410 0.554134
         1569  +vt 0.298932 0.000000
         1570  +vt 0.706877 0.000000
         1571  +vt 0.706877 1.000000
         1572  +vt 0.298932 1.000000
         1573  +vt 0.000000 0.554134
         1574  +vt 1.000000 0.554134
         1575  +vt 1.000000 0.603438
         1576  +vt 0.000000 0.603438
         1577  +vt 0.284410 0.554134
         1578  +vt 0.298932 0.603438
         1579  +vt 1.000000 0.384751
         1580  +vt 0.000000 0.384751
         1581  +vt 0.000000 0.437305
         1582  +vt 1.000000 0.437305
         1583  +vt 0.284410 0.554134
         1584  +vt 0.298932 0.603438
         1585  +vt 0.298932 0.000000
         1586  +vt 0.298932 1.000000
         1587  +vt 0.460883 0.459010
         1588  +vt 0.460883 0.540990
         1589  +vt -0.459020 0.540990
         1590  +vt -0.459020 0.459010
         1591  +vt 0.500000 0.459010
         1592  +vt 0.500000 0.540990
         1593  +vt 1.176281 0.540990
         1594  +vt 1.176281 0.459010
         1595  +vt 1.176281 0.459010
         1596  +vt 1.176281 0.540990
         1597  +vt 0.500000 0.540990
         1598  +vt 0.500000 0.459010
         1599  +vt 0.460883 0.459010
         1600  +vt 0.460883 0.540990
         1601  +vt -0.459020 0.540990
         1602  +vt -0.459020 0.459010
         1603  +vt 0.500000 0.459010
         1604  +vt 0.500000 0.540990
         1605  +vt 1.176281 0.540990
         1606  +vt 1.176281 0.459010
         1607  +vt 1.176281 0.459010
         1608  +vt 1.176281 0.540990
         1609  +vt 0.500000 0.540990
         1610  +vt 0.500000 0.459010
         1611  +vt 0.000000 0.000000
         1612  +vt 0.000000 0.000000
         1613  +vt 0.000000 0.000000
         1614  +vt 0.000000 0.000000
         1615  +vn 0.8972 0.2248 -0.3801
         1616  +vn 0.1769 0.6055 0.7759
         1617  +vn -0.1769 -0.6055 -0.7759
         1618  +vn -0.4924 0.7370 -0.4629
         1619  +vn -0.9733 0.2248 0.0465
         1620  +vn 0.9750 0.0000 -0.2223
         1621  +vn 0.2430 0.7370 -0.6306
         1622  +vn -0.9863 0.0000 -0.1648
         1623  +vn -0.1639 0.0000 0.9865
         1624  +vn 0.1639 -0.0000 -0.9865
         1625  +vn -0.9999 -0.0000 0.0107
         1626  +vn 0.0116 0.0000 0.9999
         1627  +vn -0.0116 -0.0000 -0.9999
         1628  +vn 0.9999 -0.0000 -0.0107
         1629  +vn 0.0000 -1.0000 -0.0000
         1630  +vn 0.0000 1.0000 0.0000
         1631  +vn 0.9863 -0.0000 0.1648
         1632  +vn 0.4878 -0.7387 0.4652
         1633  +vn -0.2379 -0.7387 0.6307
         1634  +g paper_Cube.018_paper
         1635  +usemtl paper
         1636  +s off
         1637  +f 323/781/104 324/782/104 325/783/104 326/784/104
         1638  +f 326/785/105 325/786/105 330/787/105 333/788/105
         1639  +f 334/789/106 331/790/106 324/791/106 323/792/106
         1640  +f 324/793/107 331/794/107 330/795/107 325/796/107
         1641  +f 327/797/108 332/798/108 329/799/108 328/800/108
         1642  +f 332/801/105 333/788/105 330/787/105 329/802/105
         1643  +f 333/803/109 334/804/109 331/805/109 330/806/109
         1644  +f 334/789/106 327/807/106 328/808/106 331/790/106
         1645  +f 328/809/110 329/810/110 330/795/110 331/794/110
         1646  +f 336/811/111 335/812/111 337/813/111 338/814/111
         1647  +f 339/815/112 340/816/112 335/817/112 336/818/112
         1648  +f 338/819/113 337/820/113 342/821/113 341/822/113
         1649  +f 344/823/114 343/824/114 345/825/114 346/826/114
         1650  +f 347/827/115 348/828/115 343/829/115 344/830/115
         1651  +f 346/831/116 345/832/116 350/833/116 349/834/116
         1652  +f 347/827/117 349/834/117 350/833/117 348/828/117
         1653  +f 346/831/118 349/834/118 347/827/118 344/830/118
         1654  +f 345/832/119 343/829/119 348/828/119 350/833/119
         1655  +f 338/819/118 341/822/118 339/815/118 336/818/118
         1656  +f 337/820/119 335/817/119 340/816/119 342/821/119
         1657  +f 339/815/120 341/822/120 342/821/120 340/816/120
         1658  +f 334/804/121 323/781/121 326/785/121 333/803/121
         1659  +f 333/835/122 332/836/122 327/837/122 334/838/122

Modified recipes.lua from [c312eb6c73] to [b5f23ba87a].

            1  +-- tweaks
            2  +
     1      3   minetest.register_craft {
     2      4   	type = "shapeless";
     3      5   	recipe = {
     4      6   		"group:water_bucket",
     5      7   		"vessels:glass_bottle",
     6      8   		"vessels:glass_bottle",
     7      9   		"vessels:glass_bottle"
................................................................................
    34     36   	output = "bucket:bucket_water";
    35     37   	replacements = {
    36     38   		{ "sorcery:potion_water", "vessels:glass_bottle" };
    37     39   		{ "sorcery:potion_water", "vessels:glass_bottle" };
    38     40   		{ "sorcery:potion_water", "vessels:glass_bottle" };
    39     41   	};
    40     42   }
           43  +
           44  +minetest.register_craft {
           45  +	type = 'shapeless';
           46  +	recipe = {
           47  +		'group:scissors';
           48  +		'basic_materials:plastic_sheet';
           49  +	};
           50  +	output = 'basic_materials:plastic_strip 3';
           51  +	replacements = {
           52  +		{'group:scissors','group:scissors'};
           53  +	};
           54  +}
    41     55   
    42     56   --[[
    43     57   minetest.register_craft {
    44     58   	type = "shapeless";
    45     59   	recipe = {
    46     60   		"farming:mortar_pestle",
    47     61   		"farming:sugar",
................................................................................
   568    582   		{'default:steel_ingot','default:furnace','default:steel_ingot'};
   569    583   	};
   570    584   	replacements = {
   571    585   		{'basic_materials:copper_wire', 'basic_materials:empty_spool'};
   572    586   	};
   573    587   }
   574    588   
          589  +---- writing
          590  +minetest.register_craftitem('sorcery:ink', {
          591  +	description = "Ink";
          592  +	inventory_image = "sorcery_ink_bottle.png";
          593  +	groups = { liquid = 1; ink = 1; }
          594  +})
          595  +
          596  +minetest.register_craftitem('sorcery:erasure_fluid', {
          597  +	description = "Erasure Fluid";
          598  +	inventory_image = "sorcery_erasure_fluid_bottle.png";
          599  +	groups = { liquid = 1; sorcery_writingstand_operand = 1; }
          600  +})
          601  +
          602  +minetest.register_craft {
          603  +	output = 'sorcery:ink';
          604  +	type = 'shapeless';
          605  +	recipe = {
          606  +		'sorcery:potion_water';
          607  +		'dye:black', 'dye:black', 'dye:black';
          608  +		'xdecor:honey';
          609  +		'basic_materials:oil_extract';
          610  +		'basic_materials:oil_extract';
          611  +	};
          612  +}
          613  +
          614  +minetest.register_craft {
          615  +	output = 'sorcery:erasure_fluid 3';
          616  +	type = 'shapeless';
          617  +	recipe = {
          618  +		'sorcery:potion_water';
          619  +		'sorcery:potion_water';
          620  +		'sorcery:potion_water';
          621  +		'basic_materials:oil_extract';
          622  +		'sorcery:powder_aluminum';
          623  +		'sorcery:powder_tin';
          624  +	}
          625  +}
          626  +
          627  +minetest.register_craft {
          628  +	output = 'sorcery:erasure_fluid 3';
          629  +	type = 'shapeless';
          630  +	recipe = {
          631  +		'vessels:glass_bottle';
          632  +		'vessels:glass_bottle';
          633  +		'vessels:glass_bottle';
          634  +		'bucket:bucket_water';
          635  +		'basic_materials:oil_extract';
          636  +		'sorcery:powder_aluminum';
          637  +		'sorcery:powder_tin';
          638  +	};
          639  +	replacements = {
          640  +		{'bucket:bucket_water','bucket:bucket_empty'};
          641  +	};
          642  +}
          643  +minetest.register_craft {
          644  +	output = 'sorcery:writing_stand';
          645  +	recipe = {
          646  +		{'screwdriver:screwdriver','default:book','default:gold_ingot'};
          647  +		{'sorcery:screw_steel','group:wood','sorcery:screw_steel'};
          648  +		{'group:wood','default:stick','group:wood'};
          649  +	};
          650  +	replacements = {
          651  +		{'screwdriver:screwdriver','screwdriver:screwdriver'};
          652  +	};
          653  +};
          654  +
          655  +sorcery.data.register.infusion_leftover('sorcery:ink','vessels:glass_bottle')
          656  +sorcery.data.register.infusion_leftover('sorcery:erasure_fluid','vessels:glass_bottle')
          657  +
   575    658   ---- altar
   576    659   minetest.register_craftitem('sorcery:candle', {
   577    660   	-- TODO make candle node
   578    661   	inventory_image = 'sorcery_candle.png';
   579    662   	description = 'Votive Candle';
   580    663   	groups = {
   581    664   		candle = 1;

Added textures/sorcery_erasure_fluid_bottle.png version [6cc2e06a0c].

cannot compute difference between binary files

Added textures/sorcery_ink_bottle.png version [9cd1cb7026].

cannot compute difference between binary files

Added textures/sorcery_pen.png version [dbab6605a4].

cannot compute difference between binary files

Added textures/sorcery_pen_nib.png version [20a8f60412].

cannot compute difference between binary files

Added textures/sorcery_scissors_aluminum.png version [2d37a11f3d].

cannot compute difference between binary files

Added textures/sorcery_scissors_bronze.png version [d1baf6e9c4].

cannot compute difference between binary files

Added textures/sorcery_scissors_iridium.png version [19c8d02f68].

cannot compute difference between binary files

Added textures/sorcery_scissors_steel.png version [4a46c3698e].

cannot compute difference between binary files

Added textures/sorcery_scissors_tungsten.png version [b8529839fc].

cannot compute difference between binary files

Added textures/sorcery_ui_ghost_ink_bottle.png version [7c2f6ae8df].

cannot compute difference between binary files

Added textures/sorcery_ui_ghost_pen.png version [35aabc24b3].

cannot compute difference between binary files

Added textures/sorcery_ui_inkwell.png version [abb71778a3].

cannot compute difference between binary files

Added textures/sorcery_ui_inkwell_bar.png version [619704ff57].

cannot compute difference between binary files

Added textures/sorcery_ui_inkwell_bar_black.png version [790e8f3039].

cannot compute difference between binary files

Added textures/sorcery_ui_pg_next.png version [6be954ccbc].

cannot compute difference between binary files

Modified wands.lua from [54442c247e] to [a570130d91].

   695    695   
   696    696   local register_station = function(water)
   697    697   	local tilebase = {
   698    698   		"default_aspen_wood.png";
   699    699   		"sorcery_wandworking_station_side.png";
   700    700   	}
   701    701   	local base = {
   702         -		description = "Wandworking station";
          702  +		description = "Wandworking Station";
   703    703   		groups = {
   704    704   			choppy = 2;
   705    705   		};
   706    706   		paramtype2 = 'facedir';
   707    707   		on_construct = function(pos)
   708    708   			local meta = minetest.get_meta(pos)
   709    709   			local inv = meta:get_inventory()
................................................................................
   791    791   			elseif list == 'wandparts' then
   792    792   				if wwi:is_empty('preview') then update_wand(wwi)
   793    793   				else update_preview(wwi) end
   794    794   			elseif list == 'tank' then
   795    795   				minetest.get_node_timer(pos):start(1)
   796    796   			end
   797    797   		end;
          798  +		_sorcery = {
          799  +			recipe = {
          800  +				note = 'Construct wands from tree blocks and gems; fill with water and soak wands with philters to enchant them';
          801  +			};
          802  +		};
   798    803   	}
   799    804   
   800    805   	local id
   801    806   	if water then
   802    807   		id = 'sorcery:wandworking_station_water'
   803    808   		base = u.tbl.merge(base, {
   804         -			description = "Wandworking station (full)";
          809  +			description = "Wandworking Station (full)";
   805    810   			tiles = u.tbl.append({"sorcery_wandworking_station_top_water.png"}, tilebase)
   806    811   		})
   807    812   	else
   808    813   		id = 'sorcery:wandworking_station'
   809    814   		base = u.tbl.merge(base, {
   810         -			description = "Wandworking station";
          815  +			description = "Wandworking Station";
   811    816   			drop = "sorcery:wandworking_station";
   812    817   			tiles = u.tbl.append({"sorcery_wandworking_station_top.png"}, tilebase)
   813    818   		})
   814    819   	end
   815    820   	minetest.register_node(id, base)
   816    821   end
   817    822   

Modified writing.lua from [d9df5661ad] to [324c6534ec].

     3      3   -- making them appear as by an "unknown author", by smudging out
     4      4   -- the byline with black dye. it also allows written books to be
     5      5   -- soaked in a bucket of water to wash out the ink and return
     6      6   -- them to a virginal, unwritten state. finally, it makes it so
     7      7   -- that when a book (or any owned item, for that matter) is
     8      8   -- copied, the owner of the new copy is set to the user who
     9      9   -- copied it, allowing users to collaborate on books.
           10  +
           11  +local constants = {
           12  +	ops_per_pen_level = 15;
           13  +	ops_per_ink_bottle = 8;
           14  +	cuts_per_scissor_hardness = 10;
           15  +	op_cost_retitle = 1;
           16  +	op_cost_copy_rec = 2;
           17  +	op_cost_insert_rec = 2;
           18  +};
    10     19   
    11     20   local paperburn = function(item,value)
    12     21   	minetest.register_craft { type = 'fuel', recipe = item, burntime = 3 * value }
    13     22   	minetest.register_craft {
    14     23   		type = 'cooking';
    15     24   		recipe = item;
    16     25   		output = 'sorcery:ash ' .. tostring(value);
................................................................................
    59     68   			meta:set_string('owner','unknown author')
    60     69   			meta:set_string('description','"'..meta:get_string('title')..'"')
    61     70   			pinv:set_stack('craft',book_idx,ItemStack())
    62     71   		end
    63     72   	end
    64     73   	return itemstack
    65     74   end)
           75  +
           76  +do
           77  +	local penbase = sorcery.lib.image('sorcery_pen.png')
           78  +	local pennib = sorcery.lib.image('sorcery_pen_nib.png')
           79  +	for name,metal in pairs(sorcery.data.metals) do
           80  +		if not metal.no_tools then
           81  +			local nib if name ~= 'steel' then
           82  +				nib = pennib:multiply(sorcery.lib.color(metal.tone):brighten(1.3))
           83  +			else nib = pennib end
           84  +			local cc if metal.hardness < 4 then cc = 3
           85  +				elseif metal.hardness < 7 then cc = 4
           86  +				else cc = 5 end
           87  +			local id = 'sorcery:pen_' .. name
           88  +			minetest.register_tool(id, {
           89  +				description = sorcery.lib.str.capitalize(name) .. ' Pen';
           90  +				inventory_image = penbase:blit(nib):render();
           91  +				groups = { pen = 1; sorcery_pen = 1; crafttool = cc };
           92  +				_sorcery = {
           93  +					material = {
           94  +						metal = true, grindvalue = 1;
           95  +						id = name, data = metal;
           96  +					};
           97  +				};
           98  +			})
           99  +			minetest.register_craft {
          100  +				output = id;
          101  +				recipe = {
          102  +					{'sorcery:fragment_gold','sorcery:fragment_copper'};
          103  +					{'default:stick',''};
          104  +					{metal.parts.fragment,''};
          105  +				};
          106  +			}
          107  +		end
          108  +	end
          109  +end
          110  +
          111  +for _,name in pairs {
          112  +	'bronze', 'steel', 'aluminum', 'tungsten', 'iridium'
          113  +} do -- :/
          114  +	local metal = sorcery.data.metals[name]
          115  +	local id = 'sorcery:scissors_' .. name
          116  +	minetest.register_tool(id, {
          117  +		description = sorcery.lib.str.capitalize(name) .. ' Scissors';
          118  +		inventory_image = 'sorcery_scissors_' .. name .. '.png';
          119  +		groups = { crafttool = metal.hardness * 15; scissors = 1 };
          120  +		tool_capabilities = {
          121  +			full_punch_interval = 1.5;
          122  +			max_drop_level = metal.maxlevel or metal.level;
          123  +			groupcaps = {
          124  +				snappy = {
          125  +					uses = math.floor(metal.durability * 0.10);
          126  +					leveldiff = 1;
          127  +					maxlevel = metal.maxlevel or metal.level;
          128  +					times = {
          129  +						[1] = 3 / metal.speed;
          130  +						[2] = 2 / metal.speed;
          131  +						[3] = 1 / metal.speed;
          132  +					};
          133  +				};
          134  +			};
          135  +			damage_groups = { fleshy = 1; };
          136  +		};
          137  +		_sorcery = {
          138  +			material = {
          139  +				metal = true, data = metal, name = name;
          140  +				grindvalue = 3;
          141  +			};
          142  +			recipe = {
          143  +				note = "An editor's best friend";
          144  +			};
          145  +		};
          146  +	})
          147  +	local frag = metal.parts.fragment;
          148  +	local screw = metal.parts.screw;
          149  +	local ingot = metal.parts.ingot;
          150  +	minetest.register_craft {
          151  +		output = id;
          152  +		recipe = {
          153  +			{frag,'screwdriver:screwdriver',frag};
          154  +			{'basic_materials:plastic_strip',screw,'basic_materials:plastic_strip'};
          155  +			{ingot,'',ingot};
          156  +		};
          157  +		replacements = {
          158  +			{'screwdriver:screwdriver', 'screwdriver:screwdriver'};
          159  +		};
          160  +	}
          161  +end
          162  +
          163  +-- the writing stand node allows books to be modified
          164  +-- in more complex ways than just inserting pages
          165  +
          166  +local ws_props = function(pos)
          167  +	local meta = minetest.get_meta(pos)
          168  +	local inv = meta:get_inventory()
          169  +	local reservoir = meta:get_int('inkwell')
          170  +	local inkstack = inv:get_stack('ink',1)
          171  +	local inkbottles = 0
          172  +	if minetest.get_item_group(inkstack:get_name(),'ink') ~= 0 then
          173  +		inkbottles = inkstack:get_count()
          174  +	end
          175  +	local penstack = inv:get_stack('pen',1)
          176  +	local penstr if not penstack:is_empty() then
          177  +		penstr = penstack:get_definition()._sorcery.material.data.hardness * constants.ops_per_pen_level
          178  +	end
          179  +	local operstack = inv:get_stack('operand',1)
          180  +	local mode if not operstack:is_empty() then
          181  +		if operstack:get_name() == 'sorcery:erasure_fluid' then
          182  +			mode = 'delete';
          183  +		elseif operstack:get_name() == 'sorcery:recipe' then
          184  +			mode = 'insert';
          185  +		elseif operstack:get_name() == 'default:paper' then
          186  +			mode = 'copy';
          187  +		elseif minetest.get_item_group(operstack:get_name(), 'scissors') ~= 0 then
          188  +			mode = 'cut';
          189  +		end
          190  +	end
          191  +	return {
          192  +		meta = meta;
          193  +		inv = inv;
          194  +		haspen = not penstack:is_empty();
          195  +		hasink = not inkstack:is_empty();
          196  +		inkwell = reservoir, penstr = penstr;
          197  +		mode = mode;
          198  +		inkstack = inkstack, penstack = penstack;
          199  +		operstack = operstack;
          200  +		totalink = reservoir + inkbottles * constants.ops_per_ink_bottle;
          201  +	}
          202  +end
          203  +local ws_formspec = function(pos)
          204  +	local props = ws_props(pos)
          205  +	local meta = props.meta
          206  +	local inv = props.inv
          207  +	local base = [[
          208  +		formspec_version[3] size[10.25,10.5]
          209  +		real_coordinates[true]
          210  +
          211  +		list[context;subject;0.25,0.25;1,1;]
          212  +		list[context;pen;0.25,1.50;1,1;]
          213  +		list[context;ink;0.25,2.75;1,1;]
          214  +
          215  +		list[context;operand;9,0.25;1,1;]
          216  +		image[9,1.50;1,1;sorcery_ui_inkwell.png]
          217  +		list[context;output;9,2.75;1,1;]
          218  +
          219  +		list[current_player;main;0.25,5.5;8,4;]
          220  +
          221  +		listring[context;output]
          222  +		listring[current_player;main] listring[context;subject]
          223  +		listring[current_player;main] listring[context;pen]
          224  +		listring[current_player;main] listring[context;ink]
          225  +		listring[current_player;main] listring[context;operand]
          226  +		listring[current_player;main]
          227  +	]]
          228  +	local mkbtn = function(x,y,tex,name,presstex)
          229  +		tex = 'sorcery_ui_' .. tex
          230  +		if presstex then
          231  +			presstex = 'sorcery_ui_' .. presstex
          232  +		else presstex = tex end
          233  +		return string.format('image_button[' ..
          234  +			'%f,%f;' ..
          235  +			'1,1;' ..
          236  +			'%s;%s;;' ..
          237  +			'false;false;%s' ..
          238  +		']',x,y,tex,name,presstex)
          239  +	end
          240  +
          241  +	local form = base
          242  +	local subj = inv:get_stack('subject',1)
          243  +
          244  +	if subj:is_empty() then
          245  +		form = form .. 'image[0.25,0.25;1,1;default_bookshelf_slot.png]'
          246  +	end
          247  +	if props.penstack:is_empty() then
          248  +		form = form .. 'image[0.25,1.50;1,1;sorcery_ui_ghost_pen.png]'
          249  +	end
          250  +	if props.inkstack:is_empty() then
          251  +		form = form .. 'image[0.25,2.75;1,1;sorcery_ui_ghost_ink_bottle.png]'
          252  +	end
          253  +
          254  +	if props.inkwell > 0 then
          255  +		form = form .. string.format(
          256  +			'image[8.8,1.50;0.5,0.5;sorcery_ui_inkwell_bar.png^[lowpart:%u:sorcery_ui_inkwell_bar_black.png]', 
          257  +
          258  +			math.min(100,math.ceil((props.inkwell / constants.ops_per_ink_bottle) * 100))
          259  +		)
          260  +	end
          261  +	
          262  +	if subj:get_name() == 'sorcery:cookbook' then
          263  +		local book = sorcery.cookbook.get(subj)
          264  +		local bm = subj:get_meta()
          265  +		local rpp = sorcery.cookbook.constants.recipes_per_cookbook_page
          266  +		local page = bm:contains("pagenr") and bm:get_int("pagenr") or 1
          267  +		local lastpage = math.ceil(#book.pages / rpp)
          268  +
          269  +		if page > 1 then form = form .. mkbtn(0.25,4,'pg_next.png^[transformFX','prevpage') end
          270  +		if page < lastpage then form = form .. mkbtn(9.00,4,'pg_next.png','nextpage'); end
          271  +
          272  +		local desctext = minetest.formspec_escape(bm:get_string('description'))
          273  +		if props.haspen and props.totalink >= constants.op_cost_retitle then
          274  +			form = form .. string.format([[
          275  +				field[1.75,0.25;7,1;title;;%s]
          276  +				field_close_on_enter[title;false]
          277  +			]], desctext)
          278  +		else
          279  +			form = form .. string.format([[
          280  +				label[1.75,0.75;%s]
          281  +			]], desctext)
          282  +		end
          283  +
          284  +		local mode = props.mode
          285  +		local modecolors = {
          286  +			delete = {255,127,127};
          287  +			cut    = {255,127,64};
          288  +			insert = {127,255,127};
          289  +			copy   = {127,127,255};
          290  +		}
          291  +
          292  +		for i=1,rpp do
          293  +			local chap = rpp * (page-1) + i
          294  +			local rec = book.pages[chap]
          295  +			if rec == nil then break end
          296  +			local text = sorcery.cookbook.recfn(rec.kind,'title')(rec.name)
          297  +			local class = sorcery.cookbook.classes[rec.kind]
          298  +
          299  +			local id = 'recipe_' .. tostring(i)
          300  +			local height = 1.50 + 1.25*(i-1)
          301  +			local img if class.icon then
          302  +				img = class.icon(rec.name)
          303  +			end
          304  +			local mcolor = sorcery.lib.color(modecolors[mode] or {255,255,255})
          305  +			form = form .. string.format([[
          306  +				style[%s;border=%s;textcolor=%s]
          307  +				style[%s:hovered;textcolor=#ffffff]
          308  +				style[%s:pressed;content_offset=0,0;textcolor=%s]
          309  +				button[1.75,%f;7,1;%s;%u. %s]
          310  +				%s[1.80,%f;0.90,0.90;%s]
          311  +			]], id, mode and 'true' or 'false',
          312  +				mode and mcolor:brighten(1.2):hex() or mcolor:hex(),
          313  +				id, id, mcolor:hex(),
          314  +				height, id, chap,
          315  +				minetest.formspec_escape(text),
          316  +				img and 'image' or 'item_image',
          317  +				height + 0.05, img or rec.name
          318  +			)
          319  +		end
          320  +	end
          321  +		
          322  +	meta:set_string('formspec',form)
          323  +end
          324  +
          325  +local wsbox = {
          326  +	type = 'fixed';
          327  +	fixed = {
          328  +		-0.5, -0.5, -0.43;
          329  +		 0.5,  0.05, 0.43;
          330  +	};
          331  +}
          332  +
          333  +minetest.register_node('sorcery:writing_stand', {
          334  +	description = 'Writing Stand';
          335  +	drawtype = 'mesh';
          336  +	mesh = 'sorcery-writing-stand.obj';
          337  +	sunlight_propagates = true;
          338  +	paramtype = 'light';
          339  +	paramtype2 = 'facedir';
          340  +	collision_box = wsbox;
          341  +	selection_box = wsbox;
          342  +	after_dig_node = sorcery.lib.node.purge_container;
          343  +	tiles = {
          344  +		'default_obsidian.png';
          345  +		'default_wood.png';
          346  +		'default_gold_block.png';
          347  +		'default_steel_block.png';
          348  +		'default_desert_stone.png';
          349  +		'default_cloud.png';
          350  +	};
          351  +	groups = {
          352  +		choppy = 2, oddly_breakable_by_hand = 2;
          353  +		sorcery_tech = 1;
          354  +		flammable = 2;
          355  +	};
          356  +	on_construct = function(pos)
          357  +		local meta = minetest.get_meta(pos)
          358  +		local inv = meta:get_inventory()
          359  +		
          360  +		meta:set_string('infotext','Writing Stand')
          361  +		inv:set_size('subject',1)
          362  +		inv:set_size('ink',1)
          363  +		inv:set_size('pen',1)
          364  +		inv:set_size('operand',1)
          365  +		inv:set_size('output',1)
          366  +
          367  +		ws_formspec(pos)
          368  +	end;
          369  +
          370  +	on_metadata_inventory_put = ws_formspec;
          371  +	on_metadata_inventory_take = ws_formspec;
          372  +	on_metadata_inventory_move = ws_formspec;
          373  +
          374  +	on_receive_fields = function(pos,fname,fields,user)
          375  +		local p = ws_props(pos)
          376  +		local subj = p.inv:get_stack('subject',1)
          377  +		local changed = false
          378  +		local charge_ink = function(val)
          379  +			if p.totalink < val then return false end
          380  +			if p.inkwell >= val then
          381  +				p.inkwell = p.inkwell - val
          382  +			else
          383  +				local bottles = math.ceil(val / constants.ops_per_ink_bottle)
          384  +				local inkbtls = p.inkstack:get_count()
          385  +				p.inkstack:take_item(bottles)
          386  +				local empties = ItemStack {
          387  +					name = 'vessels:glass_bottle';
          388  +					count = bottles;
          389  +				}
          390  +				if p.inkstack:is_empty() then
          391  +					p.inkstack = empties
          392  +				else
          393  +					local r = user:get_inventory():add_item('main',empties)
          394  +					if not r:is_empty() then
          395  +						minetest.add_item(pos,r)
          396  +					end
          397  +				end
          398  +				p.inkwell = (p.inkwell + bottles*constants.ops_per_ink_bottle) - val
          399  +				p.totalink = p.inkwell + (inkbtls-bottles)*constants.ops_per_ink_bottle
          400  +			end
          401  +			p.penstack:add_wear(math.ceil((65535 / p.penstr) * val))
          402  +			changed = true
          403  +			return true
          404  +		end
          405  +		if subj:is_empty() then return nil end
          406  +		if subj:get_name() == 'sorcery:cookbook' then
          407  +			local bm = subj:get_meta()
          408  +			local book = sorcery.cookbook.get(subj)
          409  +
          410  +			-- handle page change request
          411  +			if fields.nextpage or fields.prevpage then
          412  +				local page = math.max(1,bm:get_int('pagenr'))
          413  +				if     fields.nextpage then page = page + 1
          414  +				elseif fields.prevpage then page = page - 1 end
          415  +				bm:set_int('pagenr',math.max(1,page))
          416  +				changed = true
          417  +			end
          418  +
          419  +			-- handle retitle request
          420  +			if fields.title then
          421  +				if fields.title ~= bm:get_string('description') then
          422  +					if charge_ink(constants.op_cost_retitle) then
          423  +						bm:set_string('description',fields.title)
          424  +					end
          425  +				end
          426  +			end
          427  +
          428  +			-- handle editing request
          429  +			local rpp = sorcery.cookbook.constants.recipes_per_cookbook_page 
          430  +			if p.mode then for idx=1,rpp do
          431  +				if fields['recipe_' .. tostring(idx)] then
          432  +					local recnr = (bm:get_int('pagenr')-1)*rpp + idx
          433  +					local rec = book.pages[recnr]
          434  +					local bookchanged = false 
          435  +					if p.mode == 'delete' then
          436  +						p.operstack:take_item(1)
          437  +						table.remove(book.pages,recnr)
          438  +						bookchanged = true
          439  +					elseif p.mode == 'copy' and
          440  +						charge_ink(constants.op_cost_copy_rec) then
          441  +						local recipe = ItemStack('sorcery:recipe')
          442  +						sorcery.cookbook.setrecipe(recipe,rec.kind,rec.name)
          443  +						if p.operstack:get_count() == 1 then
          444  +							p.operstack = recipe
          445  +						else
          446  +							p.operstack:take_item(1)
          447  +							minetest.add_item(pos, user:get_inventory():add_item('main',recipe))
          448  +						end
          449  +						changed = true
          450  +					elseif p.mode == 'insert' then
          451  +						local rm = p.operstack:get_meta()
          452  +						if not rm:contains('recipe_kind') then
          453  +							sorcery.cookbook.setrecipe(p.operstack)
          454  +						end
          455  +						table.insert(book.pages,recnr,{
          456  +							kind = rm:get_string('recipe_kind');
          457  +							name = rm:get_string('recipe_name');
          458  +						})
          459  +						-- insertion can operate in one of two modes: copying
          460  +						-- the recipe into the book, or inserting the paper
          461  +						-- directly. if there is no ink available, we use the
          462  +						-- latter mode. in effect, this means deleting the
          463  +						-- recipe item is insufficient ink is available.
          464  +						if charge_ink(constants.op_cost_insert_rec) == false then
          465  +							p.operstack = ItemStack(nil)
          466  +						end
          467  +						bookchanged = true
          468  +					elseif p.mode == 'cut' then
          469  +						local spr = p.operstack:get_definition()._sorcery
          470  +						local sch = (spr and spr.material and spr.material.data.hardness) or 2
          471  +						local suses = sch * constants.cuts_per_scissor_hardness
          472  +						local dmg = 65535 / suses
          473  +
          474  +						local cutrec = ItemStack('sorcery:recipe')
          475  +						sorcery.cookbook.setrecipe(cutrec,rec.kind,rec.name)
          476  +						table.remove(book.pages,recnr)
          477  +						minetest.add_item(pos, user:get_inventory():add_item('main', p.inv:add_item('output', cutrec)))
          478  +
          479  +						p.operstack:add_wear(dmg)
          480  +						bookchanged = true
          481  +					end
          482  +					if bookchanged then
          483  +						sorcery.cookbook.set(subj, book)
          484  +						changed = true
          485  +					end
          486  +					break
          487  +				end
          488  +			end end
          489  +		end
          490  +
          491  +		if changed then
          492  +			p.inv:set_stack('subject',1,subj)
          493  +			p.inv:set_stack('ink',1,p.inkstack)
          494  +			p.inv:set_stack('pen',1,p.penstack)
          495  +			p.inv:set_stack('operand',1,p.operstack)
          496  +			p.meta:set_int('inkwell',p.inkwell)
          497  +			ws_formspec(pos)
          498  +		end
          499  +	end;
          500  +
          501  +	allow_metadata_inventory_put = function(pos,list,index,stack,user)
          502  +		local matchgrp = function(grp)
          503  +			return minetest.get_item_group(stack:get_name(), grp) ~= 0
          504  +		end
          505  +		local allowgroups = function(groups)
          506  +			for g,c in pairs(groups) do
          507  +				if matchgrp(g) then
          508  +					if c==0 then return stack:get_count()
          509  +						else return c end
          510  +				end
          511  +			end
          512  +			return 0
          513  +		end
          514  +		if list == 'subject' then
          515  +			return allowgroups{book=1,paper=1}
          516  +		elseif list == 'ink' then
          517  +			return allowgroups{ink=0}
          518  +		elseif list == 'pen' then
          519  +			return allowgroups{sorcery_pen=1}
          520  +		elseif list == 'operand' then
          521  +			-- TODO restrict to meaningful operands
          522  +			return stack:get_count()
          523  +			-- return allowgroups{book=0,paper=0,ink=0,...}
          524  +		end
          525  +		return 0
          526  +	end;
          527  +	allow_metadata_inventory_move = function(pos,fl,fi,tl,ti,ct,user)
          528  +		-- TODO this is lazy, defuckulate
          529  +		if tl == 'operand' then return ct end
          530  +		return 0
          531  +	end;
          532  +
          533  +	_sorcery = {
          534  +		recipe = {
          535  +			note = 'Edit manuals, copy their chapters, splice them together, or cut them apart';
          536  +		};
          537  +	};
          538  +})