From cc618ba61c349c42b85ac40796448d5970982d19 Mon Sep 17 00:00:00 2001 From: bzt Date: Fri, 29 Nov 2019 14:31:39 +0100 Subject: [PATCH] Initial commit --- LICENSE | 21 + README.md | 43 + data/Andesite_00.png | Bin 0 -> 1547 bytes data/Bed_Red_00.png | Bin 0 -> 659 bytes data/Bed_Red_01.png | Bin 0 -> 639 bytes data/Bedrock_00.png | Bin 0 -> 2042 bytes data/Bookshelf_00.png | Bin 0 -> 2325 bytes data/Brewing_Stand_00.png | Bin 0 -> 1181 bytes data/Brick_Block_00.png | Bin 0 -> 3403 bytes data/Cactus_00.png | Bin 0 -> 3061 bytes data/Carpet_White_00.png | Bin 0 -> 1749 bytes data/Cauldron_00.png | Bin 0 -> 409 bytes data/Chest_00.png | Bin 0 -> 2235 bytes data/Chest_01.png | Bin 0 -> 2732 bytes data/Cobblestone_00.png | Bin 0 -> 2808 bytes data/Cobblestone_Slab_00.png | Bin 0 -> 1859 bytes data/Cobblestone_Stair_00.png | Bin 0 -> 2112 bytes data/Cobblestone_Stair_01.png | Bin 0 -> 1964 bytes data/Cobblestone_Stair_02.png | Bin 0 -> 2257 bytes data/Cobblestone_Stair_03.png | Bin 0 -> 2246 bytes data/Cobblestone_Wall_00.png | Bin 0 -> 1034 bytes data/Cobweb_00.png | Bin 0 -> 1358 bytes data/Crafting_Table_00.png | Bin 0 -> 1841 bytes data/Crafting_Table_01.png | Bin 0 -> 1952 bytes data/Dandelion_00.png | Bin 0 -> 194 bytes data/Dirt_00.png | Bin 0 -> 2691 bytes data/End_Portal_Frame_00.png | Bin 0 -> 2298 bytes data/Fence_00.png | Bin 0 -> 1560 bytes data/Fence_01.png | Bin 0 -> 1527 bytes data/Furnace_00.png | Bin 0 -> 2205 bytes data/Furnace_01.png | Bin 0 -> 2394 bytes data/Glass_00.png | Bin 0 -> 3461 bytes data/Gold_Block_00.png | Bin 0 -> 2067 bytes data/Grass_00.png | Bin 0 -> 706 bytes data/Grass_Block_00.png | Bin 0 -> 1936 bytes data/Ice_00.png | Bin 0 -> 1846 bytes data/Iron_Bar_00.png | Bin 0 -> 911 bytes data/Iron_Bar_01.png | Bin 0 -> 894 bytes data/Iron_Door_00.png | Bin 0 -> 1454 bytes data/Iron_Door_01.png | Bin 0 -> 1413 bytes data/Iron_Trapdoor_00.png | Bin 0 -> 1177 bytes data/Ladder_00.png | Bin 0 -> 928 bytes data/Ladder_01.png | Bin 0 -> 928 bytes data/Lava_Source_00.png | Bin 0 -> 2859 bytes data/Leaves_00.png | Bin 0 -> 2360 bytes data/Mob_Spawner_00.png | Bin 0 -> 1415 bytes data/Mossy_Cobblestone_00.png | Bin 0 -> 2188 bytes data/Oak_Door_00.png | Bin 0 -> 1481 bytes data/Oak_Door_01.png | Bin 0 -> 1428 bytes data/Oak_Pressure_Plate_00.png | Bin 0 -> 1189 bytes data/Oak_Wall_Sign_00.png | Bin 0 -> 1490 bytes data/Oak_Wall_Sign_01.png | Bin 0 -> 1409 bytes data/Oak_Wood_00.png | Bin 0 -> 2664 bytes data/Oak_Wood_Planks_00.png | Bin 0 -> 3076 bytes data/Oak_Wood_Slab_00.png | Bin 0 -> 2062 bytes data/Oak_Wood_Stair_00.png | Bin 0 -> 2356 bytes data/Oak_Wood_Stair_01.png | Bin 0 -> 2288 bytes data/Oak_Wood_Stair_02.png | Bin 0 -> 2546 bytes data/Oak_Wood_Stair_03.png | Bin 0 -> 2560 bytes data/Obsidian_00.png | Bin 0 -> 1788 bytes data/Poppy_00.png | Bin 0 -> 214 bytes data/Prismarine_00.png | Bin 0 -> 2414 bytes data/Prismarine_Brick_00.png | Bin 0 -> 2189 bytes data/Prismarine_Dark_00.png | Bin 0 -> 2189 bytes data/Red_Mushroom_00.png | Bin 0 -> 272 bytes data/Sandstone_00.png | Bin 0 -> 2593 bytes data/Sandstone_Carved_00.png | Bin 0 -> 1779 bytes data/Sandstone_Slab_00.png | Bin 0 -> 1889 bytes data/Sandstone_Smooth_00.png | Bin 0 -> 2593 bytes data/Sandstone_Stair_00.png | Bin 0 -> 2133 bytes data/Sandstone_Stair_01.png | Bin 0 -> 2012 bytes data/Sandstone_Stair_02.png | Bin 0 -> 2272 bytes data/Sandstone_Stair_03.png | Bin 0 -> 2212 bytes data/Sea_Lantern_00.png | Bin 0 -> 2173 bytes data/Snow_00.png | Bin 0 -> 1857 bytes data/Snow_Layer_00.png | Bin 0 -> 1749 bytes data/Spruce_Fence_00.png | Bin 0 -> 2408 bytes data/Spruce_Fence_01.png | Bin 0 -> 1409 bytes data/Sprucewood_00.png | Bin 0 -> 1995 bytes data/Sprucewood_Slab_00.png | Bin 0 -> 1818 bytes data/Sprucewood_Stair_00.png | Bin 0 -> 2131 bytes data/Sprucewood_Stair_01.png | Bin 0 -> 2032 bytes data/Sprucewood_Stair_02.png | Bin 0 -> 2225 bytes data/Sprucewood_Stair_03.png | Bin 0 -> 2223 bytes data/Stone_00.png | Bin 0 -> 2042 bytes data/Stone_Brick_00.png | Bin 0 -> 2119 bytes data/Stone_Brick_Carved_00.png | Bin 0 -> 2023 bytes data/Stone_Brick_Cracked_00.png | Bin 0 -> 2808 bytes data/Stone_Brick_Slab_00.png | Bin 0 -> 1758 bytes data/Stone_Brick_Stair_00.png | Bin 0 -> 2051 bytes data/Stone_Brick_Stair_01.png | Bin 0 -> 1964 bytes data/Stone_Brick_Stair_02.png | Bin 0 -> 2197 bytes data/Stone_Brick_Stair_03.png | Bin 0 -> 2169 bytes data/Stone_Brick_Wall_00.png | Bin 0 -> 1034 bytes data/Stone_Button_00.png | Bin 0 -> 885 bytes data/Stone_Button_01.png | Bin 0 -> 303 bytes data/Stone_Pressure_Plate_00.png | Bin 0 -> 1008 bytes data/Stone_Slab_00.png | Bin 0 -> 1733 bytes data/Stone_Stair_00.png | Bin 0 -> 1980 bytes data/Stone_Stair_01.png | Bin 0 -> 1876 bytes data/Stone_Stair_02.png | Bin 0 -> 2134 bytes data/Stone_Stair_03.png | Bin 0 -> 2116 bytes data/Stonebrick_Cracked_00.png | Bin 0 -> 2808 bytes data/TNT_00.png | Bin 0 -> 2578 bytes data/Tall_Grass_00.png | Bin 0 -> 953 bytes data/Torch_00.png | Bin 0 -> 311 bytes data/Trapdoor_00.png | Bin 0 -> 1244 bytes data/Water_Source_00.png | Bin 0 -> 2729 bytes data/Wool_00.png | Bin 0 -> 1961 bytes data/blocks.csv | 75 ++ docs/blocks.md | 52 + docs/mts_format.md | 92 ++ docs/mtsedit.png | Bin 0 -> 86849 bytes docs/mtseditdoc.png | Bin 0 -> 15796 bytes docs/usage.md | 119 +++ src/Makefile | 62 ++ src/edit.c | 308 ++++++ src/font.psf.gz | Bin 0 -> 17573 bytes src/icons.png | Bin 0 -> 17729 bytes src/lang.c | 122 +++ src/lang.h | 77 ++ src/main.c | 326 ++++++ src/main.h | 168 ++++ src/mts.c | 746 ++++++++++++++ src/save.c | 239 +++++ src/sdl.c | 489 +++++++++ src/search.c | 183 ++++ src/stb_image.h | 1582 ++++++++++++++++++++++++++++++ src/util.c | 280 ++++++ 129 files changed, 4984 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 data/Andesite_00.png create mode 100644 data/Bed_Red_00.png create mode 100644 data/Bed_Red_01.png create mode 100644 data/Bedrock_00.png create mode 100644 data/Bookshelf_00.png create mode 100644 data/Brewing_Stand_00.png create mode 100644 data/Brick_Block_00.png create mode 100644 data/Cactus_00.png create mode 100644 data/Carpet_White_00.png create mode 100644 data/Cauldron_00.png create mode 100644 data/Chest_00.png create mode 100644 data/Chest_01.png create mode 100644 data/Cobblestone_00.png create mode 100644 data/Cobblestone_Slab_00.png create mode 100644 data/Cobblestone_Stair_00.png create mode 100644 data/Cobblestone_Stair_01.png create mode 100644 data/Cobblestone_Stair_02.png create mode 100644 data/Cobblestone_Stair_03.png create mode 100644 data/Cobblestone_Wall_00.png create mode 100644 data/Cobweb_00.png create mode 100644 data/Crafting_Table_00.png create mode 100644 data/Crafting_Table_01.png create mode 100644 data/Dandelion_00.png create mode 100644 data/Dirt_00.png create mode 100644 data/End_Portal_Frame_00.png create mode 100644 data/Fence_00.png create mode 100644 data/Fence_01.png create mode 100644 data/Furnace_00.png create mode 100644 data/Furnace_01.png create mode 100644 data/Glass_00.png create mode 100644 data/Gold_Block_00.png create mode 100644 data/Grass_00.png create mode 100644 data/Grass_Block_00.png create mode 100644 data/Ice_00.png create mode 100644 data/Iron_Bar_00.png create mode 100644 data/Iron_Bar_01.png create mode 100644 data/Iron_Door_00.png create mode 100644 data/Iron_Door_01.png create mode 100644 data/Iron_Trapdoor_00.png create mode 100644 data/Ladder_00.png create mode 100644 data/Ladder_01.png create mode 100644 data/Lava_Source_00.png create mode 100644 data/Leaves_00.png create mode 100644 data/Mob_Spawner_00.png create mode 100644 data/Mossy_Cobblestone_00.png create mode 100644 data/Oak_Door_00.png create mode 100644 data/Oak_Door_01.png create mode 100644 data/Oak_Pressure_Plate_00.png create mode 100644 data/Oak_Wall_Sign_00.png create mode 100644 data/Oak_Wall_Sign_01.png create mode 100644 data/Oak_Wood_00.png create mode 100644 data/Oak_Wood_Planks_00.png create mode 100644 data/Oak_Wood_Slab_00.png create mode 100644 data/Oak_Wood_Stair_00.png create mode 100644 data/Oak_Wood_Stair_01.png create mode 100644 data/Oak_Wood_Stair_02.png create mode 100644 data/Oak_Wood_Stair_03.png create mode 100644 data/Obsidian_00.png create mode 100644 data/Poppy_00.png create mode 100644 data/Prismarine_00.png create mode 100644 data/Prismarine_Brick_00.png create mode 100644 data/Prismarine_Dark_00.png create mode 100644 data/Red_Mushroom_00.png create mode 100644 data/Sandstone_00.png create mode 100644 data/Sandstone_Carved_00.png create mode 100644 data/Sandstone_Slab_00.png create mode 100644 data/Sandstone_Smooth_00.png create mode 100644 data/Sandstone_Stair_00.png create mode 100644 data/Sandstone_Stair_01.png create mode 100644 data/Sandstone_Stair_02.png create mode 100644 data/Sandstone_Stair_03.png create mode 100644 data/Sea_Lantern_00.png create mode 100644 data/Snow_00.png create mode 100644 data/Snow_Layer_00.png create mode 100644 data/Spruce_Fence_00.png create mode 100644 data/Spruce_Fence_01.png create mode 100644 data/Sprucewood_00.png create mode 100644 data/Sprucewood_Slab_00.png create mode 100644 data/Sprucewood_Stair_00.png create mode 100644 data/Sprucewood_Stair_01.png create mode 100644 data/Sprucewood_Stair_02.png create mode 100644 data/Sprucewood_Stair_03.png create mode 100644 data/Stone_00.png create mode 100644 data/Stone_Brick_00.png create mode 100644 data/Stone_Brick_Carved_00.png create mode 100644 data/Stone_Brick_Cracked_00.png create mode 100644 data/Stone_Brick_Slab_00.png create mode 100644 data/Stone_Brick_Stair_00.png create mode 100644 data/Stone_Brick_Stair_01.png create mode 100644 data/Stone_Brick_Stair_02.png create mode 100644 data/Stone_Brick_Stair_03.png create mode 100644 data/Stone_Brick_Wall_00.png create mode 100644 data/Stone_Button_00.png create mode 100644 data/Stone_Button_01.png create mode 100644 data/Stone_Pressure_Plate_00.png create mode 100644 data/Stone_Slab_00.png create mode 100644 data/Stone_Stair_00.png create mode 100644 data/Stone_Stair_01.png create mode 100644 data/Stone_Stair_02.png create mode 100644 data/Stone_Stair_03.png create mode 100644 data/Stonebrick_Cracked_00.png create mode 100644 data/TNT_00.png create mode 100644 data/Tall_Grass_00.png create mode 100644 data/Torch_00.png create mode 100644 data/Trapdoor_00.png create mode 100644 data/Water_Source_00.png create mode 100644 data/Wool_00.png create mode 100644 data/blocks.csv create mode 100644 docs/blocks.md create mode 100644 docs/mts_format.md create mode 100644 docs/mtsedit.png create mode 100644 docs/mtseditdoc.png create mode 100644 docs/usage.md create mode 100644 src/Makefile create mode 100644 src/edit.c create mode 100644 src/font.psf.gz create mode 100644 src/icons.png create mode 100644 src/lang.c create mode 100644 src/lang.h create mode 100644 src/main.c create mode 100644 src/main.h create mode 100644 src/mts.c create mode 100644 src/save.c create mode 100644 src/sdl.c create mode 100644 src/search.c create mode 100644 src/stb_image.h create mode 100644 src/util.c diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c3a1a70 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + Copyright (C) 2019 bzt (bztsrc@gitlab) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff5928f --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +Minetest MTS Editor +=================== + +This is a simple editor for [Minetest](https://www.minetest.net) Schematic files +([MTS](https://gitlab.com/bztsrc/mtsedit/blob/master/docs/mts_format.md)) + +``` +MineTest Schematics Editor by bzt Copyright (C) 2019 MIT license + +./mtsedit [-d|-p|-P|-g] [-m map] <.mts|.schematic> [out.mts] + + -d: dump layers to output + -p: save preview + -P: preview structure cut in half + -g: generate slab and stairs from block image + -m map: replace block type mapping + out.mts: output to file + +``` + +Batch Mode +---------- + +You can convert MTS files and generate preview images for them from script with this tool. +[Read more](https://gitlab.com/bztsrc/mtsedit/blob/master/docs/usage.md). + +Interactive Mode +---------------- + +A picture can be more informative than thousand words. [Read more](https://gitlab.com/bztsrc/mtsedit/blob/master/docs/usage.md). + + + +Compilation +----------- + +It is very simple, written in ANSI C. The one and only dependency it has is the SDL2 library. Just issue `make` in the "src" +directory, and that will autodetect your operating system (Linux, BSD, MacOSX and Windows with mingw). + +It also needs some [data files](https://gitlab.com/bztsrc/mtsedit/blob/master/docs/blocks.md), which can be found +[here](https://gitlab.com/bztsrc/mtsedit/tree/master/data). + +bzt diff --git a/data/Andesite_00.png b/data/Andesite_00.png new file mode 100644 index 0000000000000000000000000000000000000000..7c5a7351c57479c90f1953ec70217f931842037d GIT binary patch literal 1547 zcmV+m2K4!fP)(bq$0j)+Yl`={-6&&B(bD4W3WQg zAXf9EG(~H*8mfpd8iguIjY-oO3u&vEnP4Y#XYSd1eSO&HoO>rT#c8Vh98l?9TAv0W?<&O&Q0?rNiXdE^4GV0r*C)T(Zxf%-2HJgJ7;dY&5V>1ia-${?KZP> zX^INT(fjWI%IYlv z`0k?*JJLra4w>0|L6lq&U~U*jL_q>cH4L6GGfK|g&3}y&`$5m_+55HF7Jy@qE#hYH z%cUHSQa)UF8Ey`UQc8W~PDBu;0EWARL4+_WD5+=Yd2`$6<}ZBV-Ur?sz_G^`Zv!4Q z?6XqLLcLYQ!m|2avIa0LVJ7$I_2SJI_14VSt$ED=&l@br`+56SkJDaKd^URM= z-kF>HTZ0dJ^5pK-E5K8w79gcW8VrF7%*;Sw$w}@=fP_T*t^y22QpEe$*2kZ_{oU{S z)gS-#=T`v+9e^D>W_In|xv+C>eVrRCH;C4Acc+wsBvR_|iZp1CN|Xo?{h7*28}gQ& z$c2|LU*XE%{=TzB+}7Fc0Z3KFbF;I|&CapByu{ktI#~6@%}9d*p&&xl%LoLx86`4i z2`Ml)JREZ)Bwl;`n*0JHR^~^A$%?8JS zlpG}R_E*A_v%Gwr^XD&eZD|>I>l3vL?FImyXxyC$F*DMq{KXtc(Ki!X8Y>TA?$NzIsuR!g=SfSL6h+?{6JKwIr*W@gy2V+S`@R#;tI zW5coQA#iz4w;{SC%-%Q z2mW)D$O0;6J}@& z)K(#A<3AV-NXf}LlTyNfoO3VES_2AdwIRiX>Z!Xxz0pqGHMFp07Ia?ZrfF-p2(y~M z5#*d14u`Fb3`qyH*SCsDPP`H!&dTteM?iqFl;3Q({7Cms%1X#tk`NnTQsY zO?1$&mIiT2;%?w<51yOW$sZn@m2{sJ``mrL8#<;3l5Q&Ulz8F?r^z|@1VwCYw>6Zy zE^)}+7Jv5K^BacLO=I~dKmGaDDET1b4&bOA?{p?iVq;@7jstfXcJOB7 zTQV@cPM)bUwhPfCM* zpm&r~IC<(!*E{|l5f4dvcq^*^Cjh$j^ixmVo}2ME1)n-~`e`EKL_~b!C(r)kmA87= xw!aOh*T+8onO6k&gmhO*=`PIfxfSC8{{hl!Gusc8xU2vG002ovPDHLkV1jSS{;U81 literal 0 HcmV?d00001 diff --git a/data/Bed_Red_00.png b/data/Bed_Red_00.png new file mode 100644 index 0000000000000000000000000000000000000000..59e6f0e0c60e99f6ce7867aefc626ffe7199b0fb GIT binary patch literal 659 zcmV;E0&M+>P)0v@6o#LBZxZs^Hhv&2)^t%U{sFfQxU1ksiftEx{sO_3Ykz>hz?GXSExJ$$NQnjM z&RP`}q=+eKt+X^vQk&*;T%0qlaUrGza{V})bI;72nR(yy&fJ0j_OF}Mt%>ID-8TTC zP!ND>wFbb<^wclcaJ#jE<67XjiBqm?08UO!0MM6+1K_%XDG`@Ao6Q=4!fpwGndxh7 zjP#s=jx{jrIOfO1xFW6?1HhF>kEJ~t0iaf^wdHSZ?*LFL2_ybzAft#~M}}I_3~1ca zxYClZmbM=#BbVpr0f@&$6HjwF0P^eWfFBu{RdqKNL0Azrwcn_>JGT?WbX-I84h~n4 z_VVN;0G{gs@Zs(Awt0GHfsE$~Vy$6RJHo2&Z;Hqwwcge~s0d3s&eQf)ja%x+blhrg zK^BgL03R^m+z12=K(WyPAm#}MM|WOVZ%=`ZjmEZpxhX2Kr^K_TW^4d}&4Q>RnGodt zjba3Rz(BygdI5mb3-5rV8g8i%suryJ9YvN`%@mC7(f-js0Cx9;(Nr`Hz=@{hy;$4v z*S{c8ugXrh$5Q~rm+}A%Dbk`2EU917T1TuV&cy)O+n0GvxembS*(3mqD;xfP4;=39 z_VsZCu>9&10OyCLcFno>06bCT_WaierN5$AYn`Hz90?ar-B2H?Ts8UXtxdEqR*-0aGW ty5|i1wx!b};dFW=-0gY)90vYc`wn@_wO|f`xaI%=002ovPDHLkV1h`6Ji7n@ literal 0 HcmV?d00001 diff --git a/data/Bed_Red_01.png b/data/Bed_Red_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd6d8a0c43445750ed70205cd3436a2cc13aebb GIT binary patch literal 639 zcmV-_0)YLAP) zO>0w85Qd+dnJ97@4*#BTmS?+rk9%mcu6T>v_r4gjfS5`ZU#f&uusz79Ys44r{w zzi~SXTL56#5x~_j1i)zgiZRY$F;INCWB~l>X#f@$ z7X?|Z3c$x=QEIPHdt+aaTPmN|2^p!~(RD}>hn8<5 z?dU|!#N&O!fW0w$aa`_#w9NeN-2(u;Q8{sI^H-M!vYMCEn!48iB8^N~8frhd)Ta#C zc6)Bh0BnA*NJ1!x#zusZ)VCS{bwxU-+VC_#qwAi2uLi#Cd&vP|z_wf0&KQ85AF2f{ z`cS#ih3Jkl;V#br@O4MN&*#qr@a*MhXD}Iv%-8vm%bu+RY?q~5&P}BOczo}QXrm&! z-`zU|;Q8v8{<;g||C+e9MMKuI0}x!FGyo%`37w1*_w>c5{(cV}y9I%t3IabhFmJ*W Z`vZUkv@r;19aaDU002ovPDHLkV1n8AAK(B0 literal 0 HcmV?d00001 diff --git a/data/Bedrock_00.png b/data/Bedrock_00.png new file mode 100644 index 0000000000000000000000000000000000000000..51aa3ea503e418b6b0541b95e7f982f70a4893c1 GIT binary patch literal 2042 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 literal 0 HcmV?d00001 diff --git a/data/Brewing_Stand_00.png b/data/Brewing_Stand_00.png new file mode 100644 index 0000000000000000000000000000000000000000..f42cf369ea1e7157a0f453c3511e453f73a9e037 GIT binary patch literal 1181 zcmV;O1Y-M%P)H*Vax;m+jc z^PAUQKEHY0{Q%HLf|AMP8l}`;%d*xwj^lQBugaczFa2i1As@@YKD_Pml^v6%o{^6B zw%0P5Omc2+?zct(^akwTQV+uy!+ITzF#y;rrNX6a6m=gMzd48Re{9{8aG6$7>_Dwn z8w7B!X#hfqT{_f3Ru8yW(ZAxHZw1hGZa9Onw27Mqj)h{a&2{y|LI^}rbWca{j{uzW zUs4bwY1dp&WN>itfzEF$6|YN1H!*fK2G8>$r9`z_1?L=62)C(8I6gl9$+{SQKjm0R zITjdWpj5}6of>vOS3`d`1R(^eRO*{}=znHW?PxZeeWqy+06@&PZr@oYVHgG|r67c( zXC*=L76Bm|Y}<}94!wFq2rPu5+f)GcH)TVGI-meeBQOjD?XCkilBef=nQJP*C8y&q zit*=2Rs|HHP~tWoAp|yKuo;S%f4(r=)IwyKCNWGChRN<4A!i~GGk`1$001-1c44{p zzf}pp1MsL)D!e=6Y7j*MnU??nhq0$iU8|4JB)cCuvVXtbRDhwOA%AFSXfl&Xylm?F zCMgBL6)-2Db!d04D|B6_R?L0X^ZoIG?c2MXk^_S$POR`Ml_R=g{B(6sImh zK19>tSeCtd)hfhWTfxf&QGOD!1i`>Vy{NkF=tw3JgdulK^CUCP--mO#dw&gAcXuC! zQg7+HuJb5@5CQ~%6aq>qIF5sA5MXq&h>mmy*4k}gZJnr;N`RE`t5r&X=MBbQd1}+9 z;)XSA#zsa*Wy20=l)|so5ash|Pp1)UX@Scal%_#O5yq}u!Su`wx;i^CAL~KdjKMFL z!J`QILIIRg7>uFL`NO4R@ymsL{t$pI4FeEDz5vi0asE;vpC>{H7@7vp_mM9YAf<$q z@_HBq&dl^wD^(J$EiG{4aZtlR;CYCY!u0Gcu1!sWN72e9wPbq+2C|&>u?+g2BoM50Tvb)Q42#Tr6hpQhjY2tm)sNX-mxPa z332RJxjX{k)8SmM`j@r!0Nw?#69AQjz^~O127y#codqyBoXcIf@20c?$UXpX2VuCY v>icH_d@!8LjsE8?_On~JCYC=M_o_bt?(h1lihz^i00000NkvXXu0mjf66+i* literal 0 HcmV?d00001 diff --git a/data/Brick_Block_00.png b/data/Brick_Block_00.png new file mode 100644 index 0000000000000000000000000000000000000000..50a63af9f3dfa9a3fc84d9f3296857b07bf73dd7 GIT binary patch literal 3403 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 I*0#Ipa1{> literal 0 HcmV?d00001 diff --git a/data/Cactus_00.png b/data/Cactus_00.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5a62e18479689a5d9710504259811f3a15f08d GIT binary patch literal 3061 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 literal 0 HcmV?d00001 diff --git a/data/Cauldron_00.png b/data/Cauldron_00.png new file mode 100644 index 0000000000000000000000000000000000000000..8a55601791fbd41c634f46cb987a5ce6dd1bc404 GIT binary patch literal 409 zcmV;K0cQS*P) z%Syvg5Qe`>X=p@Af)=R?Qgq>>2sL04bY0(|KB;{K7sZ9qg;k261urEDh=F7i7wLcr zY3W5Uf&QCA&Y29EZ!RaW)KdSf!YsxYtyVaV-BqVEwcnLY6G%qD4J1%P_J5&q7pRDHEt8QJ$zoy+^s z2=n_Q5i-*7eI*;`v)c+qDe7XCZ}To7c=Y zIVa~^6{qz-0Dp4#bawVD0r=ppz0kmCJAwBHPwo4?Vb3FIIk=9EWmyD48zCfFUNBuH zOy(J<<9MCs>MsR+;q}v5@ns2#3-Y}k}Uw^khUVHuI@&2$L zefjV+2S-BiH$hAO?a{z_=GIZf?Hhaeo&&}p1Q@NcEE}(N36-W9S(ejiO;uMkTC>yb zGU!JPx&i%;N3Y{QT~^JfvZB7e-w$4!uCwjW0Q}l>#~;$he7EIVzj?gpTStR7p>Jb! zgJoHGo`Yqw*y+$}Ie4y36#CXCDPB&}^7mXz zd}Eu}BLMq704d}R-;+DFYO1qoVXL~4y+9Ip8Qo5sFboLVZ4iR8s;Fy)>p4VWKo|s+ zRY+bGk@_mLP(TSG`hjDZ8}jz&~B5YDQQ+PT_%j@8E4a_p00A87L^Qq z#}0g#B&)ar09vl(eb+ne^;~&A&*fyEsmZ#LX z=P~QJRBxW;a??|CuUFHLJRrtsO%#Q+eV_F#a1_3*}bU6uout? zTU3=oYkf7qWf26fS_RkVLVIt{#|(KPQ$Pt5f_rD_In)c zgk0ZGVxwcUU_&p%Jtju=`g`@>hr?QBd#CraN}^vn-A9Z4}Wx~?vEGrx-Hoc9lD{9=eiiU%zB+MS>`yl zU~i{Q%d^QQ36EOvNC_ZL5;mI^ue^AZgJFlQgu~k})7!hr#rX;M&%eWSH-?0_T83n*>ouzRk69l5I#rePweQWiHkc8%ZIsdoz_Khx^Ni&t z$M+-$1D~kv(e_(N%fc8!=ItGf|tTj{58b zn)7MG=}Amk8&qSsKiSf91-pHpe#ghLCAMu{o-K{S7!X3>*fu|X0Y5ecbzL*Lm~!KI zk1z;GvkarA?Cw8{WjpNd^m*=@&*WgsTkkA*{jDWJz_91Bw-e!e4o%abwLz%{Z46RK z9NVU8G+ADtwZ3``4IreTR+`mnL(6lCIuTBt^3D&xN*J`*@49ru4xOmOY+WG45=%;Y zod78ec~O7?{jSZ9<6sPAd4W>zIq{eQ$e;9psWyqCsvEK_XEt9lpDjQ)Jbln+7z!|o ztSAr&o;p6jaU8VKBuR==3at&bQb>83by1dVlY}hKscJ>7G?mhTd3YN=+y{;Z(P^#p z8{=j9a?|KOs=#P{xoDInwrvwd5!z^qvSPl;ceSykWXlagsNGW(=QPrS-qPC;k|~ zPe8WS@gV$`(&E)wtcUAVz0h`%t|d@PQC630S5d>g2TMI$C4_B93L46?BF_tyYRIdG z=~}6E+Ptc@`5lA!$||kupVs>sfOp+swAjYSgXo`%+WgCCS=}kB=7#TpF$y6Ci%r2h z<5e|X&o1JbCuN90FSuAXt6yz97KP=Nt^!| zEy`B}^afp@%1G{yV?AFdguX2;DOhf67F&H<)#ft@@wsJEJ;F#R^Dso$G!L0`El-d?>VPn&+hF@96cNX z09X>SV{43U(*Ixf1Y19G_Ut?WIG%{u8XB8`x~JO zqR0^AfOc9DCC+2YA>+J0-Dgnyk-O%BIa|rtw6dk2%E+&*{Nam)n#gUT<<*$U z!y#V&1b_eCVj4%l&N3PucA$KtLBqt6NTi&WQaa8x&{Hvy-c0d&VC>S)>kUC1Xv=fr zAOmgLj8|Z|g`s~HadmzlJ$}E&r%y@ue)xp$2P@#tr#;%a8K#&l4PjgHpN*3TXCM^8 z<%#oK0M;4=Hx+_;Vb>cME`CXa*ssoiC{vr>HCu$@Dy*)9bedP+ofUKELk01THX^vdK-a+rh|=EC4u=qPAIl;5f<0I!l?wt|fT@m- z4yph}2DI--Pm663Ru-}#QG2t#4nCvL!BD(2;^J$*h&l+J#Z1~SuZa{`&8ziui|IdS za3IuVdbhFS;%$0`Jh2MZ-_wK8LOqE5O+!vwRg|UL<`vLL-FN1#@V& z{h>th;C?X^b~YQ|dMftwolIIiO;Ko&qnPA(WS^iW=fMZZx#yx+0>|w)`gpP$sqtPR z5ULrlG(%nZ&9y0A?KNw*Wm39~XN0n8fbhvimRpVJhEAe3NI4*iE)qX;EMLv7$_`V% zYm>sSw8iS*?rFdbxi#6S&(o2KL8OYSzT{Dj9Hm~DXFmdPq~jiZeAT+w4};;X#lp9L zKGN(YAIvh(>E3A|O$eHrm^hK-?CzezPftxT>gRkmO|`cE!aj!GGNH&T0co7`Nk&pp zy;3CzxNn-TP>+mCL8;uvvwtO;;@uv1bDQw1FkyvyVIs=6z_}Y!*FHJTPj#N0NEycv z^b#^JJ|qiqT>oZ9TEY_qJjgN>N9>KR5tT@aLxt6(tIIgp*4GV89z~Y5*r!G2qQv`Y z0?dTPz~Q?rM#Ys@Y>U295)uEoP?VQbpq{9v@wa1>9sag=BMP(UNiF;`wM*K#b5iO! zq3WcjUB>@DB?LG?O|A;8G+L6;@o6w*WSn>5DJhLL(jhVBCwQfW- zqMJA!&Mz=kss}7eaOUWJOqByq*kRx-IP;T}(`_nCS3Gd}n-Aba<&<%?XOzEj!UOMJKRR2TIZ7fmx`o zR&A|44BC!6)p=P;dg;=sv`p=a1FP^s7hU3Bf0Lc#MVSRRddbpDoy{1x3G6hmoBw-q z@;F{haDQ~V4hP|0bTvR%{#_1=KWFBdw`Wj{%YLE`-CRc9bS9UIf4U;Q^wUz} z_YMs4IkGfBxO5h}87nL!aZ`hcE%V7~X=&rreB5V~K`cbZ4$fR~p|Dkyu3Rpoi%|3u ztt+P_tVT>0iF)M8OWR6hsqMP#0!B|~sd}KP8blG94X#cbwQ_Rk?G{kM~(Q7g$V%Bx42G?{^!F zc^w8eXYi8wsb=C%nEOPu&rn$13|G40?yLt6sYLZQNy-=}5PThLYHMy>p*tn=txJj` z*Ag%xN5yS$4Eg4Ep;QvOE7T+In*g9yT@R23AsT|1Muf+{tGA=3d z-*YQ>wF`pkNsYkGH#F882-CE8Ex%UT)8n}NPe`D;kfW!A_;|uiOvJcOf z!oA5U#)XNX#=p~@)rl$2cHxR@riwCl9|8J5;lay>nf#OIt=J=*P!uICx7QLJd_3oJ zJ=JjnZtglD`n3bLQSi6f=5bQx7asoCJCX<~lFEwc0R#Q}Les$=#{|~v8m4La~uIO0C?QfQyZ_~+2c+|okhi=%X&H= z1{+3|kV-gwxu8IF&93n^r)7$CC^NgB=!UJkjgKYWP7oljE;cz6SmAY&63pdeQjF_Z zUJ0#pSDO;PI7@B0)NZmG8r(JLdd!PcuWJt|l?uOf?ze#74jGDABss+<*5J!X8Fm2G zy_0Sry@2>QJ*{1hIga;@4;kMFiIq}0OBiDwC9A0Z9OJ@_ zPQr;4{(6$t5%Pe2Q6 z9HWs5S7wFPaf|LW}A+hzG?iAjpdb=sOsB)%wy$(R_L8Y$T^V~jat8Zl$`7)40YNJ1s$ zK3mEqgc_GN4MI)Pj$KZ6w{4Q`R&t3rpVnDtbz0}FZ$00$zUTeD|L1+)_xaX(le{Tz znra4W003yZlU%8gH(oNhD)f$sikgHRjOFa<3;>m>>hpmspzmc7R5t=pt}q;0A{ivA zCjdm513+v70DOT$vF`yufCGRJ0RRAA1_1rAtFpZg(10p^kDDv7xb);T7Nod5tgcXxH(?|Z-Ol6z?oZC!f|OE%qG7PYU2-(?Kb4LYf10MCoO{KjzG z<|K6!R9ni9i*FL;n&(L^EvMG&n~#z_;I1JqZxCx$D5h-*h`jvv>Guc5o`n@#%kDfQ zz9pHk_LcYv9#3Bz+ZCUWSgeej(ixjd&25^a5G0`Wpbz@pS8m@4 zg?N{#S;Lyl{U5UmEH`qp2SsS<;>cL8I7a)<*9R8M@~PzQ!C7~`$Re+tzx3C}$F)W) zg0=?Q7--Su;zgh2iHR!1g~=!R@i8}s!TI?li$B-HrcVrK%U@{`Bn-)#kg^lkGi5Gn z_PW$tb#-pEK2ixnCA1GEHPj;>tL}JsskDY8c-b(S--Y2eeaWo&G_U^n-kjP$MRQsi z`%O@-`c+nQ6dFxvH!SH%&gl6-YMKhr}%J@KgSNLTQ^V{6BwuwlB(G%p=8os}qL@S+X zDK$2el`nU-Hb^!an{?v(kIItPAGOy&ZSWyG(mke*m%Iz)lqI1M z1mm>vf#oVvni0%daxz1k!{OZaU%84(PCzE%RXRcnD>PBjBHP>}tTM-`w(NGVn7JnL zY}b(^hs?wJw*++_&ZW<1O~1yJ3GOykQtXjW1RFe`zG<+Kx+ZI(%|t)v)zIw>sR!0p zKi5rXz7tU*2Z|9YN<+`58nLNERy)Gqzaqx`;aD#oly{_u0EL?Ha$i5c`WIraGik3J z-%cRM92BF4nZdVhTXwV;-0-y;v@DxIA?U8?6yfTVPC<@URC1diqewTDH-^jd2$5AE zD85|oG=3n@D*((Ukl%^UQPmh4=;qN;4AniO_g2DhLF) zPic&KCVlW%8*UfhmeJ%3RY7R*bksb*E*_y`f4R6U+9fF63#SHiOwEuvt612 zWoA-WNm_HBaU0B(0Jq`pxyU>mKC$w7f4^U4z17N6UMRvPpwc&>Oge1!bm+E{2#2GS z@C8LJLB})uYgFD>%_A3j0ENAFUXk2Bm74qz33Aw1R8dZx_=t1m!bT4 z{o%BDL{Y{#%6OBVvYVV1rGjuVO>mNERl=N?^RKPY#>0v-5)cpEOgg*Il#g5=Rt+&W zdr>=*f}Xl@&}#FG+WX?vUV}Vk0)m7hl`JZ%RM5^Efy@?zfCx@?dola^a86_IAt3So zg-4Gx&C^$ja`x%2@O=8@_s{n6&EnJ^Sw#@pQW~Y>cgQAIH?GQRV&G{l+l;6Q6|xL! zXhXZO*x6{x)7t&CQ#BiiKgR}`J*%>^$8D^xt2<3i{`^@WE3Y7=DM{#|&^mDT?!v2v zBQ4hg&@QV=AMEYZRM^+n*80dcYLI(-cf*vvR(iKR&ql0H2;eyUYN^&R?Fidb0Ut=u zk`y4V#JlfN$v^E#Rn9rpTql_pornI-iwBM)qL$yt)+^Jb`R8YBO85{FKhf;|60xUzj&yH^fm89%S+Vg0|moFgNOz-T9v&2&u zE_C;rH_r}y>em~Knxh;OZCzFyVH|b((boHX(1r6T&+=C9o5K|s)~=LvBN>~O(aNhV zI|Gz7C?+NsspIz+@8{=dSva9!NM66ncd?ZEU}Q~|&KH?-1THJzQVo#R@^%h#eZgfk zaFG!H$Ze+tLEq6_KE2S1y#EV>;S$-U6MRrHIA~t@`g|+hS>=N)e+1M!`(Y%Yx1eV9 z5sN*t69!X;8aEg+qV3vdiV!U{!Apzr&YKm-TK~FK55u-0b0nxxi#uw_X^Y-H`k`4A zmZj92OfO^Z9Gi2h&j|dR*WMU($$^A!yh4w5CC@sM9d6cCDF;_hjA4p;#e0#Tx-)u& z`^eKs2BzbqAsQy|uQ=0dt7$>WDd76adp=W>Z{}zd?94Kw4wGl!wiZN*ymf~rr>5$& z)kp0;+wY9N;FNztId~s< zrtfvt!3^Z&lF^R3S~2OSlpOHu!kS{`ni8~`q&xmOe`>ZaQkeDlCQH&SNKSie;pPA2 z#3Hb~a%X5_+4Wzbs{?^g^yM>nTrTq{AK1+fWg18D1mO%OXdJ@lhk;nEkj-IZxa^}$ zJ~M)kfgE;;0$q4?dMFg(9c5y|jkM)Ten$T+ik~L?{3Y55S{OI_OYWN z!X9I@hd=-U4d^xrkiHwHQQd*yr4z$qv5|q{SfNn(KhE^q8X~Z^SljK`AC6XA-P8oq O1l)-f*K$HY+`j-*Qp&yn literal 0 HcmV?d00001 diff --git a/data/Cobblestone_Slab_00.png b/data/Cobblestone_Slab_00.png new file mode 100644 index 0000000000000000000000000000000000000000..d6056446f8fd1f9386bb7b047356856141fd203e GIT binary patch literal 1859 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 literal 0 HcmV?d00001 diff --git a/data/Cobblestone_Stair_03.png b/data/Cobblestone_Stair_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6093e50251c9fed73af11d67bb489312465da2b5 GIT binary patch literal 2246 zcmV;%2s!tOP)SceG(3czja`(3lY`;Q=g$o9-o0bs;o$)}4(O0SumAu1x0;KK zd!e|v*x7I2zWrUdaWh_rFyoSqi;ZUZ_xBG2BO{~GzkmNKSy-5RSeTg|fWGHuWMX7^ z|NcG0*Kgk#n3$M>Y8V)P{rm}JGjRh$!IYJa)%Vx0U%VT)Y}-#L7_f$bqrEKyGZQlp z&>}B3Hnx1Ud*9eFPICJOsE{*bV-1a4i1%_n#Ih7SsL@30S50caLD`tIs)Vn zP!xcC4NSNUz#IUMDo|Ph$rEw_6HEa+J3GT4V73DVE3mL(U}a@t0HuNNKfZ$#proWE zD4Q{S0_OcUK!<$<(jXr*0J8%qw7`iHSStPp7fgQ`K%oP26wx67%0i%E1NrFP`*%Qn zjNlLv;O7U&?ZZcpAbJ1mHwKW4z!m{RfDxD^Kv4q95&t0x0GM$9fujiI08l|@Xkf}P zVe$m5Zh?mYDAj@r7EmDrO5GsMf1q&-ic?TR{PE)_I0_h`aSKi_fBrHsF*1UMKzs=P z4NSoQ8H^0{v;O@46L#|CQ63936RZw^rvXrqfqVr@M8AQF3zncjAp$Jj7`}i14z?VW z9zgOSwVH2JQfmq0GSi3<^$=!Ju>iG8kkr(1YN_2{Z_tzd?@U0HztB;owpboECtgqN1V< z3=Jl*LqQINl$!rJ|Ni?M05r!ASfcI#daxI0`#G2k;B|q#tc(WGw_!ksFoP`s`izH{ z7nsHv!M+DM29zj44h0p%ppXJZ6B{cVgMyqautMSn<^VQux&cKQC{crGScn20zzMWe zmxYbZR$NT<*wd%aUVt0{4*@}7o(EQ?48ZamoQ*)1ffR6ab1?`A@H0Gq@)VrkLB0Y- z3&+Aj6hcCRLcrX^2ri;QMLBvAjS>aGf`~y_SeOAA zcMPC{1sG(&toW0GgB?_;{9^$57*yz(nVEueAGj<4)*E0)aB^{hYeZ0D{{H44G&1GL})`Svd`OaA=%i-D9P8YKjn*_eR^$RCEUUw(lTDJU`i z`t=)JDoRO8fD0mEHUj&ci;I(i4_HWnO298b$NvInMbe9CxC21J2dV==K?|w{K}9Yo z+kt``WC1H18@L@H0BnAN%6V{g3v?zoH#a!pg4BQh{Dt8gu)JUgss$Bjup%0iP+^G| z6x9q!0PX;w^Ui$RY3{reX;g0OUAOwu40xC~ZI*B#huF1LdIq4F9hK=@uZ~3{3F9!D$TU5_vhf-#`bP z23o!uXgJ6*NdhMh;e1b)cq9APxaWj}#{`(SgbX zP{Wj!g_QwRbAnpNSFT+L7t^rH3>4oW$Nu^Ao8iazAJ2deTMgvT09Ix69#!%={HPFjJtuIjx)f9g#s`nWPbhn$pkVSgxP^D9#9nyiURZ^ z8ki9O02``@fHvg=Lu(c=L|?xJHse9*iUAGa>=!(E^q4_LTKYdQh#ml2w_AV})f09O zHZfqliUHe{KugTI;U>VP7Js2KVZ<&P}2cMOC_+4=>6pBGe%&ExCQ9r_J0hF zSC|<7Gdz9voPk(Ca_<<_Nd={JV9wzD^zoDDYhe5E^XIQSfc$Tu0_^eAXAGnO0A3I8 U;^J(56aWAK07*qoM6N<$g6q-!G5`Po literal 0 HcmV?d00001 diff --git a/data/Cobblestone_Wall_00.png b/data/Cobblestone_Wall_00.png new file mode 100644 index 0000000000000000000000000000000000000000..9334f03c7026a67da3706b1dda11633302ef7541 GIT binary patch literal 1034 zcmV+l1oiugP)1v&>OS3ly65IOlOZBTA)6QsK?z2appcD-3JTe{@L!0af~(*{e}=epCE_lM z3WCv?eVhq8>Ws#jbLnecU7YB`O=`yMoOfGQZ$JH2e{X+qr2o63!ybI;h3DDX**OU~ zVDsDWe>jwnILx7EFJ4$~yYA}R+S-jcPHqBM&pmN=`7mAws=%dZo{nWKUz1W^?fd?r zJkQCpoUUz{&F0(2nzwbZBu*F> z!}G?NYqRO>tq|`xWK+4cbebrNi=v>e8>Z6;HHxC3C=0Yw{Bh?Fbybn38Oy_*-Q8Wh2V)G*yAbOz03igilyqH(Qi`%D zP)Q7o+1>q}>1@XSWP)=JDJ9N1k|fAF>>HR&CMd1ZT9aleLQ0ytAxRRNwxO!#IOiaO zuIrFelBQV@KoDl0XS7XA-*r?%pwk5mfKnQ39a?L=_h@4n=J`MC_XR-8nDMb=v`s@* zRdijCvj$@=NfOg_9a?Lgb3`J-7!wQ-bOqL0X45G}S#aXS3GytZC<;cS2k819?>(`U zj7B5ypp@e8cD)OAf9 z$K=By4<0`b-cwaIv)P<1&#=Z|jb(Lph2bzKB0@xADIWyjy#w#D)-tc=L_%PULTgRm z^)yX`_nxY*an9rXA~!-59zt4YbxwCllJH zx!Z1@EXzoe!Qxt!LddXDBWTx|Gmlf2C3W4P`kt~VcB33x{d-c%SA`HF zO;djTZ3klv^ZCqq&&S^TH-FmxWi!t<807*qoM6N<$ EfE;M_bx{_|f&d*M6M6 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 literal 0 HcmV?d00001 diff --git a/data/Crafting_Table_01.png b/data/Crafting_Table_01.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba193022cb066308378af2d7d00e7c996d76d7c GIT binary patch literal 1952 zcmV;R2VeM!P)4E;rr*W3}Ftc46LlI3@rctGk`)Ran?biLIkS= zB!s#DPmQwzTkz@ocQC!>{BtlJW+un5=*S(EkWO;YV3@!A3IjVg7XxyLfE48{K8`m; zSddKu1+}aM#Ao0B{6?|(A27~;{r$u6?av+%Kr(9zA-=@a^|s23DXN^r!)) z86f`uN8(#g9RbVMNziM3N@c=PlX1B)Ox!@}J+7=(oQ z7=C{J#*pZ$16I52*gXb@{|pS@fBj?#vr=RLrG@t|-ZE^v^8qY><<$pHI9BVY$`bF%(-vruK&dkPY?G7|g@&3*>pc;9mNInez744@E*u~lKXckelasI(x~ zM7RVPHB5|5;56cGD8azT!O2j!`69#nkKY+U9t`u)Vpy~5I>U$0KjBf2;s985{CoNa z%#8Ea2h$(EeP!5o;U$>;51Re_&1As*4W}N1X=Y|-1{P)(22TSqa43KTK?xB=gDeKo zLOi?-v(}wLaR5ph`1AKK*sxZLseu&!1UEi55cs$f+)kWJFghn zSed{U2=H+*bY#1LS`yh(0Sj4RAU-b@@4i2(ScIk`ut4 z20#t~8S>=SM}{}=zcGjiaxpx5{t1!*fxfdfkY@me3`otjJCHQ; zpBc6sybVkX%-|5wRTT$|%SiArzyNw8WP(Y642M}D$r5n=fF|lsG~3`I}D}c)8da zcx5?J3|qYA6qs+SBEcXA4DKty^n&a-5c|xv#|&(2EEtY}i@+>7bL|O(051nPzW)K^ z9$AMN4;urYFgL@U$8X@mm+nC72whcRx$yrFILrM<(g(5_q}W7D7OdyQrN=0afTw}a zKfW`7uz|WHgMySG11P@#{D#!|51)TvIB@1R!|msg;#FLf8*a$IzyHDP%eS8}2ywB3 zQ~h6Hwfqy9c3{5Nw+UqUEo1^tC+I-{cK|4HfiNh(LGdgj#?Jss10YBI{__W}59Bap zLw@{*R9bl@4Gia=eg7zT1GfM_Nx+aBZ44{zq<3a2 zsN8>L&&yBph&NV0gVlhig)x;0d6k7(8A5T-G@yGywoz6GNl` literal 0 HcmV?d00001 diff --git a/data/Dirt_00.png b/data/Dirt_00.png new file mode 100644 index 0000000000000000000000000000000000000000..48fb3d2ecfd20e21533057ae2694fc1b3d95de34 GIT binary patch literal 2691 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 QLd9l)y|oje0`C*|Pj>sH1ONa4 literal 0 HcmV?d00001 diff --git a/data/End_Portal_Frame_00.png b/data/End_Portal_Frame_00.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad3e288686e5193c8f47698613a8004eff19797 GIT binary patch literal 2298 zcmVXRY(TjuzC=#d`2n0wdX;$0WjllOG?P`zp1B^}Vk znOuK^8t|<<`shfSG&MD|n5pp6TgMS3iPcRC@1H9&vsmEHYnu79}qq$FQjqp#Xzv+AaLsqf4# zXZO5EIi0~;Dj`Y|0KVs;heI@WrBF1L4V?*Y9OxpDRVukOg9oR`$zcrB91!o!zeU>rP zs8uT6zU%foR+atv3WBC{dTfyo!UAU9JWZy|`ju_Ss!FX~VRHBs)l&Jg*6EQj%llWc zaYZZN`TDh_nj?&!J;$-(Nk+~rB4|4Ae>hDgTcDiH^?Nn98#pTil=DS8JCkU-z=d=k zHDs_5XbjmZn{V7Q(d(6sBfLm@1MMFqn5 zfppGd>Ae%&a&-%11&2uBaLw)g99+?cAi%fp*hE*WNqTXCLn9a1GkA&_OTaY4c$Uq= z;Nrum+d2@K2=(3MmqlOLUeT_tY3j?$$f`uvayXv0xvr;4txoGoBP z3}Uem{XGo~on7GVk#WMy62uxzjvu$NOBE{FJmp*oD^p-YM~trC4kBR<)%Zx*_X28x z&rGI_<~g*rG!l(RE)fVNG+OmITL)Tr{+%iQHdExzt-Y*W)l5rs6Y05mw6MVqropNf zlh^i7vF7F#93Ps&&SqKBm0)z=9JdX$U?!rdhDsUGwwZ)0TYBny^Wivncl8? zM$Rqr`q2emsknSNWpRB^9oe$ORLMaJ$@reng`Cad(~BfCWsXkfDKFW0mcyo=db(QU z)Hl^p*PO)hYyv+(*F%>R01!NZYN3LaE2Ek^$y6g+R3XtArLVhzk#ma-9vde+pGVdt zs&$`ZO z50XgWdDx{IX1z+tG?7$^a3V~i$z*+h8z)9Hyn0}QTl*VW)6>BCRGRaXS&oe6xwf~F z&XyRVh=OkFNV0^Y>Byo?Ay+_@K@>zBw}v2yml4RTnriEjuvT0sB1>SE%Y>p4oLUt@ z6G^m3Xi*H>I?G(MIfYlXQ3REI*=AkbV8cKMAzeoasR%-V=Q;~+{BhHj8cFW@;ovZ30NBt7kW-V;B0@VSY9IT7vJvwgX$ zhaPfj)$c~ldOfU#aD9)eRiRQS6G_H!oElZDjOV(Hjc1W1nM$sR>$xa~K{y&l6lEk) z!nQ4BS*aEZnP-8=AAR_bQ=e%j+_h(WyQW8WRMLfeqjd>Q3o9(l%z_{gZ>lE35Q>M1HPqvKKBrDhk)FAL=YpikD29wAE4EX%o~~K$6F>ju3lsm5z2L2VPqtUB z%8sR_{5^py=%NCWqB1>MAeYVH+8$a&tBRudd(ZQBKJwsmlmC^?XxEPx# literal 0 HcmV?d00001 diff --git a/data/Fence_00.png b/data/Fence_00.png new file mode 100644 index 0000000000000000000000000000000000000000..930ad7ef25c51b7d7e8d61d1ec6869e8eea164f3 GIT binary patch literal 1560 zcmV+z2Iu*SP)1=Apy= z=Ps=LXa2ys&%Wo&CExx8AhEtVL=0Vc+Q@#Jq``+cb7P?!*^B?`v zi@jYH_{t|wK1~h!5znP46)b2)&>sa#3BEivS$p-$_2K^hC|W2NY&5H-i|tnZ`<`om z_rxRL?(NDJ+<$cTltGMRLTUt2iYUq8*d{5L3k}OM?`_pf(?#E<{ZUGXVYWvroJg2> z+wq0HFa7M-fA0UY0_Lp>!6?dzk)r4qQ1Bh3EJGBhAk;*{BnZ(c`VJ1?HH)>45tgs@ zOvkp5DUB%r%m1=~*81zCAd&rH{BUK$Z`UdXxSoSFJ^UCgHmla?YvN zy0$A@@XL#x;gJKapG&DOfGDn{Y-_E{rfC8oAcR0EjjdsVsb&H5vsHKwrAmq;Z@s(i zKKS-KHa>Xr;P}VCSkXHY0Dy|Gsb$gBqQ;`Fp4KH%`TJZx}z6 zq|71|5K1A-CCa`J#yJLI3aNqWM3H!&TTK{0K91PQqX%cUmM(QJZA+k0wx2Lf`p6sR znvGh;U!Vp#T`&9hHfp8WILRqXInp#ocM!p~40x^u&vC(pM4WI42?!06GTqc5y_bK# zetug`*r=B1%32Rs)_XW`M+>i;X*HvaH3wmenW+kV$3|y!gu$3$oMaG!1BAl!Y*>y7 zCM1H8Axs&hlG~qxnaLWaC(9U(W2|qE&>Mzm)C$OR4xV#(u8q0rIzUYHMj;qipoY}f zw}QyBX|Yi&k}Q`PM+t-wI~v1CL!(hEqE;>;2xA0c2GgV;688&<4L6Wk?qGx{d(7whi?|k%Gx#K+WTAupUgL?>3 zAEqYGDy7ZMeuyh;eT?HAGp!P;B?s+h8SUl-1Q!?u(O|P5E(Q@h$Aw&a>PHv(whyA$ z^8Bxs!~2fS5|)ei=Tchbl808k1kZIa-Kqix(AgT{Ppe(zLZebHdYWM2Mn8J*+Kn(= zUK{;pTTOT~qBIAk1_%Kd7cgKzLBlW%lnOo^$HF+uuzJ0Zm9;KB&&JwjSP?=U+({Gu z11qatTw5O?j&r!C2|y!G89KcHamrzvHl~_oyy@;a?AzNynn|>36L{nN)b_{lX6$V@ zFbWf_b%qGT6wO)@QOvNqK7dIL-1+*pY}C9>1zn#gdCvT71HDlK#`*3DOt&j&)Qji^ zA>xSP#?~0!eh7man5<8LOPvn`_NeWVdcyLL4a01In6k?ncwtur7-x`5qf~G()2bjz za!|`bE(NGbz=ed8dh3hddg+H}&)oOCRQjma`juy%yLfe11d^OXD-9_X0ssZah38tx zBMzxF0D`|?{-1yP!c_oQcbtfBMiys(`^cd1iVma%xDXIrz@ZkRI7OUh+e*dTngS){ zh7xi~2qChRK?s4I3rMLD#<3WU!=)(BHg+YF-6E#-k009e6RmYO%~)d)#LXnll~U@r z0G`wuPdt0!FKfH@G`k&-z3*@%i1JfRNNA1o-}~twd-y;9i~JP?zYqNP)`j>00000< KMNUMnLSTXtuIt(W literal 0 HcmV?d00001 diff --git a/data/Fence_01.png b/data/Fence_01.png new file mode 100644 index 0000000000000000000000000000000000000000..b1770a0ba67f9731cc4b20b4289a4ba66016d9fa GIT binary patch literal 1527 zcmVkxvq=HzrF!+#4tx$>(tZ0gt7eTzl2PrDH z&_1*XH8llAAF8x{5xk)YA!$upDRfM0l5x(NIk(y8vd`Y@?t}UwPUsn@h~W3OSRdc_ zW3BHB{FjBjQ-;s1-A-0l%EjfnudlWyb~in;-;SUD>fPkhpEg&y)ThgF;e)G(7cVZ( zRi0Y=!n1GwJAG%bj-L3^U5&Z<>OEO5@tccRU!aQbEG^9~U%j#OiDskpnWz{XI?${F zVDH}^OdJ4T+!ugfKJ}?amWv0rI{o|Ky57BGm16bP?5Zcv32TvQ{r+l5(_r2`mU0 zbzqDEmmK>7(Ah~Bdr5kd3*p>)OARZF6->E6XJ-Oy39JP={V`nEL+A%cQ;x|rg*7_g z7XYJ0%@V>2fs5`=j&asSB@Un!KnNhUL=gHg%A&R1M>3jjQA(aIN8Xcr2DtFG57Bl% zJvdC|=`e85%++GARw<&hGsVXC7*XH@AW&LEX^m-`BhSUgG#Ae+ZJuGEmmj%s+3X46 z;d|e`@|X7b)3s7~f1_SGSSd#|%{Xqf22dbSN+A~-1_rql;JLIs<3DsMz9odZmS%aW zI~Y*_X68EZ+0%F4%cwrLvRJuoWuZofN?oeyaS!<3pYVlmD7~*<6S$%V(HwAEZCV;8n;EKUZ7*uQ^wSwdd zStbChF%=pBK_T$4)ckukFh<>4Ts##8KDK%zy!`qmj0GCin9Upm!%+&yap1auP#nF% z#7dzjaTG?{7$TLyfo2uAER`X(MxNzxJr|P{xVF(lE;LpatEiNUAUA0_y8`67d?^?C zrWA6i7&x8bgg+M-3s)S+d(>nT3=FfSt?? z5O~fHMya@%bM?N^W4~Xh7uL1G$ElU9SuFrogHZ~Xxp0g{Yc#-U%5h|+fv6b5S{Tmt zOWK+rd5ryJ&)x7Bk9~~2a*&?sT9 zR?-e-ZvZ%Nt-bK@cV67Onf+Y>&Yr%*bscuH9QkLO^?0pPj%tqUV5>XAR(FV4zJYFtjC~~D6MeLTKe?aZ$IC9JJog9FSynoKeXJ8zj>fkthj!N^&11UItdDa zgIXoR;c^*KRK$F}0M}(0=NvFrg5Y;we(YDRw_DzK1rW-d*w`LdKq<1U4Mr)J7b+-4 z0X)Zr)_{Sd{4v#u>6)PBXjBR)#Q{<-I0fnV23hmj19*^KAc-x!PF3T7-cM&vP+MGjJ}U7zLqZ{{a3~+T8()VF2HC zz$J%N3R(l9>w~8pT+9}LGXqT0ye*}?R0zCN7I1`AP)b271*McS##{o>e#bVWKW`-c zcO7ZGz$obgXjo(CIOj$yaRtDm0KW3bh07bW*xd7G^vSzd8-(B<-(e_6-izP+@gIBm dzx*%C-vFM4*(>Xs63YMp002ovPDHLkV1iE)*9!mu literal 0 HcmV?d00001 diff --git a/data/Furnace_00.png b/data/Furnace_00.png new file mode 100644 index 0000000000000000000000000000000000000000..583eb45ebda86645ad087bb6a9259bab66d84737 GIT binary patch literal 2205 zcmV;O2x9k%P)FxkOrs7HB(^X{Wcjo%?O?y)HhSnSnY;u;9u`&N(?b>;GH- z^?l!38$QR_d+RO9-dk@;KF=KDQvURvJ8sw3+I_~Dhpn}E?;ir5dj7?i&Hoi(|6OAx3n3_% z%XsJM5Bg+jN|GcdiVBYhf&Tfk&;8}h7XonLp1Ttv_)(VSKdIO2Bi?(GBtZy?u?Ax- zQ5XVHt1aQYXLMww5yypJE2Vz>x)@3>t`DffB&!`)8zs(!yuk|b2CBPb=w zvW&qXC5{VN=P>zj`@6j^-A;!jNvKpR(@LqI;(7YXr=M}331IK7x8R(+K}q>Yp6B0e zcRCb{MXHqwQB*)FiOCJtIjkKP4T1or6wZ0P_hea0uh*m3>rpP3DV0hudhZWf=MF#f zr)Mv!r#}AWj=i@{;{9WJp8uxRYF(w3W^{CfFboO9kRZ@_?{UuIy$1mTL7wM0=TJ%_ z1Zb@Z!jM8#px$WEsMoKQN6*EE2~t&RVRs%e@l_z}jIataS(hCO71HzWN@8A;uW$jfRS%Xpgn_fpU_(d|__x z9DrN_u*PhO!f-4If^6N`xU<$#uh$WPbB<=Sg^-d$R3Oj+0x-tnoI?nS(h4ahQ6VBp z5~3)?drza$zyp($ldjQdnq$Y0uWz({S$-EPmFK0PbjosQ1Z6d^v6 z-YP&G$E4|iJkKeY%hDJlrIhBf%Py0hZb!~9EKo_x__8Mm1HAXE;xoqJ9T;P1ciQy( zeMUw`h>6XK=@01kdfGdW^A4poaiOplAP7SyCMGb(&>!^4^Be)XSd1wai)P)}I$5jL zO_paY)oPTAMaIX+-GvKtZgFWz4+aCwFs_LU1&YNYS)Q*2 zFvd`;*C~~XcsEpfnx@ohb)qQJ$-Ej_$&<3xZtFNMtS-tqPZ$N5<;*a~fcI+wa$`_Z zGDuU-oIA(Nhcf_7pFBzF!Ue1`jE}FQ+wID@P(Vv%rZ#P&*=lj-%o*8iwzN_T?>t$S zBZR=@Ibj&!tOX&k)-GH5qflJ6VYO002tlvkM@UJzTplXh58HO+?RPjeJ4+A@_dCrp zt+nRVsnhg&ed(NIxGs;gmORT4Lg2k0YQQCi<03v+X%X+{)=T)t%sU%GlH z<#Gj&XZZ4*J$sI3vxRexEKO-On+yg6a+9N!BFi#7AcUY&sSt$WFqDiT%X3Oe38fVM z!C);wxl$$1GitROLI~EcpWxcvyV$mMD?t!|_jKBA-hKC7@PeH?cMS6Y7#kfU3`6ix zjAIIg0^M$xEE}#kDV2!hm`=NcvzAh^xK;yF3X&wjInQfvyiQU|*u85P8#ZjF z!SKNGz*4=z3opLR3opDxxm;%B#*MVwZMxkaX_k?uDLM!cLXr*!SnDX25=zA)LJIOM zLrO`Y1FW^fELa|^z1T9f=}J8JhhfOr=onK|oAA!jY&P&iBhYGhn3!U)7J-}!X z25jH9jfsf~8udDZbTFL2SSsZ*)>yRGZf<^oG)-j?hJ;~+_ns&WhlkWk=yhwD+#V-O_8UOs((d@e2yI&DP zJfV~vS6c59Agk3Xmv7mEbC%JuQAVm&N~MxJd+t1VFNG8+sqh}0vqL*NXPk3Sc<=AV z`#+zWJ)8e$y-&TCKluFz5T38)CVwPL)0;hj5IAcYsa8P<^Ve5iMF_N3dR1IfO1$^4 zT5Atl=U)GC=G1?!@tGb>?muv!OtbXfG)*5a6be^FQA8AmNGZ*sH{Qg1r>%8ZV-P~j zNU0t|@cZ|V9sk6u`2P&BGQNG=w~7LOT!`a?g+f#jLYlXZ9Kl+ropUYk{iDERC#FC6 z)Q6Ev23Q&Q?!W5_Da5b5Xa7GAA3+H5loax3$ET-f{@1xK2>{@}{rhm%ef_N?N03q; fnm+mACC&41xR<6j);b}X00000NkvXXu0mjffNwj- literal 0 HcmV?d00001 diff --git a/data/Furnace_01.png b/data/Furnace_01.png new file mode 100644 index 0000000000000000000000000000000000000000..17d1417de33ddb2954639923b59891d36a5f4cea GIT binary patch literal 2394 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 LYhzN1_KN!#jyfkN literal 0 HcmV?d00001 diff --git a/data/Gold_Block_00.png b/data/Gold_Block_00.png new file mode 100644 index 0000000000000000000000000000000000000000..46772f5728634cb8f1bf88e502397c5ac31edb2e GIT binary patch literal 2067 zcmV+u2<-QXP)6~}*j@3YT2&oj?6GwpOrq0$MZfC-8*F;VaaZ}bZo;~kcdAO>u>!35I4SI|%h zG%E4Z8;ps>AO#Zx5o!=Dv@@k0rk$B*o|p5w_gY?@=^H}C3j5~dBzv#*Uu*sMf9++s z$u)ZY?iG+nyFdHP;&U<>|mJtrDfDQ5dCzdp(VBz7K5l_4TPpZ75s1ygh;$}xzf6N9>Y_E?|-oN zsQ^BF@!pl?pBaFFAcm$9h_Z+HFfI#xyN z_#YrlmRu{1Dq6K&l~gf_$1Ht|Vhro2Ughljm+I4Ji|;-1s}D~l0Ak}}Jy&H-5JqP_ z3v;liy2x-L-Hq8GMsQ+@R!EWzmt;3oBF<_;th+2o#EM0Y;OCbpD`Df0e`f82ORN=B z)<3pcRq7%@a>alf9>MMX8e#J+qm92Y`A0@Sow2-M=q~~S!5NGy?I2)`MOAT03Mg$` zAhAJ2v85meiV;2Q4>9oIn`g2*8$tot}ZbMV$k`2a_MbhE392??v{k5Y}F2Jf1Q= zow2yju>a1KY@st!?ZC#Fmb2#q7sor4a|dwy?jo_4u=zIZOd!v2X&=x;nyV6IuNK4gAlb9aNJZ;_)(tcj zAylY?AQjDQ8w~~NZQmgHJydo;vhQwev4)wx*U54iV?rP_Gn`8?y&fP)U10?DIwB?j zZWb}w45Wr2Xpl~NCDK$QR2Az|Y?^{gFmbDENEjeTWr(T&3WKkJjUD)=LJ?fv2NWqw zR3j#FIG>Psa~%g1OuG%GLECt((YOSk%_FfP=?%bpGy)<}yxVaE+Zk{P=oU1JX#*k= z@8=**(W)Yb60E`c3~LP#Z`1)qcBS@;v;|BI7@J_T9QvK|nYu;l5~B&IVA?6BdK3I^ zETZ5X&gZCg9fxA)%p@t+=ZF-<5I!M9ZG%<~Sc{1fB!V%hOTaix9Uul`RTAq0GoBz# zf(aE+gR>9?qIBo!`iBWE7(?RwXyTCA5<_!^pVvqzu_4woObDHGpP)Vi>$>dJ4WXD4 znh8`5)D5wzP@6$^up_SMZWaY~2}a~zm8W~2ARhwFsmSj zYg@EaP01{344S22vt80^=hWEU?kT$z6HMAe+ZKZ%NiwXBH)g;D#Y78v26@^UoE5~T zymn=LhI1K`TU@V?akk4=v%PzBq;u*WCI%$7fD$!A8<46%twpUxg~YeBGp5SdtyGgEg|a-y0@WqC`xP!B(|)cZrH9%wCC~t1xP(o%!rdQSaA6~ z#aP(BSX3(Jd6)R7o;bO>_PL(rFZ^`n5O6H<_UQ7;FdOU@RNGyRs!4l`ti4mQG2KFY zo}|AB5{bnGEgPnlqnf6*L{5aZIsW8J>#H|4n4J9C;guvwA2T*SJh!jO_8jPAy~k#K z&c8L`e3<5 zrG*Y+DGihkMF+8=w6#(+s6kNkVctvfzV3TnN~cnu5WDpK)_d;ZaQ^rH0S^xk4-XFy zmyFLO#naGoC&v*0axNkf79%&WE0i;i(f!ShNWkgoEA%=wRvW5{^z!QT4 z8pTL7%-^dVHa3c7ory()vjA?nF=gC{#uidZ)j%($HV=ZKgObrDFiz-LwStCe2mP!Q z+Rj(I8mc)&sm)t9ddC)0$)*JW(4!n1QQ~l&AF{iv5ZD-Oi)9=GewG51vQn6j<#LCs zjzcayTvxMZtH3OP%(51<>obHhI zdYz&zMATRdr#2ck*qFG!G`W`3bc5DwhU>4zx)EKTPCPUzoun2moEvB_`Yn6#xTNLJ zc1TwRKl@^TrXQOs`P$tJ5su@Y o27D)4a(^d1mmvS*j>rGWPsHyFY+%@U%K!iX07*qoM6N<$f|=w+c>n+a literal 0 HcmV?d00001 diff --git a/data/Grass_Block_00.png b/data/Grass_Block_00.png new file mode 100644 index 0000000000000000000000000000000000000000..aa037d98b8df7bd945fe65320a432c25ad696db3 GIT binary patch literal 1936 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 literal 0 HcmV?d00001 diff --git a/data/Iron_Bar_00.png b/data/Iron_Bar_00.png new file mode 100644 index 0000000000000000000000000000000000000000..089b7d6c3701d510c649ee8fbbfb64244e770ad1 GIT binary patch literal 911 zcmV;A191F_P)Px-#u(x_z5(D`wOZY()oSNX41f?KD5X$JP51l#PYZ>DPbvK|48!0=0J7Pv za2yA=ZGY*y?n}09Uoysc0GEBWjYi`-=ll-m9QAsAC7;i~ z&lvk|d3pK6Fbw_2)&oi@2q7#0@H}ro>EFk5xm;&tWCV<{Cjo2+LGViI0F+WeDTUVh zjrsZcr6ftzL)!)bj*gDF*7`Ny_itA!mCq`b%GuNa_V)H(a2yAY<7|1Jcdp;>UlT%L z=mr>LAcS->naoGy0hzP^4lHGo2)@VZh8T5C4EwWO4S5JI)qCP@+i!0PJiA?F+bRO(Gg2!WK+ z0)Qxr6d?ovsPFrRF@{d3^LDLPdroVeKEUqo?wi?c7Mybn0JPRpN{M#6{Y|^wzM!>6 zHkD`QEau5&#GxwtBr@*>Ri)fkX&_QtIl= z%*@MaI)J&kxnyBs;XNV5l{k)n7#$r&sZ?4t#{53)kNc^KTrPJ5z!#|k+}Gmb;-A%O zwPM@$(~jd*ec!+Qa3l|N0IgO_q&5*fVp@70zz2koUnr&JgM)+K&d$!APN#FV)oShk z+gX+dK($)E3*h3$#>Vw1ioPBu>-e4 zgi*}FMF^}$L>2@=y)3ARo&?c@pol1v!(beSp2YrmAA6Y?w78T}}V$U-hc0 zffGBiW3VJiW|Jg2JBcr?`r~VBYac14z6J2dB>t?zsGkS$aTtaO!|>54ii&#z(CKt$ zrIhag_&3k z7|(H>3$E+#5kkHYLcHSp{_!Y~BuTKozWx?t?E6Neai!bsZg9@QIsdZP>%B-R9Y`rL z8jY$4h~xNK0N*jj?w^{PLakOC005;Fp687KpePDkDTUjqfg@9}va)g-z}rC(Jd>vB zxh%`N<45L}Pg#~~d3kwFYyC2%6qM3R6?mL;-mKT_uq^9CLdbwI2G8>_jv8s2zTkP@ ztPtW;Aq4jK_n)W?V0(M}nq^r(8e?GF_665`u+Zc{eJ%&DJ8Vl5&$^ow(tAc+uM7! zQh=f;ln?@2TU!fCso$lPD2if%G4`4<1_0#P)y}dE0NhFe7-KTebByo3p_C#F!^_jt z)4w{7gCGe0OM&Nkn4g~)l>+2>?u{D^9LE761dK5=91c%ut#NpGD0g;tteKgaQ;e~{ z0Q^!}BU)Tsd|D~>+_<;^zz88Q91hz>QJe<=+qPR}S^m&yG~PGHyt%ZrR8~2RKCjhk zS1F~JZXIM<2FtSkY_(eN9vmFp$n*RsO6kSb)z!amcd#7^u)DikBuN6!IsV^*gCKZB z2ys?Q`9Ks!zuoCbCljP#x?ZnepPQR|%=i8KwASw#W6l8RL{aqB-7Ykfq~Hu8WJD>2 zG3IO6b+5GB?GLJ2<&FeswOaoGI1OM!Yu#II-ifn`LiI UHN-?BuK)l507*qoM6N<$f*4JwW&i*H literal 0 HcmV?d00001 diff --git a/data/Iron_Door_00.png b/data/Iron_Door_00.png new file mode 100644 index 0000000000000000000000000000000000000000..b1cba66c95c74184c9b85a4ba55f388812292dad GIT binary patch literal 1454 zcmV;f1yTBmP)t8OERaJolXYWs;PH1r9 z?+{E;H*c=?D9H1hpKYF=OeQyqvOJR)#d|OR_(vN5XOU?RUAS=Zu};vr5J)-n-XqP@ zaU92Q7iIZInx!8s%+K3<3h>9b|1{SabCGct4u>&iT2rC@v;R683sM^!t7E2LpHj@E&DZjIu2Ib(ZJ9^WNV&b?OD(D!@yp zUz&U1D-SGkDK;q~>zz*L>rog*Q52y+7~tT+1JJd`*7nv|rRjM>$Q#{m_vZ2A$K2iS z=FAtl?u;q1c?%Y}vczYK=MtAr2`0uVyL7;6uJQVI}4Ip-fLrM^2F zjeb~_rAyzUjCF+&|J>NvI58fN=5<|< zD5bdni}!;uiagKT1E_QbV+>T1ury7dOyc_<^_OiFQfadGK5p>zNOIOp!PZJL@Y2gc(uilV^5 zLx&)x1SJH{J1C_>LdbW75KlVioOd3SP%y?21VMWMr%t^H*I3kg&)vot2q8eAkt&6% zsyqEbAKv>rQ^R?SE$BvF$RI!%Mth5>--iqWaL%E%!RoD5OvYn)??DKG)-~dIw><#H z7`$`X-JL+GWN$1f1?L=57-BFOpw=3VZD1M$?*YzvdoB3yKr-53RE)p{M;LT491d{w z=urR!NgQKsZ4Czw9Dukt01QzW!a4`*EL5ss8iP(4A&?R(j#1Y&0vSNIX+mo)KmaKv z2&J%10~vJCG!3k^m`uj#b-SRH;=uxx@DT_pA%y?|fl>)L=Lo|+HAK(>B?RR54{v`;S_3$F@+9i2LY8F+_CY)Win2gm zSLk#?5K2*-y}onK5JlZK*D(b^AjDp;wY6YefKdv%uSlNf@E-8+u-2if%Jvl4+1XCC zHk(55FAryinCWz2twlu$0vUh{0md0@W1wpdtu^YpZchP~s#T?ur;;T3)n}WV<2=it zb-iywhGt(8c;MEpRa8|8DP?;K{N&YF9f0dUef{;*agw}Ql;zWmvFCc--l2ZKhfWj$ z0GxN|_Ii*~!tF1nyT<(gl7uTOD|UH#dGi~OKfdCu`-d?G+L*%x7&MJRmS%{$5dhM7 z_}^Z=`rgN_0^F|4moK~J<>ie>AA9t##x#q0o{OR=zEszB)HDs!EG_CSxB7#p~Dqb=N%p4{%b;6=9|MK>z>%07*qo IM6N<$f^&1co&W#< literal 0 HcmV?d00001 diff --git a/data/Iron_Door_01.png b/data/Iron_Door_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1404ccf348dc39818daf85a592de3e5a0cfda3 GIT binary patch literal 1413 zcmV;01$z34P)I@nHl=ZEP}zbGa7K=!Y*_nLaPY|M5KZW?lRdoEmZsinzSxN zQba{8h!88%j>)DV*p|j^g8C5S(3DSU4R= z@ex7@_LAg>ZP)%4z5b$VltV4F^0haE?@pFt*UCxId^s( z$ImStT{I*y}NAtlPH zLb?KHN``F#t!Tr7a z)hylreW%rpQ5?O$v2pgTM;DPr2*C?fv&CM&{8inDntg)ZvjGHhFhXY`Yfe->h073}HlgXdYo!j```r4Xgj7^kM z&+qNse?3W(PiU=X&N*U?85W>zJKVZ`8`fD6LW0fBE2sP3ylsp*)i%vPlO*|ep6AbT z&i@8ND5Z2*fCnmAYf(4#somY(pCrj%rnSBqMe(~E8)q*sFE4|05m7=MA!Im!s;a;k z#S@P|0ZJ)U*Co?wvT^6mol`=H_bFqe&CM%cSy)*3c@#(Mlu`qS;Q)jXpp=0N4oWB{ zlgS^>o!j`u`ub-GV{ELHdOl0jH;bb9Ql4c@YmHX5!{xvOIjyw-0SKkzci!3js@D2@ zVHkd~X_}zuH3$f-bGZGF+qkiHV>kfM^S~GbB^1s&v~Bw}rPOJywV&rXe9wdMd|2mT zokd;Om`&+|KtRA4ht?WG2nfz`{8PvA=@Tb#_3G7OJdmdQ zP^tqV1kO3krc-QvumzCq{L@pz0d z2*5c9r4)n^X(2Bi#7KKT?*o;-=gBa7gSAp%d6L4Zyvq-lz#X%L1XeCdHvihj-rekcX{zDE!QIC0`>P)bo0 zIcBpdj4_Z>LV7-owIGy2N(m5P-d-@50!5L7jwc9$0E7?-Aux_2aK_Q94pK_^z7I+W zjI}VvpeT#s0E7@=hejimfN=q(G^C`UltF8Cm=6uAy2jq_F5dmqABO{=lmdroNI>98 zc^J}kX?Zvggy9IBA6%QA3wrMb%PEj{CeBVbrir`5J z09ajJ#hEi_h68BZ2F6%8I5>yHmr(`^0!Hb!04ezz>kx3$)9^rpY|@=GuE5BtrV3!rIQZH!TV;0JY6KR>_J|E~T8T_=>F Tj&;uA00000NkvXXu0mjfatX68 literal 0 HcmV?d00001 diff --git a/data/Iron_Trapdoor_00.png b/data/Iron_Trapdoor_00.png new file mode 100644 index 0000000000000000000000000000000000000000..ba26752ed21cbfd082a324ea199204aa921bd27d GIT binary patch literal 1177 zcmV;K1ZMk*P)3{PznuS^IfuP|+;h(PFQ<#P&{8cHl~R~z|M5M%d>7z9 zhW>5A+3s%21VP9--{!160RW8i2Qd?@9TN9|V*- zhovY=wK3lqW6m(fuC=zdPCQqE{{H@YDdlcY%DqC$&7PEjl(Nhi>z$vUhjs2fMpU1s z>5{efheYdct@VYrwzl#!2@DJj_>8fAQp$GU_t#4yR2YU3QWlIcAH-UJH}UWx7-Mfb z=f09szFHH8FwVu%($c6lrpsA-wzai2dTN35Jw2p6Z@KULyEx}Zl$4v4?}IUBtudT) z4(0m}z|Y2*Pp8Ud0O;_feBG0hF~-1!u*Mi3M-dWZhOD)xqA1G8aXhnU&z|&&0{Owg zChOdGA;f{e_qPN=0M7Xsh%PV8&rcX*c1j^$n}Vho2BQ07=x!2hzL>$q`;^#=EIhjmhS-|pU<~5#y$y@s`ZyG+cG^p zy?JD0I^d(BuRn?)dD7xmUsuAUYs8-$F!~ zoSa0tTt;189oDQ_gO%AVYHDiM2_e3`apT7Bg}FI^=q=9q>L`jZGCGR8ckiNDEFy{` zaK_+CiPX94Dd(p-(UpH(!^4LUQy7NJ0ql}e9`TjhlmakX!&-|VlR;x+BUZ0kg)oyz z0bpTqk;cZx@XPJnc=YHIQs=;hfKC!vYllE|3P9cuf|>K@&ZSR%h)$k7=_hf#&sp29 zjae@^SK1h8V^CLDhnE`~5XUiwZ{0$%ScDJ)QV0-ZF#)4m>#it{&kha_M$dGLKR$M> zekqD}3nBIj&RaO=8Lc%I=I3$m{(TS;l;$?5kZ7XR@N%E7Vcd zR$m6_$IKu-prtM8R?TUafp#iR#&SUp%B>mJK(_&%?Q5;*ZKV+AteWbtlN+jE9%B-0 zuM+O83G{n*&+I6F(yF4#uN*n zN}&6JZiw^H0J=ZPM;qwbAbS;HXw)Q_O)hqvU+ZqGD+Lq*y2@Ht+Eh~#r~qgM(1gxx z8(^G9IIG(m$^r#76~%N_#DI(tM-`w^`C$eXv8J)^nqAqp-j)gpURv3~`c0{pPWsZ$ z#nM^WgO|M4h&VGT|oEz|NnoptgbFFkujD8`2{mLJiCzw z2CHL#%^F=F9OPYA+21)ci3b=5l zM8@NsuBqj*me_;ag0eTnUB49c=AWRb?LJ@GBMIDdyF(jWLYr2s)VnaDH0)f2=nnsq z#DoiTW^Xym=3c?^#*j6TadT>F>P9UNjvHrn*pga)J>dAl9C*p>m9B$(RA}PV`}?Xb z4fbrGnJOi7{n#pnve~8`Nv5VZlp8}GFU82S3+NuP3YXd~E!E{U({W$?5kZ7XR@N%E7Vcd zR$m6_$IKu-prtM8R?TUafp#iR#&SUp%B>mJK(_&%?Q5;*ZKV+AteWbtlN+jE9%B-0 zuM+O83G{n*&+I6F(yF4#uN*n zN}&6JZiw^H0J=ZPM;qwbAbS;HXw)Q_O)hqvU+ZqGD+Lq*y2@Ht+Eh~#r~qgM(1gxx z8(^G9IIG(m$^r#76~%N_#DI(tM-`w^`C$eXv8J)^nqAqp-j)gpURv3~`c0{pPWsZ$ z#nM^WgO|M4h&VGT|oEz|NnoptgbFFkujD8`2{mLJiCzw z)% zeY~DCy?pF*_Qu_~s8?KO$9I)Thp`qr-*lMrYun>Riy}lVqSrEKT{ji=-7x9E!}{5| zp2en;5;1DKlBZ6eI(4orL(+_Qf(PDt%nuMyJ+{YMfnjx%mi7YW=qtHP7V{;PH+?H? z_Su|!ARumEwRIS)P&JQFq$AJk+>H^U9_LduJdK`J?*LFJGO_rZY0M{WVd)zE@!{D5H70 L`njxgN@xNA(K;!& literal 0 HcmV?d00001 diff --git a/data/Lava_Source_00.png b/data/Lava_Source_00.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aac5c7ac3060e82af84a8b8013bdd0f218b055 GIT binary patch literal 2859 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 imurWk@uH0Q2=Q;B?xpwzVT70f0000 z+pAP{6vw~6%l_@l?AbGW#&eFBI4C|yPrZ!)!Vp0u2uWB}SVG!cB@&JzW4#qbLeNW4 zy`(QfVK5?H5TVXIh%X7^;pn+J=bSk+v+tMR-oKtD2uyuyKJN=YEY@1z1x%STWy+K( z|98lLDf;BYxA~l_AF2p-zEB0cSe;XZT{(I7YxztCE?qpu<2Y`w54O%2G(5PcX>uVL zl3dAgEEa~7;(`R}o&Eef`BVkYfAkh_I%eCoXvYz8%MV6;W9UO81deUOFa@$KLy!PqP@t&Q zENB`5h#?D7>u06t7K-%VIsJuvEP=~kp5kE~w~0zRt|eP(9Po#m6U0f1X1$7~^Q-)?1b#G@#I&8HFOm!dnrcTex7qh}-o zfCKyX9T#f&t*wXiHB+Yz$40YZqhbogQHsrx4=+lf08k20M$vR_>~L*_QI5?~2u2y4 ziUp+<2qkFN9Jr1JFNpDAb%Z#TsM|W#X!hLF%G#0N7w!*k|8=j=0l*J4#FG(*TP5aq zx!67HA}ewzrQp;YaLvHt$|lwZ6YOZ%m}%P3cn(S#4(y*pno2y}oM35r1Ga6T?wBxy zg05@WKR=76TfypJj6ZHKV%y8GI!sXTIskwHKhI#q!;{EcGA$;T2m${Tho0dt()uYy&%eZZ7Xw<9VLW5-pSVCYDL>Nze zq?v?a3J9HpQ3_pfXq*Ejus#@LWn+w?mtc7#mnF0MAiSHEw0HftoAO`R@YvDAoU5d* z)1*^jNy~KvpJ~)kcMLE_K`B9$CJ4e5zMo(m#4t<^b4>@7Qj8`M)&@S-HY4fhMqd)6 zTPV`|`P#4Yu@2FRqc3vCSevM#lf_=EqUU^mPaRIxfNdBsga!Z@O(HBVZ(zHZS&^dz_WVm%_9rsoP z$@OYqXrikN+Pif1rhKYlbn?x^JWA4b6a{BUJ~`N^DqfZfgOQYeDi*-R1)*uZtJiPH zXBx*xUTJeea7bp+`80`9Ks!enzw*Cs literal 0 HcmV?d00001 diff --git a/data/Oak_Wall_Sign_00.png b/data/Oak_Wall_Sign_00.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc3b13f55559a83f64281317cf3800472332716 GIT binary patch literal 1490 zcmV;@1ugoCP))68U&9@5$t74br;iKZb~z0f;Rn#vFlV5nwtXvIpTctQeR3tklw zn_9%HqAj7J0WWOoji|K{D;}aZ#>Q#Vv^mV-KkU8MUdxL;6DA@}4~Yo+-mT4MuV;Vj zecuKD>yq`02S0t+1Mj|L(}9%prNv?Ooe$l4$MKKc|D(x&4B#uD+dfg%!l-iFjnkLj zcH`7BghwunR(?Hy=vaN-0lxIvZMiHgAUI=~>J|+8?ov^hr=8Uwh{$vIed}m_-2e{m z-jPdh5CmfkF*Y=*q2Kk)OcfV<9e31PeI%yz+r5X5g=-G*wJ+SAomFJ@aRx#YQG}*R zl!ayEOy~UO*{P@0aQM~X%JUC=`)Bc*0qmRGnypa=y^_LNa?aFE#Htcv!?+4a5;kq< zGCR|Gb@S}hk(oj7aKGCOACN8iUM^^#3o@?$O&%R zIAHS)Q?H1oCuat|M{l0l@VjlhA8y_>z}NSDFk52?F>!He1Om<~g|ny#Mg=uW&KVUU zXUG})9nU*%-SqP8boWUmKU!7w@9%l&@#YN!d}IFZoKhkqgwSA&kQ%5$B&CFRmO-x| zHcbnmii$F+0y$-FnjO&VxU(0R$3K17ZJU1h&RaJ8Vf*I~H?O}3cJIiAvlt_&2q`60 zl^7GFs%BC}yfbu5k1;}%5;RN<_l^p;NH5J0t^ z9->@W8nd`k-8$&`ho<^|*WVWwp8~$TeotM$SX>!Xc+2c`mriL(O=dI>)S&?cS?vQ= zp;tP(rK8D-rBTJCimQ{-)puzEn8D7>Lb4OR_N>LAXuxY23)e( z!)Owy>PQIjwPU!Zy>nYN!+Qkw7?n?z-rdq!ja-Pa9lI*tTIvuPRqe&t@s`3{j2co( zh_s&{SAo-KmI$%o$g?NqssQUQCzCVp6=7aQb`{RvjI>cJE??V9&TU&xst6f6r9%}& zAm>cV@Zy;z&Yd6fi|0?hetM4o3fdo()lD)+4OJZ(j%y%O z6b9!EIb~itw?b7XjvW8<8wXg^{LU=~VGF`uYt5W@=7vsTaYh+V0^V6lZ<*9>cT{x* z0c(^q=Z0Kd8uQF^e|z%)Yua<~`>Yz>sv`SD_+;tqChHWVg0rnb1(<}uq>7BI$f<=z zQcfKI&8fEzu%-jMK44>PwvpMVDmx2rHhOPx*5Irq#MbpyXgGa#kq{F{pZ)8#1Gs!N z_ik}HbC)r)Uya=3tZwL*9;=Emh7cpC&n_{l0!N-XdF=t#w0~}^&#)ahpsJrJy`AZG zTC*;kTV`cg@x;&nbo~I<#n-3I4iWZSqaXLq&b+v=$SW6z<6pjTx_jLL))iU_e6$YD sS5N)pQn@^=zklK{XMfE9_1~m_0vQT};B3nrqyPW_07*qoM6N<$f(U8P{r~^~ literal 0 HcmV?d00001 diff --git a/data/Oak_Wall_Sign_01.png b/data/Oak_Wall_Sign_01.png new file mode 100644 index 0000000000000000000000000000000000000000..29bf9ca7b3884b393978ae2d7e41f7e7685b88ea GIT binary patch literal 1409 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 G^?w3^Cb4}0 literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Planks_00.png b/data/Oak_Wood_Planks_00.png new file mode 100644 index 0000000000000000000000000000000000000000..e24a04cc0b73e6337ec423304d9ac041265c1e1a GIT binary patch literal 3076 zcmZ{m2UL^E7RNt8vLG$=uCNOT2qeMK0*Z7(Oelgtun7a5rWDp zMV2B(SZS`Z;0g*-HasjyHA1ATq4UC?ci!>sd+&T_zWaT1fAha{=bo7}scsl2iGwN! z0RWIdI@^2jt;T*60rB4vF)^R{<^a(KZ36)HSz_BbVgA2Bgol$YP}{FIw@>1oJ8Qx#_lSl%`$hnO znCyNN0E$>j{5~V3y^W_&SItj;mDEw+XK~ZUOO#q}r&?~FtZY_!+E8}0f*say2&Ag7 zn{$Fx1D2*a%RT8!yt?V1GZa(0Iida;S?X+8DxKr3N@~)9tG&60#<;c)bk=lyJ^vHq za76lKS8thgnZ?6tMn7%4XMJ~%cIoznpO5uwLEmM8XAVOYuSuwl`rOgQ7}$kd7E9#Ci3n}9jISMz-|2YFnD-M>;wT@E<}Dbo z0~LfrZb*3crSPow!!)(Mu)Mji0#Yr<0=eWeHgUf zZ84Kvj*vRnZSj+L4U^>cHS2}riqrxIlwfz~#vLkC;g_Ov?(@cLIF(m7Z`JbTB3+3F zc~-`j(=(~MBXMIYTRwLJ>Kj#8RSz>)_dwCh3sIrr=Tnw85-gXNPVp!mkxTcBPn=gs z)^Pijc{*Q)e$GiP2s`att8WRvH^YDS(V97$Ll*qa+0 zZJW6JcooR9{vxx~w%6;I>%9G>yLCq$GSlI!!kvQ>@|~J`!kVk}sxqtUqph$pO@sO5r&kT0!pUi4C&!N~m9Jvp9)uR#|S7c|U;9ReZ$&=q?=1(t%BbX$NuF4kzL$_?Xey?6%K3$#1~!s0#C zbYF=~`YNJ_l(%;HNnW$tnOX4-+rE(~uQEY$pJF|Z$Od_*B&OS_G`{s5DY;vTF!g#C zoS$8xxrOUlG$%YF`zRP0iams3{GeLZOr+(8k5ci0caz|3 zR-I~pfk`xqVo<>`>AT3Bho3o+;D}7!ybYwRNsM4m z(_m~_U2|W#>a=8T3aY_J8l+-)9Q$N63uR;~(Gz29m}+;GeNbDNO4Q>X()^tQv@B)h z*go(XWz_{G-wZT9byHl>)=;nb7UZ4z`-5R%nCk2d`S-DgfLQl>A4X5&wZvh04!5Ae zG$}y`rR5RIRWSuC^kH6`s92c6XLGY(y= zm4R^Q!b};Xg>+KJ^v53IQJN7MoyAUrOJ>XD=Q;~`QAy}5UZ#O)_WL`w5)XXjqoooJ zw9ywAJ1@VeBHe^gnsQGir@=)fU6p!EAeh(c0S)G3URJHxRvMdlgnN&M2zw z!tyr{2pM00Xz6(WBX1K8fslSxNesobOmir=wnZyv0`09Mo*Un_0m8?WGhPJ1Cx$Tn zTBB#H#n{C~CvD_HB7#dQxW@?uH(O{wzDaP{uRW!FK~LY#w|F$fzmWPew6nId=oYF` zTu*H+s4G}0ui^)ON!i5(C`+N9#6mYzdrD%SJes&7g20oRywx6QkCUUyG2fN*3dg~q zTpO9GmC&;^0i8tf0p0tR8592JH301=F*Y*D+E0X$lIhS+%?zQh7i!gUO8y4Hy$YJz zU2yy73#rB9!+u#X$r|B2s~8jEDOHDGE!71ktUi$(hQG3mCtBp3g7yC}q~(uDvuLaIsm2bO`)6Mj2PwPg zVfsy<5Mq_cB(#^QHwaz3iHPc?i3kkQ@>TyjxTgRUjp3ne3b0GsP5u$3n##j2y2&VH4~ z^3NRPs=@b?CLL?^9(OYkULC2WtW}DhUS`z%>2wc#JJ*&DDJk%aAGov&lIq;SOtbcQ zy032Arpadg$~1K;ch|7M$~EnXswJH;m-UTDf zX1DIh;Ts;i1-$J>F#Y!Bub<;+E^%wbaYr?mdZR67lgwi!-Hqj-;kSXGnk_^h&M+5W zm(Gb3-mQ*2v`ZJpt2w-zWF5(b3qD{U5}VwEz1noGd)vGEoFca?X6l{Ein;Pe{=tFvMED7i9jZj=m5+Fif%hw#%C12 z(fJqSO%9-w_K_S#DP2CI{0)L8QwelNC;|9uRuKLoS~r}*{7nb#$)^Aq9BKkHhMOL< zP_SFyzfsG6qjQ=ZLjcV9xua}t!)UxKe7DOtZZ8ic5V&762n6yYE*ugS74<)=`qvyH cAOr}(6!KriHHSQ1;j02j2aJ8Kt^bvO0^^K#5&!@I literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Slab_00.png b/data/Oak_Wood_Slab_00.png new file mode 100644 index 0000000000000000000000000000000000000000..32cf2ed704e892f91411d269d65930de57409ad4 GIT binary patch literal 2062 zcmWkvYg7{l8l5C$0%UlJK*DRFShNIT2$qMoBnY~Qh-g`j8qJ^(I4&z#tpWl`hz3!t zs8qwLK{ATyi(`0jVk{dLd1-*;|VO7dSE z>^Wd6kceNazbN6m#-GYNUqsAIZXIg+EOts@G}RyHH4J$b9}ntLkCl) z&kKkZ^tmG=XYFU}@dIc&nkGy)80VY@T{KLwzr!&b*n_1~YDD5|Gqt+j<9-%%sMIgi zoZ~|3mri8|9}(gBW2!v4<@D*hVU_bfaffZsP)7SQnEP7H{S(5#oQ26nWjjYiG+G@h z9amk^Ky`I$=oieU3p$D^1+9#z5uSLP9)4E=YqPYv^fWZ{fDpBjbt^RlBc{mmL{Dfq zV2I;=I6GVYm?y6?OCqG%#MdXrGad%WFI12J?aNH{lm3wfd}!b%QJw^j^1XxC7xJN{ zrYUYO9@buN@Hb0lJ{sOm3;LaEMeIV$ zOsNhYOz};Q0E-VrfQK9-6!#!ZLD0*;0PAxkWy{_HLa-vPg(M|ZS8AcFScP^1%|Q1H z!F93=GaS|RP)?M{g5RP;f8B$=^LcEZAEH;#d8ogB{+UO5pGTjr9^M6Qv1j5IleKu+5oMwW03%-F6GNB?voHnqZQ zDk}m#8b+?h$38~NoCL-H28Pah55AgP4ERoA}sQoC}vHorAPnCb?`YCCM-@#EN(Ojt!yUdt981$MeaboG;Z=$ z!vJbgI8y>$^VF(1E?-`%TZtTQ&NEAOG(^g})4&Gi)~Hr0rt=?;FpCLeuYTD(3d(1T z6FD1YtxzGBwe5mCAbbWxTLnczgKescp4w}#zP$8}H&l*g8>bdBWsxwq#@q)aVx!){ z5O!4j9zfejNiVpYsdBNsoVl-==-2zo9Xlj#-Qe*2VTNK8?Xnkwc9Px2KkXNhYv^OnX~ zgEJiLU@X;@hHNXbX9)vQ<}AH397or3lh->lDmBbkqy|qok}mZ_%%oo5+$UgXR_X7MGa%N|liHAt{%s1k*-5wsl{T&Gk|%A@%9#vxByvt2^zJJP7fN_W?+} z2#8yjDsSThTPY<|mE?NGC`hy?jNmZ7?XWigiR$!)Hq*?-N0YpwX*!ij&53y7!S_ zB_HeQ`TpvuQ~#P>tmW)dCtW?*iX%uX80hP+@GmJ;LwxQzEK#PLd_E1qtvIkw<|rI=cLA5*MrjgDBia@(74(f!%5{RP`LID43mfrQA@E+@2{E;N?Bq z6q3=CH!GR6NAEwTB?atFN=kCWI$FFKtXAJQUWjCVxU{8H9PKx;IL%=SS}du}i}L}hz32y; zX}SEPd>XfOAwE3r>c(92%gse@{<6)-HQ~xDa0S0y;S|% z#j3IwUOY9MEIr{h_~2tXK?s)F+_PhpYt$n|#fSpLDQ^u@44{X|y9DjQ~TJnENTHO8s literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Stair_00.png b/data/Oak_Wood_Stair_00.png new file mode 100644 index 0000000000000000000000000000000000000000..11a26bca4c1772f917fff86844e2d18cd453c0ee GIT binary patch literal 2356 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 Yt^D~Sxi$QAdl~|glTs7!>_Sid55(+B$p8QV literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Stair_01.png b/data/Oak_Wood_Stair_01.png new file mode 100644 index 0000000000000000000000000000000000000000..6c04611ca28eb593094ba0c022315b0d63a2ded2 GIT binary patch literal 2288 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 literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Stair_02.png b/data/Oak_Wood_Stair_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cf68e26113a6c10ad47019ce9c180f8e9fa4d5 GIT binary patch literal 2546 zcmWkweK=H!8b32<9ACqbGBcS%S}c}f3YE-^D3vnWZjDk-V%S|9siZD*W_*lFJrpvP znyF3e#?7F;>0X(mVUa1ek6nE{#*n^reMR$q&UOEI-`~H#kLP)R?`hulO%8TT?EnC9 z*c=KQ_?9K63Kp901tf-yF@|nYaHSEd!0c4c^$dgg%r=zc1@Bd>l}#cLWBY z-RL9r^X}eWg;;!kX5!7Z-LWATGOS52`$Fsf{e8U!69?$FCy+8`} zby#5Nt*a{vlU$-p^2!VFnThyk?cYbQDVBpz^Iy;~%+wR09!Q@Z>Fz03BDmy~P4;QC z(Q-xmJ`0j0BUrGRFpA(f>y-UrrSrS7q{qKMy6e=t9z5Eqd1s|x7Bxsn2t4!fb7Ndg zErZcl%lJI%9*M(wrWrSo^$dabAIgPXy}cnJI@0`M>y~RK|*!`Rk#x68T)2GPGrsFIBsfgW=;Uh zjMJ}m?gN^9vu!SkYu&cD_a{YbNbv)Fu897@1`@*U_Om%5iq>ZFOiz$Tlz@_Rd&A(W zeEn>txbhsGu`N!mhI^PHSh{|0+}ek^=O}Krr1y9Jp7VL~S$q&D5caHsME|%XE;?7u z<%?`-YBjlO7)j5=4L(I}9$}!HwY{n-nL$P{EKQGDe2Sz_)~YP{RUR03^DJ7(U0g45 zqixH~l&_kVX}e!%$v^Bc%$v#?gTr5<*Nl8@7$Dz>dc%>mhL}O`sK`K9i44J55hpB{ z#Gv%U%HsRtQG_mB(C#+q%tr7uC*T$ZHnSq~vE}@Y3YOW_gJw^?Oow=mM8QG%CZ}O< z8Zl>4A*#ooOizv-hawNTLfpteh`W4Ob}ksxH(xqMD>kg5=bac5uL=T#{tA+$XDL~L z%Xgp`b8jTLcJ6WM6nc013PI{GN>CBEE0{h^?HM9r{~^g6kJT^(ORuOINvl{w1zaP} zl7loBSg)U_s1TSqrcFIiv1mLEaLp%|%MdsZ`|7VkHo8Lao`P?^d!HGnyQ#1ONz)r9 z!k9hGqAhVyZf+>#=plJowwkn~{cobqujRV=(&XXe*E(XMy3AuShoNtNAixK{RBBfb zZVFJxp@XnMl)BDa(v++Omwg43Xb&vQY+Sad8Do&h#-=rLw1>XTx zNh5~>?a5K0q07<^@0CjqIp+SEvOU!Gw;&B30y`E69GY6;KxeuGi)DPOfJA?Us0rsBrOU?uOOQ@^Ldf6OSf&dOlQnpen+4Hyp!( zJ?gIMxfec={8xHMf%OYFdB#Gb4gs6RbzXxNS@q+b?=M#q2J5zp$2%7CIV=R0+HFad zR}HB8AhlH{Ssq}ewn4-3{^@sP6xe`Y;cmV_Nusu&#LsDUvIP%-ox4S6CMGDu%zW!o zq6_G|R4SE*z9(>CuRs3_OJmaUb2nw~q&Ycp*Y|aK+)nSq;B}OQFl`J1AzIik- z6gnJw2ugt6fT}u9$&+!@6s>LO5`AYXiFQqCc$BUE(_XQGGY+s60V7tDQ5hRSQ*gSJ zCIrfIU~!k|ybXep(yHA#Wr_6SyqC0Ms}pq5czDq%0333b>!CzHzg{cH{ctt8YK-)& z`8b-QpIu+EL1bG=g^Hfd+cX(#t}yh*CcAAV>eZ0Tcj43|%Ht)#5QD-CoEcmcZk zl9RbH5lrX8M`CwQFz@>O*!yI7kj3$1=JE>7rF3F(*&7WxXHf+CENaBpD6$O@c}p;y z;k(6F^h>EdKLBhv0P(Jaw~IO7tnejW68(V=fVac=qL|S7nb{h`&b=wogl}U46(m8P z;j4Z4fCl+WkcMCCl(YbD-=ax9)B5h+aKQ}7*K=Mu%FUEUhtBVQZ9*9{)T);2fg)=3 zP3ry69E~t7&mqo|#m1}!++2xIQ)GzfDcHNHB1rt(a+M5`UwoPc@hTmv^qkdR{`M|{ z#Wu4o1>^8RvtfclooLV{cg6(PGhl(S2k^^T^YTPzBsR_1`Q%854WS>gbr!-i=5nn; zr6cQPLZAf~wXUQpy1Pg%;LwQa>whWX&aJ=$yC1`{TUxPHfdFzPCewI!D|YR=I2I5P zP_4wxeJO&`ou>Ix@g?4Q`&DPPeoVK*Mc(y?ZT(V*#NC0u1e^eUIS!v8g^r6()A(Cj zn$1>{M?b?wsY?e(#}pnSYWL*3StV{UA(yXKr?C|JleW*BR(ADxlFqD4ikbWgj$MDk zaGJnqM2iV_dw5){OrdxyoA+h|qdSMf@0|y>qIPhK#v!gox%`3AE*IR`&=&DzG5^Ql zV4=~tY1t5|pOm{cDpH7fT7}Sh1;CQ~@>$F4@?^9ftJbQ2OCPx~!&W5P{df&02~P3| zq(@8GLQF_F`ex}a*NZ>o?6?uO|AA#1?@f#TyVF}@?c>?@Y%d6|yiBLv{1?irx6X~o z6rGEJO_P-HW1tBjCyUcM#jU!|W9t>qh)-_FSJ3!&7(t-=1zmCPV^8^%wK&0~`=n|j z4*^d?wS5f(^v~o}499iv34`c&Y{Z;T%;cRq+}wI`q<+Z@CE(W9c3R+mgxt5_UbY(RMS}h zJ=tyDHDPL-eVm0OE4=*nIF22ZItIuuCbd~6>pIRjsp|eSMYkaoZVRa(c=U7cNkQ0e~ w>HhNYpEYp{Twg(IlLiA@pJ4Vuv{(Z0hk4bEX+7u8!Y>DGj@cf4Ckih7AD+d=LjV8( literal 0 HcmV?d00001 diff --git a/data/Oak_Wood_Stair_03.png b/data/Oak_Wood_Stair_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8ab7375d284c3cf455434aed691468d82799d2 GIT binary patch literal 2560 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 HaOVF3Xc)|( literal 0 HcmV?d00001 diff --git a/data/Obsidian_00.png b/data/Obsidian_00.png new file mode 100644 index 0000000000000000000000000000000000000000..ea71b56f0d84d6697f647df7012e962f2f3aeed1 GIT binary patch literal 1788 zcmV6BB%FbW2#g4c zED{6(BDO3cA%p;72Vn2`?sjix-n`H5E`pt%+qpf2jZH}-y`I3fo${mXVgHv!H*VZ;dxuYc1#!Rfee?CADBhh+CV#D}Dt_3#^ zd_Mo@#{%Hw99iO|XQ&fPNczV?LihHb1Tbc;>m!(O2(% z7S-1x_KS73Bn1D+D#5ypFtmV>jb`-CiWmj}(sB=%6rces0a5=u5&0JI*6Hc#F8D`I zeM`_Et0X_ImgmogD5T{c0PzY45rfN0(tJXU9s#n^J}$`#z9kGD8UsUD6G9|J{giXb zE1*x0%JR+idR<*(;Q8mDf8p%x?6>_84_r2;ZVUuxU-O#rv0BAq-n-P42fvwN(U_Ye`# zNVB|0l8;HUg7WxT`mUl`-X(^C7zUR2-XSYzOb%~TFXq&JjmEHHN>Ek&(9yN07-Lb5 z2QkK5mwvYZnzqHqlq?@H8jV>j9?&!$Nty#nv${{SypOStY&64nYm$6S-&S<>1G;)a zT8zm@`*ih!sEW(RG}Sq(5o;|fmM}y#K4ftVAaqNbx}ooT%Dp3|(|tzcF^k25u2~~Q zM1&X=4IbaO1mBb96Vhx%Tb&bwCk!3I_xPcw@9$%bK}>=ldN81IH=*6m2t_qgFYc10 z1!*y2er9g=o5VlDQ zU@jkQafnTKJF87{Y+4X~j|NX5p^t{ibjH!q5gH@)>KqLN#yFyyt!Sz0Hr~dioB!gD z^Bo34x56bkHpvM?i>eZQPm-1dgnD@wo8&~_k>nG~@r>zSq-{Hzwk7!Ciblxx04^Ib zG)oYJ7>oM;@c^Q4>6(TxbeA#NBvGWC9pl@YzFh*)w=070==%Z1Tyt(*wsp|g3&a?# zP0>v#u9~?zxKysocoowljB#|;IiuMLv*S-=Yyzr;p=0Q3;!y9XqiQ7jj_7;DSkht- zje+3XO|RH(KRW=dOScm=2G-}NfG|D!1nv5adUY3<=GRVf)kFlu;Ia__-TMATE{NG4 z>^}l9Hlf_Rf!ijd($(iI?!H4>&KT_-<2ND7$A=i}c31;2E<=oE=vMfy0=Wo@F%C3t zs^Xz-bHI&`Y0lrHtL`$Io#4`fwz>}pVQ6`9`Ztn%OkU22G0-t;Owyq%6ySRIBBmn)UJp)p&qLeBa=QhQ3`P#?Ut_ z(sGK%Nbo%|1~d$pnPgg+aRpT`)h z7~|)YtjLqJAPgrxdF6_K|^sbrHG!e|LP9i_Ww6*h0Xw507wLpuZaN~waMb7Bl0C_0qs&FGxQ zose+iDN|RYd)L4Eev#TW3mthRJ_smSibwpA`jeiJkRTwSe*3aU!U5-o9EZ$1hYtYF zxcQV}*L(XtEfS?kpIa{$HK+hhGl=4w!0UFp@nR7JTU(7K1H;T2dMV31mV#W);OXk; Jvd$@?2>|QPP9FdO literal 0 HcmV?d00001 diff --git a/data/Prismarine_00.png b/data/Prismarine_00.png new file mode 100644 index 0000000000000000000000000000000000000000..f681ac703bfb08899df004333c180f347d454170 GIT binary patch literal 2414 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 literal 0 HcmV?d00001 diff --git a/data/Prismarine_Brick_00.png b/data/Prismarine_Brick_00.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3bc950e9c69070c84bbd12fccd4a1d8035e024 GIT binary patch literal 2189 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 P00000NkvXXu0mjf`1c8B literal 0 HcmV?d00001 diff --git a/data/Red_Mushroom_00.png b/data/Red_Mushroom_00.png new file mode 100644 index 0000000000000000000000000000000000000000..ee24581d673d9af8fb109001613fc3c68b475403 GIT binary patch literal 272 zcmV+r0q_2aP)vj6ox;X$wYD(cmR_;f+P796uP5W2{e<;z-FM(d;=5D0LkEHFrkULsS%3=H$l(< zZ1*cSoOA!(^X=XX0)apv5HyTbcSCAf8Nk3W0JsOiTU~bDTA97p8^|ZliKD2rf1+u% zj5KbbUsSk+VFnO8PNkr+ZS$!=&l&2v)U7+PmgNjUQ4|2Co(I6bqLFiw0Fb=ad74Vy zdqa09Y(nKV`M|ANa;dRRMV1u74e%aRUND<2(UC W0yu$3vN!(#0000==>hP-{bpue_xO9=ly)Y-kc02JI@F?gxMw*o9LeMiQ`EJ+0vVvn;2fXdWe>p^nTZ<$EEivw_&a~_x-MPW!Ep7D zl&b5OaQ-vQ1^~8uxnb{x{zy$;HWZhsT*mzN1t>05 zHoh4GUf2Weg9=SI3|~R9Shtq?yx`T~<&u~INxwin zq?=d$aSC)sofumupQ8iN(K!Vr!H!CIaX9{C;>oL8$m5QyqFu z5j-lWQIFdrE4a*&haCQ^;1?Q+6!FIY;L6;T_~Y7G0T)nFc@~?KUUj=K>asBSS((W7 zU#^EdvB%=mz2trD+HhW8BKOLeq3=C#AVps6w-^wVaNK|5vg(O+&Rke04d5Gz)#aafh1XIF}V}%t#0R$o@c5q8D>vrZL=1y+xzz3 zWe$PFahwLM{Rj>~ALNoRus zb3y>p4v|mZ21T68)vSCpTzO#=s-g<1tg8FQ^HOrjvy!V|Sz9$bMQ;O3^Et2f-8fjP zr%z4udi1s0R~%tkmw1$xVO+3xisz_r{dr~a`--FT2Xx(Y!Pn>#M@%zgSO-uyEFois zP+V>nSa;(}Mn)kFL&<)+-lFox_g8{{7GrJ{di(q*cp{|Sc)CurC8n9Yv`sAVEl{;e zki{$KMb(JM$(RBD*c*W_C0h<3+HAg`zwfHc(Rx^_ZDm{DlOv<<@nen*1T0= zU=8;bqrEkLJtYQiTtT4Lpi$f$+!WAmD4NzO%=p=&tS74K5Blz?ay}d~xKo{dZ}0x= zGSyAVih0x@@fv zljO|haqALuZogVBh%9H{R@<6j>e9pM49}b?e65MLyoC>_(aLrMlP7G=JZ=P(239|E zGSb)Gp{zNfQhlxIC}jbhTD1e4C;;tyUG}i2MSehKt|WD*dn)bur1@$1xM~01_PZ2J zC0>_Tx@LSO5c-#(As5fhpg8c{oozUHMMMLd@8P80lm_eEn{IZ)bkA?EdcKJvI68qR z8KNB`YOwcr8p>t6VQKP(XPUu|g^wn#Iu0om#w4A!&>{>JgNF89K}6emKR)}G$XoIa zU>wJHP<4&&we)lN7Fr8=%O6k&T@`TVJ(?=eRHvtB(zajAAML)=n2@uW&G~p`Zt=y; zhbFGIPbrpR0)|mwHrw0vz~2ofj8ypA&!{GIY~(5rSf0eNLfgaEX4y->LwFV=Ol`fZ zna752ap$%5>U_M;hhei`AM46USbgxIX}B^(m>RkCb+uFy3)jNp?#RYvx`Y?ZZJAM56)cMsV@TLRJ`K0E0=LAoCwr&bpcHe!+ zJGbhpjfHUQQhJECRlZvT`Pv8PEu{b>QzK(D6H^nERffMcSBmWU z%EyZuBPA>ht&TW2ECfDGk*1x$O8em50P@znkVxd2pa>+3#rhu;{j!HhWH2(=9QlvI TCI`V;Qb)ke$sKdwAu#T5a21C6 literal 0 HcmV?d00001 diff --git a/data/Sandstone_Carved_00.png b/data/Sandstone_Carved_00.png new file mode 100644 index 0000000000000000000000000000000000000000..2935d44504ec578ff41c7d382690fc433a457777 GIT binary patch literal 1779 zcmVUl&i$R=*?XYr}c?{myT%_1)j~ zUEj5T@EX=l`!8C%Y5zrQuO)_@$)>M=`r;hKhb`ieS!lq4l(_S%8y>9xR{&qS>V3F# zfuwXpmbkE*le2tVe*ZZutNpD><&iME&~b7nl*yA8xzmlCvY?i<CiCA=E# z9T3oUiKL2ZkdvaSlwzm~BGC7GUPOGX)HwIzcb@l~`yP4nozVY%4Jor^ayhl}1 zN=iyX1a!FtjexFGx?Tx{E-Rvf2jnD;&S)pE)ln6~gWM(DB2|-jEEda;pZlgg5B~0n zjiUg08^Dm$Il4#BT9(9Otat=nPKX$_IN{KDib#Mc+JP$Mte6AgxCcoEwQpsKiO`a{|D!(2A`1vM>xC zUCOKsYwTUEyu3A1EwCC$%49W$Az>yUAkz#=6UWEGU;p+zf8RKUdjsy~M1W{xXBU8B zNKDI0O2W!Y$8zaRF|oSZlauhqeS3NF*vLf1!oh?(83=?3ni3Ek`Nt-YAK73kHq+f6 z5y8w*Q9@3^KzN`c1VR9%LXu`ORt*(l?^=&rW}FJ8DjqP+AdbFpj6WaQV4NxuK}0ks zNCF0BGDKTuGv5usYU^98C)6wf)wV_0+Fo;F-)iFcma%zki|04DIQ+~8FC1Io5x6-p zwd)+F(KKv}tzqG*2 z=O^$8WHzCQ#;K~1y9Bdu>;h1#qgh$q)9>`JieMIVi2#CXft$23ED8Z;c2YR^CODs2 zFmL=}-df<86V_@BD|t4a#!$@E6O9F#qo=Hm)g6aC zg$VcT9a{apAuP2rtaij~$<+b{au&P(s?-p=A=CAlet^aMF>w6Yp*;Uk7!;JKuUxgZcU`y-`8Te1*(vgW<~;{+6I_ND}(byL|lQeb1m9+ zCHwxN%hpQqtEzE8!}g`DBvnMgYcLEMA}G}vhRiqb{w;M@wFsCsm1~;!n1jfso3AI; zuiW$Sk&`Z|yRPL|9K2(zRJqR0&R5mjR8tidx-Ju{&E=9HIkmEQvu+RY+5edxkcbJm zjo|#0({=xz{FDs5a{b^7motw3t|4=M%JSZ6+3Yqcq@1u~-2UJnF*|W-nI>!F*W;nA ze8%C?dwzN3Kjt{Ce@1t%U#3QU#4CqD-jWrnw-Ni@`+twkv)()?Q+>MY^TAT$d-p#2 z^eM06uNuJix?}zFH8cNYQVxj9>z7O8_WS>UxAr<#Ev|Qq8}EH|H`V_W0Nd-X^~>J8 zHP+8t^^gAWp~IN_cR)UO*Uz7P=GDeJBLD#3zV=egy7~^T6Z=bSZ(@LSQI}iV_l~P%OD1BDN_~Wh_`-B4UCaMhI9$%W@Ma zh>DV0prB}|+LhI)AQp9t?|eMx!$a0PTbbf8y1GBk9z&2G_XO#JJIHt|p9&_#{P9-!A7rpPNTQn(}TpQ z;~;jK9(I zmxVYsdDZ88va**zXo)Z;u*Izcfz#zUJZe#8Vg^w-ev?<0K+fR=D_s_9FglhiPX5vc zp(&Qlj;nlNV5>c~f6Ftr7Anp<2XsI`(E~s&c}?#q)CkoCbkizmsDK%(ClRFrC;DmC zC=}9?lGwD=7UUt{X?J<|O5Lm*GN>{MUz6|mMK#-gE<1VK?*uLbWih|v$E$Pkh;+Bx zb^gV$M)(dyzoyKy{Pb#k07fD`+904eFc<|i<$3v6=#8d2(gn|nz~;3ek+J`yupdeZ zX;#+rzV7ZQ#hEi^n@T7w{Z&$=^Y6xXU)lMzchc(c3KlC5kavDV)hB^u3H7$JqQXZ# zVbYk4Vz*b30YW0aPfq%H7~8*Cz+|SMJ#yp-sVNpuA%EW5Cd)wvtq%LxPeUr9iQ7rc zP1=8wnt+6_{Rn6c642LkyP={YgwgP%La|yR-aVF$`~lKfYZ{g`jfh_w@GsIc9&76% zeFG`lhbQ-^F{nwE1cp@y9(F6LT#zODf;boVFL&1nFd7g^1hZP(*SCDw(0yTk{1La3 zYa;kgCrh-W+5noR5}TF&!5qO!Z&36%;`=1o;$3_8Aas|808Pk`&@m^BrpSNkorJ^O zX0##xD~2A!GUJF{#q%?3b@!!~w1uHA_qs7h?%j6_b)(j$!Mx7fw_`ZBVq!Rd62-d7 zw~hnNOjJYE=y>(f-YJeGtWe173V{$uHBpmPEcZ&ZpqiW1`(;tW@o8?tgBlz zk&x~z%+KdJZT4fM=3xzPa?)O^Feq;WGb&EgTlpw=|iUN+=$qJA@1!&_G}!^oM6 zZ5|^cYMRdHRczD^y>mmC6!(5E9a|!v?u;aB%|lB1@cBp0G$q0yB)1 zD=#L{YMqcM<;%A~4Fn1F+V1$Zicb{a79cH_=wR=yuPi3)5#hGEd~2)lqxc`>@IFw-YF#b1(XkX|-bl=2PWt1F zg|3HahV6L@8B6q>2-+ZM=|V2DQai|p1H7Y`@OiB}pw*nWB=uc%(gz5$`5NxKnaW;q zTD~as<=Ei^dqK%n!yq-h5t4$d7X7tSe2HFP*{s%M;oi8X-9dkInSda}XX5+hM0EWm zH=3ddKqYrn2Ndif%Bh?GXkZ4QpUrb$Bh~#mkGr#Ip-J2BYGBvp_SOOkd5lkKU|*n6 zD4-r0D5x|M1h2KNfLCIluG=-!7LU3xzB+Q9qrMV#YzCe6>*Q`cENLzVr z&zufufmfbx76hVA52v2^e20bSHW`FncW&<4Gj@qysbm?=;p;k|y~t%;DvQr3)ZHz| zRB@zs-kL-=>OVRDC@~NBeJZx@@rrI*U$LEkG<_ZCjJojN%P5jUUYKw`R@_n!h0Cis^Ftx9obJ$Ft2q! zoAv8>+o{Jrln=so-Z^)4bn5qSu>P!h@a^ozR~I*DcFu7-4L1A0@GAW9Z<=}M)KT6i z5xUo_mT{`6AIBisZ~7}jFcG+}DnCy~|8DGOM*PGr-Dl*FqE;==>hP-{bpue_xO9=ly)Y-kc02JI@F?gxMw*o9LeMiQ`EJ+0vVvn;2fXdWe>p^nTZ<$EEivw_&a~_x-MPW!Ep7D zl&b5OaQ-vQ1^~8uxnb{x{zy$;HWZhsT*mzN1t>05 zHoh4GUf2Weg9=SI3|~R9Shtq?yx`T~<&u~INxwin zq?=d$aSC)sofumupQ8iN(K!Vr!H!CIaX9{C;>oL8$m5QyqFu z5j-lWQIFdrE4a*&haCQ^;1?Q+6!FIY;L6;T_~Y7G0T)nFc@~?KUUj=K>asBSS((W7 zU#^EdvB%=mz2trD+HhW8BKOLeq3=C#AVps6w-^wVaNK|5vg(O+&Rke04d5Gz)#aafh1XIF}V}%t#0R$o@c5q8D>vrZL=1y+xzz3 zWe$PFahwLM{Rj>~ALNoRus zb3y>p4v|mZ21T68)vSCpTzO#=s-g<1tg8FQ^HOrjvy!V|Sz9$bMQ;O3^Et2f-8fjP zr%z4udi1s0R~%tkmw1$xVO+3xisz_r{dr~a`--FT2Xx(Y!Pn>#M@%zgSO-uyEFois zP+V>nSa;(}Mn)kFL&<)+-lFox_g8{{7GrJ{di(q*cp{|Sc)CurC8n9Yv`sAVEl{;e zki{$KMb(JM$(RBD*c*W_C0h<3+HAg`zwfHc(Rx^_ZDm{DlOv<<@nen*1T0= zU=8;bqrEkLJtYQiTtT4Lpi$f$+!WAmD4NzO%=p=&tS74K5Blz?ay}d~xKo{dZ}0x= zGSyAVih0x@@fv zljO|haqALuZogVBh%9H{R@<6j>e9pM49}b?e65MLyoC>_(aLrMlP7G=JZ=P(239|E zGSb)Gp{zNfQhlxIC}jbhTD1e4C;;tyUG}i2MSehKt|WD*dn)bur1@$1xM~01_PZ2J zC0>_Tx@LSO5c-#(As5fhpg8c{oozUHMMMLd@8P80lm_eEn{IZ)bkA?EdcKJvI68qR z8KNB`YOwcr8p>t6VQKP(XPUu|g^wn#Iu0om#w4A!&>{>JgNF89K}6emKR)}G$XoIa zU>wJHP<4&&we)lN7Fr8=%O6k&T@`TVJ(?=eRHvtB(zajAAML)=n2@uW&G~p`Zt=y; zhbFGIPbrpR0)|mwHrw0vz~2ofj8ypA&!{GIY~(5rSf0eNLfgaEX4y->LwFV=Ol`fZ zna752ap$%5>U_M;hhei`AM46USbgxIX}B^(m>RkCb+uFy3)jNp?#RYvx`Y?ZZJAM56)cMsV@TLRJ`K0E0=LAoCwr&bpcHe!+ zJGbhpjfHUQQhJECRlZvT`Pv8PEu{b>QzK(D6H^nERffMcSBmWU z%EyZuBPA>ht&TW2ECfDGk*1x$O8em50P@znkVxd2pa>+3#rhu;{j!HhWH2(=9QlvI TCI`V;Qb)ke$sKdwAu#T5a21C6 literal 0 HcmV?d00001 diff --git a/data/Sandstone_Stair_00.png b/data/Sandstone_Stair_00.png new file mode 100644 index 0000000000000000000000000000000000000000..63b0be82f193a291f03152980c6835be4a89e40a GIT binary patch literal 2133 zcmWkwdt6cp7QTRR5w5Q+y`-jQDWxgOWGW?CjcKvQnrph1TwguLG9OKum0U#GYSFPN zlpdQ*kJ0&Mi$%*y2E2 zN&^7EAwF(%qOJP;Kd2O2E-Wsd1pumN{N|XXqO?qy>=$hZ=a*wc2guO0j1S=qxU2-X zsbV5`6gJ6b55CjzdgpPYB{Mf|rr~clqU=7Qr#Jxye8EyUcULG%5uL=lb^7@brBM8g zH#;$KxN#HeOX4r;Lo}p4c1@mfmP`Xpc1a~F5rI*;0d)GyGT9ZYOU4ja z=NA@+QR()qye4+2*)%U9yxAc@BySWcDPmusKrcje_&$Svg2PHGVdWJxhUOJC6*M&$ z+Oa}IZ(ok`%~{p$Xs}Fi)U_He!?y8$ooQelrKBX9;*y?D2@XzB-sD3K4bxB`pI;>) z#CGB$%sGP?MLC_Cl8R22m5a-bToQds^n(b;H{V~|p7xZlU#>WmiUeC`^d3wQSVJ_L zok$)Y0VGxgBO)RKE-~A6%nzs_l?bQ&SqtIlSjTMbMe)UQ2Tw1ojCunP1ss4ay(*Cm zau0sJ!(z46nPA($h1uiQqgNs@e3>e2Visn9esYmn=;NU&QT{>g06Gf0=1!t+u z-MmU9JzEmce^{vL$BpCH&)xiq`XdR=_KK**7v?GmNuw-wvv>(%+lIV9z?qA1jPGOW zmq<BtZliL+7y5)kT|aMo9n zfP|vOX3MHbf?v-A1y-=;e=|hPsEq8@Gxv&C_ zVu(kkC$w7Znezp*?~K)?b)tkPJH}B7Iq}XC`!_zwpd<*qStsJe>sJp8Edn+LjzY;1Zgn6i%E&QO`Bgwy3$UY{Y}f|woRgB zg#&|eu}$vmSFa=Ny>B~Tlh}cB6?ASKEg;PQBLp) z?;66fS)we&N6&3cvN#04vPxF3+usk=xk^Qfhd>74*BFug4+C_?#DGUDje1Zq5%V9m z0D2V-{7gq3$tDP{8$C-~9Lw*+?vZXcq6etU9pgC&Si0$x_g*R>`55Txr{9i@OXT(! z$l~sW;k$Q7%M7)I#lxz$NK}5#Yj-%hXhOrS+Mk}0MXsyGMZDBcAxvimFPlL3s}B+< zwJ7%!vIlUU#zt`yfqmq-`@ZUYIpO&ZC|Zi7ryFTQtT~$~Tt?fL z&SBaCz{-rO>%7mZ63Z|2 zdwKqXgDY7pmXS6rc)tT=v6D^Z?HIBz+icQ4ilPVZ^Jh73LXYpJCFy{dp4ftz@haNv z6g1X)%GBO?sxw~tU2QAc?9QAKud#sr4L(9HDJpmEAc>u#NXfNY@Ok|C$2vw8K}tft z&)GQ?+Sr&Mh8w>8Q7x~ywG7@EjxDMp!(ot8YEN&hGD1PGkA92>@1U66X;7%FCtV_J zg|?uPb@t2>=l7>Y9_zd_F^U4tLq|{hOT9JG=C^NMIY6Jumlxs&%rFq5MNJH1^VVc% zL8}@|a64 z8_N9Wuuz2b`9c7b@|a;oOMFJezG;9x9jBHX^0} E1Jgm`%K!iX literal 0 HcmV?d00001 diff --git a/data/Sandstone_Stair_01.png b/data/Sandstone_Stair_01.png new file mode 100644 index 0000000000000000000000000000000000000000..262b01991fbef2255ab46ab1003ff9926f496f18 GIT binary patch literal 2012 zcmWkvdstF=0=;nYVuE4eD5R!Ni8{V6;`mry!7?ACTg=u@vSWHt#B6jkZQZgIt|X?l zS(6!-jr27$+2)MQ_Oh)6HPco~_v@Qcs}0}T!_=?e z5Cl1=rX>DxMScDcM`VRd%gdJ_hKhWf^aYkj->pv?V6&S%S!{L(-iV^yYtS6%gQj>W*_X-V1$lVXASlIF zNtnMkz8o}B=MBF+}V;#dLalpkT8X0jxdCrun_!==v#E$WdPoa!H@HYjb^u|*IB0X#8qamv@iOs&<)zPip5)K((8@p{UdCml5&_A`GUX8|9JEBZ&l)=84Tqi?p7e7HQ= z8@lL|tO(ARV7>El(e_gIisQY;v$dmdR?5Rq2t0TG{Av9B>C@x(nkc%VQ%1F}Yp6;n zNe}jc0n8k6SNd;z!HqlgQ8{iryZ7W<#~llRAFzdhr?;v*!B}S1=M*=6po8DKNVQX1 zMvm3~=Fmos4^D}hlp&Rs@knTBsIuKq300Vw>rG)PA2Mt~EQnGS={}&vr z+tLRe(YZh(rzID7qfF2YZG*oVjtoCsZhAP&hjY0?UfeHsv&FgjTan1uf#%`i4+m&V zi;K~_hpdg`uZ*|oChyLi1J)T@&q@I5cpKy4Bx>LZCJ27OJ;)1w>_*?cdJL2D%#V6& zPmKutJObVc0@tbDu`3DNW8I@3TKYr4$`}=~|MI;2!NSa3GNOitO4QqY%iuYT^bCH_ z)u_pwHNps#JOE=IHfv22QtTHgJWdL7MT8N>8kpvaHNts*LN^RXM80O04i)N-qC=Q8b*#(Q&`cX2?>OP)KD%O9mS6_+gv5D z2D1(Fm@)STKuuTFVHrbJ!Eg+#Ax+Szcumnv3gYu6l>9BoQUJt>L<(!?OfA_S1YxHI z3o20!Ip~~h%q$^QN28 z60|eNYI2^M0CZV`0|VWnSUZ-z8&zzN7(#^s302>&QB?rEqTlf*B?HCN9>~VJYuT;d zlE<>b0_f|UT*}#3vaada6k^_xP1l0MR3#-A<=XMsx>Y+!_Ugo5AXEQ~HRUPnw^biO zhH}(M@i~lAvo>yq?NR`_W&nU+B28W6%PPYKdt#2_GGN2+$M$EcBc;+vM5s}uMPv6E z|2EOpPOMoLCrKDG=-5c@qqm-0X4KsUW36Ut2ve{Kg;7@)$9Sfx_JcnT zIhJtaxeO6z!pC-DtFb&uzS(H?M^o5r!3pxP<#?OV9X0`bS-dmmsy2C#d`8Ys6JCUG zy3CeJIl`xw56s!&c1@zZfyO!kEAGBG?Nz?v%WMSgy>H?gW<;z#Uq0oN(oMFkZ|>FI z7|$-gt#katxVn&5!ir90iLWRY!%#^(yw6W)i%tr~#A1t61ooNG$iXy8hiwa?&Z?X< zT^27DO_xO(HoIH`ipl0vqzOmtQ`j$E=mZ#nWeHcjTn(5wNqI+iQnl*(em~(`?$9M5 zUai}`Cgkf3diwsh<1$dOGhaNdr#vWfMC;RVPjcZ4{Ay0|6*FM;+}f*U-JFkpxUl%d zJ>>;*1^~>@tM#??AacC!S3nRKy1MU|7{fHazx>r&fJo%mQg4=R@q%d{{>J*f^F^Z3 zj@P)a1P&&N2vRAz^kt~n7yegp5W%j7d zBg#8hhp1S^^0A{FrMDs8Ha*RZh4fZmL6{q~$mU3I@`Kwv)iWF?=r+u#0?rHcr^Q(uN$@_Mm|@+grA7ZSsdFef9J^ADi>d z@29B&OatN;&Xb?W_-9dH_0Ft!<@9G|SvfwGls%ucXMNebVE%6ilEm$zl# zHF@9Fn=J!_A%dD4+GX2f9U2wZGZW&^KI*VBYG7w*uoxpp-iaO&#kAZrj~$$OTZ9G8 o&aDm&Ei2wEn^SI}e-A;8rzUq-mb`LXd2J|l%htr7H(^!(12;vk{r~^~ literal 0 HcmV?d00001 diff --git a/data/Sandstone_Stair_02.png b/data/Sandstone_Stair_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7685043f71c681dce7846391bd200411e5fd0304 GIT binary patch literal 2272 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 literal 0 HcmV?d00001 diff --git a/data/Sea_Lantern_00.png b/data/Sea_Lantern_00.png new file mode 100644 index 0000000000000000000000000000000000000000..ac23abb2d997a5fd2cc9ffa5f77444aade692c46 GIT binary patch literal 2173 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 literal 0 HcmV?d00001 diff --git a/data/Snow_Layer_00.png b/data/Snow_Layer_00.png new file mode 100644 index 0000000000000000000000000000000000000000..36e5f44e7f2a3d8d68e9aacde340bddb59949ead GIT binary patch literal 1749 zcmV;`1}gc9P)xG8gtjK-62D)xdcOC@!~Z+ z|Ni~U0UB7&$iyT7G8h>23@ogyz|de~0EPt65&sze1A~B*i<5zcnT6rc-+v!~?&}0b z%aqViuP^ulXtXP#w^624)s!hCjc5-vOqPN=638bs-^M|FAg(!vU*TZ)M=+^P#^zi09o?)-(Lo9E;fc=zyC7)`uPVOBLDvX1IsZnLqZ1>TELLo2UK4Q zjIwh90q!X7Kyd)j*HZug|7&DoVvPI$?>`&J(trQ{0}Ten^?$GhAcH}nz{_CfH8Q3{E7(k%`3{J2ZC=NJ9X+9*byu+2XJt5NC6X((2pNK8Giow z!NAH2N=$!%@%R_)3s4+00}~h{<6i~_V7Re@(gZLYf_w{fFasmdHjslsJ_fPb*_jzQ zfm!t9$8TUcP^jIxeUstF&Fexy2T8%~g*$)+7^I-!784U<_ya6X-o1Or@c;L3U}|Rp z2QeEPB(Q$`U<5`50|Q7c*ilSOK#SNIe*XLo)CY+Ukm3LT{bBg_?H5?>tCueru3WhY zVEXy<7dX0r zg%!h%8`l_~KYs?!s{etR2AHscCFXwyMznkfcfiL_AAtt`0~RE}pk@S>?<@@8foXx8 zn+NDqb_NLvX`n@489smh1j^sQM9IqV9cVEq<+HM|f-PocV_>*`?Fz$#2lp62jsTSx zpsWfir2aGfV_;_o72BZd0#PKu9RPAYSOYKt@bU>TfD#!K&>^5i#=`QSft#C)0hBZN z`1lz<10DPI+gAoIZfJkp_TjfBpIMn*rowkdHt`DzHod$1}(w-@pHW=m9De6ck|K$29BRPw8B|9w{05c_pq%mtSYUz6i2n?~U=Dz%24LdY1vESK z@85rSe*gZ-0J0pEs91m%4#>s8@__+_nStp8#0OQw{QLq8d-v>Mc>DGhFzT3q7X4-b z#W$!p2I&W7$zQ;V@<|A56Zul$&zkL1@#>2zg{`2QIg?I0MG4S&6F@UllDB(g%L}p-A{REW_ z4}kSTH88kWtX#499|HkEQj_f1@k?C5bWi{^vm98q@UgNm0@FY*!>?bzLG8j%K!@}K zE$&;fe9;#MA^};A(i11H$N?SD{PX9JsM)iof>Qqq78cgpWlQHjU?34NF^~Z)EOZ|I r{_{H?=yO|OPO%5(y;yQA2U!gOG|W?24hcR?00000NkvXXu0mjfL=`7j literal 0 HcmV?d00001 diff --git a/data/Spruce_Fence_00.png b/data/Spruce_Fence_00.png new file mode 100644 index 0000000000000000000000000000000000000000..dc60ab4e5afad3534ca63352d1cac2a065a3cfa9 GIT binary patch literal 2408 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 literal 0 HcmV?d00001 diff --git a/data/Sprucewood_Slab_00.png b/data/Sprucewood_Slab_00.png new file mode 100644 index 0000000000000000000000000000000000000000..7aae83dcd1bc672ab077a9f371c0b707c41864eb GIT binary patch literal 1818 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 E0rolQRsaA1 literal 0 HcmV?d00001 diff --git a/data/Sprucewood_Stair_01.png b/data/Sprucewood_Stair_01.png new file mode 100644 index 0000000000000000000000000000000000000000..f670745dc196a0788e67df3c82c1007640274f2d GIT binary patch literal 2032 zcmWlaX;c#l6307f(uB}}$Q6ui!UH7=k_H?FQ4DIST;xkGIA|#bqW+n6!WR3cf5*>7?-Gh3KzNp>Gdd zyKzxvy7cCl{8#rrs}{3HSd2u0LRoqyN}l%x^7E4nsWEa@sn$HlUiGwm09cmu^OK+; zIGtMiIf#!DA|sKf(0BHeuvYG@A4(RXqU7EglD{FMi!yR#Euk22PTm$R*qM8G$8Od4 z7dh;_C0)@!7pO7tM{_6MT;GVlXoDXWDfH$7KHQ&U*&`N-b{rIoRUSi@75ifG>vs8LYtrfl_&|bfC!qbwaof) zEY0D-;*QkMsU2|c;#BxR2`R5L=jn%@PQaBoN*X5k$T+DOSUlRSg*y{5sZKAJq9Rdp zCV1%bBBeKtIdChGu*=uE=Af7~AP5d1*%%|Z;~V_gI63zw|hdX;yuwWQf!r4w^h5GlB>d^mCf9WaACvN`<^>s|pX-F43RwVu62 z)-d{HIwDI)6xEAdyjooO-nVM!>v4N{eDi&bTFtI1r1iG8LKl)Y$(GR>`-F$-+w4nH z@mzwZla zttpJ#t;}kF-UP#UG5i4ae5&yFtk=DGc^L&2OESr+$SS}@2^I>@|L9SKk)+u%C?#Cc z6zJISPeVU5TrLFyA_GAdi&dl1qtb%_EwW3gTkFg?qVh9_7kdlRNw>cnqQrc`KG#uU zVr&)P_5CkoA@ln4c3C zhJ+H-fN~8vR3Y zyLl2Epl8yvfa~JX^G+rE<(~u@I*t9B$=5d~biMg(=HoPe4j3A)0A-t%N%CD2(jhQ6UX@*tJV6UDcbUs!TylS2ooNijLB$XASu z<^N*noPqeOTHK-da;d&M5>1~sdx7k#3Mp!_zd(~+chgBFnWnF-D#X+YRGf{v+sD@2 z)`*#f@2%7gii@SLB}T!3=8jj4@-=|O3Fd$rp;&C3GkN(3;w*oLxWurxsQ5mREpBXU z^KXPMJvyPz0oqS(32_XnSKKQtru2NGyv@=qpj^vmYYB&FK_20Amd)s+cRBM;pCzirEn9>P(qzB;OKuw_rPV-5Ne@7V1Aep28dw=q1uy+i z89zNwqa+Ud!K9T3B?Qxt-3}IlZY|r{3I~r5oZwhb*-m;z_xcA^7HAwUC({-)Ec6@Osjo4_NUsNq1m)x;quksd?kzNcN}kC5}pl&@j>q8DIl=o zRAy9UzW80y1>ru>u98ThgP+VKAJ$X(jpJBPiy zp7oBf$@OB6t7-^P`NW=##*fYS54^bA3FCLHjWaG7vxNe19tbNXngzFQpB&h_F*fFx HXf*eKP_e;U literal 0 HcmV?d00001 diff --git a/data/Sprucewood_Stair_02.png b/data/Sprucewood_Stair_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7820c138f47429349673becd1ffb21a0664c1b1a GIT binary patch literal 2225 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 literal 0 HcmV?d00001 diff --git a/data/Stone_00.png b/data/Stone_00.png new file mode 100644 index 0000000000000000000000000000000000000000..51aa3ea503e418b6b0541b95e7f982f70a4893c1 GIT binary patch literal 2042 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 FV1f?S&Q<^b literal 0 HcmV?d00001 diff --git a/data/Stone_Brick_Cracked_00.png b/data/Stone_Brick_Cracked_00.png new file mode 100644 index 0000000000000000000000000000000000000000..0834ad4c1f18cdd91a5d674fc477be7b6e9f9008 GIT binary patch literal 2808 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 O1l)-f*K$HY+`j-*Qp&yn literal 0 HcmV?d00001 diff --git a/data/Stone_Brick_Slab_00.png b/data/Stone_Brick_Slab_00.png new file mode 100644 index 0000000000000000000000000000000000000000..860db29271b07cd897f07f91ff0e10bfd36d423b GIT binary patch literal 1758 zcmV<41|j*0P)69z`(d>!JM;ll^TU%!3>J6I!WB>*|!=K-O82$rwvoJF={QLKhftiV!ft8ho0q95u zULM{LEG#UY|NsA=vT*6rFZdjS(*YiCu1r7>1hk+X7~d*?fN}lw*>kXO+1c2@mca}L zTE_7G`wyTa7#Vhs_}v4v3BnXZZN>lhMzg zzq&ct*_=SW`wR3TCkF=uCl?pP$4{Ra-o5|8z{nJd z2g!p%3Y11zSy}f1EiVPS=-h(EsObYG4S2e{O93_Y0X0l!VEC^Bq!~ClIT=8{|MdAY z!*5``a{?{p`}J z6@g|Y{`vb?UP)2$?9E%ZKEpx-?tt{P6qDC)-W~&5X3fRL!3?tW*Uw)J>_DG$0UZH~ z-=9FkfH?qcFev*0gO}mYzrPG$zkLHb?ibjx0{r|8zhLVA{02K7?3h2lnSr5a^y1~K zL=Fy)eZYkL4CDwFm`fzY#ifJ<1%)0zdCKtg*)s-Eu!0iQ=TD!(@yW`{#vmZT#_;yt zJBGjielti(NrK}X5eqf9rz~BTa6a@M}Tuhwd!NZ3PZ{NOU;06Zm-@pGDK7ang0L%#tVq&5Uq9Vc! zuV24m_zR5h-@ku>6P~i70>dYuV_&^_1N8MbV7b7~07{(Se*9qg@#8zgUto0n28IZz z>_AS8@DKndJcf5b-~IddpFu=Kh(S(PhCxa~oZ;^M2f#%4o`IW(n?XrRis8$b&kS#X zmIHkO&Jm#K0fp4dmoLEulD39A!&6{rynp|m0TgBbfVl@0o!`EH17}xI`oQV{U?Bo_ zF);Nr0Mi063cfJ#@$oTesHy@j{lakn(IbWzFJ3UPv4Y&p$RH>n$nfpkR|a6h0vim< zn*V?W(xblVa2yzH|R%C(+Z~zk;3o9$IB>m3-attW3 zef;(_69 z^?{=2KQKi9{QeCNEoNpWaJI!70?aI+l8luBM1xW>hz120urve4|7QlC|Nj}pMMW8a ziIw60!$%CDAO@-9;@||Qfxp1q@ZsYpaD0FL@)evNnSf~oq#uMq(F87Z7#YEyggFA9 z4H=o36oH8_h8d`dm5miF&jw8SAcH}12@2x>zyb-BP{l+<82I`48J+>-9h4S8Wdz9b z@4$ElWnGY-f53zbDic7CU;#!OD0)Cy78DIY2QB*c?b{uYC2$AG%F5mY`sfNUr5pYG z|6d4{g+RqBJFt`kDFkW!19Si=Cjbi;22dgO_1kw~%Kr#XBVR#L1I+(m9|MCO0+R71wVfNtP3n=nLy`kOM$PG%#wxxdB9j zLIINXe*6I@&LzNtDi~<#R-om-8PEXU>KGUrpj2xHjEZhxWn{+-tYkp>9^^A%C^NhP zmK!gCrQeq?Uw{b_Y822mXfz!G+6AnD7*4!?{h9$6AgV=VV`Br#u3kbnP)!~g#mfB*TzuxRlTWom~QP6v3nxiSGk5DPPN`_G?0RoK|s8F+Yj z7}(i44lP);$evmb!EiuyWH`gekDrWw{`}R=!OrIN@83U$zd+2%!NKtJ*DnSRphLL1 zdHw($w`k##CCQXJ1jPZK?(R}tT%3)JjEr$Ve*9o#Wo2am5)5Cyer5Oy#2oA#3|!n? z48MNVjaQ+Q~2ZicZToZzA*^$^D`J37&35iaWi}Y z@)?2{LGDs5ATqriWiYe}kjrKhO|XHa3P2A3r+%{rmTL zR7AvVk{tj{cnr^;J!g3S`~}0;FP|9XWMvq1wY3;PhQE9No`D${1xkvFpkQZs^ZE_L zcc6nmeg4D%OfTT{@bcwL22h&e;^Ja^_4-wcp`qbh1qB5YLJon401Gn|eE9kEXJBId!5}Uw3QQmRz^us4@E({Z-oAea4lz)I z{rm4P!yBOEKw_UhePZ|l%&Ne|sq**FpVdIO?oNn}F-nMy#c%^W1jNL|)PeCD`45=j zSlL*?3fWlM7(fR9ga+|{V1WcI6&b`tL>Tz__!*u7qY080J_8frCt$kx2F|)5Js@)g z1OymBp856rw<0ioBmzAn4@^gAZ{E7~8Rimr2uO&FF)#wN+ovyIzy%K|SV0DH0LuYT zVFZj%aIW|alm{hBMxeJiIYHU-E5pZ69~nTQ1ai!uzkeA11G6Tmp!)giC&Tw2-+_hL zH(-c;04L5zPo7*xPMj<-mwfsBg+W9}2<*E@kDoAn29|uxz$^$#54^m*;Pe3U4Jb4~ z_}lj%44_2!9~f0%fR18hWMW_fVqgLR7GA92v;j((zyJJY0EOB|V6^=D{fpuK`wv1u zhr$yl+yNlhgIo*pt+b>h*yS%l*$tQ|xqfjl2nh-@@B_;TVCn`3D=3G6>IhKCfb%Nj ze{h`vN)Lbj{AU2wA^(BS`1a!mFkyZN7FK`21sE_*prix11AhGc0j%lR!6n@{U>@fM z)_gLO5)2?mym|W$94)-u+zcRJ0n2}2=?F825n?}(3$h%<0ae|=cxQP1_ASFdU^NbM z?6>dVz>We%EwT&X4gl41AcMKNxWI7=@+l{f4T=UqpzlFG0;O_xU;+ijJvXqVWCA7x z7GUlHVUWRpfWZy604NR$$=|@7@CR6I{|1ZyV*oh>JsZFsz{AVK@Z&ouxPCAQ3kfrT z63~|~Ul~BY5fT<+-~uK_NeOX=Cr_U-d`}ZGk8esy~kleu9666q2 z+V~BOb5Mx<`TZN5rJ0#Q#X2MQDEJIagrFJ^RG@&;1IU+5e9R1=fa0Ly7L))%1(SlD zECa}b`;Q(mfXWC^8UWFtgbE5Rki$Vf1(hcthk+ad!k}CMwi*~ZAU;Mm1jhBR4 zaPx2j6W|X}YK6O$4H)c<;NWIqc>Ve{xNV@NuEroQCkIv|0t_Kg9Sw2}$dRD5zz9r$ zpezYe04`U6x#c%7i$c@DFAN6&U9}6C$3q`Kd3xu^Pl!AyBtQm&%6?E4{QkoSaA^sO z*M|=uGH?Q0N8knvFdKpr?tfr-gVGTQgQAEHSU+$B6E4UMP@)7D(|3Rl2nE`;2j&2b zCYiOhH5X7a4`@g^A1{vp(BTYxz;b{E7=NJR6_oc`fGs6X4t9obz(&cr3l|^-4=^!; zf*F)9K=lDAnAzFcz_lhYT0a4c_D-PKgg0;Ad_ztI%;>4|@#Dw8<>cg!01a9Uv``S} za$SCYKBm9GlngQ)ls!R-3hZNG(fk5h4TF3SEpfg$z) zsHYl;SG;=l>K_9EK$HVuW&j<+1@vJ7u&+?g!_CbHY_>C8x^e}aErAL46EN6&fol7J z7Jp$N5|HEon3=Y=wxImi49o#hH*Vepm2fM7@m>qG_yGfnfGh`q>;O6f)EKe2d-pCA hFmWCOwFw!>007=31d=phI9dPz002ovPDHLkV1mS|k^BGv literal 0 HcmV?d00001 diff --git a/data/Stone_Brick_Stair_01.png b/data/Stone_Brick_Stair_01.png new file mode 100644 index 0000000000000000000000000000000000000000..ad29367127f12c9f1249c3d85b0b858e83b74095 GIT binary patch literal 1964 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 UucGeZ*>?ko2-^^PD_E5Mf9!1Z-~a#s literal 0 HcmV?d00001 diff --git a/data/Stone_Brick_Stair_03.png b/data/Stone_Brick_Stair_03.png new file mode 100644 index 0000000000000000000000000000000000000000..18bbc3ea9b1f29030c2fa59de8f894e7dc0ad8d6 GIT binary patch literal 2169 zcmV-<2!{8GP)@iJ5_wm4yN5NCsXW-VZD+ES(FM zEa@QR2%HY^aC2n>f*_y;?ZEg}`2&pWr_Y{)eap_q2DS`lIM6bN@85p_9l^)|)Wh%( zDDn2)`*-i(zjuG|;K3Puj$lETjE)Rv`1tXY(a)d1x>;FRoIt_*=FJ-hP7V$RSs7`D zkDop&;U6I821cczJ6l>h7c@|tvpG08j3fEsKnwo?qX-mD-++z)r3p~T5#s{510=-7rGN$sJ$~|( z;pwwy3>?7h1@iglPoEjMxVeCF&c+}hz{c?Q-8%*WK5n2R7#R5Zcp1Kb`^NC)^Jid4 z{ATzK42{2k|1p3ZLTv7WJK)Fn@8B#Y2=uMEm^j0OhYuOvzJ1HU&Bet4GW7H3FAShK zX9q^hj~_o6e*XB$aQ*rXpq?MV=>N~a07QR&{{|;gW@aWJ%}81l023a=JD~6W{rk@# zA|k{fCo97MitD@g9{>~Gdj<(nQHDQ%{{R!;Uxp7KKQa9H@txr-FiQRdZDwL*0z2aW z|Nr1@2)3G$5#lfc&VYviun++!EMV$qc>U%rFbcjf@bU36XsD_J(h2mby4$M6pr3%NJIl&wetnvH%SN z2It3*9~nLZQ@?tEPy!JIT${D{shc|zkwn3 zmw}6mlfm57v=^9&*??--EnK|hAGW}NhX6ARs3c=$0MQ_yf@qL0K*9PMn8-l%moHzy zIRF&opj61t!O8#%Zcv#3EO&sG{{bdeRt5_rL!c*E82%N58m{MTb zeQv>G)OrG57l?_8sRIj+NKlZn0)rCdS~gZTaGZm(*~^zN!NCiRT5uKw(I7`bvfg)4 zImBRPZq6VqECddIQ2Fp1SX_fV^XvC-MW7=R|NQ+cucWAW_U5fypJAZ^FNh?>#TXcY zsrM7mmtTN+9bCZx;}TdXF|YwsKB(sT57h-KZb7LYWWje}ZctEAV9-!g1(zKn!ouLR z1WK?!f%V3BP+|p^kideB?bYj7DUY5!xeQcq0x!m4j4!}!CL$!nASNQh@aXXqhR;Ap zFf%cM(*rLrFVIkCFa|m7&mTx4b8@t2067BWuxHO-Fg$zyoPiTqJcG&*P$dPzpt1o} zV}gosY(+FY4FH3m0pwbcZ>1$A!R(i>-!Odt`HO+;7YDGCVFp_UYzr{>`}r`u2Fm^V z2`qem{{mM)%8CjMpMZtdD`36x=g&7_$;l25iEqF%1C(X|0;A*ipWhfoG@>8^W-WGL z=?BVY-++Y@FR+mzBPqcEa>N^89RSJ!jt&mMEcuz?4ai|YHK5So0_Gl2i3v(0poWRI zhC0JjU}ykqLZXUjxC6k!#=-(F`96O72riU3fu$fQ8U%r5KFE?6FJ1uC14s)agP?#Q zFk5~FXE{*W52~d80UIWd9zSLf0!AgVMKs(2JiI&%pvnhS%nAz$Gk_8hsPX}|`GkNe zTUJ_%;SI282E{eVGEk)hY0`od3L_mcTtcV5` zXk46J44@DN7Dk{%c?XzY(t(z5114&4(Tq`NT3cIl0Ttu{TRi1_ygULx4>Rxq%KqQRE``uzzQa-BfOO#n9Uz9H8M z7|rs>k01Y*lao6Fbm?NCZv}xa*X8HuV*<4cK(!;N==~2231G1bZvTNC0IC787tufd z0MpbGU_liOv~(-b^55tc65dt=Ff>33&a z{Xmrz6BE=Zpl#4-Is&u|SOGDdc>Ve{11>;Rv&F{722^K+0Ugo~bcg~E&>`Gh+`vNW zHN&e{FTrU5R49RR5HQ3Z04)P{)fiU1diClb0|7u%*9_MBTV~6VwP@0Zd@EK#LzRkO;_f v0LTuYBS39Fi@SI4G656pF;HE=Kn4H+oz{rph|hrY00000NkvXXu0mjfG*;la literal 0 HcmV?d00001 diff --git a/data/Stone_Brick_Wall_00.png b/data/Stone_Brick_Wall_00.png new file mode 100644 index 0000000000000000000000000000000000000000..9334f03c7026a67da3706b1dda11633302ef7541 GIT binary patch literal 1034 zcmV+l1oiugP)1v&>OS3ly65IOlOZBTA)6QsK?z2appcD-3JTe{@L!0af~(*{e}=epCE_lM z3WCv?eVhq8>Ws#jbLnecU7YB`O=`yMoOfGQZ$JH2e{X+qr2o63!ybI;h3DDX**OU~ zVDsDWe>jwnILx7EFJ4$~yYA}R+S-jcPHqBM&pmN=`7mAws=%dZo{nWKUz1W^?fd?r zJkQCpoUUz{&F0(2nzwbZBu*F> z!}G?NYqRO>tq|`xWK+4cbebrNi=v>e8>Z6;HHxC3C=0Yw{Bh?Fbybn38Oy_*-Q8Wh2V)G*yAbOz03igilyqH(Qi`%D zP)Q7o+1>q}>1@XSWP)=JDJ9N1k|fAF>>HR&CMd1ZT9aleLQ0ytAxRRNwxO!#IOiaO zuIrFelBQV@KoDl0XS7XA-*r?%pwk5mfKnQ39a?L=_h@4n=J`MC_XR-8nDMb=v`s@* zRdijCvj$@=NfOg_9a?Lgb3`J-7!wQ-bOqL0X45G}S#aXS3GytZC<;cS2k819?>(`U zj7B5ypp@e8cD)OAf9 z$K=By4<0`b-cwaIv)P<1&#=Z|jb(Lph2bzKB0@xADIWyjy#w#D)-tc=L_%PULTgRm z^)yX`_nxY*an9rXA~!-59zt4YbxwCllJH zx!Z1@EXzoe!Qxt!LddXDBWTx|Gmlf2C3W4P`kt~VcB33x{d-c%SA`HF zO;djTZ3klv^ZCqq&&S^TH-FmxWi!t<807*qoM6N<$ Efk4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfV|E!fQQ0L|8ILe9FmiahIEHu}e>-`v*AWMi*8MY8S|kc5Zr}(LD-(<6;3~^j zP1@Q!wQOHwYktCW>x|_~qi*CrZ<<@ib|sEu$4y?(V=2cjrG+K!exl9)U5@WNdsNgj zrbOZMmFcRdzJIyFlUnw1d1JD$d4W>l%eh^RyWhTE+dudH#s552A$MP$i7c~C-+M27 z_Ro^tnd1Wru{9%4CJNp$k2vq)P-e zM1sXWocQ6yysWZGHD%en%j9@gt!MP@)B8d<{+Yn53JfN%64!{5 z+6>m z7wH#g07dju@{{#5a}(23fjBccTh~k%rktgKw}lS@ItVPzEn)L+bCxcvWaeKa+mAfv6UJW?~$GfEhY4Gd~T>*IiG#F5N_ zstM0bDaimSdH+P88K^`ONr`V}ZfZ$oK`H~-srtYGwBHowhh~m%2v8M+p{bdPk)?@+ pg=HmQBsWlrAd)%3nN_I_W)>DsPQSd0J_98gJYD@<);T3K0RY{gK*j(7 literal 0 HcmV?d00001 diff --git a/data/Stone_Button_01.png b/data/Stone_Button_01.png new file mode 100644 index 0000000000000000000000000000000000000000..0b024f96c537ca69b6a819641d6f9addd7927418 GIT binary patch literal 303 zcmV+~0nq-5P)kdg0002?NklZfiM@CLQ4lR`w6%+!2hhsa19$~NZy*+KC3pk1^8#YApwUUp zWM{?;Y-H2we&zf5cs$;NmX<$(_&t3>Fk)Ng`tGe<<*cS6o!@*4rh8Bg<5rSQ3w88b z(o}Fx!N$^PQyu%AR0n3*waSR*f)`c>pO<>KqXQm~!xM=#7L15yyx!M60*c5tmTJzr zY6TIfc&CHGGsdClEi%Cj5M%@#0ZB6HKV~-63S@myA^?X&P0X!4^uwoefe8|#O`fx5 zT=l?JdXw7=plE(b`{aBLx_jw|ypQ&}eYckXzz^6iPEie^6>R_j002ovPDHLkV1n}W Bg8Bde literal 0 HcmV?d00001 diff --git a/data/Stone_Pressure_Plate_00.png b/data/Stone_Pressure_Plate_00.png new file mode 100644 index 0000000000000000000000000000000000000000..63bfa031a7c151bb4f6e818a0b54482532362c1a GIT binary patch literal 1008 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 bKn?%^ELm6A2ENdh00000NkvXXu0mjfy!;pM literal 0 HcmV?d00001 diff --git a/data/Stone_Stair_00.png b/data/Stone_Stair_00.png new file mode 100644 index 0000000000000000000000000000000000000000..637a260834b3e2acf54b1433b847199399f8b6aa GIT binary patch literal 1980 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 O0000Tp=5vHwlcJgup05~TL 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 O1l)-f*K$HY+`j-*Qp&yn literal 0 HcmV?d00001 diff --git a/data/TNT_00.png b/data/TNT_00.png new file mode 100644 index 0000000000000000000000000000000000000000..018cec214a8cda25e25d8a0a8f9f5154e6ca5370 GIT binary patch literal 2578 zcmZ{lc~nz(7RO%#gdGB5Ut$!bEJ6}OSW?h{1PBU-7=$2TSOP={TM{YMKq{MYLv}>8 zaWFu}r7DUnN&=J$qC$(7WmM7>g;EwJ6~RKCM^Dcjr)TE8bKiZx-~HV0y}#f6;|VFD zfx222S^xm(l7sxIphs<*1`K?2^74KIoocdgh%W%#EYn_(Qv=r!4mHpZxc0Cfu4-K?u}ZD{geFqK!qa zx~c-#b2AU?AX*nKRvF`hT_ic)GGK!^^a8jyLytg~gm3>sqA{g%wV@eS6L~EWVmhpz zD~G{V|0yyO*qGe&(p!2`^fvsXuKeu#-Wgef`D%x*lPi2c1$WO3K

{X7*p9}sWhptEmiX>e_H(*61@BZvJ>(|Yb{s4 zzuZUlk=hDSyB&!%Ek27-YGxXn7>NQ3k?9vM9xU7XBTH7dj@=cqELKdNCpu$PPeFOa z&(Fet9U^r!T<4G+VAYDws~N(fW}xb5w0Q^}WmB`3$dR@%A^7a+@A_w^%KI&+?`AQ+ z#mqi)3$S{id}n>;f~I_qP=CGAN?rWaNCQf-!?4WxiY7u>4~$x&-b)M}ZNJQl&W@o5 z8yK~dcYn{TqKc~2;gjtKK5)_eY}j{4mIB11ckND!i&?%B;XV2}grO)*e!D4)J}Tom zgtSIN>W2eG-4}`B#t++m8ZgjDjl9&W58&<5W;#1hd$4Oy7&wSCV@zYl&LPT_ zrDyb3O8SnrHWqeRx-*`R?dvc8+*$4SuXZvhx2D(-6Cpgdvnn#xX?GKOse@D07v~nT zTNu0_xK3?fj(@A@r%mN-(N)eU-;ThWOSP_YUk-O~@ zyk=_n7IVnV!a`A4`5BAeQE{y+2XQ)J?U&b&Pc1wrzZu7FQ@(!tcB0i&Vs!fSX;2hn z_H7$`?@(_Boi^d#sIDifAU|UHdRA*fs@S;vIitRfjXED6H=hkReIKPxaeR59y1rrA zgS8(kwp$Un$B$wL=4%hxCDLtS>gIczB@#)`jM6|uwdKk;pP8Jz#B5FM?6i+*CrW4^ zsEbl-M)sq`Aoh!gvp@CG+U|r+y?j!SPt_>#o9ztcaB%o%&ulBnRZZB&dkvG5QB~B) z8WN9(zdUNj=bwt{EIK#H;AfS64kX6d+uyKLaVl7I6?(jsJ(qr6oI0jRJsh93qa?p2`HE(rUOptsiJdvr-!_T_@bksT$DPK|f()=tZS zj*H0oi^%1{%QISo25ol-Nr?Q2qCE9<{K8xIL0luBzATD z@Jphj<8gNn<)REQ{qoE2wbYJLOR8!8hPK&n+B6GJ^>rAvTsU;cc}jt|4)E~~gGf6e zWu`q1PP)O=6QjGtDz29UGz8W~E-LvxK;S>*^U~UrgFDL)mC{v4uJ>qj7+Fucw!VNd z@_-{Ip%XW@0~y9~ZqW6Gg8TJswS1kl(p3+6AUV1Elj z#q9e9D!o&$_D8wz6oEfn0+$rYO~_!gndw|0fR)BXaWZ(>2}}Yih0Dz(pwT(3RF(^y zmCoccIb0Xep*JZ4EtKYxnV$SxX;3SuvVBt}F^TCtkho-4LMqDL z#lr|2a7>tW6v=5O>MQPTm*QKMYEmZA#Koc`(YZWuh))eVQkuxQ7EK?L!M&VE)N6To@7 z;P?3X8QbI?2E)Wp!r@dhkhD1|G#Y&*E*qVblk-1j`DYItG!~6zqW>Cc(D66^pcX(T Lh5BFjV;uW8W~4p( literal 0 HcmV?d00001 diff --git a/data/Tall_Grass_00.png b/data/Tall_Grass_00.png new file mode 100644 index 0000000000000000000000000000000000000000..1523e8c4b86ebad8c2e93795c4e48d3053b197ad GIT binary patch literal 953 zcmV;q14jIbP)PbUL|dCXf3#_nhOx2&IC~BVCC3mjC&`|9t-w z7-57F{);G8^1;)#_rChOZ8y;O`0*ToN;|;EPrvmzJ}p)93P7P;s4hPf0dbQ$zikD+ z!|3LlOS2~dyf%3H+LB_k*N2}=8O~l}(!Dsx40=l{tmpJ}54Z9=n6=oS-PsA3?= zO3a|Qo{4}`C9fJCzL<;~_qb4#VYiimtvI-VQYC+^ zRLNfifO4Tq+D(3;_TyHp=ZUK9sbwSbVMIQ-A1;SnR)1b=#N1YNpakRs^tcm?fT9QBBQjy1OQ;bnIFX1-w>7y z)yn`b7njZk0Iu4MUI}{9+fg9v)*(}D{L%#h0f|BMTi)sZ4$m`)D+BsRi0ug!%hI4TbNctBEbp8 zVF!pLVz#c%SeiPMoEVE4CPh3KL&#O)+`_c#1Vg+7o-Y9a1|v5$$nD3ELNE;grBIaO z;jfQj=@P>CwoQxPe3CPiQ>+IOQb`8FrQ7nwy3okDmawEQB~_FljC|?&pxmSD*@WgQ zgMtUq@C0PC49$%Yp=I3GZH82aK}bTAQn-CzfZOS`MirWbyx5iMHj5%;vTS%QXf{F! zsv$GZ;KU8MF7G%d&L7TNxv429=a@L}y1e7W4P?d{1l7=NghQ-Aj;*>6gIT}Fq3ilJ zBGskqi)&A=*N3l`p8rCZ>XP4!iaMi6XW8m*Vv~P!n7?}Jc*fR$sBd)dK4|!}-(0`j z`zQZb7LGbca@OkP)Y#ExKYHQw#kJZ&D{#l>^0_bH|Eac{j0OTvzWdqCaR7IAljH~^ b{J-%BW(Sf+qA2Mh00000NkvXXu0mjfFzd>~ literal 0 HcmV?d00001 diff --git a/data/Torch_00.png b/data/Torch_00.png new file mode 100644 index 0000000000000000000000000000000000000000..00c1031bc7e7a446ca67f43f81c78a9eb8369e04 GIT binary patch literal 311 zcmV-70m%M|P)5~E2FEaq7xCWrz8~v%La0RF;b=Shn8++!R z0RY>#zEhuY4Va520ITd7fbPT4X`aF}@bY+X0F)>In2le(0FG|Jc@NxPX#;TAvd>{M ze-Cp8oB_0wXeCLLm^6w1AE2r@?*Sn!`{rxw1rV+Q8Cmu`&%FS`HDJnf_icW?cPQZ+ z5ar(6pX>}2_A{g*BQJn(4H#pmUn}Va5UzouH1N4tdjTBXzz>bTG0SeoaCZOz002ov JPDHLkV1f>`g3AB^ literal 0 HcmV?d00001 diff --git a/data/Trapdoor_00.png b/data/Trapdoor_00.png new file mode 100644 index 0000000000000000000000000000000000000000..572fe8866a1438ab73a08e342b816047df1f412a GIT binary patch literal 1244 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 literal 0 HcmV?d00001 diff --git a/data/Wool_00.png b/data/Wool_00.png new file mode 100644 index 0000000000000000000000000000000000000000..f19794ca62019e55af0c75b90dd736e30920cee9 GIT binary patch literal 1961 zcmV;a2UhrrP)uKQ}<@k*2T7+iE+qTJ$O~;{Lb(E z&hOp=en8C5&PJCmU5b844)!)LUAuP8&hz}kvMf&nKv5K*jK|}-lP6Eo{}sT63l~5{ zKjWN#+3)v%DWycyG?+{#7>~z)@AvzsEX(@mv17;HIH&cd4_?21eXmmLFO0FXuIs*A zmL&i{YmHv7had>{GsZqDisGFE2M#RVx^*jklf3_xf%*CQs4UCh1NgYx?Z#3{xUP#V z%TU)f>bi#Kd5Gf}RaK#`Ym7#t#P|KrecwNK^yty-tpHrPa)k#$@Zn@KIjxj>Z!(!c zN(tZhVObW!FhrWBsOuV8mLZBFxULJ&^Psf`5kYJHG|%%t64BpIoH(K02*Bmbmm#J6 z$;QUU7hxFwdN>@SX&Nxbu)e+y0I2I4olXay=YcT>BEo1if)D~)YjnF^5D_@%$g&KR z$>f$0;uH}r9Y212N4*^yxN+mg9>;OMl2V@KoWEBT#r8v%1;=q9ga80Ij)S5o;5ZJn z)(FE8mSur+ZUD9d?RLB1oWDy%A2m($qa#O-EM2{Nb-W9}y?gh5ytTD;k1_Uv@B5bL zdFXUHru(|C5d;Ao$3YZD&|2@%fe-?WF?2c|R8@thX^`i+0q*<0C4~5CmSxBG@85st z{{8#^1^~MS5QgEtef#$H*Vfi*rIgJ%=Rye7bq%Gq$2XZw;5ZJXl!)UPw!Qs&s|DM( z4I^b)!gXCtCKEJG10qsSpFUMjo;(>c#`d&z4FDko(lq6rPRC8tRB5egG#c4)9Gm26 znnFrxK(!hWLLf;JIF5tyc#JR%A%uYIx=4~lJ$(33EiW(gs;X?y^UyR6b^%D!6k!;` zaU8^P%!!C^Y;2H}k~7A5OK)A*rcj$Gj$=$uPorrXNGY+gv4JRx@cj96did}m*4EZ+ z&N*z`Mp>57TJHvsBni?qh41@l=RX(>?9pfh#uz0@!hPT8LI?;U;CUYMJO>eBb8{1e z!2q0d3guX0ih}q1eOQ)-APDf_!2^2y_%Sbv!tQpvXqpB} zDWjKmON0=w*Fcga@I24ZxV5!~vMf?V|{%cmSsT*fnKi%*L6We$nzXomLUv7qmL+x z?6NHB;>C-QQu5ZMvMe+CY}|`1=TJ)R5Fu}WSeAuOrvs%FhzMI-Td*t(-EJ4X zUeDO;#>NKnJO}3--EJ3_Wx=v6NGUOyOil#Fa)>Ro}@O^(b17R3KN(mtZ zwzjrVRTc6)$6zo(5CqU#qZMA3Wl&0iF$S%*nKS1c?UoRcvE!y`3?Kj?qTK)g2jz%N+z7HV;IOhn00C}F9PJQ185g|>tZ(ptJ*|u#ul~MxOKEgTYyT)Jutgf!s ztquFWkIl_Za{%Rejvxp?M2MmYj4`BX3dR_ul<+(cwrv}cwS~3TJM^KoZgpW07!5Q{ z^G%-TN2Qeis;Ub8ejmQ?BMd{>wvF+4Y!VA0uy^lX2qDa6rA^*4)C$nDEHk1sO`ihz zEr4&@y1TAqw{PE$0Q@0Il8*<2L6&_M$7Z zA+7&&&f9gQx~?y3t>2I1__J4wzm|cQ)G2JlW4MF_(X zL}UQ97EVOpx~}_)Wm#X(&CR{`D*na{yc&1z+zFB-IY~sPW@cu(LI^s4{yd1tZki^o z>-x*OuD@DXSoq$Lk(c9p8F)1g9XgZ)`19=S>?{%eiHLqvRTYTnYumOzou8lo_J7F- vyye$1u&ocy`7h3#IRh!>y}7x$x61P$VWg!wS{#)d00000NkvXXu0mjf$R@R% literal 0 HcmV?d00001 diff --git a/data/blocks.csv b/data/blocks.csv new file mode 100644 index 0000000..d4802ad --- /dev/null +++ b/data/blocks.csv @@ -0,0 +1,75 @@ +_Name,BlockID,Biome Specific,Mineclone2,Minetest Game +Cobblestone,4,,mcl_core:cobble,default:cobble +Dirt,3,biome:node_filler,mcl_core:dirt,default:dirt +Stone,1,biome:node_stone,mcl_core:stone,default:stone +Stone_Slab,44,,mcl_stairs:slab_stone,default:slab_stone +Stone_Stair,67,,mcl_stairs:stair_stone,default:stair_stone +Cobblestone_Stair,67,,mcl_stairs:stair_cobble,default:stair_cobble +Mossy_Cobblestone,48,,mcl_core:mossycobble,default:mossycobble +Grass_Block,2,biome:node_top,mcl_core:dirt_with_grass,default:dirt_with_grass +Oak_Wood,17,,mcl_core:tree,default:tree +Oak_Wood_Planks,5/125,,mcl_core:wood,default:wood +Oak_Wood_Slab,126,,mcl_stairs:slab_wood,default:slab_wood +Oak_Wood_Stair,53,,mcl_stairs:stair_wood,default:stair_wood +Crafting_Table,58,,mcl_crafting_table:crafting_table,default:crafting_table +Red_Mushroom,40,,mcl_mushrooms:mushroom_red,default:mushroom_red +Sprucewood,17,,mcl_core:sprucewood,default:sprucewood +Sprucewood_Slab,,,mcl_stairs:slab_sprucewood,default:slab_sprucewood +Sprucewood_Stair,134,,mcl_stairs:stair_sprucewood,default:stair_sprucewood +Spruce_Fence,188,,mcl_fences:spruce_fence,default:spruce_fence +Chest,54,,mcl_chests:chest,default:chest +Furnace,61,,mcl_furnaces:furnace,default:furnace +Torch,50,,mcl_torches:torch_wall,default:torch_wall +TNT,46,,mcl_tnt:tnt,default:tnt +Brick_Block,45,,mcl_core:brick_block,default:brick_block +Lava_Source,11,,mcl_core:lava_source,default:lava_source +Ice,212,,mcl_core:ice,default:ice +Leaves,18,,mcl_core:leaves,default:leaves +Glass,20,,mcl_core:glass,default:glass +Cauldron,118,,mcl_cauldrons:cauldron,default:cauldron +Bookshelf,47,,mcl_books:bookshelf,default:bookshelf +Sandstone,24,biome:node_stone,mcl_core:sandstone,default:sandstone +Sandstone_Carved,,,mcl_core:sandstonecarved,default:sandstonecarved +Sandstone_Smooth,,,mcl_core:sandstonesmooth,default:sandstonesmooth +Sandstone_Slab,,,mcl_stairs:slab_sandstone,default:slab_sandstone +Sandstone_Stair,128,,mcl_stairs:stair_sandstone,default:stair_sandstone +Ladder,65,,mcl_core:ladder,default:ladder +Fence,85,,mcl_fences:fence,default:fence +Oak_Door,64,,mcl_doors:wooden_door,default:wooden_door.png +Iron_Door,71,,mcl_doors:iron_door,default:iron_door +Water_Source,9,,mcl_core:water_source,default:water +Stone_Brick,98,biome:node_stone,mcl_core:stonebrick,default:stonebrick +Stone_Brick_Slab,43,,mcl_stairs:slab_stonebrick,default:slab_stonebrick +Stone_Brick_Stair,109,,mcl_stairs:stair_stonebrick,default:stair_stonebrick +Trapdoor,96,,mcl_doors:trapdoor,default:trapdoor +Iron_Trapdoor,167,,mcl_doors:iron_trapdoor,default:iron_trapdoor +Gold_Block,89/41,,mcl_core:goldblock,default:goldblock +Snow,80,,mcl_core:snow,default:snow +Snow_Layer,78,,mcl_core:snow_layer,default:snow_layer +Dandelion,37,,mcl_flowers:dandelion,default:dandelion +Poppy,38,,mcl_flowers:poppy,default:poppy +Grass,31,,mcl_flowers:grass,default:grass +Tall_Grass,31,,mcl_flowers:tallgrass,default:tallgrass +Iron_Bar,101,,xpanes:bar_flat,xpanes:bar_flat +Mob_Spawner,52,,mcl_mobspawners:spawner,default:spawner +End_Portal_Frame,120,,mcl_portals:end_portal_frame,default:end_portal_frame +Oak_Pressure_Plate,72,,mesecons_pressureplates:pressure_plate_wood_off,mesecons_pressureplates:pressure_plate_wood_off +Stone_Pressure_Plate,70,,mesecons_pressureplates:pressure_plate_stone_off,mesecons_pressureplates:pressure_plate_stone_off +Andesite,,biome:node_stone,mcl_core:andesite,default:andesite +Bedrock,7,,mcl_core:bedrock,default:bedrock +Obsidian,49,,mcl_core:obsidian,default:obsidian +Cactus,81,,mcl_core:cactus,default:cactus +Brewing_Stand,117,,mcl_core:brewing_stand,default:brewing_stand +Stone_Brick_Carved,,,mcl_core:stonebrickcarved,default:stonebrickcarved +Stone_Brick_Cracked,,,mcl_core:stonebrickcracked,default:stonebrickcracked +Bed_Red,26,,mcl_beds:red,default:red +Carpet_White,171,,mcl_wool:white_carpet,default:white_carpet +Wool,35,,mcl_wool:white,default:White_wool +Cobblestone_Wall,139,,mcl_walls:cobble,default:wall_cobble +Stone_Brick_Wall,,,mcl_walls:stonebrick,default:wall_stonebrick +Prismarine,168,,mcl_ocean:prismarine,default:prismarine +Prismarine_Brick,,,mcl_ocean:prismarine_brick,default:prismarine_brick +Prismarine_Dark,,,mcl_ocean:prismarine_dark,default:prismarine_dark +Sea_Lantern,169,,mcl_ocean:sea_lantern,default:sea_Lantern +Cobweb,30,,mcl_core:cobweb,default:cobweb +Oak_Wall_Sign,68,,mcl_signs:wall_sign,default:wall_sign diff --git a/docs/blocks.md b/docs/blocks.md new file mode 100644 index 0000000..d9c893e --- /dev/null +++ b/docs/blocks.md @@ -0,0 +1,52 @@ +MTSEdit Block Types Data +======================== + +Directory Paths +--------------- + +Block definitions are looked for in several directories, even depending on operating system. Regardless if you set the +`MTSDATA` environment variable, you can specify the directory explicitly. + +1. the directory specified in '$MTSDATA' if enviroment variable defined (Linux, MacOSX, Windows) +2. in the user's home directory '$HOME/.config/mtsedit' (Linux) +3. in the user's home directory '$HOME/Library/Application Support/MTSEdit' (MacOSX) +4. system wide directory '/usr/share/mtsedit' or '/usr/local/share/mtsedit' (Linux and MacOSX) +5. in the executable's directory, most likely 'C:\\Program Files (x86)\\MTSEdit\\data' (Windows) +6. in the executable's parent directory, '../data' (source repository, and if installed to '/opt/mtsedit/bin' on Linux) + +Blocks.csv +---------- + +In the `data` directory, mtsedit looks for this CSV file. It is used to define blocks used in different file formats. +Each line contains comma separated values, which might be surrounded by quotes. Commas inside quoted strings does +not count as coloumn separators. The lines are ended in '\\n' newline character, carrige return '\\r' is optional. + +### Header + +The first row is special, it defines the coloumn names. The first 3 coloumns are irrelevant and not parsed, others +define the name of the block mapping. + +### Coloumns + +| Number | Format | Description | +|-------:|---------|---------------------------------------------------------------------------------------| +| 1st | string | canonical name of the block (also used to identify block images) | +| 2nd | intlist | list of slash '/' separated integer numbers, the Minecraft BlockID in schematic files | +| 3rd | string | an optional biome specific name for the block (like "biome:node_stone") | +| 4th+ | string | block's name in the mapping (this coloumn may be repated as many times as you like) | + +Block Images +------------ + +Each block type may have more, but must have at least one image in the `data` directory. These are named as: +``` +(block type)_(param2).png +``` +The first part "block type" cames from the canonical name (1st coloumn), but with spaces converted to underscores '\_'. The +second part, "param2" is a hexa-decimal value and represents the orientation. If the block has only one image, then it must be +"00", meaning block's image when the block is facing North. Other values are: "01" rotated by 90 degrees counter-clockwise +(facing West), "02" rotated by 180 degrees (faces South), "03" rotated by 90 degrees clock-wise (faces East). Values "04"-"1F" +are only used for blocks that can be rotated upside-down too, like stairs, but I honestly have no clue how. + +Hint: the MTSEdit tool can generate slab and stair images from block pictures using the `-g` option. This will only generate the +first 4 orientation, a slab, and a mirrored verion of the original block. diff --git a/docs/mts_format.md b/docs/mts_format.md new file mode 100644 index 0000000..6f709bb --- /dev/null +++ b/docs/mts_format.md @@ -0,0 +1,92 @@ +File Formats +============ + +Schematic +--------- + +These are [Minecraft NBT](https://minecraft.gamepedia.com/Schematic_file_format) files, used by many Minecraft-compatible +editors. Only the [blocks](https://minecraft.gamepedia.com/Java_Edition_data_values/Pre-flattening/Block_IDs) section is parsed, +and only used to import schematics. MTSEdit does not save .schematic files. + +MTS +--- + +MTS files are [MineTest Schematic files](https://dev.minetest.net/Minetest_Schematic_File_Format) used by the +[Minetest Engine](https://www.minetest.net). This is the default format of MTSEdit for both loading and saving. + +All values are stored in __BIG endian__ format. + +### Header + +| Offset | Length | Description | +|--------:|-------:|------------------------------------------| +| 0 | 4 | magic "MTSM" | +| 4 | 2 | file format version, currently 3 or 4 | +| 6 | 2 | size X | +| 8 | 2 | size Y | +| 10 | 2 | size Z | +| 12 | Y | layer probability values, only if ver 4 | +| 12/12+Y | 2 | number of strings in Name-ID table | + +Layer probability values: an unsigned char for each layer, bit 7 is reserved and must be zero, meaning 0x1F maps to 100%. This +block only exists if the file version is 4 and not 3. + +The header is followed by the Name-ID Table, which is followed by the Block Definitons section. + +### Name-ID Table + +For each string, the following record format repeats: + +| Offset | Length | Description | +|-------:|-------:|--------------------------| +| 0 | 2 | length of the string (N) | +| 2 | N | string, block type name | + +The block IDs in the next section reference these. + +MTSEdit uses different block type mappings to generate this table. Those mappings are specified in the +[blocks.csv](https://gitlab.com/bztsrc/mtsedit/blob/master/docs/blocks.md) file in the `data` directory. + +### Block Definitons Section + +This part of the file is zlib compressed, with the deflate algorithm using gz header bytes +([RFC 1950](http://tools.ietf.org/html/rfc1950), but not with the gzip header which has magic bytes too). After uncompressing, +the format is as follows: + +| Offset | Length | Description | +|--------:|--------:|------------------------------------------| +| 0 | 2*X*Y*Z | block IDs (param0) | +| 2*X*Y*Z | X*Y*Z | probability values (param1) | +| 3*X*Y*Z | X*Y*Z | rotation info (param2) | + +To get the block ID from `param0` for a given coordinate (x,y,z), you should calculate the index param0\[z*Z*Y + y*X + x\]. +Each block ID is stored on a big endian 2 bytes, although I haven't seen any MTS files yet that used more than 255 block types +per file. Also most files store "air" block type in the first type (block ID being 0), but this is not mandatory unfortunately. + +Orientation is NOT defined in any way, there's absolutely no convention. MTSEdit however prefers to save schematics in a +standardized way, that is, the entrance is on the South side. You can use the "Change Oriantation" icon in the editor to +set that right before you save. In the editor's isometric view, South is on the bottom left corner. + +Probability values in `param1` are encoded on 8-bits. They are indexed the same way as block IDs. Version 3 ranges from 0 to 0xFF, +while version 4 uses the same values as for layer probability, from 0 to 0x7F. According to the spec, in version 4 bit 7 means node +force placement, but I haven't seen any MTS files yet with that bit set. + +Rotation information is stored in `param2`. This is the worst documented part of the MTS files. It sometimes has large values, +but MTSEdit will simply ignore those. What I could make out from C++ source, orentation is as follows: 0 means normal orientation +(block faces North), 1 means rotated by 90 degrees (faces West), 2 means rotated by 180 degrees (faces South), and 3 means rotated +by 90 degrees counter clock-wise (faces East). I have absoultely no idea what 4-31 supposed to mean, right now MTSEdit only handles +8, by 4-7 meaning the same orientation, but up-side down. Only these 8 values are understood by MTSEdit, but I would like add +support for the rest if someone could explain what they mean. + +#### Addition to the MTS Specification + +Normally MTS files can't store ground level information. MTSEdit solves this by setting `param2` to 0x20 for air blocks on +ground level. This is not a perfect solution (the ground level might have no air blocks), but at least it does not interfere +with the Minetest Engine. + +Another addition is that MTS files can be saved with biome specific block type names. In the Lua API, register_biome() calls +can set default block types for certain blocks, such as node_top, node_filler, node_stone etc. MTSEdit can save files with those +names, such as `biome:node_stone`. When reading these schematics, block types that start with "biome:" should be handled indirectly +by looking up the property of the biome where the schematics is placed. This is not supported by the Minetest Engine yet, but Lua +modules can implement this easily. + diff --git a/docs/mtsedit.png b/docs/mtsedit.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4d135deda96fee117436859edba9b060c6a4ab GIT binary patch literal 86849 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 +cepXUMsqQ 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ȫgTokQj8Lf+I8ld04e!okOZI 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 literal 0 HcmV?d00001 diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..c09f735 --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,119 @@ +MTSEDit User Manual +=================== + +This little tool can be compiled on any system easily. It's only dependency is SDL2. Without an argument, the Windows version +will ask the user for a file name. All the others print a usage to stdout. + +Batch Mode +---------- + +You can use this tool from scripts to bulk convert schematic files or generate preview for them. + +### Dump Schematic to Standard Output + +``` +./mtsedit -d structure.mts +``` + +### Convertion + +``` +./mtsedit from.schematic structure.mts +``` +You can convert Minecraft Schematics with this tool. You can also convert MTS files using different block types: + +``` +./mtsedit -m "Minetest Game" mcl2.mts mtg.mts +``` + +### Generate Preview + +``` +./mtsedit -p structure.mts +``` +This will save "structure.png". + +``` +./mtsedit -P structure.mts +``` +With uppercase "P", you can cut the structure in half to peek inside. + +### Generate Pictures for Slab and Stairs + +This wasn't a planned feature, but I needed it to generate differently rotated block images from block node images. + +``` +./mtsedit -g Gold_Block_00.png +``` +This will save "Gold_Block_Slab_00.png", "Gold_Block_Stair_00.png", "Gold_Block_Stair_01.png", "Gold_Block_Stair_02.png" and +"Gold_Block_Stair_03.png". + +Interactive Mode +---------------- + +This is the default. If you start MTSEdit with a single parameter, being an MTS file's path, it will open it in a GUI editor. + +### Main Editor Window + + + +You can find the toolbar `A` on the left. The icons are: +1. Load / Reload Structure +2. Save As +3. Save Preview +4. Change Orientation +5. Add Blocks to Palette + +Beneath the icons is the palette `B`. You can add blocks to here from the Add Blocks menu, and then you can quickly access them +by shortcuts. + +On the bottom left corner, you find the Layer-related options `C`: + +1. Layer Up +2. Layer Down +3. Set Ground Level +4. Current Layer +5. Current Layer's Probability + +The bottom line is the status bar `D`. You'll see the block names here as you hover over them. Messages like file saved also shown +here. + +Everything else on the screen is the main editor area `E`. + +### Keyboard Shortcuts + +Main editor window: + +| Key | Description | +|-----------------------------------|---------------------------------------------------| +| mouse left button | place the selected block | +| mouse right button | rotate block | +| middle buttons (scroll) | scroll the editor area | +| Ctrl + scroll | rotate the current block | +| Shift + scroll | move the upper layers up and down | +| PgUp / PgDn | change current layer | +| arrows | select current block | +| Space | place selected block | +| Backspace | erase current block | +| Ctrl + arrows | scroll the editor area | +| Shift + up / down | move the upper layers up and down | +| Shift + left / right | rotate the current block | +| + / - | change current layer's probability | +| L | (re)load schematic | +| S | save schematic | +| Shift + S | open save as window | +| P | save preview PNG | +| Shift + P | save preview with structure cut in half | +| R | change orientation, rotate the entire structure | +| M / Tab | open block map, search all available blocks | +| 0, Backquote | select Air block (erase mode) | +| 1 - 9 | quickly access one of the blocks from the palette | +| G | set current layer as ground level | +| Q / Esc | quit MTSEdit | + +Add blocks to palette window: + +| Key | Description | +|-----------------------------------|---------------------------------------------------| +| any key | instant search blocks | +| Ctrl + number | ass the Nth search result to the palette | diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..c535c84 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,62 @@ +TARGET = mtsedit +MINGWSDL = ../.. +SRCS = $(wildcard *.c) + +CFLAGS = -Wall -Wextra -ansi -pedantic -g + +# MacOSX +ifneq ("$(wildcard /Library/Frameworks/SDL*)","") +CFLAGS += -I/usr/include/SDL2 +LIBS = -framework SDL +else +# Linux +ifneq ("$(wildcard /usr/include/SDL2/SDL.h)","") +CFLAGS += -I/usr/include/SDL2 +LIBS = -lSDL2 +else +# Windows MinGW +ifneq ("$(wildcard $(MINGWSDL)/i686-w64-mingw32/include/SDL2/SDL.h)","") +CFLAGS += -I$(MINGWSDL)/i686-w64-mingw32/include/SDL2 +LIBDIRS = -static-libgcc -L$(MINGWSDL)/i686-w64-mingw32/lib +LIBS = -lSDL2 -lcomdlg32 -luser32 +endif +endif +endif + +OBJS = icons.o font.o $(SRCS:.c=.o) + +all: configure $(OBJS) $(TARGET) + +configure: +ifeq ("$(LIBS)","") + @echo "No ui driver can be detected. Install libsdl2-dev." + @false +endif + +icons.o: icons.png + @$(LD) -r -b binary -o icons.o icons.png + +font.o: font.psf.gz + @$(LD) -r -b binary -o font.o font.psf.gz + +%: %.c main.h lang.h + $(CC) $(CFLAGS) $< -c $@ + +$(TARGET): $(OBJS) + $(CC) $(LIBDIRS) $(OBJS) -o $(TARGET) $(LIBS) + +install: $(TARGET) + install -m 755 -g bin $(TARGET) /usr/bin + @mkdir -p /usr/share/mtsedit + cp ../data/* /usr/share/mtsedit + +package: $(TARGET) + @mkdir MTSEdit + @ln -s ../../data MTSEdit/data + @ln -s ../$(TARGET).exe MTSEdit/$(TARGET).exe + @ln -s ../SDL2.dll MTSEdit/SDL2.dll + zip $(TARGET)-x32-win.zip MTSEdit || true + @rm -rf MTSEdit + +clean: + @rm $(TARGET) $(TARGET).exe *.o *.zip 2>/dev/null || true diff --git a/src/edit.c b/src/edit.c new file mode 100644 index 0000000..0cf58f8 --- /dev/null +++ b/src/edit.c @@ -0,0 +1,308 @@ +/* + * mtsedit/edit.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief The main edit area + * + */ + +#include "main.h" + +int dx = 13, dz = 8, cx = 127, cz = 127, ox = 0, oy = 0, up = 0; + +/** + * Redraw the Edit Area + */ +void edit_redraw(int full) +{ + int i, j, k = 160, l, X, Z, x, y, z, sx, sy, mx, tx, ty; + unsigned char *b = (uint8_t*)&theme[THEME_TABBG]; + SDL_Rect dst, src; + + mx = ((bg->w / 2 / dx) + (bg->h / 2 / dz)) /2; + sx = bg->w / 2; + sy = bg->h / 2; + + if(full) { + dst.x = dst.y = 0; dst.w = bg->w; dst.h = bg->h; + SDL_FillRect(bg, &dst, theme[THEME_TABBG]); + src.x = 0; src.y = 4 * 32; dst.x = bg->w - 32; dst.y = bg->h - 32; + src.w = src.h = dst.w = dst.h = 32; + SDL_BlitSurface(icons, &src, bg, &dst); + memset(fg->pixels, 0, bg->pitch * fg->h); + src.w = src.h = dst.w = dst.h = 32; src.x = src.y = 0; + for(y = mx > currlayer ? 0 : currlayer - mx; y < currlayer; y++) { + for(z = -mx; z < mx; z++) { + for(x = -mx; x < mx; x++) { + dst.x = sx + dx * (x - z); + dst.y = sy + dz * (z + x + 2*(currlayer - y)); + X = 127 + x + oy + ox; + Z = 127 + z + oy - ox; + if(X < 0 || X > 255 || Z < 0 || Z > 255 || + dst.x + 32 < 0 || dst.x > bg->w || dst.y + 32 < 0 || dst.y > bg->h) continue; + i = nodes[y][Z][X].param0; + j = nodes[y][Z][X].param2 & 0x1F; + if(i) { + if(!blocks[i].dr[j]) { + blocks[i].dr[j] = (unsigned char *)malloc(32 * 32 * 4); + if(!blocks[i].dr[j]) error(lang[ERR_MEM]); + memcpy(blocks[i].dr[j], blocks[i].img[j] ? blocks[i].img[j] : (blocks[i].img[0] ? blocks[i].img[0] : + (uint8_t*)icons->pixels + 32 * icons->pitch), 32 * 32 * 4); + for(l = 0; l < 32 * 32 * 4; l += 4) { + blocks[i].dr[j][l+0] = (b[0]*k + (256 - k)*blocks[i].dr[j][l+0])>>8; + blocks[i].dr[j][l+1] = (b[0]*k + (256 - k)*blocks[i].dr[j][l+1])>>8; + blocks[i].dr[j][l+2] = (b[0]*k + (256 - k)*blocks[i].dr[j][l+2])>>8; + } + } + blk->pixels = blocks[i].dr[j]; + SDL_BlitSurface(blk, &src, bg, &dst); + } + } + } + } + for(z = -mx; z < mx; z++) { + for(x = -mx; x < mx; x++) { + dst.x = sx + dx * (x - z); + dst.y = sy + dz * (z + x); + X = 127 + x + oy + ox; + Z = 127 + z + oy - ox; + if(X < 0 || X > 255 || Z < 0 || Z > 255 || + dst.x + 32 < 0 || dst.x > bg->w || dst.y + 32 < 0 || dst.y > bg->h) continue; + i = nodes[currlayer][Z][X].param0; + j = nodes[currlayer][Z][X].param2 & 0x1F; + if(i) { + blk->pixels = blocks[i].img[j] ? blocks[i].img[j] : (blocks[i].img[0] ? blocks[i].img[0] : + (uint8_t*)icons->pixels + 32 * icons->pitch); + SDL_BlitSurface(blk, &src, bg, &dst); + } + } + } + if(up > mx) up = mx; + for(y = currlayer + 1; y < (currlayer + mx < 255 ? currlayer + mx : 255); y++) { + for(z = -mx; z < mx; z++) { + for(x = -mx; x < mx; x++) { + dst.x = sx + dx * (x - z); + dst.y = sy + dz * (z + x + (currlayer - y - 1) - mx + up); + X = 127 + x + oy + ox; + Z = 127 + z + oy - ox; + if(X < 0 || X > 255 || Z < 0 || Z > 255 || + dst.x + 32 < 36 || dst.x > fg->w || dst.y + 32 < 0 || dst.y > fg->h) continue; + i = nodes[y][Z][X].param0; + j = nodes[y][Z][X].param2 & 0x1F; + if(i) { + if(!blocks[i].tr[j]) { + blocks[i].tr[j] = (unsigned char *)malloc(32 * 32 *4); + if(!blocks[i].tr[j]) error(lang[ERR_MEM]); + memcpy(blocks[i].tr[j], blocks[i].img[j] ? blocks[i].img[j] : (blocks[i].img[0] ? blocks[i].img[0] : + (uint8_t*)icons->pixels + 32 * icons->pitch), 32 * 32 * 4); + for(l = 0; l < 32 * 32 * 4; l += 4) blocks[i].tr[j][l+3] >>= 2; + } + blk->pixels = blocks[i].tr[j]; + SDL_BlitSurface(blk, &src, fg, &dst); + } + } + } + } + src.x = src.y = dst.y = 0; dst.x = 36; src.w = dst.w = bg->w; src.h = dst.h = bg->h; + SDL_BlitSurface(bg, &src, screen, &dst); + } + src.w = dst.w = src.h = dst.h = 32; src.x = src.y = 0; + sx = (screen->w - 36) / 2; + sy = (screen->h - font->height) / 2; + for(z = cz - 127 - oy + ox; z <= cz - 125 - oy + ox; z++) { + for(x = cx - 127 - oy - ox; x <= cx - 125 - oy - ox; x++) { + dst.x = sx + dx * (x - z) + 36; + dst.y = sy + dz * (z + x); + X = 127 + x + oy + ox; + Z = 127 + z + oy - ox; + if(X < 0 || X > 255 || Z < 0 || Z > 255 || + dst.x + 32 < 36 || dst.x > screen->w || dst.y + 32 < 0 || dst.y > screen->h) continue; + i = nodes[currlayer][Z][X].param0; + j = nodes[currlayer][Z][X].param2 & 0x1F; + if(Z == cz && X == cx) { + tx = dst.x; ty = dst.y; + blk->pixels = (uint8_t*)icons->pixels + 64 * icons->pitch; + SDL_BlitSurface(blk, &src, screen, &dst); + if(i) { + blk->pixels = blocks[i].img[j] ? blocks[i].img[j] : (blocks[i].img[0] ? blocks[i].img[0] : + (uint8_t*)icons->pixels + 32 * icons->pitch); + SDL_BlitSurface(blk, &src, screen, &dst); + } + blk->pixels = (uint8_t*)icons->pixels + 96 * icons->pitch; + SDL_BlitSurface(blk, &src, screen, &dst); + } else + if(i) { + blk->pixels = blocks[i].img[j] ? blocks[i].img[j] : (blocks[i].img[0] ? blocks[i].img[0] : + (uint8_t*)icons->pixels + 32 * icons->pitch); + SDL_BlitSurface(blk, &src, screen, &dst); + } + } + } + src.x = tx - 36 - 32; dst.x = tx - 32; src.y = dst.y = ty; src.w = dst.w = 32; src.h = dst.h = 64; + SDL_BlitSurface(bg, &src, screen, &dst); + if(!full) SDL_BlitSurface(fg, &src, screen, &dst); + src.x = tx - 36 + 32; dst.x = tx + 32; + SDL_BlitSurface(bg, &src, screen, &dst); + if(!full) SDL_BlitSurface(fg, &src, screen, &dst); + src.x = tx - 36 - 32; dst.x = tx - 32; src.y = dst.y = ty + 32; src.w = dst.w = 96; src.h = dst.h = 32; + SDL_BlitSurface(bg, &src, screen, &dst); + if(!full) SDL_BlitSurface(fg, &src, screen, &dst); + src.x = tx - 36 - 32; dst.x = tx - 32; src.y = dst.y = ty - 16; src.w = dst.w = 96; src.h = dst.h = 16; + SDL_BlitSurface(bg, &src, screen, &dst); + if(full) { + src.x = src.y = dst.y = 0; dst.x = 36; src.w = dst.w = bg->w; src.h = dst.h = bg->h; + } else { + SDL_BlitSurface(fg, &src, screen, &dst); + src.x = tx - 36; dst.x = tx; src.y = dst.y = ty; src.w = dst.w = 32; src.h = dst.h = 32; + } + SDL_BlitSurface(fg, &src, screen, &dst); +} + +/** + * Hide the cursor + */ +void edit_hidecursor() +{ + SDL_Rect src, dst; + int z = cz - 127 - oy + ox, x = cx - 127 - oy - ox; + + src.x = dst.x = ((screen->w - 36) / 2) + dx * (x - z); + src.y = dst.y = ((screen->h - font->height) / 2) + dz * (z + x); + dst.x += 36; src.w = dst.w = src.h = dst.h = 32; + SDL_BlitSurface(bg, &src, screen, &dst); +} + +/** + * Edit Area scrolling event handler + */ +void edit_scroll(SDL_Event *event) +{ + if(shift) { + if(event->wheel.y) { + up -= event->wheel.y; + if(up < -128) up = -128; + if(up > 127) up = 127; + } else + edit_rotate(currlayer, cz, cx); + } else if(ctrl) { + edit_rotate(currlayer, cz, cx); + } else { + oy += event->wheel.y; + if(oy < -128) oy = -128; + if(oy > 127) oy = 127; + ox += event->wheel.x; + if(ox < -128) ox = -128; + if(ox > 127) ox = 127; + } +} + +/** + * Edit Area mouse over event handler + */ +void edit_mouseover(SDL_Event *event) +{ + int l, k; + + l = (int)(event->motion.y - (bg->h / 2)); + if(l < 0) l -= dz; + l /= dz; l--; + k = (int)(event->motion.x - 36 - (bg-> w / 2) - dx/2); + if(k < 0) k -= dx; + k -= (l & 1 ? dx/2 : 0); + k /= dx; + cz = (l - k) / 2; + cx = l - cz; + cz += 127 + oy - ox; + cx += 127 + oy + ox; + if(event->motion.state) { + blocks[nodes[currlayer][cz][cx].param0].numref--; + k = event->motion.state == 1 ? palette[activeblock] : 0; + blocks[k].numref++; + nodes[currlayer][cz][cx].param0 = k; + nodes[currlayer][cz][cx].param1 = k ? 127 : 0; + } + status = nodes[currlayer][cz][cx].param0 ? blocks[nodes[currlayer][cz][cx].param0].name : NULL; +} + +/** + * Edit Area mouse down event handler + */ +void edit_mousedown(_unused SDL_Event *event) +{ + int i; + + if(event->button.button != 1) + edit_rotate(currlayer,cz,cx); + else { + blocks[nodes[currlayer][cz][cx].param0].numref--; + i = palette[activeblock]; + blocks[i].numref++; + nodes[currlayer][cz][cx].param0 = i; + nodes[currlayer][cz][cx].param1 = i ? 127 : 0; + status = i ? blocks[i].name : NULL; + } +} + +/** + * Rotate a single block + */ +void edit_rotate(int y, int z, int x) +{ + unsigned char rot_table[24 * 4] = { + 0, 1, 2, 3, + 1, 2, 3, 0, + 2, 3, 0, 1, + 3, 0, 1, 2, + 4, 13, 10, 19, + 5, 14, 11, 16, + 6, 15, 8, 17, + 7, 12, 9, 18, + 8, 17, 6, 15, + 9, 18, 7, 12, + 10, 19, 4, 13, + 11, 16, 5, 14, + 12, 9, 18, 7, + 13, 10, 19, 4, + 14, 11, 16, 5, + 15, 8, 17, 6, + 16, 5, 14, 11, + 17, 6, 15, 8, + 18, 7, 12, 9, + 19, 4, 13, 10, + 20, 23, 22, 21, + 21, 20, 23, 22, + 22, 21, 20, 23, + 23, 22, 21, 20}; + + if(!nodes[y][z][x].param0) return; + if(nodes[y][z][x].param2 < 4) nodes[y][z][x].param2++; + else if(nodes[y][z][x].param2 == 3 && !blocks[nodes[y][z][x].param0].img[4]) nodes[y][z][x].param2 = 0; + else { + /* this is the code from Minetest engine. But I don't trust it. */ + nodes[y][z][x].param2 &= 0x1F; + nodes[y][z][x].param2 |= rot_table[((nodes[y][z][x].param2 % 24) * 4) + 1]; + } + if(!blocks[nodes[y][z][x].param0].img[nodes[y][z][x].param2]) + nodes[y][z][x].param2 = nodes[y][z][x].param2 == 3 && blocks[nodes[y][z][x].param0].img[1] ? 1 : 0; +} diff --git a/src/font.psf.gz b/src/font.psf.gz new file mode 100644 index 0000000000000000000000000000000000000000..dbba2a8e86d49e85f3147d67c0a81c156ec8e0af GIT binary patch literal 17573 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 M07*qoM6N<$f>T&B;{X5v literal 0 HcmV?d00001 diff --git a/src/lang.c b/src/lang.c new file mode 100644 index 0000000..337f5e7 --- /dev/null +++ b/src/lang.c @@ -0,0 +1,122 @@ +/* + * mtsedit/lang.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Multilanguage support + * + */ + +#include "lang.h" + +/** + * Translations + */ +char *dict[NUMLANGS][NUMTEXTS + 1] = { + { + "en", + "dump layers to output", + "save preview", + "preview structure cut in half", + "generate slab and stairs from block image", + "replace block type mapping", + "output to file", + "Loading...", + "Memory allocation error", + "Unable to locate data directory. Set MTSDATA environment variable.", + "Unable to parse blocks.csv", + "no block image for", + "no matching node for", + "Unable to save MTS file", + "Unable to load MTS file", + "Unsupported file format", + "Unable to save preview", + "No biome specific blocks in this structure.", + "File saved.", + "File (re)loaded.", + "Preview saved.", + "Rotated block images generated.", + "North", + "Current Layer", + "Layer probability", + "Set Ground level", + "Gnd", + "Load", + "Save", + "Save Preview", + "Change Orientation", + "All Blocks", + "Layer Up", + "Layer Down", + "Add Blocks to Palette", + "Search:", + "Save Schematic to File", + "Filename:", + "Mapping:", + "Biome type:", + "Save" + }, + { + "hu", + "kidumpolja a rétegeket a kimenetre", + "előnézeti képet ment", + "előnézet félbevágott struktúráról", + "palló és lépcső generálás blokk képből", + "lecseréli a palettát", + "kimenet lementése", + "Betöltés...", + "Memória foglalási hiba", + "Nem találom az adatkönyvtárat. Álltsd be az MTSDATA környezeti változót.", + "Nem sikerült betölteni a blocks.csv-t", + "nincs kép ehhez", + "nincs nód ehhez", + "Nem sikerült elmenteni az MTS fájlt", + "Nem sikerült betölteni az MTS fájlt", + "Nem támogatott fájl formátum", + "Nem sikerült elmenteni az előnézeti képet", + "Nincs biom specifikus blokk a struktúrában", + "Fájl lemente.", + "Fájl (újra/be)töltve.", + "Előnézeti kép lementve.", + "Elforgatott blokk képek kigenerálva.", + "Észak", + "Aktuális szint", + "Réteg előfordulás", + "Földszint beállítása", + "Fsz", + "Betöltés", + "Mentés", + "Előnézet mentés", + "Elforgatás", + "Minden blokk", + "Réteg fel", + "Réteg le", + "Blokkok hozzáadása a palettához", + "Keresés:", + "Sematika mentése fájlba", + "Fájlnév:", + "Paletta:", + "Biom típus:", + "Elment" + } +}; diff --git a/src/lang.h b/src/lang.h new file mode 100644 index 0000000..f674b94 --- /dev/null +++ b/src/lang.h @@ -0,0 +1,77 @@ +/* + * mtsedit/lang.h + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Multilanguage definitions + * + */ + +enum { + INF_DUMP = 0, + INF_PRE1, + INF_PRE2, + INF_GEN, + INF_MAP, + INF_OUT, + LOADING, + ERR_MEM, + ERR_DATADIR, + ERR_CSV, + ERR_IMG, + ERR_NODE, + ERR_SAVE, + ERR_LOAD, + ERR_BADFILE, + ERR_PREVIEW, + ERR_NOBIOM, + SAVED, + LOADED, + PREVIEWSAVED, + IMGSGEN, + NORTH, + CURRLAYER, + LAYERPROB, + GROUNDLEVEL, + GND, + LOAD, + SAVE, + SAVEPREVIEW, + CHANGEORIENT, + ALLBLOCKS, + LAYERUP, + LAYERDOWN, + ADDBLOCKS, + SEARCH, + SAVEAS, + FILENAME, + MAPPING, + BIOMETYPE, + SAVEBTN, + + /* must be the last */ + NUMTEXTS +}; + +#define NUMLANGS 2 + diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..e7100c3 --- /dev/null +++ b/src/main.c @@ -0,0 +1,326 @@ +/* + * mtsedit/main.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Main function + * + */ + +#define STB_IMAGE_IMPLEMENTATION +#include "main.h" +/* those SDL guys are not familiar with the C standard. They redefine main(), but incorrectly, they lack envp */ +#ifdef main +#undef main +int main(int argc, char** argv, char** envp); +#endif + +/* translation dictionary */ +extern char *dict[NUMLANGS][NUMTEXTS + 1]; +char **lang = &dict[0][1]; + +/** + * Windows workaround + */ +#ifdef __WIN32__ +#include + +static void UnEscapeQuotes(char *arg) +{ + char *last = NULL, *c_curr, *c_last; + + while (*arg) { + if (*arg == '"' && (last != NULL && *last == '\\')) { + c_curr = arg; + c_last = last; + + while (*c_curr) { + *c_last = *c_curr; + c_last = c_curr; + c_curr++; + } + *c_last = '\0'; + } + last = arg; + arg++; + } +} + +/* Parse a command line buffer into arguments */ +static int ParseCommandLine(char *cmdline, char **argv) +{ + char *bufp; + char *lastp = NULL; + int argc, last_argc; + + argc = last_argc = 0; + for (bufp = cmdline; *bufp;) { + /* Skip leading whitespace */ + while (SDL_isspace(*bufp)) { + ++bufp; + } + /* Skip over argument */ + if (*bufp == '"') { + ++bufp; + if (*bufp) { + if (argv) { + argv[argc] = bufp; + } + ++argc; + } + /* Skip over word */ + lastp = bufp; + while (*bufp && (*bufp != '"' || *lastp == '\\')) { + lastp = bufp; + ++bufp; + } + } else { + if (*bufp) { + if (argv) { + argv[argc] = bufp; + } + ++argc; + } + /* Skip over word */ + while (*bufp && !SDL_isspace(*bufp)) { + ++bufp; + } + } + if (*bufp) { + if (argv) { + *bufp = '\0'; + } + ++bufp; + } + + /* Strip out \ from \" sequences */ + if (argv && last_argc != argc) { + UnEscapeQuotes(argv[last_argc]); + } + last_argc = argc; + } + if (argv) { + argv[argc] = NULL; + } + return (argc); +} + +int APIENTRY WinMain(__attribute__((unused)) HINSTANCE hInstance, __attribute__((unused)) HINSTANCE hPrevInstance, + __attribute__((unused)) LPSTR lpCmdLine, __attribute__((unused)) int nCmdShow) +{ + OPENFILENAME ofn; + char *cmdline = GetCommandLine(); + int ret, argc = ParseCommandLine(cmdline, NULL); + char **argv = SDL_stack_alloc(char*, argc+2); + char fn[1024]; + ParseCommandLine(cmdline, argv); + if(!argv[1]) { + memset(&fn,0,sizeof(fn)); + memset(&ofn,0,sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = NULL; + ofn.hInstance = hInstance; + ofn.lpstrFilter = "MTS Files (*.mts)\0*.mts\0All Files\0*\0\0"; + ofn.lpstrFile = fn; + ofn.nMaxFile = sizeof(fn)-1; + ofn.lpstrTitle = "Please Enter a File Name"; + if (GetOpenFileName(&ofn)) { + argc++; + argv[1] = fn; + } + } + SDL_SetMainReady(); + ret = main(argc, argv, (char**)GetEnvironmentStrings()); + SDL_stack_free(argv); + exit(ret); + return ret; +} +#endif + +/** + * Common error handler + */ +void error(char *msg) +{ +#ifdef __WIN32__ + MessageBox(NULL, msg, "MTSEdit", MB_ICONEXCLAMATION | MB_OK); +#else + fprintf(stderr, "mtsedit: %s\r\n", msg); +#endif + exit(1); +} + +/** + * The real main procedure + */ +int main(int argc, char** argv, char** envp) +{ + FILE *f; + int i, j, opt = 0, ret = 0; + char **env = envp, *newmap = NULL; +#ifndef __WIN32__ + char *home = NULL; +#endif + /* detect the language and load dictionary for it */ + for(env = envp; env && *env; env++) + if(!memcmp(*env, "LANG=", 5)) { + for(i = 0; i < NUMLANGS; i++) { + if(!memcmp(*env + 5, dict[i][0], strlen(dict[i][0]))) { + lang = &dict[i][1]; + break; + } + } + break; + } + + /* find our data directory. Environment variable takes preference */ + for(env = envp; env && *env; env++) { + if(!memcmp(*env, "MTSDATA=", 8)) { + path = (char*)malloc(strlen(*env)+256); + if(!path) error(lang[ERR_MEM]); + i = strlen(*env)-9; + memcpy(path, *env + 8, i+1); + if(path[i] != DIRSEP) { path[++i] = DIRSEP; i++; } + strcpy(path + i, "blocks.csv"); + f = fopen(path, "r"); + if(f) { path[i] = 0; fclose(f); } + else { free(path); path = NULL; } + } +#ifndef __WIN32__ + if(!memcmp(*env, "HOME=", 5)) + home = *env + 5; +#endif + } +#ifndef __WIN32__ + /* in user's home */ + if(!path && home) { + path = (char*)malloc(strlen(home)+256); + if(!path) error(lang[ERR_MEM]); + i = strlen(home)-1; + memcpy(path, home, i + 1); + if(path[i] != DIRSEP) { path[++i] = DIRSEP; i++; } + /* Linux and BSDs */ + strcpy(path + i, ".config/mtsedit/blocks.csv"); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { + strcpy(path + i, "Library/Application Support/MTSEdit/blocks.csv"); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { free(path); path = NULL; } + } + } + /* system wide */ + if(!path) { + path = (char*)malloc(26+256); + if(!path) error(lang[ERR_MEM]); + strcpy(path, "/usr/share/mtsedit/blocks.csv"); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { + strcpy(path, "/usr/local/share/mtsedit/blocks.csv"); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { free(path); path = NULL; } + } + } +#endif + /* same directory as the executable */ + if(!path) { + path = (char*)malloc(strlen(argv[0])+256); + if(!path) error(lang[ERR_MEM]); + strcpy(path, argv[0]); + home = strrchr(path, DIRSEP); + if(home) home++; else { sprintf(path, ".%c", DIRSEP); home = path + 2; } + sprintf(home, "data%cblocks.csv", DIRSEP); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { + /* last resort, development repository or /opt/mtsedit/bin, data in parent directory */ + sprintf(home, "..%cdata%cblocks.csv", DIRSEP, DIRSEP); + f = fopen(path, "r"); + if(f) { path[strlen(path)-10] = 0; fclose(f); } + else { free(path); path = NULL; } + } + } + if(!path) error(lang[ERR_DATADIR]); + fn = path + strlen(path); + if(argc < 2) { + printf("MineTest Schematics Editor by bzt Copyright (C) 2019 MIT license\r\n\r\n" + "./mtsedit [-d|-p|-P|-g] [-m map] <.mts|.schematic> [out.mts]\r\n\r\n -d: %s\r\n -p: %s\r\n -P: %s\r\n" + " -g: %s\r\n -m map: %s\r\n out.mts: %s\r\n", + lang[INF_DUMP], lang[INF_PRE1], lang[INF_PRE2], lang[INF_GEN], lang[INF_MAP], lang[INF_OUT]); + exit(0); + } + i = 1; + for(j = 1; j < argc; j++) { + if(argv[j][0] == '-') { + switch(argv[j][1]) { + case 'd': opt = 1; break; + case 'p': opt = 2; break; + case 'P': opt = 3; break; + case 'g': opt = 4; break; + case 'm': if(!opt) { opt = 5; } newmap = argv[++j]; break; + } + } else { + i = j; break; + } + } + strncpy(mtsfile, argv[i], sizeof(mtsfile)); + savelen = savepos = strlen(argv[i]); + tmpblk = (unsigned char*)malloc(32 * 32 * 4); + if(!tmpblk) error(lang[ERR_MEM]); + + if(argv[i+1] && !opt) opt = 5; + if(opt && opt != 4) { + parseblocks(); + mts_load(mtsfile); + if(newmap) { + j = atoi(newmap); + if(j) savepal = j - 1; + else { + for(j = 0; j < numpalettes; j++) + if(!strcmp(palettes[j], newmap)) { savepal = j; break; } + } + } + if(argv[i+1]) { + strncpy(mtsfile, argv[i+1], sizeof(mtsfile)); + ret = mts_save(); + } + } + switch(opt) { + case 1: ret = mts_dump(); break; + case 2: + case 3: ret = mts_view(opt-2); break; + case 4: ret = mts_stairgen(); break; + case 5: break; + default: + /* start the main user interface */ + sdlmain(); + break; + } + + free(path); + free(tmpblk); + return ret; +} diff --git a/src/main.h b/src/main.h new file mode 100644 index 0000000..47daff9 --- /dev/null +++ b/src/main.h @@ -0,0 +1,168 @@ +/* + * mtsedit/main.h + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Main header + * + */ + +#ifndef _MSC_VER +#define _inline __inline__ +#define _pack __attribute__((packed)) +#define _unused __attribute__((unused)) +#else +#define _inline +#define _pack +#define _unused +#endif +#ifndef __cplusplus +#define _register register +#else +#define _register +#endif + +#define THEME_INPUT 0 +#define THEME_TABA 1 +#define THEME_FG 2 +#define THEME_TABU 3 +#define THEME_INACT 4 +#define THEME_BGLOGO 5 +#define THEME_BG 6 +#define THEME_INPBG 7 +#define THEME_TABBG 8 +#define THEME_SAVEACT 9 +#define THEME_SAVEINACT 10 + +#include +#include +#include +#include +#include "stb_image.h" +#include "lang.h" +#ifndef MAXPATHLEN +#define MAXPATHLEN 1024 +#endif + +#ifdef __WIN32__ +extern char binary_icons_png_start; +extern char binary_icons_png_end; +extern char binary_font_psf_gz_start; +extern char binary_font_psf_gz_end; +#define icons_start binary_icons_png_start +#define icons_end binary_icons_png_end +#define font_start binary_font_psf_gz_start +#define font_end binary_font_psf_gz_end +#define DIRSEP '\\' +#else +extern char _binary_icons_png_start; +extern char _binary_icons_png_end; +extern char _binary_font_psf_gz_start; +extern char _binary_font_psf_gz_end; +#define icons_start _binary_icons_png_start +#define icons_end _binary_icons_png_end +#define font_start _binary_font_psf_gz_start +#define font_end _binary_font_psf_gz_end +#define DIRSEP '/' +#endif + +typedef struct { + char *name; + char **blocknames; + int numref; + char dobiome; + unsigned char blockids[8]; + unsigned char *img[32]; + unsigned char *dr[32]; + unsigned char *tr[32]; +} mtsblock_t; + +extern int numpalettes, lenpalettes, palette[16], strmaxw, savelen, savepos, savepal, savebiome, numresults, *results; +extern int currlayer, gndlayer, mts_x, mts_y, mts_z, min_x, min_y, min_z, dx, dz, cx, cz, ox, oy, up; +extern int shift, ctrl, activeblock; +extern char **palettes, layerprob[256]; +extern int numblocks; +extern mtsblock_t *blocks; + +typedef struct { + unsigned short param0; + unsigned char param1; + unsigned char param2; +} node_t; +extern node_t nodes[256][256][256]; + +/* PC Screen Font as used by Linux Console */ +typedef struct { + unsigned int magic; + unsigned int version; + unsigned int headersize; + unsigned int flags; + unsigned int numglyph; + unsigned int bytesperglyph; + unsigned int height; + unsigned int width; + unsigned char glyphs; +} _pack psf_t; + +extern psf_t *font; +extern uint32_t theme[]; +extern char *path, *fn, mtsfile[MAXPATHLEN], *status, **lang; +extern unsigned char *tmpblk; +extern SDL_Window *window; +extern SDL_Surface *screen, *icons, *blk, *fg, *bg, *cursor; + +void error(char *msg); + +void mts_load(); +int mts_save(); +int mts_view(int type); +int mts_dump(); +void mts_layerprob(int diff); +void mts_rotate(); +int mts_stairgen(); + +void parseblocks(); +void freeblocks(); + +void sdlprint(int x, int y, int fg, int bg, char *s); +void sdldosave(); +void sdlredraw(); +void sdlmain(); + +void edit_redraw(int full); +void edit_hidecursor(); +void edit_scroll(SDL_Event *event); +void edit_mouseover(SDL_Event *event); +void edit_mousedown(_unused SDL_Event *event); +void edit_rotate(int y, int z, int x); + +void save_redraw(); +void save_scroll(SDL_Event *event); +void save_mousedown(SDL_Event *event); +void save_key(SDL_Event *event); + +void search_redraw(); +void search_scroll(SDL_Event *event); +void search_mousedown(SDL_Event *event); +void search_mouseover(SDL_Event *event); +void search_key(SDL_Event *event); diff --git a/src/mts.c b/src/mts.c new file mode 100644 index 0000000..f44496a --- /dev/null +++ b/src/mts.c @@ -0,0 +1,746 @@ +/* + * mtsedit/mts.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief MTS file format importer / exporter + * + */ + +#include "main.h" + +char mtsfile[MAXPATHLEN]; +/* block type mapping palettes */ +int numpalettes = 0, lenpalettes = 0; +char **palettes = NULL; +/* blocks types */ +int numblocks = 0; +mtsblock_t *blocks = NULL; + +/* the actual MTS in memory */ +int mts_x = 0, mts_y = 0, mts_z = 0; +int currlayer = 127, gndlayer = 0; +char layerprob[256]; +node_t nodes[256][256][256]; + +/** + * Load a Minecraft NBT Schematic file + */ +#define SCHEM_GETINT(v,t) do{switch(t){case 1:v=d[0];d++;break;case 2:v=(d[0]<<8)|d[1];d+=2;break; \ + case 3:v=(d[0]<<24)|(d[1]<<16)|(d[2]<<8)|d[3];d+=4;break;}}while(0) +void schem_load(unsigned char *data, unsigned int size) +{ + int i, j, k, x, y, z, min_x = 0, min_y = 0, min_z = 0; + unsigned char *d, *end = data + size; + + /* we don't care about that overcomplicated NBT mess */ + mts_y = mts_z = mts_x = 0; + for(d = data; d < end && (!mts_y || !mts_z || !mts_x); d++) { + if(!memcmp(d, "\000\006Height", 8)) { d += 8; SCHEM_GETINT(mts_y, d[-9]); d--; } else + if(!memcmp(d, "\000\006Length", 8)) { d += 8; SCHEM_GETINT(mts_z, d[-9]); d--; } else + if(!memcmp(d, "\000\005Width", 7)) { d += 7; SCHEM_GETINT(mts_x, d[-8]); d--; } + } + if(!mts_y || !mts_z || !mts_x || mts_y > 255 || mts_z > 255 || mts_x > 255) { mts_y = mts_z = mts_x = 0; return; } + blocks[0].numref -= mts_y * mts_z * mts_x; + min_x = 127 - mts_x / 2; + min_y = 127 - mts_y / 2; + min_z = 127 - mts_z / 2; + /* now that we know the dimensions, find the blocks data */ + for(d = data; d < end; d++) { + if(!memcmp(d, "\007\000\006Blocks", 9)) { + d += 9; + SCHEM_GETINT(i, 3); + if(i != mts_y * mts_z * mts_x) return; + for(y = 0; y < mts_y; y++) + for(z = 0; z < mts_z; z++) + for(x = 0; x < mts_x; x++, d++) { + if(!*d) continue; + nodes[y+min_y][z+min_z][x+min_x].param1 = 127; + for(i = 1, k = 0; i < numblocks; i++) + for(j = 0; j < 8; j++) + if(blocks[i].blockids[j] == *d) { k = i; i = numblocks; break; } + if(k) { + nodes[y+min_y][z+min_z][x+min_x].param0 = k; + blocks[k].numref++; + } else + fprintf(stderr, "mtsedit: %s: %s %d\r\n", mtsfile, lang[ERR_NODE], *d); + } + status = lang[LOADED]; + break; + } + } +} + +/** + * Load an MTS file + */ +void mts_load() +{ + FILE *f; + unsigned char *data = NULL, *buff = NULL, *un = NULL, *b; + unsigned int size = 0, idx; + int i, j, k, l, n, x, y, z, min_x = 0, min_y = 0, min_z = 0; + unsigned short *tr; + + status = lang[ERR_LOAD]; + mts_x = mts_y = mts_z = 0; currlayer = 127; + memset(layerprob, 127, sizeof(layerprob)); + memset(nodes, 0, sizeof(nodes)); + for(i = 0; i < numblocks; i++) { + blocks[i].dobiome = 0; + blocks[i].numref = 0; + } + blocks[0].numref = 256 * 256 * 256; + savepal = savebiome = 0; + + f = fopen(mtsfile, "rb"); + if(f) { + fseek(f, 0L, SEEK_END); + size = (unsigned int)ftell(f); + fseek(f, 0L, SEEK_SET); + data = (unsigned char*)malloc(size); + if(!data) error(lang[ERR_MEM]); + fread(data, size, 1, f); + fclose(f); + status = lang[ERR_BADFILE]; + /* if it's an MTS file */ + if(!memcmp(data, "MTSM", 4)) { + if(!data[4] && (data[5] == 3 || data[5] == 4) && !data[6] && data[7] && !data[8] && data[9] && + !data[10] && data[11]) { + mts_x = data[7]; mts_y = data[9]; mts_z = data[11]; + blocks[0].numref -= mts_y * mts_z * mts_x; + min_x = 127 - mts_x / 2; + min_y = 127 - mts_y / 2; + min_z = 127 - mts_z / 2; + buff = data + 12; + if(data[5] == 4) { + memcpy(layerprob + min_y, buff, mts_y); + buff += mts_y; + } + n = (buff[0] << 8) | buff[1]; + if(n > 0 && n < 1024) { + buff += 2; + tr = (unsigned short*)malloc(n * sizeof(unsigned short)); + if(!tr) error(lang[ERR_MEM]); + for(i = 0; i < n; i++) { + tr[i] = numblocks; + j = buff[1]; + buff += 2; + for(k = 0; k < numblocks; k++) + for(l = 0; l < numpalettes + 1; l++) + if((!blocks[k].blocknames && l && (int)strlen(blocks[k].name) == j && + !memcmp(blocks[k].name, buff, j)) || (blocks[k].blocknames && blocks[k].blocknames[l] && + (int)strlen(blocks[k].blocknames[l]) == j && !memcmp(blocks[k].blocknames[l], buff, j))) { + if(!l && k) { blocks[k].dobiome = 1; savebiome = 1; } + if(l && l - 1 > savepal) savepal = l - 1; + tr[i] = k; + break; + } + if(tr[i] == numblocks) { + x = buff[j]; buff[j] = 0; + fprintf(stderr, "mtsedit: %s: %s %d '%s'\r\n", mtsfile, lang[ERR_NODE], i, buff); + buff[j] = x; + idx = numblocks++; + blocks = (mtsblock_t*)realloc(blocks, numblocks * sizeof(mtsblock_t)); + if(!blocks) error(lang[ERR_MEM]); + memset(&blocks[idx], 0, sizeof(mtsblock_t)); + blocks[idx].name = (char*)malloc(j + 1); + if(!blocks[idx].name) error(lang[ERR_MEM]); + memcpy(blocks[idx].name, buff, j); + blocks[idx].name[j] = 0; + } + buff += j; + } + size -= (int)(buff - data); + un = (uint8_t*)stbi_zlib_decode_malloc_guesssize_headerflag((const char*)buff, size, 4096, &i, 1); + if(un) { buff = un; size = (unsigned int)i; } + if(4 * mts_x * mts_y * mts_z <= (int)size) { + for(z = 0, b = buff; z < mts_z; z++) + for(y = 0; y < mts_y; y++) + for(x = 0; x < mts_x; x++, b += 2) { + nodes[y+min_y][z+min_z][x+min_x].param0 = tr[(b[0] << 8) | b[1]]; + blocks[nodes[y+min_y][z+min_z][x+min_x].param0].numref++; + } + for(z = 0; z < mts_z; z++) + for(y = 0; y < mts_y; y++) + for(x = 0; x < mts_x; x++, b++) + nodes[y+min_y][z+min_z][x+min_x].param1 = data[5] == 3 ? b[0] >> 1 : b[0]; + for(z = 0; z < mts_z; z++) + for(y = 0; y < mts_y; y++) + for(x = 0; x < mts_x; x++, b++) + nodes[y+min_y][z+min_z][x+min_x].param2 = b[0]; + gndlayer = currlayer = min_y; + for(y = 0; y < mts_y; y++) + for(z = 0; z < mts_z; z++) + for(x = 0; x < mts_x; x++) + if(nodes[y+min_y][z+min_z][x+min_x].param2 == 0x20) { + gndlayer = currlayer = y+min_y; + nodes[y+min_y][z+min_z][x+min_x].param2 = 0; + } + status = lang[LOADED]; + } else mts_x = mts_y = mts_z = 0; + free(tr); + if(un) free(un); + } else mts_x = mts_y = mts_z = 0; + buff = NULL; + } + } else { + /* Could be a Minecraft NBT */ + if(data[0] == 0x1f && data[1] == 0x8b) { + /* skip over gzip header */ + buff = data + 3; + i = *buff++; buff += 6; + if(i & 4) { j = *buff++; j += (*buff++ << 8); buff += j; } + if(i & 8) { while(*buff++ != 0); } + if(i & 16) { while(*buff++ != 0); } + if(i & 2) buff += 2; + size -= (int)(buff - data); + } else buff = data; + buff = (uint8_t*)stbi_zlib_decode_malloc_guesssize_headerflag((const char*)buff, size, 4096, &i, 0); + if(buff) { free(data); data = buff; buff = NULL; size = (unsigned int)i; } + if(!memcmp(data + 3, "Schematic", 9)) schem_load(data, size); + } + /* make sure that all non-air blocks have their probability set */ + for(y = 0; y < mts_y; y++) + for(z = 0; z < mts_z; z++) + for(x = 0; x < mts_x; x++, b++) + if(nodes[y+min_y][z+min_z][x+min_x].param0 && !nodes[y+min_y][z+min_z][x+min_x].param1) + nodes[y+min_y][z+min_z][x+min_x].param1 = 127; + } + if(data) free(data); + if(buff) free(buff); +} + +/** + * Save an MTS file + */ +int mts_save() +{ + char outfile[MAXPATHLEN], *c; + unsigned short *tr, *tr2; + unsigned char *b, *b2, hdr[12]; + int i, j, k, x, y, z, mix = 255, max = 0, miy = 255, may = 0, miz = 255, maz = 0; + FILE *f; + + status = lang[ERR_SAVE]; + tr = (unsigned short*)malloc(numblocks * sizeof(unsigned short)); + if(!tr) error(lang[ERR_MEM]); + memset(tr, 0, numblocks * sizeof(unsigned short)); + tr2 = (unsigned short*)malloc(numblocks * sizeof(unsigned short)); + if(!tr2) error(lang[ERR_MEM]); + memset(tr2, 0, numblocks * sizeof(unsigned short)); + /* get boundind box and block ID translation tables, sanitize probability values */ + j = 1; + for(y = 0; y < 256; y++) { + for(z = k = 0; z < 256; z++) + for(x = 0; x < 256; x++) { + if(nodes[y][z][x].param0) { + if(!tr2[nodes[y][z][x].param0]) { + tr2[nodes[y][z][x].param0] = j; + tr[j++] = nodes[y][z][x].param0; + } + if(x < mix) mix = x; + if(x > max) max = x; + if(y < miy) miy = y; + if(y > may) may = y; + if(z < miz) miz = z; + if(z > maz) maz = z; + if(!nodes[y][z][x].param1) nodes[y][z][x].param1 = 127; + if(!layerprob[y]) layerprob[y] = 127; + k = 1; + } else + nodes[y][z][x].param1 = 0; + } + if(!k) layerprob[y] = 0; + } + if(mix > max) { free(tr); free(tr2); return 1; } + + for(y = miy; y <= may; y++) { + /* close windows and doors */ + for(z = miz+1; z < maz; z++) + for(x = mix+1; x < max; x++) + if(!nodes[y][z][x].param0 && !nodes[y][z][x].param1 && ( + (nodes[y][z-1][x].param1 && (nodes[y][z+1][x].param1 || (z<254 && nodes[y][z+2][x].param1))) || + (nodes[y][z][x-1].param1 && (nodes[y][z][x+1].param1 || (x<254 && nodes[y][z][x+2].param1))))) + nodes[y][z][x].param1 = 127; + /* mark air in rooms temporarly */ + for(z = miz+1; z < maz; z++) + for(x = mix+1; x < max; x++) + if(!nodes[y][z][x].param0 && !nodes[y][z][x].param1 && + (nodes[y][z-1][x].param1 || nodes[y][z][x-1].param1)) + nodes[y][z][x].param1 = 1; + /* clear rooms which are connected with the outside */ + do { + k = 0; + for(z = miz+1; z < maz; z++) + for(x = mix+1; x < max; x++) + if(nodes[y][z][x].param1 == 1 && + (!nodes[y][z-1][x].param1 || !nodes[y][z+1][x].param1 || !nodes[y][z][x-1].param1 || + !nodes[y][z][x+1].param1)) { + nodes[y][z][x].param1 = 0; + k = 1; + } + } while(k); + /* make air in closed rooms permanent */ + for(z = miz+1; z < maz; z++) + for(x = mix+1; x < max; x++) + if(nodes[y][z][x].param1 == 1) nodes[y][z][x].param1 = 127; + /* mark ground level */ + if(y == gndlayer) + for(z = miz; z <= maz; z++) + for(x = mix; x <= max; x++) + if(!nodes[y][z][x].param0) nodes[y][z][x].param2 = 0x20; + } + + /* get filename, buffer and open file */ + strcpy(outfile, mtsfile); + c = strrchr(outfile, '.'); + if(!c) c = &outfile[strlen(outfile)]; + strcpy(c, ".mts"); + f = fopen(outfile,"wb"); + if(!f) return 1; + b = (unsigned char*)malloc((max-mix+1) * (may-miy+1) * (maz-miz+1) * 4); + if(!b) error(lang[ERR_MEM]); + memset(b, 0, (max-mix+1) * (may-miy+1) * (maz-miz+1) * 4); + memset(hdr, 0, sizeof(hdr)); + + /* write header */ + memcpy(hdr, "MTSM", 4); + for(hdr[5] = 3, y = miy; y <= may; y++) + if(layerprob[y] != 127) { hdr[5] = 4; break; } + hdr[7] = max-mix+1; + hdr[9] = may-miy+1; + hdr[11] = maz-miz+1; + fwrite(hdr, 12, 1, f); + if(hdr[5] == 4) + fwrite(layerprob + miy, may-miy+1, 1, f); + + /* write Name-ID table */ + hdr[0] = 0; hdr[1] = j; + fwrite(hdr, 2, 1, f); + if(savepal < 0 || savepal >= numpalettes) savepal = 0; + for(i = 0; i < j; i++) { + c = !blocks[tr[i]].blocknames ? blocks[tr[i]].name : (savebiome && blocks[tr[i]].blocknames[0] && + blocks[tr[i]].dobiome ? blocks[tr[i]].blocknames[0] : (blocks[tr[i]].blocknames[savepal+1] ? + blocks[tr[i]].blocknames[savepal+1] : blocks[tr[i]].name)); + hdr[1] = strlen(c); + fwrite(hdr, 2, 1, f); + fwrite(c, hdr[1], 1, f); + } + + /* construct param buffer */ + for(z = miz, b2 = b; z <= maz; z++) + for(y = miy; y <= may; y++) + for(x = mix; x <= max; x++, b2 += 2) { + b2[0] = tr2[nodes[y][z][x].param0] >> 8; + b2[1] = tr2[nodes[y][z][x].param0] & 0xFF; + } + for(z = miz; z <= maz; z++) + for(y = miy; y <= may; y++) + for(x = mix; x <= max; x++, b2++) + *b2 = hdr[5] == 4 ? nodes[y][z][x].param1 : ((nodes[y][z][x].param1 << 1) | (nodes[y][z][x].param1 ? 1 : 0)); + for(z = miz; z <= maz; z++) + for(y = miy; y <= may; y++) + for(x = mix; x <= max; x++, b2++) + *b2 = nodes[y][z][x].param2; + /* compress and save */ + x = 1; + b2 = stbi_zlib_compress(b, (max-mix+1) * (may-miy+1) * (maz-miz+1) * 4, &i, 9); + if(b2) { + fwrite(b2, i, 1, f); + free(b2); + status = lang[SAVED]; + x = 0; + } + fclose(f); + free(b); + free(tr); + free(tr2); + return x; +} + +/** + * Save a PNG preview file + */ +int mts_view(int type) +{ + int i, j, w, h, x, y, z, mix = 255, max = 0, miy = 255, may = 0, miz = 255, maz = 0; + int miw = 65536, maw = 0, mih = 65536, mah = 0, r = 0, k, n; + char pngfile[MAXPATHLEN], *c; + unsigned char *buff = NULL; + SDL_Surface *preview, *blk; + SDL_Rect src, dst; + FILE *f; + + status = lang[ERR_PREVIEW]; + for(y = 0; y < 256; y++) + for(z = 0; z < 256; z++) + for(x = 0; x < 256; x++) { + if(nodes[y][z][x].param0) { + if(x < mix) mix = x; + if(x > max) max = x; + if(y < miy) miy = y; + if(y > may) may = y; + if(z < miz) miz = z; + if(z > maz) maz = z; + i = dx * ((x-128) - (z-128)); + j = dz * ((z-128) + (x-128)); + if(i < miw) miw = i; + if(i > maw) maw = i; + if(j < mih) mih = j; + if(j > mah) mah = j; + } + } + if(mix > max) return 1; + w = (((max - mix) > (maz - miz) ? (max - mix) : (maz - miz)) + 1) * 2 * dx + 32; + h = mah - mih + dz + (2 * (may - miy) + 2) * dz + 32; + blk = SDL_CreateRGBSurfaceFrom(NULL, 32, 32, 32, 32*4, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + preview = SDL_CreateRGBSurface(0, w, h, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + src.x = src.y = 0; src.w = src.h = dst.w = dst.h = 32; + n = ((max-mix)+(maz-miz))/2; + for(y = miy; y <= may; y++) + for(z = miz; z <= maz; z++) { + if(type) r = ((z-miz+1)*(max-mix+1)/(maz-miz+1))/(may-y+1); + for(x = miz; x <= max - r; x++) { + if(nodes[y][z][x].param0) { + dst.x = dx * ((x-(max-mix)/2) - (z-(maz-miz)/2) - 1) + w/2; + dst.y = h - (mah - mih) - (y-miy+2)*2*dz + dz * ((z-miz) + (x-mix)); + i = nodes[y][z][x].param0; + j = nodes[y][z][x].param2 & 0x1F; + if(i && !blocks[i].img[j]) j = 0; + if(i && blocks[i].img[j]) { + memcpy(tmpblk, blocks[i].img[j], 32 * 32 * 4); + for(j = 0; j < 32 * 32 * 4; j += 4) { + k = (int)(tmpblk[j+0]) * ((x-mix)+(z-miz)) / n; + tmpblk[j+0] = k > 255 ? 255 : k; + k = (int)(tmpblk[j+1]) * ((x-mix)+(z-miz)) / n; + tmpblk[j+1] = k > 255 ? 255 : k; + k = (int)(tmpblk[j+2]) * ((x-mix)+(z-miz)) / n; + tmpblk[j+2] = k > 255 ? 255 : k; + } + blk->pixels = tmpblk; + SDL_BlitSurface(blk, &src, preview, &dst); + } + } + } + } + buff = (unsigned char *)stbi_write_png_to_mem(preview->pixels, preview->pitch, preview->w, preview->h, 4, &i); + if(buff) { + strcpy(pngfile, mtsfile); + c = strrchr(pngfile, '.'); + if(!c) c = &pngfile[strlen(pngfile)]; + strcpy(c, ".png"); + f = fopen(pngfile,"wb"); + if(f) { + fwrite(buff, i, 1, f); + fclose(f); + status = lang[PREVIEWSAVED]; + fprintf(stderr, "mtsedit: %s: %s\r\n", pngfile, status); + } + free(buff); + } + SDL_FreeSurface(preview); + SDL_FreeSurface(blk); + return 0; +} + +/** + * Change layer probability + */ +void mts_layerprob(int diff) +{ + if(diff < 0 && (int)layerprob[currlayer] > 0) layerprob[currlayer]--; + if(diff > 0 && (int)layerprob[currlayer] < 127) layerprob[currlayer]++; +} + +/** + * Rotate the entire MTS structure + */ +void mts_rotate() +{ + int x, y, z; + node_t layer[256][256]; + + for(y = 0; y < 256; y++) { + memcpy(layer, nodes[y], sizeof(node_t)*256*256); + for(z = 0; z < 256; z++) + for(x = 0; x < 256; x++) { + memcpy(&nodes[y][z][x], &layer[x][255-z], sizeof(node_t)); + edit_rotate(y, z, x); + } + } +} + +/** + * Dump structure + */ +int mts_dump() +{ + unsigned short *tr, *tr2; + int i, j, x, y, z, mix = 255, max = 0, miy = 255, may = 0, miz = 255, maz = 0; + + tr = (unsigned short*)malloc(numblocks * sizeof(unsigned short)); + if(!tr) error(lang[ERR_MEM]); + memset(tr, 0, numblocks * sizeof(unsigned short)); + tr2 = (unsigned short*)malloc(numblocks * sizeof(unsigned short)); + if(!tr2) error(lang[ERR_MEM]); + memset(tr2, 0, numblocks * sizeof(unsigned short)); + j = 1; + for(y = 0; y < 256; y++) + for(z = 0; z < 256; z++) + for(x = 0; x < 256; x++) { + if(nodes[y][z][x].param0) { + if(!tr2[nodes[y][z][x].param0]) { + tr2[nodes[y][z][x].param0] = j; + tr[j++] = nodes[y][z][x].param0; + } + if(x < mix) mix = x; + if(x > max) max = x; + if(y < miy) miy = y; + if(y > may) may = y; + if(z < miz) miz = z; + if(z > maz) maz = z; + } + } + if(mix > max) { free(tr); free(tr2); return 1; } + printf("-------------------------------- %s --------------------------------\r\n", mtsfile); + printf("Map (x: %d y: %d z: %d):\r\n", max-mix+1, may-miy+1, maz-miz+1); + if(savepal < 0 || savepal >= numpalettes) savepal = 0; + for(i = 0; i < j; i++) + printf("%4x: %s\r\n", i, blocks[tr[i]].blocknames && blocks[tr[i]].blocknames[savepal+1] ? + blocks[tr[i]].blocknames[savepal+1] : blocks[tr[i]].name); + + for(y = miy; y <= may; y++) { + printf("\r\nLayer %d (probability %d%s):\r\n", y - miy, layerprob[y], y == gndlayer ? ", Ground level" : ""); + for(z = miz; z <= maz; z++) { + if(j < 15) printf(" "); + for(x = mix; x <= max; x++) { + if(nodes[y][z][x].param0) { + if(j < 15) printf("%x", tr2[nodes[y][z][x].param0]); + else printf(" %02x", tr2[nodes[y][z][x].param0]); + } else printf(j < 15 ? "." : " .."); + } + printf(" "); + for(x = mix; x <= max; x++) + printf(" %02x", nodes[y][z][x].param1); + printf(" "); + for(x = mix; x <= max; x++) + printf(" %02x", y == gndlayer && !nodes[y][z][x].param0 ? 32 : nodes[y][z][x].param2); + printf("\r\n"); + } + } + + free(tr); + free(tr2); + return 0; +} + +/** + * Generate slab and stair pictures from block image + */ +int mts_stairgen() +{ + FILE *f; + stbi__context sc; + stbi__result_info ri; + int i, j, w, h, l, x0,x1,x2, y0,y1,y2,y3,y4; + unsigned int size; + unsigned char *d, *data, *block, *slab, *stair; + char *c; + + f = fopen(mtsfile, "rb"); + if(f) { + fseek(f, 0L, SEEK_END); + size = (unsigned int)ftell(f); + fseek(f, 0L, SEEK_SET); + data = (unsigned char*)malloc(size); + if(!data) error(lang[ERR_MEM]); + fread(data, size, 1, f); + fclose(f); + c = strrchr(mtsfile, '_'); + if(!c) c = strrchr(mtsfile, '.'); + if(!c) c = &mtsfile[strlen(mtsfile)]; + sc.read_from_callbacks = 0; + sc.img_buffer = sc.img_buffer_original = data; + sc.img_buffer_end = sc.img_buffer_original_end = data + size; + ri.bits_per_channel = 8; + block = (unsigned char*)stbi__png_load(&sc, &w, &h, &l, 0, &ri); + free(data); + if(!block) return 1; + slab = (unsigned char *)malloc(w * h * 4); + if(!slab) error(lang[ERR_MEM]); + memset(slab, 0, w * h * 4); + stair = (unsigned char *)malloc(w * h * 4); + if(!stair) error(lang[ERR_MEM]); + /* detect cube edges */ + for(d = block; d[3] < 128; d += 4); + x1 = ((int)(d - block) % (w * 4)) / 4; + y0 = (int)(d - block) / (w * 4); + for(i = 0, d = block; i < w/2 && d[3] < 128; i++) + for(j = 0, d = block + i*4; j < h/2 && d[3] < 128; j++, d += w*4); + x0 = ((int)(d - block) % (w * 4)) / 4 - 1; + y1 = (int)(d - block) / (w * 4); + x2 = x1 + (x1 - x0) + 1; + y2 = y1 + (y1 - y0); + for(; d[3] > 128; d += w*4); + d -= w*4; + y3 = (int)(d - block) / (w * 4); + y4 = y3 + (y1 - y0); +#if DEBUG + *((uint32_t*)(slab + y0*w*4 + x1*4)) = 0xFF0000FF; + *((uint32_t*)(slab + y1*w*4 + x0*4)) = 0xFF0000FF; + *((uint32_t*)(slab + y1*w*4 + x2*4)) = 0xFF00FF00; + *((uint32_t*)(slab + y2*w*4 + x1*4)) = 0xFF00FF00; + *((uint32_t*)(slab + y3*w*4 + x0*4)) = 0xFF0000FF; + *((uint32_t*)(slab + y3*w*4 + x2*4)) = 0xFF00FF00; + *((uint32_t*)(slab + y4*w*4 + x1*4)) = 0xFF00FF00; +#endif + + /* rotated block */ + for(i = x0; i <= x2+1; i++) { + for(j = y0; j <= y4; j++) + *((uint32_t*)(slab + j*w*4 + (x2 - i + x0 + (x0 & 1))*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + data = (unsigned char *)stbi_write_png_to_mem(slab, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_01.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + /* slab */ + memset(slab, 0, w * h * 4); + for(i = x0; i <= x1; i++) { + l = (y1 - y0) * (i - x0) / (x1 - x0); + for(j = y0; j < y1 + (y3 - y1)/2 + l; j++) + *((uint32_t*)(slab + (j+(y3 - y1)/2+1)*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + for(j = y3 + l; j < h; j++) + *((uint32_t*)(slab + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(i = x1+1; i <= x2; i++) { + l = (y1 - y0) * ((x2-i+1) - x1) / (x2 - x1); + for(j = y0; j < y2 + (y3 - y1)/2 + l; j++) + *((uint32_t*)(slab + (j+(y3 - y1)/2+1)*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + for(j = y4 + l; j < h; j++) + *((uint32_t*)(slab + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + + data = (unsigned char *)stbi_write_png_to_mem(slab, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_Slab_00.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + /* rotated stairs */ + memcpy(stair, slab, w * h * 4); + for(i = x0; i <= x1 + (x2 - x1)/2; i++) { + l = (y1 - y0) * (i - x0) / (x1 - x0); + for(j = y0 + l; j < y4; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(i = x1; i <= x2; i++) { + l = (y1 - y0) * (i - x1) / (x1 - x0); + for(j = y0 + l; j <= y0 + l + 1; j++) + *((uint32_t*)(stair + (j+(y1-y0)/2)*w*4 + (i - (x1 - x0)/2)*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + data = (unsigned char *)stbi_write_png_to_mem(stair, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_Stair_00.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + memcpy(stair, slab, w * h * 4); + for(i = x0 + (x1 - x0)/2; i <= x2; i++) { + l = (y1 - y0) * ((x2-i+1) - x1) / (x2 - x1); + for(j = y1 + l; j < y4; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(i = x0; i <= x1; i++) { + l = (y1 - y0) * ((x1-i+1) - x1) / (x1 - x0); + for(j = y1 + l; j <= y2 + l; j++) + *((uint32_t*)(stair + (j+(y1-y0)/2)*w*4 + (i+(x1 - x0)/2)*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + data = (unsigned char *)stbi_write_png_to_mem(stair, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_Stair_01.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + memcpy(stair, slab, w * h * 4); + for(i = x0 + (x1 - x0)/2; i <= x1 + (x2 - x1)/2; i++) { + l = (y1 - y0) * (i - x0) / (x1 - x0); + for(j = y0; j <= y0 + l; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(; i <= x2; i++) { + for(j = y0; j <= y4; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(i = x0; i < x1; i++) { + l = (y1 - y0) * (i - x0) / (x1 - x0); + for(j = y1 + l - 1; j <= y1 + (y3 - y1)/2 + l; j++) + *((uint32_t*)(stair + (j-(y1-y0)/2)*w*4 + (i + (x1 - x0)/2)*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + data = (unsigned char *)stbi_write_png_to_mem(stair, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_Stair_02.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + memcpy(stair, slab, w * h * 4); + for(i = x0; i <= x0 + (x1 - x0)/2 +1; i++) { + for(j = y0; j <= y4; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(; i <= x2; i++) { + l = (y1 - y0) * (i - (x0 + (x1 - x0)/2)) / (x2 - x1); + for(j = y0; j <= y1 + (y2 - y1)/2 - l; j++) + *((uint32_t*)(stair + j*w*4 + i*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + for(i = x1+1; i <= x2; i++) { + l = (y1 - y0) * ((x2-i+1) - x1) / (x2 - x1); + for(j = y2 + l - 1; j <= y2 + (y3 - y1)/2 + l; j++) + *((uint32_t*)(stair + (j-(y1-y0)/2)*w*4 + (i-(x1-x0)/2)*4)) = *((uint32_t*)(block + j*w*4 + i*4)); + } + data = (unsigned char *)stbi_write_png_to_mem(stair, w*4, w, h, 4, &l); + if(data) { + strcpy(c, "_Stair_03.png"); + f = fopen(mtsfile,"wb"); + if(f) { fwrite(data, l, 1, f); fclose(f); } + free(data); + } + + fprintf(stderr, "mtsedit: %s\r\n", lang[IMGSGEN]); + return 0; + } + return 1; +} diff --git a/src/save.c b/src/save.c new file mode 100644 index 0000000..e072943 --- /dev/null +++ b/src/save.c @@ -0,0 +1,239 @@ +/* + * mtsedit/save.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Save file window + * + */ + +#include "main.h" + +int savelen, savepos, savefld = 0, savepal = 0, savebiome = 0, biomepos = 0, biomeblk = -1, maxbiome = 0, biomescr = 0; +extern char cur[2]; + +/** + * Redraw the Save file window + */ +void save_redraw() +{ + unsigned int i, j; + int k, l; + SDL_Rect rect; + + strmaxw = screen->w - 5; + sdlprint((screen->w - 47 - strlen(lang[SAVEAS]) * (font->width+1)) / 2 + 47, 4, THEME_INPUT, THEME_BG, lang[SAVEAS]); + rect.y = 12 + font->height; + sdlprint(42, rect.y, THEME_FG, THEME_BG, lang[FILENAME]); + rect.x = 160; rect.w = screen->w - 165; rect.h = font->height + 2; + SDL_FillRect(screen, &rect, theme[THEME_INPBG]); + strmaxw = screen->w - 5; + sdlprint(161,rect.y + 1, !savefld ? THEME_INPUT : THEME_INACT, THEME_INPBG, mtsfile); + if(!savefld) { + cur[0] = mtsfile[savepos] ? mtsfile[savepos] : ' '; + sdlprint(161 + savepos * (font->width+1), rect.y + 1, THEME_INPBG, THEME_INPUT, cur); + } + rect.y = 16 + 2*font->height; + sdlprint(42, rect.y, THEME_FG, THEME_BG, lang[MAPPING]); + i = lenpalettes * (font->width + 1) + 2; + strmaxw = screen->w - 5 - font->width; + rect.x = 160; rect.w = i < screen->w - 165 - font->width ? i : screen->w - 165 - font->width; rect.h = font->height + 2; + l = rect.w; + SDL_FillRect(screen, &rect, theme[THEME_INPBG]); + if(savepal < 0 || savepal >= numpalettes) savepal = 0; + sdlprint(161,rect.y + 1, savefld == 1 ? THEME_INPUT : THEME_INACT, THEME_INPBG, palettes[savepal]); + strmaxw = screen->w - 5; + sdlprint(160 + rect.w, rect.y+1, THEME_BG, savefld == 1 ? THEME_INPUT : THEME_FG, "\031"); + + sdlprint(42, 20 + 3*font->height, THEME_FG, THEME_BG, lang[BIOMETYPE]); + sdlprint(160, 20 + 3*font->height, savefld == 3 ? THEME_INPUT : THEME_FG, THEME_BG, + savebiome ? "\xE2\x98\x92" : "\xE2\x98\x90"); + + rect.y = 24 + 4*font->height; rect.x = 42; rect.w = screen->w - 47; + if(savebiome) { + j = screen->h - 2*font->height - 8; + rect.h = j - rect.y; + SDL_FillRect(screen, &rect, theme[THEME_INPBG]); + for(k = 0, i = 1; (int)i < numblocks; i++) { + if(blocks[i].numref && blocks[i].blocknames && blocks[i].blocknames[0] && (rect.y + font->height) < j) { + if(k >= biomescr) { + if(biomeblk == k) blocks[i].dobiome ^= 1; + strmaxw = screen->w / 2 - 4; + sdlprint(44,rect.y, savefld == 4 && biomepos == k ? THEME_INPUT : THEME_INACT, THEME_INPBG, blocks[i].name); + strmaxw = screen->w - 5; + sdlprint(screen->w/2,rect.y, savefld == 4 && biomepos == k ? THEME_INPUT : THEME_INACT, THEME_INPBG, + blocks[i].blocknames[blocks[i].dobiome ? 0 : savepal + 1]); + rect.y += font->height; + } + k++; + } + } + biomeblk = -1; + if(k > maxbiome) maxbiome = k; + if(!k) sdlprint(44, rect.y, THEME_INACT, THEME_INPBG, lang[ERR_NOBIOM]); + rect.y = j + 4; + } + rect.h = font->height + 2; + SDL_FillRect(screen, &rect, theme[savefld == 5 ? THEME_SAVEACT : THEME_SAVEINACT]); + sdlprint((screen->w - 47 - strlen(lang[SAVEBTN]) * (font->width+1)) / 2 + 42, rect.y+1, + savefld == 5 ? THEME_INPUT : THEME_FG, + savefld == 5 ? THEME_SAVEACT : THEME_SAVEINACT, lang[SAVEBTN]); + if(savefld == 2) { + rect.w = l; rect.x = 160 + font->width; rect.y = 16 + 3*font->height; rect.h = font->height; + for(i = 0; (int)i < numpalettes; i++, rect.y += rect.h) { + SDL_FillRect(screen, &rect, theme[savepal == (int)i ? THEME_INPUT : THEME_INPBG]); + sdlprint(rect.x, rect.y, savepal == (int)i ? THEME_BG : THEME_FG, savepal == (int)i ? THEME_INPUT : THEME_INPBG, + palettes[i]); + } + } +} + +/** + * Save file window scrolling event handler + */ +void save_scroll(SDL_Event *event) +{ + if(!savebiome) return; + biomescr -= event->wheel.y; + if(biomescr < 0) biomescr = 0; + if(biomescr + 1 >= maxbiome) biomescr = maxbiome - 1; +} + +/** + * Save file window mouse down event handler + */ +void save_mousedown(SDL_Event *event) +{ + int i = savebiome ? screen->h - 2*font->height - 4 : 24 + 4*font->height; + if(event->button.x < 42) return; + if(savefld == 2) { + if(event->button.x >= (int)(160 + font->width) && event->button.x < (int)(160 + (lenpalettes+1) * (font->width + 1)) && + event->button.y >= (int)(16 + 3*font->height) && event->button.y < (int)(16 + (3+numpalettes)*font->height)) { + savefld = 3; + savepal = (event->button.y - 16 - 3*font->height) / font->height; + } + return; + } + if(event->button.y >= (int)(12 + font->height) && event->button.y < (int)(16 + 2*font->height) && savefld) { + savefld = 0; savepos = savelen = strlen(mtsfile); + } + if(event->button.y >= (int)(16 + 2*font->height) && event->button.y < (int)(20 + 3*font->height)) { + savefld = 2; + } + if(event->button.y >= (int)(20 + 3*font->height) && event->button.y < (int)(24 + 4*font->height)) { + savefld = 3; + savebiome ^= 1; + biomepos = 0; + } + if(event->button.y >= i && event->button.y < (int)(i + font->height)) sdldosave(); + else if(savebiome && event->button.y >= (int)(24 + 4*font->height) && event->button.y < i) { + biomepos = biomescr + (event->button.y - (24 + 4*font->height)) / font->height; + if(savefld != 4) savefld = 4; + else biomeblk = biomepos; + } +} + +/** + * Save file window key event handler + */ +void save_key(SDL_Event *event) +{ + int i, j; + + switch(event->type) { + case SDL_TEXTINPUT: + j = strlen(event->text.text); + if(!savefld && savelen + j < (int)(sizeof(mtsfile))) { + for(i = savelen - 1; i >= savepos; i--) mtsfile[i + j] = mtsfile[i]; + memcpy(mtsfile + savepos, &event->text.text, j); + savepos += j; + savelen += j; + mtsfile[savelen] = 0; + } + break; + case SDL_KEYUP: + switch (event->key.keysym.sym) { + case SDLK_TAB: + if(savefld == 5) savefld = 0; else + if(savefld == 1) savefld = 3; else savefld++; + if(!savebiome && savefld == 4) savefld++; + break; + case SDLK_BACKSPACE: + if(!savefld && savepos) { + savepos--; + for(i = savepos; i < savelen + 1; i++) mtsfile[i] = mtsfile[i+1]; + savelen--; + } + break; + case SDLK_DELETE: + if(!savefld && savepos < savelen) { + for(i = savepos; i < savelen + 1; i++) mtsfile[i] = mtsfile[i+1]; + savelen--; + } + break; + case SDLK_UP: + if(!savefld) savepos = 0; + if(savefld == 1 || savefld == 2) { + if(!savepal) savepal = numpalettes - 1; else savepal--; + } + if(savefld == 4) { + if(!biomepos && maxbiome) biomepos = maxbiome - 1; else biomepos--; + if(biomepos < biomescr) biomescr = biomepos; + i = ((screen->h - 2*font->height - 8) - (24 + 4*font->height)) / font->height; + if(biomepos >= biomescr + i) biomescr = biomepos - i; + } + break; + case SDLK_DOWN: + if(!savefld) savepos = savelen; + if(savefld == 1 || savefld == 2) { + if(savepal + 1 >= numpalettes) savepal = 0; else savepal++; + } + if(savefld == 4) { + if(biomepos + 1 >= maxbiome) biomepos = 0; else biomepos++; + if(biomepos < biomescr) biomescr = biomepos; + i = ((screen->h - 2*font->height - 8) - (24 + 4*font->height)) / font->height; + if(biomepos >= biomescr + i) biomescr = biomepos - i; + } + break; + case SDLK_LEFT: + if(!savefld && savepos) savepos--; + if(savefld == 1 || savefld == 2) { + if(!savepal) savepal = numpalettes - 1; else savepal--; + } + break; + case SDLK_RIGHT: + if(!savefld && savepos < savelen) savepos++; + if(savefld == 1 || savefld == 2) { + if(savepal + 1 >= numpalettes) savepal = 0; else savepal++; + } + break; + case SDLK_RETURN: sdldosave(); break; + default: + if(savefld == 1) savefld = 2; else if(savefld == 2) savefld = 1; + if(savefld == 3) { savebiome ^= 1; biomepos = 0; } + if(savefld == 4) { biomeblk = biomepos; } + break; + } + break; + } +} diff --git a/src/sdl.c b/src/sdl.c new file mode 100644 index 0000000..3038417 --- /dev/null +++ b/src/sdl.c @@ -0,0 +1,489 @@ +/* + * mtsedit/sdl.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief SDL specific UI code + * + */ + +#include "main.h" + +uint32_t theme[] = { 0xFFF0F0F0, 0xFFF4F4F4, 0xFFBEBEBE, 0xFF808080, 0xFF5C5C5C, 0xFF4C4C4C, 0xFF454545, 0xFF383838, 0xFF303030, + 0xFFC00000, 0xFF800000 }; + +int quitting = 0, activetool = -1, overtool = -1, activeblock = 0, overblock = -1, palette[16], strmaxw, shift = 0, ctrl = 0; +char *status = NULL; +unsigned char *tmpblk = NULL; +SDL_Window *window = NULL; +SDL_Surface *icons = NULL; +SDL_Surface *screen = NULL; +SDL_Surface *fg = NULL; +SDL_Surface *bg = NULL; +SDL_Surface *blk = NULL; +SDL_Cursor *working, *pointer; + +psf_t *font = NULL; + +/** + * Print string to screen + */ +void sdlprint(int x, int y, int fg, int bg, char *s) +{ + unsigned char *glyph; + unsigned int c, offs, i, j, line, mask, bytesperline = (font->width + 7) / 8; + + for(; *s && x < strmaxw;) { + if((*s & 128) != 0) { + if(!(*s & 32)) { c = ((*s & 0x1F)<<6)|(*(s+1) & 0x3F); s++; } else + if(!(*s & 16)) { c = ((*s & 0xF)<<12)|((*(s+1) & 0x3F)<<6)|(*(s+2) & 0x3F); s += 2; } else + if(!(*s & 8)) { c = ((*s & 0x7)<<18)|((*(s+1) & 0x3F)<<12)|((*(s+2) & 0x3F)<<6)|(*(s+3) & 0x3F); *s += 3; } + else c = 0; + } else c = *s; + s++; + glyph = (unsigned char*)font + font->headersize + (c < font->numglyph ? c : 0) * font->bytesperglyph; + offs = (y * screen->pitch) + (x * 4); + for(j = 0; j < font->height; j++){ + line = offs; + mask = 1<<(font->width-1); + for(i = 0; i < font->width && (int)(x + i) < strmaxw; i++){ + *((uint32_t*)((uint8_t*)screen->pixels + line)) = theme[(*glyph & mask)?fg:bg]; + mask >>= 1; + line += 4; + } + glyph += bytesperline; + offs += screen->pitch; + } + x += font->width + 1; + } +} + +/** + * Redraw the toolbar + */ +void sdltoolbar() +{ + int i, m; + char *s = status, str[5]; + SDL_Rect src, dst; + + dst.x = dst.y = 0; dst.w = 36; dst.h = screen->h; + SDL_FillRect(screen, &dst, theme[THEME_BG]); + dst.x = 2; dst.y = 4 + 5*36; dst.w = 32; dst.h = screen->h - 3*font->height - 2*37 - dst.y; + SDL_FillRect(screen, &dst, theme[THEME_TABBG]); + + src.w = src.h = dst.w = dst.h = 32; src.x = 0; dst.x = 2; + dst.y = screen->h - 3*font->height - 2*37; + for(i = 5; i < 7; i++, dst.y += 36) { + src.y = (i+6) * 32; + dst.x--; dst.y--; dst.w += 2; dst.h += 2; + SDL_FillRect(screen, &dst, theme[i == activetool ? THEME_FG : (i == overtool ? THEME_INACT : THEME_BG)]); + dst.x++; dst.y++; dst.w -= 2; dst.h -= 2; + SDL_BlitSurface(icons, &src, screen, &dst); + } + dst.y = 2; + for(i = 0; i < 5; i++) { + src.y = (i+5) * 32; + dst.y = 4 + (i * 36); + dst.x--; dst.y--; dst.w += 2; dst.h += 2; + SDL_FillRect(screen, &dst, theme[i == activetool ? THEME_FG : (i == overtool ? THEME_INACT : THEME_BG)]); + dst.x++; dst.y++; dst.w -= 2; dst.h -= 2; + SDL_BlitSurface(icons, &src, screen, &dst); + } + src.y = 10 * 32; dst.x = 2; dst.y = 4 + 5 * 36; + m = screen->h - 3*font->height - 2*37; + SDL_FillRect(screen, &dst, theme[!activeblock ? THEME_INACT : (!overblock ? THEME_INPBG : THEME_TABBG)]); + SDL_BlitSurface(icons, &src, screen, &dst); + src.y = 0; dst.y += 32; + for(i = 1; i < 16 && palette[i] && dst.y < m; dst.y += 32, i++) { + if(dst.y + dst.h > m) dst.h = src.h = m - dst.y; + SDL_FillRect(screen, &dst, theme[i == activeblock ? THEME_INACT : (i == overblock ? THEME_INPBG : THEME_TABBG)]); + blk->pixels = blocks[palette[i]].img[0] ? blocks[palette[i]].img[0] : (uint8_t*)icons->pixels + 32 * icons->pitch; + SDL_BlitSurface(blk, &src, screen, &dst); + } + dst.x = 36; dst.y = screen->h - font->height; dst.w = screen->w - 36; dst.h = font->height; + SDL_FillRect(screen, &dst, theme[THEME_BG]); + if(!status) { + if((activetool == -1 && overtool < -1) || overtool >= 0) s = lang[LOAD + overtool]; + if(overblock != -1 && (!overblock || palette[overblock])) s = blocks[palette[overblock]].name; + } + dst.x = 2; dst.y = screen->h - 3*font->height; dst.w = 32; dst.h = font->height; + i = currlayer == gndlayer ? THEME_FG : THEME_TABBG; + SDL_FillRect(screen, &dst, theme[i]); + sdlprint(5, screen->h - 3*font->height, THEME_INACT, i, lang[GND]); + dst.x = 2; dst.y = screen->h - 2*font->height; dst.w = 32; dst.h = font->height; + SDL_FillRect(screen, &dst, theme[THEME_BG]); + sprintf(str, "%4d", currlayer - gndlayer); + sdlprint(0, screen->h - 2*font->height, THEME_INACT, THEME_BG, str); + sprintf(str, "%3d%%", layerprob[currlayer] * 100 / 127); + sdlprint(2, screen->h - font->height, THEME_INACT, THEME_BG, str); + if(s) + sdlprint(42, screen->h - font->height, THEME_FG, THEME_BG, s); +} + +/** + * Redraw the SDL window + */ +void sdlredraw() +{ + SDL_Rect rect; + + /* main window area */ + strmaxw = screen->w; + rect.x = 36; rect.y = 0; rect.w = screen->w - 36; rect.h = screen->h - font->height; + SDL_FillRect(screen, &rect, theme[activetool == 1 || activetool == 4 ? THEME_BG : THEME_TABBG]); + if(activetool == 1) save_redraw(); else + if(activetool == 4) search_redraw(); else + edit_redraw(1); + + /* toolbar and status bar */ + sdltoolbar(); + /* flush the window */ + SDL_UpdateWindowSurface(window); +} + +/** + * UI for saving + */ +void sdldosave() { + SDL_SetCursor(working); + mts_save(); + SDL_SetCursor(pointer); + activetool = -1; activeblock = 0; + sdlredraw(); +} + +/** + * UI for loading + */ +void sdldoload() { + SDL_SetCursor(working); + mts_load(); + SDL_SetCursor(pointer); + activetool = -1; activeblock = 0; + sdlredraw(); +} + +/** + * UI for preview + */ +void sdldopreview() { + SDL_SetCursor(working); + mts_view(shift); + SDL_SetCursor(pointer); + sdlredraw(); +} + +/** + * UI for rotating + */ +void sdldorotate() { + SDL_SetCursor(working); + mts_rotate(); + SDL_SetCursor(pointer); +} + +/** + * The main SDL loop + */ +void sdlmain() +{ + stbi__context s; + stbi__result_info ri; + unsigned char *icondata; + char *fn, *title, str[32]; + int iw = 0, ih = 0, len, i, j, k; + SDL_Event event; + SDL_Rect dst; + + /* get our font */ + font = (psf_t*)stbi_zlib_decode_malloc_guesssize_headerflag((const char*)&font_start, (char*)&font_end - (char*)&font_start, + 32768, &len, 1); + if(!font) error(lang[ERR_MEM]); + + /* initialize SDL */ + SDL_Init(SDL_INIT_VIDEO); + fn = strrchr(mtsfile, DIRSEP); + if(fn) fn++; else fn = mtsfile; + title = (char*)malloc(strlen(fn) + 10); + sprintf(title, "MTSEdit: %s", fn); + window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_RESIZABLE); + free(title); + screen = SDL_GetWindowSurface(window); + + working = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_WAITARROW); + pointer = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); + + /* get icons */ + s.read_from_callbacks = 0; + s.img_buffer = s.img_buffer_original = (unsigned char *)&icons_start; + s.img_buffer_end = s.img_buffer_original_end = (unsigned char *)&icons_end; + ri.bits_per_channel = 8; + icondata = (uint8_t*)stbi__png_load(&s, &iw, &ih, &len, 0, &ri); + icons = SDL_CreateRGBSurfaceFrom((uint32_t*)icondata, iw, iw, 32, iw*4, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + SDL_SetWindowIcon(window, icons); + SDL_FreeSurface(icons); + icons = SDL_CreateRGBSurfaceFrom((uint32_t*)icondata, iw, ih, 32, iw*4, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + blk = SDL_CreateRGBSurfaceFrom(NULL, 32, 32, 32, 32*4, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + fg = SDL_CreateRGBSurface(0, screen->w - 36, screen->h - font->height, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + bg = SDL_CreateRGBSurface(0, screen->w - 36, screen->h - font->height, 32, 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + + /* draw window and loading message */ + memset(palette, 0, sizeof(palette)); + status = lang[LOADING]; + sdlredraw(); + SDL_SetCursor(working); + + /* parse blocks.csv */ + parseblocks(); + /* load MTS */ + mts_load(mtsfile); + + /* populate search window with default results (may include unknown blocks from the MTS) */ + numresults = numblocks - 1; + results = (int*)malloc(numresults * sizeof(int)); + for(i = 0; (int)i < numresults; i++) results[i] = i + 1; + /* clear block probability for air */ + for(i = 0; i < 256; i++) + for(j = 0; j < 256; j++) + for(k = 0; k < 256; k++) + if(!nodes[i][j][k].param0) nodes[i][j][k].param1 = 0; + + /* repaint window with the loaded MTS */ + SDL_SetCursor(pointer); + sdlredraw(); + SDL_StartTextInput(); + + /* main loop */ + while (!quitting) { + if (SDL_WaitEvent(&event)) { + switch (event.type) { + /* window events */ + case SDL_QUIT: quitting = 1; break; + case SDL_WINDOWEVENT: + switch(event.window.event) { + case SDL_WINDOWEVENT_CLOSE: quitting = 1; break; + case SDL_WINDOWEVENT_RESIZED: + case SDL_WINDOWEVENT_SIZE_CHANGED: + SDL_FreeSurface(screen); + SDL_FreeSurface(fg); + SDL_FreeSurface(bg); + screen = SDL_GetWindowSurface(window); + fg = SDL_CreateRGBSurface(0, screen->w - 36, screen->h - font->height, 32, + 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + bg = SDL_CreateRGBSurface(0, screen->w - 36, screen->h - font->height, 32, + 0xFF, 0xFF00, 0xFF0000, 0xFF000000); + sdlredraw(); + break; + default: sdlredraw(); break; + } + break; + + /* mouse events */ + case SDL_MOUSEMOTION: + i = j = -1; status = NULL; + if(event.motion.x < 36) { + /* toolbar */ + if(event.motion.y < 4 + 5 * 36) { + i = (event.motion.y > 3 ? event.motion.y - 4 : event.motion.y) / 36; + } else if(event.motion.y >= (int)(screen->h - font->height)) { + i = -3; + } else if(event.motion.y >= (int)(screen->h - 2*font->height)) { + i = -4; + } else if(event.motion.y >= (int)(screen->h - 3*font->height)) { + i = -2; + } else if(event.motion.y >= (int)(screen->h - 3*font->height - 36)) { + i = 6; + } else if(event.motion.y >= (int)(screen->h - 3*font->height - 2*36)) { + i = 5; + } else if(event.motion.y < (int)(screen->h - 3*font->height - 2*36)) { + j = (event.motion.y - (4 + 5 * 36)) / 32; + } + } else + if(activetool == 4) search_mouseover(&event); else + if(activetool == -1) { + if(event.motion.x > screen->w - 32 && event.motion.y >= (int)(screen->h - font->height - 32)) i = -5; + status = NULL; + dst.x = 36; dst.y = screen->h - font->height; dst.w = screen->w - 36; dst.h = font->height; + SDL_FillRect(screen, &dst, theme[THEME_BG]); + edit_hidecursor(); + edit_mouseover(&event); + edit_redraw(event.button.button); + sdltoolbar(); + SDL_UpdateWindowSurface(window); + } + if(i != overtool || j != overblock) { + overtool = i; + overblock = j; + sdltoolbar(); + SDL_UpdateWindowSurface(window); + } + break; + case SDL_MOUSEBUTTONDOWN: + if(activetool == -1 && overtool == -1 && event.motion.x > 36) edit_mousedown(&event); else + if(overtool == -3) mts_layerprob(event.button.button == 1 ? +1 : -1); else + if(overtool == -2) gndlayer = currlayer; + if(overtool >= 0 || overblock != -1) { + if(overtool >= 0 && activetool != overtool) activetool = overtool; + else { activetool = -1; if(overblock != -1) activeblock = overblock; } + sdltoolbar(); + SDL_UpdateWindowSurface(window); + } + if(activetool == 1) save_mousedown(&event); else + if(activetool == 4) search_mousedown(&event); + break; + case SDL_MOUSEBUTTONUP: + if(activetool != -1 && activetool == overtool) { + if(activetool == 0) sdldoload(); + if(activetool == 2) sdldopreview(); + if(activetool == 3) sdldorotate(); + if(activetool == 5 && currlayer < 255) currlayer++; + if(activetool == 6 && currlayer > 0) currlayer--; + if(activetool != 1 && activetool != 4) activetool = -1; + } + sdlredraw(); + break; + case SDL_MOUSEWHEEL: + if(overtool == -3) mts_layerprob(event.wheel.y); else + if(activetool == 1) save_scroll(&event); else + if(activetool == 4) search_scroll(&event); else + if(activetool == -1) edit_scroll(&event); + sdlredraw(); + break; + + /* handle the keyboard */ + case SDL_KEYDOWN: + status = NULL; + if(event.key.keysym.sym == SDLK_LSHIFT || event.key.keysym.sym == SDLK_RSHIFT) shift = 1; + if(event.key.keysym.sym == SDLK_LCTRL || event.key.keysym.sym == SDLK_RCTRL) ctrl = 1; + if(activetool != -1 && event.key.keysym.sym == SDLK_ESCAPE) { + activetool = -1; + } else if(activetool != 1 && activetool != 4) { + switch (event.key.keysym.sym) { + case SDLK_ESCAPE: + case SDLK_q: quitting = 1; break; + case SDLK_s: if(!shift) sdldosave(); break; + case SDLK_l: sdldoload(); break; + case SDLK_p: sdldopreview(); break; + case SDLK_r: sdldorotate(); break; + case SDLK_g: gndlayer = currlayer; break; + case SDLK_PLUS: case SDLK_EQUALS: mts_layerprob(+1); break; + case SDLK_MINUS: mts_layerprob(-1); break; + case SDLK_PAGEUP: if(currlayer < 255) currlayer++; break; + case SDLK_PAGEDOWN: if(currlayer > 0) currlayer--; break; + case SDLK_BACKQUOTE: case SDLK_0: activeblock = 0; break; + case SDLK_1: case SDLK_2: case SDLK_3: case SDLK_4: case SDLK_5: + case SDLK_6: case SDLK_7: case SDLK_8: case SDLK_9: + if(palette[event.key.keysym.sym - SDLK_0]) + activeblock = event.key.keysym.sym - SDLK_0; + break; + case SDLK_h: dx--; sprintf(str, "dx %d dz %d", dx, dz); status = str; break; + case SDLK_k: dx++; sprintf(str, "dx %d dz %d", dx, dz); status = str; break; + case SDLK_u: dz--; sprintf(str, "dx %d dz %d", dx, dz); status = str; break; + case SDLK_j: dz++; sprintf(str, "dx %d dz %d", dx, dz); status = str; break; + case SDLK_UP: + if(ctrl) { + if(oy < 127) oy++; + } else if(shift) { + if(up > -128) up--; + } else { + if(cz > 0) cz--; + status = nodes[currlayer][cz][cx].param0 ? + blocks[nodes[currlayer][cz][cx].param0].name : NULL; + } + break; + case SDLK_DOWN: + if(ctrl) { + if(oy > -128) oy--; + } else if(shift) { + if(up < 127) up++; + } else { + if(cz < 255) cz++; + status = nodes[currlayer][cz][cx].param0 ? + blocks[nodes[currlayer][cz][cx].param0].name : NULL; + } + break; + case SDLK_LEFT: + if(ctrl) { + if(ox < 127) ox++; + } else if(shift) { + edit_rotate(currlayer, cz, cx); + } else { + if(cx > 0) cx--; + status = nodes[currlayer][cz][cx].param0 ? + blocks[nodes[currlayer][cz][cx].param0].name : NULL; + } + break; + case SDLK_RIGHT: + if(ctrl) { + if(ox > -128) ox--; + } else if(shift) { + edit_rotate(currlayer, cz, cx); + } else { + if(cx < 255) cx++; + status = nodes[currlayer][cz][cx].param0 ? + blocks[nodes[currlayer][cz][cx].param0].name : NULL; + } + break; + case SDLK_TAB: edit_rotate(currlayer, cz, cx); break; + case SDLK_BACKSPACE: + case SDLK_DELETE: + case SDLK_SPACE: + blocks[nodes[currlayer][cz][cx].param0].numref--; + i = event.key.keysym.sym == SDLK_SPACE && !shift ? palette[activeblock] : 0; + blocks[i].numref++; + nodes[currlayer][cz][cx].param0 = i; + nodes[currlayer][cz][cx].param1 = i ? 127 : 0; + status = i ? blocks[i].name : NULL; + break; + } + } + sdlredraw(); + break; + case SDL_TEXTINPUT: + case SDL_KEYUP: + if(event.key.keysym.sym == SDLK_LSHIFT || event.key.keysym.sym == SDLK_RSHIFT) shift = 0; + if(event.key.keysym.sym == SDLK_LCTRL || event.key.keysym.sym == SDLK_RCTRL) ctrl = 0; + if(activetool == 1) save_key(&event); else + if(activetool == 4) search_key(&event); + if(shift && event.key.keysym.sym == SDLK_s) activetool = 1; + if(event.key.keysym.sym == SDLK_m || event.key.keysym.sym == SDLK_TAB) activetool = 4; + sdlredraw(); + break; + } + } + } + + /* cleanup SDL */ + SDL_StopTextInput(); + SDL_FreeCursor(working); + SDL_FreeCursor(pointer); + SDL_FreeSurface(icons); + SDL_FreeSurface(blk); + SDL_FreeSurface(fg); + SDL_FreeSurface(bg); + SDL_Quit(); + free(icondata); + free(font); + freeblocks(); +} diff --git a/src/search.c b/src/search.c new file mode 100644 index 0000000..e45490e --- /dev/null +++ b/src/search.c @@ -0,0 +1,183 @@ +/* + * mtsedit/search.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Search Block window + * + */ + +#include "main.h" + +int numresults, *results = NULL, line, overblk = -1, searchscr = 0; +int searchlen = 0, searchpos = 0; +char search[256] = { 0 }, cur[2] = {0, 0}; + +/** + * Redraw the Search Block window + */ +void search_redraw() +{ + int i; + SDL_Rect rect; + + strmaxw = screen->w - 5; + sdlprint((screen->w - 47 - strlen(lang[ADDBLOCKS]) * (font->width+1)) / 2 + 47, 4, THEME_INPUT, THEME_BG, lang[ADDBLOCKS]); + rect.y = 12 + font->height; + sdlprint(42, rect.y, THEME_FG, THEME_BG, lang[SEARCH]); + rect.x = 160; rect.w = screen->w - 165; rect.h = font->height + 2; + SDL_FillRect(screen, &rect, theme[THEME_INPBG]); + strmaxw = screen->w - 5; + sdlprint(161,rect.y + 1, THEME_INPUT, THEME_INPBG, search); + cur[0] = search[searchpos] ? search[searchpos] : ' '; + sdlprint(161 + searchpos * (font->width+1), rect.y + 1, THEME_INPBG, THEME_INPUT, cur); + rect.x = 42; rect.y = 20 + 2*font->height; rect.w = rect.h = 32; + if(line != (screen->w - 47) / 32) { + line = (screen->w - 47) / 32; + searchscr = 0; + } + for(i = searchscr * line; i < numresults && rect.y + 32 < (int)(screen->h - font->height); i++, rect.x += 32) { + if(rect.x + 32 > screen->w - 5) { rect.x = 42; rect.y += 32; } + if(rect.y + 32 > (int)(screen->h - font->height)) rect.h = screen->h - font->height - rect.y; + blk->pixels = blocks[results[i]].img[0] ? blocks[results[i]].img[0] : (uint8_t*)icons->pixels + 32 * icons->pitch; + SDL_FillRect(screen, &rect, theme[i == overblk ? THEME_INACT : THEME_BG]); + SDL_BlitSurface(blk, NULL, screen, &rect); + } +} + +/** + * Search Block window scrolling event handler + */ +void search_scroll(SDL_Event *event) +{ + int i = numresults / line; + searchscr -= event->wheel.y; + if(searchscr < 0) searchscr = 0; + if(searchscr + 1 >= i) searchscr = i - 1; +} + +/** + * Add a block to the palette + */ +void search_addblock(int blk) +{ + int i, j, b; + + if(blk != -1 && blk < numresults) { + b = results[blk]; + if(!b) return; + for(j = 1; j < 15 && palette[j] != b; j++); + for(i = j; i > 1; i--) palette[i] = palette[i - 1]; + palette[1] = b; + activeblock = 1; + } +} + +/** + * Search Block window mouse down event handler + */ +void search_mousedown(_unused SDL_Event *event) +{ + if(overblk != -1 && overblk < numresults) { + search_addblock(overblk); + sdlredraw(); + } +} + +/** + * Search Block mouse over event handler + */ +void search_mouseover(SDL_Event *event) +{ + int i, j = -1; + + if(event->motion.x >= 42 && event->motion.x < screen->w - 5) { + if(event->motion.y >= (int)(20 + 2*font->height) && event->motion.y < (int)(screen->h - font->height)) { + i = ((event->motion.x - 42) / 32); + j = (((event->motion.y - (20 + 2*font->height)) / 32 - searchscr) * line) + (i < line ? i : line); + if(j >= numresults || !results[j]) j = -1; + } + } + if(j != overblk) { + overblk = j; + status = j == -1 ? NULL : blocks[results[j]].name; + sdlredraw(); + } +} + +/** + * Search Block window keypress event handler + */ +void search_key(SDL_Event *event) +{ + int i, j, l; + + switch(event->type) { + case SDL_TEXTINPUT: + j = strlen(event->text.text); + if(!ctrl && searchlen + j < (int)(sizeof(search))) { + for(i = searchlen - 1; i >= searchpos; i--) search[i + j] = search[i]; + memcpy(search + searchpos, &event->text.text, j); + searchpos += j; + searchlen += j; + search[searchlen] = 0; + } + break; + case SDL_KEYUP: + switch (event->key.keysym.sym) { + case SDLK_BACKSPACE: + if(searchpos) { + searchpos--; + for(i = searchpos; i < searchlen + 1; i++) search[i] = search[i+1]; + searchlen--; + } + break; + case SDLK_DELETE: + if(searchpos < searchlen) { + for(i = searchpos; i < searchlen + 1; i++) search[i] = search[i+1]; + searchlen--; + } + break; + case SDLK_UP: searchpos = 0; break; + case SDLK_DOWN: searchpos = searchlen; break; + case SDLK_LEFT: if(searchpos) searchpos--; break; + case SDLK_RIGHT: if(searchpos < searchlen) searchpos++; break; + } + if(ctrl && event->key.keysym.sym >= SDLK_1 && event->key.keysym.sym <= SDLK_9) + search_addblock(event->key.keysym.sym - SDLK_1); + break; + } + if(!searchlen) { + numresults = numblocks - 1; + for(i = 0; (int)i < numresults; i++) results[i] = i + 1; + } else { + for(numresults = 0, i = 1; i < numblocks; i++) { + l = strlen(blocks[i].name) - searchlen; + for(j = 0; j < l; j++) + if(!strncasecmp(blocks[i].name + j, search, searchlen)) { + results[numresults++] = i; + break; + } + } + } +} diff --git a/src/stb_image.h b/src/stb_image.h new file mode 100644 index 0000000..5186d4d --- /dev/null +++ b/src/stb_image.h @@ -0,0 +1,1582 @@ +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality); + +/* PNG decompressor from + + stb_image - v2.23 - public domain image loader - http://nothings.org/stb_image.h +*/ +const char *stbi__g_failure_reason; + +enum +{ + STBI_default = 0, + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +typedef unsigned short stbi_us; + +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; + +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + void *io_user_data; + + int read_from_callbacks; + int buflen; + unsigned char buffer_start[128]; + + unsigned char *img_buffer, *img_buffer_end; + unsigned char *img_buffer_original, *img_buffer_original_end; +} stbi__context; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#define STBI_ASSERT(v) +#define STBI_NOTUSED(v) (void)sizeof(v) +#define STBI__BYTECAST(x) ((unsigned char) ((x) & 255)) +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) + +void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len); + +#ifdef STB_IMAGE_IMPLEMENTATION + +_inline static unsigned char stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + return 0; +} + +_inline static int stbi__at_eof(stbi__context *s) +{ + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, unsigned char *buffer, int n) +{ + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#define stbi__err(x,y) stbi__errstr(y) +static int stbi__errstr(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +_inline static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + return a <= 2147483647 - b; +} + +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; + return a <= 2147483647/b; +} + +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} + +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +static unsigned char stbi__compute_y(int r, int g, int b) +{ + return (unsigned char) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + stbi__err("outofmem", "Out of memory"); + return NULL; + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + stbi__err("outofmem", "Out of memory"); + return NULL; + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; + default: STBI_ASSERT(0); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} + +#define STBI__ZFAST_BITS 9 +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + unsigned char size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, unsigned char *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (unsigned char ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +typedef struct +{ + unsigned char *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +_inline static unsigned char stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + unsigned char *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (unsigned char *) (zout - dist); + if (dist == 1) { + unsigned char v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static unsigned char length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + unsigned char lencodes[286+32+137]; + unsigned char codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (unsigned char) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (unsigned char) c; + else { + unsigned char fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) + c = stbi__zreceive(a,3)+3; + else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +_inline static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + unsigned char header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); + k = 0; + while (a->num_bits > 0) { + header[k++] = (unsigned char) (a->code_buffer & 255); + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); + return 1; +} + +static unsigned char stbi__zdefault_length[288], stbi__zdefault_distance[32]; +static void stbi__init_zdefaults(void) +{ + int i; + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + stbi__init_zdefaults(); + return stbi__parse_zlib(a, parse_header); +} + +char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (unsigned char *) buffer; + a.zbuffer_end = (unsigned char *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +_inline static int stbi__check_png_header(stbi__context *s) +{ + static unsigned char png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + unsigned char *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static unsigned char first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static unsigned char stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +static int stbi__create_png_image_raw(stbi__png *a, unsigned char *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (unsigned char *) stbi__malloc_mad3(x, y, output_bytes, 0); + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + if (s->img_x == x && s->img_y == y) { + if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } else { + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } + + for (j=0; j < y; ++j) { + unsigned char *cur = a->out + stride*j; + unsigned char *prior = cur - stride; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; + + if (j == 0) filter = first_row_filter[filter]; + + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; + cur[filter_bytes+1] = 255; + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + if (depth == 16) { + cur = a->out + stride*j; + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + if (depth < 8) { + for (j=0; j < y; ++j) { + unsigned char *cur = a->out + stride*j; + unsigned char *in = a->out + stride*j + x*out_n - img_width_bytes; + unsigned char scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + unsigned char *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, unsigned char *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + unsigned char *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + final = (unsigned char *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, unsigned char tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + unsigned char *p = z->out; + + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, unsigned char *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + unsigned char *p, *temp_out, *orig = a->out; + + p = (unsigned char *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + unsigned char palette[1024], pal_img_n=0; + unsigned char has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (unsigned char)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + unsigned char *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (unsigned char *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + bpl = (s->img_x * z->depth + 7) / 8; + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (unsigned char *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, 1); + if (z->expanded == NULL) return 0; + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (pal_img_n) { + s->img_n = pal_img_n; + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + return stbi__err("invalid_chunk", "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) { stbi__err("bad req_comp", "Internal error"); return NULL; } + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth < 8) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +/* zlib_compressor from + + stb_image_write - v1.13 - public domain - http://nothings.org/stb/stb_image_write.h +*/ +typedef unsigned char stbiw__uc; +typedef unsigned short stbiw__us; + +typedef uint16_t stbiw__uint16; +typedef int16_t stbiw__int16; +typedef uint32_t stbiw__uint32; +typedef int32_t stbiw__int32; + +#define STBIW_MALLOC(s) STBI_MALLOC(s) +#define STBIW_REALLOC(p,ns) STBI_REALLOC(p,ns) +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#define STBIW_FREE STBI_FREE +#define STBIW_MEMMOVE memmove +#define STBIW_UCHAR (uint8_t) +#define STBIW_ASSERT(x) +#define stbiw___sbraw(a) ((int *) (a) - 2) +#define stbiw___sbm(a) stbiw___sbraw(a)[0] +#define stbiw___sbn(a) stbiw___sbraw(a)[1] + +#define stbiw___sbneedgrow(a,n) ((a)==0 || stbiw___sbn(a)+n >= stbiw___sbm(a)) +#define stbiw___sbmaybegrow(a,n) (stbiw___sbneedgrow(a,(n)) ? stbiw___sbgrow(a,n) : 0) +#define stbiw___sbgrow(a,n) stbiw___sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw___sbpush(a, v) (stbiw___sbmaybegrow(a,1), (a)[stbiw___sbn(a)++] = (v)) +#define stbiw___sbcount(a) ((a) ? stbiw___sbn(a) : 0) +#define stbiw___sbfree(a) ((a) ? STBIW_FREE(stbiw___sbraw(a)),0 : 0) + +static void *stbiw___sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw___sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw___sbraw(*arr) : 0, *arr ? (stbiw___sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw___sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw___zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw___sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw___zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw___zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw___zhash(unsigned char *data) +{ + stbiw__uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw___zlib_flush() (out = stbiw___zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw___zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw___zlib_flush()) +#define stbiw___zlib_huffa(b,c) stbiw___zlib_add(stbiw___zlib_bitrev(b,c),c) +#define stbiw___zlib_huff1(n) stbiw___zlib_huffa(0x30 + (n), 8) +#define stbiw___zlib_huff2(n) stbiw___zlib_huffa(0x190 + (n)-144, 9) +#define stbiw___zlib_huff3(n) stbiw___zlib_huffa(0 + (n)-256,7) +#define stbiw___zlib_huff4(n) stbiw___zlib_huffa(0xc0 + (n)-280,8) +#define stbiw___zlib_huff(n) ((n) <= 143 ? stbiw___zlib_huff1(n) : (n) <= 255 ? stbiw___zlib_huff2(n) : (n) <= 279 ? stbiw___zlib_huff3(n) : stbiw___zlib_huff4(n)) +#define stbiw___zlib_huffb(n) ((n) <= 143 ? stbiw___zlib_huff1(n) : stbiw___zlib_huff2(n)) + +#define stbiw___ZHASH 16384 + +unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw___ZHASH * sizeof(char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw___sbpush(out, 0x78); + stbiw___sbpush(out, 0x5e); + stbiw___zlib_add(1,1); + stbiw___zlib_add(1,2); + + for (i=0; i < stbiw___ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + int h = stbiw___zhash(data+i)&(stbiw___ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw___sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { + int d = stbiw___zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) best=d,bestloc=hlist[j]; + } + } + if (hash_table[h] && stbiw___sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw___sbn(hash_table[h]) = quality; + } + stbiw___sbpush(hash_table[h],data+i); + + if (bestloc) { + h = stbiw___zhash(data+i+1)&(stbiw___ZHASH-1); + hlist = hash_table[h]; + n = stbiw___sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw___zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw___zlib_huff(j+257); + if (lengtheb[j]) stbiw___zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw___zlib_add(stbiw___zlib_bitrev(j,5),5); + if (disteb[j]) stbiw___zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw___zlib_huffb(data[i]); + ++i; + } + } + for (;i < data_len; ++i) + stbiw___zlib_huffb(data[i]); + stbiw___zlib_huff(256); + while (bitcount) + stbiw___zlib_add(0,1); + + for (i=0; i < stbiw___ZHASH; ++i) + (void) stbiw___sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + { + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; + s1 %= 65521, s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw___sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw___sbpush(out, STBIW_UCHAR(s2)); + stbiw___sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw___sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw___sbn(out); + STBIW_MEMMOVE(stbiw___sbraw(out), out, *out_len); + return (unsigned char *) stbiw___sbraw(out); +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * y; + int signed_stride = stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = -1; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, j, n, force_filter, line_buffer); + } else { + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, j, n, filter_type, line_buffer); + + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); + STBIW_FREE(filt); + if (!zlib) return 0; + + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#endif /* STB_IMAGE_IMPLEMENTATION */ + +#endif diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..6f36177 --- /dev/null +++ b/src/util.c @@ -0,0 +1,280 @@ +/* + * mtsedit/util.c + * + * Copyright (C) 2019 bzt (bztsrc@gitlab) + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @brief Utilities + * + */ + +#include "main.h" +#include + +char *path = NULL, *fn = NULL; + +int fncmp(const void *a, const void *b) { return strcmp(*((const char**)a), *((const char**)b)); } + +/** + * Read a file into memory from the data directory + */ +unsigned char *readfile(char *file, unsigned int *size) +{ + FILE *f; + unsigned char *ret = NULL; + + *size = 0; + if(!path || !fn) return NULL; + strcpy(fn, file); + f = fopen(path, "rb"); + if(f) { + fseek(f, 0L, SEEK_END); + *size = (unsigned int)ftell(f); + fseek(f, 0L, SEEK_SET); + ret = (unsigned char*)malloc(*size + 1); + if(ret) { + fread(ret, *size, 1, f); + ret[*size] = 0; + } else + *size = 0; + fclose(f); + } + return ret; +} + +/** + * CSV error + */ +void errorcsv(int line) +{ + char msg[1024]; + sprintf(msg, "blocks.csv(%d): %s", line, lang[ERR_CSV]); +} + +/** + * Convert an ascii hex value int integer + */ +unsigned char ahtoi(char *s) +{ + int r = 0; + for(; *s; s++) { + if(*s >= '0' && *s <= '9') { r <<= 4; r += (uint32_t)(*s-'0'); } + else if(*s >= 'a' && *s <= 'f') { r <<= 4; r += (uint32_t)(*s-'a'+10); } + else if(*s >= 'A' && *s <= 'F') { r <<= 4; r += (uint32_t)(*s-'A'+10); } + else break; + } + return (unsigned char)r; +} + +/** + * Parse the blocks.csv + */ +void parseblocks() +{ + stbi__context sc; + stbi__result_info ri; + int w, h, l; + unsigned int numfiles = 0, i, j, k; + char **files = NULL, c, *s, *e; + DIR *dir; + struct dirent *de; + unsigned int size; + unsigned char *img; + char *data = (char*)readfile("blocks.csv", &size); + + if(!data || !size) error(lang[ERR_CSV]); + + /* get block images */ + *fn = 0; + dir = opendir(path); + if(dir) { + while((de = readdir(dir))) { + i = strlen(de->d_name); + if(i > 8 && !strcmp(de->d_name + i - 4, ".png") && de->d_name[i-7] == '_') { + j = numfiles++; + files = (char**)realloc(files, numfiles * sizeof(char*)); + if(!files) error(lang[ERR_MEM]); + files[j] = (char*)malloc(i + 1); + if(!files[j]) error(lang[ERR_MEM]); + memcpy(files[j], de->d_name, i + 1); + } + } + closedir(dir); + } + qsort(files, numfiles, sizeof(char*), fncmp); + + /* parse header */ + for(e = data, i = j = 0; *e && *e != '\r' && *e != '\n' && i < 3; e++) { + if(*e == '\"') j ^= 1; + if(!j && (*e == ',' || *e == ';' || *e == '\t')) i++; + } + if(i != 3 || !*e || *e == '\r' || *e == '\n') errorcsv(1); + while(*e && *e != '\r' && *e != '\n') { + while(*e == ',' || *e == ';' || *e == '\t' || *e == ' ') e++; + if(*e == '\"') { e++; c = '\"'; } else c = ','; + for(s = e; *e && *e != '\r' && *e != '\n' && *e != c; e++) + if(*e == '\\' || (*e == '\"' && e[1] == '\"')) { e++; continue; } + while(*s <= ' ') s++; + while(*(e-1) <= ' ') e--; + j = numpalettes++; + palettes = (char**)realloc(palettes, numpalettes * sizeof(char*)); + if(!palettes) error(lang[ERR_MEM]); + palettes[j] = (char*)malloc(e - s + 1); + if(!palettes[j]) error(lang[ERR_MEM]); + memcpy(palettes[j], s, e - s + 1); + palettes[j][e - s] = 0; + if((int)(e - s) > lenpalettes) lenpalettes = e - s; + while(*e && *e != ',' && *e != ';' && *e != '\t' && *e != '\r' && *e != '\n') e++; + } + /* add Air as first block */ + numblocks++; + blocks = (mtsblock_t*)realloc(blocks, numblocks * sizeof(mtsblock_t)); + if(!blocks) error(lang[ERR_MEM]); + memset(&blocks[0], 0, sizeof(mtsblock_t)); + blocks[0].name = (char*)malloc(4); + if(!blocks[0].name) error(lang[ERR_MEM]); + memcpy(blocks[0].name, "Air", 4); + blocks[0].blocknames = (char**)malloc((numpalettes + 1) * sizeof(char*)); + if(!blocks[0].blocknames) error(lang[ERR_MEM]); + blocks[0].blocknames[0] = NULL; + for(i = 1; i < (unsigned int)numpalettes + 1; i++) { + blocks[0].blocknames[i] = (char*)malloc(4); + if(!blocks[0].blocknames[i]) error(lang[ERR_MEM]); + memcpy(blocks[0].blocknames[i], "air", 4); + } + + /* parse rows */ + while(*e) { + if(*e == '\r' || *e == '\n') { + while(*e == '\r' || *e == '\n') e++; + if(!*e) break; + /* get canonical name */ + if(*e == '\"') { e++; c = '\"'; } else c = ','; + for(s = e; *e && *e != '\r' && *e != '\n' && *e != c; e++) + if(*e == '\\' || (*e == '\"' && e[1] == '\"')) { e++; continue; } + while(*s <= ' ') s++; + while(*(e-1) <= ' ') e--; + j = numblocks++; + blocks = (mtsblock_t*)realloc(blocks, numblocks * sizeof(mtsblock_t)); + if(!blocks) error(lang[ERR_MEM]); + memset(&blocks[j], 0, sizeof(mtsblock_t)); + blocks[j].name = (char*)malloc(e - s + 1); + if(!blocks[j].name) error(lang[ERR_MEM]); + blocks[j].blocknames = (char**)malloc((numpalettes + 1) * sizeof(char*)); + if(!blocks[j].blocknames) error(lang[ERR_MEM]); + memset(blocks[j].blocknames, 0, (numpalettes + 1) * sizeof(char*)); + for(i = 0; s + i < e; i++) { + blocks[j].name[i] = s[i] == '_' ? ' ' : s[i]; + if(s[i] == ' ') s[i] = '_'; + } + blocks[j].name[i] = 0; + /* get block images and possible param2 values */ + for(i = 0, l = 0; i < numfiles; i++) { + if((int)strlen(files[i]) == (int)(e - s + 7) && !memcmp(files[i], s, e - s)) { + img = readfile(files[i], &size); + if(img && size) { + k = ahtoi(strrchr(files[i], '_') + 1) & 0x1F; + sc.read_from_callbacks = 0; + sc.img_buffer = sc.img_buffer_original = img; + sc.img_buffer_end = sc.img_buffer_original_end = img + size; + ri.bits_per_channel = 8; + blocks[j].img[k] = (unsigned char*)stbi__png_load(&sc, &w, &h, &l, 0, &ri); + if(blocks[j].img[k]) l++; + free(img); + } + } + } + if(!l) + fprintf(stderr, "mtsedit: blocks.csv(%d): %s '%s'\r\n", j+1, lang[ERR_IMG], blocks[j].name); + while(*e && *e != ',' && *e != ';' && *e != '\t' && *e != '\r' && *e != '\n') e++; + while(*e == ' ') e++; + if(*e != ',' && *e != ';' && *e != '\t') errorcsv(j+1); + e++; + while(*e == ' ') e++; + /* get Block IDs */ + if(*e == '\"') { e++; c = '\"'; } else c = ','; + for(s = e; *e && *e != '\r' && *e != '\n' && *e != c; e++) + if(*e == '\\' || (*e == '\"' && e[1] == '\"')) { e++; continue; } + while(*s <= ' ') s++; + for(i = 0; s < e && i < 8;) { + blocks[j].blockids[i] = atoi(s); + if(blocks[j].blockids[i]) i++; + while(*s >= '0' && *s <= '9') s++; + if(*s == '/') s++; + } + while(*e && *e != ',' && *e != ';' && *e != '\t' && *e != '\r' && *e != '\n') e++; + k = 0; + } + /* get palette specific names */ + while(*e == ' ') e++; + if(*e != ',' && *e != ';' && *e != '\t') errorcsv(j+1); + e++; + while(*e == ' ') e++; + if(!*e) errorcsv(j+1); + if(*e == '\"') { e++; c = '\"'; } else c = ','; + for(s = e; *e && *e != '\r' && *e != '\n' && *e != c; e++) + if(*e == '\\' || (*e == '\"' && e[1] == '\"')) { e++; continue; } + while(*s <= ' ') s++; + while(*(e-1) <= ' ') e--; + if(e != s) { + blocks[j].blocknames[k] = (char*)malloc(e - s + 1); + if(!blocks[j].blocknames[k]) error(lang[ERR_MEM]); + memcpy(blocks[j].blocknames[k], s, e - s + 1); + blocks[j].blocknames[k][e - s] = 0; + } + k++; if(k > (unsigned int)numpalettes + 1) errorcsv(j+2); + while(*e && *e != ',' && *e != ';' && *e != '\t' && *e != '\r' && *e != '\n') e++; + } + if(!numblocks || numblocks > 65535) error(lang[ERR_CSV]); + + /* free temp resources */ + for(i = 0; i < numfiles; i++) free(files[i]); + free(files); + free(data); +} + +/** + * Free resources + */ +void freeblocks() +{ + int i, j; + + for(i = 0; i < numpalettes; i++) free(palettes[i]); + free(palettes); + + for(i = 0; i < numblocks; i++) { + free(blocks[i].name); + if(blocks[i].blocknames) { + for(j = 0; j < numpalettes; j++) + if(blocks[i].blocknames[j]) free(blocks[i].blocknames[j]); + free(blocks[i].blocknames); + } + for(j = 0; j < 32; j++) { + if(blocks[i].img[j]) free(blocks[i].img[j]); + if(blocks[i].dr[j]) free(blocks[i].dr[j]); + if(blocks[i].tr[j]) free(blocks[i].tr[j]); + } + } + free(results); + free(blocks); +}