From 1ef13d5bd0592dde48cc837e05b13e93e82db25b Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Sat, 1 Nov 2014 14:11:38 +0300 Subject: [PATCH] BETA 9 Build 11 --- libs/Lib_bmp.class | Bin 0 -> 2413 bytes libs/Lib_canvas.class | Bin 0 -> 2250 bytes libs/Lib_effects.class | Bin 0 -> 3433 bytes libs/Lib_imgcolor.class | Bin 0 -> 1427 bytes libs/Lib_items_store.class | Bin 0 -> 5892 bytes libs/Lib_items_store.java | 322 +++ libs/Lib_jpeg.class | Bin 0 -> 1793 bytes libs/Lib_jsr75i.class | Bin 0 -> 10389 bytes libs/Lib_localfiles.java | 12 + libs/Lib_maps.class | Bin 0 -> 2189 bytes libs/Lib_memory.class | Bin 0 -> 678 bytes libs/Lib_particles_store.class | Bin 0 -> 1476 bytes libs/Lib_particles_store.java | 63 + libs/Lib_png3.class | Bin 0 -> 1933 bytes libs/Lib_safeload.class | Bin 0 -> 1560 bytes libs/Lib_scri.class | Bin 0 -> 3891 bytes libs/Lib_sensor.class | Bin 0 -> 2417 bytes res/Adler32.class | Bin 0 -> 1347 bytes res/Deflate$Config.class | Bin 0 -> 577 bytes res/Deflate.class | Bin 0 -> 22540 bytes res/Encoder.class | Bin 0 -> 5391 bytes res/JZlib.class | Bin 0 -> 1108 bytes res/JpegEncoder$DCT.class | Bin 0 -> 7817 bytes res/JpegEncoder$Huffman.class | Bin 0 -> 9285 bytes res/JpegEncoder$JpegInfo.class | Bin 0 -> 4252 bytes res/JpegEncoder.class | Bin 0 -> 8852 bytes res/META-INF/MANIFEST.MF | 9 + res/StaticTree.class | Bin 0 -> 5556 bytes res/Tree.class | Bin 0 -> 10703 bytes res/ZStream.class | Bin 0 -> 4001 bytes res/autoexec.cfg | 36 + res/back.png | Bin 0 -> 3023 bytes res/blocks.cfg | 250 ++ res/crafts.cfg | 318 +++ res/default_font.png | Bin 0 -> 1523 bytes res/dl | Bin 0 -> 11821 bytes res/furnace.cfg | 90 + res/gui/clock.png | Bin 0 -> 749 bytes res/gui/compass.png | Bin 0 -> 311 bytes res/gui/container.png | Bin 0 -> 841 bytes res/gui/creative.png | Bin 0 -> 820 bytes res/gui/fastcraft.png | Bin 0 -> 1130 bytes res/gui/float.png | Bin 0 -> 165 bytes res/gui/furnace.png | Bin 0 -> 1660 bytes res/gui/gui.png | Bin 0 -> 6262 bytes res/gui/inventory.png | Bin 0 -> 593 bytes res/gui/items.png | Bin 0 -> 19493 bytes res/gui/mapbg.png | Bin 0 -> 1538 bytes res/gui/partition.png | Bin 0 -> 456 bytes res/gui/sign.png | Bin 0 -> 629 bytes res/gui/touch.png | Bin 0 -> 865 bytes res/inputStream.class | Bin 0 -> 510 bytes res/items.cfg | 607 +++++ res/keyboard.cfg | 75 + res/maps.png | Bin 0 -> 1268 bytes res/mobs/char_ani.png | Bin 0 -> 1727 bytes res/mobs/chicken_anims.png | Bin 0 -> 554 bytes res/mobs/cow.png | Bin 0 -> 1626 bytes res/mobs/cow2.png | Bin 0 -> 1724 bytes res/mobs/creeper_anims.png | Bin 0 -> 1897 bytes res/mobs/pig_anims.png | Bin 0 -> 2336 bytes res/mobs/pigman_ani.png | Bin 0 -> 19914 bytes res/mobs/sheep_anims.png | Bin 0 -> 2177 bytes res/mobs/sheep_fur.png | Bin 0 -> 648 bytes res/mobs/spider_ani.png | Bin 0 -> 1791 bytes res/mobs/zombie_ani.png | Bin 0 -> 1752 bytes res/pack.png | Bin 0 -> 1268 bytes res/terrain.png | Bin 0 -> 54291 bytes res/terrain/explosion.png | Bin 0 -> 966 bytes res/terrain/light.png | Bin 0 -> 272 bytes res/terrain/moon_phases/moon_phase_0.png | Bin 0 -> 852 bytes res/terrain/moon_phases/moon_phase_1.png | Bin 0 -> 864 bytes res/terrain/moon_phases/moon_phase_2.png | Bin 0 -> 860 bytes res/terrain/moon_phases/moon_phase_3.png | Bin 0 -> 796 bytes res/terrain/moon_phases/moon_phase_4.png | Bin 0 -> 772 bytes res/terrain/moon_phases/moon_phase_5.png | Bin 0 -> 811 bytes res/terrain/moon_phases/moon_phase_6.png | Bin 0 -> 862 bytes res/terrain/moon_phases/moon_phase_7.png | Bin 0 -> 859 bytes res/terrain/particles.png | Bin 0 -> 1223 bytes res/terrain/rain.png | Bin 0 -> 401 bytes res/terrain/sky.png | Bin 0 -> 1648 bytes res/terrain/snow.png | Bin 0 -> 278 bytes res/terrain/sun.png | Bin 0 -> 3262 bytes res/textures.cfg | 291 ++ res/title/background.png | Bin 0 -> 668 bytes res/title/cavelogo.png | Bin 0 -> 5328 bytes res/title/icon.png | Bin 0 -> 309 bytes res/title/splashes.txt | 41 + res/tools.cfg | 51 + res/vkeyboard.cfg | 112 + src/CAVE.mpsrc | 3092 ++++++++++++++++++++++ src/cellui.mpsrc | 491 ++++ src/chest.mpsrc | 128 + src/console.pas | 954 +++++++ src/craft.mpsrc | 92 + src/drop.mpsrc | 214 ++ src/func.mpsrc | 324 +++ src/furnace.mpsrc | 369 +++ src/gameui.mpsrc | 99 + src/inv.mpsrc | 148 ++ src/invui.mpsrc | 859 ++++++ src/items.mpsrc | 98 + src/items_logic.mpsrc | 1432 ++++++++++ src/keyboard.mpsrc | 227 ++ src/mobs.pas | 577 ++++ src/particles.mpsrc | 139 + src/phy.pas | 325 +++ src/player.mpsrc | 363 +++ src/randoms.mpsrc | 37 + src/sign.pas | 63 + src/utils.mpsrc | 63 + src/vars.mpsrc | 90 + src/video.pas | 66 + src/worldgen.mpsrc | 963 +++++++ 114 files changed, 13490 insertions(+) create mode 100644 libs/Lib_bmp.class create mode 100644 libs/Lib_canvas.class create mode 100644 libs/Lib_effects.class create mode 100644 libs/Lib_imgcolor.class create mode 100644 libs/Lib_items_store.class create mode 100644 libs/Lib_items_store.java create mode 100644 libs/Lib_jpeg.class create mode 100644 libs/Lib_jsr75i.class create mode 100644 libs/Lib_localfiles.java create mode 100644 libs/Lib_maps.class create mode 100644 libs/Lib_memory.class create mode 100644 libs/Lib_particles_store.class create mode 100644 libs/Lib_particles_store.java create mode 100644 libs/Lib_png3.class create mode 100644 libs/Lib_safeload.class create mode 100644 libs/Lib_scri.class create mode 100644 libs/Lib_sensor.class create mode 100644 res/Adler32.class create mode 100644 res/Deflate$Config.class create mode 100644 res/Deflate.class create mode 100644 res/Encoder.class create mode 100644 res/JZlib.class create mode 100644 res/JpegEncoder$DCT.class create mode 100644 res/JpegEncoder$Huffman.class create mode 100644 res/JpegEncoder$JpegInfo.class create mode 100644 res/JpegEncoder.class create mode 100644 res/META-INF/MANIFEST.MF create mode 100644 res/StaticTree.class create mode 100644 res/Tree.class create mode 100644 res/ZStream.class create mode 100644 res/autoexec.cfg create mode 100644 res/back.png create mode 100644 res/blocks.cfg create mode 100644 res/crafts.cfg create mode 100644 res/default_font.png create mode 100644 res/dl create mode 100644 res/furnace.cfg create mode 100644 res/gui/clock.png create mode 100644 res/gui/compass.png create mode 100644 res/gui/container.png create mode 100644 res/gui/creative.png create mode 100644 res/gui/fastcraft.png create mode 100644 res/gui/float.png create mode 100644 res/gui/furnace.png create mode 100644 res/gui/gui.png create mode 100644 res/gui/inventory.png create mode 100644 res/gui/items.png create mode 100644 res/gui/mapbg.png create mode 100644 res/gui/partition.png create mode 100644 res/gui/sign.png create mode 100644 res/gui/touch.png create mode 100644 res/inputStream.class create mode 100644 res/items.cfg create mode 100644 res/keyboard.cfg create mode 100644 res/maps.png create mode 100644 res/mobs/char_ani.png create mode 100644 res/mobs/chicken_anims.png create mode 100644 res/mobs/cow.png create mode 100644 res/mobs/cow2.png create mode 100644 res/mobs/creeper_anims.png create mode 100644 res/mobs/pig_anims.png create mode 100644 res/mobs/pigman_ani.png create mode 100644 res/mobs/sheep_anims.png create mode 100644 res/mobs/sheep_fur.png create mode 100644 res/mobs/spider_ani.png create mode 100644 res/mobs/zombie_ani.png create mode 100644 res/pack.png create mode 100644 res/terrain.png create mode 100644 res/terrain/explosion.png create mode 100644 res/terrain/light.png create mode 100644 res/terrain/moon_phases/moon_phase_0.png create mode 100644 res/terrain/moon_phases/moon_phase_1.png create mode 100644 res/terrain/moon_phases/moon_phase_2.png create mode 100644 res/terrain/moon_phases/moon_phase_3.png create mode 100644 res/terrain/moon_phases/moon_phase_4.png create mode 100644 res/terrain/moon_phases/moon_phase_5.png create mode 100644 res/terrain/moon_phases/moon_phase_6.png create mode 100644 res/terrain/moon_phases/moon_phase_7.png create mode 100644 res/terrain/particles.png create mode 100644 res/terrain/rain.png create mode 100644 res/terrain/sky.png create mode 100644 res/terrain/snow.png create mode 100644 res/terrain/sun.png create mode 100644 res/textures.cfg create mode 100644 res/title/background.png create mode 100644 res/title/cavelogo.png create mode 100644 res/title/icon.png create mode 100644 res/title/splashes.txt create mode 100644 res/tools.cfg create mode 100644 res/vkeyboard.cfg create mode 100644 src/CAVE.mpsrc create mode 100644 src/cellui.mpsrc create mode 100644 src/chest.mpsrc create mode 100644 src/console.pas create mode 100644 src/craft.mpsrc create mode 100644 src/drop.mpsrc create mode 100644 src/func.mpsrc create mode 100644 src/furnace.mpsrc create mode 100644 src/gameui.mpsrc create mode 100644 src/inv.mpsrc create mode 100644 src/invui.mpsrc create mode 100644 src/items.mpsrc create mode 100644 src/items_logic.mpsrc create mode 100644 src/keyboard.mpsrc create mode 100644 src/mobs.pas create mode 100644 src/particles.mpsrc create mode 100644 src/phy.pas create mode 100644 src/player.mpsrc create mode 100644 src/randoms.mpsrc create mode 100644 src/sign.pas create mode 100644 src/utils.mpsrc create mode 100644 src/vars.mpsrc create mode 100644 src/video.pas create mode 100644 src/worldgen.mpsrc diff --git a/libs/Lib_bmp.class b/libs/Lib_bmp.class new file mode 100644 index 0000000000000000000000000000000000000000..c8c46b288f41ddca8db9d01a9974e8cfa6035463 GIT binary patch literal 2413 zcmcImTXR!Y6#n)}&e6@E`c6NqH9ZthyHv@|FnYxYftTY;m=>~;I5eJfpZ^VNz|a6PwDP8aiqWj8%m zvKO2||2$o^%M0mAuj-Z;1{DNR1hCw}T_CtQx}0-DW@ zHp@Jsr*Gw*B^9$K@h;`b%5pXDs0ehsUb#Mn*g^vB^!+UQq2>8`r^?zYXaniAg|o<7 z7{@t@2@B_OL7=Nit(zxf;UXq2OrhPvduW%Kwr~mWOUzifj9G~*7CyjL3)j>%2g1rJ zv%G{O(MuTXm<8gSNGEdFSy+J`zKW5@CN}aW%j~5kr(6)|4MU%nzMYZh zo2$+K<`@EIY`S8-6qK!m5$JfDRwI?#o|dxyhW=sIRZ;ci?2zi0T}`5I=`t2^!SOD+ z1#i*MfQ*b#G3vMri+nGG`-^9W1X_}_W5G{3)$_$ljY0M_ab8y+x}Wsy{Ecy&Ex&~i z!L#92?BK^s{WJ(gZ_Y1LI?PpY)w>@+eCHo`a8@5Rz(ANB?c~l1jPMe6Qi|YZyg~~) z2oLZ(7opeReu6gh0HN0K3iKY16&S`t$e&@3_dY^I;0r{!iIRJd(BjXQz`2yZYR-h> zLsK*1`1sTcUg%!IHe=D4lSR3h2`9poV~g?3Tt-hxWx5?}2|e`D$9H(c-^Wc~&;udv z3q~MxD1knMn<3ud&^e6IraGQ^jy~C3PuB|LCIlsI0pW|AFnqBdNZ=t>=OI?_Ar`Om z5Q}ek@aq-!p{dM*@^x&;evKM3y{$j_pQ_go>R)T!V6CdN8XYjW#=?b+Ovo>>)ZJ-> z)IlgA)j~$aLm4w+b{dbr!SR%_PJ>P(VfH=cfiG;SVIccOWSMT8;{Mt%DW6SbS7Fsu zO1XA_?M`Y1+sVjQ0Y(216#YNLYn-={>@n;`9NpNCgJ?xRyJ(cXGfnE}X!#W_e!wpL z&i?und&NE+5DVxQH<1#b;-I*T!{Tck5r3dx{DlF{#BpsmPHGtpYy1PCoyCZD6=yUT zquO1r_mI`Tr~V-(v{jtfe#Hg9{jMOQ*%)G^-7vKgRI!IUsoIW_6;`!-omd5SYTsfX z_Om_vwa;+?N#-=ImC(f-VdUtin>(HHKS2+A+2jRYuR*6iBymz=M6##BFy@9RaY6`* hGyGK0L8MWy4(>hg;9+x5{7c0T2qE`zq*V?$_z$1SH75W7 literal 0 HcmV?d00001 diff --git a/libs/Lib_canvas.class b/libs/Lib_canvas.class new file mode 100644 index 0000000000000000000000000000000000000000..d14f4af4e9fe3bd18eab3ddbb7abad2d197b00ad GIT binary patch literal 2250 zcma)7+j7%Z6kR8hEXfhX0R#jm+(Jok1EI7vG!RO-g^*xcLb@XfM&eUI{WO~+Gn5SuYZ2~0~(IwaUKO+v2hjC zd0fMci0dL|Ma+q~A*Yo*ZsH3OUy8UTVm^;P+!pkeiMuB5Ddf(D%`iT%pp728qo7}E zRRe{-xv&{jR+krp=(e}mpk~Kh%l8_0yeO1?rqttl*j8}n=EB7V-)lbc+GiCkzqQiw zqQFzgkItl@#5UFz+L5oIW{5i}HlBvnxXv=_L0GHD1ZxY`pe>-&1zyvyw<4x#2XQU( zI&BuhiuBPLiE77@*K9Yum@0$mM7OOL#IMzB2{-0^OWRS{6SZQxEriQnEm&BJTFWU^ zm>!*b>^2)FwOjse0r+%=vfm{=YMy@Tfrgz=_o)x8%l1Aawm7=ToqTN^efaa1U=YAnM;&9Tw*6Rz;5i} z&c}=p*HQ=U;~>b_k3k}-pdUj- zV%?AZL|TFl5a|gzNMt1F5K)dX4`Vnhq)b1FVM!tD&^PDb&a8bK$XM)$_IX5?0clAcu)XJ7?4L!#Z*DBVB z8fAOH7;jQ!KV-2N@U1`AAav z7(OSyLj5f3lBrx`Wn-MeQ?#;K^$0#DvJ#(9C{6U@0zM^@UR6-WX|960{41~dS8#@Q z!oPygh;+ueiV1oc2&uhJO)pFncN9NasN4^GgF=bw%Kuffo84@j#kuSze_|e~ZnCtF zJb%4xYNd2sldYCWQLe)|-Zdx=zQVQ%eLyb`>aVbU!bsbfUiGCNY_f!6fzR7)-LYG6oK>`2s0x^xK9hBAwnEF4Dtb!IxNQ4=(=)2vU-P literal 0 HcmV?d00001 diff --git a/libs/Lib_effects.class b/libs/Lib_effects.class new file mode 100644 index 0000000000000000000000000000000000000000..79c6238932bb8045ba25efd4cee843b5514af1e7 GIT binary patch literal 3433 zcma)9-ES0C6hE``ac6e7W%_YSx7%qe3bb`g6HLYgNgu$dt3U;Vr1Ichx=XvTv{)8W z3?V$A#s>|Lh7hxO)JJ{sFYrYlj6MmTb7y9EcBe`=>7D!g-QT@) z@A2B=4Kl=E)Vo%ArJjo7=xiKJPmzW zcm{G=*vY*K=o3)TKp&qds`gC{4vrr>Q@T`IojzBcUs8PJvDlo zllQ>fv19Tsr0LII{3d;PvY<26RmP@Rhi zr5_>`Q|Ch%YKH@;lpfEMG3`i`2-WNgrBM1Yw9t{5mAFk}uSAqMC^0W_M7mDR??r)W ziCq$1iG30WB<3UzOB_|heQ0AwVz!KOEr=`Ce?L8hmHxS3<&PljgHGBqK3 z!07Dbd3y?YiMhK|Vq&^2bLK^*u`7Xiy zl3;%AU^FfDTL%TH-#Zu*{nJ5#p6XyUO*c9y(1#MtXa_^n_I6O9Ki|QS=+zDi^w|!E zL`OR)(61zz4-?Gaos7{Rw=@;<5f}&xx%LAUa)+FgiV~0t`H{(~WFgmm1C6PTHTZEV zUbz*Bs zN}&kvfYXFQbi(B%bt6fAlBB*!QumV7Pf6>^@^M zXC!@_Glp5Tn5X+Ex{~8u+4NB zAE6K0OW~Q6p;g+$)g<+PlKMDFIWQT0puk^r`ZT@i+t}$3=VvziL{X7V_YHhRw^Pdi z3PdMYAUZOG;H-343W>JlI_>bqS@srbq{fxnp_{UWsZUp93-c$;e@EuZ<|P!y=v!@P z;BpR3j?BC5(1B4H40GEe8+4Q8>zEDp*^@at838(N-^tlzgv&YFX44Ak0EK4A1Sqsa zRv~4GF3jW`FpAmX2IR2IYd{|wei}_bgO;B~;dikZ)0~PKm5N!Fid~e74yEFIIXl{9 fdoCWJ|95smS|uMRUX+m6p}U>qF*@sKn`q%*@pNZ- literal 0 HcmV?d00001 diff --git a/libs/Lib_imgcolor.class b/libs/Lib_imgcolor.class new file mode 100644 index 0000000000000000000000000000000000000000..9c59916890613d87a42b64024ff2b59effe049d8 GIT binary patch literal 1427 zcma)6+fEZv6kVrtFO{pKmW!f*v=td|X^4=<2tk`vP#_rL!Az&eGTMu&gZe~_;X{ls zzUm7aWB35y{RaO+U1zA52vN>t&g{MR+54=$&dGfK_Hh@0hbu`~IFrN(M%6T?rn71q zw~)1v6EJ7OMi>bshwN<|rD!&ct(MI@0 zptDp8%lE^2HE7nFt!bvWS54o%1Ri8&4yPCDx0BKtov0t zT`Xq*w?sgMe2XN@$^ygxPjDWDjY>>QAk}8ocEvN++7Pf>)$*Jl`2vY`mKHUEzQ6d_ z{U?tE<`2=sp}MdYslA#V?Va|#MfQZ${-Rr`R`K@u&Xk<8&)C;!y7?890E6GSlwW@NqgzW zb%Bn|dU0>4OVb&&q#sE};-eH8kHc$+I8b{z@`FdW{KpuE$-AnC#+QvkAW6&PSMY1( z-b1{jkw6D$GX^!JXs7lT;0QYDIp{(+5hjaa7P5&g_U0}vh;$#Sym}+zZ$7m&3vxwug)K0TF zK}+ZAX{6E5*ch@HAZFq+bEdc|1KYxg;INPps#0MeGPe(L$Y!Xm)*Z4_l1rsl-iYNg zUBfk%UREw`X|AF1bxoz1wVSuKyyH5q{Td9q&g9_Mz~I&^99K>ZxO(E{7FFANvAFF} z!!JacevpWLY~?6La`_y?C|l36>C0^Q8XI1ry~c)>h!03|g129Z=qS3sM3lcolsL&~ zB91CK)t!~CpT4#3t9!1$Bm I&Iz3U0rUR@3jhEB literal 0 HcmV?d00001 diff --git a/libs/Lib_items_store.class b/libs/Lib_items_store.class new file mode 100644 index 0000000000000000000000000000000000000000..c6958aa63c19e8e1249dc8850fe83108a44a9055 GIT binary patch literal 5892 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 literal 0 HcmV?d00001 diff --git a/libs/Lib_localfiles.java b/libs/Lib_localfiles.java new file mode 100644 index 0000000..01eda1d --- /dev/null +++ b/libs/Lib_localfiles.java @@ -0,0 +1,12 @@ +import java.io.*; + +class Lib_localfiles +{ + public static int readunsbyte(InputStream is) + { + try{ + DataInputStream dis = new DataInputStream(is); + return (int) dis.readUnsignedByte(); + } catch(Exception e) {return -1;} + } +} \ No newline at end of file diff --git a/libs/Lib_maps.class b/libs/Lib_maps.class new file mode 100644 index 0000000000000000000000000000000000000000..949f1c94ae2d7cd4b0cdd5ca80dba47d10e94d10 GIT binary patch literal 2189 zcmb_dO-~zF6g|&hfh;OjRd?NFm0y(P-1p`UkRmlwBjoq)yYuFrbI&{Tc=`IzzX4S7MGiUC z9C$8VT#;c;hItvT%5crWCk{S!@R@?!?DSfX*EWMKh2-k$R|?s%`>aIfScJD!3p;!;Q?ZqdX&Gz<6(CjcXRPVKd&fQ=; zly#I$^*6#DgRrdUK5AbVXvZ?KCDcOT$#Ylc`lks%SyMD{ZyBAH6@ zB5$5(%@p$H&1jWd?mgLVwZ92Phk|W&R(N|D!U+#~cpeHe49HMK$-^K@3MYjI73Xy2 z52!r`2@G@0=%m63W6x~BDSX70i_`F#k(al)JHdIf?EiyA;sug6NZBCm|CN1#j2@kX z`aTh)mXIGJ@iIwYpfVE_MleTAUFJu*A_C4ZqMdOzMt_DR|A4|iGG+hQmFGw|_VzSc zhh?*TD6Nc88?ax8QI53p%zA7_V9s+-o^PCEB#j6O16a_|3ZFAO%x5_y6qRyV*3+S| z{}>nfvMABw7F~c`{P{t=dA3_m?rJX5qUAE63744}CGHu`L0Zl8CmiG?3^FvbNS}iR zb}@Eb^Ui-Zf04~!Vxchtjg$YxhiHC0ZhkFl-ra}e&&Q3YdB#T@pJrx;TrS6rJBJ!~ zqth12rEz*NQrso`31+P4ZCJI`5_U6UA`stMKY+9 zL4&$1eP~@~VqG>Vo`~%2BQ3h@HcCbFVam6B)GW(fuaMezu_!LzwU>hzo5g#_EZKw0 z!KJyaSzbkEsrjYi?_$_Ar70D8QI-AQFkse6E`{5_RI9L(rFWJe4Y10q@*chNJ&*l9 zpZk4qzrHI{lFIj3)z}z+?bfCRTD96NsA+v&^9T>gg@|O+_+KV!VmDH zjCWcdCgLQWJNL|-$8^5FKRyA}P*xGcqKYLft60IRoYv&D9>Ycqn+(xo(>A>mhH$yk zU{Fq-d%=*_Oj}&{Ekn3>y3r*hr#UUX+t6K8_9Ia79?c#D*EG{;TEcSN!4XNieY@Fi zkxE;5P0#W4Zm{Q@oHK-6k0Gyh^e4U6)$Mlewr_i;C5W4nlm}OcF+;68eYYjfOc{b= zjeQOzn_~{~7>XQQvTk$iV3%VLC60ZR7}P0&Au~0+F*>3}A$~#iLC+Hwg_Fs%)1#wo zq(#vtO`%+wnLpuQ_sahj{&g>iDDM+MC?ZNPB8NgBr3dZPsz#Mjja1*kUTG0Rg660X zhQVpgg9At+MO_@}3AsqU9Lf+O$z?uQB@K{S*tf|bOSrT;BwSjlLxeA@Z&03Js0;i8 i4ySO*iKjv-a>&z}IOhLViTqK?kxG7s3PZv7TlfLs6?s+w literal 0 HcmV?d00001 diff --git a/libs/Lib_particles_store.class b/libs/Lib_particles_store.class new file mode 100644 index 0000000000000000000000000000000000000000..53fce200d5ac1ff07bfb361b103c595d99ffd716 GIT binary patch literal 1476 zcmZ{i-A)rx6ouF6%=Bj%{%M6N6jaa_m7-u`;!lhwCQTZ>fb_--GA$DvQd`mvMsAF+ zV0aC0gbNcxd;lLxU3+G1r#O&s&Ypet{?&SIizt zKZ6Gf<3~=<_gZat&p$bG6;f|sC|HA})A1C{!RJRQ*okLO6w*(;j^{s9(8`sDg8s6* zPtauD>$tCv-#6XfuG4HYGgI%joOZ+MdGZ}4b^o2$SIF1vUUToCPJgfOcYE$*QhILR z^@j(y1Btd>6#ij3)&_| zQe=!K1b7g083Dy9{Y{M=g}jlJ@J15knLFL%Udw&u$>8P_X0vhVd~hsGVA4VsISZyN zW3ViY!%~<{=%E+ss~nX!ze4LU?(lu3FJP;f69RrMpf>L zyRrTq>KlU;rn#nrB!6qhR#<>p%<(ISJPOQ6^A2}uUa&8+=ST&sW?$sap$Drm1QuYh z&?H#gSOkw_o<4>G3%JIN2rR&k1U^Fx`buY{7r*SDL9-WS)9t0x#u*Gdub(z9tITi` zvt-ZFY933pD=OO|3B^DKC}EM2*e|hWo)?#>#7GOGWkx#Ptl)a&<~dKKDjT^O>Y72` zrfxCNDui_dt!$)~!;K`GCU?6`TPAJg3Yz#;^ma3errX8%OhRv~q^(^+lRFD-HHl^< z(JG{^UqO?(32hCxqPcBz8Zu{7=C(DBKcBwxEB??n0#^9Y%xG#k+)g5B$%L&$LU};g hj69^}?L54!|0vd-9_Uw+x{d$4pC)uG&PVQe=P$8R(;@%> literal 0 HcmV?d00001 diff --git a/libs/Lib_particles_store.java b/libs/Lib_particles_store.java new file mode 100644 index 0000000..606d3df --- /dev/null +++ b/libs/Lib_particles_store.java @@ -0,0 +1,63 @@ +class Lib_particles_store + { + static byte[] particle_type; + static byte[] particle_ani; + static short[] particle_x; + static short[] particle_y; + + public static void reset_particles(int len) + { + particle_type = new byte[len]; + particle_ani = new byte[len]; + particle_x = new short[len]; + particle_y = new short[len]; + } + + public static void set_particle(int id, int type, int ani, int x, int y) + { + particle_type[id] = (byte) type; + particle_ani[id] = (byte) ani; + particle_x[id] = (short) x; + particle_y[id] = (short) y; + } + + public static void set_particle_type(int id, int type) + { + particle_type[id] = (byte) type; + } + + public static void set_particle_ani(int id, int ani) + { + particle_ani[id] = (byte) ani; + } + + public static void set_particle_x(int id, int x) + { + particle_x[id] = (short) x; + } + + public static void set_particle_y(int id, int y) + { + particle_y[id] = (short) y; + } + + public static int get_particle_type(int id) + { + return particle_type[id] & 0xFF; + } + + public static int get_particle_ani(int id) + { + return particle_ani[id] & 0xFF; + } + + public static int get_particle_x(int id) + { + return particle_x[id]; + } + + public static int get_particle_y(int id) + { + return particle_y[id]; + } +} \ No newline at end of file diff --git a/libs/Lib_png3.class b/libs/Lib_png3.class new file mode 100644 index 0000000000000000000000000000000000000000..8818ef1ec4868466140e16fbb237bfa715763201 GIT binary patch literal 1933 zcma)6T~`}b6y107G08B`w5Y8nKszmks(@94P|+k*K@`x!WHQ02$xNC|kU!yr zkN$$b^r0VXLA7hSeCmTg%H_T@gCqqPX04oi@45G!yZ655%wK>1{s#a9WesOBso^H3 zR7|V5r6G>V6yB5L`_g=%VFt4*=F%9(hdt16Tbhrg`B<7y6sbwy{Vv@42pRN%t&6yq3Ul5F!sP zxBW)jU-6r^S?6wY&T$?8wm>YKTN8-Sdlg%tui&_Lsa-GI%~i8pqi3+-S!Qj`Y&vos zIph8h4wGwzf>YjVxH~tQFx4`5ZMhJb&YlFcW>wmbu~avA?AZ`i&2)DRB68fF+1!$V z;C(|KTMK)Z-H6!4oH{d)o|c$6q!1;u9$=Sx8J*Wqma<8+nHT6K*e&1NY6S=crcQ;O z>i`$w=7n=sEz(k3@!CzxmI#>sP@HQLg^o8cqN1Rqh?2mWBV_-wl7T;r~WOWJ!*%V%G( zr8Y>VV%Kb+g^;w^b8^xzFX-$;fpdpok9TM$(Ek-b1^ub%$YhD^W?pt~!m4>Ku2U<% zY5iC<8v++kpxV)Wc#|KTv;2H1NXvrYEG^%kV;n-(DecAJ^TwX!m>4^Nc*2Q-OSH+r znZhXNdU${--{LBbw{bZP7C-ZJoW5OA9D5F>_z>~Z3&htCkQhwvLmlUTAF1a^{|W6G zdY+=^H|PStM$=w_!1Y=*_6a;g|5Nl&>|=n#OQdP{G00OdqnI-S50NY>kK&Jby8@M; z(inQ+;sM84fPN7J0d56-+#ld>2Jd1BlN4o!vg9dAk)o_pk`0QoO+l)Z#3jQA%+MrP zpFBsIWeN$#16S}4vp0ETI3sK3%yLK0au}l~3Zup`!Eu{jFT|$eGZmQxgc{(Cg=-Z{ zJTil><#zYd?Ou}KQEZUS@ASy0xr%Gy)8Lmt3}9Fks#NR#FxLMaXWK&Fc hSaw$!Ab)AWvf#g8mL40JmhrSxEUamIu5+&7#y?01oUH%= literal 0 HcmV?d00001 diff --git a/libs/Lib_safeload.class b/libs/Lib_safeload.class new file mode 100644 index 0000000000000000000000000000000000000000..0dec1f4d8457f99264d139d773b594ba130f8af6 GIT binary patch literal 1560 zcma)6T~pIQ6g}IoKpXk~5)}|o+R_pc6a+*CMXLcGV3_fV329n_ZNijP@n7K!pw2ix z_~egrJljeepeoJuZg%(Fd(S<4vp;`*`Gz3USdXF|i71j7SCEopTERpVVI-QM$?={v zlTqBql!ECPVt62752KjDYz&Vut6*NifK@+m5wXF78;R zO=G9Pl@8rCjlz~uvgQ2GV#wRI4+L6t-QL+gFmhJGHL~*p?UnbB+j6>X7mYjvOvm*- zA~&0)k7E=mM0CR~mrP6gQz^f46S5K&9q3f>Sj8gx1v=~1)hd@;PXv1ETU9-m z%DJ3X5>RBaIZadX6wg#FVOha*6)&(NkdRIn6mMLTikEmLQ)LvqR`Eu%(iN-;sD9D{ zZFL^&JA2eaV4y)3-?<9JObX*!l~WcNjb}1f=!J-}zi&BNfz)4n$=_a8Ii&cWTNQ|n z5wGU)kz^9Y1lwdJ#_(jKK{USTgE7VjiGRQsU&L>%b9UzpbkGFs%vpP{^{u_W zz1G_2a{ccwu8~0-Xe2_d^hAW7q+K?}X*Y|fSUk<*85X@Po@J3{v4_Q87JV%Cv3QO} zzfJq;c@8zevjaRk7@d=)i>wxVHlh z7f%(kWn|gtEidMCg^@h6)DETF97@`u$y@P8u2kSYC|c36=0EhRD>Ewfi_*i?5uz8P zbd-)o=>b|CrDc?i(sC9F7VRunuy~NgN*1eVb(9`rv6R&|7E5Sxh+c|Pl4HC~uS98( zhN9%qaELNd$`V(!uP{8wTUOM}2P!p+N~HRSPvkPlw*BsBOi_c|S~+owR&js-Jy*34 z3sLjlqBEHpR24JTUlDq1-|fzLCD_yfJWK-6(8?f&@WEuS|by;f0(PnE2V z*47^7#o+^GCv$S2Gl^cran}>Y$mR}VW^=V=M2loZA7n%;WJK3wM9*YIQ)NV7Wkf?| zL_1|fM`c7)F)k#<2Lo~qv=)pCqqX*PQlDYM8(2&0Jh)5&{1NR>B(GASN=BkeX0l3F zg@V@P8EQ>bD3q^KI9VYZV`Q2ZdZvhH3MZ2JFC$fIs8F~<5t&DsNzrl01&F_n0*W`$ z>5Vq6ukGMn;0Cb1#5oEjrpYv`6iQ;Abmz7gw!1>6x0ecUPj=&BOV3kNefAAxQMks+ zyTJb<&k&aphP`Ac*`STb^hU2VJFqP-O}msLVNIT=7LaryN3I8Ifm#J;6Sc8!35Vwj zr)v4dVdgM4ykl6^sGG29PLJS0mO=wGytxJsAOiokRH*4|Le-nAoUT!&X2=<8snUXJ zY6U8mCf9;kO|zS8#2(ru%4U%^ZPD>V>#^Suk?}2}Rj2`%X|O<jE7DT_PS#W?{|` zZS0nlwbhK933G^heStQ}A?s;NvcZM{X-3=P*jqS1w6uT9P}8?=PMMJ3O)1DrQv`X| zV+#DHnT~)dZY8p}ll8RKs8T}3?DLT^&F?~aL&&Cu>;p|!(qx<#lOf>$la_r~rhCe1 zZUNPK%{0KRx_=3MDy2K;l}>HfG<8qJeN2eH*G%)Bh_Qp@1O~VwD$B8H>p|B?69ai`O$(A#sV9v@_ zzjDp*_7y8Sz;!>*4IlvA&_DX!{*(anBqkMf72#2<{mMGO+h$h0Xlk2}N9_QjdDJey z+n@w+^HHyg;^w2?^DFQB-OjS2c|P*+?y&5YMk>@s@* zeXJhZsL`$U(2z#A)kAHKZm)+1HM*l7YHD<6J=D@@XFW8m(XM)EM5Eo*b7wV-D^iUx hJ+8kpP%o(=wc)!Zh%1Jxk-znD*_fNSEPig`_Yd@bppO6m literal 0 HcmV?d00001 diff --git a/libs/Lib_sensor.class b/libs/Lib_sensor.class new file mode 100644 index 0000000000000000000000000000000000000000..4e2d69927f8b5a3e9a8d1b4f663f313c4e2e0374 GIT binary patch literal 2417 zcma)7>sA_96#fnn#~H^5&#Wqr6utTDEICd*-2OyM!_dQyghNDimF-Xg3g7>n47Rdq)D@bzRvtTqbi4bKIoM zI7T*WW~5yMSJx5OU-#vhdDCDGB=EeF$Q~b=tk>$wY%C^=BrL82R>=pXd{1X4(OM3K z(Yc^6ZM|4=(&maKYuTG`l z@>$P!1qRO!5?;sa$6|wH5l?V%rZ4m!waTTuaa>EHGi$nAR>sW{J^_#OJ$Rf0 z>~YSp$N8W<&Nt<8PC0oG7vCGb&Qf|sF36|m-#`Sb2yg}GPZ9bJN{CyES88JLcfx|0 zBOPU0fQAsd&n9_@LH-YWV|(07WfRrFI?#XBb$c#CTuU{GeuvXhQO zAst}8*O>Vra~i?|hOvkdtWu-m4kE9+984Lu#$aheUqb4ym>x zqnw}5@VQ_4E%G2M-hG{&9%I8feM7Q|0k4Vu1OqYBM;y60M=aru+CHMxPgiX{tZ+-^ll*VrB{cq{sm$`(=7l1 literal 0 HcmV?d00001 diff --git a/res/Adler32.class b/res/Adler32.class new file mode 100644 index 0000000000000000000000000000000000000000..d64f244e593eabc75c22e67cbfee2114110a5562 GIT binary patch literal 1347 zcmeHG+e;K-6#t#wxjF9UXgh0OO3N-9>XxEDB!OCiq6TVWX_wjEQAej)TW9SCMX)_Y z{R2e^Mc|WQ5CjoD^df}+LqvfuLHW{ygxi@>Lz7;6Y97w_JHK=N&YbVV+M9O(VmP8g z#sQHrf4STySdnp1#vy{x-qwGbK%IneN6MLY4aXfc?2H*?_Z7DH_OuN#))xp;tL0ek zNkXu?W{^!Csia9L=(ZfQH*+;^rU#6;%}h~uDq+}zM%wc94N`E&t!YADcU#gn(~S)$ z2(qyb2}*U>aC>KGO&51ENf3PlW7dQ5%qSr++|IP+B+VO4*`~wP^l?u#5Y+xuCY>

~l#aa5Ki-r2abFeZ8iD9#FsT-!bP8iMf^l+T(IZUI3rx~m*z_I_Enz&TL!CsDhd;HV}jTVgm1U*=C{aR;-!gIV34ne(8MI|yL^FF)|# AyZ`_I literal 0 HcmV?d00001 diff --git a/res/Deflate$Config.class b/res/Deflate$Config.class new file mode 100644 index 0000000000000000000000000000000000000000..bf9ff111ecd3c6d4e1248b7e7f7733322ead48c4 GIT binary patch literal 577 zcmY*V+fLg+6r6ROI594vKq!=3+ER)7q4|I!UV@M!MexvymtNA1*(8h1T1uR%^gH?^ zeXx-Fzz6VAh&d*zR7*Q^cF)dJKz@ET~fGAH_j&ts;5xD);|ZS{&mBqvx)iFY)B)SXzLXG(cC2pwIl0ne#}dUJ^9{Uu+_~j zjY6|;ojIFd56$$G9;Q55?PrNjFZ9&PesSpM6FZ|&H*+I9R)~7enQ1rGvzg)fO8>-+ zQk|QFr-2U&;m2$~P0Xnk&1lhnf2Duu2u-|+&_EbrNgxtawxwMEGE(BbJh8zRW3>sA?hX5pk#WKOdGP|YGQ@_oYil5sFB<8EmXW+ zz>9YZRN~zNe%$g4RO42)Km9on6N6ig#$gBZxworcrkWXHr literal 0 HcmV?d00001 diff --git a/res/Deflate.class b/res/Deflate.class new file mode 100644 index 0000000000000000000000000000000000000000..50794d68b5582cedd8769ba65ec16dfe71bb2746 GIT binary patch literal 22540 zcmcJ133!y%)&IHoU1rGyCV^qg3`<3U35$S4C=i=KfJg|K1T+De44HvMvp^OEYH=xA zx4P7&f(vU+tyU`%)T(V=iq^K`R$JHFy0$K@wJxnozTdg`eP`Z4zVG|@`9EJC=H7G8 z-S1iMxy#EFU;XrFL^MTyCrHubv7Gr>4vu4V97E$dn83y2929cGL=Gl# zFqwlXoaJ~?0n6oF?octOp2Wd7I72)^z*4=43}lxdTwSsBRE8xw*r0lv=uEC@P7BIgSusDowmI3E9;=5iTabTC zBHiBJ(t+U&T3K;Ma$|BzbFy{al?2+gbtVE@*0P z>S(O)OtyEXQ-XpT=R|JY5R}6ME2~M&FQ2FSHX51g5(~;JYRb@aK?CX%iWRN@~g$f`}rOOA`w!mRBzlG_WqQtfZ=@yrjaVgz6I2wUzTc=z`@H znN&ZwS6N=Yh`VHBZt4JnvDRh3Is2igK_bbY(nAKVGzcE7eum&B%fVrD- zP)e6q*Jddj(5N0ph9-BYnSo?fpcuvw((;fftynsbN66Kc&r4vGWz}HZ{Mt$v#+;Ov zSC&*^ZZXu7>Urf5(?DHfdFA5DrKeVc;iX+`6CF)k6d%LLRaLeuF+EX)T!88TPCcGG znukFu!qlmWsncgNDIa;3lvgH}l+?@vyOby^7>NS%n9GS3OP4M#SyWcS!YgdF#{$pt zj;7{AA?BAU$sfr*smS7kFsh2O%7rzHva}fTRFp%WN-DSvRE~VvA_7$e(9p6(b$K1n zt(*%2Snke}+0ohF0#ZdCq&=N%fwbFD*3K>{bI$s7YYG~WSktvukX%_RDC{Ar3G(D> z>*_??P6qUP#coM=Hnyd}KiG}V#MPYBXiNi6Mst08dL#D?^Ja2mf~=<2jsz+TG$uP5oopJ`Rcct* z8q|3jo7SS^Icr$46Bv6tuuw~~v!OB3oNis$iQ0nP5c&cdWLT%cOf)rXqvFRTIt6od zqJssR+uF`d>YnAOI@}t=Ey+!ZhQ?%5Yo?I_OlnSU+3YrCHK#YGn=zB99tLaOW^`m- zTU*La54JWnq+KMC+Kj5eLpD+jr!?$a)11(d-JD3JI~p*X6*b7loK86u&ZN`)fEwDm zS}_Maqw9Hgp&WjOxu-6OzGAXd>GeE4RA)I6X9!aNpOu2&n94+TKK#m-G?wYQqX3V$Cc1#f% z2)Wz@8q_Ea#trCzW+%`|)ix%>9$#LrhGRE3pk=0{900Q6KxTWg6~hdu!g|>L^<9{s z&7GKi-}sfKx()%Uu^bIBRG-c9r94*x!WZBY9gS_QW#)L*reMVextggF{EV$_f*`sU-fU5RR>)2i0o)S}GS zS!CB*9R`6Qw;GPp&n(vU6Glr72?2c7PeahG!)WLdI3*~0pbA*$6S05-bIivd4a z&|oKPb-HtYQ$uG{TWhi%!ZR>iJ2YK4;7JaqfK)iDKbM}G&Il# z8|CoSKc@kPN!jyYbz4_^LwZ3I`|6?jT0keWOCA!_#B|IdFI^!K6C*=n6bGX@7$dBZ z_?kE-B#xs`LSh7?1sp^XU~jl1Bn%F0ruhNUt@NXi7y?M1$_WvMPGe{oL$wSIXQ+;$ z!5oA+2yu|l!5|KDIT*-+4}n}MET3EzlBdhnA(`Nyo`WO;F-0675>q+rWDe$t=^-(Z zp+XKOaWH{{u^h}3^Fv}WL*=44B-hA>kWBH&&JbsYpyS0Mu}(CG=ws06U$ny~(;>N5 zt_z8kqCN!ciTsT`*7LZTI9D_dfowv4d4~9INS?`)HJ)kBfMg2?tqACI`XVIG=VFo@ zTq#zC#MNS3i2gwz`D9y2u16Yu%2i&+xh@u$gyaTBzl~gCE7ML9RUvT|P}$C%I7@5_ zi5jsyB=R_)37YKSraNUF zxyQ2*$nzP!pJ(UWJWtzra&M#CLn4j&6qj+IuIJze4%%262RIVy>?I+i@&X@(fIfk% zeB?$F8q|t?e03FIjN3;Qfr=m~QVtyI856Uiaza(luwK8(>5HY(?1% zh3YD2(_I~Nl(*?(+WTPt6-C(H)c!!QTDf(sq`crcKAz)ShAOhDaJmAV>?FBaU59jl zQ#9k32DMkCTY;T(hA^AgK=xVN+SU5!o%GEeooU|MB-`7Qn|bjR6d&)|-s=(1F7Jn= zTnbFTc2S*19X|nnmU2l_4v?eP{6tC{cL!^Bur`tb9Ebx11v8+OAf(NPc!xb>+%q#d^%yc^y-8 z>aXrhHk`R6xt^xdwR9c!%Nu9}ZKoZO{TqNux)JzI9{gtDJ3aU=;JZEe9^iXD_&(r2 z@Zh%q@Alw71Pc{uJ=1Jvj6C84u3mdDesTc%Jj% zJf7cqaL)g{2j~31_u!oW4<7sl;4dD5zvRJRM*1rr{8iw8^x({o*F5;2fdAQpzYhEj z56<%ZrU!ou_}d=*9pHcQ;C}`Ft_Ob)`1>CG1K@x2;C~1Hp$C5t5|5=EA@Q=PVz?11 z#;UGjteGl?XQ5)OwJL^hpkgexD#rS$VmMeF^Kz_WEaWPN2ccs4UMj}QuVT1iD)u>a zcw`F4O0Hsf11g4VpkjDkD$aFcI0Xua=cQt}W-5kzp<*~_Du$1y;=xV~FHhm{`&0~H zL&d|Kc(@b8e^hk1kSc~3sbYAYDu&~!V)&jahWn{vc%UkV52xZ|ofuB3!pAu{{4Rx0 zaAG)U3NLhG_=O6e2=u&6Kgim{Xv^Jrrhofw5wn5Z%4+#rIPl2>H_v(4Za~>_HJs0iE#hq2CccFmxUF=#I7dyv5Daq|4HaJp z_n1>x=*f^50@i8LhwCq3Q^1)^I*y4L-Z&1%$HU{t}uYE(K%1OY_C$ zR4%TdrQ&;3jh#W3xiuN)Vsqm#*Y7Yl1vci1k$Wf~-3b<0jSd&z2R-bNbF$mr%zE8u%_2ANWS|Dyfe{ZB(aT7I&n^m9V zs%JwSZj8WKHD9J?Afl9qL&aoc{$0Kd%RnPCP?l>`GqeR6h{Rk`?99p}w9OWy1LN^W zCl^P}O+{vec{*h;)oNf5jVa{hh-ubO)&NI=d+GS?WN$M?VeBYsH{_XXbP|?E%(*Cz zy1RS#sf5_l>?Fl0h)L=upZFn##H|?iZ8S^#nC6I|P?flw)`%X6^gYxr?o|_Zg6^`* zWac8G64q$MW3S(E@WpzZ5KDIik`cQJ+=BJ7H;^~rL9Z648_zGzin^vu4f zpZCL#5tcV%0cGDn^c2Rgz!SqSd>3hj%c9UtakEbNdqV*76G!<0H-7EShCgV zeDY*9!U;#<@jf_b;k~^cm3$gif*bU{EHVqt8AY~HcdO+>M6J`wRn{Cg-jVnys-WOvhbAO!YM1pE(0EUR(V zjEJxP>J{Bo8L_t0IOH>TDnsg|nn>il;nAyRFx*YYMttGmUZuIA@Yh@_8|YAYtVYq@ zhy@WwUkA8-?WO|ViQKTQI^Rt}XH44+81T}pD7I1orsFYi=~uYeeFC=U*H~D7gS)gR zX_Pn&Yx^`EFP?$@c@~SxbFe$lQ=Rxd#O(#zAYP;k#Y-@puh5O+Rk}_5iS7}v)6c{k z^oV$qo)mA>@5DRwNAWJbg?io-A1J=B#e|FmgVett2GNFTX;x=Dz#J8jO!){8k zy_%%$Rk%+EII~Xfc*JL?EX-#&!OXGM8Xga`m&jGAM4s$!_=90~L>y{3Cl%Hl`p>P{ zge-Tq5OxD{3>oqm^2@Q5Bafwl@;Gp6JdKiZNMRw(kP~TvoJ8ev3N4ezQ(8`=GvsvI zAWxvJvWPB{C(<=?7TqAfPCt;d=`LAJ_sf&$kSw9!%2Ikp&ZAdk8NDGF&K0+{ftHXYu2I(n{xZL zXk+@Z1mzx@YrU5BLreEV+u9H9nto_^^+P+<5ABtHXdm=L`?w$4=N_7C<-&YG?%04P zSO61RHN21=u$lPHirq_JXInKZ1`9QdMMdwRlp`Wfp#idrhRJHhK6Xe^IK#Bz;&eD2 ztgyqyYDZy*i-cktH(T#Cd$MC(S)gaC#_CLNt)M2`9v;r2=@pbGPgQMc!QU5^E$blYD?K%bGc|`r3O(kUafp6& z&0+r*U3q^spN{2oHEK@$H#M(yYQ|NFQ}a591w-K+7RM*XX5`P=IuY&>$58wuyS@e% zuYrchlxjdTU}&c6Loq4ZVh&aMgM9}L5>1K$e9wQT(`c__`VPU6%_a9TKVKb1zOV?yfLU)R|{ z&MCN;=6UeRd82x_?w}Ns@~wTe3i0HyAL4ufM-~Stnkq64Y%5tC!fyq!t-Ei_ZRj@l`m3=fv% z^%RlYX@b0g=E<9Aq1;KQ$~}~n`zR%UK;M+N(53QLx>?>vx5(SER^5TM>P~td@yl{Q zy(aIbPvt?y7T#suLZ^s!r9F3HM~(|Xh~NR5hf@^gfs3FkjDWg8gBStY2uLbMu7HPq zDj7-y!O2UrApAxxm`XHX?t^`r$%czxw=nJu9gs`#1*Ibscvj55BRz*H=K0x9_ajn* zz>{1*J?!6bYzO5+*$bfp-IRt1!0jut;}Kg6 z0@L?XdBmQKEtGFN4T<19=VYK@Gm1snFWF}FVj-EQN=;Px7i97eitVSxoV_?6Q<;_L zGHKt)`*i?l0h}JPKd(5S<_&hez@REs?(lhYwQ%8`5U^40Xz9 zX|sHew#nboW%BoQh5Q4a3cpA<%9m)Le3@>Quh4$^D%~gFpoit#^n`qeo|S)59IwJW zCa_D}4F1{FNo6=0<2}*|I1gj)8nl4UR@`Mn^qk9kK;LwZ6`m7k1Cq%3G)~eWBT5QZ zgF`{ZVQjbY59~wvQ#}-Ipe`dnWJ2e0y^i~i%Jr~^qH7|)!q(CtMnFQjcL`&TG1n+A z2>bTXVBVJS3D%7IVto)BmoKqae?=p)?-*wYI^K{p$1rH2 zVR=mdB9G}GjENZOn*N0@K>WPH>G`F|!SXXj_iZ1}o}Hd|D}z4%W(s9{n;A@&W9q2U z2vEQX(qJQp3XBkqH3rZGV<1g7!k&&zIih2O-TsVq0pceVPRD)>!Q%~O9NR`LolEpl zZEQP^YNA)O{}7eus~Fv_EQlT?&&i&WB4ZdC#&Ag42+B30lxM_fs4MAy0KB%ZkF z4Qj(5g{(`UdIc*uNXs~}fDhmg&?yJ0Dm$b3ta8Q#iWw8>SYr}RG$yOwYM*sdrni&C zrRbU7tjEycKxbpFq&4gyuB_tmhVGpVV<@cC&*aaU%Z*q2;jINVFc(qG+)E=dz4q1$*@B3W4oGG+M9L=k4k^qafzUctH%(9E-J)DyZC8O3RF8uy0k=WK>hDv79=L6?BfVimo`8hsBkE^vZoBc8i1E6&He$ z1y9U^iHw0EI>!U=%VxR51r?9)bTQ53U%DvKAs58zj#EX~V|XeHKJ9{P{l`-!M|Q8m z$XGgt#SQ41K0mHkj%-2HJV>Wz#Z+y6j8+O8ZBVTBnR!9k%xnzHDAX|AmatjoR2Exp zmX84?m>H@bMotEI`_0d<9O32t4X!rmMFY+N{KK1J7!FW{1tEdRo(7nW#dO4$iVsq) z$~e)k5BuuvvtdgPP@#*!iHtzn^ZDqun{uN5`r0CZQD40x7r@`kjTb~?2dS=`PUp9VC`)TDtTGdUn;=UsixkotMGuh+kQ$DjkVw?2`>2y|q*18-NL|5Zn4)K!g z1ZyGQ3?V+7g2q-FVw?xl|7|+XxCA!gyEMzVoE8{YQjKvntun5I0N(`R-AP-FU37`D zo4#-Cqi*8|^pJ52{T7!1PaAj8?~FU?1>-KotW`Knn?(iU8ZgF$GcrJ23y5v*ix~#K zm|@_H83w+n8Az*Wt5dd)&UMNf^m}!LXe%puAC88HkWag&+PkRfi>`7}?Xz_BMYnlT zEgctlNsfSg-%BGrj&WM#I(4Z%UXoMlw_Y023w=@I$9;~_^|Rv|fu`xh&~iolCO3}@Hs{8r^sdjs4jv%rtR zZ_OqID#h71oDaNVE9XE_%ntTwfK-EDU71yfjX0Af<006aN9h>jmr#MnXqxc^%`^^E zh4B>C8&6Y<@eIWOS^AFg5?yAzOqUz4(hbHR>45Pky5D%6eqq2*H{PPd#@qCc@h<(% zc#l3a{w56L3o*j@Qj9f8Of-dok08{>*}0tky)YAXVr!gq5D;-srrL@x+j zvmF=tK%yxq0s!Sq?8SqK1C+LQvil0}a4o-WI6$N9-9mCdxYpII$D?dqF{~?A0?a5B zjAfWJ58g|cBjUba$myd@B#vST7cZ=oNbD=o|NrB0+QHras2#oE&$iV~?F!+pskY&Y zkKzvehdS0xcrVbWSZ4G*x>&Zw*!Hi+^zp~O%KvZuu@F09mUX*vdw<^8Ex1P_GmoS> zoI>UZJZmYSk!F-en&rX+vaKF8naH^XRZ;y zF&o75W=gzft`%>Xjp8q6lla(dk%rkSbImq6*jz7%nC(i_c}wsly(_k}kAfT62^wO7 zcNaxK+Q*Y}l-L3N);`{YI9SA9-SxFbXTf+Dyf6#y&w`(2Tpq&VT;_~X+?UBBUh|MY z&XRjwknIY*E2nw2>fuhz?Ts9g1xIDUOdpjKh*#ZO$IU17f+w&0f7Nlx?{NOlbezR} z6rLw>yt;=P;}&E;x}DfMjKpv79%X%wGyr^@d9(rW@5LE35^(9yOZO-|5*UhD+k?C? z?ZZGjk6e0w)fm%}>l9)92>h zVt{!-6qxtHsQg@f!~BIf*?d^knU9FG&0mU(%|l|B`IxxFd_p{6{#ra_{ze=!e=D9c z4~yr_r^E~9)8ZZTS@AdX1!^TP1hvJG+7zr zbX~?cU6(OV*LaN6XB7F5jML$ak>Gbfu1)(q1LBTV`3K5v7k7A(H@(O^nG!NLYr$~; z>(+_$%M5r%7VLCEW!Jh~Oxv}KU6gSDktuym7QEI4m0iQPG>-4`COj87Vd5i*;|O+N zloLHt?GV`jD9>S^I`_(;DHh2hA5w=E`4Ogy0$eap$oirnpvqXpu7|o5@jDKMOfTYH z02`(u*os80EpsDWFt!hGOA!_M`DP4xaky>QPmhFliP;$x6-9D(2{tZB=Y4EtZ2B(2 zmZ}m@BwP|a=bdDC3%SjZAgfeE#8iHrZ5QqBm-^j)sb}>|P4-J&+%I)Tzf`uIm3Zvb zw`YM^B)GeG38pX-jHObz%LxKb6=Q>K@57Z0PQ_MZOKt#D{~dZL&AIdvX=}aq++N>e8)f!IcSur|fjiz5&HKbYskt6cFTKsfS46Sp}{EJOo* z2pHfd1|Fm{j;wx(svgc3XUbF`$W$M2tLN|hbfvNsmGT>|eAu2seux^yae^JT=SIvM zDaXWJnc0a02+Q0}({U9V*h>>JxLtG{uGIs(X%wP?dubR>p9e=dbwI?vf$)~n+J{=c zy1g*oL(O;()I%+}Wb2{UIGd!_O+A<>0J*%lr|`xIhh{z0rV`tb80JL0O7EcthT7Qj z+08w)MisIeAHZ|!N(J+a`Gm^N(7-sl8n)|E#X=@7^r@^f9k_?86=b2RZ^T)17vdFs zNj%zvN0$-1htlyF?upjNah;Fys z&i1@AF5*Sjx`Kk%l{C=0iUwO(({Sq=8fjfe$6DW~INq_%v3Ag6>qc5;-ApyurJrW) zQuC@WIqKYbr8+&YYHr{)P+Xnp`EZLtbYcc(F9Bzn>>hBEKJ+88Kl1?dRt%msc^<~J zF&y8CXK@T{*r~p$*qA4GU_FIi#Gz_4IT*-6f&<=QBj+wm#Fy*~WaUp?eLcu z^+OtK-AWUzAK{(BZ8Y7wLybp2$C#(bqed|jqZs9$1C_WysRm$rN!;yPFWeLBOR(#4 z3FaCAsC2$k=}_zj^2g9VcRc$o$hQDS@lD9LcG4j5tAo!+f`#Tm+N#`+{OC@auQe-M z=0E>_1Xnugi08(o7}rl^VNZ)gZa-uy$GQjnzK_OO570NPpVLC?VOnZE0$x8#4c0HI z-8zI7^)b5A`W0PkJ)!1GU&mda;r;clPSN$^05pW<_j+)I4X}a3se^#@b=(qYRF3jH z!G662jqHn#>5DGxi(c6mC2^0q*D=Hcpg4Tv@K#JcJDGS$o$)FeQihaO0>8}@4O|nj zRzyskU}9UPPfz)@S9_GoxhyjA`~)7)MD>mMv9DgS&BkMyyFJ2Pg$paPo&-Y=lWjds zgREz0i1i$ex1Oitt>4pJ>knY+3$(;~iR!GE;V!*GYpvI*(|UuhvfiSbthebw>m7Q= z`U|}Z{0-|}#boSj=o&m?=c80SKEji9=Zh#DUb^e;TR8dnM6vrV@l%K0ud7#CCd#~~ z?qT&~i1ok+IZqhE>dOPx@*zi2jz5aB3X=LH;yLZ^9gt5xA1`lk3p`C z`T$06)Jy9DI_D6LhD@CM7!*&PoAc8|HZr@g8vAzAz{34>o^KjfbzX|qg=m;bVNLt| z_BcN5;bZnK#jL4YxO6zai!KfGMxqsO1bmz7@eoHVw3*`9H|7?869xa-#upL%8A#aP zbgs%!0R4wMFd7&l_6$a?Pw}aKcmr%Y#O@%moFH2?&XODsf9oP9F+7;QeGVf>T7JCf z+)fcJ$5p!fiMvzVkSbTbbsc z;eB=1T78Q@UOo{&{$rys9KU1mo5Ux*7x4AVP=+pKD3_t{Fa%}8LKA?-?840(>c!|I zI1K>B+C_PKAbw{c_-tqwEsP=vVs*Qy8()bTyzbRSQ97pHpP_f*J?hJmfe{NAE&SZ< zz3h|(otk(W^aVN=Q+{=ZhWejl%qEvij^}eV(Y9%`?W6D50lL!0SEY6i{m>3kk3E3yw+GTg z_8@xP9!$^K5&Dxol>TlP(5H5kKDT2++GB;!K2`+miDHC3S&X%(h;jCGG1ERll-e^y znLSG+?b#w_&k+~d#o`M4B=J4FL~OT9#f|oSvDYpWx7g)kzkRZ}&#n-U+DpW*?Mm^K zy-Yk~*NQ*bb>bC!rFg?$E#9@0;_r5Y_`*&}({7MKdz~C$H_C|JBuCh1$f(^WkFnRw ziFSvaX?MypyGxean`NcFMHvOeXkzVZYCGD3+r5!{M;s zCE1D;w!@>tqg|TMDTsXVepFq4CWW~q^0~yYD$Go$ zgG=Zp1XT5-aeBi4!a9M+c4@7Ve_3^{ng8ADS}XtZ>RLPhit1Wl{*~3W{`{+|Yr}T_ z_YnH>uSV$4zXo9d+3u$E_`+2PoU76_NIPCgL$%I?g>A;iS}jyetyD$pDUJWOVhgp? m_o#z@gvX7KP#3*So3N|?1&GdZgcd?`24+)CO|j z{VngV-@WhV?N48v08oPuJgCF42j}5>4{pHMb?lSHjY7U5{c+?tNZQtM-xq`YizI6gDqMNIpOd>%Mj;_=I?I|nY*!X|g;moGjwyjhs zoNB&l)%IjhUo1P2p)6{Q(O=5$j%BG(&t_uDlx)ni>`kU?8h2(B%QKnS&h~+9|3J1Q zn@PmB(Q;4D4Ti3){PQAHA-W6V=~OxsO*bbb&h$FTC?zG%9m#9Bc4T_GC{586MI#g= zsk(B(qcM^8oK^{*`KrSF&r_~Y6sOtQ#46L@rrv?RE9pH$W18jYilwR68MpRJbG|n- zDyO(T!xAJXwiq=?D|b@d_Vhp|E?#sewlj-bCbmPN*t#FJ0&BnGC^z*IWcJ2vD}EL} z7~*7K&oZW2VwRUA28u0{O!(NxRL~_y8Y_Wmw$wDOYqBw|=%C_(d!V1WP4K{Um_h|< z+4P3i2!*=@Ork|kc4P?(MnUgt9N4l&FraU>k}Z|7A(wZ(Yh8lqAs~&0c*?FiPlxII z3W7($YnM^A6pI&MM7CWH!qKR zaSg5&zNM{M$6H?f0B?ISh@D=XkELD=pq>%4!{o&e@gs%BD_Bh|wE4-t`Q3>vDdr)< zE>*sILn_%-ysmTGBJFJzV#YgO{1{DM`~)k#_^EI|6Yl4D*Na~W z`K2s>CFIwlr0l>-3FMA>RV5-DDRLhb+d=uVY7fMEbjPM<$si z)SQA}uJg0$T%RH^dlK18t-i|70rBqU#wxqHy2!6vNyz7yZ;V(!A|YT`AR#lY;^oXR zwMF{qm)m4T*EF}Snq)o2dt;g9yeD?D;_|1Y-P)uz{?90OQKR=I2D6)z#D0OzanYS% zdoj#)dVqopC)wOtHl2;7%-7Uv8fY!eyKd$nnc8IXhQ*6?-8PCn+~%0y>F(^@o=t3{ zu$VOdc)FkMEi~0?E6vLyQ`*wxmYE-e-6VeHnpi&;a1^NHbU|fODC7!|Cq02X%eboL zQ}O8x9fNv?Odc9YJ$wRuXa3L<@%8iS$+!ina7Y7y~SQ@Mf2OI(C81m{} z0hbnVO^iW1TJKUv&6i6si{dm>d@(uT656t!yO$z>%S<)vI2;vFc_Y=jxSNM&w2-5C ztiVb>gbhA zdi`X~UG>Ho^m_Mk7@drKK%dwgF!<}9*nAA`dQZR;aE(G9y7e%uhueINBL67OuyP+_ z0)U-Z%$9pTu4M{#G0?ja!yfeFt8B_&!`0Y}>o8v*o-pz8mhoQKSLAf8BaEM>#2bh?QYt)KMtgq@z>z)K6IMZQix$};7J~Jq_B|z)u^clUm@q9zAju& z&PlD8;|g*v%9iTe#NaZd*v#--cy8vKOX1dW12H|Ct0oiQyt3!?M+c+;ZV*yT%Q$aX zRe+}`Q7X1k!0Rg@Ue_GQ%+9J~IHN6GItqU{D8xs|mV|wTaYP+%&@!|-x8F@@tq%|>!@AO?M?P zOgoEHS`~-1rJT`P@Hz|Z4QBNf`tTBw^;WK!7qPkb5;Y#2LG&caNm&i%Vl$X4@WEVx z59SJdFjwG%c7bc0&bCsDi~lmXlAKPPdWb_QaOuw}#_kMwruS!aCFom({Lea(qn^_r zZ9A>JlkLMJv#yQ81$@enyEv$gGo~h(l=-=GnMLr&#>Q_ zx0hlB=K^vo(e-Q`;AmQacTvK@bPh+-1)L&7oD=K#Y`_QXn7?Ph|G@P8k$v<}Ed38z zcz-sNy^4t_V`)gUaEb@GiV2dRUNbqIgm~YAe+l7Y!G8g7Z#Ub&{IR`MsD4*o%d zKfx0Gld3=FK=Us%B=h->AM^NuTS<3j;vDQCC(~1%878X-%6HoXCBFHgDU%6JGGUA1 z=90;+i>nbx(WXMU`DYNVr(gKbxY{(-#$)~k;!o(Mw z^~fJyHqzgxKEcTgT0>}J+#tpmb{@l7ZDAkBh_Z&@K@=QEacA+_$FS(-aA*YQgtZZr zhpR?VAzUc@JSsyI*WY#!Rb;EG$likm;jm-F2*M+%mcCv?IVavT`~gVt;|^7WL+V^Ss%kOHIZuY@C06jv1jw*;jDwY6OXv6KIwmC#Gw>J(tvyW3 zqwsOml5ew=Ru=63PFbHUM}q_2WI4{Iee&Z} TEJZ1)sU7hzTmeSTm?r;ojw;_ zA#uS2@JJjAGj2jw2w!CL{X6q}cV^^or(eDTKoy>5;h_R4c$9(18F<1Vb21no2cwWd z(Kzx?{OZsT535cz4#LA{43=u6@Hq0rsN)YO0|qOeFfCEDnk}0;;mUT&-}o?4JfZ1^%WYm~uP~|= z#USMg>veoLd<$2bf}41xMJxkeQq=XDi#7BFw{6pkk2(vpZOf+HoW{v@)m16zO#2l( zG&#D>q@S^L(AMVCkN655Zd0A-@^=QSrSkupm8y;2VUG$%5Dv`Ahu&c9`n@443(tcv zh+Z&AmdYLK^r-I-JN`JJ?P*LZdLJC)U5r=WFz8|H6=yUV_Xk=)4oa+6XhImIcPl%U zy*xaC3PQYtlQEwjt9LZ$N3aV?oHT%S*n~7J;DltTb+~Ro7IJ@CL0*(NkGv%DGIBxU z736agQ+!e4^T?|blmFU3ye={2UyzvcHzdA@v?=ix@+FDM|FXp7cSU0IyDBlA|C+?t zk#9(R6Zw|Jw~_Bid>6SSaT#lx!wPR>MekvSw{WE=S!5q^VQ?RRsr&$Mup!vBY2ZGt lq^7q&L*f(uNyMQFt^fi<-{KboAb%DFJJ?aO+lwRj{{ZFcy5;}? literal 0 HcmV?d00001 diff --git a/res/JpegEncoder$DCT.class b/res/JpegEncoder$DCT.class new file mode 100644 index 0000000000000000000000000000000000000000..656153ac5f4b4be5c710b4cdeead150c858facee GIT binary patch literal 7817 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 IiDy3WKez*5p#T5? literal 0 HcmV?d00001 diff --git a/res/JpegEncoder$JpegInfo.class b/res/JpegEncoder$JpegInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..8cddb3e8820cb8ba5e22bd80c433aadaaa61a498 GIT binary patch literal 4252 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 literal 0 HcmV?d00001 diff --git a/res/JpegEncoder.class b/res/JpegEncoder.class new file mode 100644 index 0000000000000000000000000000000000000000..48f579d1691880d5abc0d6a44e70954803ae7717 GIT binary patch literal 8852 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 B;i>=t literal 0 HcmV?d00001 diff --git a/res/META-INF/MANIFEST.MF b/res/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c70341f --- /dev/null +++ b/res/META-INF/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +MIDlet-1: bin, /icon.png, FW +MIDlet-Name: bin +MIDlet-Vendor: MIDletPascal3 +MIDlet-Version: 04082014.214104 +MicroEdition-Configuration: CLDC-1.0 +MicroEdition-Profile: MIDP-2.0 +MIDlet-Icon: /icon.png +Created-By: Build-Script V1.03 (DeaDSoftWare) diff --git a/res/StaticTree.class b/res/StaticTree.class new file mode 100644 index 0000000000000000000000000000000000000000..6baf9d98297cfd44d891e7cd136c89a1f9d1dfef GIT binary patch literal 5556 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 RN0-Zdx>~Daba@<&{Ra=haD4y( literal 0 HcmV?d00001 diff --git a/res/Tree.class b/res/Tree.class new file mode 100644 index 0000000000000000000000000000000000000000..b3fc3477a322d34d365edfdf371aba4c3cbf4273 GIT binary patch literal 10703 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 GYWP3jmhrm) literal 0 HcmV?d00001 diff --git a/res/ZStream.class b/res/ZStream.class new file mode 100644 index 0000000000000000000000000000000000000000..afb48d5b47f2e36660807febfe85c39bc09df87e GIT binary patch literal 4001 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 RAgKTV002ovPDHLkV1mb__*MV_ literal 0 HcmV?d00001 diff --git a/res/blocks.cfg b/res/blocks.cfg new file mode 100644 index 0000000..32a2eca --- /dev/null +++ b/res/blocks.cfg @@ -0,0 +1,250 @@ +;Файл инициализации описания свойств стандартного набора блоков CaveCraft +;Все описанные здесь блоки могут отображаться на карте. + +;Устанавливаем количество блоков +RESET_BLOCKS 124 + +;Описание команды установки блока: +;SET_BLOCK [id] [tex] [hp] [coll] [tool] [lvl] [flags] [tr] [li] +;id - индентификатор блока. +;tex - номер текстуры блока из terrain.png. +;hp - прочность блока. +;coll - тип коллизии: +; 0 - проходимый +; 1 - полностью твёрдый +;tool - тип инструмента необходимый для "правильной" поломки болка. +;lvl - минимальный уровень инструмента необходимый для "правильной" поломки блока: +; 0 - руки +; 1 - дерево +; 2 - камень +; 3 - железо +; 4 - золото +; 5 - алмазы +;flags - битовые флаги: +; b001 - объект (полу)прозрачный +; b010 - рисовать за/перед игроком +; b100 - можно устанавливать поверх этого блока +;tr - уровень светопоглощения +;li - уровень светоизлучения + +;Null +SET_BLOCK 0 0 0 0 0 0 b101 0 0 +;Земля +SET_BLOCK 1 1 9 1 2 0 b000 15 0 +;Трава +SET_BLOCK 2 2 9 1 2 0 b000 15 0 +;Камень +SET_BLOCK 3 3 60 1 1 1 b000 15 0 +;Доски +SET_BLOCK 4 4 30 1 3 0 b000 15 0 +;Булыжник +SET_BLOCK 5 5 60 1 1 1 b000 15 0 +;Админиум +SET_BLOCK 6 6 0x7FFFFFFF 1 0 0 b000 15 0 +;Песок +SET_BLOCK 7 7 9 1 2 0 b000 15 0 +;Гравий +SET_BLOCK 8 8 9 1 2 0 b000 15 0 +;Дерево +SET_BLOCK 9 9 30 1 3 0 b000 15 0 +;Обсидиан +SET_BLOCK 10 10 1000 1 1 5 b000 15 0 +;Книжный шкаф +SET_BLOCK 11 11 24 0 3 0 b000 0 0 +;Замшелый булыжник +SET_BLOCK 12 12 40 1 1 1 b000 15 0 +;Железный блок +SET_BLOCK 13 13 40 1 1 2 b000 15 0 +;Золотой блок +SET_BLOCK 14 14 60 1 1 3 b000 15 0 +;Алмазный блок +SET_BLOCK 15 15 60 1 1 3 b000 15 0 +;Золотая руда +SET_BLOCK 16 16 65 1 1 3 b000 15 0 +;Железная руда +SET_BLOCK 17 17 65 1 1 2 b000 15 0 +;Угольная руда +SET_BLOCK 18 18 65 1 1 1 b000 15 0 +;Алмазная руда +SET_BLOCK 19 19 65 1 1 3 b000 15 0 +;Красная руда +SET_BLOCK 20 20 65 1 1 3 b000 15 6 +;Листва +SET_BLOCK 21 21 3 1 4 1 b000 1 0 +;Красный цветок +SET_BLOCK 22 22 0 0 0 0 b101 0 0 +;Жёлтый цветок +SET_BLOCK 23 23 0 0 0 0 b101 0 0 +;Красный гриб +SET_BLOCK 24 24 0 0 0 0 b101 0 0 +;Коричневый гриб +SET_BLOCK 25 25 0 0 0 0 b101 0 0 +;Факел +SET_BLOCK 26 26 0 0 0 0 b001 0 14 +;Динамит +SET_BLOCK 27 27 0 1 0 0 b000 15 0 +;Сундук +SET_BLOCK 28 28 39 0 3 0 b000 0 0 +;Верстак +SET_BLOCK 29 29 39 0 3 0 b000 0 0 +;Кактус +SET_BLOCK 30 30 6 1 0 0 b001 0 0 +;Стекло +; -- -- - - - ? ---- - - +SET_BLOCK 31 31 6 1 0 1 b001 1 0 +;Шерсть +SET_BLOCK 32 32 12 0 0 0 b000 0 0 +SET_BLOCK 33 33 12 0 0 0 b000 0 0 +SET_BLOCK 34 34 12 0 0 0 b000 0 0 +SET_BLOCK 35 35 12 0 0 0 b000 0 0 +SET_BLOCK 36 36 12 0 0 0 b000 0 0 +SET_BLOCK 37 37 12 0 0 0 b000 0 0 +SET_BLOCK 38 38 12 0 0 0 b000 0 0 +SET_BLOCK 39 39 12 0 0 0 b000 0 0 +SET_BLOCK 40 40 12 0 0 0 b000 0 0 +SET_BLOCK 41 41 12 0 0 0 b000 0 0 +SET_BLOCK 42 42 12 0 0 0 b000 0 0 +SET_BLOCK 43 43 12 0 0 0 b000 0 0 +SET_BLOCK 44 44 12 0 0 0 b000 0 0 +SET_BLOCK 45 45 12 0 0 0 b000 0 0 +SET_BLOCK 46 46 12 0 0 0 b000 0 0 +SET_BLOCK 47 47 12 0 0 0 b000 0 0 +;Снег +SET_BLOCK 48 48 9 1 2 0 b000 15 0 +;Лестница +SET_BLOCK 49 49 6 0 0 0 b001 0 0 +;Вода +SET_BLOCK 50 50 0x7FFFFFFF 0 0 0 b111 1 0 +;Лава +SET_BLOCK 51 55 0x7FFFFFFF 0 0 0 b111 15 15 +;Саженец +SET_BLOCK 52 60 0 0 0 0 b101 0 0 +;Губка +SET_BLOCK 53 61 9 1 0 0 b000 15 0 +;Лазуритовая руда +SET_BLOCK 54 62 65 1 1 2 b000 15 0 +;Лазуритовый блок +SET_BLOCK 55 63 65 1 1 2 b000 15 0 +;Песчаник +SET_BLOCK 56 64 50 1 1 1 b000 15 0 +;Высокая трава +SET_BLOCK 57 65 0 0 4 1 b101 0 0 +;Сухой куст +SET_BLOCK 58 66 0 0 4 1 b101 0 0 +;Паутина +SET_BLOCK 59 67 60 0 4 1 b101 0 0 +;Кирпичный блок +SET_BLOCK 60 68 60 1 1 1 b000 15 0 +;Снежный блок +SET_BLOCK 61 69 3 1 2 0 b000 15 0 +;Лёд +SET_BLOCK 62 70 8 1 1 6 b001 2 0 +;Слой снега +SET_BLOCK 63 71 2 0 2 1 b111 1 0 +;Глиняный блок +SET_BLOCK 64 72 9 1 2 0 b000 15 0 +;Тростник +SET_BLOCK 65 73 0 0 0 0 b111 0 0 +;Тыква +SET_BLOCK 66 74 15 1 3 0 b000 15 0 +;Светильник джека +SET_BLOCK 67 75 15 1 3 0 b000 15 15 +;Каменный кирпич +SET_BLOCK 68 76 60 1 1 1 b000 15 0 +SET_BLOCK 69 77 60 1 1 1 b000 15 0 +SET_BLOCK 70 78 60 1 1 1 b000 15 0 +;Резной кирпич +SET_BLOCK 71 79 60 1 1 1 b000 15 0 +;Железная решётка +SET_BLOCK 72 80 60 0 1 1 b011 0 0 +;Арбуз +SET_BLOCK 73 81 15 1 0 0 b000 15 0 +;Мицелий +SET_BLOCK 74 82 8 1 2 0 b000 15 0 +;Дерево(проходимое) +SET_BLOCK 75 98 30 0 3 0 b000 0 0 +;Спаунер +SET_BLOCK 76 83 75 0 0 0 b001 0 0 +;Кровать +SET_BLOCK 77 84 3 0 0 0 b001 0 0 +SET_BLOCK 78 85 3 0 0 0 b001 0 0 +;Откр. дверь +SET_BLOCK 79 86 30 0 3 0 b001 0 0 +SET_BLOCK 80 102 30 0 3 0 b001 0 0 +;Закр. дверь +SET_BLOCK 81 88 30 1 3 0 b011 0 0 +SET_BLOCK 82 104 30 1 3 0 b011 0 0 +;Берёза +SET_BLOCK 83 90 30 1 3 0 b000 0 0 +;Берёза(проходимая) +SET_BLOCK 84 99 30 0 3 0 b000 0 0 +;Ель +SET_BLOCK 85 91 30 1 3 0 b000 0 0 +;Ель(проходимая) +SET_BLOCK 86 100 30 0 3 0 b000 0 0 +;Листва(ель) +SET_BLOCK 87 92 3 1 4 1 b000 1 0 +;Краснывй огромный гриб +SET_BLOCK 88 93 3 1 3 0 b000 15 0 +SET_BLOCK 89 95 3 0 3 0 b000 0 0 +;Коричневый огромный гриб +SET_BLOCK 90 94 3 1 3 0 b000 15 0 +SET_BLOCK 91 95 3 0 3 0 b000 0 0 +;Забор +SET_BLOCK 92 96 30 1 3 0 b001 0 0 +SET_BLOCK 93 101 30 0 3 0 b001 0 0 +;Доски(проходимые) +SET_BLOCK 94 97 30 0 3 0 b000 0 0 +;Картины +SET_BLOCK 95 106 0 0 0 0 b101 0 0 +SET_BLOCK 96 107 0 0 0 0 b101 0 0 +SET_BLOCK 97 108 0 0 0 0 b101 0 0 +SET_BLOCK 98 109 0 0 0 0 b101 0 0 +SET_BLOCK 99 110 0 0 0 0 b101 0 0 +SET_BLOCK 100 111 0 0 0 0 b101 0 0 +SET_BLOCK 101 112 0 0 0 0 b101 0 0 +;Подарочный сундук +SET_BLOCK 102 113 30 0 3 0 b000 0 15 +;Лианы +SET_BLOCK 103 114 3 0 4 1 b111 0 0 +;Табличка +SET_BLOCK 104 115 15 0 0 0 b001 0 0 +;Красный факел +SET_BLOCK 105 116 0 0 0 0 b101 0 7 +;Печь +SET_BLOCK 106 117 40 0 3 0 b000 0 0 +;Люк +SET_BLOCK 107 118 30 1 3 0 b011 0 0 +SET_BLOCK 108 119 30 0 3 0 b001 0 0 +;Адский камень +SET_BLOCK 109 120 30 1 1 1 b000 15 0 +;Портал в ад +SET_BLOCK 110 129 0x7FFFFFFF 0 0 0 b011 0 11 +;Светокамень +SET_BLOCK 111 121 10 1 1 0 b000 0 15 +;Листва(берёза) +SET_BLOCK 112 135 3 1 4 1 b000 1 0 +;Песок душ +SET_BLOCK 113 122 9 1 2 0 b000 15 0 +;Саженец(берёза) +SET_BLOCK 114 123 0 0 0 0 b101 0 0 +;Саженец(ель) +SET_BLOCK 115 124 0 0 0 0 b101 0 0 +;Лампа +SET_BLOCK 116 125 10 1 1 0 b000 0 0 +SET_BLOCK 117 126 10 1 1 0 b000 0 15 +;Обсидиан(проходимый) +SET_BLOCK 118 127 1000 0 1 5 b000 15 0 +;Стеклянная панель +SET_BLOCK 119 128 6 0 0 1 b001 1 0 +;Грядка +SET_BLOCK 120 136 9 1 2 0 b000 15 0 +;Торт +SET_BLOCK 121 137 9 0 0 0 b001 0 0 +;Пшеница +SET_BLOCK 122 138 1 0 0 0 b101 0 0 +;Стебель арбуза +SET_BLOCK 123 139 1 0 0 0 b101 0 0 +;Стебель тыквы +SET_BLOCK 124 139 1 0 0 0 b101 0 0 + diff --git a/res/crafts.cfg b/res/crafts.cfg new file mode 100644 index 0000000..b758f8f --- /dev/null +++ b/res/crafts.cfg @@ -0,0 +1,318 @@ +;Ôàéë èíèöèàëèçàöèè îïèñàíèÿ ðåöåïòîâ êðàôòà + +;Óñòàíàâëèâàåì êîëè÷åñòâî êðàôòîâ +RESET_CRAFTS 84 + +;Îïèñàíèå êîìàíä óñòàíîâêè ðåöåïòà êðàôòà: +;SET_CRAFT_IN [id] [cell] [item] [sum] +;id - èäåíòèôèêàòîð êðàôòà +;cell - ÿ÷åéêà èíãðåäèåíòà +;item - èäåíòèôèêàòîð ïðåäìåòà +;sum - íåîáõîäèìîå êîëè÷åñòâî ïðåäìåòîâ +; +;SET_CRAFT_OUT [id] [item] [sum] [flag] +;id - èäåíòèôèêàòîð êðàôòà +;item - èäåíòèôèêàòîð ïîëó÷èâøåãîñÿ ïðåäìåòà ïðåäìåòà +;sum - êîëè÷åñòâî ïîëó÷èâøåãîñÿ ïðåäìåòà ïðåäìåòà +;flag - óñëîâèå ñîçäàíèÿ êðàôòà: +; 0 - íà êîëåíêå :) +; 1 - íà âåðñòàêå + +;Äîñêè(èç äóáà) +SET_CRAFT_IN 0 0 9 1 +SET_CRAFT_OUT 0 4 4 0 +;Äîñêè(èç áåð¸çû) +SET_CRAFT_IN 1 0 83 1 +SET_CRAFT_OUT 1 4 4 0 +;Äîñêè(èç åëè) +SET_CRAFT_IN 2 0 85 1 +SET_CRAFT_OUT 2 4 4 0 +;Ñóíäóê +SET_CRAFT_IN 3 0 4 8 +SET_CRAFT_OUT 3 28 1 1 +;Âåðñòàê +SET_CRAFT_IN 4 0 4 4 +SET_CRAFT_OUT 4 29 1 0 +;Ïå÷ü +SET_CRAFT_IN 5 0 5 8 +SET_CRAFT_OUT 5 106 1 1 +;Äèíàìèò +SET_CRAFT_IN 6 0 7 4 +SET_CRAFT_IN 6 1 183 5 +SET_CRAFT_OUT 6 27 1 1 +;Ãëèíà +SET_CRAFT_IN 7 0 169 4 +SET_CRAFT_OUT 7 64 1 0 +;Ïåñ÷àíèê +SET_CRAFT_IN 8 0 7 4 +SET_CRAFT_OUT 8 56 1 0 +;Ñíåæíûé áëîê +SET_CRAFT_IN 9 0 168 4 +SET_CRAFT_OUT 9 61 1 0 +;Æåëåçíûé áëîê +SET_CRAFT_IN 10 0 164 9 +SET_CRAFT_OUT 10 13 1 1 +;Çîëîòîé áëîê +SET_CRAFT_IN 11 0 165 9 +SET_CRAFT_OUT 11 14 1 1 +;Àëìàçíûé áëîê +SET_CRAFT_IN 12 0 162 9 +SET_CRAFT_OUT 12 15 1 1 +;Ëàçóðèòíûé áëîê +SET_CRAFT_IN 13 0 166 9 +SET_CRAFT_OUT 13 55 1 1 +;Æåëåçíàÿ ðåø¸òêà +SET_CRAFT_IN 14 0 164 6 +SET_CRAFT_OUT 14 72 9 1 +;Êèðïè÷íàÿ êëàäêà +SET_CRAFT_IN 15 0 163 4 +SET_CRAFT_OUT 15 60 1 0 +;Êàìåííûé êèðïè÷ +SET_CRAFT_IN 16 0 3 4 +SET_CRAFT_OUT 16 68 4 0 +;Êíèæíûé øêàô +SET_CRAFT_IN 17 0 4 6 +SET_CRAFT_IN 17 1 170 3 +SET_CRAFT_OUT 17 11 1 1 +;Øåðñòü +SET_CRAFT_IN 18 0 167 4 +SET_CRAFT_OUT 18 32 1 0 +;Çàáîð +SET_CRAFT_IN 19 0 127 6 +SET_CRAFT_OUT 19 92 3 1 +;Ëåñòíèöà +SET_CRAFT_IN 20 0 127 7 +SET_CRAFT_OUT 20 49 3 1 +;Êàðòèíû +SET_CRAFT_IN 21 0 127 8 +SET_CRAFT_IN 21 1 32 1 +SET_CRAFT_OUT 21 187 1 1 +;Äâåðü +SET_CRAFT_IN 22 0 4 6 +SET_CRAFT_OUT 22 178 1 1 +;Êðîâàòü +SET_CRAFT_IN 23 0 32 3 +SET_CRAFT_IN 23 1 4 3 +SET_CRAFT_OUT 23 179 1 1 +;Òàáëè÷êè +SET_CRAFT_IN 24 0 4 6 +SET_CRAFT_IN 24 1 127 1 +SET_CRAFT_OUT 24 104 3 1 +;Äåðåâÿííàÿ êèðêà +SET_CRAFT_IN 25 0 4 3 +SET_CRAFT_IN 25 1 127 2 +SET_CRAFT_OUT 25 131 60 1 +;Êàìåííàÿ êèðêà +SET_CRAFT_IN 26 0 5 3 +SET_CRAFT_IN 26 1 127 2 +SET_CRAFT_OUT 26 132 132 1 +;Æåëåçíàÿ êèðêà +SET_CRAFT_IN 27 0 164 3 +SET_CRAFT_IN 27 1 127 2 +SET_CRAFT_OUT 27 133 251 1 +;Çîëîòàÿ êèðêà +SET_CRAFT_IN 28 0 165 3 +SET_CRAFT_IN 28 1 127 2 +SET_CRAFT_OUT 28 135 33 1 +;Àëìàçíàÿ êèðêà +SET_CRAFT_IN 29 0 162 3 +SET_CRAFT_IN 29 1 127 2 +SET_CRAFT_OUT 29 134 1562 1 +;Äåðåâÿííàÿ ëîïàòà +SET_CRAFT_IN 30 0 4 1 +SET_CRAFT_IN 30 1 127 2 +SET_CRAFT_OUT 30 136 60 1 +;Êàìåííàÿ ëîïàòà +SET_CRAFT_IN 31 0 5 1 +SET_CRAFT_IN 31 1 127 2 +SET_CRAFT_OUT 31 137 132 1 +;Æåëåçíàÿ ëîïàòà +SET_CRAFT_IN 32 0 164 1 +SET_CRAFT_IN 32 1 127 2 +SET_CRAFT_OUT 32 138 251 1 +;Çîëîòàÿ ëîïàòà +SET_CRAFT_IN 33 0 165 1 +SET_CRAFT_IN 33 1 127 2 +SET_CRAFT_OUT 33 140 33 1 +;Àëìàçíàÿ ëîïàòà +SET_CRAFT_IN 34 0 162 1 +SET_CRAFT_IN 34 1 127 2 +SET_CRAFT_OUT 34 139 1562 1 +;Äåðåâÿííûé òîïîð +SET_CRAFT_IN 35 0 4 3 +SET_CRAFT_IN 35 1 127 2 +SET_CRAFT_OUT 35 141 60 1 +;Êàìåííûé òîïîð +SET_CRAFT_IN 36 0 5 3 +SET_CRAFT_IN 36 1 127 2 +SET_CRAFT_OUT 36 142 132 1 +;Äåðåâÿííûé òîïîð +SET_CRAFT_IN 37 0 164 3 +SET_CRAFT_IN 37 1 127 2 +SET_CRAFT_OUT 37 143 251 1 +;Çîëîòîé òîïîð +SET_CRAFT_IN 38 0 165 3 +SET_CRAFT_IN 38 1 127 2 +SET_CRAFT_OUT 38 145 33 1 +;Àëìàçíûé òîïîð +SET_CRAFT_IN 39 0 162 3 +SET_CRAFT_IN 39 1 127 2 +SET_CRAFT_OUT 39 144 1562 1 +;Íîæíèöû +SET_CRAFT_IN 40 0 164 2 +SET_CRAFT_OUT 40 146 259 0 +;Äåðåâÿííûé ìå÷ +SET_CRAFT_IN 41 0 4 2 +SET_CRAFT_IN 41 1 127 1 +SET_CRAFT_OUT 41 147 60 1 +;Êàìåííûé ìå÷ +SET_CRAFT_IN 42 0 5 2 +SET_CRAFT_IN 42 1 127 1 +SET_CRAFT_OUT 42 148 132 1 +;Æåëåçíûé ìå÷ +SET_CRAFT_IN 43 0 164 2 +SET_CRAFT_IN 43 1 127 1 +SET_CRAFT_OUT 43 149 251 1 +;Çîëîòîé ìå÷ +SET_CRAFT_IN 44 0 165 2 +SET_CRAFT_IN 44 1 127 1 +SET_CRAFT_OUT 44 151 33 1 +;Àëìàçíûé ìå÷ +SET_CRAFT_IN 45 0 162 2 +SET_CRAFT_IN 45 1 127 1 +SET_CRAFT_OUT 45 150 1562 1 +;Óäî÷êà +SET_CRAFT_IN 46 0 127 3 +SET_CRAFT_IN 46 1 167 2 +SET_CRAFT_OUT 46 152 65 1 +;Âåäðî +SET_CRAFT_IN 47 0 164 3 +SET_CRAFT_OUT 47 171 1 1 +;Æåëåçíûé áëîê -> æåëåçíûå ñëèòêè +SET_CRAFT_IN 48 0 13 1 +SET_CRAFT_OUT 48 164 9 0 +;Çîëîòîé áëîê -> çîëîòûå ñëèòêè +SET_CRAFT_IN 49 0 14 1 +SET_CRAFT_OUT 49 165 9 0 +;Àëìàçíûé áëîê -> àëìàçû +SET_CRAFT_IN 50 0 15 1 +SET_CRAFT_OUT 50 162 9 0 +;Ëàçóðèòîâûé áëîê -> óëüòðàìàðèí +SET_CRAFT_IN 51 0 55 1 +SET_CRAFT_OUT 51 166 9 0 +;Çîëîòîé ñëèòîê -> çîëîòîé ñàìîðîäîê +SET_CRAFT_IN 52 0 165 1 +SET_CRAFT_OUT 52 194 9 0 +;Çîëîòîé ñàìîðîäîê -> çîëîòîé ñëèòîê +SET_CRAFT_IN 53 0 194 9 +SET_CRAFT_OUT 53 165 1 1 +;Áóìàãà +SET_CRAFT_IN 54 0 65 3 +SET_CRAFT_OUT 54 175 3 1 +;Êíèãà +SET_CRAFT_IN 55 0 175 3 +SET_CRAFT_IN 55 1 198 1 +SET_CRAFT_OUT 55 170 1 0 +;Êàðòà +SET_CRAFT_IN 56 0 175 8 +SET_CRAFT_IN 56 1 216 1 +SET_CRAFT_OUT 56 186 1 1 +;Ïàëêè +SET_CRAFT_IN 57 0 4 2 +SET_CRAFT_OUT 57 127 4 0 +;Ôàêåë +SET_CRAFT_IN 58 0 160 1 +SET_CRAFT_IN 58 1 127 1 +SET_CRAFT_OUT 58 26 4 0 +;Êðàñíûé ôàêåë +SET_CRAFT_IN 59 0 161 1 +SET_CRAFT_IN 59 1 127 1 +SET_CRAFT_OUT 59 105 1 0 +;×àøêà +SET_CRAFT_IN 60 0 4 3 +SET_CRAFT_OUT 60 184 4 1 +;Òóøåíûå ãðèáû +SET_CRAFT_IN 61 0 184 1 +SET_CRAFT_IN 61 1 24 1 +SET_CRAFT_IN 61 2 25 1 +SET_CRAFT_OUT 61 185 1 0 +;Ƹëòûé êðàñèòåëü +SET_CRAFT_IN 62 0 23 1 +SET_CRAFT_OUT 62 128 2 0 +;Êðàñíûé êðàñèòåëü +SET_CRAFT_IN 63 0 22 1 +SET_CRAFT_OUT 63 129 2 0 +;Çîëîòîå ÿáëîêî +SET_CRAFT_IN 64 0 201 1 +SET_CRAFT_IN 64 1 194 8 +SET_CRAFT_OUT 64 202 1 1 +;Ëþê +SET_CRAFT_IN 65 0 4 6 +SET_CRAFT_OUT 65 108 2 1 +;Îãíèâî +SET_CRAFT_IN 66 0 164 1 +SET_CRAFT_IN 66 1 207 1 +SET_CRAFT_OUT 66 153 65 0 +;Ñâåòîêàìåíü +SET_CRAFT_IN 67 0 214 4 +SET_CRAFT_OUT 67 111 1 0 +;Ëàìïà +SET_CRAFT_IN 68 0 161 4 +SET_CRAFT_IN 68 1 111 1 +SET_CRAFT_OUT 68 116 1 1 +;Êîìïàñ +SET_CRAFT_IN 69 0 161 1 +SET_CRAFT_IN 69 1 164 4 +SET_CRAFT_OUT 69 216 1 1 +;Ñòåêëÿííàÿ ïàíåëü +SET_CRAFT_IN 70 0 31 6 +SET_CRAFT_OUT 70 119 16 1 +;×àñû +SET_CRAFT_IN 71 0 161 1 +SET_CRAFT_IN 71 1 165 4 +SET_CRAFT_OUT 71 215 1 1 +;Ñàõàð +SET_CRAFT_IN 72 0 65 1 +SET_CRAFT_OUT 72 195 1 0 +;Õëåá +SET_CRAFT_IN 73 0 218 3 +SET_CRAFT_OUT 73 219 1 1 +;Òîðò +SET_CRAFT_IN 74 0 174 1 +SET_CRAFT_IN 74 1 177 1 +SET_CRAFT_IN 74 2 195 2 +SET_CRAFT_IN 74 3 218 3 +SET_CRAFT_OUT 74 121 1 1 +;Äåðåâÿííàÿ ìîòûãà +SET_CRAFT_IN 75 0 4 2 +SET_CRAFT_IN 75 1 127 2 +SET_CRAFT_OUT 75 154 60 1 +;Êàìåííàÿ ìîòûãà +SET_CRAFT_IN 76 0 5 2 +SET_CRAFT_IN 76 1 127 2 +SET_CRAFT_OUT 76 155 132 1 +;Æåëåçíàÿ ìîòûãà +SET_CRAFT_IN 77 0 164 2 +SET_CRAFT_IN 77 1 127 2 +SET_CRAFT_OUT 77 156 251 1 +;Çîëîòàÿ ìîòûãà +SET_CRAFT_IN 78 0 165 2 +SET_CRAFT_IN 78 1 127 2 +SET_CRAFT_OUT 78 158 33 1 +;Àëìàçíàÿ ìîòûãà +SET_CRAFT_IN 79 0 162 2 +SET_CRAFT_IN 79 1 127 2 +SET_CRAFT_OUT 79 157 1562 1 +;Ñåìåíà òûêâû +SET_CRAFT_IN 80 0 66 1 +SET_CRAFT_OUT 80 222 4 0 +;Ñåìåíà àðáóçà +SET_CRAFT_IN 81 0 176 1 +SET_CRAFT_OUT 81 221 1 0 +;Àðáóç +SET_CRAFT_IN 82 0 176 9 +SET_CRAFT_OUT 82 73 1 1 +;Ñâåòèëüíèê Äæåêà +SET_CRAFT_IN 83 0 66 1 +SET_CRAFT_IN 83 1 26 1 +SET_CRAFT_OUT 83 67 1 0 diff --git a/res/default_font.png b/res/default_font.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a98b01cdbc97b31fa39c46f23a5670ee841368 GIT binary patch literal 1523 zcmVdn6F=g{QfJ^_piU=jKAL3=SWZVeb<5J zWMi&vOjmXNK0o7-ty|}*73a;LuMWOLa#(zAb8 z=T&TY{iDsU2?@Bd)IXQ~i=kmkWcGolix&DpT zvv*`0^N0I>V!u26r|^&b*R}tOcZQ#Fqr}8)y}Hlzx~cV(b})`A`dmES`~4H;Cvbr3 z6SpQ}a~wYHgcd2TiW(@LBJk870IYF$8i(Chr7=fy*!;Bt%f4k;8TO3F3U=jL;aBl< zr;w@qLC|d^*Rze9VCI)y)aG89Q~d)#Ezmprca!kb3Z*FwP6MHETWxqUA9j6nbwl7_ ztIRuX|NiX>4OWL=cU-w6jxSjJatc7TE_jl^y6682Jl*`|;B{syLhbHQXiIMwkChk8-a#a}U? zixc5QW7)V;sIUu)e1rJv@Xs(Z`!ep>vtomSuQT2~zpBoP4(9JG0?)b!DqiP?a|End7zZ3DIa()>%ihc)wg`aL-MfrK+UA157 zODgv%MlVQ_SyLmlB~heqXx=~MWO zd^E)=(^0_~1qp?7_KdJ8_PY2To=}ifbgKNRzGUYM>FxwD<=ilRO3+n!?Aph$bqdIn z!f>s;RSK03hu!m`Cg^H|(XmyPi9Ndw3d)bu1((Br*B_GwV#NIykKKpeyH$NhF#=(DN_?o^e}>;u zoHZiR|yf;F>yKTwFDY!1WcaHsO`_(kzk#J{>#arACu|$$~fM~-1Q1aofy!q58QS8drNUtoa{1{%vW8^N$!DE@Mni0N-FOB48xkV zGTS1%cOB~iU-w0aUg1p*BoQ8D3$okgFWWz}sWbkLGEsOaXRTWRzJ9ys`FjuL`&0Ox zC_qu{jP4e@drFLQ@J_`3iQIB$1JGUL^t)x!_M$J>raSM+aZij{Ep^y8!$AtdLAn4-Lo}?w|oB`JkfmQ zJCy^r$Ep0L*uT$lY6z9T>fLAf!sHhu@`)Q%M${~Nd6KLFlct~ft; Z${$Nni20YYE*1a)002ovPDHLkV1gc*EgAp- literal 0 HcmV?d00001 diff --git a/res/dl b/res/dl new file mode 100644 index 0000000000000000000000000000000000000000..3c5828a2e2eef944d983e925b72f7c965feb070b GIT binary patch literal 11821 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 ZxEx#0LSpdw_YM4&lAM}sy|iiQe*yG2<@Nvo literal 0 HcmV?d00001 diff --git a/res/furnace.cfg b/res/furnace.cfg new file mode 100644 index 0000000..cc0065d --- /dev/null +++ b/res/furnace.cfg @@ -0,0 +1,90 @@ +;Ôàéë èíèöèàëèçàöèè îïèñàíèÿ òîïëèâà è ðåöåïòîâ äëÿ ïå÷è + +;Óñòàíàâëèâàåì êîëè÷åñòâî òîïëèâà è ðåöåïòîâ +RESET_FUELS 24 +RESET_RECIPES 15 + +;Îïèñàíèå êîìàíäû óñòàíîâêè òîïëèâà: +;SET_FUEL [id] [item] [time] +;id - èäåíòèôèêàòîð òîïëèâà. +;item - èäåíòèôèêàòîð ïðåäìåòà, êîòîðûé ìîæåò áûòü èñïîëüçîâàí êàê òîïëèâî. +;time - âðåìÿ ãîðåíèÿ òîïëèâà â ìñ(1/1000 ñåêóíäû). + +;Îïèñàíèå êîìàíäû óñòàíîâêè ðåöåïòà: +;SET_RECIPE [id] [in] [out] +;id - èäåíòèôèêàòîð ðåöåïòà. +;in - èäåíòèôèêàòîð ïðåäìåòà èç êîòîðîãî ïðèñõîäèò ïðèãîòîâëåíèå. +;out - èäåíòèôèêàòîð ðåçóëüòèðóþùåãî ïðåäìåòà. + +;======[Òîïëèâî]====== +;Âåäðî ëàâû +SET_FUEL 0 173 1000000 +;Óãîëü +SET_FUEL 1 160 80000 +;Äîñêè +SET_FUEL 2 4 15000 +SET_FUEL 3 94 15000 +;Ñàæåíåö +SET_FUEL 4 52 5000 +SET_FUEL 5 114 5000 +SET_FUEL 6 115 5000 +;Ïàëêà +SET_FUEL 7 127 5000 +;Çàáîð +SET_FUEL 8 92 15000 +SET_FUEL 9 93 15000 +;Ëþê +SET_FUEL 10 107 15000 +SET_FUEL 11 108 15000 +;Äåðåâî +SET_FUEL 12 9 15000 +SET_FUEL 13 75 15000 +SET_FUEL 14 83 15000 +SET_FUEL 15 84 15000 +SET_FUEL 16 85 15000 +SET_FUEL 17 86 15000 +;Âåðñòàê +SET_FUEL 18 29 15000 +;Êíèæíûé øêàô +SET_FUEL 19 11 15000 +;Ñóíäóê +SET_FUEL 20 28 15000 +;Îãðîìíûå ãðèáû +SET_FUEL 21 88 15000 +SET_FUEL 22 89 15000 +SET_FUEL 23 90 15000 +SET_FUEL 24 91 15000 + +;======[Ðåöåïòû]====== +;Ïåñîê -> ñòåêëî +SET_RECIPE 0 7 31 +;Æåëåçíàÿ ðóäà -> æåëåçíûé ñëèòîê +SET_RECIPE 1 17 164 +;Çîëîòàÿ ðóäà -> çîëîòîé ñëèòîê +SET_RECIPE 2 16 165 +;Êîìîê ãëèíû -> êèðïè÷ +SET_RECIPE 3 169 163 +;Ñûðàÿ ñâèíèíà -> æàðåíàÿ ñâèíèíà +SET_RECIPE 4 188 189 +;Áóëûæíèê -> êàìåíü +SET_RECIPE 5 5 3 +;Ñûðàÿ êóðèöà -> æàðåíàÿ êóðèöà +SET_RECIPE 6 203 204 +;Ñûðàÿ ãîâÿäèíà -> æàðåíàÿ ãîâÿäèíà +SET_RECIPE 7 199 200 +;Ñûðàÿ ðûáà -> æàðåíàÿ ðûáà +SET_RECIPE 8 210 211 +;Äåðåâî -> óãîëü +SET_RECIPE 9 9 160 +;Áåð¸çà -> óãîëü +SET_RECIPE 10 83 160 +;Åëü -> óãîëü +SET_RECIPE 11 85 160 +;Óãîëüíàÿ ðóäà -> óãîëü +SET_RECIPE 12 18 160 +;Êðàñíàÿ ðóäà -> êðàñíàÿ ïûëü +SET_RECIPE 13 20 161 +;Ëàçóðèòîâàÿ ðóäà -> óëüòðàìàðèí +SET_RECIPE 14 54 166 +;Àëìàçíàÿ ðóäà -> àëìàç +SET_RECIPE 15 19 162 diff --git a/res/gui/clock.png b/res/gui/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..5e79bc5b36b3367e7cd2bffa484f1fe38f8a02e7 GIT binary patch literal 749 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A00079NklJ6x^PIE=m#6r%p$m zh8ihnpa@NFLB~NTI6+R315icENsMNrSq(4GzeEBo8R=;k<9VNXV|(#1M1I!m`=Az^ z*YQ3B&GN^@kH`0*#_^mGI{v(Hn&eLte|-K3u=#8@8Vkal)T-w^;`wY1&$_S8pZII} z`*l2e;Qrap3bNCm_a-?INWOw0__(*8r|w zD*)z_!-HU5z1B}H-rGe=`BM>4NJ#7xK6ChqmDOE6n%lI7vyt2X|v`QOT)9!W_7pfHL6Pkyq|Kvl~;T^vI!{MSyt$a`3U$7QqQQGfOa{h1OiZzC?e^)8;u>?gX^(aLqx z&i2AHoAykf87ubhbQ&KY<5H1skMgWg}k)(m%56dX*L zjecET?#a^B$8f5>`APFFi@M{1|7=>Uui2mf$vS=RHT{^SNg#hQc)I$ztaD0e0sz0L Ba*hB1 literal 0 HcmV?d00001 diff --git a/res/gui/container.png b/res/gui/container.png new file mode 100644 index 0000000000000000000000000000000000000000..141d68d5c1d26312a2ad1beaec7fe231fbca78da GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^8-REU2OE$y?pj>Oz`!iv>EaktaqI2fiXIrM8Fj-oBTAwDpRey?yxWuT?b`e}q5$aNn%@zQX2S{d~XW$HNmoMkO+B`@)j* za<9yXyzR69p5J!+?W-EQVvEUh&!&C;aHpQthN*bl{rBPd`S~*EQl9VhW-JcsYp~38 zKQL#Da)RG2K?C)-95W`Dv7GU=W_q?nma+H}F6qh4`(pIU6W;N)Gq)R8PG&ZXegw3b z^Ts9N4NISg7^y$Cm)DdIk?Ri>Z$IMyqd2NhSaQym$8y9u4vVpc zO3jnY=A3x2L{{C%BJ;Q{@jgW}%vk%u>#tU?nU3kc75+D8nz3cVW>vof)8;kk+A>C0 z`Kba!H25UYskNkqCz374zaJ^Q)c3ygF~x3u?82u0)?(s8Piw!Ff=hkXWIHK6?7;Qc zrPo+{qHn4HvD8g3I*{f)2jXLiYWsFSCuR rGn4nkOSdh5o^M~9n5O^k-aGwL!w{nz>mH^9vj~HytDnm{r-UW|g@SiG literal 0 HcmV?d00001 diff --git a/res/gui/creative.png b/res/gui/creative.png new file mode 100644 index 0000000000000000000000000000000000000000..2efabed4573339fab0a564d72a6612f2cb7dc187 GIT binary patch literal 820 zcmeAS@N?(olHy`uVBq!ia0vp^8-Tc)gAGVtnZc#Wz`*p|)5S5Q;?~={xmi+y46TXj z;froxXyw?&#VWq&_6KHj)300`uTC?X>p8djfu;SW30wTv?up4cl{@R?`K`j6draTI z-}1fp?}9T{Ycu6;+THKCzNlETU1+iQx^=>4DfNWzc@PKeoOb)oaflzJ@G-PN%(O{A=C9QEd`ro7>gIll7Z)5 zWG+)~Hcna0{>F_hz2mVPoBFMlk66~dZb(_)Nhf4S1N(Rp!R$0{o%5ddKU0(&mOe+PgmUp548^zX#4(y}OwAxrXsh z;?vj7v(GMj`Rnu9f8XU8%m1E^uI#O`-^H49^^Ih~&+tk6*ZwhgWZHJ?8Oyd8mW{eq ye!%DzzOm>zPHx=hyLq>7zrFTToa08;E&e)7PS#kzkEX!fz~JfX=d#Wzp$Pzf4QUks literal 0 HcmV?d00001 diff --git a/res/gui/fastcraft.png b/res/gui/fastcraft.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d89252e47fd67e642ab1cb809a0d11b8003dd8 GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0vp^8-REM2OE%FA^k9efq})))5S5Q;?~%DyW^3BJOA8S~vtE&g!S7Cp-fLZV1mL0ox&61Us z?cFrFuKJtT0a2!R^Bc5T?$|SibL^;RS|?EOpCv}|!9UI&P6z%97qm9~R)4_7_}%}2 zs4ctAHRIlw=LNWSEc)J1{b%1d-vgq-tbe|I`SS9l#sgEva39Hn!0w0x*-YzZSUq^O zxPx_%+Ji1RCcQFO9gy@Fp@NOF8yl_z-6!PulX2^=ojWB{(~GO$brrApF34T+Hi7xw z*RGyv4c%w^fU2w>$h~*6Xgsd^fa`lB&=p;AOy4w)9A}BS=zKtqeVuT@(JPGAYVV4f z)_sWT0J`_k>Wjb7+-jc=v{l9c=pfwQVtRM~AlseSqLMwY6PTag1nY~|OxuL_lE*Nv zJg|3f?8>=o=AL9Ob8VYDZEkFM$`0;C^|a;P!aJ5rAMv}^*YMWmJ;x2dFXS=KJz?Cf zbl9&OYQAiE%8kx@FCVeId&#zO@>cR(4c7&9{<;$zE+?&-w@=pKiw88FuJPS-RP901 z))>A2zuaHk{oT-g_2$i+SMCe*1U>qjYj^+GpR8B;JZx3D<^RgqD;hric<^m@=$0rQ zvCrQ`|Ant-B^MJ-&Zrr%gfjQI?>jU`Ejv&0q2et zZ@FiP+1D}U*NALv$lN$xxFY%bbwLB&Z)HsRIqo_MQ8m9=?ukARc)x!hP|I849jXtK zgn=pzPjc2278+XH+t>e%II!i%H_n>+`u{I~+`W6(etxxlzG6buo3DW#Z!5SNFDK>q zJH6@JE&w#Oh^bx#BzI>0`t{-Z`uffP4~H|aI~vU~LoB{8eP;|`-OtpYuIt4>YW`## ga0ZGqsom1Q;uHOU;T>FVdQ&MBb@0DmnMwg3PC literal 0 HcmV?d00001 diff --git a/res/gui/float.png b/res/gui/float.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5008b5eab8d44cb1c80743adc02a1a37cccf00 GIT binary patch literal 165 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 literal 0 HcmV?d00001 diff --git a/res/gui/inventory.png b/res/gui/inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..f158be5dc0e6b857d5a80c3647e7e007b5a0a87e GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^8-O^9gAGVZWZc=sz`!Ko>EaktaqI1E-*t+K3~hm1 zwG*Y^IjKxj+$gZ^VS4zlX-~?`Z7*gWm^`PvVS~#Bb@>XGSI;e%$=}`@P!0 zH2++Qyqo{_39esSW;Z{*`)E>)#UJ4hKNj6o&)o#A_GPRcBlR0<#T+z-w)$jH*$u(-;&N18kv*z5xJ#TEvG!y(z2^y%s<(M(K zjOC1{HPf>tvW&%-`Wh@V-4D#!qMYD&3y1Xcrw#qbAM?)G^|tKv!##VZGn@TB!g=G8 z@P?)83Et;drudyI)S5ZD><=GFrXpKvF%_tFvR&iycf$W4p3k)OODVY2_a48ikoBYc zNmz2umd7q^>TfM39`v-{$4rzru^Bj-XgTe~DWM4f1R)a$ literal 0 HcmV?d00001 diff --git a/res/gui/items.png b/res/gui/items.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f58ac96c208a0f27b95722c23ac030dd9acbe1 GIT binary patch literal 19493 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 literal 0 HcmV?d00001 diff --git a/res/gui/sign.png b/res/gui/sign.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd736f705de84bc59eaadef3472f1d389e106b3 GIT binary patch literal 629 zcmV-*0*d{KP)iXVX--x_8!-| z*PE}T{wf3`IBP%!1S7b0Tm&ZysDR)$PyxXmX3+{(SxWg9x!#_LeK^lT=?}po2o?i+K`?^< zL2zLKy&$+nuyyFpLfQB9?r~aUDEG$Br;w{Z1a}xi0l@*mYCZ&u`4kWw5Ul1i1zSs% z7S?R>>E)wwt)x@^vA?~ckgGog2LxvgsDNMuxBf0R2p#|gw=7l0{+@()InNq5#p{{g z2O-5?vW3zgf&+rH21GD|We}V(Ac94~kGB^M!PXy9W_-%Y{9OCD%9{u!^@rdV5S%C= zf)U&a1Q!+%!J^fP|JF;cZ*+LaMX(5h2Pg)?2u=oq2Pg)?{&9Z+Xd~IqEaktaqI2e-rQybfmX?- z$|)^<69lci+|F_MhN?1U1^uqsC;unX$!m#6`}=0&vU`WQb=`g!S#|ukY5e`SZlldN z&KWlU-gDl`+s@zpSc6gcI6KgE7&!3z@yFZezZyz6)c#l9DZu=L^V5&JrL`UkDXamn z_N$2RW%#yvR~knY!;r zT42n$`-!=;gbCXm`2(|`e7}~k*6_g|2CYf)yo#lqR$R9}xm;pgP`38(90o4a52aVP z+D!a1rD4|NEy)KCNX^Jpx^}hv>r#%BC3BW?h&_(rWd%CZp+<;-;nCy<3x)}5R$jt_ z&wq6lXPW$BoTBiD@dtASPpTZuFF<+%Yr~=Wm(Jb_cxr#t^`kSxgcVb!Zdo|%S507z zYjao3{QFv7QY(2)SropxWn??ApT=o1$vJA;f+h>^!}Bk!JwIQvq0QdWb$&kAfl8ho z8oz}@{2n}-)9~dqlp$zQOIVyaVSU5bJorGe#s8Zu)O$vmOx2{Lhe` zyUe`7@gK|g@6Xe#3$uIvGV3gD{C~GrH~bMt<({9XcUNCYio7ptYuXUS(e|b1hi7Yj+24m zqbI{ZhDXYMN97$BKjc3ke?XzfzM&GyK@1E`r<~aSYTo;L$u7A5fboT(ivE8Yl|LM6 z_f`CFa83W;Vpdt<$$PCxiSg@CU-5*6_h-LXX3VkL#dl{BAGZd7{#W%kqL*gBZ~E8$ z^k%(X^vT2DO)YlXE4JI*5pJmFWO86&5M*m53Tw#@FxwaT>+gY)%$K(3yLU#N`7~*= PDM;4S)z4*}Q$iB}hooT% literal 0 HcmV?d00001 diff --git a/res/inputStream.class b/res/inputStream.class new file mode 100644 index 0000000000000000000000000000000000000000..b130bc4862443f1eea4b1e7c728318175bed398a GIT binary patch literal 510 zcmZWl%TB^T6g|_H7D{;titmLxz-T`JH8CV6B#kCw*bg}3kkXR2_+7fe#DyQ=M;ULY zHDH{@eVjSx%)RsV{qYGMXE?S|Kr;>7Hg?dmuxnwD!Mu=xOs*L8c4x$3^utHNQ1fIU zZkO}1h#vUZC#2zp6Yh_AB-1_zjpSLz3>9K8mdP-Q1fTcFb1ITSFl6Yoy%~SuuFr$1 zOV=`(_Bt6PLwE2;WIW02oqq}jdl)XGiMUaW`o?4DDcOMu%fUVlEF3yGLY1MsL1L({ zJ@3XdF-aJTG-KcAF^%7B=QF7>6-Z0e)|y`)N$y3gM!Al&ZE*sF{xm%rXmeN;i`2Q4 z8RbIv9qdhAmnfPF)L~QYWCWC{0@W2%DW>8}GSeuRx+`d>E9kG(XjmJV%Al2zas#5H MhB{d=Y$<-@2Sl@J3jhEB literal 0 HcmV?d00001 diff --git a/res/items.cfg b/res/items.cfg new file mode 100644 index 0000000..fa3ab7d --- /dev/null +++ b/res/items.cfg @@ -0,0 +1,607 @@ +;Ôàéë èíèöèàëèçàöèè ñòàíäàðòíîãî íàáîðà ïðåäìåòîâ CaveCraft +;Âñå ïåðå÷èñëåííûå çäåñü ïðåäìåòû ìîãóò îòáðàæàòüñÿ â èíâåíòàðå èãðîêà. + +;Óñòàíàâëèâàåì êîëè÷åñòâî ïðåäìåòîâ +RESET_ITEMS 222 + +;Îïèñàíèå êîìàíäû óñòàíîâêè ïðåäìåòà: +;SET_ITEM [id] [type] [tex] [max] [prt] [flags] +;id - èíäåíòèôèêàòîð ïðåäìåòà. +;type - òèï ïðåäìåòà: +; 0 - áëîê +; 1 - èíñòðóìåíò +; 2 - çàðåçåðâèðîâàíî +; 3 - îáû÷íûé ïðåäìåò +;tex - íîìåð òåêñòóðû, çàâèñèò îò òèïà ïðåäìåòà. +;max - ìàêñèìàëüíîå êîëè÷åñòâî ïðåäìåòîâ â ñòàêå. +;prt - óêàçàòåëü íà ñòðóêòóðó äîïîëíèòåëüíûõ äàííûõ âûáðàíîãî òèïà ïðåäìåòà. +;flags - áèòîâîå ïîëå: +; b0001 - ðèñîâàòü öèôðîâîé èíäèêàòîð +; b0010 - ðèñîâàòü ãðàôè÷åñêèé èíäèêàòîð +; b0100 - ïðåäìåò äåëèìûé +; b1000 - ðèñîâàòü òåêñòóðó èç terrain.png(0)/items.png(1) + + +;======[Áëîêè]====== +;Null +SET_ITEM 0 0 0 0 0 b0000 +;Çåìëÿ +SET_ITEM 1 0 1 64 1 b0101 +;Òðàâà +SET_ITEM 2 0 2 64 2 b0101 +;Êàìåíü +SET_ITEM 3 0 3 64 3 b0101 +;Äîñêè +SET_ITEM 4 0 4 64 4 b0101 +;Áóëûæíèê +SET_ITEM 5 0 5 64 5 b0101 +;Àäìèíèóì +SET_ITEM 6 0 6 64 6 b0101 +;Ïåñîê +SET_ITEM 7 0 7 64 7 b0101 +;Ãðàâèé +SET_ITEM 8 0 8 64 8 b0101 +;Äðåâî +SET_ITEM 9 0 9 64 9 b0101 +;Îáñèäèàí +SET_ITEM 10 0 10 64 10 b0101 +;Êíèæíûé øêàô +SET_ITEM 11 0 11 64 11 b0101 +;Çàìøåëûé áóëûæíèê +SET_ITEM 12 0 12 64 12 b0101 +;Æåëåçíûé áëîê +SET_ITEM 13 0 13 64 13 b0101 +;Çîëîòîé áëîê +SET_ITEM 14 0 14 64 14 b0101 +;Àëìàçíûé áëîê +SET_ITEM 15 0 15 64 15 b0101 +;Çîëîòààÿ ðóäà +SET_ITEM 16 0 16 64 16 b0101 +;Æåëåçíàÿ ðóäà +SET_ITEM 17 0 17 64 17 b0101 +;Óãîëüíàÿ ðóäà +SET_ITEM 18 0 18 64 18 b0101 +;Àëìàçíàÿ ðóäà +SET_ITEM 19 0 19 64 19 b0101 +;Êðàñíàÿ ðóäà +SET_ITEM 20 0 20 64 20 b0101 +;Ëèñòâà +SET_ITEM 21 0 21 64 21 b0101 +;Êðàñíûé öâåòîê +SET_ITEM 22 0 22 64 22 b0101 +;Ƹëòûé öâåòîê +SET_ITEM 23 0 23 64 23 b0101 +;Êðàñíûé ãðèá +SET_ITEM 24 0 24 64 24 b0101 +;Êîðè÷íåâûé ãðèá +SET_ITEM 25 0 25 64 25 b0101 +;Ôàêåë +SET_ITEM 26 0 26 64 26 b0101 +;Äèíàìèò +SET_ITEM 27 0 27 64 27 b0101 +;Ñóíäóê +SET_ITEM 28 0 28 64 28 b0101 +;Âåðñòàê +SET_ITEM 29 0 29 64 29 b0101 +;Êàêòóñ +SET_ITEM 30 0 30 64 30 b0101 +;Ñòåêëî +SET_ITEM 31 0 31 64 31 b0101 +;Øåðñòü +SET_ITEM 32 0 32 64 32 b0101 +SET_ITEM 33 0 33 64 33 b0101 +SET_ITEM 34 0 34 64 34 b0101 +SET_ITEM 35 0 35 64 35 b0101 +SET_ITEM 36 0 36 64 36 b0101 +SET_ITEM 37 0 37 64 37 b0101 +SET_ITEM 38 0 38 64 38 b0101 +SET_ITEM 39 0 39 64 39 b0101 +SET_ITEM 40 0 40 64 40 b0101 +SET_ITEM 41 0 41 64 41 b0101 +SET_ITEM 42 0 42 64 42 b0101 +SET_ITEM 43 0 43 64 43 b0101 +SET_ITEM 44 0 44 64 44 b0101 +SET_ITEM 45 0 45 64 45 b0101 +SET_ITEM 46 0 46 64 46 b0101 +SET_ITEM 47 0 47 64 47 b0101 +;Ñíåã +SET_ITEM 48 0 48 64 48 b0101 +;Ëåñòíèöà +SET_ITEM 49 0 49 64 49 b0101 +;Âîäà +SET_ITEM 50 0 50 64 50 b0101 +;Ëàâà +SET_ITEM 51 0 51 64 51 b0101 +;Ñàæåíåö +SET_ITEM 52 0 60 64 52 b0101 +;Ãóáêà +SET_ITEM 53 0 61 64 53 b0101 +;Ëàçóðèòîâàÿ ðóäà +SET_ITEM 54 0 62 64 54 b0101 +;Ëàçóðèòîâûé áëîê +SET_ITEM 55 0 63 64 55 b0101 +;Ïåñ÷àíèê +SET_ITEM 56 0 64 64 56 b0101 +;Âûñîêàÿ òðàâà +SET_ITEM 57 0 65 64 57 b0101 +;Ñóõîé êóñò +SET_ITEM 58 0 66 64 58 b0101 +;Ïàóòèíà +SET_ITEM 59 0 67 64 59 b0101 +;Êèðïè÷íûé áëîê +SET_ITEM 60 0 68 64 60 b0101 +;Ñíåæíûé áëîê +SET_ITEM 61 0 69 64 61 b0101 +;˸ä +SET_ITEM 62 0 70 64 62 b0101 +;Ñëîé ñíåãà +SET_ITEM 63 0 71 64 63 b0101 +;Ãëèíÿíûé áëîê +SET_ITEM 64 0 72 64 64 b0101 +;Òðîñòíèê +SET_ITEM 65 0 116 64 65 b1101 +;Òûêâà +SET_ITEM 66 0 74 64 66 b0101 +;Ñâåòèëüíèê Äæåêà +SET_ITEM 67 0 75 64 67 b0101 +;Êàìåííûé êèðïè÷ +SET_ITEM 68 0 76 64 68 b0101 +SET_ITEM 69 0 77 64 69 b0101 +SET_ITEM 70 0 78 64 70 b0101 +;Ðåçíîé êèðïè÷ +SET_ITEM 71 0 79 64 71 b0101 +;Æåëåçíàÿ ðåø¸òêà +SET_ITEM 72 0 80 64 72 b0101 +;Àðáóç +SET_ITEM 73 0 81 64 73 b0101 +;Ìèöåëèé +SET_ITEM 74 0 82 64 74 b0101 +;Äåðåâî(ïðîõîäèìîå) +SET_ITEM 75 0 98 64 75 b0101 +;Ñïàóíåð +SET_ITEM 76 0 83 64 76 b0101 +;Êðîâàòü +SET_ITEM 77 0 84 64 77 b0101 +SET_ITEM 78 0 85 64 78 b0101 +;Îòêð. äâåðü +SET_ITEM 79 0 86 64 79 b0101 +SET_ITEM 80 0 102 64 80 b0101 +;Çàêð. äâåðü +SET_ITEM 81 0 88 64 81 b0101 +SET_ITEM 82 0 104 64 82 b0101 +;áåð¸çà +SET_ITEM 83 0 90 64 83 b0101 +SET_ITEM 84 0 99 64 84 b0101 +;Åëü +SET_ITEM 85 0 91 64 85 b0101 +SET_ITEM 86 0 100 64 86 b0101 +;Ëèñòâà åëè +SET_ITEM 87 0 92 64 87 b0101 +;Êðàñíûé îãðîìíûé ãðèá +SET_ITEM 88 0 93 64 88 b0101 +SET_ITEM 89 0 95 64 89 b0101 +;Êîðè÷íåâûé îãðîìíûé ãðèá +SET_ITEM 90 0 94 64 90 b0101 +SET_ITEM 91 0 95 64 91 b0101 +;Çàáîð +SET_ITEM 92 0 96 64 92 b0101 +SET_ITEM 93 0 101 64 93 b0101 +;Äîñêè(ïðîõîäèìûå) +SET_ITEM 94 0 97 64 94 b0101 +;Êàðòèíû +SET_ITEM 95 0 106 1 95 b0101 +SET_ITEM 96 0 107 1 96 b0101 +SET_ITEM 97 0 108 1 97 b0101 +SET_ITEM 98 0 109 1 98 b0101 +SET_ITEM 99 0 110 1 99 b0101 +SET_ITEM 100 0 111 1 100 b0101 +SET_ITEM 101 0 112 1 101 b0101 +;Ëèàíû +SET_ITEM 103 0 114 64 103 b0101 +;Òàáëè÷êà +SET_ITEM 104 0 98 16 104 b1101 +;Êðàñíûé ôàêåë +SET_ITEM 105 0 116 64 105 b0101 +;Ïå÷ü +SET_ITEM 106 0 117 64 106 b0101 +;Ëþê +SET_ITEM 107 0 118 64 107 b0101 +SET_ITEM 108 0 119 64 108 b0101 +;Àäñêèé êàìåíü +SET_ITEM 109 0 120 64 109 b0101 +;Ïîðòàë â àä +SET_ITEM 110 0 129 64 110 b0101 +;Ñâåòÿùèéñÿ êàìåíü +SET_ITEM 111 0 121 64 111 b0101 +;Ëèñòâà(áåð¸çà) +SET_ITEM 112 0 135 64 112 b0101 +;Ïåñîê äóø +SET_ITEM 113 0 122 64 113 b0101 +;Ñàæåíåö(áåð¸çà) +SET_ITEM 114 0 123 64 114 b0101 +;Ñàæåíåö(åëü) +SET_ITEM 115 0 124 64 115 b0101 +;Ëàìïà +SET_ITEM 116 0 125 64 116 b0101 +SET_ITEM 117 0 126 64 117 b0101 +;Îáñèäèàí(ïðîõîäèìûé) +SET_ITEM 118 0 127 64 118 b0101 +;Ñòåêëÿííàÿ ïàíåëü +SET_ITEM 119 0 128 64 119 b0101 +;Ãðÿäêà +SET_ITEM 120 0 136 64 120 b0101 +;Òîðò +SET_ITEM 121 0 137 64 121 b0101 + +;======[Ïðåäìåòû]====== +;Ïàëêà +SET_ITEM 127 3 0 64 0 b1101 +;Ƹëòûé êðàñèòåëü +SET_ITEM 128 3 8 64 0 b1101 +;Êðàñíûé êðàñèòåëü +SET_ITEM 129 3 9 64 0 b1101 + +;"Íóëåâîé" èíñòðóìåíò +SET_ITEM 130 1 0 0 0 b1010 +;Êèðêà +SET_ITEM 131 1 48 60 1 b1010 +SET_ITEM 132 1 49 132 2 b1010 +SET_ITEM 133 1 50 251 3 b1010 +SET_ITEM 134 1 51 1562 4 b1010 +SET_ITEM 135 1 52 33 5 b1010 +;Ëîïàòà +SET_ITEM 136 1 32 60 6 b1010 +SET_ITEM 137 1 33 132 7 b1010 +SET_ITEM 138 1 34 251 8 b1010 +SET_ITEM 139 1 35 1562 9 b1010 +SET_ITEM 140 1 36 33 10 b1010 +;Òîïîð +SET_ITEM 141 1 64 60 11 b1010 +SET_ITEM 142 1 65 132 12 b1010 +SET_ITEM 143 1 66 251 13 b1010 +SET_ITEM 144 1 67 1562 14 b1010 +SET_ITEM 145 1 68 33 15 b1010 +;Íîæíèöû +SET_ITEM 146 1 10 239 16 b1010 +;Ìå÷ +SET_ITEM 147 1 16 60 17 b1010 +SET_ITEM 148 1 17 132 18 b1010 +SET_ITEM 149 1 18 251 19 b1010 +SET_ITEM 150 1 19 1562 20 b1010 +SET_ITEM 151 1 20 33 21 b1010 +;Óäî÷êà +SET_ITEM 152 1 101 65 22 b1010 +;Îãíèâî +SET_ITEM 153 1 106 65 23 b1010 +;Ìîòûãà +SET_ITEM 154 1 80 60 24 b1010 +SET_ITEM 155 1 81 132 25 b1010 +SET_ITEM 156 1 82 251 26 b1010 +SET_ITEM 157 1 83 1562 27 b1010 +SET_ITEM 158 1 84 33 28 b1010 + +;Óãîëü +SET_ITEM 160 3 2 64 0 b1101 +;Êðàñíàÿ ïûëü +SET_ITEM 161 3 7 64 0 b1101 +;Àëìàç +SET_ITEM 162 3 6 64 0 b1101 +;Êèðïè÷ +SET_ITEM 163 3 3 64 0 b1101 +;Æåëåçíûé ñëèòîê +SET_ITEM 164 3 4 64 0 b1101 +;Çîëîòîé ñëèòîê +SET_ITEM 165 3 5 64 0 b1101 +;Óëüòðàìàðèí +SET_ITEM 166 3 11 64 0 b1101 +;Íèòü +SET_ITEM 167 3 12 64 0 b1101 +;Ñíåæîê +SET_ITEM 168 3 13 16 0 b1101 +;Ãëèíà +SET_ITEM 169 3 14 64 0 b1101 +;Êíèãà +SET_ITEM 170 3 15 64 0 b1101 +;Âåäðî +SET_ITEM 171 3 21 1 0 b1101 +;Âåäðî ñ âîäîé +SET_ITEM 172 3 22 1 0 b1101 +;Âåäðî ñ ëàâîé +SET_ITEM 173 3 23 1 0 b1101 +;Âåäðî ñ ìîëîêîì +SET_ITEM 174 3 24 1 0 b1101 +;Áóìàãà +SET_ITEM 175 3 25 64 0 b1101 +;Äîëüêà àðáóçà +SET_ITEM 176 3 26 64 0 b1101 +;ßéöî +SET_ITEM 177 3 27 64 0 b1101 +;Äâåðü +SET_ITEM 178 3 28 64 0 b1101 +;Êðîâàòü +SET_ITEM 179 3 30 64 0 b1101 +;ßéöî ñ çîìáè +SET_ITEM 180 3 37 64 0 b1101 +;ßéöî ñî ñâèíü¸é +SET_ITEM 181 3 38 64 0 b1101 +;ßéöî ñ îâöîé +SET_ITEM 182 3 39 64 0 b1101 +;Ïîðîõ +SET_ITEM 183 3 31 64 0 b1101 +;×àøêà +SET_ITEM 184 3 40 64 0 b1101 +;Òóøåíûå ãðèáû +SET_ITEM 185 3 41 64 0 b1101 +;Êàðòà +SET_ITEM 186 3 53 1 0 b1101 +;Êàðòèíà +SET_ITEM 187 3 54 64 0 b1101 +;Ñûðàÿ ñâèíèíà +SET_ITEM 188 3 55 64 0 b1101 +;Æàðåíàÿ ñâèíèíà +SET_ITEM 189 3 56 64 0 b1101 +;Ãíèëàÿ ïëîòü +SET_ITEM 190 3 57 64 0 b1101 +;Êàìåðà +SET_ITEM 191 3 69 1 0 b1101 +SET_ITEM 192 3 70 1 0 b1101 +SET_ITEM 193 3 71 1 0 b1101 +;Çîëîòîé ñàìîðîäîê +SET_ITEM 194 3 42 64 0 b1101 +;Ñàõàð +SET_ITEM 195 3 58 64 0 b1101 +;Ïàó÷èé ãëàç +SET_ITEM 196 3 74 64 0 b1101 +;Ïåðî +SET_ITEM 197 3 85 64 0 b1101 +;Êîæà +SET_ITEM 198 3 86 64 0 b1101 +;Ñûðàÿ ãîâÿäèíà +SET_ITEM 199 3 87 64 0 b1101 +;Æàðåíàÿ ãîâÿäèíà +SET_ITEM 200 3 88 64 0 b1101 +;ßáëîêî +SET_ITEM 201 3 89 64 0 b1101 +;Çîëîòîå ÿáëîêî +SET_ITEM 202 3 90 64 0 b1101 +;Ñûðàÿ êóðèöà +SET_ITEM 203 3 72 64 0 b1101 +;Æàðåíàÿ êóðèöà +SET_ITEM 204 3 73 64 0 b1101 +;ßéöî ñ êóðèöåé +SET_ITEM 205 3 96 64 0 b1101 +;ßéöî ñ êðèïåðîì +SET_ITEM 206 3 97 64 0 b1101 +;Êðåìåíü +SET_ITEM 207 3 1 64 0 b1101 +;ßéöî ñ êîðîâîé +SET_ITEM 208 3 99 64 0 b1101 +;ßéöî ñ ãðèáíîé êîðîâîé +SET_ITEM 209 3 100 64 0 b1101 +;Ñûðàÿ ðûáà +SET_ITEM 210 3 102 64 0 b1101 +;Æàðåíàÿ ðûáà +SET_ITEM 211 3 103 64 0 b1101 +;ßéöî ñ ñâèíîçîìáè +SET_ITEM 212 3 104 64 0 b1101 +;ßéöî ñ ïàóêîì +SET_ITEM 213 3 105 64 0 b1101 +;Ñâåòîïûëü +SET_ITEM 214 3 107 64 0 b1101 +;×àñû +SET_ITEM 215 3 109 1 0 b1101 +;Êîìïàñ +SET_ITEM 216 3 108 1 0 b1101 +;Ñåìåíà +SET_ITEM 217 3 110 64 0 b1101 +;Ïøåíèöà +SET_ITEM 218 3 111 64 0 b1101 +;Õëåá +SET_ITEM 219 3 112 64 0 b1101 +;Êîñòíàÿ ìóêà +SET_ITEM 220 3 113 64 0 b1101 +;Ñåìåíà àðáóçà +SET_ITEM 221 3 114 64 0 b1101 +;Ñåìåíà òûêâû +SET_ITEM 222 3 115 64 0 b1101 + +;======[Ñïèñîê]====== +SET_MAX_ITEM_LIST 194 + +SET_ITEM_LIST 0 1 +SET_ITEM_LIST 1 2 +SET_ITEM_LIST 2 3 +SET_ITEM_LIST 3 4 +SET_ITEM_LIST 4 5 +SET_ITEM_LIST 5 6 +SET_ITEM_LIST 6 7 +SET_ITEM_LIST 7 8 +SET_ITEM_LIST 8 9 +SET_ITEM_LIST 9 10 +SET_ITEM_LIST 10 11 +SET_ITEM_LIST 11 12 +SET_ITEM_LIST 12 13 +SET_ITEM_LIST 13 14 +SET_ITEM_LIST 14 15 +SET_ITEM_LIST 15 16 +SET_ITEM_LIST 16 17 +SET_ITEM_LIST 17 18 +SET_ITEM_LIST 18 19 +SET_ITEM_LIST 19 20 +SET_ITEM_LIST 20 21 +SET_ITEM_LIST 21 22 +SET_ITEM_LIST 22 23 +SET_ITEM_LIST 23 24 +SET_ITEM_LIST 24 25 +SET_ITEM_LIST 25 26 +SET_ITEM_LIST 26 27 +SET_ITEM_LIST 27 28 +SET_ITEM_LIST 28 29 +SET_ITEM_LIST 29 30 +SET_ITEM_LIST 30 31 +SET_ITEM_LIST 31 32 +SET_ITEM_LIST 32 33 +SET_ITEM_LIST 33 34 +SET_ITEM_LIST 34 35 +SET_ITEM_LIST 35 36 +SET_ITEM_LIST 36 37 +SET_ITEM_LIST 37 38 +SET_ITEM_LIST 38 39 +SET_ITEM_LIST 39 40 +SET_ITEM_LIST 40 41 +SET_ITEM_LIST 41 42 +SET_ITEM_LIST 42 43 +SET_ITEM_LIST 43 44 +SET_ITEM_LIST 44 45 +SET_ITEM_LIST 45 46 +SET_ITEM_LIST 46 47 +SET_ITEM_LIST 47 48 +SET_ITEM_LIST 48 49 +SET_ITEM_LIST 49 50 +SET_ITEM_LIST 50 51 +SET_ITEM_LIST 51 52 +SET_ITEM_LIST 52 53 +SET_ITEM_LIST 53 54 +SET_ITEM_LIST 54 55 +SET_ITEM_LIST 55 56 +SET_ITEM_LIST 56 57 +SET_ITEM_LIST 57 58 +SET_ITEM_LIST 58 59 +SET_ITEM_LIST 59 61 +SET_ITEM_LIST 60 62 +SET_ITEM_LIST 61 64 +SET_ITEM_LIST 62 65 +SET_ITEM_LIST 63 66 +SET_ITEM_LIST 64 67 +SET_ITEM_LIST 65 68 +SET_ITEM_LIST 66 69 +SET_ITEM_LIST 67 70 +SET_ITEM_LIST 68 71 +SET_ITEM_LIST 69 72 +SET_ITEM_LIST 70 73 +SET_ITEM_LIST 71 74 +SET_ITEM_LIST 72 75 +SET_ITEM_LIST 73 76 +SET_ITEM_LIST 74 83 +SET_ITEM_LIST 75 84 +SET_ITEM_LIST 76 85 +SET_ITEM_LIST 77 86 +SET_ITEM_LIST 78 87 +SET_ITEM_LIST 79 88 +SET_ITEM_LIST 80 89 +SET_ITEM_LIST 81 90 +SET_ITEM_LIST 82 91 +SET_ITEM_LIST 83 92 +SET_ITEM_LIST 84 93 +SET_ITEM_LIST 85 94 +SET_ITEM_LIST 86 103 +SET_ITEM_LIST 87 104 +SET_ITEM_LIST 88 105 +SET_ITEM_LIST 89 106 +SET_ITEM_LIST 90 108 +SET_ITEM_LIST 91 109 +SET_ITEM_LIST 92 111 +SET_ITEM_LIST 93 112 +SET_ITEM_LIST 94 113 +SET_ITEM_LIST 95 114 +SET_ITEM_LIST 96 115 +SET_ITEM_LIST 97 116 +SET_ITEM_LIST 98 118 +SET_ITEM_LIST 99 119 +SET_ITEM_LIST 100 121 + +SET_ITEM_LIST 101 127 +SET_ITEM_LIST 102 128 +SET_ITEM_LIST 103 129 +SET_ITEM_LIST 104 131 +SET_ITEM_LIST 105 132 +SET_ITEM_LIST 106 133 +SET_ITEM_LIST 107 134 +SET_ITEM_LIST 108 135 +SET_ITEM_LIST 109 136 +SET_ITEM_LIST 110 137 +SET_ITEM_LIST 111 138 +SET_ITEM_LIST 112 139 +SET_ITEM_LIST 113 140 +SET_ITEM_LIST 114 141 +SET_ITEM_LIST 115 142 +SET_ITEM_LIST 116 143 +SET_ITEM_LIST 117 144 +SET_ITEM_LIST 118 145 +SET_ITEM_LIST 119 146 +SET_ITEM_LIST 120 147 +SET_ITEM_LIST 121 148 +SET_ITEM_LIST 122 149 +SET_ITEM_LIST 123 150 +SET_ITEM_LIST 124 151 +SET_ITEM_LIST 125 152 +SET_ITEM_LIST 126 153 +SET_ITEM_LIST 127 154 +SET_ITEM_LIST 128 155 +SET_ITEM_LIST 129 156 +SET_ITEM_LIST 130 157 +SET_ITEM_LIST 131 158 + +SET_ITEM_LIST 132 160 +SET_ITEM_LIST 133 161 +SET_ITEM_LIST 134 162 +SET_ITEM_LIST 135 163 +SET_ITEM_LIST 136 164 +SET_ITEM_LIST 137 165 +SET_ITEM_LIST 138 166 +SET_ITEM_LIST 139 167 +SET_ITEM_LIST 140 168 +SET_ITEM_LIST 141 169 +SET_ITEM_LIST 142 170 +SET_ITEM_LIST 143 171 +SET_ITEM_LIST 144 172 +SET_ITEM_LIST 145 173 +SET_ITEM_LIST 146 174 +SET_ITEM_LIST 147 175 +SET_ITEM_LIST 148 176 +SET_ITEM_LIST 149 177 +SET_ITEM_LIST 150 178 +SET_ITEM_LIST 151 179 +SET_ITEM_LIST 152 180 +SET_ITEM_LIST 153 181 +SET_ITEM_LIST 154 182 +SET_ITEM_LIST 155 183 +SET_ITEM_LIST 156 184 +SET_ITEM_LIST 157 185 +SET_ITEM_LIST 158 186 +SET_ITEM_LIST 159 187 +SET_ITEM_LIST 160 188 +SET_ITEM_LIST 161 189 +SET_ITEM_LIST 162 190 +SET_ITEM_LIST 163 191 +SET_ITEM_LIST 164 192 +SET_ITEM_LIST 165 193 +SET_ITEM_LIST 166 194 +SET_ITEM_LIST 167 195 +SET_ITEM_LIST 168 196 +SET_ITEM_LIST 169 197 +SET_ITEM_LIST 170 198 +SET_ITEM_LIST 171 199 +SET_ITEM_LIST 172 200 +SET_ITEM_LIST 173 201 +SET_ITEM_LIST 174 202 +SET_ITEM_LIST 175 203 +SET_ITEM_LIST 176 204 +SET_ITEM_LIST 177 205 +SET_ITEM_LIST 178 206 +SET_ITEM_LIST 179 207 +SET_ITEM_LIST 180 208 +SET_ITEM_LIST 181 209 +SET_ITEM_LIST 182 210 +SET_ITEM_LIST 183 211 +SET_ITEM_LIST 184 212 +SET_ITEM_LIST 185 213 +SET_ITEM_LIST 186 214 +SET_ITEM_LIST 187 215 +SET_ITEM_LIST 188 216 +SET_ITEM_LIST 189 217 +SET_ITEM_LIST 190 218 +SET_ITEM_LIST 191 219 +SET_ITEM_LIST 192 220 +SET_ITEM_LIST 193 221 +SET_ITEM_LIST 194 222 diff --git a/res/keyboard.cfg b/res/keyboard.cfg new file mode 100644 index 0000000..458963e --- /dev/null +++ b/res/keyboard.cfg @@ -0,0 +1,75 @@ +;Èíèöèàëèçàöèÿ êëàâèàòóðû +;BIND_KEY [type] [keycode1] [keycode2] [keycode3] [keycode4] +;type - äåéñòâèå êëàâèøè: +; KEY_FM_UP=0; +; KEY_FM_DOWN=1; +; KEY_FM_SELECT=2; +; +; KEY_MENU_UP=3; +; KEY_MENU_DOWN=4; +; KEY_MENU_LEFT=5; +; KEY_MENU_RIGHT=6; +; KEY_MENU_SELECT=7; +; +; KEY_FASTINV_PREV=8; +; KEY_FASTINV_NEXT=9; +; +; KEY_CHAT=10; +; +; KEY_PLR_OPENINV=11; +; KEY_PLR_EDITMODE=12; +; KEY_PLR_USE=13; +; KEY_PLR_ATTACK=14; +; +; KEY_PLR_UP=15; +; KEY_PLR_DOWN=16; +; KEY_PLR_LEFT=17; +; KEY_PLR_RIGHT=18; +; +; KEY_MENU=19; +; +; KEY_WIN_UP=20; +; KEY_WIN_DOWN=21; +; KEY_WIN_LEFT=22; +; KEY_WIN_RIGHT=23; +; KEY_WIN_SELECT=24; +; KEY_WIN_ALT=25; +; KEY_WIN_DROP=26; +; KEY_WIN_EXIT=27; +;keycodeN - êîä êëàâèøè + +BIND_KEY 0 -1 50 0 0 +BIND_KEY 1 -2 56 0 0 +BIND_KEY 2 -5 53 0 0 + +BIND_KEY 3 -1 50 0 0 +BIND_KEY 4 -2 56 0 0 +BIND_KEY 5 -3 52 0 0 +BIND_KEY 6 -4 54 0 0 +BIND_KEY 7 -5 53 0 0 + +BIND_KEY 8 -6 35 0 0 +BIND_KEY 9 -7 42 0 0 + +BIND_KEY 10 55 0 0 0 + +BIND_KEY 11 49 0 0 0 +BIND_KEY 12 48 0 0 0 +BIND_KEY 13 51 0 0 0 +BIND_KEY 14 -5 53 0 0 + +BIND_KEY 15 -1 50 0 0 +BIND_KEY 16 -2 56 0 0 +BIND_KEY 17 -3 52 0 0 +BIND_KEY 18 -4 54 0 0 + +BIND_KEY 19 57 0 0 0 + +BIND_KEY 20 -1 50 0 0 +BIND_KEY 21 -2 56 0 0 +BIND_KEY 22 -3 52 0 0 +BIND_KEY 23 -4 54 0 0 +BIND_KEY 24 -5 53 0 0 +BIND_KEY 25 49 0 0 0 +BIND_KEY 26 51 0 0 0 +BIND_KEY 27 57 0 0 0 diff --git a/res/maps.png b/res/maps.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bc8a1af00deccefc00b967cc51821aa99ff9ff GIT binary patch literal 1268 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 literal 0 HcmV?d00001 diff --git a/res/mobs/cow.png b/res/mobs/cow.png new file mode 100644 index 0000000000000000000000000000000000000000..af1f07d63f7a54dfb039e7db9b4198ac7011bf36 GIT binary patch literal 1626 zcmV-g2BrClP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A000HaNklR^{CS4wQU43%Tdlr*{nXiYb#>J}JUsNzcFiT`g89~B{=B{IE-x>;A2&DM_4Rcx z>YQROly9{<|8m;>zQ6Bm+1c~lVlJ3(?U^Q~8EKb&w)>o(xlq2fXF^28GYI?6Z5lUy$sF-}jI#9lL%!H8| zCpl(vjN}BsJG8fA<^l7?#EhnwETn^}#!St^BI#@c(@cpCfAaoKvmM5gZ9mvxp2r9E zh;a=}b6zKd)09@m zSma|ILdD0EcROo8(ds3|R4$8SHRHUAb1)%sER?nQwi(|@P)-pgEi5`|15-3kaVF&H zhqqNv4q#k7zoo)!LgO+{Z!^lacg3k>GDR^Pn4&m}GvivjYydOi^IptcTwL^A#)*q} zZ+-t-YhM+H-y}t1rsmht7^XNFSK|y|TroNQMgQQ_<<7|nug+5Ys+b^_!}qqB;<95N z7*rFKjpUdom=PZ^B{8wg(MPs@)!9n3(()E>u>UYkF>Ur)%+gZVu@x{AF>9v;l#k$9Rv9j`}OxzUrCi4EIRPY+zi^ zR1A#4-Qx{nihLzoj8nfeu4sE}`2X6C1`&VTu8o!3M3(t>y-!hlz_%+?*8T7cVk@`7 z@uju_J!b@a#`hdkrdXUy|2(}Uv2q)$DWdaP_*GYQRC~r39d@i8|BmzP?rtc%nbR|| zJMRHsOr&Tl{^`Mtw3?#1J(DN!mHE~(aWd}}3Fx`5^jQlLN-=Yxd}A>+sYj-v9>+Pm zVstX-z(2%H&a3f^KD7)-bMQUp+w8(xx#3l3@ZZ=-{8FhYm}DD+nBEU?3*eg`Y1kXp zYrGI(BA_bH``(M0+RiJ%VQyXtd(1Z#(_5zSFkOQ1reL-4$TKy*@PGqzP0)IErgdEjH{Jf zn+KsP&hAk$7s^-PfV>(^J|@{S%4VM9neh4p=WB03T>17A8_)ssZ5E~q6-gnJm{Aze zxEbL~V%)G}zx7Ze(WK3`?>p2Tv&oXjOvEhIaTckQW1NVYoQ%;c#moc@`8hVBh?sh) zk8VJiJdVE+zN8qgn3)MoPTs}@&6gv_B{7p<3;FagH=h+4co|)ZH`{*H4`xB$^i*w3 zVg@l$j*`J|ff-F6@R|_R#6-O0bT%^SL(If(8UaC!Af_m01g~NSFcUs2Z9%B8>s2@Tx7z9G>L;?Xpvh7``<$^n4HzlL6y3`M}?^?OieTHCSYsCov;WK}}Dj4+xpTJdJ-;*``HVEGFV8SHeZw zSI=SCFxH%8TSt7u#S=OfIwW>OED^Z2O{^{FXd=Kuux>F?rCDKD7QQ zf-x~sVgtMykA6^YlWkuVbB5X?f`{?{4prp~DQ Y3n>e6y#vJ&VgLXD07*qoM6N<$f>}Nii~s-t literal 0 HcmV?d00001 diff --git a/res/mobs/cow2.png b/res/mobs/cow2.png new file mode 100644 index 0000000000000000000000000000000000000000..dbbfc4f5d13328c0122a6aebddaedb8ab503e3ce GIT binary patch literal 1724 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 literal 0 HcmV?d00001 diff --git a/res/mobs/pig_anims.png b/res/mobs/pig_anims.png new file mode 100644 index 0000000000000000000000000000000000000000..87cc86da4042a66d453f536dbe76e932038ceb31 GIT binary patch literal 2336 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 Ys~9`}$A5YUaBC0Tjb$Q2+n{ literal 0 HcmV?d00001 diff --git a/res/mobs/sheep_anims.png b/res/mobs/sheep_anims.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc027b5215b196449c0f3ce7736539c7998ecf9 GIT binary patch literal 2177 zcmV-{2!8j8P)N2bPDNB8 zb~7$DE-^7j^FlWO00;d^L_t(|UhP}?PZd`bp1-EQ^v5=7+8=7|7U~i$TB}v7RBBX+ zsI_so)TpRvQ5He1qN0ct1*Jx-P&c4}HY)DB#(m#n^aqpE`ObJ>=gpft_l$3f2qn3B zkG$`m?|$E$xyzgLEUW$hsQoFe*TLz?eERe$J%0R{o;`cUuh*|%r$>(-(aDo1>FU+1 zQ4TB?tCMqDR(*XvJ%9e3O?~m=1>LxDgU!5j=@OkebB6zqFv~br7vQw4hK2^ZbLS4- zzI~f6T)05z&Yh#Swl=za`7&L*c8%XhZEP3dw5;alX1?`r-n>Z{FJ7c8SFX_M)2BIO zVRS=fF*Q}Mq^6ouYWQs#WAOjpiX!@R-4fclGKUTxJVV61V>AD*EhQKSqmh}o^)W@jY+#zI zO89+k@hsYsKaE;iS`v)y0-VmW1OqXzK6vnew^{e^->18G?^0u9Bb!^l_7|!vozL?q zGP%AikIieY{*{_HFQ=x>E9mIaqqMucFqYByf5(bBRK0jog0WqIQ?}moB4tkrFm~Ir z*_^R3c1P(V&Qi?3XnXgi$%P3d&4y??V$K*|@pYXI zII*!KdVN5{Q{JPXcoK}%*iot7nQvs@kN9GuDZT2DBf*3+72v9QnYO7Jv~j_B?`bM7 zmH{U=79zgy+ns{qNiY&)hxf2AqTRqZvfroNa6y$`Z2izAn9#^``_A+Sv88M$y(KlSz^20vK>2 zV{tnw5t)N}k~^k4a7ZvO#~8?oI3s$0s5MP#-n3vGA3Xfb_hLesTRC?Om1U14MWE|! zz=@1S20`p-`<6^k{e;{x%X7wZ3<*YJEaHsr|5=R7t4nd0&(0ulV>~8IC}WW|n{p?R zA_&UZ0G!xZh{c?jp87FotT(1IBnTrh_MNxiA~Y4pt4neBPw7Tz7>@}P%2*Xxz3Ms} za3W)sSoP``Q-YBgt8^e!AW6?~xf3lAKjEBL@7e2B0(LTqd&=X88f#SyAd0k^iKAmbGZ6=E6dhKCauorD85yd-Pj`OdP#9ok&<{4On}M+Eh-)i zgJ!?J5{$@MmH#(HB-95H~#4@-^XmSCjD)-KJCX+-j%jUV2Rz?=2$ zm&_}{h)q=iLBy5V@xOG5ivwZ_PGYP#)`YbFF@dVT1S2taOa2tQ9%4#t>_{Hwv!?;P zW`5I)KR0233uP<J|F&2-ms~0Eg%NY0t*9zdV zwglrY=nxsKf|lDw2|<-EQk=~6R)T@~ zSwni08lQmM5y2;ul5GABfv%GjXEGK%Za!4JWZLCD7`R%%Bp87>*2GhaMjN;#7>o~V zfOmln9D@psxhH5>AjL_H<%QxU9}LYL+&gaIUM@e3#8_3Apwou95)8(t>KO#Q4kV(2 z3=?1MPVn-13o!h~hP)<1LHDbOq~A!ylThP&IOW100000NkvXXu0mjf D^r!|H literal 0 HcmV?d00001 diff --git a/res/mobs/sheep_fur.png b/res/mobs/sheep_fur.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d057724c99cf5648665fea3db5de8353d77d22 GIT binary patch literal 648 zcmV;30(bq1P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0005^Nklh6UN7zU`}BIf()D^x zr_(8)ce`DhOeX2)=O@i(v$WZ4vfu4?OQX>!4Tr;w=j+bd9SpH-kH;g&ESJli6HYOo z&vSysV(~|&TCHY6Z1s9QZMWM@c(qz(p!fTo?)Q5dkH@K8E~kFKpVsSjz7vB4TesWI zaR?~H7giLQ{;kX9l7A}>MgfGA%@}|x#~LV=e34frA94Ic9V)X?r&6ipI|Y0`pWFe- z+;uvgOf1&-`^`spa0>^)DpHxG{Nd-|2!N7sV7XC;{ z%Fc#Nv<((}(QG#Vm;;hHNQI1{1beiG8bA>Qs(oewF{Jn&kHz!7aW6L7;f|7_lHZ}0uXxER5_84Z8CmVigiL=7HUf+SqdgRom;yF?C?w7@ zXa7I(D2y+X2t|7+8h;^(AZk>ig#~6vVM__g1;j8qhve}BBRMc_(DK+w@PmaoLh<^d i&GN;QM~c5004&&004{<008|>004nL003F*009yY002DZ000@zy2&Ck0003i zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHyu&tqUGmw1*$mUCju&;pFNf7oE5W5KI2_X9m zNPRk(&BOsV2f~&Cu}e}bK=v{?=ND8KWu|A8C>UB=S}HiEH; zLN@>a1sF+0K~!i%?U`G18b=U?DOC~+m2QBz3ZaX^GL*1IAQ2XhEh~K4n?*Ks3uf_wpzWiS5wM}azp7x(7Ln-ZUOS!Nu)zYr9g8i-S6=Zn! zKnA_Gwf=)+>9r4~+iuCjlLP7AZ%OB<85;LKAk*mI0pOptHJfOX&a7|Lw?d=+?QYTGQKyO>u4Ct_VsGGo7SkB%QLPiRb@}#XiA4-~%9y{v7}) zJDd4?^5Om8;bu%3y19O0S473seXP1yv{o^Dz+PcD07y4qyAgMt@};G0^yr~o6+QrN z^UrFd^hJ#onUw!!#P0w=ozLI<)`Fm$FQ+1|c~;ojlKlFb)J@RMdc|G?05hIdFzTO9 zuRpH<_5}domlZ*>d;r|$zgjLzy;712;2Yzbwxs+oBYp<}X8F6D7qYdnF7JQ8mXB{= z%cpm5WP9s7=^Qu1-_4D01dF!OhgCq5ndu~&dT)=R_J}%tWwI+~j`tXcvO#=6K{m5a@U>uC&EaT_%`5gXg z<&rh7Y2z7vv_Jp7tN*0p|4#|x1VaFtSOTLo&`#TIU^XG<8GSSfv@wRZ&zp>&etaDI z(qn7Xr#;@9qpT*HYua>tJ7K2BUG>eF^ZM5~lZ-$2{NizVeAMMzEUbqw&2xgFtoQ=q z8GY!heHepw#?<3!^m%kFPF?yQ`VO5H#|GFfyD(u zP`vn;lCOc&#}}j~4_|R0-u4dsM-vqXj1O4)-qrWA z%p{tq z?DUd)bNJ`o=G7p*T5k0|@X`PP002ovPDHLkV1lbROyd9m literal 0 HcmV?d00001 diff --git a/res/mobs/zombie_ani.png b/res/mobs/zombie_ani.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e05fd08ad91fbc549c61b69da748209bfdecbc GIT binary patch literal 1752 zcmbuA`#%#31IEWRa#Ajn<#xu0W4YUAZttm$#Bx`PLoP|?vdY16IVUpr+gx)QX>(Ur zn5M{*7LH?#VM8?s$6m~dTxJTd|Ka`NdA>h9pU?N#C)?fCK~7dx761UqVI41d9@FJG zXc^FP2bAyM1pq)#u$M5`;%C>ZeIvnMkijFHuE(G7J-vZW9$@<``JUIn!7?cMI*Gh& z6H?X}v`joUe&e0|Lh2cv@LPEs;e>2P1;kiEnUDtARNPdIIH5%@H3D~c_8e;#t(r#Q zzej|IHpQw4o)pehTJf#;A{)NwG13P`n79A$TSujl6<^xlLq{sJ`!{YVTtMp%`A-E_ zq9Rv&pl-bv8KP_Eb5A9nf9|Xv3#)pF&UEZ}7~dpY>mqk?Z#0`Eh=k$B811Cn1LnNT znjP9&CF9~PGTBU5(W4^c1V*6XFh`-O>GCGqh}kN>=CRSJ<(Hj#$oV9ki$#qhTD~JWFN`temsmf&~7# zlHg>!_H6@s1S!~^Z=!Uqo!)qN$aTE#wkhVt?g@>4OY8>TmR0@5J$lp}=_xXd7DU)J z2dRhsl+OMGmbPrCh5S*LB6gQyW!mB{fNi%Z@}x8W?-br>(ud3&hO^#t$-|6YX5^^| z!UZtY>7*OV`LA+@?V+p2JKo;dBRFHhTDZC=n6lsuvsF;wmMPl3o9n1_<>zs5xxjR0Kb85nr5X z|1AS{DN1Wc*<^eLaLVwLYjdEIQU_%4b*{8!-?J6IWcmPL2@mXwJ2PQiD8Q2mH;Y_C zzb2^`r1vCpwL<+;^yAp@N1++lo%r(y&TmK5sQPgW-y7bm`I$ zfle^d@m8chBFx8{2*2-a5xJHzJ;TW3AvtG_cmR64M?>n1t0z@~107G;hDvw86F~-? z7U1*rZ>z077Rc$buT0qFp}1%)VPlFC(gOU|W7tO5>>mh){`Ok>GDB1x=DN|EE@Ode zfOm#4d#e{O+JJfISN&<>Zd(gHRy&G!ue+@^NKpz%z-h;dohg&oFKjF3`B_Mv|6wji zg|#lFCv&zQM;fz$!wHGxosaYiUcxy#72GkfNn@66@9usTl-1NPHfZBUNksmY$j*IC zq44jcLB&C$#UpQKz{ z9*QUKNXqjnc%fHYZC^708;>}L95i#_U<@>DkTJwNxhDlCG*29dHOF~ik>05MZ&T{> z2McM{o|pJ@2M4)NsR0iMZVSBXFORwQ+$FO!GBa~Q-IUjO{gIP;>?^1pOqFLqK!6wS ht{Qhg#815{S%Ng6N{0}k7mgnbfVFqM^xQU(@IQ82UIhRE literal 0 HcmV?d00001 diff --git a/res/pack.png b/res/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..e2bc8a1af00deccefc00b967cc51821aa99ff9ff GIT binary patch literal 1268 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000DINkl5o?SJH(&;Ap~{U)x)Ga-kQ z*-N(V!@$m-In$nR=l9L*CY7peQIgwO;UW!RIYrmA{d6sJPG3usi^u<78o5BZ;q!Fk z(pj1w9o(4$K!m&}!u06C&J+N}H&?(86d*e?WS;(=u_1#4_XN=+wwniVPY^v~I|$I~ z0l4nex9Z&v0GZ2+!!_<9hB3YfL97Ca*`VXr3P2H9+IYGs@Z^hiI`jGq^}qQ{gKwJ+*SLom z#$YURx)H#2UoVwPl*{F)SS-@yf9oYpk26je_atBcfmBX7jFb4>63vSmbmo zfD7~Hsb{m4&*v$V$ru4N^R*QKZjYr6-m&EI)J@^^quIP`+(QgwFcvx83gEJ@7YYTl z{3j+Rj0jqfh+P0JvwS@F0IAROdjf&hZ+cpWxd%vn>-zvVtvF0j!z^cp+Ig_Q@y_@vp z_9(5*-6G!S9ufP?kapje7)QZ=(Q9)>bKTnK`5ixqMDaST^#Fy#Eu;Z}{5H{n|{5>JS zt_S>md$Z5(u8d3h>J?y}rIkO41-*}Rk7zU+RIOHNb#;}>| z*R}Jj&jHf=wd5(%z8rO2eGZV`uO$x%n`!O*mIp-5VBCMt@&GMENgr={K-3Jz{r4;n e&@z*p-R2F9X3 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 literal 0 HcmV?d00001 diff --git a/res/terrain/explosion.png b/res/terrain/explosion.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7d72aab05bffcbf236b22f24ee0981f2c484f1 GIT binary patch literal 966 zcmV;%13CPOP)Z-RIW|1z0HvD7h%Yi2(p;;JxT>R2CYwAh7vVdu%QW9*S^M0AMPV3b2yP ze?BUqM8Sg)u!j=@08LaBy`wgd7~R<`1pz|9u?HdG6;1}gWK$>TcqsPJ1NvebZ0>HUPb@5g4PzV9#0^p21Rm$0 z763*$5C8}OnH~gyI)`Tu0zgpPBOC|-Z4dzb4weoxYZjullZ?DC2mrAV0M0!K03GtX zgAoAI90&kDJ}Cfx7Fjn<7aFNBZOSL5CA&lcLyT?q&W}(d=LQI z9jy0v#x?2fpd;>00zeKb0YGsUqWnpOhz~LPgAhQ@VH04C0|6iwPXMsIFKQ_yqGR^X zLPU=UEBh&{3jtu_08mX;09i2rw6vY!Kmh6E69P!@CP=G8)e=Ny0LYkquz0K(Lf%~n z0Fy!h8RtL%=;IRtz$k}RmmsoGDZGsS_a3+E4G7?8wE)5lgpU~mh*AK!dT-=)S-k|o z9)z(j1OS+lsvBy>C6E;ZKxEq<2c-ZqdIsXt9)mn{srFEK0)YSk)3I6rVFscPW*}@1 zEJ2L(P#FC`JgOuBW`zJ^W99(D48-_NkSi@gD2)Cee=8&azz+e$M)pWH)1xYYFar^b za`AusUm*ej^HLE&*n=_7VZ|AU4AhJN<8_4$0Du<)NWO>C5=hh!K~eno?Gpe102&~G z<{9Fa_14?dtZgoLbxe0UV#OV10C@xBvhE07*qoM6N<$f-9ziUH||9 literal 0 HcmV?d00001 diff --git a/res/terrain/light.png b/res/terrain/light.png new file mode 100644 index 0000000000000000000000000000000000000000..d2dbc52102e20e019f50d1534e4e00eb985dcdaf GIT binary patch literal 272 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 literal 0 HcmV?d00001 diff --git a/res/terrain/moon_phases/moon_phase_7.png b/res/terrain/moon_phases/moon_phase_7.png new file mode 100644 index 0000000000000000000000000000000000000000..4201800fb056178cdb3d5fda484ce542e069e70f GIT binary patch literal 859 zcmV-h1ElPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0008YNkl5oy83}65NBJ;0hc&brEjBx%)WQ@7i@!w{!9&xi?UplkV!T{#DiIp3_T9 z`~2JdHk>$!?NfH#Z6wgi80+m+j8z-+nStIDstcTgHOT4kVP|%*oF4<5!i<8H;C zcs6|4xv=v)n7Q-=X>G!!?gV5TL<6Y7Yv2reA^a|eT?$+7%$PYo028KyOd)0fy6h2W z@C=+mFUQ=Kuxrh($Cc&(=J+H`g7grxRVdl_!DT~?=+zeNW?XND-R{hoIY4|9goZ@6 zK}@UA0dTayLS>c}QR0H$4Z9!qpfh9U_#}w6G%AE7wPI@@G=R+BCQ>??XK>lwX@MWc z^>Nsfu&2%38#4!luQkAF(4t8@H|7igA^@4ao+}}N3@&3q1brU%BJ5=|_r}ce;aeeS z(acs%sxWCm+}IEaP_x%Zr6iQWpS6ImI+RVK%Kzu3$4O+DdTWu%+N&`T@GJE}0 zQi2&=u(h!Du#IN!jhU+u*3wW(nzXYG|Mx)$phQZgZ^&&beN|e*E6Xa1z9fmL8e+)l={T>R0HP+IgMKjwV*=+#&pPSEft@roBWUs$UyjFvM{QPxb00eIU zD#6zpYiZD;nQahj1|T;e0FMo4rPF&m+$K}rbpV;U;8}r$;M07qv6cocnzY3LAm+3M zJ%FAiK$hQz+o%9<-)&B^&K76`pD?~!W^Dq{JURf`CqS0Jwctnq_SFLAKdKhk5C`6b z36Pu7|DkiJO$flFaj3^IK^j2*79997T=)->Ct?0S#qE8txR+6RAuaTET;GTb`yk0S z)bGK$ev;KH%=e?T`!MM%QO^R$^I2X1vI+@NzmkvlVA4U1fh5fF9L?%U#e2H5`5aDn lJH3uT?Rs3_^Ca9H{sF!6RL)w{%w7Nh002ovPDHLkV1gLOh)4hc literal 0 HcmV?d00001 diff --git a/res/terrain/particles.png b/res/terrain/particles.png new file mode 100644 index 0000000000000000000000000000000000000000..c8026d27a6a6ea5dc0c4e7fc18c4377ab55de513 GIT binary patch literal 1223 zcmeAS@N?(olHy`uVBq!ia0vp^4nSPM!3HGP36~W!FtGG_x;TbZ+W$M>#VC+ADnr_@gmaOZ}xg6{B%I2-zwcaW11`iiMeiuB~^w|o2E7l$BW|RoG=vlS4e|^C4 zYnIx+*UYlVUz)aDU{E>CW`07+;+ut~rRM7SJJvH>OtxUZt)X8mdq5P6>5FO-FCh#! zezppy;S>5_=_E8urwH~ac)hZ8W5`zXKSy57o{`xs75+t0c1_Nz~( zD^L8pRwDgW(dWmD9lt}K_gKGl_GetDt#+4XVYlDIy)SARUS!Yuv5vn)X1RO0*oK3= zn>hNc`m`RWZ;WRzP%C`Lv6eYK=sIJ}M2q{b*N@ed>N6}m9F@|~}m z{SYosw6$p1x2*I1FNfoWR!2r7Ri#_!`5)}>1$h))A~vOQ}mb_&Lm&{QoANF zVe|j6?-z5{yqjwgxykBn z(`8W5;Wn3a<+A#leW-aTF!i@>{kIS&m_*+o1 z;-8((ir=eOTmAg|a%J7$&wtkR$;&Tp3t+x+>;C$)*^jLzF)~QcsqA>cctF3QfpJOF zKURh#FQ277w&x8pxX;j_xFiYa-1&utg@Jn0y-jDIUE|-YC)Qn6ot}Pt^|sr$Z-09C z&TppO;V%(y6&McuIe4(~>*g21^AkFp3~Z~<^lp7C{hVw1!F2~q1;np^OR>1StUkM1 zETVtD-*R4u-2Tg(T5oi0v)$vfdr`cvnx*kCQGe-k25esaM&kMlEX$?p8{SShbo6k= zx^6XwFMn(7^wlSKHvKJN$i46C@Y*dxE#Ju&>iV#W*MdpH?tYu5H{zBiro z-QTlkdvD#ot-Wsj`qOvs#(otmdA+j7nA3Wpb@|1w?OCzn%4@4*IUmh^Ftzopr0Pq$v A=l}o! literal 0 HcmV?d00001 diff --git a/res/terrain/rain.png b/res/terrain/rain.png new file mode 100644 index 0000000000000000000000000000000000000000..54ab30c6895adc1038b921b75dab2398d998c913 GIT binary patch literal 401 zcmV;C0dD?@P)YYPKX@@d&L9-1XP{d8AQ7go~Td24FMV1wa<1;9O-@| z;u&s&S4R+v3%v_*!*3UKWxvW<7>TSu%E~8 z3cdyW)|S`Bl!yAYp?(`|{V-uB3%~&yaDY$#v!}OHX*YZL!!(eLH{Aaj_;2iw(>*{0 zuWO(_Jiw_hUQ(kv)aXmb-=zUGha-cCeDDUzvH{2-A|Jd#7#2004R= z004l4008;_004mK002@5009+P0026d000+n*IFNt00009a7bBm000XT000XT0n*)m z`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j^FlWO00q!VL_t(YOYN51 zS5s#i#=o3kClW#oL@-K0kjlZLjyi(4v{IP?wbfRv78R941%(81+(||q3$?adt74(b zcmTz=UbTOK{sFG#WqapZ-a5URUbvQ5zrH&M#kQ=@%$mC~YyH;qemgrmd%w?{e2-E} zVPG~XY!-#xs>sVxxHW~>q44D?UdvZ3El|{Y6f27qe=b&R@F|)XE85BwJ1P{rmnsfa zD?VJV@UK+F)+kOiDn8zzIQypJ!WPAst%`|limPucCU*+EEL_>GF}~Nyr4A40_Ali0 z!E*k7xCXs@B}2XI>FaxogZaV zD?&-?LMN#XpQ0)}N@e5|$|9dp8a;S*yA_R z;#1_tZ(&Q^#+sPHlDLB@@inI8H=^I5lHa~W>bPJQEXl92Chw4woDpuLC2wI*PLY?m zNq+JMuEaImiAg;1D|qAM6vw~B7r#Vl`~qe1^Hk_(snX9-qo1ZOHbQ;u6suwHd1o z9$Ci450^0B<72Yh%k@KUrVl!~-KjCN-^QH|Gc)firrs4_wkyW|qBtYI9bc~)TCM03 zU-v9iyi=*zBAz!bQmmFas4Y}fxD|_>iXxep{9J`5Gh{KR=ju1ua#1!rDmM>h&qp~5 zQ1d(}XAvsD80E@Rf+|=z3!l`Bgp9hSb}vTF&r&M&YiT@XFDR6{usluC5>cV3ViuKB z3toez8LHB{z*tMYU^dHS{kkApJez7+&!VIT^&B~#s(-Ds&zY+>K4V;0-Z!qFs9?v)WZIJ1I$`8YztViOV z%kauj1MxFoF#L6T)1EurD9t6a;6&v((sS{9GxPGXIRYBrlwSj-kI z7Bg0>MX;u^S+Uu2$jK3MbICQ(a?vz9cDsf>rFI;Gp>~HukhQ2|-n{4Pa=CcL|E32H zN2agRXS?0#w~*3|2jYpQX=vh)p@wHE{{+KJtId}2*YH~q-?KB2o{P+E{PCduW*A?5 zK6{=y4$o&YJDacc#qadL?8RKYp39s6#NU78k19PsBO@dD{eJd!bg;Fp zmGzAcyir$8Rrw;yOFWc%=27a-VTs#9wZ}xg?5JyHXKj*%wOJBYtL(P#NWyBDgtcE1 zR&SkRaD^f&yYle{#YmIl(@l!=Z^^FxS4ml06<^5?er1R7o`s2ajmvwST=>AlXZsd1 z+F8ztLp8*@RuJfE#e` zFX_q^pTsTc%A-%<)h|=5kKxlVP^zD&Og~3O>{F^@r>TjJQX4(R8_|=jj2>rAB*D5! zjP>C#8^gnF4*S^>I!0@#k8PnIb_Bb4Z@80=;XNDxCA|JvNyW2aCNf%6to`tSD#s@;cV7TSrSv3+=nw>F(|! z6b>;mGRoN4Wu~WZ@!j{|bN~K*9z1x!4?q0K$}3`6DqhgLVZKz@aUkESbUByC#d$>{v-Gt&UG8Q~%-%gcgAhUNF_Zuz$hcY6>ZgB$*dc=C2~vDuXk)7m z?ym$%z8xi#tDIul@pXdG2q1!R^k{<6hEXypg0!ziZiMOIAeMd?PhsxS1Ziq!rBf`j z<{t_2`Vq9-DVC+*#Z#EuTEoSX>^umc|7lPJ$<{LyptnI0WGzq7-7bRk)to^PcmpB` cMnB5a1;VvJFX)A%4gdfE07*qoM6N<$f_GYY1ONa4 literal 0 HcmV?d00001 diff --git a/res/terrain/sun.png b/res/terrain/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..85cccda647f78321a935d2d9ea98881d256fae4f GIT binary patch literal 3262 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 literal 0 HcmV?d00001 diff --git a/res/textures.cfg b/res/textures.cfg new file mode 100644 index 0000000..b211ca2 --- /dev/null +++ b/res/textures.cfg @@ -0,0 +1,291 @@ +;Èíèöàëèçàöèÿ òåêñòóð áëîêîâ è ïðåäìåòîâ + +;Óñòàíàâëèâàåì êîëè÷åñòâî çàãðóæàåìûõ òåêñòóð +RESET_ITEMS_TEX 116 +RESET_BLOCKS_TEX 143 + +;SET_CANV_TEX [type] [id] [x] [y] [w] [h] + +LOAD_TEX terrain.png +SET_CANV_TEX BLOCK 0 0 0 16 16 +SET_CANV_TEX BLOCK 1 16 0 16 16 +SET_CANV_TEX BLOCK 2 32 0 16 16 +SET_CANV_TEX BLOCK 3 48 0 16 16 +SET_CANV_TEX BLOCK 4 64 0 16 16 +SET_CANV_TEX BLOCK 5 80 0 16 16 +SET_CANV_TEX BLOCK 6 96 0 16 16 +SET_CANV_TEX BLOCK 7 112 0 16 16 +SET_CANV_TEX BLOCK 8 128 0 16 16 +SET_CANV_TEX BLOCK 9 144 0 16 16 +SET_CANV_TEX BLOCK 10 160 0 16 16 +SET_CANV_TEX BLOCK 11 176 0 16 16 +SET_CANV_TEX BLOCK 12 192 0 16 16 +SET_CANV_TEX BLOCK 13 208 0 16 16 +SET_CANV_TEX BLOCK 14 224 0 16 16 +SET_CANV_TEX BLOCK 15 240 0 16 16 + +SET_CANV_TEX BLOCK 16 0 16 16 16 +SET_CANV_TEX BLOCK 17 16 16 16 16 +SET_CANV_TEX BLOCK 18 32 16 16 16 +SET_CANV_TEX BLOCK 19 48 16 16 16 +SET_CANV_TEX BLOCK 20 64 16 16 16 +SET_CANV_TEX BLOCK 21 80 16 16 16 +SET_CANV_TEX BLOCK 22 96 16 16 16 +SET_CANV_TEX BLOCK 23 112 16 16 16 +SET_CANV_TEX BLOCK 24 128 16 16 16 +SET_CANV_TEX BLOCK 25 144 16 16 16 +SET_CANV_TEX BLOCK 26 160 16 16 16 +SET_CANV_TEX BLOCK 27 176 16 16 16 +SET_CANV_TEX BLOCK 28 192 16 16 16 +SET_CANV_TEX BLOCK 29 208 16 16 16 +SET_CANV_TEX BLOCK 30 224 16 16 16 +SET_CANV_TEX BLOCK 31 240 16 16 16 + +SET_CANV_TEX BLOCK 32 0 32 16 16 +SET_CANV_TEX BLOCK 33 16 32 16 16 +SET_CANV_TEX BLOCK 34 32 32 16 16 +SET_CANV_TEX BLOCK 35 48 32 16 16 +SET_CANV_TEX BLOCK 36 64 32 16 16 +SET_CANV_TEX BLOCK 37 80 32 16 16 +SET_CANV_TEX BLOCK 38 96 32 16 16 +SET_CANV_TEX BLOCK 39 112 32 16 16 +SET_CANV_TEX BLOCK 40 128 32 16 16 +SET_CANV_TEX BLOCK 41 144 32 16 16 +SET_CANV_TEX BLOCK 42 160 32 16 16 +SET_CANV_TEX BLOCK 43 176 32 16 16 +SET_CANV_TEX BLOCK 44 192 32 16 16 +SET_CANV_TEX BLOCK 45 208 32 16 16 +SET_CANV_TEX BLOCK 46 224 32 16 16 +SET_CANV_TEX BLOCK 47 240 32 16 16 + +SET_CANV_TEX BLOCK 48 0 48 16 16 +SET_CANV_TEX BLOCK 49 16 48 16 16 +SET_CANV_TEX BLOCK 50 32 48 16 16 +SET_CANV_TEX BLOCK 51 48 48 16 16 +SET_CANV_TEX BLOCK 52 64 48 16 16 +SET_CANV_TEX BLOCK 53 80 48 16 16 +SET_CANV_TEX BLOCK 54 96 48 16 16 +SET_CANV_TEX BLOCK 55 112 48 16 16 +SET_CANV_TEX BLOCK 56 128 48 16 16 +SET_CANV_TEX BLOCK 57 144 48 16 16 +SET_CANV_TEX BLOCK 58 160 48 16 16 +SET_CANV_TEX BLOCK 59 176 48 16 16 +SET_CANV_TEX BLOCK 60 192 48 16 16 +SET_CANV_TEX BLOCK 61 208 48 16 16 +SET_CANV_TEX BLOCK 62 224 48 16 16 +SET_CANV_TEX BLOCK 63 240 48 16 16 + +SET_CANV_TEX BLOCK 64 0 64 16 16 +SET_CANV_TEX BLOCK 65 16 64 16 16 +SET_CANV_TEX BLOCK 66 32 64 16 16 +SET_CANV_TEX BLOCK 67 48 64 16 16 +SET_CANV_TEX BLOCK 68 64 64 16 16 +SET_CANV_TEX BLOCK 69 80 64 16 16 +SET_CANV_TEX BLOCK 70 96 64 16 16 +SET_CANV_TEX BLOCK 71 112 64 16 16 +SET_CANV_TEX BLOCK 72 128 64 16 16 +SET_CANV_TEX BLOCK 73 144 64 16 16 +SET_CANV_TEX BLOCK 74 160 64 16 16 +SET_CANV_TEX BLOCK 75 176 64 16 16 +SET_CANV_TEX BLOCK 76 192 64 16 16 +SET_CANV_TEX BLOCK 77 208 64 16 16 +SET_CANV_TEX BLOCK 78 224 64 16 16 +SET_CANV_TEX BLOCK 79 240 64 16 16 + +SET_CANV_TEX BLOCK 80 0 80 16 16 +SET_CANV_TEX BLOCK 81 16 80 16 16 +SET_CANV_TEX BLOCK 82 32 80 16 16 +SET_CANV_TEX BLOCK 83 48 80 16 16 +SET_CANV_TEX BLOCK 84 64 80 16 16 +SET_CANV_TEX BLOCK 85 80 80 16 16 +SET_CANV_TEX BLOCK 86 96 80 16 16 +SET_CANV_TEX BLOCK 87 112 80 16 16 +SET_CANV_TEX BLOCK 88 128 80 16 16 +SET_CANV_TEX BLOCK 89 144 80 16 16 +SET_CANV_TEX BLOCK 90 160 80 16 16 +SET_CANV_TEX BLOCK 91 176 80 16 16 +SET_CANV_TEX BLOCK 92 192 80 16 16 +SET_CANV_TEX BLOCK 93 208 80 16 16 +SET_CANV_TEX BLOCK 94 224 80 16 16 +SET_CANV_TEX BLOCK 95 240 80 16 16 + +SET_CANV_TEX BLOCK 96 0 96 16 16 +SET_CANV_TEX BLOCK 97 16 96 16 16 +SET_CANV_TEX BLOCK 98 32 96 16 16 +SET_CANV_TEX BLOCK 99 48 96 16 16 +SET_CANV_TEX BLOCK 100 64 96 16 16 +SET_CANV_TEX BLOCK 101 80 96 16 16 +SET_CANV_TEX BLOCK 102 96 96 16 16 +SET_CANV_TEX BLOCK 103 112 96 16 16 +SET_CANV_TEX BLOCK 104 128 96 16 16 +SET_CANV_TEX BLOCK 105 144 96 16 16 +SET_CANV_TEX BLOCK 106 160 96 16 16 +SET_CANV_TEX BLOCK 107 176 96 16 16 +SET_CANV_TEX BLOCK 108 192 96 16 16 +SET_CANV_TEX BLOCK 109 208 96 16 16 +SET_CANV_TEX BLOCK 110 224 96 16 16 +SET_CANV_TEX BLOCK 111 240 96 16 16 + +SET_CANV_TEX BLOCK 112 0 112 16 16 +SET_CANV_TEX BLOCK 113 16 112 16 16 +SET_CANV_TEX BLOCK 114 32 112 16 16 +SET_CANV_TEX BLOCK 115 48 112 16 16 +SET_CANV_TEX BLOCK 116 64 112 16 16 +SET_CANV_TEX BLOCK 117 80 112 16 16 +SET_CANV_TEX BLOCK 118 96 112 16 16 +SET_CANV_TEX BLOCK 119 112 112 16 16 +SET_CANV_TEX BLOCK 120 128 112 16 16 +SET_CANV_TEX BLOCK 121 144 112 16 16 +SET_CANV_TEX BLOCK 122 160 112 16 16 +SET_CANV_TEX BLOCK 123 176 112 16 16 +SET_CANV_TEX BLOCK 124 192 112 16 16 +SET_CANV_TEX BLOCK 125 208 112 16 16 +SET_CANV_TEX BLOCK 126 224 112 16 16 +SET_CANV_TEX BLOCK 127 240 112 16 16 + +SET_CANV_TEX BLOCK 128 0 128 16 16 +SET_CANV_TEX BLOCK 129 16 128 16 16 +SET_CANV_TEX BLOCK 130 32 128 16 16 +SET_CANV_TEX BLOCK 131 48 128 16 16 +SET_CANV_TEX BLOCK 132 64 128 16 16 +SET_CANV_TEX BLOCK 133 80 128 16 16 +SET_CANV_TEX BLOCK 134 96 128 16 16 +SET_CANV_TEX BLOCK 135 112 128 16 16 +SET_CANV_TEX BLOCK 136 128 128 16 16 +SET_CANV_TEX BLOCK 137 144 128 16 16 +SET_CANV_TEX BLOCK 138 160 128 16 16 +SET_CANV_TEX BLOCK 139 176 128 16 16 +SET_CANV_TEX BLOCK 140 192 128 16 16 +SET_CANV_TEX BLOCK 141 208 128 16 16 +SET_CANV_TEX BLOCK 142 224 128 16 16 +SET_CANV_TEX BLOCK 143 240 128 16 16 + + +LOAD_TEX gui/items.png + +SET_CANV_TEX ITEM 0 0 0 16 16 +SET_CANV_TEX ITEM 1 16 0 16 16 +SET_CANV_TEX ITEM 2 32 0 16 16 +SET_CANV_TEX ITEM 3 48 0 16 16 +SET_CANV_TEX ITEM 4 64 0 16 16 +SET_CANV_TEX ITEM 5 80 0 16 16 +SET_CANV_TEX ITEM 6 96 0 16 16 +SET_CANV_TEX ITEM 7 112 0 16 16 +SET_CANV_TEX ITEM 8 128 0 16 16 +SET_CANV_TEX ITEM 9 144 0 16 16 +SET_CANV_TEX ITEM 10 160 0 16 16 +SET_CANV_TEX ITEM 11 176 0 16 16 +SET_CANV_TEX ITEM 12 192 0 16 16 +SET_CANV_TEX ITEM 13 208 0 16 16 +SET_CANV_TEX ITEM 14 224 0 16 16 +SET_CANV_TEX ITEM 15 240 0 16 16 + +SET_CANV_TEX ITEM 16 0 16 16 16 +SET_CANV_TEX ITEM 17 16 16 16 16 +SET_CANV_TEX ITEM 18 32 16 16 16 +SET_CANV_TEX ITEM 19 48 16 16 16 +SET_CANV_TEX ITEM 20 64 16 16 16 +SET_CANV_TEX ITEM 21 80 16 16 16 +SET_CANV_TEX ITEM 22 96 16 16 16 +SET_CANV_TEX ITEM 23 112 16 16 16 +SET_CANV_TEX ITEM 24 128 16 16 16 +SET_CANV_TEX ITEM 25 144 16 16 16 +SET_CANV_TEX ITEM 26 160 16 16 16 +SET_CANV_TEX ITEM 27 176 16 16 16 +SET_CANV_TEX ITEM 28 192 16 16 16 +SET_CANV_TEX ITEM 29 208 16 16 16 +SET_CANV_TEX ITEM 30 224 16 16 16 +SET_CANV_TEX ITEM 31 240 16 16 16 + +SET_CANV_TEX ITEM 32 0 32 16 16 +SET_CANV_TEX ITEM 33 16 32 16 16 +SET_CANV_TEX ITEM 34 32 32 16 16 +SET_CANV_TEX ITEM 35 48 32 16 16 +SET_CANV_TEX ITEM 36 64 32 16 16 +SET_CANV_TEX ITEM 37 80 32 16 16 +SET_CANV_TEX ITEM 38 96 32 16 16 +SET_CANV_TEX ITEM 39 112 32 16 16 +SET_CANV_TEX ITEM 40 128 32 16 16 +SET_CANV_TEX ITEM 41 144 32 16 16 +SET_CANV_TEX ITEM 42 160 32 16 16 +SET_CANV_TEX ITEM 43 176 32 16 16 +SET_CANV_TEX ITEM 44 192 32 16 16 +SET_CANV_TEX ITEM 45 208 32 16 16 +SET_CANV_TEX ITEM 46 224 32 16 16 +SET_CANV_TEX ITEM 47 240 32 16 16 + +SET_CANV_TEX ITEM 48 0 48 16 16 +SET_CANV_TEX ITEM 49 16 48 16 16 +SET_CANV_TEX ITEM 50 32 48 16 16 +SET_CANV_TEX ITEM 51 48 48 16 16 +SET_CANV_TEX ITEM 52 64 48 16 16 +SET_CANV_TEX ITEM 53 80 48 16 16 +SET_CANV_TEX ITEM 54 96 48 16 16 +SET_CANV_TEX ITEM 55 112 48 16 16 +SET_CANV_TEX ITEM 56 128 48 16 16 +SET_CANV_TEX ITEM 57 144 48 16 16 +SET_CANV_TEX ITEM 58 160 48 16 16 +SET_CANV_TEX ITEM 59 176 48 16 16 +SET_CANV_TEX ITEM 60 192 48 16 16 +SET_CANV_TEX ITEM 61 208 48 16 16 +SET_CANV_TEX ITEM 62 224 48 16 16 +SET_CANV_TEX ITEM 63 240 48 16 16 + +SET_CANV_TEX ITEM 64 0 64 16 16 +SET_CANV_TEX ITEM 65 16 64 16 16 +SET_CANV_TEX ITEM 66 32 64 16 16 +SET_CANV_TEX ITEM 67 48 64 16 16 +SET_CANV_TEX ITEM 68 64 64 16 16 +SET_CANV_TEX ITEM 69 80 64 16 16 +SET_CANV_TEX ITEM 70 96 64 16 16 +SET_CANV_TEX ITEM 71 112 64 16 16 +SET_CANV_TEX ITEM 72 128 64 16 16 +SET_CANV_TEX ITEM 73 144 64 16 16 +SET_CANV_TEX ITEM 74 160 64 16 16 +SET_CANV_TEX ITEM 75 176 64 16 16 +SET_CANV_TEX ITEM 76 192 64 16 16 +SET_CANV_TEX ITEM 77 208 64 16 16 +SET_CANV_TEX ITEM 78 224 64 16 16 +SET_CANV_TEX ITEM 79 240 64 16 16 + +SET_CANV_TEX ITEM 80 0 80 16 16 +SET_CANV_TEX ITEM 81 16 80 16 16 +SET_CANV_TEX ITEM 82 32 80 16 16 +SET_CANV_TEX ITEM 83 48 80 16 16 +SET_CANV_TEX ITEM 84 64 80 16 16 +SET_CANV_TEX ITEM 85 80 80 16 16 +SET_CANV_TEX ITEM 86 96 80 16 16 +SET_CANV_TEX ITEM 87 112 80 16 16 +SET_CANV_TEX ITEM 88 128 80 16 16 +SET_CANV_TEX ITEM 89 144 80 16 16 +SET_CANV_TEX ITEM 90 160 80 16 16 +SET_CANV_TEX ITEM 91 176 80 16 16 +SET_CANV_TEX ITEM 92 192 80 16 16 +SET_CANV_TEX ITEM 93 208 80 16 16 +SET_CANV_TEX ITEM 94 224 80 16 16 +SET_CANV_TEX ITEM 95 240 80 16 16 + +SET_CANV_TEX ITEM 96 0 96 16 16 +SET_CANV_TEX ITEM 97 16 96 16 16 +SET_CANV_TEX ITEM 98 32 96 16 16 +SET_CANV_TEX ITEM 99 48 96 16 16 +SET_CANV_TEX ITEM 100 64 96 16 16 +SET_CANV_TEX ITEM 101 80 96 16 16 +SET_CANV_TEX ITEM 102 96 96 16 16 +SET_CANV_TEX ITEM 103 112 96 16 16 +SET_CANV_TEX ITEM 104 128 96 16 16 +SET_CANV_TEX ITEM 105 144 96 16 16 +SET_CANV_TEX ITEM 106 160 96 16 16 +SET_CANV_TEX ITEM 107 176 96 16 16 +SET_CANV_TEX ITEM 108 192 96 16 16 +SET_CANV_TEX ITEM 109 208 96 16 16 +SET_CANV_TEX ITEM 110 224 96 16 16 +SET_CANV_TEX ITEM 111 240 96 16 16 + +SET_CANV_TEX ITEM 112 0 112 16 16 +SET_CANV_TEX ITEM 113 16 112 16 16 +SET_CANV_TEX ITEM 114 32 112 16 16 +SET_CANV_TEX ITEM 115 48 112 16 16 +SET_CANV_TEX ITEM 116 64 112 16 16 + +RESET_TEX diff --git a/res/title/background.png b/res/title/background.png new file mode 100644 index 0000000000000000000000000000000000000000..958c66c73dac40d30c5b36e6bd8fd1110924a674 GIT binary patch literal 668 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 Hu0mjfcdvP_ literal 0 HcmV?d00001 diff --git a/res/title/splashes.txt b/res/title/splashes.txt new file mode 100644 index 0000000..8188470 --- /dev/null +++ b/res/title/splashes.txt @@ -0,0 +1,41 @@ +38 +It's a begin... +TEST +It's been a long time... +CORE! +Kernel panic: Fatal exception +DeaDSoftWare +02:14AM 29 August 1997 +DeaDDooMER +4815162342 +07.06.1997 +Almost open source! +32768 blocks. +Also try Minecraft! +Knee-deep in the dead! +DeaDSoftWare.Ru +Keep calm and play CaveCraft +Also try DooM 2D! +Made in USSR! +Only singleplayer! +Touch Screen compatible! +It's free! +Enjoy +CaveCraft.3dn.ru +Random splash! +Hello Notch! +20 GOTO 10! +LOL! +MOV AX, 0B800h; +Must have! +Jeb_ HOPKOMAH! +The cake is not a lie! +Made on MidletPascal! +Hell Machine of Dr. DooM! +New free bugs! +SoftWare is DeaD! +Have fun! +It's BETA! +At least 20% cooler! +Also try Galaxian: New Dimension! +§DPinkie watching for you! diff --git a/res/tools.cfg b/res/tools.cfg new file mode 100644 index 0000000..c19f962 --- /dev/null +++ b/res/tools.cfg @@ -0,0 +1,51 @@ +;Ôàéë èíèöèàëèçàöèè îïèñàíèÿ ñâîéñòâ ñòàíäàðòíîãî íàáîðà èíñòðóìåíòîâ CaveCraft + +;Óñòàíàâëèâàåì êîëè÷åñòâî èíñòðóìåíòîâ +RESET_TOOLS 28 + +;Îïèñàíèå êîìàíäû óñòàíîâêè èíñòðóìåíòà: +;SET_TOOL [id] [tool] [lvl] [speed] [damg] +;id - èäåíòèôèêàòîð èíñòðóìåíòà. +;tool - òèï èíñòðóìåíòà. +;lvl - óðîâåíü èíñòðóìåíòà. +;speed - ñêîðîñòü èíñòðóìåíòà. +;damg - óðîí íàíîñèìûé èíñòðóìåíòîì. + +;Null +SET_TOOL 0 0 0 0 1 +;Êèðêè +SET_TOOL 1 1 1 2 1 +SET_TOOL 2 1 2 3 1 +SET_TOOL 3 1 3 4 1 +SET_TOOL 4 1 5 6 1 +SET_TOOL 5 1 4 6 1 +;Ëîïàòû +SET_TOOL 6 2 1 2 1 +SET_TOOL 7 2 2 3 1 +SET_TOOL 8 2 3 4 1 +SET_TOOL 9 2 5 6 1 +SET_TOOL 10 2 4 6 1 +;Òîïîðû +SET_TOOL 11 3 1 2 1 +SET_TOOL 12 3 2 3 1 +SET_TOOL 13 3 3 4 1 +SET_TOOL 14 3 5 6 1 +SET_TOOL 15 3 4 6 1 +;Íîæíèöû +SET_TOOL 16 4 1 5 1 +;Ìå÷è +SET_TOOL 17 5 1 2 4 +SET_TOOL 18 5 2 3 5 +SET_TOOL 19 5 3 4 6 +SET_TOOL 20 5 5 6 7 +SET_TOOL 21 5 4 6 4 +;Óäî÷êà +SET_TOOL 22 0 0 0 1 +;Îãíèâî +SET_TOOL 23 0 0 0 1 +;Ìîòûãè +SET_TOOL 24 6 1 2 1 +SET_TOOL 25 6 2 3 1 +SET_TOOL 26 6 3 4 1 +SET_TOOL 27 6 5 6 1 +SET_TOOL 28 6 4 6 1 \ No newline at end of file diff --git a/res/vkeyboard.cfg b/res/vkeyboard.cfg new file mode 100644 index 0000000..6dc7150 --- /dev/null +++ b/res/vkeyboard.cfg @@ -0,0 +1,112 @@ +MAX_VKEYS 11 + +LOAD_TEX gui/touch.png +SET_CANV_TEX VKEY 0 32 96 32 32 +SET_CANV_TEX VKEY 1 0 0 32 32 +SET_CANV_TEX VKEY 2 32 0 32 32 +SET_CANV_TEX VKEY 3 64 0 32 32 +SET_CANV_TEX VKEY 4 0 32 32 32 +SET_CANV_TEX VKEY 5 32 32 32 32 +SET_CANV_TEX VKEY 6 64 32 32 32 +SET_CANV_TEX VKEY 7 0 64 32 32 +SET_CANV_TEX VKEY 8 32 64 32 32 +SET_CANV_TEX VKEY 9 64 64 32 32 +SET_CANV_TEX VKEY 10 0 96 32 32 +SET_CANV_TEX VKEY 11 64 96 32 32 + +RESET_TEX + +;SET_VKEY [id] [keycode] [x] [y] +STACK 2 + +;NUM 0 +;y:=getHeight-32 +PUSH $SCREEN_H +PUSH 32 +SUB +;x:=getWidth-64 +PUSH $SCREEN_W +PUSH 64 +SUB +SET_VKEY 0 48 POP POP + +;NUM 1 +PUSH $SCREEN_H +PUSH 96 +SUB +PUSH $SCREEN_W +PUSH 32 +SUB +SET_VKEY 1 49 POP POP + +;NUM 2 +PUSH $SCREEN_H +PUSH 96 +SUB +SET_VKEY 2 50 32 POP + +;NUM 3 +PUSH $SCREEN_H +PUSH 96 +SUB +PUSH $SCREEN_W +PUSH 64 +SUB +SET_VKEY 3 51 POP POP + +;NUM 4 +PUSH $SCREEN_H +PUSH 64 +SUB +SET_VKEY 4 52 0 POP + +;NUM 5 +PUSH $SCREEN_H +PUSH 96 +SUB +PUSH $SCREEN_W +PUSH 96 +SUB +SET_VKEY 5 53 POP POP + +;NUM 6 +PUSH $SCREEN_H +PUSH 64 +SUB +SET_VKEY 6 54 64 POP + +;NUM 7 +PUSH $SCREEN_H +PUSH 32 +SUB +PUSH $SCREEN_W +PUSH 32 +SUB +SET_VKEY 7 55 POP POP + +;NUM 8 +PUSH $SCREEN_H +PUSH 32 +SUB +SET_VKEY 8 56 32 POP + +;NUM 9 +PUSH $SCREEN_H +PUSH 32 +SUB +PUSH $SCREEN_W +PUSH 96 +SUB +SET_VKEY 9 57 POP POP + +;NUM * +SET_VKEY 10 42 0 0 + +;NUM # +PUSH $SCREEN_W +PUSH 32 +SUB +SET_VKEY 11 35 POP 0 + +STACK -1 + diff --git a/src/CAVE.mpsrc b/src/CAVE.mpsrc new file mode 100644 index 0000000..ccdef84 --- /dev/null +++ b/src/CAVE.mpsrc @@ -0,0 +1,3092 @@ +program CAVE; + +uses + sign, + jsr75i, + drop, + invui, + vars, + particles_store, + randoms, + memory, + worldgen, + canvas, + items, + safeload, + mob, + console, + effects, + particles, + keyboard, + maps, + phy, + utils, + func, + CellUI, + furnace, + player, + items_logic, + chest, + inv, + items_store, + video; + +const + version='BETA 9'; + version_map=8; + +var + keymode,updx,updy:integer; + seed,nextseed:integer; + free_ram:real; + + light:array [0..15] of image; + bg:array[0..1] of image; + osad:array [0..1,0..7] of image; + back:array [0..8] of image; + gui:array [0..34] of image; + tue:array [0..9] of image; + + sign_im:image; + sky:image; + sun:image; + moon:image; + moon_phase:integer; + toolus,toolind:integer; + osadki_ani:integer; + sd,sav_fl:string; + global_light:integer; + world_typ:integer; + float:image; + + msg:array [0..4] of string; + msg_time:array[0..4] of integer; + last_sleep_x,last_sleep_y:integer; + + ifminimap:boolean; + gt:integer; + + del,dt,time:integer; + + deb:boolean; + +procedure newworld; + var + ix,iy:integer; + begin + if nextseed=0 then seed:=getrelativetimems; else seed:=nextseed; + nextseed:=0; + srand(seed); + if world_typ=0 then genworld; + else + if world_typ=1 then genflat; + world_typ:=0; + player.setX(get_spawn_x*16+4); + player.setY(get_spawn_y*16); + pl_world:=0; + end; + +procedure drwrect(x,y,w,h,t:integer); + var + i:integer; + begin + for i:=0 to t do + drawrect(x+i,y+i,w-i*2,h-i*2); + end; + +procedure proc_fps; + begin + dt:=GetRelativeTimeMs - time; + time:=GetRelativeTimeMs; + fps:=1000/dt; + end; + +procedure maxfps; + begin + if fps0 then del:=del-1; + if fps>s_max_fps then if del<200 then del:=del+1; + delay(del); + end; + +procedure cleartextures; + var + no:image; + ix,iy,iz:integer; + begin + bg[0]:=no; + bg[1]:=no; + float:=no; + compas:=no; + for ix:=0 to 7 do clock[ix]:=no; + + {for ix:=0 to maxBlockTex do + begin + tex[ix]:=no; + tex8[ix]:=no; + end; + for ix:=0 to maxItemTex do + begin + item[ix]:=no; + item8[ix]:=no; + end;} + for ix:=0 to 8 do back[ix]:=no; + + player.freeSkin; + + for ix:=0 to 34 do + gui[ix]:=no; + + for ix:=0 to 9 do tue[ix]:=no; + + for ix:=0 to 7 do osad[0,ix]:=no; + for ix:=0 to 7 do osad[1,ix]:=no; + + for ix:=0 to 15 do light[ix]:=no; + + for ix:=0 to 7 do + begin + pr_1[ix]:=no; + pr_2[ix]:=no; + pr_3[ix]:=no; + pr_4[ix]:=no; + pr_5[ix]:=no; + end; + bubble:=no; + + for ix:=0 to 15 do + pr_boom[ix]:=no; + + mob.freeSkin; + + sky:=no; + + sun:=no; + moon:=no; + + sign_im:=no; + + for ix:=0 to CONST_MAX_CURS do + LoadCurImg(no, ix); + + //resetVirtualKeyboard(-1); + end; + +procedure create_msg(s:string); + var + i,t:integer; + begin + for i:=3 downto 0 do + begin + if i=0 then break; + msg_time[i]:=msg_time[i-1]; + msg[i]:=msg[i-1]; + end; + msg_time[0]:=getrelativetimems; + msg[0]:=s; + end; + +procedure loadtexture(path:string); + var + ix,iy,iz:integer; + im:image; + begin + cleartextures; + im:=ld_tex('background.png',path,'title/'); + for ix:=0 to 1 do + bg[ix]:=rotate_image_from_image(im,ix*16,0,16,16,0); + float:=ld_tex('float.png',path,'gui/'); + compas:=ld_tex('compass.png',path,'gui/'); + im:=ld_tex('clock.png',path,'gui/'); + for ix:=0 to 7 do + clock[ix]:=rotate_image_from_image(im,ix*16,0,16,16,0); + if load_back_tex then + begin + im:=ld_tex('back.png',path,''); + for ix:=0 to 8 do back[ix]:=rotate_image_from_image(im,ix*16,0,16,16,0); + end; + + player.loadSkin('char_ani.png', path); + mob.loadSkin(path); + + im:=ld_tex('gui.png',path,'gui/'); + gui[0]:=rotate_image_from_image(im,0,0,16,16,0); + LoadCurImg(gui[0], CUR_SELECT1); + gui[1]:=rotate_image_from_image(im,0,16,168,21,0); + gui[3]:=rotate_image_from_image(im,16,0,16,16,0); + LoadCurImg(gui[3], CUR_SELECT2); + gui[6]:=rotate_image_from_image(im,0,56,120,12,0); + gui[7]:=rotate_image_from_image(im,0,68,120,12,0); + gui[8]:=rotate_image_from_image(im,0,80,120,12,0); + gui[13]:=rotate_image_from_image(im,1,93,9,9,0);//hp + gui[14]:=rotate_image_from_image(im,12,93,9,9,0);//hp + gui[15]:=rotate_image_from_image(im,23,93,9,9,0);//hp + gui[17]:=rotate_image_from_image(im,120,56,18,18,0); + + gui[26]:=rotate_image_from_image(im,89,93,9,9,0);//hunger + gui[27]:=rotate_image_from_image(im,100,93,9,9,0);//hunger + gui[28]:=rotate_image_from_image(im,111,93,9,9,0);//hunger + + gui[29]:=rotate_image_from_image(im,67,93,9,9,0);//air + gui[30]:=rotate_image_from_image(im,78,93,9,9,0);//air + + gui[31]:=rotate_image_from_image(im,122,93,9,9,0);//hp hardcore + gui[32]:=rotate_image_from_image(im,133,93,9,9,0);//hp hardcore + gui[33]:=rotate_image_from_image(im,144,93,9,9,0);//hp hardcore + + gui[20]:=rotate_image_from_image(im,121,75,9,13,0); + gui[21]:=rotate_image_from_image(im,130,75,9,13,0); + gui[22]:=rotate_image_from_image(im,0,103,120,12,0); + + if load_minimap_tex then gui[16]:=ld_tex('mapbg.png',path,'gui/'); + + for ix:=0 to 9 do tue[ix]:=rotate_image_from_image(im,16*ix,40,16,16,0); + + if load_weather_tex then + begin + im:=ld_tex('rain.png',path,'terrain/'); + for ix:=0 to 7 do osad[0,ix]:=rotate_image_from_image(im,16*ix,0,16,16,0); + im:=ld_tex('snow.png',path,'terrain/'); + for ix:=0 to 7 do osad[1,ix]:=rotate_image_from_image(im,16*ix,0,16,16,0); + end; + + if load_light_tex then + begin + im:=ld_tex('light.png',path,'terrain/'); + for ix:=0 to 15 do light[ix]:=rotate_image_from_image(im,16*ix,0,16,16,0); + end; + + if load_particles_tex then + begin + im:=ld_tex('particles.png',path,'terrain/'); + for ix:=0 to 7 do + begin + pr_1[ix]:=rotate_image_from_image(im,8*ix,0,8,8,0); + pr_2[ix]:=rotate_image_from_image(im,8*ix,8,8,8,0); + pr_3[ix]:=rotate_image_from_image(im,8*ix,16,8,8,0); + pr_4[ix]:=rotate_image_from_image(im,8*ix,24,8,8,0); + pr_5[ix]:=rotate_image_from_image(im,8*ix,32,8,8,0); + end; + bubble:=rotate_image_from_image(im,0,40,8,8,0); + im:=ld_tex('explosion.png',path,'terrain/'); + for ix:=0 to 15 do + pr_boom[ix]:=rotate_image_from_image(im,32*ix,0,32,32,0); + end; + + im:=ld_tex('partition.png',path,'gui/'); + gui[18]:=rotate_image_from_image(im,0,0,84,42,0); + gui[19]:=rotate_image_from_image(im,0,42,4,4,0); + + if load_sky_siz<=0 then + sky:=ld_tex('sky.png',path,'terrain/'); + else + sky:=resize_image(ld_tex('sky.png',path,'terrain/'),load_sky_siz,2); + + if load_sm=1 then + begin + sun:=ld_tex('sun.png',path,'terrain/'); + moon:=ld_tex('moon_phase_0.png',path,'terrain/moon_phases/'); + end; else + if load_sm=2 then + begin + sun:=resize_image(ld_tex('sun.png',path,'terrain/'),(getWidth+getHeight)/5,(getWidth+getHeight)/5); + moon:=resize_image(ld_tex('moon_phase_0.png',path,'terrain/moon_phases/'),(getWidth+getHeight)/5,(getWidth+getHeight)/5); + end; + + //load_virt_tex(ld_tex('touch.png',path,'gui/')); + end; + +procedure cleargame; + var + ix,iy:integer; + begin + jmp:=false; + keymode:=0; + updx:=0; + updy:=0; + toolus:=0; + toolind:=0; + osadki_ani:=0; + global_light:=15; + pl_world:=0; + + camx:=0; + camy:=0; + curx:=0; + cury:=0; + + player.setX(0); + player.setY(0); + last_sleep_x:=0; + last_sleep_y:=0; + + fly:=false; + game_time:=0; + clock_stage:=0; + hp:=20; + hunger:=20; + air:=21; + moon_phase:=0; + posi:=0; + velx:=0; + vely:=0; + invslot:=0; + + osadki:=false; + + //anim_del2:=0; + + inv.resetData; + + chest.resetData; + + {for ix:=0 to 15 do + begin + b_furnace[ix]:=false; + for iy:=0 to 4 do + begin + furnace[ix,iy].item_i:=0; + furnace[ix,iy].sum_i:=0; + furnace_gg[ix].f_gor:=15; + furnace_gg[ix].fire_time:=0; + furnace_gg[ix].f_got:=0; + furnace_gg[ix].got_time:=0; + end; + end;} + + drop.resetData; + + mob.resetData; + + //gb_up_pa:=0; + reset_particles(max_particles+1); + + for ix:=0 to 255 do + begin + setBackMap(0, ix); + setBiomMap(0, ix); + for iy:=0 to 127 do + begin + setmap(0,ix,iy); + setmapinfo(0,ix,iy); + setmaplight(0,ix,iy); + end; + end; + + for ix:=0 to 31 do + begin + b_sign[ix]:=false; + t_sign[ix]:=''; + end; + + for ix:=0 to CONST_MAX_LAYERS do + ClearLayer(ix); + end; + +procedure drw_load_line(s:string;percent:integer); + var + ix,iy:integer; + begin + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + drawfonttext(s,(getWidth/2)-(length(s)*8/2),(getHeight/2)-8); + setcolor(128,128,128); + fillrect(getwidth/2-50,getheight/2+6,100,3); + setcolor(128,255,128); + fillrect(getwidth/2-50,getheight/2+6,percent,3); + drawfonttext(integertostring(percent)+'%',getwidth/2-(length(integertostring(percent)+'%')*8)/2,getheight/2+12); + drawVideo; + end; + +function getFlatMap(i:integer):integer; + var + ix, iy:integer; + begin + iy:=i div 256; + ix:=i-iy*256; + getFlatMap:=getmap(ix,iy); + end; + +procedure setFlatMap(n, i:integer); + var + ix, iy:integer; + begin + iy:=i div 256; + ix:=i-iy*256; + setmap(n,ix,iy); + end; + +function getFlatMapInfo(i:integer):integer; + var + ix, iy:integer; + begin + iy:=i div 256; + ix:=i-iy*256; + getFlatMapInfo:=getmapinfo(ix,iy); + end; + +procedure setFlatMapInfo(n, i:integer); + var + ix, iy:integer; + begin + iy:=i div 256; + ix:=i-iy*256; + setmapinfo(n,ix,iy); + end; + +procedure SaveMapRLE; + var + i:integer; + id, s:integer; + begin + repeat + id:=getFlatMap(i); + for s:=0 to 255 do + if (id<>getFlatMap(i+s)) or (i+s>32767) then + break; + + write_byte(id); + write_byte(s-1); + + i:=i+s; + until i>32767; + end; + +procedure SaveMapInfoRLE; + var + i:integer; + id, s:integer; + begin + repeat + id:=getFlatMapInfo(i); + for s:=0 to 255 do + if (id<>getFlatMapInfo(i+s)) or (i+s>32767) then + break; + + write_byte(id); + write_byte(s-1); + + i:=i+s; + until i>32767; + end; + +procedure LoadMapRLE; + var + i:integer; + id, s, j:integer; + begin + repeat + id:=read_byte; + s:=read_byte; + for j:=0 to s do + setFlatMap(id, i+j); + + i:=i+s+1; + until i>32767; + end; + +procedure LoadMapInfoRLE; + var + i:integer; + id, s, j:integer; + begin + repeat + id:=read_byte; + s:=read_byte; + for j:=0 to s do + setFlatMapInfo(id, i+j); + + i:=i+s+1; + until i>32767; + end; + +procedure saveworld(path:string); + var + ix,iy:integer; + world_name:string; + begin + if pl_world=0 then world_name:='world.sav'; + else + if pl_world=1 then world_name:='nether.sav'; + if file_exists(path)<>1 then if create_folder(path)=1 then debug('Folder created!'); + if file_exists(path+world_name)>0 then delete_file(path+world_name); + if file_exists(path+world_name)<>1 then file_create(path+world_name); + if open_file(path+world_name)=1 then + begin + writeint(player.getX); + writeint(player.getX); + //Matrix + //Matrix + SaveMapRLE; + SaveMapInfoRLE; + drw_load_line('Background',50); + //Background and biomes + for ix:=0 to 255 do + begin + write_byte(getBackMap(ix)); + write_byte(getBiomMap(ix)); + end; + drw_load_line('Chests',55); + //Chests + chest.saveData; + drw_load_line('Furnaces',60); + //Furnaces + /* for ix:=0 to 15 do + begin + writebool(b_furnace[ix]); + writeint(furnace_gg[ix].f_gor); + writeint(furnace_gg[ix].f_got); + for iy:=0 to 4 do + begin + write_byte(furnace[ix,iy].item_i); + writeint(furnace[ix,iy].sum_i); + end; + end;*/ + drw_load_line('Mobs',70); + //Mobs + mob.saveData; + drw_load_line('Drop',80); + //Drop + drop.saveData; + drw_load_line('Particles',85); + //Particles + writeint(max_particles); + write_byte(gb_up_pa); + for ix:=0 to max_particles do + begin + write_byte(get_particle_type(ix)); + write_byte(get_particle_ani(ix)); + writeint(get_particle_x(ix)); + writeint(get_particle_y(ix)); + end; + drw_load_line('Other',90); + //Other + write_byte(updx); + write_byte(updy); + writebool(osadki); + write_byte(osadki_ani); + write_byte(global_light); + writebool(fly); + writeint(game_time); + write_byte(clock_stage); + for ix:=0 to 31 do + begin + writebool(b_sign[ix]); + writestr(t_sign[ix]); + end; + flush; + drw_load_line('Ready',100); + if close_file(path+world_name)=1 then debug('World Saved!'); + end; + end; + +procedure savegame(path:string); + var + ix,iy:integer; + begin + drw_load_line('Basic',0); + if file_exists(path+'player.dat')=1 then delete_file(path+'player.dat'); + if file_exists(path)<>1 then if create_folder(path)=1 then debug('Folder created!'); + if file_exists(path+'player.dat')<>1 then file_create(path+'player.dat'); + if open_file(path+'player.dat')=1 then + begin + //Head + write_byte(version_map); + write_byte(gamemode); + writebool(cheats); + writeint(seed); + write_byte(pl_world); + //Player + writeint(last_sleep_x); + writeint(last_sleep_y); + write_byte(velx); + write_byte(vely); + write_byte(invslot); + write_byte(posi); + write_byte(hp); + write_byte(hunger); + write_byte(moon_phase); + writebool(jmp); + inv.saveData; + if close_file(path+'player.dat')=1 then debug('Saved!'); + drw_load_line('Matrix',10); + saveworld(path); + end; +end; + + +function version_err(ver:integer):boolean; + var + ix,iy:integer; + begin + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + begin + drawimage(bg[0],ix*16,iy*16); + end; + if version_map=ver then version_err:=true; else + if version_map>ver then + begin + drawfonttext('Old save format!',(getWidth/2)-60,(getHeight/2)-4); + drawVideo; + delay(3000); + version_err:=false; + end; else + if version_map-1 do + begin + pars:=pos(rr,'|'); + roots[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + repeat + updateKeys; + if clickedKey(KEY_FM_UP) then begin m_cur:=m_cur-1; if m_cur<0 then m_cur:=max_r; end; + if clickedKey(KEY_FM_DOWN) then begin m_cur:=m_cur+1; if m_cur>max_r then m_cur:=0; end; + if clickedKey(KEY_FM_SELECT) then + begin + if (m_cur=0) and (cancel_b) then + begin + getroot:=''; + exit; + end; + else + begin + getroot:=roots[m_cur]; + exit; + end; + end; + + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(im,ix*16,iy*16); + + setcolor(0,0,0); + fillrect(0,m_cur*8,getWidth-1,8); + for ix:=0 to max_r do + begin + drawfonttext(roots[ix],0,ix*8); + end; + setcolor(255,255,255); + drawrect(0,m_cur*8,getWidth-1,8); + + drawVideo; + delay(1); + until false; + end; + +function filemanager(cancel_b:boolean):string; + var + m_cur,ix,iy,max_r,pars:integer; + im:image; + last,rr,root,path:string; + names:array [0..255] of string; + begin + im:=rotate_image_from_image(ld_tex('background.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','title/'),16,0,16,16,0); + names[0]:='<..>'; + names[1]:=''; + root:=getroot(cancel_b); + if root='' then + begin + filemanager:=''; + exit; + end; + path:=root; + if cancel_b then names[2]:=''; + rr:=get_dirs(path); + if cancel_b then max_r:=3; else max_r:=2; + while pos(rr,'|')<>-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + + repeat + updateKeys; + if clickedKey(KEY_FM_UP) then begin m_cur:=m_cur-1; if m_cur<0 then m_cur:=max_r; end; + if clickedKey(KEY_FM_DOWN) then begin m_cur:=m_cur+1; if m_cur>max_r then m_cur:=0; end; + if clickedKey(KEY_FM_SELECT) then + begin + if m_cur=0 then + begin + debug('path:'+path); + debug('lol:'+pos_end(path,'/')); + if (path=root) or (path=root+'/') then + begin + root:=getroot(cancel_b); + if root='' then + begin + filemanager:=''; + exit; + end; + path:=root; + end; + else + begin + path:=copy(path,0,pos_end(path,'/')); + if cancel_b then names[2]:=''; + rr:=get_dirs(path); + if cancel_b then max_r:=3; else max_r:=2; + while pos(rr,'|')<>-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + end; + end; else + if m_cur=1 then + begin + debug(''); + filemanager:=path; + exit; + end; else + if (m_cur=2) and (cancel_b) then + begin + debug(''); + filemanager:=''; + exit; + end; else + begin + path:=path+'/'+names[m_cur]; + + if cancel_b then names[2]:=''; + rr:=get_dirs(path); + if cancel_b then max_r:=3; else max_r:=2; + while pos(rr,'|')<>-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + m_cur:=0; + debug('path:'+path); + end; + end; + + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(im,ix*16,iy*16); + + setcolor(0,0,0); + fillrect(0,m_cur*8,getWidth-1,8); + for ix:=0 to max_r do + begin + drawfonttext(names[ix],0,ix*8); + end; + setcolor(255,255,255); + drawrect(0,m_cur*8,getWidth-1,8); + + drawVideo; + delay(1); + + until false; + end; + +procedure setsd(cancel_b:boolean); + var + s:string; + t:integer; + rs:recordstore; + begin + s:=filemanager(cancel_b); + if s<>'' then + begin + sd:=s; + if file_exists('/'+sd+'/cavecraft')<>1 then + if create_folder('/'+sd+'/cavecraft')=1 then debug('/cavecraft created!'); + + if file_exists('/'+sd+'/cavecraft/saves')<>1 then + if create_folder('/'+sd+'/cavecraft/saves')=1 then debug('/saves created!'); + + if file_exists('/'+sd+'/cavecraft/screenshots')<>1 then + if create_folder('/'+sd+'/cavecraft/screenshots')=1 then debug('/screenshots created!'); + + if file_exists('/'+sd+'/cavecraft/texturepacks')<>1 then + if create_folder('/'+sd+'/cavecraft/texturepacks')=1 then debug('/texturepacks created!'); + + deleteRecordStore('SD'); + rs:=openRecordStore('SD'); + t:=addRecordStoreEntry(rs,sd); + closeRecordStore(rs); + end; + end; + +procedure start_uu; + var + rs:recordstore; + ss:string; + begin + drawdeadlogo; + //Load SD + rs:=openRecordStore('SD'); + sd:=readRecordStoreEntry(rs,1); + closeRecordStore(rs); + console.exec('autoexec.cfg', 'AUTO', true); + if sd='' then + begin + init_touch; + if touchscreen then + load_key_tex:=1; + else + load_key_tex:=0; + //load_virt_tex(loadimage('/gui/touch.png')); + setsd(false); + end; + + if file_exists('/'+sd+'/cavecraft')<>1 then + if create_folder('/'+sd+'/cavecraft')=1 then debug('/cavecraft created!'); + + if file_exists('/'+sd+'/cavecraft/saves')<>1 then + if create_folder('/'+sd+'/cavecraft/saves')=1 then debug('/saves created!'); + + if file_exists('/'+sd+'/cavecraft/screenshots')<>1 then + if create_folder('/'+sd+'/cavecraft/screenshots')=1 then debug('/screenshots created!'); + + if file_exists('/'+sd+'/cavecraft/texturepacks')<>1 then + if create_folder('/'+sd+'/cavecraft/texturepacks')=1 then debug('/texturepacks created!'); + + rs:=openRecordStore('TX'); + ss:=readRecordStoreEntry(rs,1); + closeRecordStore(rs); + + if ss<>'' then + begin + tex_pack:=ss; + LoadDrawFont('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/'); + loadtexture('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/'); + end; + else + begin + LoadDrawFont('/'); + loadtexture('/'); + end; + end; + +function question(text:string):boolean; + var + ix,iy,m_cur:integer; + begin + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then begin m_cur:=m_cur-1; if m_cur<0 then m_cur:=1; end; + if clickedKey(KEY_MENU_DOWN) then begin m_cur:=m_cur+1; if m_cur>1 then m_cur:=0; end; + if clickedKey(KEY_MENU_SELECT) then begin if m_cur=0 then question:=true; else question:=false; exit; end; + for ix:=0 to getwidth/16 do for iy:=0 to getheight/16 do drawimage(bg[0],ix*16,iy*16); + drawfonttext(text,getwidth/2-(length(text)*8)/2,getheight/2-16); + drw_btn('Yes',0,m_cur,0,1); + drw_btn('No',1,m_cur,0,1); + drawVideo; + delay(1); + until false; + end; + +function menu_game_new:boolean; + var + m_cur,tmp_gm,ix,iy,lol:integer; + tmp_cheats,tmp_bon_chest:boolean; + newgametxt:array[0..4] of string; + name,tmp:string; + begin + m_cur:=-2; + newgametxt[0]:='Survival'; + newgametxt[1]:='Creative'; + newgametxt[2]:='Hardcore'; + newgametxt[3]:='Normal'; + newgametxt[4]:='Flat'; + name:='New World'; + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then begin m_cur:=m_cur-1; if m_cur<-2 then m_cur:=5; end; + if clickedKey(KEY_MENU_DOWN) then begin m_cur:=m_cur+1; if m_cur>5 then m_cur:=-2; end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=-2 then + begin + name:=gettext('Name:',name,10,TF_ANY); + end; else + if m_cur=-1 then + begin + tmp_gm:=tmp_gm+1; if tmp_gm>2 then tmp_gm:=0; + if tmp_gm=0 then tmp_cheats:=false; + if tmp_gm=1 then tmp_cheats:=true; + if tmp_gm=2 then begin tmp_cheats:=false; tmp_bon_chest:=false; end; + end; else + if m_cur=0 then + begin + nextseed:=stringtointeger(gettext('Seed:',''+nextseed,10,TF_NUMERIC)); + end; else + if m_cur=1 then + begin + world_typ:=world_typ+1; + if world_typ>1 then world_typ:=0; + end; else + if m_cur=2 then + begin + if tmp_gm<2 then tmp_cheats:= not tmp_cheats; + end; else + if m_cur=3 then + begin + if tmp_gm<2 then tmp_bon_chest:= not tmp_bon_chest; + end; else + if m_cur=4 then + begin + gamemode:=tmp_gm; + cheats:=tmp_cheats; + bon_chest:=tmp_bon_chest; + tmp:=name; + while file_exists('/'+sd+'/cavecraft/saves/'+name)=1 do + begin + lol:=lol+1; + name:=tmp+' '+lol; + end; + sav_fl:=name; + newgame; + menu_game_new:=true; + break; + end; else + if m_cur=5 then + begin + break; + end; else + end; + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + drw_btn('Name:'+name,-2,m_cur,0,1); + drw_btn('Mode:'+newgametxt[tmp_gm],-1,m_cur,0,1); + drw_btn('Seed:'+nextseed,0,m_cur,0,1); + drw_btn('Type:'+newgametxt[world_typ+3],1,m_cur,0,1); + if tmp_gm<2 then + drw_btn('Cheats:'+tmp_cheats,2,m_cur,0,1); + else + drw_btn('Cheats:'+tmp_cheats,2,m_cur,0,0); + if tmp_gm<2 then + drw_btn('Chest:'+tmp_bon_chest,3,m_cur,0,1); + else + drw_btn('Chest:'+tmp_bon_chest,3,m_cur,0,0); + drw_btn('Create',4,m_cur,0,1); + drw_btn('Cancel',5,m_cur,0,1); + + drawVideo; + delay(1); + until false; + end; + +procedure deleteworld(path:string); + begin + if file_exists(path+'player.dat')=1 then delete_file(path+'player.dat'); + if file_exists(path+'world.sav')=1 then delete_file(path+'world.sav'); + if file_exists(path+'nether.sav')=1 then delete_file(path+'nether.sav'); + if file_exists(path+'pic.png')=1 then delete_file(path+'pic.png'); + if file_exists(path)=1 then delete_file(path); + if file_exists(path)=0 then debug('World deleted!'); + end; + +function menu_game:boolean; + var + ix,iy,pars,max_r,cur_name,m_cur:integer; + mm_t_b:boolean; + im_game:image; + rr:string; + names:array[0..255] of string; + begin + rr:=get_dirs('/'+sd+'/cavecraft/saves/'); + while pos(rr,'|')<>-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + if file_exists('/'+sd+'/cavecraft/saves/'+names[max_r]+'/player.dat')=1 then max_r:=max_r+1; + end; + max_r:=max_r-1; + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png')=1 then + im_game:=safely_load_image_fs('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png'); + else im_game:=ld_tex('maps.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',''); + + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/player.dat')=1 then + mm_t_b:=true; else mm_t_b:=false; + + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then + begin + m_cur:=m_cur-1; + if m_cur<0 then m_cur:=3; + end; + if clickedKey(KEY_MENU_DOWN) then + begin + m_cur:=m_cur+1; + if m_cur>3 then m_cur:=0; + end; + + if clickedKey(KEY_MENU_LEFT) then + begin + cur_name:=cur_name-1; + if cur_name<0 then cur_name:=0; + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png')=1 then + im_game:=safely_load_image_fs('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png'); + else im_game:=ld_tex('maps.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',''); + + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/player.dat')=1 then + end; + if clickedKey(KEY_MENU_RIGHT) then + begin + cur_name:=cur_name+1; + if cur_name>max_r then cur_name:=max_r; + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png')=1 then + im_game:=safely_load_image_fs('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png'); + else im_game:=ld_tex('maps.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',''); + + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/player.dat')=1 then + end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=0 then + begin + if max_r>-1 then + if loadgame('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/') then + begin + sav_fl:=names[cur_name]; + menu_game:=true; + break; + end; + end; else + if m_cur=1 then + begin + if menu_game_new then begin menu_game:=true; break; end; + end; else + if m_cur=2 then + begin + debug('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/'); + if max_r>-1 then + if question('Are you sure?')=true then deleteworld('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/'); + cur_name:=0; + max_r:=0; + rr:=get_dirs('/'+sd+'/cavecraft/saves/'); + while pos(rr,'|')<>-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + if file_exists('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png')=1 then + im_game:=safely_load_image_fs('/'+sd+'/cavecraft/saves/'+names[cur_name]+'/pic.png'); + else im_game:=ld_tex('maps.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',''); + end; else + if m_cur=3 then + begin + break; + end; + end; + + for ix:=0 to getWidth/16 do + for iy:=1 to 7 do + drawimage(bg[1],ix*16,iy*16); + for ix:=0 to getWidth/16 do + drawimage(bg[0],ix*16,0); + for ix:=0 to getWidth/16 do + for iy:=8 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + if max_r>-1 then + begin + setcolor(0,0,0); + fillrect(32,24,getWidth-64,96); + setclip(32,24,getWidth-64,96); + drawimage(im_game,(getWidth/2)-(32),32); + drawfonttext(names[cur_name],(getWidth/2)-(length(names[cur_name])*8/2),104); + setclip(0,0,getWidth,getHeight); + setcolor(128,128,128); + drawrect(32,24,getWidth-64,96); + if cur_name>0 then drawimage(gui[20],0,58); + if cur_name-1 do + begin + pars:=pos(rr,'|'); + names[max_r]:=copy(rr,0,pars-1); + rr:=copy(rr,pars+1,length(rr)); + max_r:=max_r+1; + end; + max_r:=max_r-1; + im_game:=loadimage('/pack.png'); + + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then + begin + m_cur:=m_cur-1; + if m_cur<0 then m_cur:=1; + end; + if clickedKey(KEY_MENU_DOWN) then + begin + m_cur:=m_cur+1; + if m_cur>1 then m_cur:=0; + end; + + if clickedKey(KEY_MENU_LEFT) then + begin + cur_name:=cur_name-1; + if cur_name<0 then cur_name:=0; + im_game:=ld_tex('pack.png','/'+sd+'/cavecraft/texturepacks/'+names[cur_name]+'/',''); + end; + if clickedKey(KEY_MENU_RIGHT) then + begin + cur_name:=cur_name+1; + if cur_name>max_r then cur_name:=max_r; + im_game:=ld_tex('pack.png','/'+sd+'/cavecraft/texturepacks/'+names[cur_name]+'/',''); + end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=0 then begin + if cur_name>0 then + begin + tex_pack:=names[cur_name]; + LoadDrawFont('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/'); + loadtexture('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/'); + deleteRecordStore('TX'); + rs:=openRecordStore('TX'); + t:=addRecordStoreEntry(rs,tex_pack); + closeRecordStore(rs); + end; + else + begin + tex_pack:=''; + loadtexture('/'); + deleteRecordStore('TX'); + rs:=openRecordStore('TX'); + t:=addRecordStoreEntry(rs,''); + closeRecordStore(rs); + end; + end; + if m_cur=1 then break; + break; + end; + + for ix:=0 to getWidth/16 do + for iy:=1 to 7 do + drawimage(bg[1],ix*16,iy*16); + for ix:=0 to getWidth/16 do + drawimage(bg[0],ix*16,0); + for ix:=0 to getWidth/16 do + for iy:=8 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + if max_r>-1 then + begin + setcolor(0,0,0); + fillrect(32,24,getWidth-64,96); + setclip(32,24,getWidth-64,96); + drawimage(im_game,(getWidth/2)-(32),32); + drawfonttext(names[cur_name],(getWidth/2)-(length(names[cur_name])*8/2),104); + setclip(0,0,getWidth,getHeight); + setcolor(128,128,128); + drawrect(32,24,getWidth-64,96); + if cur_name>0 then drawimage(gui[20],0,58); + if cur_name5 then m_cur:=-3; + end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=-3 then + begin + light_type:=light_type+1; + if light_type>2 then light_type:=0; + end; else + if m_cur=-2 then + begin + ifosad:=not ifosad; + end; else + if m_cur=-1 then + begin + s_particles:=not s_particles; + end; else + if m_cur=0 then + begin + drawgui:=not drawgui; + end; else + if m_cur=1 then + begin + if question('Are you sure?')=true then + begin + if load_key_tex=0 then + begin + load_key_tex:=1; + init_touch; + //load_virt_tex(ld_tex('touch.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/')); + end; + else + if load_key_tex=1 then + begin + load_key_tex:=0; + resetVirtualKeyboard(-1); + end; + end; + end; + if m_cur=2 then + begin + s_jpeg_quality:=stringtointeger(gettext('JPEG quality:',''+s_jpeg_quality,3,TF_NUMERIC)); + if s_jpeg_quality>100 then s_jpeg_quality:=100; else + if s_jpeg_quality<0 then s_jpeg_quality:=0; + end; else + if m_cur=3 then + begin + setsd(true); + end; else + if m_cur=4 then + begin + deleteRecordStore('S'); + deleteRecordStore('SD'); + deleteRecordStore('TX'); + halt; + end; else + if m_cur=5 then + begin + save_settings; + break; + end; else + end; + + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + drw_btn('Light:'+light_type,-3,m_cur,0,1); + drw_btn('Weather:'+ifosad,-2,m_cur,0,1); + drw_btn('Particles:'+s_particles,-1,m_cur,0,1); + drw_btn('Hide GUI:'+not drawgui,0,m_cur,0,1); + drw_btn('Touch:'+(load_key_tex>0),1,m_cur,0,1); + drw_btn('JPEG:'+s_jpeg_quality,2,m_cur,0,1); + drw_btn('Set Root',3,m_cur,0,1); + drw_btn('Reset',4,m_cur,0,1); + drw_btn('Back',5,m_cur,0,1); + + drawVideo; + delay(1); + until false; + end; + +procedure menu_help; + var + ix,iy,cur:integer; + begin + repeat + updateKeys; + if clickedKey(KEY_MENU_SELECT) then break; + if pressedKey(KEY_MENU_UP) then cur:=cur+1; + if pressedKey(KEY_MENU_DOWN) then cur:=cur-1; + + for ix:=0 to getWidth/16 do + for iy:=2 to (getHeight/16)-2 do + drawimage(bg[1],ix*16,iy*16); + + for ix:=0 to getWidth/16 do + for iy:=0 to 1 do + drawimage(bg[0],ix*16,iy*16); + + for ix:=0 to getWidth/16 do + for iy:=(getHeight/16)-2 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + setclip(0,32,getWidth,(getHeight/16-4)*16); + + drw_txt('Controls:',cur,0,1); + drw_txt('Left - Move left',cur,1,0); + drw_txt('Right - Move right',cur,2,0); + drw_txt('Up - Jump',cur,3,0); + drw_txt('Down - Put a block under you',cur,4,0); + drw_txt('1 - Inventory',cur,5,0); + drw_txt('Duble 1 - Craft',cur,6,0); + drw_txt('3 - Use block',cur,7,0); + drw_txt('7 - Debug info',cur,8,0); + drw_txt('Hold 7 - Console',cur,9,0); + drw_txt('9 - Pause',cur,10,0); + drw_txt('*, # - Browse inventory',cur,11,0); + drw_txt('0 - Edit mode',cur,12,0); + + drw_txt('In inventory/chest:',cur,14,1); + drw_txt('3 - Enject object',cur,15,0); + drw_txt('Hold 3 - Enject stack',cur,16,0); + drw_txt('5 - Move the stack',cur,17,0); + drw_txt('Hold 5 - Divide stack',cur,18,0); + + setclip(0,0,getWidth,getHeight); + + drw_btn('Back',0,0,getHeight-getHeight/2-16-6,1); + + drawVideo; + delay(1); + until false; + end; + +procedure menu_about; + var + ix,iy,cur:integer; + begin + repeat + updateKeys; + if clickedKey(KEY_MENU_SELECT) then break; + if pressedKey(KEY_MENU_UP) then cur:=cur+1; + if pressedKey(KEY_MENU_DOWN) then cur:=cur-1; + + for ix:=0 to getWidth/16 do + for iy:=2 to (getHeight/16)-2 do + drawimage(bg[1],ix*16,iy*16); + + for ix:=0 to getWidth/16 do + for iy:=0 to 1 do + drawimage(bg[0],ix*16,iy*16); + + for ix:=0 to getWidth/16 do + for iy:=(getHeight/16)-2 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + + setclip(0,32,getWidth,(getHeight/16-4)*16); + + drw_txt('Developers:',cur,0,1); + drw_txt(#68+#101+#97+#68+#68+#111+#111+#77+#69+#82+' - Programmer',cur,1,0);//dead + drw_txt(#102+#114+#101+#100+#45+#98+#111+#121+' - Programmer',cur,2,0);//fred-boy + drw_txt(#65+#110+#100+#114+#101+#121+#53+#57+' - Programmer',cur,3,0);//andrey59 + drw_txt(#89+#117+#82+#97+#78+#110+#78+#122+#90+#90+' - Artist',cur,4,0);//yura + drw_txt(#83+#97+#115+#104+#97+#71+' - Artist and idea generator',cur,5,0);//sasha + drw_txt(#66+#97+#74+#108+#101+#72+#84+#105+#72+' - Artist and tester',cur,6,0);//valentin + drw_txt(#65+#103+#114+#101+#115+#115+#111+#82+' - Tester',cur,7,0);//agressor + drw_txt(#118+#111+#108+#121+#97+#95+#110+#97+#115+#116+#97+#110+#101+' - Tester',cur,8,0);//volya + drw_txt(#97+#98+#97+#100+#111+#110+' - Tester',cur,9,0);//abadon + drw_txt(#77+#111+#110+#111+#103+#114+#111+#109+' - Tester',cur,10,0);//monogrom + drw_txt(#75+#97+#108+#116+#101+#114+' - Tester',cur,11,0);//kalter + + drw_txt('Thanks:',cur,12,1); + drw_txt('Piligrim and 0vZ - Lib_jsr75i',cur,13,0); + drw_txt('Piligrim - Lib_effects',cur,14,0); + drw_txt('Kurdt - Lib_canvas',cur,15,0); + drw_txt('ViNT - Lib_png and Lib_bmp',cur,16,0); + drw_txt('aleshka - Lib_jpeg',cur,17,0); + drw_txt('Roman_V - Lib_safeload',cur,18,0); + + drw_txt('Site: '+#104+#116+#116+#112+#58+#47+#47+#100+#101+#97+#100+#115+#111+#102+#116+#119+#97+#114+#101+#46+#114+#117,cur,21,0); + drw_txt(#68+#101+#97+#68+#83+#111+#102+#116+#87+#97+#114+#101+' 2012-'+getyear(getcurrenttime),cur,22,0); + + drw_txt('Hello! :D',cur,100,1); + + setclip(0,0,getWidth,getHeight); + + drw_btn('Back',0,0,getHeight-getHeight/2-16-6,1); + + drawVideo; + delay(1); + until false; + end; + +function sm_siz:integer; + begin + sm_siz:=(getWidth+getHeight)/5; + end; + +function sm_siz4:integer; + begin + sm_siz4:=sm_siz/4; + end; + +procedure draw_menu_back; + var + ix, iy:integer; + begin + for ix:=0 to getWidth/16 do + for iy:=0 to getHeight/16 do + drawimage(bg[0],ix*16,iy*16); + end; + +procedure menu; + var + m_cur,ix,iy,iz:integer; + key,spl_i:integer; + splash:string; + res:resource; + time:integer; + cavelogo:image; + spl_y,spl_del:integer; + spl_y_b:boolean; + begin + cavelogo:=ld_tex('cavelogo.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','title/'); + splash:='#ERROR'; + spl_y:=getimageheight(cavelogo); + spl_y_b:=true; + spl_del:=getrelativetimems; + res:=openResource('/title/splashes.txt'); + if ResourceAvailable(res) then + begin + spl_i:=stringtointeger(readline(res)); + iy:=random(spl_i-1)+1; + debug('SPLASH #'+iy); + for ix:=1 to iy do + splash:=readline(res); + closeresource(res); + end; + time:=getcurrenttime; + if (getmonth(time)=5) and (getday(time)=7) then splash:='Happy birthday, DeaDDooMER!'; + if ((getmonth(time)=0) and (getday(time)<3)) or ((getmonth(time)=11) and (getday(time)>29)) then splash:='Happy New Year!'; + repeat + proc_fps; + updateKeys; + if clickedKey(KEY_MENU_UP) then + begin + m_cur:=m_cur-1; + if m_cur<0 then m_cur:=5; + end; + if clickedKey(KEY_MENU_DOWN) then + begin + m_cur:=m_cur+1; + if m_cur>5 then m_cur:=0; + end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=0 then begin if menu_game then break; end; + else + if m_cur=1 then menu_tex; + else + if m_cur=2 then menu_sett; + else + if m_cur=3 then menu_help; + else + if m_cur=4 then menu_about; + else + if m_cur=5 then begin save_settings; halt; end; + end; + + draw_menu_back; + + drawimage(cavelogo,(getWidth/2)-(getimagewidth(cavelogo)/2),0); + setcolor(255,255,0); + + DrawFontTextSpec(splash, (getWidth/2)-(length(splash)*FONT_SYM_SIZE/2), spl_y, FONT_YELLOW_COLOR, true); + + if spl_y_b then begin if getrelativetimems-spl_del>64 then begin spl_y:=spl_y+1; spl_del:=getrelativetimems; end; if spl_y>getimageheight(cavelogo)+2 then spl_y_b:=false; end; + if not spl_y_b then begin if getrelativetimems-spl_del>64 then begin spl_y:=spl_y-1; spl_del:=getrelativetimems; end; if spl_y1 then + begin + inv.setSum(inv.getSum(invcur)-1, invcur); + inv.fixNull(invcur); + end; + + setBlock:=true; + end; + end; + end; + +procedure fishing; + var + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + if (getrelativetimems-fish_time>5000) and (getmap(fx,fy)=50) then + begin + if (random(3)=2) and (getmap(fx,fy)=50) then + begin + drop.create(210,1,x,y); + fish:=false; + end; + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + fish:=false; + end; else + if (getrelativetimems-fish_time<5000) and (getmap(fx,fy)=50) and (fish=true) then + begin + if getmap(fx,fy-1)=50 then fy:=fy-1; + end; + end; + +procedure drawminimap; + var + ix,iy,tmp_gx,tmp_gy,minx,miny,maxx,maxy,loc_camx,loc_camy,x,y:integer; + begin + x:=player.getX; + y:=player.getY; + if load_minimap_tex then + begin + tmp_gx:=(getWidth/2)-(getimagewidth(gui[16])/2); + tmp_gy:=(getHeight/2)-(getimageheight(gui[16])/2); + end; + else + begin + tmp_gx:=(getWidth/2)-(64/2); + tmp_gy:=(getHeight/2)-(64/2); + end; + + loc_camx:=(x+4)-(864/2); + loc_camy:=(y+4)-(864/2); + if loc_camx<0 then loc_camx:=0; + if loc_camx>4096-864 then loc_camx:=4096-864; + if loc_camy<0 then loc_camy:=0; + if loc_camy>2048-864 then loc_camy:=2048-864; + minx:=loc_camx/16; + miny:=loc_camy/16; + maxx:=(loc_camx+864)/16; + maxy:=(loc_camy+864)/16; + if minx<0 then minx:=0; + if miny<0 then miny:=0; + if maxx>255 then maxx:=255; + if maxy>127 then maxy:=127; + + if load_minimap_tex then + drawimage(gui[16],tmp_gx,tmp_gy); + else + begin + setcolor(214,190,150); + fillrect(tmp_gx,tmp_gy,64,64); + end; + + for ix:=minx to maxx do + for iy:=miny to maxy do + begin + if (getmap(ix,iy)=1) or (getmap(ix,iy)=2) or (getmap(ix,iy)=74) then setcolor(121,85,58); else + if (getmap(ix,iy)=4) or (getmap(ix,iy)=9) or (getmap(ix,iy)=11) or (getmap(ix,iy)=28) or (getmap(ix,iy)=29) or ((getmap(ix,iy)>=77) and (getmap(ix,iy)<=86)) or ((getmap(ix,iy)>=88) and (getmap(ix,iy)<=101)) then setcolor(188,152,98); else + if (getmap(ix,iy)=50) or (getmap(ix,iy)=62) then setcolor(38,92,255); else + if getmap(ix,iy)=51 then setcolor(255,0,0); else + if (getmap(ix,iy)=61) or (getmap(ix,iy)=32) then setcolor(255,255,255); else + setcolor(127,127,127); + + if (getmap(ix,iy)<>0) then plot(tmp_gx+4+ix-minx,tmp_gy+4+iy-miny); + end; + setcolor(0,0,255); + end; + +procedure draw_sign; + var + tmp:string; + str:array[0..3] of string; + i,j,tmp_gx,tmp_gy:integer; + begin + if load_gui_tex then + begin + tmp_gx:=(getWidth/2)-(getimagewidth(sign_im)/2); + tmp_gy:=(getHeight/2)-(getimageheight(sign_im)/2); + end; + else + begin + tmp_gx:=(getWidth/2)-(120/2); + tmp_gy:=(getHeight/2)-(60/2); + end; + + tmp:=t_sign[getmapinfo(curx,cury)]; + while pos(tmp,#13)<>-1 do + begin + i:=pos(tmp,#13); + str[j]:=copy(tmp,0,i); + tmp:=copy(tmp,i+1,length(tmp)); + j:=j+1; + end; + + if load_gui_tex then + drawimage(sign_im,tmp_gx,tmp_gy); + else + begin + setcolor(159,132,77); + fillrect(tmp_gx,tmp_gy,120,60); + end; + + drawfonttext(str[0],tmp_gx+(120/2)-(length(str[0])*8/2),tmp_gy+(60/4/2)+4); + drawfonttext(str[1],tmp_gx+(120/2)-(length(str[1])*8/2),tmp_gy+(60/4/2)+8+4); + drawfonttext(str[2],tmp_gx+(120/2)-(length(str[2])*8/2),tmp_gy+(60/4/2)+16+4); + drawfonttext(str[3],tmp_gx+(120/2)-(length(str[3])*8/2),tmp_gy+(60/4/2)+24+4); + end; + +procedure draw_back(ix,iy:integer); + begin + if getBiomMap(ix)=0 then + begin + if (getBackMap(ix)=iy) then drawimage(back[0],(ix*16)-camx,(iy*16)-camy); else + if (getBackMap(ix)+1=iy) then drawimage(back[1],(ix*16)-camx,(iy*16)-camy); else + if (getBackMap(ix)+2=iy) then drawimage(back[1],(ix*16)-camx,(iy*16)-camy); else + if (getBackMap(ix)+3=iy) then drawimage(back[1],(ix*16)-camx,(iy*16)-camy); else + if (getBackMap(ix)getWidth then ix:=ix-getWidth*2; + iy:=rnd(getHeight); + if (ix>-1) and (ix0 then + begin + smy:=10000*(getWidth+getimagewidth(sun))/300000*game_time/10000; + drawimage(sun,smy-getimagewidth(sun),getHeight/2-getimageheight(sun)/2); + end; + else + begin + setcolor(255,213,74); + smy:=10000*(getWidth+sm_siz)/300000*game_time/10000; + fillrect(smy-sm_siz+sm_siz4,getHeight/2-sm_siz/2+sm_siz4,sm_siz-sm_siz4,sm_siz-sm_siz4); + end; + + if load_sm>0 then + begin + smy:=10000*(getWidth+getimagewidth(moon))/300000*(game_time-300000)/10000; + drawimage(moon,smy-getimagewidth(moon),getHeight/2-getimageheight(moon)/2); + end; + else + begin + setcolor(175,184,204); + smy:=10000*(getWidth+sm_siz)/300000*(game_time-300000)/10000; + fillrect(smy-sm_siz+sm_siz4,getHeight/2-sm_siz/2+sm_siz4,sm_siz-sm_siz4,sm_siz-sm_siz4); + end; + end; + {===================[camera]===================} + camx:=(x+4)-(getWidth/2); + camy:=(y+4)-(getHeight/2); + if camx<0 then camx:=0; + if camx>4096-getWidth then camx:=4096-getWidth; + if camy>2048-getHeight then camy:=2048-getHeight; + {===================[max_draw]===================} + minx:=camx/16; + miny:=camy/16; + maxx:=(camx+getWidth)/16; + maxy:=(camy+getHeight)/16; + if minx<0 then minx:=0; + if miny<0 then miny:=0; + if maxx>255 then maxx:=255; + if maxy>127 then maxy:=127; + {===================[draw_back]===================} + for ix:=minx to maxx do + for iy:=miny to maxy do + begin + if ifosad then if (getBackMap(ix)>=iy) and (osadki=true) and getBlockTrans(getmap(ix,iy)) then + begin + if getBiomMap(ix)=0 then drawimage(osad[0,osadki_ani],(ix*16)-camx,(iy*16)-camy); + else + if getBiomMap(ix)=2 then drawimage(osad[1,osadki_ani],(ix*16)-camx,(iy*16)-camy); + else + if getBiomMap(ix)=3 then drawimage(osad[0,osadki_ani],(ix*16)-camx,(iy*16)-camy); + end; + if drw_back then + if getBlockTrans(getmap(ix,iy)) then + draw_back(ix,iy); + + if getBlockFore(getmap(ix,iy))=false then + draw_block(ix,iy); + end; + {===================[drop]===================} + drop.draw(camx, camy); + {===================[particles]===================} + if s_particles then draw_particle; + {===================[player]===================} + if hp>0 then + begin + player.draw(camx, camy); + end; + + {===================[mobs]===================} + mob.draw(camx, camy); + {===================[draw_blocks]===================} + for ix:=minx to maxx do + for iy:=miny to maxy do + begin + if getBlockFore(getmap(ix,iy))=true then + draw_block(ix,iy); + + setcolor(0,0,0); + if (light_type=1) then begin if getmaplight(ix,iy)=0 then fillrect((ix*16)-camx,(iy*16)-camy,16,16); end; + else + if light_type=2 then begin if getmaplight(ix,iy)<15 then begin if (ix*16-camx0-16) and (iy*16-camy0-16) then drawimage(light[getmaplight(ix,iy)],(ix*16)-camx,(iy*16)-camy); end; end; + end; + if (toolus>0) and (toolind<10) and (getmap(curx,cury)>0) then begin if toolind>9 then toolind:=9; drawimage(tue[toolind],curx*16-camx,cury*16-camy); end; + {===================[gui]===================} + if drawgui then + begin + tmp_ax:=(getWidth/2)-(getImageWidth(gui[1])/2); + + if keymode=1 then + drawimage(gui[0],curx*16-camx,cury*16-camy); + + DrawWindows; + /*if keymode=2 then + if gamemode<>1 then + DrawPlayerInventory; + else + drawinv_c; else + if keymode=3 then drawcraft; else + if keymode=4 then drawchest; else + if keymode=5 then draw_sign; else + if keymode=6 then drawfurnace; else + if ifminimap then drawminimap;*/ + + drawimage(gui[1],tmp_ax,0); + for ix:=0 to 8 do + begin + drawItem(inv.getItem(ix), inv.getSum(ix), (ix*16)+tmp_ax+ix*2+4, 1, true); + end; + drawimage(gui[17],(invslot*16)+tmp_ax+invslot*2+2,0); + + if gamemode<>1 then + begin + if gamemode=0 then + begin + for ix:=0 to (hp div 2)-1 do drawimage(gui[13],ix*9,getHeight-9); + if (hp mod 2)<>0 then begin drawimage(gui[14],ix*9,getHeight-9); ix:=ix+1 end; + for ix:=ix to 9 do drawimage(gui[15],ix*9,getHeight-9); + end; else + if gamemode=2 then + begin + for ix:=0 to (hp div 2)-1 do drawimage(gui[31],ix*9,getHeight-9); + if (hp mod 2)<>0 then begin drawimage(gui[32],ix*9,getHeight-9); ix:=ix+1 end; + for ix:=ix to 9 do drawimage(gui[33],ix*9,getHeight-9); + end; + + for ix:=0 to (hunger div 2)-1 do drawimage(gui[26],ix*9,getHeight-18); + if (hunger mod 2)<>0 then begin drawimage(gui[27],ix*9,getHeight-18); ix:=ix+1 end; + for ix:=ix to 9 do drawimage(gui[28],ix*9,getHeight-18); + + if getmap((x+4)/16,y/16)=50 then + begin + for ix:=0 to (air div 2)-1 do drawimage(gui[29],ix*9,getHeight-27); + if (air mod 2)<>0 then begin drawimage(gui[30],ix*9,getHeight-27); ix:=ix+1 end; + end; + end; + + for ix:=0 to 3 do + begin + drawfonttext(msg[ix],0,getHeight-20-ix*9); + if getrelativetimems-msg_time[ix]>5000 then msg[ix]:=''; + end; + end; + end; + +procedure load_moon(path:string;phase:integer); + var + no:image; + begin + moon:=no; + if load_sm=1 then + begin + moon:=ld_tex('moon_phase_'+phase+'.png',path,'terrain/moon_phases/'); + end; else + if load_sm=2 then + begin + moon:=resize_image(ld_tex('moon_phase_'+phase+'.png',path,'terrain/moon_phases/'),(getWidth+getHeight)/5,(getWidth+getHeight)/5); + end; + end; + +procedure sleep; + var + i,ix,iy:integer; + begin + if game_time>300000 then + begin + if load_light_tex then + begin + keymode:=0; + i:=15; + while i>0 do + begin + for iy:=0 to getheight/16 do + for ix:=0 to getwidth/16 do + drawimage(light[i],ix*16,iy*16); + i:=i-1; + drawVideo; + delay(100); + end; + moon_phase:=moon_phase+1; + if moon_phase>7 then moon_phase:=0; + load_moon('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',moon_phase); + game_time:=50000; + last_sleep_x:=curx; + last_sleep_y:=cury-1; + i:=1; + while i<15 do + begin + draw; + for iy:=0 to getheight/16 do + for ix:=0 to getwidth/16 do + drawimage(light[i],ix*16,iy*16); + i:=i+1; + drawVideo; + delay(100); + end; + end; + else + begin + keymode:=0; + i:=0; + while i<=getheight do + begin + setcolor(0,0,0); + fillrect(0,0,getwidth,i); + i:=i+5; + drawVideo; + delay(50); + end; + moon_phase:=moon_phase+1; + if moon_phase>7 then moon_phase:=0; + load_moon('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',moon_phase); + game_time:=50000; + last_sleep_x:=curx; + last_sleep_y:=cury-1; + i:=0; + while i<=getheight do + begin + draw; + setcolor(0,0,0); + fillrect(0,i,getwidth,getheight); + i:=i+5; + drawVideo; + delay(50); + end; + end; + end; else create_msg('You can sleep only at night'); + end; + +procedure resetToolProgerss; + begin + toolus:=0; + toolind:=0; + end; + +procedure usetools(invcur, x, y:integer); + var + item, sum, block:integer; + begin + block:=getmap(x, y); + item:=inv.getItem(invcur); + sum:=inv.getSum(invcur); + + if gamemode=1 then + destroy_block_cr(block, x, y); + else + if (block>0) then + begin + if (getItemType(item)=ITEM_TYPE_TOOL) and (getBlockTool(block)=getToolType(item)) then + toolus:=toolus+getToolSpeed(item); + else + toolus:=toolus+1; + + if toolus>=getBlockHP(block) then + begin + if ((getItemType(item)=ITEM_TYPE_TOOL) and (getBlockTool(block)=getToolType(item)) and (getToolLvl(item)>=getBlockLvl(block))) or (getBlockLvl(block)<=0) then + begin + setMap(0, x, y); + destroy_block_1(block, x, y); + setMapInfo(0, x, y); + end; + else + begin + setMap(0, x, y); + destroy_block_0(block, x, y); + setMapInfo(0, x, y); + end; + + if getItemType(item)=ITEM_TYPE_TOOL then + begin + inv.setSum(inv.getSum(invcur)-1, invcur); + inv.fixNull(invcur); + end; + + toolus:=0; + toolind:=0; + end; + end; + + if (toolus>0) and (toolus<=getBlockHP(block)) then + toolind:=((toolus*100) div getBlockHP(block)) div 10; + end; + +function rt_useweap:boolean; + var + x, y, w, h, i, damg:integer; + item:integer; + begin + x:=player.getX; + y:=player.getY; + w:=player.getW; + h:=player.getH; + item:=inv.getItem(invslot); + + if getItemType(item)=1 then + damg:=getToolDamg(item); + else + damg:=1; + + if posi=0 then + i:=mob.findAndHit(damg, x-TILE_SIZE, y, TILE_SIZE+(w/2), h, -2, -3); + else + i:=mob.findAndHit(damg, x+(w/2), y, TILE_SIZE+(w/2), h, 2, -3); + + if i<>-1 then + begin + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + rt_useweap:=true; + end; + end; + +procedure rt_usetools; + var + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + + if posi=0 then curx:=(x div 16)-1; else curx:=(x div 16)+1; + cury:=y div 16; + if getmap(curx,cury)=0 then cury:=cury+1; + + if curx<0 then curx:=0; + if curx>255 then curx:=255; + if cury<0 then cury:=0; + if cury>127 then cury:=127; + + usetools(invslot, curx, cury); + end; + +procedure rt_usemob; + var + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + + if posi=0 then curx:=(x div 16)-1; else curx:=(x div 16)+1; + cury:=y div 16; + if getmap(curx,cury)=0 then cury:=cury+1; + + if curx<0 then curx:=0; + if curx>255 then curx:=255; + if cury<0 then cury:=0; + if cury>127 then cury:=127; + + //usemob(curx,cury); + end; + +procedure actionUse(invcur, x, y:integer); + begin + if setBlock(invcur, x, y)=false then + if useBlock(invcur, x, y) then + if useItem(invcur, x, y) then + end; + +procedure rt_useblock; + var + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + + if posi=0 then curx:=(x div 16)-1; else curx:=(x div 16)+1; + cury:=y div 16; + if getmap(curx,cury)=0 then cury:=cury+1; + + if curx<0 then curx:=0; + if curx>255 then curx:=255; + if cury<0 then cury:=0; + if cury>127 then cury:=127; + + actionUse(invslot, curx, cury); + end; + +procedure go_to_nether; + var + ix:integer; + begin + portal_time:=getrelativetimems; + savegame('/'+sd+'/cavecraft/saves/'+sav_fl+'/'); + pl_world:=1; + drw_load_line('Matrix',10); + if loadworld('/'+sd+'/cavecraft/saves/'+sav_fl+'/')=true then + begin + player.setX(get_spawn_x*16+4); + player.setY((get_up(get_spawn_x)-1)*16); + end; + else + begin + {for ix:=0 to 31 do + begin + mob[ix].m_type:=0; + mob[ix].m_x:=0; + mob[ix].m_y:=0; + mob[ix].m_posi:=0; + mob[ix].m_velx:=0; + mob[ix].m_vely:=0; + mob[ix].m_ani:=0; + mob[ix].m_min_vely:=0; + mob[ix].m_hp:=0; + mob[ix].m_del:=0; + mob[ix].m_fall:=false; + mob[ix].m_jmp:=false; + mob[ix].m_velani:=false; + end;} + + drop.resetData; + gennether; + //netherspawn; + end; + end; + +procedure go_to_world; + begin + portal_time:=getrelativetimems; + savegame('/'+sd+'/cavecraft/saves/'+sav_fl+'/'); + pl_world:=0; + drw_load_line('Matrix',10); + if loadworld('/'+sd+'/cavecraft/saves/'+sav_fl+'/')=true then + begin + pl_world:=0; + end; + else + begin + debug('ERROR!!!'); + pl_world:=0; + genworld; + //megaspawn; + end; + end; + +procedure plr_is_dead_hardcore; + begin + keymode:=0; + toolus:=0; + toolind:=0; + + repeat + updateKeys; + if clickedKey(KEY_MENU_SELECT) then + begin + deleteworld('/'+sd+'/cavecraft/saves/'+sav_fl+'/'); + menu; + exit; + end; + draw; + drawfonttext('You died!',getwidth/2-32,getheight/2-16); + + drw_btn('Delete world',0,0,0,1); + + drawVideo; + delay(1); + until false; + + end; + +procedure plr_is_dead; + var + m_cur:integer; + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + keymode:=0; + toolus:=0; + toolind:=0; + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then + begin + m_cur:=m_cur-1; + if m_cur<0 then m_cur:=1; + end; + if clickedKey(KEY_MENU_DOWN) then + begin + m_cur:=m_cur+1; + if m_cur>1 then m_cur:=0; + end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=0 then + begin + if pl_world=0 then + begin + if last_sleep_x=0 then + begin + x:=get_spawn_x*16+4; + y:=get_spawn_y*16; + end; else + begin + x:=last_sleep_x*16+4; + y:=last_sleep_y*16; + end; + end; else + if pl_world=1 then + begin + go_to_world; + if last_sleep_x=0 then + begin + x:=get_spawn_x*16+4; + y:=get_spawn_y*16; + end; else + begin + x:=last_sleep_x*16+4; + y:=last_sleep_y*16; + end; + end; + posi:=0; + curx:=0; + cury:=0; + vely:=0; + jmp:=false; + hp:=20; + hunger:=20; + exit; + end; + else + if m_cur=1 then begin menu; exit; end; + end; + + draw; + + drawfonttext('You died!',getwidth/2-32,getheight/2-16); + + drw_btn('Respawn',0,m_cur,0,1); + drw_btn('Main menu',1,m_cur,0,1); + + drawVideo; + delay(1); + until false; + end; + +procedure fast_menu; + var + m_cur,i:integer; + begin + repeat + updateKeys; + if clickedKey(KEY_MENU_UP) then begin m_cur:=m_cur-1; if m_cur<0 then m_cur:=3; end; + if clickedKey(KEY_MENU_DOWN) then begin m_cur:=m_cur+1; if m_cur>3 then m_cur:=0; end; + if clickedKey(KEY_MENU_SELECT) then + begin + if m_cur=0 then + begin + exit; + end; else + if m_cur=1 then + begin + savegame('/'+sd+'/cavecraft/saves/'+sav_fl+'/'); + exit; + end; else + if m_cur=2 then + begin + menu_sett; + end; else + if m_cur=3 then + begin + //clear_gui(keymode); + menu; + exit; + end; + end; + draw; + drawfonttext('Game menu',getwidth/2-36,getheight/2-20); + drw_btn('Back to Game',0,m_cur,0,1); + drw_btn('Save Game',1,m_cur,0,1); + drw_btn('Options',2,m_cur,0,1); + drw_btn('Quit to Title',3,m_cur,0,1); + + drawVideo; + delay(1); + until false; + end; + +procedure keyFastInv; + begin + if clickedKey(KEY_FASTINV_NEXT) then + begin + invslot:=invslot-1; + if invslot<0 then + invslot:=8; + end; + + if clickedKey(KEY_FASTINV_PREV) then + begin + invslot:=invslot+1; + if invslot>8 then + invslot:=0; + end; + end; + +procedure keyConsole; + begin + if clickedKey(KEY_CHAT) then + SetTimer(1000,T_CONSOLE); + + if pressedKey(KEY_CHAT) then + begin + if GetTimer(T_CONSOLE)=TIMER_OK then + begin + call_console; + ResetTimer(T_CONSOLE); + end; + end; + else + begin + if GetTimer(T_CONSOLE)>TIMER_OK then + begin + deb:= not deb; + ResetTimer(T_CONSOLE); + end; + end; + end; + +procedure keyInventory; + begin + if clickedKey(KEY_PLR_OPENINV) then + if gamemode<>1 then + OpenPlayerInventory; + else + OpenCreativeWindow; + end; + +procedure keyhandler; + begin + updateKeys; + + if WindowKeyHanler then + begin + if keymode=0 then + begin + keyInventory; + keyFastInv; + keyConsole; + + if clickedKey(KEY_PLR_EDITMODE) then + begin + keymode:=1; + curx:=player.getX div 16; + cury:=player.getY div 16; + end; + + if clickedKey(KEY_PLR_USE) then + rt_usemob; + + if clickedKey(KEY_MENU) then + fast_menu; + + if clickedKey(KEY_PLR_ATTACK) then + if rt_useweap=false then + debug('useweap'); + + if pressedKey(KEY_PLR_ATTACK) then + begin + rt_usetools; + playAnim(ANIM_HAND); + end; + else + begin + resetToolProgerss; + cancelAnim(ANIM_HAND); + end; + + if pressedKey(KEY_PLR_UP) then + player.gotoUP; + if pressedKey(KEY_PLR_DOWN) then + player.gotoDOWN; + if pressedKey(KEY_PLR_LEFT) then + player.gotoLEFT; + if pressedKey(KEY_PLR_RIGHT) then + player.gotoRIGHT; + end; + else + if keymode=1 then + begin + keyInventory; + keyFastInv; + keyConsole; + + if clickedKey(KEY_PLR_UP) then + begin + cury:=cury-1; + if cury<0 then + cury:=0; + end; + if clickedKey(KEY_PLR_DOWN) then + begin + cury:=cury+1; + if cury>127 then + cury:=127; + end; + if clickedKey(KEY_PLR_LEFT) then + begin + curx:=curx-1; + if curx<0 then + curx:=0; + end; + if clickedKey(KEY_PLR_RIGHT) then + begin + curx:=curx+1; + if curx>255 then + curx:=255; + end; + + if clickedKey(KEY_PLR_EDITMODE) then + keymode:=0; + + if clickedKey(KEY_PLR_USE) then + actionUse(invslot, curx, cury); + + if pressedKey(KEY_PLR_ATTACK) then + begin + usetools(invslot, curx, cury); + playAnim(ANIM_HAND); + end; + else + begin + resetToolProgerss; + cancelAnim(ANIM_HAND); + end; + + if clickedKey(KEY_MENU) then + fast_menu; + end; + + end; + + end; + +procedure phyhandler; + var + i:integer; + begin + player.calcPhysics; + mob.updatePhy; + drop.calcPhy; + end; + +procedure light_fillrect(l,x,y,r:integer); + var + ix,iy,ym,yp,xm,xp:integer; + begin + ym:=y-r; + yp:=y+r; + xm:=x-r; + xp:=x+r; + for ix:=xm to xp do + for iy:=ym to yp do + setmaplight(getmaplight(ix,iy)+l,ix,iy); + end; + +procedure light_rect(l,x,y,r:integer); + var + ix,iy,ym,yp,xm,xp:integer; + begin + ym:=y-r; + yp:=y+r; + xm:=x-r; + xp:=x+r; + for ix:=xm to xp do + begin + setmaplight(getmaplight(ix,ym)+l,ix,ym); + setmaplight(getmaplight(ix,yp)+l,ix,yp); + end; + for iy:=ym+1 to yp-1 do + begin + setmaplight(getmaplight(xm,iy)+l,xm,iy); + setmaplight(getmaplight(xp,iy)+l,xp,iy); + end; + end; + +procedure calc_light(m,x,y:integer); + var + ix,iy,l,ss,sf:integer; + begin + if light_type=1 then light_fillrect(m,x,y,m/2); else + for l:=m downto 1 do + begin + if ss mod 2=0 then light_rect(l,x,y,ss/2); + ss:=ss+1; + end; + end; + +procedure calc_sun(ix,m:integer); + var + iy,ss:integer; + begin + ss:=m; + for iy:=0 to 127 do + begin + setmaplight(ss,ix,iy); + if ss=0 then break; + ss:=ss-getBlockTr(getmap(ix,iy)); + if ss<0 then ss:=0; + end; + for iy:=iy+1 to 127 do + begin + setmaplight(0,ix,iy); + end; + end; + +procedure kill_plr; + var + i:integer; + begin + hp:=0; + for i:=0 to INV_SIZE do + begin + if inv.isNull(i)=false then + player.dropItem(inv.getItem(i), inv.getSum(i)); + inv.setItem(0, i); + inv.setSum(0, i); + end; + if gamemode<2 then plr_is_dead; else plr_is_dead_hardcore; + end; + +procedure hunger_and_air; + var + x, y:integer; + begin + x:=player.getX; + y:=player.getY; + if gamemode<>1 then + begin + if getrelativetimems-hung_time>=90000/(gamemode+1) then + begin + hung_time:=getrelativetimems; + hunger:=hunger-1; + end; + if getrelativetimems-hp_time>=5000*(gamemode+1) then + begin + if hunger>16 then + begin + hp_time:=getrelativetimems; + hp:=hp+1; + if hp>20 then hp:=20; + end; else + if hunger<1 then + begin + hp_time:=getrelativetimems; + hp:=hp-1; + if hp<1 then if gamemode<2 then hp:=1; + end; + end; + + if getmap((x+4)/16,y/16)=50 then + begin + if getrelativetimems-air_time>=500 then + begin + air:=air-1; + air_time:=getrelativetimems; + if air<1 then + begin + hp_time:=getrelativetimems; + hp:=hp-2; + end; + end; + end; else + air:=21; + end; + end; + +procedure game; + var + ix,iy,minx,maxx,miny,maxy,fps_t,tim, x, y:integer; + begin + x:=player.getX; + y:=player.getY; + + hunger_and_air; + + if hunger<0 then hunger:=0; + if air<0 then air:=0; + + fps_t:=fps; + if fps_t<1 then fps_t:=1; + + if bl_ani5_d then + if bl_ani5_v=false then + begin + bl_ani5:=bl_ani5+1; + if bl_ani5>4 then + begin + bl_ani5:=4; + bl_ani5_v:=not bl_ani5_v; + end; + end; + else + begin + bl_ani5:=bl_ani5-1; + if bl_ani5<0 then + begin + bl_ani5:=0; + bl_ani5_v:=not bl_ani5_v; + end; + end; + bl_ani5_d:=not bl_ani5_d; + + drop.reflux; + player.getDrop; + + game_time:=game_time+(600000 div (fps_t*1000)); + + if (game_time>600000) or (game_time<0) then + begin + game_time:=0; + moon_phase:=moon_phase+1; + if moon_phase>7 then moon_phase:=0; + load_moon('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/',moon_phase); + end; + + tim:=10000*getimagewidth(sky)/600000*game_time/10000; + global_light:=effects.get(sky,tim,1,1) {and $F}; + + if clock_stage<>game_time div 75000 then begin clock_stage:=clock_stage+1; if clock_stage>7 then clock_stage:=0; end; + + if x<0 then x:=0; + if x+8>4094 then x:=4086; + if getBlockColl(getmap(x div 16, y div 16))>0 then hp:=hp-1; + if random(4096)=random(4096) then begin osadki:=not osadki; end; + osadki_ani:=osadki_ani+1; + if osadki_ani>7 then osadki_ani:=0; + + if random(20)=random(20) then create_particle(6,x,y); + + if gamemode=1 then begin hp:=666; hunger:=666; end; + + if inv.getItem(invslot)=186 then + ifminimap:=true; + else + ifminimap:=false; + + //if s_spawn_mob then if random(4096)=1547 then megaspawn; + + mob.update; + + if particle_upd then update_particle; + + if light_type>0 then + begin + minx:=camx/16-1; + maxx:=(camx+getWidth)/16+1; + if minx<0 then minx:=0; + if maxx>255 then maxx:=255; + for ix:=minx to maxx do calc_sun(ix,global_light); + end; + + minx:=camx/16-8; + maxx:=(camx+getWidth)/16+16; + miny:=camy/16-8; + maxy:=(camy+getHeight)/16+16; + if minx<0 then minx:=0; + if maxx>255 then maxx:=255; + if miny<0 then miny:=0; + if maxy>127 then maxy:=127; + for ix:=minx to maxx do + for iy:=miny to maxy do + begin + if light_type=0 then setmaplight(15,ix,iy); + else + if light_type>0 then if getBlockLi(getmap(ix,iy))>0 then calc_light(getBlockLi(getmap(ix,iy)),ix,iy); + end; + + minx:=(camx/16)-((getwidth/2)/16); + miny:=(camy/16)-((getheight/2)/16); + maxx:=(camx+(getWidth+getWidth/2))/16; + maxy:=(camy+(getHeight+getHeight/2))/16; + if minx<0 then minx:=0; + if miny<0 then miny:=0; + if maxx>255 then maxx:=255; + if maxy>127 then maxy:=127; + if updxmaxx then updx:=minx; + if updy>maxy then updy:=miny; + + if bl_upd>0 then + begin + for ix:=0 to (((2*getWidth/16)*(2*getHeight/16))-1) div ((fps_t*bl_upd)) do + begin + updateBlock(updx, updy); + updx:=updx+1; + if updx>maxx then + begin + updx:=minx; + updy:=updy+1; + if updy>maxy then updy:=miny; + end; + end; + end; + + {if coll_bl(110)=true then + begin + if getrelativetimems-portal_time>5000 then + begin + if pl_world=0 then begin go_to_nether; portal_time:=getrelativetimems; end; else + if pl_world=1 then begin go_to_world; portal_time:=getrelativetimems; end; + end; + end; + + if coll_bl(51)=true then hp:=hp-1; + + if coll_bl(59)=true then + begin + if vely<0 then vely:=-1; + else + if vely>0 then vely:=1; + end;} + + if gamemode<>1 then + begin + if hp>20 then hp:=20; + if hunger>20 then hunger:=20; + end; + + if y>2048 then kill_plr; + if (hp<1) and (gamemode<>1) then kill_plr; + if fish=true then fishing; + + if (fish=true) and (inv.getItem(invslot)<>152) then fish:=false; + + //if (keymode>3) and (cury<(y div 16)-4) then begin clear_gui(keymode); keymode:=0; curx:=x div 16; cury:=y div 16; end; + + if gamemode<>1 then + begin + if cury<(y div 16)-4 then cury:=(y div 16)-4; + if cury>(y div 16)+5 then cury:=(y div 16)+5; + if curx<(x div 16)-4 then curx:=(x div 16)-4; + if curx>(x div 16)+4 then curx:=(x div 16)+4; + end; + + UpdateFurnaces; + end; + +procedure qt_start; + var + i:integer; + begin + drawgui:=true; + LoadDrawFont('/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/'); + drawdeadlogo; + start_uu; + if load_key_tex=1 then init_touch; + for i:=0 to 4 do + begin + msg[i]:=''; + msg_time[i]:=getrelativetimems; + end; + InitMap(MAP_W, MAP_H); + menu; + end; + +begin + qt_start; + hung_time:=getrelativetimems; + hp_time:=getrelativetimems; + air_time:=getrelativetimems; + portal_time:=getrelativetimems; + repeat + proc_fps; + keyhandler; + phyhandler; + game; + draw; + drawfonttext(version,getWidth-(length(version)*8),getHeight-8); + if getrelativetimems-msg_time[4]>500 then begin free_ram:=memory.get_freememory; if free_ram<0 then free_ram:=-free_ram; msg_time[4]:=getrelativetimems; end; + if deb=true then + begin + //drawfonttext('X:'+(x div 16-128),0,0); + //drawfonttext('Y:'+integertostring(127-(y div 16)),0,8); + drawfonttext('CURX:'+(curx-128),0,16); + drawfonttext('CURY:'+cury,0,24); + drawfonttext('UPDX:'+updx,0,32); + drawfonttext('UPDY:'+updy,0,40); + drawfonttext('FPS:'+fps,0,56); + drawfonttext('Free RAM:'+free_ram/1024+' KB',0,64); + drawfonttext('Total RAM:'+memory.get_totalmemory div 1024+' KB',0,72); + drawfonttext('SEED:'+seed,0,88); + drawfonttext('Game time:'+game_time,0,96); + end; + + drawVideo; + maxfps; + + until false; +end. diff --git a/src/cellui.mpsrc b/src/cellui.mpsrc new file mode 100644 index 0000000..070ea0e --- /dev/null +++ b/src/cellui.mpsrc @@ -0,0 +1,491 @@ +unit cellui; + +interface + const + CONST_MAX_LAYERS=1; + CONST_MAX_CELLS=63; + CONST_MAX_OFFSETS=1; + CONST_MAX_CURS=1; + CONST_MAX_INFO=2; + + CELL_TYPE_NULL=0; + CELL_TYPE_PLAYER_INV=1; + CELL_TYPE_CREWATIVE_INV=2; + CELL_TYPE_CHEST=3; + CELL_TYPE_FASTCRAFT=4; + CELL_TYPE_FURNACE=5; + + CELL_FLAG_OFFSET=$F; + CELL_FLAG_INDICATOR=$10; + + CUR_SELECT1=0; + CUR_SELECT2=1; + + WINDOW_NULL=0; + + FIND_CELL_UP=0; + FIND_CELL_DOWN=1; + FIND_CELL_LEFT=2; + FIND_CELL_RIGHT=3; + + CELL_W=16; + CELL_H=16; + + procedure ClearLayer(n:integer); + procedure LoadCurImg(img:image; i:integer;); + + procedure NewLayer; + procedure DelLayer; + function CellLayer:integer; + procedure setCellLayer(n:integer); + + procedure initCell(cell_type, id, offset, data, x, y:integer; indicator:boolean;); + function getCellID(i:integer):integer; + function getCellData(i:integer):integer; + function getCellX(i:integer):integer; + function getCellY(i:integer):integer; + procedure setOffset(newOffset, i:integer;);//i - номер смещения + function getOffset(i:integer):integer;//i - номер смещения + function getCellOffset(i:integer):integer; + + function getItem(i:integer):integer; + procedure setItem(val, i:integer); + function getSum(i:integer):integer; + procedure setSum(val, i:integer); + procedure fixNullCell(i:integer;); + + procedure DrawCellLayer(i, x, y:integer); + + procedure SetWindowInfo(n, i:integer); + function GetWindowInfo(i:integer):integer; + procedure SetCur(i:integer); + function GetCur:integer; + + procedure SetCurIndex(n, i:integer); + function GetCurIndex(i:integer):integer; + procedure SetCurActive(n:boolean; i:integer); + function GetCurActive(i:integer):boolean; + procedure SetWindowType(wtype:integer); + function GetWindowType:integer; + + procedure DrawCursors(n, x, y:integer); + + procedure ShiftCurrentCur(find:integer;); + + function FindCurrentWindowsType:boolean; + +implementation + uses vars, Canvas, items, console, furnace, chest, inv, func, items_store; + var + layer:integer; + last_cell: array [0..CONST_MAX_LAYERS] of integer; + inv_type: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;//Name of virtual massive + inv_id: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer;//ID of real item massive + inv_x, inv_y: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer; + inv_data: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer; + inv_flags: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CELLS] of integer; + + inv_offset: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_OFFSETS] of integer;//Offset of real item id in inventory + + WindowType: array [0..CONST_MAX_LAYERS] of integer; + WindowInfo: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_INFO] of integer; + + WindowCurCurrent: array [0..CONST_MAX_LAYERS] of integer; + WindowCurImg: array [0..CONST_MAX_CURS] of image; + WindowCurIndex: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CURS] of integer; + WindowCurActive: array [0..CONST_MAX_LAYERS, 0..CONST_MAX_CURS] of boolean; + +{=====[Inventory interface functions]=====} + procedure ClearLayer(n:integer); + var + i:integer; + begin + for i:=0 to CONST_MAX_CELLS do + begin + last_cell[n]:=0; + inv_type[n, i]:=CELL_TYPE_NULL; + inv_id[n, i]:=0; + inv_x[n, i]:=0; + inv_y[n, i]:=0; + inv_data[n, i]:=0; + inv_flags[n, i]:=0; + end; + + for i:=0 to CONST_MAX_OFFSETS do + inv_offset[n, i]:=0; + + WindowType[n]:=WINDOW_NULL; + WindowCurCurrent[n]:=0; + for i:=0 to CONST_MAX_INFO do + WindowInfo[n, i]:=0; + for i:=0 to CONST_MAX_CURS do + begin + WindowCurIndex[n, i]:=0; + WindowCurActive[n, i]:=false; + end; + end; + + procedure LoadCurImg(img:image; i:integer;); + begin + WindowCurImg[i]:=img; + end; + + procedure NewLayer; + begin + layer:=layer+1; + end; + + procedure DelLayer; + begin + ClearLayer(layer); + layer:=layer-1; + end; + + function CellLayer:integer; + begin + CellLayer:=layer; + end; + + procedure setCellLayer(n:integer); + begin + layer:=n; + end; + + procedure initCell(cell_type, id, offset, data, x, y:integer; indicator:boolean;); + var + i:integer; + begin + i:=last_cell[layer]; + last_cell[layer]:=last_cell[layer]+1; + + inv_type[layer, i]:=cell_type; + inv_id[layer, i]:=id; + inv_x[layer, i]:=x; + inv_y[layer, i]:=y; + inv_data[layer, i]:=data; + + inv_flags[layer, i]:=(offset and CELL_FLAG_OFFSET); + + if indicator then + inv_flags[layer, i]:=inv_flags[layer, i] or CELL_FLAG_INDICATOR; + end; + + function getCellType(i:integer):integer; + begin + getCellType:=inv_type[layer, i]; + end; + + function getCellX(i:integer):integer; + begin + getCellX:=inv_x[layer, i]; + end; + + function getCellY(i:integer):integer; + begin + getCellY:=inv_y[layer, i]; + end; + + function getCellID(i:integer):integer; + begin + getCellID:=inv_id[layer, i]; + end; + + function getCellData(i:integer):integer; + begin + getCellData:=inv_data[layer, i]; + end; + + function getCellFlagIndicator(i, j:integer):boolean; + begin + getCellFlagIndicator:=(inv_flags[i, j] and CELL_FLAG_INDICATOR)>0; + end; + + procedure setOffset(newOffset, i:integer;); + begin + inv_offset[layer, i]:=newOffset; + end; + + function getOffset(i:integer):integer; + begin + getOffset:=inv_offset[layer, i]; + end; + + function getCellOffset(i:integer):integer; + begin + getCellOffset:=inv_flags[layer, i] and CELL_FLAG_OFFSET; + end; + + function getItemIdx(i, n:integer):integer; + var + id, data, _type:integer; + begin + id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET]; + _type:=inv_type[n, i]; + data:=inv_data[n, i]; + + if _type=CELL_TYPE_PLAYER_INV then + getItemIdx:=inv.getItem(id); + else + if _type=CELL_TYPE_CREWATIVE_INV then + getItemIdx:=getItemList(id); + else + if _type=CELL_TYPE_CHEST then + getItemIdx:=chest.getItem(id, data); + else + if _type=CELL_TYPE_FASTCRAFT then + getItemIdx:=getCraftOutItem(id); + else + if _type=CELL_TYPE_FURNACE then + getItemIdx:=GetFurItem(id, data); + end; + + procedure setItemIdx(val, i, n:integer); + var + id, data, _type:integer; + begin + id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET]; + _type:=inv_type[n, i]; + data:=inv_data[n, i]; + + if _type=CELL_TYPE_PLAYER_INV then + inv.setItem(val, id); + else + if _type=CELL_TYPE_CHEST then + chest.setItem(val, id, data); + else + if _type=CELL_TYPE_FURNACE then + SetFurItem(val, id, data); + end; + + function getSumIdx(i, n:integer):integer; + var + id, data, _type:integer; + begin + id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET]; + _type:=inv_type[n, i]; + data:=inv_data[n, i]; + + if _type=CELL_TYPE_PLAYER_INV then + getSumIdx:=inv.getSum(id); + else + if _type=CELL_TYPE_CREWATIVE_INV then + getSumIdx:=getItemMax(getItemList(id)); + else + if _type=CELL_TYPE_CHEST then + getSumIdx:=chest.getSum(id, data); + else + if _type=CELL_TYPE_FASTCRAFT then + getSumIdx:=getCraftOutSum(id); + else + if _type=CELL_TYPE_FURNACE then + getSumIdx:=GetFurSum(id, data); + end; + + procedure setSumIdx(val, i, n:integer); + var + id, data, _type:integer; + begin + id:=inv_id[n, i]+inv_offset[n, inv_flags[n, i] and CELL_FLAG_OFFSET]; + _type:=inv_type[n, i]; + data:=inv_data[n, i]; + + if _type=CELL_TYPE_PLAYER_INV then + inv.setSum(val, id); + else + if _type=CELL_TYPE_CHEST then + chest.setSum(val, id, data); + else + if _type=CELL_TYPE_FURNACE then + SetFurSum(val, id, data); + end; + + //i - индекс в таблице ячеек + function getItem(i:integer):integer; + begin + getItem:=getItemIdx(i, CellLayer); + end; + + procedure setItem(val, i:integer); + begin + setItemIdx(val, i, CellLayer); + end; + + function getSum(i:integer):integer; + begin + getSum:=getSumIdx(i, CellLayer); + end; + + procedure setSum(val, i:integer); + begin + setSumIdx(val, i, CellLayer); + end; + + procedure fixNullCell(i:integer); + begin + if (getItem(i)<1) or (getSum(i)<1) then + begin + setItem(0, i); + setSum(0, i); + end; + end; + + procedure DrawCellLayer(i, x, y:integer); + var + j:integer; + begin + for j:=0 to CONST_MAX_CELLS do + if inv_type[i, j]<>CELL_TYPE_NULL then + begin + drawItem(getItemIdx(j, i), getSumIdx(j, i), x+inv_x[i, j], y+inv_y[i, j], getCellFlagIndicator(i, j)); + end; + end; + +{======[]======} + + procedure SetWindowInfo(n, i:integer); + begin + WindowInfo[CellLayer, i]:=n; + end; + + function GetWindowInfo(i:integer):integer; + begin + GetWindowInfo:=WindowInfo[CellLayer, i]; + end; + + procedure SetCur(i:integer); + begin + WindowCurCurrent[CellLayer]:=i; + end; + + function GetCur:integer; + begin + GetCur:=WindowCurCurrent[CellLayer]; + end; + + procedure SetCurIndex(n, i:integer); + begin + WindowCurIndex[CellLayer, i]:=n; + end; + + function GetCurIndex(i:integer):integer; + begin + GetCurIndex:=WindowCurIndex[CellLayer, i]; + end; + + procedure SetCurActive(n:boolean; i:integer); + begin + WindowCurActive[CellLayer, i]:=n; + end; + + function GetCurActive(i:integer):boolean; + begin + GetCurActive:=WindowCurActive[CellLayer, i]; + end; + + procedure SetWindowType(wtype:integer); + begin + WindowType[CellLayer]:=wtype; + end; + + function GetWindowType:integer; + var + tmp:integer; + begin + tmp:=CellLayer; + if CellLayer<0 then + GetWindowType:=WINDOW_NULL; + else + GetWindowType:=WindowType[CellLayer]; + end; + + function FindCurrentWindowsType:boolean; + var + crrwt, i:integer; + begin + crrwt:=GetWindowType; + for i:=0 to CONST_MAX_LAYERS do + if (WindowType[i]=crrwt) and (i<>CellLayer) then + begin + FindCurrentWindowsType:=true; + exit; + end; + end; + + procedure DrawCursors(n, x, y:integer); + var + i, idx:integer; + begin + for i:=0 to CONST_MAX_CURS do + if WindowCurActive[n, i] then + begin + idx:=WindowCurIndex[n, i]; + DrawImage(WindowCurImg[i], x+inv_x[n, idx], y+inv_y[n, idx]); + end; + end; + + procedure ShiftCurrentCur(find:integer;); + var + find_i, find_x, find_y:integer; + res_i, res_x, res_y:integer; + i, tmp_x, tmp_y:integer; + begin + find_i:=GetCurIndex(GetCur); + find_x:=getCellX(find_i); + find_y:=getCellY(find_i); + res_i:=find_i; + if find=FIND_CELL_UP then + res_y:=-2147483647; + if find=FIND_CELL_DOWN then + res_y:=2147483647; + if find=FIND_CELL_LEFT then + res_x:=-2147483647; + if find=FIND_CELL_RIGHT then + res_x:=2147483647; + + for i:=0 to CONST_MAX_CELLS do + if (getCellType(i)<>CELL_TYPE_NULL) and (i<>find_i) then + begin + tmp_x:=getCellX(i); + tmp_y:=getCellY(i); + //debug('['+i+']: tmp_y='+tmp_y+'; res_y='+res_y+';'); + if find=FIND_CELL_UP then + begin + if (tmp_yres_y) and (tmp_x>=find_x-CELL_W/2) and (tmp_x<=find_x+CELL_W+CELL_W/2) then + res_i:=i; + end; + + if find=FIND_CELL_DOWN then + begin + if ((tmp_y>find_y) and (tmp_y=find_x-CELL_W/2) and (tmp_x<=find_x+CELL_W+CELL_W/2) then + res_i:=i; + end; + + if find=FIND_CELL_LEFT then + begin + //debug('LEFT ['+i+']: tmp_x='+tmp_x+'; find_x='+find_x+'; res_x='+res_x+';'); + if (tmp_xres_x) and (tmp_y>=find_y-CELL_H/2) and (tmp_y<=find_y+CELL_H+CELL_H/2) then + res_i:=i; + end; + + if find=FIND_CELL_RIGHT then + begin + //debug('RIGHT ['+i+']: tmp_x='+tmp_x+'; find_x='+find_x+'; res_x='+res_x+';'); + if (tmp_x>find_x) and (tmp_x=find_y-CELL_H/2) and (tmp_y<=find_y+CELL_H+CELL_H/2) then + res_i:=i; + end; + + + if res_i<>find_i then + begin + res_x:=getCellX(res_i); + res_y:=getCellY(res_i); + end; + end; + SetCurIndex(res_i, GetCur); + end; + +initialization + layer:=-1; + WindowCurImg[0]:=loadimage('/terrain/sun.png'); + WindowCurImg[1]:=loadimage('/terrain/moon_phases/moon_phase_0.png'); +end. diff --git a/src/chest.mpsrc b/src/chest.mpsrc new file mode 100644 index 0000000..fbd17a8 --- /dev/null +++ b/src/chest.mpsrc @@ -0,0 +1,128 @@ +unit chest; + +interface + const + MAX_CHEST=31; + + function create(x, y:integer):integer; + procedure destroy(drp:boolean; x, y:integer); + + function getItem(n, i:integer):integer; + function getSum(n, i:integer):integer; + procedure setItem(val, n, i:integer); + procedure setSum(val, n, i:integer); + + procedure resetData; + procedure saveData; + procedure loadData; + +implementation + uses maps, drop, vars, jsr75i, func; + const + MAX_CELL=26; + CHEST_ERROR=-1; + var + chest_b: array [0..MAX_CHEST] of boolean; + chest_item, chest_sum: array [0..MAX_CELL, 0..MAX_CHEST] of integer; + + function getItem(n, i:integer):integer; + begin + getItem:=chest_item[n, i]; + end; + + function getSum(n, i:integer):integer; + begin + getSum:=chest_sum[n, i]; + end; + + procedure setItem(val, n, i:integer); + begin + chest_item[n, i]:=val; + end; + + procedure setSum(val, n, i:integer); + begin + chest_sum[n, i]:=val; + end; + + function create(x, y:integer):integer; + var + i, j:integer; + begin + for i:=0 to MAX_CHEST do + if chest_b[i]=false then + begin + chest_b[i]:=true; + for j:=0 to MAX_CELL do + begin + setItem(0, j, i); + setSum(0, j, i); + end; + setMapInfo(i, x, y); + create:=i; + exit; + end; + create:=CHEST_ERROR; + end; + + procedure destroy(drp:boolean; x, y:integer); + var + i, j:integer; + begin + i:=getMapInfo(x, y); + chest_b[i]:=false; + for j:=0 to MAX_CELL do + begin + if drp then + drop.create(getItem(j, i), getSum(j, i), x*16+4, y*16+4); + setItem(0, j, i); + setSum(0, j, i); + end; + end; + + procedure resetData; + var + i, j:integer; + begin + for i:=0 to MAX_CHEST do + begin + chest_b[i]:=false; + for j:=0 to MAX_CELL do + begin + setItem(0, j, i); + setSum(0, j, i); + end; + end; + end; + + procedure saveData; + var + i, j:integer; + begin + for i:=0 to MAX_CHEST do + begin + writebool(chest_b[i]); + for j:=0 to MAX_CELL do + begin + write_byte(getItem(j, i)); + writeint(getSum(j, i)); + end; + end; + end; + + procedure loadData; + var + i, j:integer; + begin + for i:=0 to MAX_CHEST do + begin + chest_b[i]:=readbool; + for j:=0 to MAX_CELL do + begin + setItem(read_byte, j, i); + setSum(ReadInt, j, i); + end; + end; + end; + +end. diff --git a/src/console.pas b/src/console.pas new file mode 100644 index 0000000..d6fb2f3 --- /dev/null +++ b/src/console.pas @@ -0,0 +1,954 @@ +unit console; + +interface + const + version='BETA 8 FIX'; + var + osadki:boolean; + bl_upd:integer; + s_get_drp:boolean; + particle_upd:boolean; + drw_back:boolean; + drw_sm:boolean; + s_max_fps:integer; + s_jpeg_quality:integer; + drawgui:boolean; + light_type:integer; + + ifosad:boolean; + //s_particles:boolean; - module + + load_sm:integer; + load_sky_siz:integer; + load_back_tex:boolean; + load_weather_tex:boolean; + load_particles_tex:boolean; + load_light_tex:boolean; + load_gui_tex:boolean; + + menu_background:integer; + + load_minimap_tex:boolean; + + //load_key_tex:integer; + + drw_stars:boolean; + + cheats:boolean; + + sd:string; + + //max_particles:integer; - module + + procedure save_settings; + procedure load_settings; + procedure call_console; + procedure exec(s, search:string; acces:boolean); + procedure addToLog(str:string); + +implementation +uses keyboard,particles_store,vars,maps,items,canvas,mob,worldgen,jsr75i,particles,func, player,sensor, drop, inv, furnace, items_store, video; +const + CON_LOG_SIZE=9; + PARSER_MAX_STR=15; + MAX_IMGREG=2; +var + logSTR: array [0..CON_LOG_SIZE] of string; + lastCommand:string; + + parseStr:string; + EOFstr, ENDstr:boolean; + + stack: array [0..0] of integer; + stack_pointer:integer; + + autoexec_acces:boolean; + regimg:image; + + procedure resetStack(size:integer); + begin + stack_pointer:=0; + size:=size+1; + bytecode + iload 0; + newarray 10; + putstatic field 'console', 'stack', '[I'; + end; + end; + + procedure pushStack(i:integer;); + begin + stack[stack_pointer]:=i; + stack_pointer:=stack_pointer+1; + end; + + function popStack:integer; + begin + stack_pointer:=stack_pointer-1; + popStack:=stack[stack_pointer]; + end; + + procedure swapStack; + var + tmp:integer; + begin + tmp:=stack[stack_pointer-2]; + stack[stack_pointer-2]:=stack[stack_pointer-1]; + stack[stack_pointer-1]:=tmp; + end; + + procedure dupStack; + begin + stack[stack_pointer]:=stack[stack_pointer-1]; + stack_pointer:=stack_pointer+1; + end; + + procedure resetTmpImg; + var + nullimg:image; + begin + regimg:=nullimg; + end; + +procedure addToLog(str:string); + var + i:integer; + begin + debug('::'+str); + for i:=CON_LOG_SIZE-1 downto 0 do + logSTR[i+1]:=logSTR[i]; + logSTR[0]:=str; + end; + + procedure setTexture(img:image; name:string; i:integer); + begin + name:=UpCase(name); + if name='BLOCK' then + begin + tex[i]:=img; + tex8[i]:=resize_image(img, 8, 8); + end; + else + if name='ITEM' then + begin + item[i]:=img; + item8[i]:=resize_image(img, 8, 8); + end; + else + if name='VKEY' then + setVkeyImg(img, i); + else + addToLog('Error: unknown texture type "'+name+'"'); + end; + +procedure save_settings; + var + rs:recordstore; + t:integer; + begin + deleteRecordStore('S'); + rs:=openRecordStore('S'); + t:=addRecordStoreEntry(rs,version); + t:=addRecordStoreEntry(rs,''+light_type); + t:=addRecordStoreEntry(rs,''+ifosad); + t:=addRecordStoreEntry(rs,''+s_particles); + t:=addRecordStoreEntry(rs,''+drawgui); + t:=addRecordStoreEntry(rs,''+s_jpeg_quality); + t:=addRecordStoreEntry(rs,''+load_key_tex); + closeRecordStore(rs); + end; + +function sett_ld_bool(s:string):boolean; + begin + if s='true' then sett_ld_bool:=true; + end; + +procedure load_settings; + var + rs:recordstore; + begin + rs:=openRecordStore('S'); + if readRecordStoreEntry(rs,1)<>version then + begin + debug(readRecordStoreEntry(rs,1)); + closeRecordStore(rs); + exit; + end; + light_type:=stringtointeger(readRecordStoreEntry(rs,2)); + ifosad:=sett_ld_bool(readRecordStoreEntry(rs,3)); + s_particles:=sett_ld_bool(readRecordStoreEntry(rs,4)); + drawgui:=sett_ld_bool(readRecordStoreEntry(rs,5)); + s_jpeg_quality:=stringtointeger(readRecordStoreEntry(rs,6)); + load_key_tex:=stringtointeger(readRecordStoreEntry(rs,7)); + closeRecordStore(rs); + end; + +function isEOS(c:integer):boolean; + var + ch:char; + begin + ch:=chr(c); + if (ch=#$0A) or (ch=#$0D) then + isEOS:=true; + end; + +function isSpace(c:integer;):boolean; + var + ch:char; + begin + ch:=chr(c); + if ((ch=' ') or (ch=#$09) or (ch=#$0B) or isEOS(c)) then + isSpace:=true; + end; + +function nextByte(res:resource):integer; + var + i:integer; + begin + i:=ReadByte(res); + if i=EOF then + EOFstr:=true; + if isEOS(i) then + ENDstr:=true; + + nextByte:=i and $FF; + end; + +function ReadString(res:resource):string; + var + b:integer; + tmpstr:string; + begin + ENDstr:=false; + repeat + b:=nextByte(res); + if EOFstr or ENDstr then + break; + + tmpstr:=tmpstr+chr(b); + forever; + ReadString:=tmpstr; + end; + +function nextChar:integer; + var + i:integer; + begin + ENDstr:=false; + if length(parseStr)>0 then + begin + i:=ord(getChar(parseStr, 0)); + parseStr:=copy(parseStr, 1, length(parseStr)); + if isEOS(i) then + ENDstr:=true; + end; + else + begin + parseStr:=''; + ENDstr:=true; + end; + + nextChar:=i; + end; + +procedure clearSpaces; + var + i:integer; + begin + repeat + i:=nextChar; + if ENDstr then + exit; + + {Symbol ';' is one line commentary} + if i=$3B then + begin + repeat + i:=nextChar; + if ENDstr then + exit; + forever; + end; + + if isSpace(i)=false then + begin + //Go back + parseStr:=chr(i)+parseStr; + exit; + end; + forever; + end; + +function nextWord:string; + var + str:string; + i:integer; + begin + ENDstr:=false; + clearSpaces; + repeat + i:=nextChar; + + if ENDstr then + begin + nextWord:=str; + exit; + end; + + if isSpace(i) then + begin + //Go back + parseStr:=chr(i)+parseStr; + nextWord:=str; + exit; + end; + else + str:=str+chr(i); + forever; + end; + +function strToBool(str:string):boolean; + begin + str:=UpCase(str); + if str='TRUE' then + strToBool:=true; + else + if str='FALSE' then + strToBool:=true; + else + if StringToInteger(str)<>0 then + strToBool:=true; + else + strToBool:=false; + end; + +//Перевод строки в целое число. base - система счисления +function Str2Dec(str:string; base:integer;):integer; + var + i, tmp, res:integer; + ch:char; + neg:boolean; + begin + str:=UpCase(str); + if GetChar(str, 0)='-' then + begin + neg:=true; + i:=i+1; + end; + + for i:=i to length(str)-1 do + begin + ch:=GetChar(str, i); + if ((ch>='0') and (ch<='9')) then + tmp:=ord(ch)-$30; + else + if ((ch>='A') and (ch<=chr($36+base))) then + tmp:=ord(ch)-$37; + else + begin + addToLog('Error! I cant decode "'+str+'" -> "'+ch+'"'); + Str2Dec:=0; + exit; + end; + + res:=res*base+tmp; + end; + + if neg then + Str2Dec:=-res; + else + Str2Dec:=res; + end; + +function getVar(name:string):integer; + begin + name:=UpCase(name); + + if name='SCREEN_W' then + getVar:=getWidth; + else + if name='SCREEN_H' then + getVar:=getHeight; + else + addToLog('Unknown variable "'+name+'"'); + end; + +procedure setVar(name:string; value:integer); + begin + name:=UpCase(name); + + addToLog('I cant set variable "'+name+'"'); + end; + +function DecodeInt(str:string):integer; + var + head:char; + num:string; + begin + if str='' then + begin + addToLog('DecodeInt getted null string!'); + DecodeInt:=0; + exit; + end; + + str:=UpCase(str); + head:=getchar(str, 0); + num:=copy(str, 1, length(str)); + + if str='TRUE' then + DecodeInt:=1; + else + if str='FALSE' then + DecodeInt:=0; + else + if str='POP' then + DecodeInt:=popStack; + else + if head='$' then + DecodeInt:=getVar(num); + else + if (head='0') and (getchar(str, 1)='X') then + begin + DecodeInt:=Str2Dec(copy(str, 2, length(str)), 16); + end; + else + if (head='0') and (length(str)>1) then + begin + DecodeInt:=Str2Dec(num, 8); + end; + else + if head='B' then + begin + DecodeInt:=Str2Dec(num, 2); + end; + else + if ((head>='0') and (head<='9')) or (head='-') then + begin + DecodeInt:=Str2Dec(str, 10); + + end; + else + addToLog('Error! I cant decode "'+str+'"'); + end; + +procedure exeCommand(str:string); + var + com, tmp, tmp2:string; + i:integer; + begin + parseStr:=str; + clearSpaces; + if parseStr='' then + exit; + + com:=UpCase(nextWord); + + if (cheats) or (autoexec_acces) or (gamemode=1) then + begin + if com='TIME' then + game_time:=decodeInt(nextWord); + else + if com='FLY' then + fly:=strToBool(nextWord); + else + if com='PL_HP' then + hp:=decodeInt(nextWord); + else + if com='PL_EP' then + hunger:=decodeInt(nextWord); + else + if com='GIVE' then + player.dropItem(decodeInt(nextWord), decodeInt(nextWord)); + else + if com='PL_TP' then + begin + player.setX(decodeInt(nextWord)); + player.setY(decodeInt(nextWord)); + end; + else + if com='GAMEMODE' then + begin + gamemode:=decodeInt(nextWord); + fly:=false; + end; + else + {if com='KILL_MOBS' then + for i:=0 to 31 do + begin + mob[i].m_type:=0; + mob[i].m_hp:=0; + end; + else} + if com='SPAWN' then + begin + player.setX(get_spawn_x*16+4); + player.setY(get_spawn_y*16); + end; + else + {if com='SPAWN_MOBS' then + s_spawn_mob:=strToBool(nextWord); + else} + {if com='SURVIVAL' then + begin + fly:=false; + gamemode:=0; + hp:=20; + hunger:=20; + for i:=0 to 35 do + begin + inv[i].item_i:=0; + inv[i].sum_i:=0; + end; + end; + else} + if com='CLEAR_INVENTORY' then + begin + inv.resetData; + end; + else + + end; + + if com='I_AM_CHEATER' then + begin + if nextWord=#$36+#$36+#$36 then + cheats:=not cheats; + else + cheats:=false; + end; + else + if com='HALT' then + halt; + else + if com='WEATHER' then + osadki:=strToBool(nextWord); + else + {if com='MEGASPAWN' then + megaspawn; + else} + if com='REF_DRP' then + ref_drp:=strToBool(nextWord); + else + if com='BL_UPD' then + bl_upd:=decodeInt(nextWord); + else + if com='GET_DRP' then + s_get_drp:=strToBool(nextWord); + else + {if com='AI_UPD' then + ai_upd:=strToBool(nextWord); + else} + if com='PRT_UPD' then + particle_upd:=strToBool(nextWord); + else + if com='MAX_FPS' then + s_max_fps:=decodeInt(nextWord); else + if com='DRW_BACK' then + drw_back:=strToBool(nextWord); + else + {if com='DRW_MOBS' then + drw_mobs:=strToBool(nextWord); + else} + if com='DRP_PHY' then + drp_phy:=strToBool(nextWord); + else + if com='DRW_SM' then + drw_sm:=strToBool(nextWord); + else + if com='JPEG_Q' then + begin + s_jpeg_quality:=decodeInt(nextWord); + if s_jpeg_quality>100 then + s_jpeg_quality:=100; + else if s_jpeg_quality<0 then + s_jpeg_quality:=0; + end; + else + if com='LOAD_SM' then + load_sm:=decodeInt(nextWord); + else + if com='S_WEATHER' then + ifosad:=strToBool(nextWord); + else + if com='S_HIDE_GUI' then + drawgui:=strToBool(nextWord); + else + if com='S_LIGHT' then + light_type:=decodeInt(nextWord); + else + if com='S_PARTICLES' then + s_particles:=strToBool(nextWord); + else + if com='LOAD_SKY' then + load_sky_siz:=decodeInt(nextWord); + else + {if com='LOAD_MOB_TEX' then + load_mob_tex:=strToBool(nextWord); + else} + if com='LOAD_BACK_TEX' then + load_back_tex:=strToBool(nextWord); + else + if com='LOAD_WEATHER_TEX' then + load_weather_tex:=strToBool(nextWord); + else + if com='LOAD_PARTICLES_TEX' then + load_particles_tex:=strToBool(nextWord); + else + if com='LOAD_LIGHT_TEX' then + load_light_tex:=strToBool(nextWord); + else + if com='LOAD_GUI_TEX' then + load_gui_tex:=strToBool(nextWord); + else + if com='MENU_BACKGROUND' then + menu_background:=decodeInt(nextWord); + else + if com='DRW_DRP' then + drw_drp:=strToBool(nextWord); + else + if com='DRW_STARS' then + drw_stars:=strToBool(nextWord); + else + if com='SV_SETT' then + save_settings; + else + if com='LD_SETT' then + load_settings; + else + if com='LOAD_MINIMAP_TEX' then + load_minimap_tex:=strToBool(nextWord); + else + if com='MAX_PARTICLES' then + begin + max_particles:=decodeInt(nextWord); + reset_particles(max_particles+1); + end; + else + if com='EXEC' then + begin + tmp:=nextWord; + exec(nextWord, tmp, autoexec_acces); + end; + else + if com='RESET_ITEMS' then + begin + resetItems(decodeInt(nextWord)+1); + //addToLog('Max items: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_ITEM' then + begin + setItemData(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_BLOCKS' then + begin + resetBlocks(decodeInt(nextWord)+1); + //addToLog('Max blocks: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_BLOCK' then + begin + setBlockData(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_TOOLS' then + begin + resetTools(decodeInt(nextWord)+1); + //addToLog('Max tools: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_TOOL' then + begin + setToolData(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_FUELS' then + begin + furnace.setMaxFuel(decodeInt(nextWord)); + //addToLog('Max fuel: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_FUEL' then + begin + furnace.initFuel(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_RECIPES' then + begin + furnace.setMaxRecipes(decodeInt(nextWord)); + //addToLog('Max recipes: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_RECIPE' then + begin + furnace.initRecipe(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_CRAFTS' then + begin + resetCrafts(decodeInt(nextWord)); + //addToLog('Max crafts: '+decodeInt(parsed_str[1])); + end; + else + if com='SET_CRAFT_IN' then + begin + setCraftIn(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='SET_CRAFT_OUT' then + begin + setCraftOUT(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + end; + else + if com='RESET_BLOCKS_TEX' then + begin + initBlockTex(decodeInt(nextWord)); + end; + else + if com='RESET_ITEMS_TEX' then + begin + initItemTex(decodeInt(nextWord)); + end; + else + if com='LOAD_TEX' then + regimg:=ld_tex(nextWord, '/'+sd+'/cavecraft/', ''); + else + if com='RESET_TEX' then + resetTmpImg; + else + if com='SET_TEX' then + setTexture(regimg, + nextWord, + decodeInt(nextWord)); + if com='SET_CANV_TEX' then + begin + tmp:=nextWord; + tmp2:=nextWord; + setTexture(rotate_image_from_image(regimg, + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + 0), + tmp, + decodeInt(tmp2)); + end; + else + if com='SET_MAX_ITEM_LIST' then + setMaxItemList(decodeInt(nextWord)); + else + if com='SET_ITEM_LIST' then + setItemList(decodeInt(nextWord), + decodeInt(nextWord)); + else + if com='BIND_KEY' then + begin + tmp:=nextWord; + for i:=0 to MAX_KEY_BIND do + keyboard.bindKey(decodeInt(tmp), i, decodeInt(nextWord)); + end; + else + if com='STACK' then + resetStack(decodeInt(nextWord)); + else + if com='PUSH' then + pushStack(decodeInt(nextWord)); + else + if com='POP' then + i:=popStack; + else + if com='SWAP' then + swapStack; + else + if com='DUP' then + dupStack; + else + if com='ADD' then + pushStack(popStack+popStack); + else + if com='SUB' then + begin + i:=popStack; + pushStack(popStack-i); + end; + else + if com='MUL' then + pushStack(popStack*popStack); + else + if com='DIV' then + begin + i:=popStack; + pushStack(popStack/i); + end; + else + if com='MOD' then + begin + i:=popStack; + pushStack(popStack mod i); + end; + else + if com='SET' then + setVar(nextWord, decodeInt(nextWord)); + else + if com='POPSET' then + setVar(nextWord, popStack); + else + if com='MAX_VKEYS' then + resetVirtualKeyboard(decodeInt(nextWord)); + else + if com='SET_VKEY' then + bindVKey(decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord), + decodeInt(nextWord)); + else + if com='SET_RESOLUTION' then + initVideo(decodeInt(nextWord), decodeInt(nextWord), strToBool(nextWord)); + else + //addToLog('Unknown command "'+com+'"'); + end; + +procedure call_console; + var + commandTxt:integer; + i, tmpid:integer; + exitCmd, exeCmd, Clicked:command; + str:string; + begin + + setFont(FONT_FACE_SYSTEM,FONT_STYLE_PLAIN,FONT_SIZE_SMALL); + + repeat + ClearForm; + + exitCmd:=createCommand('Exit', CM_EXIT, 1); + exeCmd:=createCommand('Execute', CM_OK, 1); + addCommand(exitCmd); + addCommand(exeCmd); + + commandTxt:=formAddTextField('Enter command:', ''+lastCommand, 32, TF_ANY); + + for i:=0 to CON_LOG_SIZE do + tmpid:=formAddString(logSTR[i]+chr(10)); + + ShowForm; + Repaint; + + repeat + Clicked:=getClickedCommand; + if Clicked=exitCmd then + begin + lastCommand:=formGetText(commandTxt); + showCanvas; + exit; + end; + else + if Clicked=exeCmd then + begin + str:=formGetText(commandTxt); + addToLog(str); + exeCommand(str); + lastCommand:=''; + break; + end; + forever; + forever; + end; + +procedure exec(s, search:string; acces:boolean); + var + res:resource; + str:string; + tmp_acces, tmpEOF:boolean; + begin + tmp_acces:=autoexec_acces; + autoexec_acces:=acces; + + search:=UpCase(search); + + if search='LOCAL' then + begin + addToLog('Load file "'+s+'" at LOCAL!'); + res:=OpenResource('/'+s); + end; + else + if search='SD' then + begin + if open_file('/'+sd+'/cavecraft/'+s)=1 then + begin + addToLog('Load file "'+s+'" at SD!'); + res:=get_stream; + end; + end; + else + if search='AUTO' then + begin + addToLog('path "/'+sd+'/cavecraft/'+s+'"'); + if file_exists('/'+sd+'/cavecraft/'+s)=1 then + begin + if open_file('/'+sd+'/cavecraft/'+s)=1 then + begin + addToLog('Load file "'+s+'" at SD(AUTO)!'); + res:=get_stream; + end; + end; + else + begin + addToLog('Load file "'+s+'" at LOCAL(AUTO)!'); + res:=OpenResource('/'+s); + end; + end; + else + begin + addToLog('Unknown load type "'+search+'", file "'+s+'" not executed!'); + autoexec_acces:=tmp_acces; + exit; + end; + + if ResourceAvailable(res) then + repeat + str:=ReadString(res); + tmpEOF:=EOFstr; + //addToLog('Exec: "'+str+'"'); + exeCommand(str); + EOFstr:=tmpEOF; + until EOFstr; + else + addToLog('Execute file "'+s+'" not found!'); + + CloseResource(res); + autoexec_acces:=tmp_acces; + end; + +initialization + +end. diff --git a/src/craft.mpsrc b/src/craft.mpsrc new file mode 100644 index 0000000..db148dd --- /dev/null +++ b/src/craft.mpsrc @@ -0,0 +1,92 @@ +unit craft; + +interface + procedure createCraft(id, mode:integer); + function canCreateCraft(id, mode:integer):boolean; + +implementation + uses vars, items, func, player, inv, items_store; + +procedure createCraft(id, mode:integer); + var + i, j, tmp_sum, tmp_s, item, sum:integer; + begin + if canCreateCraft(id, mode)=false then + exit; + + //Выпиливаем все необходимые предметы + for i:=0 to 3 do + begin + tmp_sum:=getCraftInSum(id, i); + for j:=0 to INV_SIZE do + begin + item:=inv.getItem(j); + sum:=inv.getSum(j); + + if getCraftInItem(id, i)=item then + begin + tmp_s:=tmp_sum-sum; + + if tmp_s<1 then + begin + sum:=sum-tmp_sum; + inv.setSum(sum, j); + inv.fixNull(j); + break; + end; + else + begin + sum:=0; + tmp_sum:=tmp_s; + inv.setSum(sum, j); + inv.fixNull(j); + end; + end; + end; + end; + + item:=getCraftOutItem(id); + sum:=getCraftOutSum(id); + + sum:=inv.giveItem(item, sum); + if sum>0 then + player.dropItem(sum, sum); + end; + +//Проверка, может ли игрок сделать этот крафт. +function canCreateCraft(id, mode:integer):boolean; + var + i, j, tmp_sum:integer; + canCreate:boolean; + begin + //Если место крафта подходит, то продолжаем крафт + if mode>=getCraftOutFlag(id) then + canCreate:=true; + else + exit; + + //Проверяем каждую ячейку крафта + for i:=0 to 3 do + begin + //Получаем общуюю сумму подходящего предмета + tmp_sum:=0; + if getCraftInItem(id, i)>0 then + begin + for j:=0 to INV_SIZE do + begin + if getCraftInItem(id, i)=inv.getItem(j) then + tmp_sum:=tmp_sum+inv.getSum(j); + end; + + //Проверяем, подходит ли количество предметов + if tmp_sum>=getCraftInSum(id, i) then + canCreate:=canCreate and true; + else + exit; + end; + end; + + canCreateCraft:=canCreate; + end; + +end. diff --git a/src/drop.mpsrc b/src/drop.mpsrc new file mode 100644 index 0000000..a691f98 --- /dev/null +++ b/src/drop.mpsrc @@ -0,0 +1,214 @@ +unit drop; + +interface + var + drp_phy, drw_drp, ref_drp:boolean; + + function max:integer; + function getX(i:integer):integer; + function getY(i:integer):integer; + function getW:integer; + function getH:integer; + function getItem(i:integer):integer; + function getSum(i:integer):integer; + procedure setItem(val, i:integer); + procedure setSum(val, i:integer); + function isNull(i:integer):boolean; + procedure fixNull(i:integer); + + procedure draw(camx, camy:integer); + procedure calcPhy; + procedure reflux; + + procedure create(item, sum, x, y:integer); + procedure resetData; + procedure saveData; + procedure loadData; + +implementation + uses phy, jsr75i, vars, items_store, items, func; + const + MAX_DROP=255; + DROP_W=8; + DROP_H=8; + var + drop_x, drop_y, drop_vely: array [0..MAX_DROP] of integer; + drop_item, drop_sum: array [0..MAX_DROP] of integer; + + old_drop, ref_drp_count:integer; + + function max:integer; + begin + max:=MAX_DROP; + end; + + function getX(i:integer):integer; + begin + getX:=drop_x[i]; + end; + + function getY(i:integer):integer; + begin + getY:=drop_y[i]; + end; + + function getW:integer; + begin + getW:=DROP_W; + end; + + function getH:integer; + begin + getH:=DROP_H; + end; + + function getItem(i:integer):integer; + begin + getItem:=drop_item[i]; + end; + + function getSum(i:integer):integer; + begin + getSum:=drop_sum[i]; + end; + + procedure setItem(val, i:integer); + begin + drop_item[i]:=val; + end; + + procedure setSum(val, i:integer); + begin + drop_sum[i]:=val; + end; + + function isNull(i:integer):boolean; + begin + if (drop_item[i]<1) or (drop_sum[i]<1) then + isNull:=true; + end; + + procedure fixNull(i:integer); + begin + if isNull(i) then + begin + drop_item[i]:=0; + drop_sum[i]:=0; + end; + end; + + procedure create(item, sum, x, y:integer); + var + i:integer; + begin + for i:=0 to MAX_DROP do + if isNull(i) then + begin + drop_item[i]:=item; + drop_sum[i]:=sum; + drop_x[i]:=x; + drop_y[i]:=y; + drop_vely[i]:=0; + exit; + end; + + drop_item[old_drop]:=item; + drop_sum[old_drop]:=sum; + drop_x[old_drop]:=x; + drop_y[old_drop]:=y; + drop_vely[old_drop]:=0; + + old_drop:=old_drop+1; + if old_drop>MAX_DROP then + old_drop:=0; + end; + + procedure calcPhy; + var + i:integer; + begin + if drp_phy then + for i:=0 to MAX_DROP do + if isNull(i)=false then + begin + phy.loadObject(drop_x[i], drop_y[i], DROP_W, DROP_H, 0, drop_vely[i], false); + phy.calc(true); + drop_x[i]:=phy.getX; + drop_y[i]:=phy.getY; + drop_vely[i]:=phy.getVelY; + end; + end; + + procedure draw(camx, camy:integer); + var + i:integer; + begin + if drw_drp then + for i:=0 to 255 do + if isNull(i)=false then + drawSmallItem(drop_item[i], drop_x[i]-camx, drop_y[i]-camy); + end; + + procedure reflux; + var + i:integer; + begin + if ref_drp then + begin + for i:=ref_drp_count+1 to MAX_DROP do + if (isNull(ref_drp_count) and isNull(i))=false then + if (drop_item[ref_drp_count]=drop_item[i]) and (drop_x[ref_drp_count]=drop_x[i]) and (drop_y[ref_drp_count]=drop_y[i]) then + begin + drop_sum[ref_drp_count]:=drop_sum[ref_drp_count]+drop_sum[i]; + drop_item[i]:=0; + drop_sum[i]:=0; + end; + + ref_drp_count:=ref_drp_count+1; + if ref_drp_count>MAX_DROP then ref_drp_count:=0; + end; + end; + + procedure resetData; + var + i:integer; + begin + for i:=0 to MAX_DROP do + begin + drop_item[i]:=0; + drop_sum[i]:=0; + drop_x[i]:=0; + drop_y[i]:=0; + drop_vely[i]:=0; + end; + end; + + procedure saveData; + var + i:integer; + begin + for i:=0 to MAX_DROP do + begin + write_byte(drop_item[i]); + writeint(drop_sum[i]); + writeint(drop_x[i]); + writeint(drop_y[i]); + write_byte(drop_vely[i]); + end; + end; + + procedure loadData; + var + i:integer; + begin + for i:=0 to MAX_DROP do + begin + drop_item[i]:=read_byte; + drop_sum[i]:=ReadInt; + drop_x[i]:=ReadInt; + drop_y[i]:=ReadInt; + drop_vely[i]:=read_byte; + end; + end; + +end. diff --git a/src/func.mpsrc b/src/func.mpsrc new file mode 100644 index 0000000..a80e3ec --- /dev/null +++ b/src/func.mpsrc @@ -0,0 +1,324 @@ +unit func; + +interface + function get_spawn_x:integer;//Возвращает блок по X где должен появиться игрок + function get_spawn_y:integer;//Возвращает блок по Y где должен появиться игрок + procedure draw_block(xx,yy:integer); + procedure drawSmallItem(item, x, y:integer); + procedure drawItem(item, sum, x, y:integer; indicator:boolean;); + procedure LoadDrawFont(s:string); + procedure DrawFontTextSpec(str:string; x, y, color:integer; spec:boolean;); + procedure DrawFontText(str:string; x, y:integer); +function ld_tex(name,path,folder:string):image; +function readint:integer; +procedure writeint(intt:integer); +procedure writebool(bo:boolean); +function readbool:boolean; +procedure writestr(s:string); +function readstr:string; + +implementation + uses canvas,imgcolor,jsr75i, vars, safeload, items,maps, items_store; + + //Загрузка изображения из текстурпака, ели такого нет, то происходит загрузка из архива игры +function ld_tex(name,path,folder:string):image; + begin + if tex_pack<>'' then + begin + if file_exists(path+folder+name)=1 then + begin + ld_tex:=safely_load_image_fs(path+folder+name); + end; else ld_tex:=loadimage('/'+folder+name); + end; + if tex_pack='' then ld_tex:=loadimage('/'+folder+name); + end; + +function readint:integer; + var + b:integer; + begin + b:=b or (read_uns_byte<<24); + b:=b or (read_uns_byte<<16); + b:=b or (read_uns_byte<<8); + b:=b or (read_uns_byte); + readint:=b; + end; + +procedure writeint(intt:integer); + begin + write_byte((intt>>24) and $FF); + write_byte((intt>>16) and $FF); + write_byte((intt>>8) and $FF); + write_byte((intt) and $FF); + end; + +procedure writebool(bo:boolean); + begin + if bo=true then + write_byte(1); + else + write_byte(0); + end; + +function readbool:boolean; + begin + readbool:=read_byte>0; + end; + +procedure writestr(s:string); + var + i:integer; + begin + for i:=0 to length(s) do + write_byte(ord(getChar(s,i))); + end; + +function readstr:string; + var + i,b:integer; + str:string; + begin + repeat + b:=read_byte; + if b=0 then break; + str:=str+chr(b); + until false; + readstr:=str; + end; + +//Получение точки спавна + function get_spawn_x:integer; + begin + get_spawn_x:=(255 div 2); + end; + + function get_spawn_y:integer; + var + iy:integer; + begin + for iy:=0 to 127 do + if getmap(get_spawn_x,iy)<>0 then begin get_spawn_y:=(iy-2); break; end; + end; + + procedure drawSmallItem(item, x, y:integer); + begin + if getItemTexType(item)=0 then + drawimage(tex8[getBlockTex(item)], x, y); + else + if getItemTexType(item)=1 then + drawimage(item8[getItemTex(item)], x, y); + end; + + procedure draw_block(xx,yy:integer); + begin + if (getmap(xx,yy)=123) or (getmap(xx,yy)=124) then + begin + setclip((xx*16)-camx,(yy*16)-camy,16,16); + if getmapinfo(xx,yy)<9 then drawimage(tex[142],(xx*16)-camx,(yy*16)-camy+(16-getmapinfo(xx,yy)*2)); else + if getmapinfo(xx,yy)=9 then drawimage(tex[143],(xx*16)-camx,(yy*16)-camy); + setclip(0,0,getwidth,getheight); + end; else + if (getmap(xx,yy)=92) or (getmap(xx,yy)=93) then + begin + if (getBlockSet(getmap(xx-1,yy))=false) and (getBlockSet(getmap(xx+1,yy))=true) then setclip((xx*16)-camx,(yy*16)-camy,10,16); else + if (getBlockSet(getmap(xx+1,yy))=false) and (getBlockSet(getmap(xx-1,yy))=true) then setclip((xx*16)-camx+6,(yy*16)-camy,10,16); else + if (getBlockSet(getmap(xx+1,yy))=true) and (getBlockSet(getmap(xx-1,yy))=true) then setclip((xx*16)-camx+6,(yy*16)-camy,4,16); + drawimage(tex[getBlockTex(getmap(xx,yy))],(xx*16)-camx,(yy*16)-camy); + setclip(0,0,getwidth,getheight); + end; else + if getmap(xx,yy)=27 then + begin + drawimage(tex[getBlockTex(getmap(xx,yy))],(xx*16)-camx,(yy*16)-camy); + if getmapinfo(xx,yy)<>0 then begin if random(8)0) then + drawimage(tex[134],xx*16-camx,yy*16-camy); + else + drawimage(tex[get_block(0,getmap(xx,yy))],(xx*16)-camx,(yy*16)-camy); + end; else*/ + if getmap(xx,yy)=121 then + begin + setclip((xx*16)-camx,(yy*16)-camy,getmapinfo(xx,yy),16); + drawimage(tex[getBlockTex(getmap(xx,yy))],(xx*16)-camx,(yy*16)-camy); + setclip(0,0,getWidth,getHeight); + end; else + if getmap(xx,yy)=122 then + begin + drawimage(tex[getBlockTex(getmap(xx,yy))+getmapinfo(xx,yy)],(xx*16)-camx,(yy*16)-camy); + end; else + if getmap(xx,yy)<>0 then + drawimage(tex[getBlockTex(getmap(xx,yy))],(xx*16)-camx,(yy*16)-camy); + end; + + procedure drawItem(item, sum, x, y:integer; indicator:boolean;); + var + pa_xo,ugol:integer; + begin + if sum>0 then + begin + if getItemTexType(item)=0 then + drawimage(tex[getBlockTex(item)], x, y); + else + if getItemTexType(item)=1 then + drawimage(vars.item[getItemTex(item)], x, y); + + if item=216 then + begin + drawimage(compas, x, y); + setcolor(255,0,0); + setclip(x+2, y+2, 12, 10); + if pl_world=0 then + drawline(get_spawn_x*16-camx, get_spawn_y*16-camy, x+8, y+7); + else + if pl_world=1 then + drawline(random(getWidth), random(getHeight), x+8, y+7); + setclip(0, 0, getWidth, getheight); + end; + else + if item=215 then + begin + drawimage(clock[clock_stage], x, y); + end; + end; + + if (sum>1) and indicator then + begin + if getItemIndLine(item) then + begin + pa_xo:=10000*16/getItemMax(item)*sum/10000; + if pa_xo<=3 then + setcolor(255,0,0); + else + setcolor(0,255,0); + drawline(x, y+14, x+pa_xo, y+14); + end; + + if getItemIndNum(item) then + drawfonttext(''+sum, x, y+8); + end; + end; + + +//Загрузка шрифта из файла под именем s +procedure LoadDrawFont(s:string); + var + ix:integer; + im:image; + begin + im:=ld_tex('default_font.png', s, ''); + for ix:=0 to FONT_MAX_SYM do + font[ix]:=rotate_image_from_image(im, ix*FONT_SYM_SIZE, 0, FONT_SYM_SIZE, FONT_SYM_SIZE, 0); + end; + +//Рисование текста графическим шрифтом +procedure DrawFontTextSpec(str:string; x, y, color:integer; spec:boolean;); + const + FONT_UNKNOWN_SYM=$3F; + FONT_SPEC_SYM=$FFA7;//UTF8 + var + ch, i, spec_c:integer; + tch:char; + begin + for i:=0 to length(str)-1 do + begin + ch:=ord(getChar(str, i)); + + if (spec) and (ch=FONT_SPEC_SYM) then + begin + + i:=i+1; + if i<=length(str)-2 then + begin + ch:=ord(getChar(str, i+1)); + tch:=getChar(UpCase(str), i); + if tch='0' then + color:=$FF000000; + else + if tch='1' then + color:=$FF0000AA; + else + if tch='2' then + color:=$FF00AA00; + else + if tch='3' then + color:=$FF00AAAA; + else + if tch='4' then + color:=$FFAA0000; + else + if tch='5' then + color:=$FFAA00AA; + else + if tch='6' then + color:=$FFAA5500; + else + if tch='7' then + color:=$FFAAAAAA; + else + if tch='8' then + color:=$FF555555; + else + if tch='9' then + color:=$FF5555FF; + else + if tch='A' then + color:=$FF55FF55; + else + if tch='B' then + color:=$FF55FFFF; + else + if tch='C' then + color:=$FFFF5555; + else + if tch='D' then + color:=$FFFF55FF; + else + if tch='E' then + color:=$FFFFFF55; + else + if tch='F' then + color:=$FFFFFFFF; + else + begin + i:=i-2; + ch:=ord(getChar(str, i)); + spec_c:=spec_c-2; + end; + + i:=i+1; + spec_c:=spec_c+2; + end; + end; + + if ch>FONT_MAX_SYM then + ch:=FONT_UNKNOWN_SYM; + + if color=FONT_STD_COLOR then + DrawImage(font[ch],x+((i-spec_c)*FONT_SYM_SIZE),y); + else + DrawImage(ReplaceImgColor(font[ch], FONT_STD_COLOR, color), x+((i-spec_c)*FONT_SYM_SIZE), y); + end; + end; + +//Рисование текста графическим шрифтом со стандартным цветом +procedure DrawFontText(str:string; x, y:integer); + begin + DrawFontTextSpec(str, x, y, FONT_STD_COLOR, true); + end; + + +end. diff --git a/src/furnace.mpsrc b/src/furnace.mpsrc new file mode 100644 index 0000000..7f568df --- /dev/null +++ b/src/furnace.mpsrc @@ -0,0 +1,369 @@ +unit furnace; + +interface + const + MAX_FURNACE=31; + MAX_FURNACE_CELLS=2; + + ITEM_IN_FIRE=10000; + + FURNACE_IN=0; + FURNACE_FUEL=1; + FURNACE_OUT=2; + + FURNACE_ERROR=-1; + + procedure setMaxFuel(i:integer); + procedure setMaxRecipes(i:integer); + procedure initFuel(id, item, time:integer); + procedure initRecipe(id, in_item, out_item:integer); + + function getTime:integer; + function startFuelTime(furid:integer):integer; + function endFuelTime(furid:integer):integer; + function startProgTime(furid:integer):integer; + function endProgTime(furid:integer):integer; + function FuelTime(i:integer):integer; + function ProgTime(i:integer):integer; + + function GetFurItem(cell, furid:integer;):integer; + procedure SetFurItem(val, cell, furid:integer;); + function GetFurSum(cell, furid:integer;):integer; + procedure SetFurSum(val, cell, furid:integer;); + + function CreateFurnace(x, y:integer;):integer; + procedure DestroyFurnace(x, y:integer); + procedure UpdateFurnaces; + + function furnaceBurn(i:integer):boolean; + function itemBurn(i:integer):boolean; + +implementation + uses maps, drop, items_store, items; + var + furnace_b: array [0..MAX_FURNACE] of boolean; + furnace_item, furnace_sum: array [0..MAX_FURNACE, 0..MAX_FURNACE_CELLS] of integer; + furnace_fstart, furnace_ftime, furnace_prstart: array [0..MAX_FURNACE] of integer; + + time:integer; + maxFuel, maxRecipe:integer; + fuel_item, fuel_time: array [0..0] of integer; + recept_in, recept_out: array [0..0] of integer; + + function getTime:integer; + begin + getTime:=time; + end; + + procedure UpdateTime; + begin + time:=getRelativeTimeMs; + end; + + function startFuelTime(i:integer):integer; + begin + startFuelTime:=furnace_fstart[i]; + end; + + function endFuelTime(i:integer):integer; + begin + endFuelTime:=furnace_fstart[i]+furnace_ftime[i]; + end; + + function FuelTime(i:integer):integer; + begin + FuelTime:=furnace_ftime[i]; + end; + + procedure updateFuelTime(fueltime, i:integer); + begin + furnace_fstart[i]:=getTime; + furnace_ftime[i]:=fueltime; + end; + + function startProgTime(i:integer):integer; + begin + startProgTime:=furnace_prstart[i]; + end; + + function endProgTime(i:integer):integer; + begin + endProgTime:=furnace_prstart[i]+ITEM_IN_FIRE; + end; + + function ProgTime(i:integer):integer; + begin + ProgTime:=ITEM_IN_FIRE; + end; + + procedure setMaxFuel(i:integer;); + begin + maxFuel:=i; + i:=i+1; + bytecode + iload 0; + newarray 10; + putstatic field 'furnace', 'fuel_item', '[I'; + end; + bytecode + iload 0; + newarray 10; + putstatic field 'furnace', 'fuel_time', '[I'; + end; + end; + + procedure setMaxRecipes(i:integer); + begin + maxRecipe:=i; + i:=i+1; + bytecode + iload 0; + newarray 10; + putstatic field 'furnace', 'recept_in', '[I'; + end; + bytecode + iload 0; + newarray 10; + putstatic field 'furnace', 'recept_out', '[I'; + end; + end; + + procedure initFuel(id, item, time:integer); + begin + fuel_item[id]:=item; + fuel_time[id]:=time; + end; + + procedure initRecipe(id, in_item, out_item:integer); + begin + recept_in[id]:=in_item; + recept_out[id]:=out_item; + end; + + procedure ResetProgress(furid:integer); + begin + furnace_prstart[furid]:=getTime; + end; + + function GetFurItem(cell, furid:integer;):integer; + begin + GetFurItem:=furnace_item[furid, cell]; + end; + + procedure SetFurItem(val, cell, furid:integer;); + begin + furnace_item[furid, cell]:=val; + end; + + function GetFurSum(cell, furid:integer;):integer; + begin + GetFurSum:=furnace_sum[furid, cell]; + end; + + procedure SetFurSum(val, cell, furid:integer;); + begin + furnace_sum[furid, cell]:=val; + end; + + function FurCellIsNull(cell, furid:integer;):boolean; + begin + if (GetFurItem(cell, furid)<1) or (GetFurSum(cell, furid)<1) then + FurCellIsNull:=true; + end; + + procedure fixNull(cell, furid:integer;); + begin + if FurCellIsNull(cell, furid) then + begin + SetFurItem(0, cell, furid); + SetFurSum(0, cell, furid); + end; + end; + + function CreateFurnace(x, y:integer;):integer; + var + i, j:integer; + begin + for i:=0 to MAX_FURNACE do + if furnace_b[i]=false then + begin + furnace_b[i]:=true; + for j:=0 to MAX_FURNACE_CELLS do + begin + furnace_item[i, j]:=0; + furnace_sum[i, j]:=0; + end; + furnace_fstart[i]:=getTime; + furnace_ftime[i]:=0; + furnace_prstart[i]:=getTime; + setMapInfo(i, x, y); + CreateFurnace:=i; + exit; + end; + CreateFurnace:=FURNACE_ERROR; + end; + + function FindFuel(furid:integer):integer; + var + i:integer; + begin + if FurCellIsNull(FURNACE_FUEL, furid)=false then + for i:=0 to maxFuel do + if GetFurItem(FURNACE_FUEL, furid)=fuel_item[i] then + begin + FindFuel:=i; + exit; + end; + FindFuel:=FURNACE_ERROR; + end; + + procedure DestroyFurnace(x, y:integer); + var + i, j:integer; + begin + i:=getMapInfo(x, y); + furnace_b[i]:=false; + for j:=0 to MAX_FURNACE_CELLS do + begin + if FurCellIsNull(j, i)=false then + drop.create(furnace_item[i, j], furnace_sum[i, j], x*16+4, y*16+4) + furnace_item[i, j]:=0; + furnace_sum[i, j]:=0; + end; + furnace_fstart[i]:=getTime; + furnace_ftime[i]:=0; + furnace_prstart[i]:=getTime; + end; + + function GetReceptOut(in_item:integer;):integer; + var + i:integer; + begin + for i:=0 to maxRecipe do + if in_item=recept_in[i] then + begin + GetReceptOut:=recept_out[i]; + exit; + end; + GetReceptOut:=FURNACE_ERROR; + end; + + function canUpdate(i:integer):boolean; + var + itemIN, itemOUT, sumOUT, recipeOUT:integer; + begin + fixNull(FURNACE_IN, i); + fixNull(FURNACE_OUT, i); + + itemIN:=GetFurItem(FURNACE_IN, i); + itemOUT:=GetFurItem(FURNACE_OUT, i); + sumOUT:=GetFurSum(FURNACE_OUT, i); + recipeOUT:=GetReceptOut(itemIN); + + if (itemIN<>0) and (recipeOUT<>FURNACE_ERROR) then + if (itemOUT=0) or ((itemOUT=recipeOUT) and (sumOUT=startFuelTime(i)) and (getTime<=endFuelTime(i)) then + furnaceBurn:=true; + end; + + function itemBurn(i:integer):boolean; + begin + if FurCellIsNull(FURNACE_IN, i)=false then + if (getTime>=startProgTime(i)) and (getTime<=endProgTime(i)) then + itemBurn:=true; + end; + + procedure useFuel(i:integer;); + var + fuelid, item, sum:integer; + begin + fuelid:=FindFuel(i); + item:=GetFurItem(FURNACE_FUEL, i); + sum:=GetFurSum(FURNACE_FUEL, i); + + if getItemDiv(item) then + begin + sum:=sum-1; + if sum<0 then + item:=0; + end; + else + begin + item:=0; + sum:=0; + end; + + updateFuelTime(fuel_time[fuelid], i); + + SetFurItem(item, FURNACE_FUEL, i); + SetFurSum(sum, FURNACE_FUEL, i); + end; + + procedure createOutItem(i:integer); + var + itemIN, sumIN, itemOUT, sumOUT, recipeOUT:integer; + begin + itemIN:=GetFurItem(FURNACE_IN, i); + sumIN:=GetFurSum(FURNACE_IN, i); + itemOUT:=GetFurItem(FURNACE_OUT, i); + sumOUT:=GetFurSum(FURNACE_OUT, i); + recipeOUT:=GetReceptOut(itemIN); + + if getItemDiv(itemIN) then + begin + sumIN:=sumIN-1; + if sumIN<0 then + itemIN:=0; + end; + else + begin + itemIN:=0; + sumIN:=0; + end; + + itemOUT:=recipeOUT; + sumOUT:=sumOUT+1; + + SetFurItem(itemIN, FURNACE_IN, i); + SetFurSum(sumIN, FURNACE_IN, i); + SetFurItem(itemOUT, FURNACE_OUT, i); + SetFurSum(sumOUT, FURNACE_OUT, i); + end; + + procedure UpdateFurnaces; + var + i, fuelid:integer; + begin + for i:=0 to MAX_FURNACE do + if furnace_b[i] then + if canUpdate(i) then + begin + if furnaceBurn(i) then + begin + if itemBurn(i)=false then + begin + createOutItem(i); + ResetProgress(i); + end; + end; + else + begin + fuelid:=FindFuel(i); + if fuelid=FURNACE_ERROR then + ResetProgress(i); + else + useFuel(i); + end; + end; + else + ResetProgress(i); + + UpdateTime; + end; + +end. diff --git a/src/gameui.mpsrc b/src/gameui.mpsrc new file mode 100644 index 0000000..8d705cf --- /dev/null +++ b/src/gameui.mpsrc @@ -0,0 +1,99 @@ +unit gameui; + +interface + const + UI_MAX_STACK=2;//3 + UI_MAX_ELEMENTS=62;//63 + + UI_TYPE_NULL=0; + + UI_ERROR=-1; + + procedure NewUILayer; + procedure DelUILayer; + function addUIElement(el_type, x, y:integer):integer; + procedure delUIElement(i:integer); + procedure clearUIElements; + function getUIx(i:integer):integer; + function getUIy(i:integer):integer; + function getUIw(i:integer):integer; + function getUIh(i:integer):integer; + +implementation +//Main UI functions and vars + var + layer:integer; + ui_type: array [0..UI_MAX_STACK, 0..UI_MAX_ELEMENTS] of integer; + ui_x: array [0..UI_MAX_STACK, 0..UI_MAX_ELEMENTS] of integer; + ui_y: array [0..UI_MAX_STACK, 0..UI_MAX_ELEMENTS] of integer; + + procedure NewUILayer; + begin + layer:=layer+1; + //Test + ui_type[layer, 0]:=ui_type[layer, 0]; + end; + + procedure DelUILayer; + begin + layer:=layer-1; + //Test + ui_type[layer, 0]:=ui_type[layer, 0]; + end; + + //Return id added element or UI_ERROR + function addUIElement(el_type, x, y:integer):integer; + var + i:integer; + begin + for i:=0 to UI_MAX_ELEMENTS do + if ui_type[layer, i]=UI_TYPE_NULL then + begin + ui_type[layer, i]:=el_type; + ui_x[layer, i]:=x; + ui_y[layer, i]:=y; + addUIElement:=i; + exit; + end; + + addUIElement:=UI_ERROR; + end; + + procedure delUIElement(i:integer); + begin + ui_type[layer, i]:=UI_TYPE_NULL; + ui_x[layer, i]:=0; + ui_y[layer, i]:=0; + end; + + procedure clearUIElements; + var + i:integer; + begin + for i:=0 to UI_MAX_ELEMENTS do + delUIElement(i); + end; + + function getUIx(i:integer):integer; + begin + getUIx:=ui_x[layer, i]; + end; + + function getUIy(i:integer):integer; + begin + getUIy:=ui_y[layer, i]; + end; + + function getUIw(i:integer):integer; + begin + getUIw:=0; + end; + + function getUIh(i:integer):integer; + begin + getUIh:=0; + end; + +initialization + +end. diff --git a/src/inv.mpsrc b/src/inv.mpsrc new file mode 100644 index 0000000..76ba270 --- /dev/null +++ b/src/inv.mpsrc @@ -0,0 +1,148 @@ +unit inv; + +interface + const + INV_SIZE=35; + + + function getItem(i:integer):integer; + function getSum(i:integer):integer; + procedure setItem(val, i:integer); + procedure setSum(val, i:integer); + function isNull(i:integer):boolean; + procedure fixNull(i:integer); + + function giveItem(ityp, isum:integer):integer; + + procedure resetData; + procedure saveData; + procedure loadData; + +implementation + uses items_store, vars, jsr75i, items, func; + var + inv_item: array [0..INV_SIZE] of integer; + inv_sum: array [0..INV_SIZE] of integer; + + function getItem(i:integer):integer; + begin + getItem:=inv_item[i]; + end; + + function getSum(i:integer):integer; + begin + getSum:=inv_sum[i]; + end; + + procedure setItem(val, i:integer); + begin + inv_item[i]:=val; + end; + + procedure setSum(val, i:integer); + begin + inv_sum[i]:=val; + end; + + function isNull(i:integer):boolean; + begin + if (getItem(i)<1) or (getSum(i)<1) then + isNull:=true; + end; + + procedure fixNull(i:integer); + begin + if isNull(i) then + begin + setItem(0, i); + setSum(0, i); + end; + end; + + //Добавить предмет в инвентарь, возващает количество не полученых предметов. +function giveItem(ityp, isum:integer):integer; + var + i, item, sum:integer; + begin + //Ищем такой же предмет только если он имеет возможность делиться + if getItemDiv(ityp) then + for i:=0 to INV_SIZE do + begin + item:=getItem(i); + sum:=getSum(i); + + if (item=ityp) and (isNull(i)=false) then + if isumgetItemMax(ityp) then + begin + isum:=sum-getItemMax(ityp); + sum:=sum-isum; + end; + + setSum(sum, i); + + if isum<1 then + exit; + end; + end; + + for i:=0 to INV_SIZE do + if isNull(i) then + begin + sum:=isum; + isum:=0; + + if sum>getItemMax(ityp) then + begin + isum:=sum-getItemMax(ityp); + sum:=sum-isum; + end; + + setItem(ityp, i); + setSum(sum, i); + + if isum<1 then + exit; + end; + + giveItem:=isum; + end; + + procedure resetData; + var + i:integer; + begin + for i:=0 to INV_SIZE do + begin + setItem(0, i); + setSum(0, i); + end; + end; + + procedure saveData; + var + i:integer; + begin + for i:=0 to INV_SIZE do + begin + write_byte(getItem(i)); + WriteInt(getSum(i)); + end; + end; + + procedure loadData; + var + i:integer; + begin + for i:=0 to INV_SIZE do + begin + setItem(read_byte, i); + setSum(ReadInt, i); + end; + end; + +end. diff --git a/src/invui.mpsrc b/src/invui.mpsrc new file mode 100644 index 0000000..3b642f5 --- /dev/null +++ b/src/invui.mpsrc @@ -0,0 +1,859 @@ +unit invui; + +interface + procedure OpenFurnaceWindow(furid:integer); + procedure OpenFastCraftWindow(mode:integer); + procedure OpenChestWindow(n:integer;); + procedure OpenCreativeWindow; + procedure OpenPlayerInventory; + procedure DrawWindows; + function WindowKeyHanler:boolean; + +implementation + uses vars, CellUI, console, Canvas, items, utils, craft, furnace, func, items_store, player, keyboard; + const + WINDOW_PLAYER_INV=1; + WINDOW_DIV_ITEMS=2; + WINDOW_CEATIVE_INV=3; + WINDOW_CHEST_INV=4; + WINDOW_FASTCRAFT=5; + WINDOW_FURNACE=6; + + INV_MODE_SELECT1=0; + INV_MODE_SELECT2=1; + INV_MODE_SELECT2_DIV=2; + + MAX_CREATIVE_OFFSET=248;//32*8-8 + MAX_FASTCRAFT_OFFSET=232;//24*10-8 + + WINDOW_INFO_INVMODE=0; + WINDOW_INFO_DIVRES=1; + WINDOW_INFO_FUR_ID=2; + + WINDOW_INFO_DIV_ITEM=0; + WINDOW_INFO_DIV_SUM1=1; + WINDOW_INFO_DIV_SUM2=2; + + WINDOW_INFO_FC_MODE=0; + + var + InvWindowImg:image; + DivWindowImg, DivScrollImg:image; + CrWindowImg, CrScrollImg:image; + ChestWindowImg:image; + fcWindowImg, fcScrollImg, fcCanCraftImg:image; + furWindowImg, furFireImg, furProgressImg:image; + + function calcScrollBar(scrollSize, buttonSize, maxEl, currentEl:integer):integer; + const + DivAccuracy=100000; + begin + if (currentEl=0) or (maxEl=0) then + calcScrollBar:=0; + else + if (currentEl<>maxEl) then + calcScrollBar:=DivAccuracy*(scrollSize-buttonSize)/maxEl*currentEl/DivAccuracy; + else + calcScrollBar:=scrollSize-buttonSize; + end; + + procedure OpenFurnaceWindow(furid:integer); + var + i, j, id:integer; + begin + NewLayer; + SetWindowType(WINDOW_FURNACE); + SetCurActive(true, CUR_SELECT1); + + SetWindowInfo(furid, WINDOW_INFO_FUR_ID); + + if FindCurrentWindowsType=false then + begin + furWindowImg:=ld_tex('furnace.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + furFireImg:=rotate_image_from_image(furWindowImg, 0, 166, 14, 14, 0); + furProgressImg:=rotate_image_from_image(furWindowImg, 14, 166, 24, 17, 0); + furWindowImg:=rotate_image_from_image(furWindowImg, 0, 0, 176, 166, 0); + end; + + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18, true); + id:=id+1; + end; + + for i:=1 to 3 do + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18+4, true); + id:=id+1; + end; + + initCell(CELL_TYPE_FURNACE, FURNACE_IN, 0, furid, 56, 97, true); + initCell(CELL_TYPE_FURNACE, FURNACE_FUEL, 0, furid, 56, 133, true); + initCell(CELL_TYPE_FURNACE, FURNACE_OUT, 0, furid, 116, 115, true); + end; + + procedure DrawFurnaceWindow(x, y:integer); + var + furid, i, time:integer; + begin + furid:=GetWindowInfo(WINDOW_INFO_FUR_ID); + + DrawImage(furWindowImg, x, y); + + time:=furnace.getTime; + if furnaceBurn(furid) then + begin + i:=calcScrollBar(14, 0, furnace.FuelTime(furid), furnace.endFuelTime(furid)-time); + debug('i: '+i+'; time: '+time+'; fueltime:'+furnace.FuelTime(furid)+'; c: '+(furnace.endFuelTime(furid)-time)); + SetClip(x+56, y+130-i, 18, i); + DrawImage(furFireImg, x+56, y+116); + + if itemBurn(furid) then + begin + i:=calcScrollBar(24, 0, furnace.ProgTime(furid), furnace.endProgTime(furid)-time); + + SetClip(x+79, y+114, 24-i, 17); + DrawImage(furProgressImg, x+79, y+114); + end; + + SetClip(0, 0, getWidth, getHeight); + end; + + end; + + procedure CloseFurnaceWindow; + var + nullimg:image; + begin + if FindCurrentWindowsType=false then + begin + furWindowImg:=nullimg; + furFireImg:=nullimg; + furProgressImg:=nullimg; + end; + DelLayer; + end; + + procedure OpenFastCraftWindow(mode:integer); + var + i, j, id:integer; + begin + NewLayer; + SetWindowType(WINDOW_FASTCRAFT); + SetCurActive(true, CUR_SELECT1); + + SetWindowInfo(mode, WINDOW_INFO_FC_MODE); + + if FindCurrentWindowsType=false then + begin + fcWindowImg:=ld_tex('fastcraft.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + fcScrollImg:=rotate_image_from_image(fcWindowImg, 0, 126, 12, 15, 0); + fcCanCraftImg:=rotate_image_from_image(fcWindowImg, 12, 126, 20, 18, 0); + fcWindowImg:=rotate_image_from_image(fcWindowImg, 0, 0, 176, 126, 0); + end; + + for i:=0 to 2 do + for j:=0 to 7 do + begin + initCell(CELL_TYPE_FASTCRAFT, id, 0, -1, 8+j*18, 66+i*18, false); + id:=id+1; + end; + end; + + procedure DrawFastCraftWindow(x, y:integer); + var + mode, craftid:integer; + i, j, id:integer; + begin + mode:=GetWindowInfo(WINDOW_INFO_FC_MODE); + craftid:=getCellID(GetCurIndex(GetCur))+GetOffset(0);//FIX IT! Indexes + + DrawImage(fcWindowImg, x, y); + if canCreateCraft(craftid, mode) then + DrawImage(fcCanCraftImg, x+87, y+26); + + for i:=0 to 1 do + for j:=0 to 1 do + begin + drawItem(getCraftInItem(craftid, id), getCraftInSum(craftid, id), x+52+j*18, y+17+i*18, true); + id:=id+1; + end; + + drawItem(getCraftOutItem(craftid), getCraftOutSum(craftid), x+108, y+27, true); + + i:=calcScrollBar(52, getImageHeight(fcScrollImg), MAX_FASTCRAFT_OFFSET, getOffset(0)); + drawimage(fcScrollImg, x+156, y+66+i); + end; + + procedure CloseFastCraftWindow; + var + nullimg:image; + begin + if FindCurrentWindowsType=false then + begin + fcWindowImg:=nullimg; + fcScrollImg:=nullimg; + fcCanCraftImg:=nullimg; + end; + DelLayer; + end; + + procedure FindFastCraftUD(n:integer;); + var + old_cur, offset:integer; + begin + old_cur:=GetCurIndex(GetCur); + offset:=getOffset(0); + + if n<0 then + ShiftCurrentCur(FIND_CELL_UP); + if n>0 then + ShiftCurrentCur(FIND_CELL_DOWN); + + if old_cur=GetCurIndex(GetCur) then + begin + if n<0 then + begin + offset:=offset-8; + if offset<0 then + offset:=0; + end; + else + if n>0 then + begin + offset:=offset+8; + if offset>MAX_FASTCRAFT_OFFSET then + offset:=MAX_FASTCRAFT_OFFSET; + end; + end; + + SetOffset(offset, 0); + end; + + procedure OpenChestWindow(n:integer;); + var + i, j, id:integer; + begin + NewLayer; + SetWindowType(WINDOW_CHEST_INV); + SetCurActive(true, CUR_SELECT1); + + if FindCurrentWindowsType=false then + begin + ChestWindowImg:=ld_tex('container.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + end; + + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18, true); + id:=id+1; + end; + + for i:=1 to 3 do + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18+4, true); + id:=id+1; + end; + + id:=0; + for i:=0 to 2 do + for j:=0 to 8 do + begin + initCell(CELL_TYPE_CHEST, id, 0, n, 8+j*18, 88+i*18, true); + id:=id+1; + end; + end; + + procedure CloseChestWindow; + var + nullimg:image; + begin + if FindCurrentWindowsType=false then + begin + ChestWindowImg:=nullimg; + end; + DelLayer; + end; + + procedure OpenCreativeWindow; + var + i, j, id:integer; + begin + NewLayer; + SetWindowType(WINDOW_CEATIVE_INV); + SetCurActive(true, CUR_SELECT1); + + if FindCurrentWindowsType=false then + begin + CrWindowImg:=ld_tex('creative.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + CrScrollImg:=rotate_image_from_image(CrWindowImg, 0, 108, 12, 15, 0); + CrWindowImg:=rotate_image_from_image(CrWindowImg, 0, 0, 176, 108, 0); + end; + + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18, true); + id:=id+1; + end; + + id:=0; + for i:=0 to 3 do + for j:=0 to 7 do + begin + initCell(CELL_TYPE_CREWATIVE_INV, id, 1, -1, 8+j*18, 30+i*18, false); + id:=id+1; + end; + end; + + procedure DrawCreativeWindow(x, y:integer;); + var + scroll, i:integer; + begin + DrawImage(CrWindowImg, x, y); + scroll:=getOffset(1); + i:=calcScrollBar(70, getImageHeight(CrScrollImg), MAX_CREATIVE_OFFSET, scroll); + drawimage(CrScrollImg, x+156, y+30+i); + end; + + procedure FindCeativeUD(n:integer;); + var + old_cur, offset:integer; + begin + old_cur:=GetCurIndex(GetCur); + offset:=getOffset(1); + + if n<0 then + ShiftCurrentCur(FIND_CELL_UP); + if n>0 then + ShiftCurrentCur(FIND_CELL_DOWN); + + if old_cur=GetCurIndex(GetCur) then + begin + if n<0 then + begin + offset:=offset-8; + if offset<0 then + offset:=0; + end; + else + if n>0 then + begin + offset:=offset+8; + if offset>MAX_CREATIVE_OFFSET then + offset:=MAX_CREATIVE_OFFSET; + end; + end; + + SetOffset(offset, 1); + end; + + procedure CloseCreativeWindow; + var + nullimg:image; + begin + if FindCurrentWindowsType=false then + begin + CrWindowImg:=nullimg; + CrScrollImg:=nullimg; + end; + DelLayer; + end; + + procedure OpenDivWindow; + var + item, sum:integer; + begin + debug('Open Div Window'); + item:=getItem(GetCurIndex(GetCur)); + sum:=getSum(GetCurIndex(GetCur)); + + NewLayer; + SetWindowType(WINDOW_DIV_ITEMS); + + if FindCurrentWindowsType=false then + begin + DivWindowImg:=ld_tex('partition.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + DivScrollImg:=rotate_image_from_image(DivWindowImg, 0, 50, 15, 12, 0); + DivWindowImg:=rotate_image_from_image(DivWindowImg, 0, 0, 88, 50, 0); + end; + + SetWindowInfo(item, WINDOW_INFO_DIV_ITEM); + SetWindowInfo(sum, WINDOW_INFO_DIV_SUM1); + end; + + procedure DivScroll(pp:integer); + var + sum1, sum2:integer; + begin + sum1:=GetWindowInfo(WINDOW_INFO_DIV_SUM1); + sum2:=GetWindowInfo(WINDOW_INFO_DIV_SUM2); + + sum2:=sum2+pp; + if sum2<0 then + sum2:=0; + if sum2>sum1 then + sum2:=sum1; + + SetWindowInfo(sum2, WINDOW_INFO_DIV_SUM2); + end; + + procedure DrawDivWindow(x, y:integer); + var + i, item, sum1, sum2:integer; + begin + DrawImage(DivWindowImg, x, y); + + item:=GetWindowInfo(WINDOW_INFO_DIV_ITEM); + sum1:=GetWindowInfo(WINDOW_INFO_DIV_SUM1); + sum2:=GetWindowInfo(WINDOW_INFO_DIV_SUM2); + + drawItem(item, (sum1-sum2), x+8, y+8, true); + drawItem(item, sum2, x+64, y+8, true); + + i:=calcScrollBar(72, getImageWidth(DivScrollImg), sum1, sum2); + + drawimage(DivScrollImg, x+8+i, y+30); + end; + + procedure CloseDivWindow(return_val:boolean); + var + res:integer; + nullimg:image; + begin + debug('Close Div Window'); + res:=GetWindowInfo(WINDOW_INFO_DIV_SUM2); + //Если таких окон нет, то чистим память + if FindCurrentWindowsType=false then + begin + DivWindowImg:=nullimg; + DivScrollImg:=nullimg; + end; + DelLayer; + SetWindowInfo(res, WINDOW_INFO_DIVRES); + + if return_val then + begin + SetCur(CUR_SELECT2); + SetCurActive(true, CUR_SELECT2); + SetCurIndex(GetCurIndex(CUR_SELECT1), CUR_SELECT2); + SetWindowInfo(INV_MODE_SELECT2_DIV, WINDOW_INFO_INVMODE); + end; + end; + + procedure OpenPlayerInventory; + var + i, j, id:integer; + begin + NewLayer; + SetWindowType(WINDOW_PLAYER_INV); + SetCurActive(true, CUR_SELECT1); + + //Если таких окон нет, то загружаем графику + if FindCurrentWindowsType=false then + begin + InvWindowImg:=ld_tex('inventory.png','/'+sd+'/cavecraft/texturepacks/'+tex_pack+'/','gui/'); + end; + + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18, true); + id:=id+1; + end; + + for i:=1 to 3 do + for j:=0 to 8 do + begin + initCell(CELL_TYPE_PLAYER_INV, id, 0, -1, 8+j*18, 8+i*18+4, true); + id:=id+1; + end; + end; + + procedure ClosePlayerInventory; + var + nullimg:image; + begin + debug('Close Player Inventory'); + //Если таких окон нет, то чистим память + if FindCurrentWindowsType=false then + begin + InvWindowImg:=nullimg; + end; + DelLayer; + end; + + procedure DrawWindows; + var + max:integer; + i, wtype, x, y:integer; + begin + max:=CellLayer; + for i:=0 to max do + begin + setCellLayer(i); + wtype:=GetWindowType; + if wtype=WINDOW_PLAYER_INV then + begin + x:=getWidth/2-getImageWidth(InvWindowImg)/2; + y:=getHeight/2-getImageHeight(InvWindowImg)/2; + DrawImage(InvWindowImg, x, y); + end; + else + if wtype=WINDOW_DIV_ITEMS then + begin + x:=getWidth/2-getImageWidth(DivWindowImg)/2; + y:=getHeight/2-getImageHeight(DivWindowImg)/2; + DrawDivWindow(x, y); + end; + else + if wtype=WINDOW_CEATIVE_INV then + begin + x:=getWidth/2-getImageWidth(CrWindowImg)/2; + y:=getHeight/2-getImageHeight(CrWindowImg)/2; + DrawCreativeWindow(x, y); + end; + else + if wtype=WINDOW_CHEST_INV then + begin + x:=getWidth/2-getImageWidth(ChestWindowImg)/2; + y:=getHeight/2-getImageHeight(ChestWindowImg)/2; + DrawImage(ChestWindowImg, x, y); + end; + else + if wtype=WINDOW_FASTCRAFT then + begin + x:=getWidth/2-getImageWidth(fcWindowImg)/2; + y:=getHeight/2-getImageHeight(fcWindowImg)/2; + DrawFastCraftWindow(x, y); + end; + else + if wtype=WINDOW_FURNACE then + begin + x:=getWidth/2-getImageWidth(furWindowImg)/2; + y:=getHeight/2-getImageHeight(furWindowImg)/2; + DrawFurnaceWindow(x, y); + end; + DrawCellLayer(i, x, y); + DrawCursors(i, x, y); + end; + end; + + procedure OpSwapItems(Idx1, Idx2:integer); + var + tmp_item, tmp_sum:integer; + begin + tmp_item:=getItem(Idx1); + tmp_sum:=getSum(Idx1); + + setItem(getItem(Idx2), Idx1); + setSum(getSum(Idx2), Idx1); + + setItem(tmp_item, Idx2); + setSum(tmp_sum, Idx2); + end; + + function OpAddItems(Idx1, Idx2:integer):boolean; + var + tmp_item1, tmp_sum1:integer; + tmp_item2, tmp_sum2:integer; + fresult:boolean; + begin + tmp_item1:=GetItem(Idx1); + tmp_sum1:=GetSum(Idx1); + tmp_item2:=GetItem(Idx2); + tmp_sum2:=GetSum(Idx2); + fresult:=true; + + if (tmp_item1=tmp_item2) and (Idx1<>Idx2) then + if tmp_sum2getItemMax(tmp_item2) then + begin + tmp_sum1:=tmp_sum2-getItemMax(tmp_item2); + tmp_sum2:=tmp_sum2-tmp_sum1; + end; + + if tmp_sum1<=0 then + tmp_item1:=0; + + fresult:=false; + end; + + SetItem(tmp_item1, Idx1); + SetSum(tmp_sum1, Idx1); + SetItem(tmp_item2, Idx2); + SetSum(tmp_sum2, Idx2); + OpAddItems:=fresult; + end; + + procedure SetActiveCursor(n:integer;); + var + n2:integer; + begin + if n=CUR_SELECT1 then + n2:=CUR_SELECT2; + else + n2:=CUR_SELECT1; + + SetCur(n); + SetCurActive(true, n); + SetCurIndex(GetCurIndex(n2), n); + end; + + procedure decItem(curidx:integer); + begin + SetSum(GetSum(curidx)-1, curidx); + fixNullCell(curidx); + end; + + procedure HandlerSelect2Div; + var + idx1, idx2:integer; + begin + idx1:=GetCurIndex(CUR_SELECT1); + idx2:=GetCurIndex(CUR_SELECT2); + + if GetItem(idx2)=0 then + begin + SetItem(GetItem(idx1), idx2); + SetSum(GetWindowInfo(WINDOW_INFO_DIVRES), idx2); + + SetSum(GetSum(idx1)-GetSum(idx2), idx1); + fixNullCell(idx1); + end; + end; + + procedure Select; + var + mode:integer; + begin + mode:=GetWindowInfo(WINDOW_INFO_INVMODE); + + //Нажали кнопку - выбрали первый элемент + if mode=INV_MODE_SELECT1 then + begin + //Активируем второй курсор и ставим его над первым курсором + SetActiveCursor(CUR_SELECT2); + SetWindowInfo(INV_MODE_SELECT2, WINDOW_INFO_INVMODE); + end; + else + //Нажали кнопку - выбрали второй элемент, произвели сложение и переходим к режиму выбора первого элемента. + if mode=INV_MODE_SELECT2 then + begin + //Складывваем предметы курсора 1 и курсора 2 + if OpAddItems(GetCurIndex(CUR_SELECT1), GetCurIndex(CUR_SELECT2)) then + OpSwapItems(GetCurIndex(CUR_SELECT1), GetCurIndex(CUR_SELECT2)); + //Передаём управление первому курсору + SetActiveCursor(CUR_SELECT1); + SetCurActive(false, CUR_SELECT2); + SetWindowInfo(INV_MODE_SELECT1, WINDOW_INFO_INVMODE); + end; + else + if mode=INV_MODE_SELECT2_DIV then + begin + HandlerSelect2Div; + SetActiveCursor(CUR_SELECT1); + SetCurActive(false, CUR_SELECT2); + SetWindowInfo(INV_MODE_SELECT1, WINDOW_INFO_INVMODE); + end; + end; + + function CanDivItem:boolean; + begin + if getItemDiv(getItem(GetCurIndex(GetCur))) then + if (GetCur=CUR_SELECT1) and (getSum(GetCurIndex(GetCur))>0) then + CanDivItem:=true; + end; + + procedure StdCellKeyHandler; + begin + if clickedKey(KEY_WIN_SELECT) then + SetTimer(1000, T_KEY_DIVITEM); + + if pressedKey(KEY_WIN_SELECT) then + begin + if GetTimer(T_KEY_DIVITEM)=TIMER_OK then + begin + if CanDivItem then + OpenDivWindow; + ResetTimer(T_KEY_DIVITEM); + end; + end; + else + begin + if GetTimer(T_KEY_DIVITEM)>TIMER_OK then + begin + Select; + ResetTimer(T_KEY_DIVITEM); + end; + end; + end; + + procedure keyDrop; + var + item, curidx:integer; + begin + curidx:=GetCurIndex(GetCur); + item:=getItem(curidx); + + if clickedKey(KEY_WIN_DROP) then + SetTimer(1000, T_KEY_DROPITEM); + + if pressedKey(KEY_WIN_DROP) then + begin + if GetTimer(T_KEY_DROPITEM)=TIMER_OK then + begin + player.dropItem(item, GetSum(curidx)); + SetItem(0, curidx); + SetSum(0, curidx); + ResetTimer(T_KEY_DROPITEM); + end; + end; + else + begin + if GetTimer(T_KEY_DROPITEM)>TIMER_OK then + begin + if getItemDiv(item) then + begin + player.dropItem(item, 1); + decItem(curidx); + end; + ResetTimer(T_KEY_DROPITEM); + end; + end; + end; + + function WindowKeyHanler:boolean; + var + WinType:integer; + craftid, mode:integer; + begin + WinType:=GetWindowType; + if WinType=WINDOW_PLAYER_INV then + begin + if clickedKey(KEY_WIN_UP) then + ShiftCurrentCur(FIND_CELL_UP); + if clickedKey(KEY_WIN_DOWN) then + ShiftCurrentCur(FIND_CELL_DOWN); + if clickedKey(KEY_WIN_LEFT) then + ShiftCurrentCur(FIND_CELL_LEFT); + if clickedKey(KEY_WIN_RIGHT) then + ShiftCurrentCur(FIND_CELL_RIGHT); + + StdCellKeyHandler; + keyDrop; + + if clickedKey(KEY_WIN_EXIT) then + ClosePlayerInventory; + + if clickedKey(KEY_WIN_ALT) then + begin + ClosePlayerInventory; + OpenFastCraftWindow(0); + end; + end; + else + if WinType=WINDOW_DIV_ITEMS then + begin + if clickedKey(KEY_WIN_LEFT) then + DivScroll(-1); + if clickedKey(KEY_WIN_RIGHT) then + DivScroll(1); + + if clickedKey(KEY_WIN_SELECT) then + CloseDivWindow(true); + + if clickedKey(KEY_WIN_EXIT) then + CloseDivWindow(false); + end; + else + if WinType=WINDOW_CEATIVE_INV then + begin + if clickedKey(KEY_WIN_UP) then + FindCeativeUD(-1); + if clickedKey(KEY_WIN_DOWN) then + FindCeativeUD(1); + if clickedKey(KEY_WIN_LEFT) then + ShiftCurrentCur(FIND_CELL_LEFT); + if clickedKey(KEY_WIN_RIGHT) then + ShiftCurrentCur(FIND_CELL_RIGHT); + + StdCellKeyHandler; + keyDrop; + + if clickedKey(KEY_WIN_EXIT) then + CloseCreativeWindow; + end; + else + if WinType=WINDOW_CHEST_INV then + begin + if clickedKey(KEY_WIN_UP) then + ShiftCurrentCur(FIND_CELL_UP); + if clickedKey(KEY_WIN_DOWN) then + ShiftCurrentCur(FIND_CELL_DOWN); + if clickedKey(KEY_WIN_LEFT) then + ShiftCurrentCur(FIND_CELL_LEFT); + if clickedKey(KEY_WIN_RIGHT) then + ShiftCurrentCur(FIND_CELL_RIGHT); + + StdCellKeyHandler; + keyDrop; + + if clickedKey(KEY_WIN_EXIT) then + CloseChestWindow; + end; + else + if WinType=WINDOW_FASTCRAFT then + begin + if clickedKey(KEY_WIN_UP) then + FindFastCraftUD(-1); + if clickedKey(KEY_WIN_DOWN) then + FindFastCraftUD(1); + if clickedKey(KEY_WIN_LEFT) then + ShiftCurrentCur(FIND_CELL_LEFT); + if clickedKey(KEY_WIN_RIGHT) then + ShiftCurrentCur(FIND_CELL_RIGHT); + + if clickedKey(KEY_WIN_SELECT) then + begin + mode:=GetWindowInfo(WINDOW_INFO_FC_MODE); + craftid:=getCellID(GetCurIndex(GetCur))+GetOffset(0); + createCraft(craftid, mode); + end; + + if clickedKey(KEY_WIN_ALT) then + begin + CloseChestWindow; + OpenPlayerInventory; + end; + + if clickedKey(KEY_WIN_EXIT) then + CloseChestWindow; + end; + else + if WinType=WINDOW_FURNACE then + begin + if clickedKey(KEY_WIN_UP) then + ShiftCurrentCur(FIND_CELL_UP); + if clickedKey(KEY_WIN_DOWN) then + ShiftCurrentCur(FIND_CELL_DOWN); + if clickedKey(KEY_WIN_LEFT) then + ShiftCurrentCur(FIND_CELL_LEFT); + if clickedKey(KEY_WIN_RIGHT) then + ShiftCurrentCur(FIND_CELL_RIGHT); + + StdCellKeyHandler; + keyDrop; + + if clickedKey(KEY_WIN_EXIT) then + CloseFurnaceWindow; + end; + else + WindowKeyHanler:=true; + end; + +end. diff --git a/src/items.mpsrc b/src/items.mpsrc new file mode 100644 index 0000000..3c84b8d --- /dev/null +++ b/src/items.mpsrc @@ -0,0 +1,98 @@ +unit items; + +interface + const + ITEM_TYPE_BLOCK=0; + ITEM_TYPE_TOOL=1; + + ITEM_FLAG_IND1=1; + ITEM_FLAG_IND2=2; + ITEM_FLAG_DIV=4; + ITEM_FLAG_TEX=8; + var + compas:image; + clock:array[0..7] of image; + none0:image; + clock_stage:integer; + + function getBlockTrans(id:integer;):boolean; + function getBlockFore(id:integer;):boolean; + function getBlockSet(id:integer;):boolean; + + function getItemIndNum(id:integer):boolean; + function getItemIndLine(id:integer):boolean; + function getItemDiv(id:integer):boolean; + function getItemTexType(id:integer):integer; + + procedure setMaxItemList(i:integer); + procedure setItemList(item, i:integer); + function getItemList(i:integer):integer; + +implementation + uses items_store; + const + BLOCK_FLAG_Trans=1; + BLOCK_FLAG_FORE=2; + BLOCK_FLAG_SET=4; + + var + itemListSize:integer; + itemList: array [0..0] of integer; + + function getBlockTrans(id:integer;):boolean; + begin + getBlockTrans:=(getBlockFlags(id) and BLOCK_FLAG_Trans)>0; + end; + + function getBlockFore(id:integer;):boolean; + begin + getBlockFore:=(getBlockFlags(id) and BLOCK_FLAG_FORE)>0; + end; + + function getBlockSet(id:integer;):boolean; + begin + getBlockSet:=(getBlockFlags(id) and BLOCK_FLAG_SET)>0; + end; + + function getItemIndNum(id:integer):boolean; + begin + getItemIndNum:=(getItemFlags(id) and ITEM_FLAG_IND1)>0; + end; + + function getItemIndLine(id:integer):boolean; + begin + getItemIndLine:=(getItemFlags(id) and ITEM_FLAG_IND2)>0; + end; + + function getItemDiv(id:integer):boolean; + begin + getItemDiv:=(getItemFlags(id) and ITEM_FLAG_DIV)>0; + end; + + function getItemTexType(id:integer):integer; + begin + getItemTexType:=(getItemFlags(id) and ITEM_FLAG_TEX)>>3; + end; + + procedure setMaxItemList(i:integer); + begin + itemListSize:=i; + i:=i+1; + bytecode + iload 0; + newarray 10; + putstatic field 'items', 'itemlist', '[I'; + end; + end; + + procedure setItemList(i, item:integer); + begin + itemList[i]:=item; + end; + + function getItemList(i:integer):integer; + begin + if (i>=0) and (i<=itemListSize) then + getItemList:=itemList[i]; + end; +end. diff --git a/src/items_logic.mpsrc b/src/items_logic.mpsrc new file mode 100644 index 0000000..d490072 --- /dev/null +++ b/src/items_logic.mpsrc @@ -0,0 +1,1432 @@ +unit items_logic; + +interface + function set_block_code(it,xx,yy:integer):boolean;//Выполнение кода при установке блока + procedure destroy_block_cr(id,xx,yy:integer);//Выполнение кода при разрушении блока в креативе + procedure destroy_block_0(id,xx,yy:integer);//Выполнение кода при разрушении блока не "тем" инструментом + procedure destroy_block_1(id,xx,yy:integer);//Выполнение кода при разрушении блока "нужным" инструментом + + function useBlock(invcur, x, y:integer):boolean; + function useItem(invcur, x, y:integer):boolean; + + procedure updateBlock(x, y:integer); + +implementation + uses invui, maps, drop, console, furnace, png3, func, jpeg, mob, vars, bmp, items, chest, inv, player, items_store, particles, worldgen, phy, sign; + +procedure usebonemeal(block:integer); + var + ix,iy,rnd_set:integer; + begin + if block=2 then + begin + for ix:=curx-4 to curx+4 do + for iy:=cury-4 to cury+4 do + begin + if (getmap(ix,iy+1)=2) and (getmap(ix,iy)=0) then + begin + rnd_set:=random(3); + if rnd_set=0 then setmap(22,ix,iy); else + if rnd_set=1 then setmap(23,ix,iy); else + if rnd_set=2 then setmap(57,ix,iy); else + end; + end; + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; else + if block=122 then + begin + setmapinfo(3,curx,cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + else + if (block=123) or (block=124) then + begin + setmapinfo(8,curx,cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + else + if block=52 then + begin + genwood1(curx, cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + else + if block=114 then + begin + genwood2(curx, cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + else + if block=115 then + begin + genwood3(curx, cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + end; + +function searchportal(ix,iy:integer):boolean; + begin + if (getmap(ix+1,iy)=10) and (getmap(ix-1,iy-1)=10) and (getmap(ix+2,iy-1)=10) and (getmap(ix-1,iy-2)=10) and (getmap(ix+2,iy-2)=10) and (getmap(ix-1,iy-3)=10) and (getmap(ix+2,iy-3)=10) and (getmap(ix,iy-4)=10) and (getmap(ix+1,iy-4)=10) then + searchportal:=true; else + searchportal:=false; + end; + +procedure create_screenshot_png; + var + screen:image; + date:string; + i,time:integer; + begin + time:=getCurrentTime; + screen:=ImageFromCanvas(0,0,getWidth,getHeight); + date:=''+getWeekDay(time)+'-'+getMonth(time)+'-'+getDay(time)+'_'+getHour(time)+'.'+getMinute(time)+'.'+getSecond(time); + i:=save_png(screen,sd+'/cavecraft/screenshots/'+date+'.png'); + addToLog('Screenshot saved!'); + end; + +procedure create_screenshot_jpeg; + var + screen:image; + date:string; + time:integer; + begin + time:=getCurrentTime; + screen:=ImageFromCanvas(0,0,getWidth,getHeight); + date:=''+getWeekDay(time)+'-'+getMonth(time)+'-'+getDay(time)+'_'+getHour(time)+'.'+getMinute(time)+'.'+getSecond(time); + jpeg.saveimagetofile(screen,s_jpeg_quality,'/'+sd+'/cavecraft/screenshots/'+date+'.jpg'); + addToLog('Screenshot saved!'); + end; + +procedure create_screenshot_bmp; + var + screen:image; + date:string; + time:integer; + begin + time:=getCurrentTime; + screen:=ImageFromCanvas(0,0,getWidth,getHeight); + date:=''+getWeekDay(time)+'-'+getMonth(time)+'-'+getDay(time)+'_'+getHour(time)+'.'+getMinute(time)+'.'+getSecond(time); + savebmp(screen,'/'+sd+'/cavecraft/screenshots/'+date+'.bmp'); + addToLog('Screenshot saved!'); + end; + +procedure boom(rr,mm,xx,yy:integer); + var + ix,iy,iz,ir,imob,erru,minhp:integer; + rays:array [0..359] of integer; + mobs_minhp:array[0..31] of integer; + begin + {setmap(0,xx,yy); + setmapinfo(0,xx,yy); + for iz:=0 to 359 do + rays[iz]:=mm; + + for ir:=1 to rr do + for iz:=0 to 359 do + if rays[iz]>0 then + begin + if (iz>=0) and (iz<=180) and (ir=1) then erru:=-1; else erru:=0; + if (iz>=180) and (iz<=360) and (ir=1) then erru:=1; else erru:=0; + ix:=xx+trunc(cos(iz)*ir)+erru; + iy:=yy+trunc(sin(iz)*ir)+erru; + rays[iz]:=rays[iz]-getBlockHp(getmap(ix,iy)); + if rays[iz]<0 then rays[iz]:=0; + if coll_boom(ix,iy)=true then minhp:=minhp+(rays[iz]*2); + for imob:=0 to 31 do + if mob[imob].m_hp>0 then + begin + if mob_coll_boom(imob,ix,iy)=true then begin mobs_minhp[imob]:=mobs_minhp[imob]+(rays[iz]*2); mob[imob].m_hp:=0; end; + end; + if getmap(ix,iy)=27 then boom(4,100,ix,iy); + if getBlockHp(getmap(ix,iy))<=mm then + begin + if 30<=random(100) then destroy_block_1(getmap(ix,iy),ix,iy); + setmap(0,ix,iy); + create_particle(7,(ix*16)+8-16,(iy*16)+8-16); + end; + end; + minhp:=minhp/360; + hp:=hp-minhp; + for imob:=0 to 31 do + begin + mobs_minhp[imob]:=mobs_minhp[imob]/360; + mob[imob].m_hp:=mob[imob].m_hp-mobs_minhp[imob]; + end;} + end; + +procedure destroy_block_cr(id, xx, yy:integer); + begin + if id=27 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=28 then + begin + setmap(0,xx,yy); + chest.destroy(false, xx, yy); + end; else + if id=62 then + begin + setmap(50,xx,yy); + end; else + if id=62 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=66 then + begin + setmap(0,xx,yy); + setmapinfo(8,xx+1,yy); + end; else + if id=73 then + begin + setmap(0,xx,yy); + setmapinfo(8,xx+1,yy); + end; else + if id=77 then + begin + setmap(0,xx,yy); + setmap(0,xx+1,yy); + end; else + if id=78 then + begin + setmap(0,xx,yy); + setmap(0,xx-1,yy); + end; else + if id=79 then + begin + setmap(0,xx,yy); + setmap(0,xx,yy+1); + end; else + if id=80 then + begin + setmap(0,xx,yy); + setmap(0,xx,yy-1); + end; else + if id=81 then + begin + setmap(0,xx,yy); + setmap(0,xx,yy-1); + end; else + if id=82 then + begin + setmap(0,xx,yy); + setmap(0,xx,yy-1); + end; else + if id=102 then + begin + setmap(0,xx,yy); + chest.destroy(false, xx, yy); + end; else + if id=104 then + begin + setmap(0,xx,yy); + destsign(getmapinfo(xx,yy)); + end; else + if id=106 then + begin + setmap(0,xx,yy); + DestroyFurnace(xx, yy); + end; else + if id=121 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=122 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; + end; + + function set_block_code(it,xx,yy:integer):boolean;//Если false тогда блок устанавливается + begin + if it=28 then + begin + if chest.create(xx,yy)=-1 then set_block_code:=true; + end; else + if it=102 then + begin + if chest.create(xx,yy)=-1 then set_block_code:=true; + end; + if it=104 then + begin + if createsign(xx,yy)=-1 then set_block_code:=true; + end; else + if it=106 then + begin + if CreateFurnace(xx, yy)=FURNACE_ERROR then + set_block_code:=true; + end; else + if it=121 then + begin + setmapinfo(16,xx,yy); + set_block_code:=false; + end; else + set_block_code:=false; + end; + + procedure destroy_block_0(id,xx,yy:integer); + begin + if id=27 then + begin + setmapinfo(0,xx,yy); + end; else + if id=21 then + begin + if random(8)=random(8) then drop.create(201,1,xx*16+4,yy*16+4); else + if random(5)=random(5) then drop.create(52,1,xx*16+4,yy*16+4); + end; else + if id=28 then + begin + chest.destroy(false, xx, yy); + end; else + if id=57 then + begin + if random(4)=random(4) then drop.create(217,1,xx*16+4,yy*16+4); + end; else + if id=62 then + begin + setmap(50,xx,yy); + end; else + if id=62 then + begin + setmapinfo(0,xx,yy); + end; else + if id=77 then + begin + setmap(0,xx+1,yy); + end; else + if id=78 then + begin + setmap(0,xx-1,yy); + end; else + if id=79 then + begin + setmap(0,xx,yy+1); + end; else + if id=80 then + begin + setmap(0,xx,yy-1); + end; else + if id=81 then + begin + setmap(0,xx,yy+1); + end; else + if id=82 then + begin + setmap(0,xx,yy-1); + end; else + if id=102 then + begin + chest.destroy(true, xx, yy); + end; else + if id=104 then + begin + destsign(getmapinfo(xx,yy)); + end; else + if id=106 then + begin + DestroyFurnace(xx, yy); + end; else + if id=112 then + begin + if random(8)=random(8) then drop.create(201,1,xx*16+4,yy*16+4); else + if random(5)=random(5) then drop.create(114,1,xx*16+4,yy*16+4); + end; else + if id=87 then + begin + if random(10)=random(10) then drop.create(115,1,xx*16+4,yy*16+4); + end; else + if id=121 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=122 then + begin + if getmapinfo(xx,yy)<3 then drop.create(217,random(4),xx*16+4,yy*16+4); else + if getmapinfo(xx,yy)=3 then begin drop.create(217,random(4),xx*16+4,yy*16+4); drop.create(218,1,xx*16+4,yy*16+4); end; + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; + if (id=123) or (id=124) then + begin + drop.create(221+(id-123),random(4),xx*16+4,yy*16+4); + end; + //setmap(0,xx,yy); + //setmapinfo(0,xx,yy); + end; + + procedure destroy_block_1(id,xx,yy:integer); + begin + if id=27 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=2 then + begin + drop.create(1,1,xx*16+4,yy*16+4); + end; else + if id=3 then + begin + drop.create(5,1,xx*16+4,yy*16+4); + end; else + if id=8 then + begin + if random(10)=random(10) then drop.create(207,1,xx*16+4,yy*16+4); else + drop.create(8,1,xx*16+4,yy*16+4); + end; else + if id=11 then + begin + drop.create(170,3,xx*16+4,yy*16+4); + end; else + if id=18 then + begin + drop.create(160,1,xx*16+4,yy*16+4); + end; else + if id=19 then + begin + drop.create(162,1,xx*16+4,yy*16+4); + end; else + if id=20 then + begin + drop.create(161,4+random(2),xx*16+4,yy*16+4); + end; else + if id=28 then + begin + chest.destroy(true, xx, yy); + drop.create(28,1,xx*16+4,yy*16+4); + end; else + if id=48 then + begin + drop.create(1,1,xx*16+4,yy*16+4); + end; else + if id=50 then + begin + drop.create(0,0,xx*16+4,yy*16+4); + end; else + if id=51 then + begin + drop.create(0,0,xx*16+4,yy*16+4); + end; else + if id=54 then + begin + drop.create(166,4+random(4),xx*16+4,yy*16+4); + end; else + if id=59 then + begin + drop.create(167,1,xx*16+4,yy*16+4); + end; else + if id=61 then + begin + drop.create(168,4+random(2),xx*16+4,yy*16+4); + end; else + if id=62 then + begin + setmap(0,xx,yy); + end; else + if id=63 then + begin + drop.create(168,1,xx*16+4,yy*16+4); + end; else + if id=64 then + begin + drop.create(169,4,xx*16+4,yy*16+4); + end; else + if id=66 then + begin + setmapinfo(8,xx+1,yy); + drop.create(66,1,xx*16+4,yy*16+4); + end; else + if id=73 then + begin + drop.create(176,3+random(4),xx*16+4,yy*16+4); + setmapinfo(8,xx+1,yy); + end; else + if id=74 then + begin + drop.create(1,1,xx*16+4,yy*16+4); + end; else + if id=75 then + begin + drop.create(9,1,xx*16+4,yy*16+4); + end; else + if id=76 then + begin + setmapinfo(0,xx,yy); + end; else + if id=77 then + begin + drop.create(179,1,xx*16+4,yy*16+4); + setmap(0,xx+1,yy); + end; else + if id=78 then + begin + drop.create(179,1,xx*16+4,yy*16+4); + setmap(0,xx-1,yy); + end; else + if id=79 then + begin + drop.create(178,1,xx*16+4,yy*16+4); + setmap(0,xx,yy+1); + end; else + if id=80 then + begin + drop.create(178,1,xx*16+4,yy*16+4); + setmap(0,xx,yy-1); + end; else + if id=81 then + begin + drop.create(178,1,xx*16+4,yy*16+4); + setmap(0,xx,yy+1); + end; else + if id=82 then + begin + drop.create(178,1,xx*16+4,yy*16+4); + setmap(0,xx,yy-1); + end; else + if id=84 then + begin + drop.create(83,1,xx*16+4,yy*16+4); + end; else + if id=86 then + begin + drop.create(85,1,xx*16+4,yy*16+4); + end; else + if id=88 then + begin + drop.create(24,random(3)-1,xx*16+4,yy*16+4); + end; else + if id=89 then + begin + drop.create(24,random(3)-1,xx*16+4,yy*16+4); + end; else + if id=90 then + begin + drop.create(25,random(3)-1,xx*16+4,yy*16+4); + end; else + if id=91 then + begin + drop.create(25,random(3)-1,xx*16+4,yy*16+4); + end; else + if id=93 then + begin + drop.create(92,1,xx*16+4,yy*16+4); + end; else + if id=94 then + begin + drop.create(4,1,xx*16+4,yy*16+4); + end; else + if id=95 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=95 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=95 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=96 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=97 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=98 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=99 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=100 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=101 then + begin + drop.create(187,1,xx*16+4,yy*16+4); + end; else + if id=102 then + begin + chest.destroy(true, xx, yy); + drop.create(28,1,xx*16+4,yy*16+4); + end; else + if id=104 then + begin + destsign(getmapinfo(xx,yy)); + drop.create(104,1,xx*16+4,yy*16+4); + end; else + if id=106 then + begin + setmap(0,xx,yy); + DestroyFurnace(xx, yy); + end; else + if id=107 then + begin + drop.create(108,1,xx*16+4,yy*16+4); + end; else + if id=111 then + begin + drop.create(214,random(4)+1,xx*16+4,yy*16+4); + end; else + if id=117 then + begin + drop.create(116,1,xx*16+4,yy*16+4); + end; else + if id=118 then + begin + drop.create(10,1,xx*16+4,yy*16+4); + end; else + if id=120 then + begin + drop.create(1,1,xx*16+4,yy*16+4); + end; else + if id=121 then + begin + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if id=122 then + begin + if getmapinfo(xx,yy)<3 then drop.create(217,random(2),xx*16+4,yy*16+4); else + if getmapinfo(xx,yy)=3 then begin drop.create(217,random(2),xx*16+4,yy*16+4); drop.create(218,1,xx*16+4,yy*16+4); end; + setmap(0,xx,yy); + setmapinfo(0,xx,yy); + end; else + if (id=123) or (id=124) then + begin + drop.create(221+(id-123),random(4),xx*16+4,yy*16+4); + end; else + begin + setmapinfo(0,xx,yy); + drop.create(id,1,xx*16+4,yy*16+4); + end; + end; + + procedure decItem(invcur:integer); + begin + if gamemode<>1 then + begin + inv.setSum(inv.getSum(invcur)-1, invcur); + inv.fixNull(invcur); + end; + end; + + //Возвращает true если блок небыл использован. + function useBlock(invcur, x, y:integer):boolean; + var + item, sum, block, info:integer; + begin + item:=inv.getItem(invcur); + sum:=inv.getSum(invcur); + block:=getMap(x, y); + info:=getMapInfo(x, y); + + if (block=28) or (block=102) then + begin + if info<=MAX_CHEST then + OpenChestWindow(info); + end; + else + if block=29 then + OpenFastCraftWindow(1); + else + if block=79 then + begin + setMap(81, x, y); + setMap(82, x, y+1); + end; + else + if block=80 then + begin + setMap(81, x, y-1); + setMap(82, x, y); + end; + else + if block=81 then + begin + setMap(79, x, y); + setMap(80, x, y+1); + end; + else + if block=82 then + begin + setMap(79, x, y-1); + setMap(80, x, y); + end; + /*else + if block=104 then + keymode:=5;*/ + else + if block=106 then + OpenFurnaceWindow(info); + else + if block=107 then + setMap(108, x, y); + else + if block=108 then + setMap(107, x, y); + else + if block=116 then + setMap(117, x, y); + else + if block=117 then + setMap(116, x, y); + else + if block=121 then + begin + if hunger<20 then + begin + hunger:=hunger+2; + info:=info-2; + if (info=14) or (info=2) then + info:=info-2; + if info<1 then + setMap(0, x, y); + else + setMapInfo(info, x, y); + end; + end; + else + useBlock:=true; + + /* + + + if (getmap(curx,cury)=1) or (getmap(curx,cury)=2) or (getmap(curx,cury)=48) or (getmap(curx,cury)=74) then + begin + if (get_item(0, item)=1) and (get_tool(0, item)=6) and (sum>0) and (getmap(curx,cury-1)=0) then + begin + setmap(120,curx,cury); + inv.setSum(inv.getSum(invslot)-1, invslot); + inv.fixNull(invslot); + end; + end; + else + if (getmap(curx,cury)=77) or (getmap(curx,cury)=78) then + begin + if pl_world=0 then + sleep; + else + boom(4,100,curx,cury); + end;*/ + end; + + function useItem(invcur, x, y:integer):boolean; + var + item, sum, block, info:integer; + begin + if inv.isNull(invcur) then + useItem:=true; + + item:=inv.getItem(invcur); + sum:=inv.getSum(invcur); + block:=getMap(x, y); + info:=getMapInfo(x, y); + + if item=171 then + begin + if block=50 then + begin + inv.setItem(172, invcur); + setMap(0, x, y); + end; + else + if block=51 then + begin + inv.setItem(173, invcur); + setMap(0, x, y); + end; + end; + else + if item=220 then + usebonemeal(block); + else + if item=217 then + begin + if (block=120) and (getMap(x, y-1)=0) then + begin + setMap(122, x, y-1); + decItem(invcur); + end; + end; + else + if item=221 then + begin + if (block=120) and (getMap(x, y-1)=0) then + begin + setMap(123, x, y-1); + setMapInfo(1, x, y-1); + decItem(invcur); + end; + end; + else + if item=222 then + begin + if (block=120) and (getMap(x, y-1)=0) then + begin + setMap(124, x, y-1); + setMapInfo(1, x, y-1); + decItem(invcur); + end; + end; + else + if item=172 then + begin + if (block=0) then + begin + inv.setItem(171, invcur); + setMap(50, x, y); + end; + end; + else + if item=173 then + begin + if (block=0) then + begin + inv.setItem(171, invcur); + setMap(51, x, y); + end; + end; + else + if item=176 then + begin + if hunger<20 then + begin + hunger:=hunger+2; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=177 then + begin + {if random(10)=random(10) then + create_mob(4, x*16, y*16);} + decItem(invcur); + end; + else + if item=178 then + begin + if (block=0) and (getMap(x, y-1)=0) then + begin + setMap(81, x, y-1); + setMap(82, x, y); + decItem(invcur); + end; + end; + else + if item=179 then + begin + if (block=0) and (getMap(x+1, y)=0) then + begin + setMap(77, x, y); + setMap(78, x+1, y); + decItem(invcur); + end; + end; + else + if item=180 then + begin + if getBlockColl(block)=0 then + begin + mob.create(M_ZOMBY, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=181 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(2, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=182 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(3, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=185 then + begin + if hunger<20 then + begin + inv.setItem(184, invslot); + hunger:=hunger+6; + if hunger>20 then + hunger:=20; + end; + end; + else + if item=187 then + begin + if block=0 then + begin + setMap(95+random(7), x, y); + decItem(invcur); + end; + end; + else + if item=188 then + begin + if hunger<20 then + begin + hunger:=hunger+3; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=189 then + begin + if hunger<20 then + begin + hunger:=hunger+8; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=190 then + begin + if hunger<20 then + begin + hunger:=hunger+4; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=191 then + create_screenshot_png; + else + if item=192 then + create_screenshot_jpeg; + else + if item=193 then + create_screenshot_bmp; + else + if item=196 then + begin + if hunger<20 then + begin + hp:=hp-4; + hunger:=hunger+2; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=199 then + begin + if hunger<20 then + begin + hunger:=hunger+3; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=200 then + begin + if hunger<20 then + begin + hunger:=hunger+8; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=201 then + begin + if hunger<20 then + begin + hunger:=hunger+4; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=202 then + begin + if hp<20 then + begin + hp:=20; + decItem(invcur); + end; + end; + else + if item=203 then + begin + if hunger<20 then + begin + hunger:=hunger+2; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=204 then + begin + if hunger<20 then + begin + hunger:=hunger+6; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=205 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(4, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=206 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(5, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=208 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(6, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=209 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(7, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=213 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(8, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=212 then + begin + if getBlockColl(block)=0 then + begin + //create_mob(10, x*16, y*16); + decItem(invcur); + end; + end; + else + if item=210 then + begin + if hunger<20 then + begin + hunger:=hunger+2; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=211 then + begin + if hunger<20 then + begin + hunger:=hunger+5; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=219 then + begin + if hunger<20 then + begin + hunger:=hunger+5; + if hunger>20 then + hunger:=20; + decItem(invcur); + end; + end; + else + if item=153 then + begin + if block=10 then + begin + if searchportal(x , y)=true then + begin + genportal(x-1, y-4); + decItem(invcur); + end; + else + if searchportal(x-1, y)=true then + begin + genportal(x-2, y-4); + decItem(invcur); + end; + end; + else + if block=27 then + begin + setmapinfo(getrelativetimems/1000-(getrelativetimems/1000 div 100*100),curx,cury); + decItem(invcur); + end; + end; + else + if item=152 then + begin + if block=50 then + begin + fish:=true; + fish_time:=getrelativetimems; + fx:=curx; + fy:=cury; + end; + end; + else + useItem:=true; + end; + +procedure fluidLogic(x, y, ifbx, thenbx, ifby, thenby:integer); + var + block, blockXm1, blockXp1, blockYp1:integer; + begin + block:=getMap(x, y); + blockXm1:=getMap(x-1, y); + blockXp1:=getMap(x+1, y); + blockYp1:=getMap(x, y+1); + + //Если внизу условный блок, то заменяем. + if blockYp1=ifby then + setMap(thenby, x, y+1); + else + //Если нижний блок можно уничтожить, то ставим туда копию + if getBlockSet(blockYp1) then + begin + destroy_block_0(blockYp1, x, y+1); + setMap(block, x, y+1); + end; + //Если ничего не можем, то пытаемся течь по сторонам + else + begin + if blockXm1=ifbx then + setMap(thenbx, x-1, y); + else + if getBlockSet(blockXm1) then + begin + destroy_block_1(blockXm1, x-1, y); + setMap(block, x-1, y); + end; + + if blockXp1=ifbx then + setMap(thenbx, x+1, y); + else + if getBlockSet(blockXp1) then + begin + destroy_block_1(blockXp1, x+1, y); + setMap(block, x+1, y); + end; + end; + end; + +procedure updateBlock(x, y:integer); + const + GRASS_RND=128; + TORCH_RND=128; + SPAWN_RND=128; + SPAWN_RAD=128; + GENWOOD_RND=1024; + LIAN_RND=32; + CORN_RND=512; + var + plx, ply, block, light, info:integer; + begin + plx:=player.getX; + ply:=player.getY; + block:=getMap(x, y); + light:=getMapLight(x, y); + info:=getMapInfo(x, y); + + if block=2 then + begin + //Трава разрастается при условии что освещение выше чем 3 + if (getBlockSet(getMap(x, y-1))=false) or (light=0) then + setMap(1, x, y); + else + if light>3 then + begin + if (getMap(x-1, y)=1) and (getMap(x-1, y-1)=0) then + if random(GRASS_RND)=random(GRASS_RND) then + setMap(2, x-1, y); + + if (getMap(x+1, y)=1) and (getMap(x+1, y-1)=0) then + if random(GRASS_RND)=random(GRASS_RND) then + setMap(2, x+1, y); + end; + end; + else + if block=7 then + begin + if getBlockSet(getMap(x, y+1)) then + begin + setMap(0, x, y); + setMap(7, x, y+1); + end; + end; + else + if block=8 then + begin + if getBlockSet(getMap(x, y+1)) then + begin + setMap(0, x, y); + setMap(8, x, y+1); + end; + end; + else + if block=26 then + begin + if random(TORCH_RND)=random(TORCH_RND) then + create_particle(2, x*16+4, y*16+4); + end; + else + if block=50 then + begin + fluidLogic(x, y, 51, 10, 51, 10); + end; + else + if block=51 then + begin + fluidLogic(x, y, 50, 5, 50, 3); + end; + else + if block=63 then + begin + if (light>7) or (getMap(x, y+1)=0) then + setmap(0, x, y); + end; + else + if block=74 then + begin + if getBlockSet(getMap(x, y-1))=false then + setMap(1, x, y); + else + if light>3 then + begin + if (getMap(x-1, y)=1) and (getMap(x-1, y-1)=0) then + if random(GRASS_RND)=random(GRASS_RND) then + setMap(74, x-1, y); + + if (getMap(x+1, y)=1) and (getMap(x+1, y-1)=0) then + if random(GRASS_RND)=random(GRASS_RND) then + setMap(74, x+1, y); + end; + end; + else + if block=77 then + begin + if getmap(x+1, y)<>78 then + setMap(0, x, y); + end; + else + if block=78 then + begin + if getmap(x-1, y)<>77 then + setMap(0, x, y); + end; + else + if block=79 then + begin + if getmap( x, y+1)<>80 then + setMap(0, x, y); + end; + else + if block=80 then + begin + if getmap(x, y-1)<>79 then + setMap(0, x, y); + end; + else + if block=81 then + begin + if getmap(x, y+1)<>82 then + setMap(0, x, y); + end; else + if block=82 then + begin + if getmap(x, y-1)<>81 then + setmap(0, x, y); + end; else + if block=76 then + begin + {if CollTwoObj(plx, ply, player.getW, player.getH, x*16-SPAWN_RAD, y*16-SPAWN_RAD, x*16+SPAWN_RAD, y*16+SPAWN_RAD) then + if random(SPAWN_RND)=random(SPAWN_RND) then + create_mob(getMapInfo(x, y), x*16,(y-2)*16);} + end; + else + if block=52 then + begin + if random(GENWOOD_RND)=random(GENWOOD_RND) then + genwood1(x, y); + end; + else + if block=114 then + begin + if random(GENWOOD_RND)=random(GENWOOD_RND) then + genwood2(x, y); + end; + else + if block=115 then + begin + if random(GENWOOD_RND)=random(GENWOOD_RND) then + genwood3(x, y); + end; + else + if block=103 then + begin + if (getmap(x, y-1)=0) then + setmap(0, x, y); + else + if (getmap(x, y+1)=0) and (random(LIAN_RND)=random(LIAN_RND)) then + setmap(103, x, y+1); + end; + else + if block=105 then + begin + if random(TORCH_RND)=random(TORCH_RND) then + create_particle(4, x*16+4, y*16+4); + end; + else + if block=110 then + begin + if (getmap(x-1, y)=0) or (getmap(x+1, y)=0) or (getmap(x, y-1)=0) or (getmap(x, y+1)=0) then + setmap(0, x, y); + end; + else + if block=30 then + begin + if (random(GENWOOD_RND)=random(GENWOOD_RND)) and (getMap(x, y+2)<>30) then + setMap(30, x, y-1); + if (getMap(x, y+1)<>7) or (getMap(x, y+1)<>30) then + begin + setMap(0, x, y); + destroy_block_1(block, x, y); + end; + end; else + if block=65 then + begin + if (random(GENWOOD_RND)=random(GENWOOD_RND)) and (getMap(x, y+2)<>65) then + setMap(65, x, y-1); + if (getMap(x, y+1)=0) then + begin + setMap(0, x, y); + destroy_block_1(block, x, y); + end; + end; + else + if block=122 then + begin + if random(CORN_RND)=random(CORN_RND) then + info:=info+1; + if info>3 then + info:=3; + if getmap(x, y+1)<>120 then + setMap(0, x, y); + setMapInfo(info, x, y); + end; else + if block=123 then + begin + if random(CORN_RND)=random(CORN_RND) then + info:=info+1; + if info>9 then + info:=9; + if getmap(x, y+1)<>120 then + setMap(0, x, y); + + if (info=0) and (getMap(x-1, y)=0) and (getBlockColl(getMap(x-1, y+1))>0) then + setmap(73, x-1, y); + + if (getMap(x-1, y)=73) and (getMapinfo(x, y)<>9) then + info:=9; + + setMapInfo(info, x, y); + end; + else + if block=124 then + begin + if random(CORN_RND)=random(CORN_RND) then + info:=info+1; + if info>9 then + info:=9; + if getmap(x, y+1)<>120 then + setMap(0, x, y); + + if (info=0) and (getMap(x-1, y)=0) and (getBlockColl(getMap(x-1, y+1))>0) then + setmap(66, x-1, y); + + if (getMap(x-1, y)=66) and (getMapinfo(x, y)<>9) then + info:=9; + + setMapInfo(info, x, y); + end; + else + if block=27 then + begin + if info<>0 then + if getrelativetimems/1000-(getrelativetimems/1000 div 100*100)-info>3 then + boom(4, 100, x, y); + end; + end; + +end. diff --git a/src/keyboard.mpsrc b/src/keyboard.mpsrc new file mode 100644 index 0000000..9a64044 --- /dev/null +++ b/src/keyboard.mpsrc @@ -0,0 +1,227 @@ +unit keyboard; + +interface + const + MAX_KEY_TYPES=27; + MAX_KEY_BIND=3; + + KEY_FM_UP=0; + KEY_FM_DOWN=1; + KEY_FM_SELECT=2; + + KEY_MENU_UP=3; + KEY_MENU_DOWN=4; + KEY_MENU_LEFT=5; + KEY_MENU_RIGHT=6; + KEY_MENU_SELECT=7; + + KEY_FASTINV_PREV=8; + KEY_FASTINV_NEXT=9; + + KEY_CHAT=10; + + KEY_PLR_OPENINV=11; + KEY_PLR_EDITMODE=12; + KEY_PLR_USE=13; + KEY_PLR_ATTACK=14; + + KEY_PLR_UP=15; + KEY_PLR_DOWN=16; + KEY_PLR_LEFT=17; + KEY_PLR_RIGHT=18; + + KEY_MENU=19; + + KEY_WIN_UP=20; + KEY_WIN_DOWN=21; + KEY_WIN_LEFT=22; + KEY_WIN_RIGHT=23; + KEY_WIN_SELECT=24; + KEY_WIN_ALT=25; + KEY_WIN_DROP=26; + KEY_WIN_EXIT=27; + + + var + s_cl:boolean; + load_key_tex:integer; + scrMulX, scrMulY:integer; + + function touchscreen:boolean; + procedure init_touch; + function senClicked(ix,iy,xx,yy:integer):boolean; + function senPressed(ix,iy,xx,yy:integer):boolean; + //function get_key_clicked:integer; + //function get_key_pressed:integer; + procedure draw_virtual_keys; + + procedure bindKey(keytype, id, keycode:integer); + function clickedKey(keytype:integer):boolean; + function pressedKey(keytype:integer):boolean; + procedure updateKeys; + + procedure resetVirtualKeyboard(i:integer); + procedure bindVKey(i, keycode, x, y:integer); + procedure setVkeyImg(img:image; i:integer); + +implementation +uses sensor,vars,canvas, func; + var + key_bind: array [0..MAX_KEY_BIND, 0..MAX_KEY_TYPES] of integer; + clicked_key, pressed_key:integer; + + v_keycode: array [0..0] of integer; + v_keyx: array [0..0] of integer; + v_keyy: array [0..0] of integer; + v_keyimg: array [0..0] of image; + v_max:integer; + + procedure resetVirtualKeyboard(i:integer); + var + nullimg:image; + v:integer; + begin + v_max:=i; + i:=i+1; + + bytecode + iload 0; + newarray 10; + putstatic field 'keyboard', 'v_keycode', '[I'; + end; + bytecode + iload 0; + newarray 10; + putstatic field 'keyboard', 'v_keyx', '[I'; + end; + bytecode + iload 0; + newarray 10; + putstatic field 'keyboard', 'v_keyy', '[I'; + end; + bytecode + iload 0; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + putstatic field 'keyboard', 'v_keyimg', '[Ljavax/microedition/lcdui/Image;'; + end; + for v:=0 to v_max do + v_keyimg[v]:=nullimg; + end; + + procedure setVkeyImg(img:image; i:integer); + begin + v_keyimg[i]:=img; + end; + + procedure bindVKey(i, keycode, x, y:integer;); + begin + v_keycode[i]:=keycode; + v_keyx[i]:=x; + v_keyy[i]:=y; + end; + + procedure bindKey(keytype, id, keycode:integer); + begin + key_bind[id, keytype]:=keycode; + end; + + function clickedKey(keytype:integer):boolean; + var + i:integer; + begin + for i:=0 to MAX_KEY_BIND do + if (key_bind[i, keytype]=clicked_key) and (key_bind[i, keytype]<>0) then + begin + clickedKey:=true; + exit; + end; + end; + + function pressedKey(keytype:integer):boolean; + var + i:integer; + begin + for i:=0 to MAX_KEY_BIND do + if (key_bind[i, keytype]=pressed_key) and (key_bind[i, keytype]<>0) then + begin + pressedKey:=true; + exit; + end; + end; + +function touchscreen:boolean; + begin + setcolor(0, 0, 0); + fillrect(0, 0, getWidth, getHeight); + drawfonttext('Press 5', getWidth/2-(length('Press 5')*8)/2, getHeight-16); + drawfonttext('or touch the screen.', getWidth/2-(length('or touch the screen.')*8)/2, getHeight-8); + repaint; + delay(1); + repeat + updateKeys; + if clickedKey(KEY_MENU_SELECT) then + begin + touchscreen:=false; + exit; + end; + if pointer_state=1 then + begin + touchscreen:=true; + exit; + end; + forever; + end; + +procedure init_touch; + begin + sensor.init; + end; + +function senClicked(ix,iy,xx,yy:integer):boolean; + begin + if (pointer_state=1) and (s_cl=false) then + if (pointer_pressed_x>ix*scrMulX) and (pointer_pressed_y>iy*scrMulY) and (pointer_pressed_x<(ix+xx)*scrMulX) and (pointer_pressed_y<(iy+yy)*scrMulY) then + begin + s_cl:=true; + senClicked:=true; + end; + end; + +function senPressed(ix,iy,xx,yy:integer):boolean; + begin + if (pointer_state=1) then + if (pointer_pressed_x>ix*scrMulX) and (pointer_pressed_y>iy*scrMulY) and (pointer_pressed_x<(ix+xx)*scrMulX) and (pointer_pressed_y<(iy+yy)*scrMulY) then + senPressed:=true; + end; + + procedure updateKeys; + var + i:integer; + begin + clicked_key:=getKeyClicked; + pressed_key:=getKeyPressed; + + if pointer_state=0 then + s_cl:=false; + + for i:=0 to v_max do + begin + if senClicked(v_keyx[i], v_keyy[i], getImageWidth(v_keyimg[i]), getImageHeight(v_keyimg[i])) then + clicked_key:=v_keycode[i]; + if senPressed(v_keyx[i], v_keyy[i], getImageWidth(v_keyimg[i]), getImageHeight(v_keyimg[i])) then + pressed_key:=v_keycode[i]; + end; + end; + +procedure draw_virtual_keys; + var + i:integer; + begin + if load_key_tex=1 then + for i:=0 to v_max do + drawImage(v_keyimg[i], v_keyx[i], v_keyy[i]); + end; + +initialization + v_max:=-1; +end. diff --git a/src/mobs.pas b/src/mobs.pas new file mode 100644 index 0000000..95815db --- /dev/null +++ b/src/mobs.pas @@ -0,0 +1,577 @@ +unit mob; + +interface + const + M_NONE=0; + M_ZOMBY=1; + + MOB_TYPES=1; + + procedure create(_type, x, y:integer);//Создать моба + function findAndHit(value, x, y, w, h, addvx, addvy:integer):integer; + + procedure update;//Обновление логики + procedure updatePhy;//Обновление физики + procedure draw(camx, camy:integer);//Отрисовка + + procedure saveData;//Сохранение всех данных + procedure loadData;//Загрузка всех данных + procedure resetData;//Сброс всех данных + + procedure loadSkin(path:string);//Загрузка текстур + procedure freeSkin;//Выгрузка текстур + +implementation + uses phy, player, canvas, func; + const + MAX_MOBS=31; + MAX_ANIMREG=3; + + AI_NONE=0; + AI_ZLOY=1; + var + mob_type, mob_x, mob_y, mob_vx, mob_vy, mob_posi, mob_hp:array [0..MAX_MOBS] of integer; + mob_jmp:array [0..MAX_MOBS] of boolean; + mob_anim:array [0..MAX_MOBS, 0..MAX_ANIMREG] of integer; + tab_w, tab_h, tab_hp, tab_speedx, tab_jumph, tab_ai:array [0..MOB_TYPES] of integer; + + texture_left, texture_right:array [0..MOB_TYPES, 0..0] of image; + tex_x, tex_y, tex_w, tex_h:array [0..1, 0..MOB_TYPES, 0..0] of integer; + + part_max: array [0..MOB_TYPES] of integer; + part_tex, part_x, part_y, part_anim: array [0..MOB_TYPES, 0..0] of integer; + + function getType(i:integer):integer; + begin + getType:=mob_type[i]; + end; + + function getX(i:integer):integer; + begin + getX:=mob_x[i]; + end; + + function getY(i:integer):integer; + begin + getY:=mob_y[i]; + end; + + function getVX(i:integer):integer; + begin + getVX:=mob_vx[i]; + end; + + function getVY(i:integer):integer; + begin + getVY:=mob_vy[i]; + end; + + function getPosi(i:integer):integer; + begin + getPosi:=mob_posi[i]; + end; + + function getHp(i:integer):integer; + begin + getHp:=mob_hp[i]; + end; + + function getW(i:integer):integer; + begin + getW:=tab_w[mob_type[i]]; + end; + + function getH(i:integer):integer; + begin + getH:=tab_h[mob_type[i]]; + end; + + function getSpeedX(i:integer):integer; + begin + getSpeedX:=tab_speedx[mob_type[i]]; + end; + + function getJumpH(i:integer):integer; + begin + getJumpH:=tab_jumph[mob_type[i]]; + end; + + function getJmp(i:integer):boolean; + begin + getJmp:=mob_jmp[i]; + end; + + procedure setType(value, i:integer); + begin + mob_type[i]:=value; + end; + + procedure setX(value, i:integer); + begin + mob_x[i]:=value; + end; + + procedure setY(value, i:integer); + begin + mob_y[i]:=value; + end; + + procedure setVX(value, i:integer); + begin + mob_vx[i]:=value; + end; + + procedure setVY(value, i:integer); + begin + mob_vy[i]:=value; + end; + + procedure setPosi(value, i:integer); + begin + mob_posi[i]:=value; + end; + + procedure setHp(value, i:integer); + begin + mob_hp[i]:=value; + end; + + procedure setJmp(value:boolean; i:integer); + begin + mob_jmp[i]:=value; + end; + + procedure initTab(_type, w, h, hp, speedx, jumph, ai:integer); + begin + tab_w[_type]:=w; + tab_h[_type]:=h; + tab_hp[_type]:=hp; + tab_speedx[_type]:=speedx; + tab_jumph[_type]:=jumph; + tab_ai[_type]:=ai; + end; + + procedure initTexture(img:image; mobtype, texid, posi, centerx, centery:integer); + begin + tex_w[posi, mobtype, texid]:=getImageWidth(img); + tex_h[posi, mobtype, texid]:=getImageHeight(img); + if posi=0 then + texture_left[mobtype, texid]:=img; + else + texture_right[mobtype, texid]:=img; + tex_x[posi, mobtype, texid]:=centerx; + tex_y[posi, mobtype, texid]:=centery; + end; + + procedure setMaxTextures(mobtype, max:integer); + var + i:integer; + begin + max:=max+1; + debug('setMaxTextures(mobtype, max:integer);'); + bytecode + getstatic field 'mob', 'texture_left', '[[Ljavax/microedition/lcdui/Image;'; + iload 0; + iload 1; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + aastore; + + getstatic field 'mob', 'texture_right', '[[Ljavax/microedition/lcdui/Image;'; + iload 0; + iload 1; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + aastore; + end; + + for i:=0 to 1 do + bytecode + //tex_x[i][mobtype]=new int[max]; + getstatic field 'mob', 'tex_x', '[[[I'; + iload_2; + aaload; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'tex_y', '[[[I'; + iload_2; + aaload; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'tex_w', '[[[I'; + iload_2; + aaload; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'tex_h', '[[[I'; + iload_2; + aaload; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + end; + end; + + procedure setMaxParts(mobtype, max:integer); + begin + part_max[mobtype]:=max; + max:=max+1; + + bytecode + getstatic field 'mob', 'part_tex', '[[I'; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'part_x', '[[I'; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'part_y', '[[I'; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + + getstatic field 'mob', 'part_anim', '[[I'; + iload_0; + iload_1; + multianewarray class '[I', 1; + aastore; + end; + end; + + procedure initPart(mobtype, partid, tex, x, y, animreg:integer); + begin + part_tex[mobtype, partid]:=tex; + part_x[mobtype, partid]:=x; + part_y[mobtype, partid]:=y; + part_anim[mobtype, partid]:=animreg; + end; + +procedure loadPhy(i:integer); + begin + phy.loadObject(mob_x[i], mob_y[i], tab_w[mob_type[i]], tab_h[mob_type[i]], mob_vx[i], mob_vy[i], mob_jmp[i]); + end; + +procedure storePhy(i:integer); + begin + mob_x[i]:=phy.getX; + mob_y[i]:=phy.getY; + mob_vx[i]:=phy.getVelX; + mob_vy[i]:=phy.getVelY; + mob_jmp[i]:=phy.getJmp; + end; + +{===== =====} + + procedure create(_type, x, y:integer);//Создать моба + var + i, j:integer; + begin + debug('Create mob '+_type+' @ '+x+'x'+y); + for i:=0 to MAX_MOBS do + if mob_type[i]=M_NONE then + begin + mob_type[i]:=_type; + mob_x[i]:=x; + mob_y[i]:=y; + mob_vx[i]:=0; + mob_vy[i]:=0; + mob_posi[i]:=0; + mob_hp[i]:=tab_hp[_type]; + mob_jmp[i]:=false; + for j:=0 to MAX_ANIMREG do + mob_anim[i, j]:=0; + + debug('Created mob is '+i); + exit; + end; + end; + + procedure die(i:integer);//Убить + begin + mob_type[i]:=M_NONE; + end; + + procedure hit(value, i:integer);//Нанести урон + var + hp:integer; + begin + hp:=getHp(i)-value; + if hp>0 then + setHp(hp, i); + else + die(i); + end; + + function findAndHit(value, x, y, w, h, addvx, addvy:integer):integer; + var + i:integer; + begin + for i:=0 to MAX_MOBS do + if getType(i)<>M_NONE then + if CollTwoObj(x, y, w, h, getX(i), getY(i), getW(i), getH(i)) then + begin + setVX(getVX(i)+addvx, i); + setVX(getVY(i)+addvy, i); + hit(value, i); + findAndHit:=i; + exit; + end; + + findAndHit:=-1; + end; + + procedure goUp(i:integer); + begin + loadPhy(i); + phy.jumpObj(getJumpH(i)); + storePhy(i); + end; + + procedure goDown(i:integer); + begin + + end; + + procedure goLeft(i:integer); + begin + setVX(-getSpeedX(i), i); + setPosi(0, i); + end; + + procedure goRight(i:integer); + begin + setVX(getSpeedX(i), i); + setPosi(1, i); + end; + + function testSolid(i, vector:integer):boolean; + var + x, y:integer; + begin + y:=((getY(i)+getH(i)))/16-1; + + if vector<0 then + begin + x:=(getX(i)/16)-1; + end; + else + if vector>0 then + begin + x:=((getX(i)+getW(i))/16){+1}; + end; + else + x:=((getX(i)+getW(i)/2)/16); + + testSolid:=phy.isSolid(x, y, getVX(i), getVY(i)); + end; + + procedure updateZloyAiAnim(i:integer); + const + DEL=1; + var + a_a, a_d, a_f:integer; + begin + a_a:=mob_anim[i, 1]; + a_d:=mob_anim[i, 2]; + a_f:=mob_anim[i, 3]; + + a_d:=a_d+1; + if a_d>DEL then + begin + a_d:=0; + a_a:=a_a+1; + if a_f=1 then + begin + a_a:=0; + a_f:=0; + end; + else + if a_a=3 then + begin + a_a:=1; + a_f:=1; + end; + end; + + mob_anim[i, 1]:=a_a; + mob_anim[i, 2]:=a_d; + mob_anim[i, 3]:=a_f; + end; + + procedure updateZloyAi(i:integer); + begin + if player.getXgetX(i) then + begin + goRight(i); + updateZloyAiAnim(i); + if testSolid(i, 1) then + goUp(i); + end; + end; + + procedure update;//Обновление логики + var + i, _type, ai:integer; + begin + for i:=0 to MAX_MOBS do + begin + _type:=getType(i); + + if _type<>M_NONE then + begin + ai:=tab_ai[_type]; + if ai=AI_ZLOY then + updateZloyAi(i); + end; + end; + end; + + procedure updatePhy;//Обновление физики + var + i:integer; + begin + for i:=0 to MAX_MOBS do + begin + loadPhy(i); + phy.calc(true); + storePhy(i); + end; + end; + + procedure drawPart(mobtype, texid, posi, anim, x, y, camx, camy:integer); + begin + x:=x-tex_x[posi, mobtype, texid]-camx; + y:=y-tex_y[posi, mobtype, texid]-camy; + + if CollTwoObj(x, y, tex_w[posi, mobtype, texid], tex_h[posi, mobtype, texid], 0, 0, getWidth, getHeight) then + if posi=0 then + drawImage(texture_left[mobtype, texid+anim], x, y); + else + drawImage(texture_right[mobtype, texid+anim], x, y); + end; + + procedure draw(camx, camy:integer);//Отрисовка + var + i, j, _type:integer; + begin + for i:=0 to MAX_MOBS do + begin + _type:=mob_type[i]; + if _type<>M_NONE then + begin + for j:=0 to part_max[_type] do + drawPart(_type, part_tex[_type, j], mob_posi[i], mob_anim[i, part_anim[_type, j]], mob_x[i]+part_x[_type, j], mob_y[i]+part_y[_type, j], camx, camy); + end; + end; + end; + + procedure loadSkin(path:string);//Загрузка текстур + var + im:image; + begin + setMaxTextures(M_ZOMBY, 5); + im:=ld_tex('zombie_ani.png', path, 'mobs/'); + // IMG, TYPE, ID, POSI, X, Y + initTexture(rotate_image_from_image(im, 6, 2, 8, 8, 0), M_ZOMBY, 0, 0, 4, 8);//head[left] + initTexture(rotate_image_from_image(im, 8, 10, 4, 12, 0), M_ZOMBY, 1, 0, 2, 0);//body[left] + initTexture(rotate_image_from_image(im, 0, 10, 12, 4, 0), M_ZOMBY, 2, 0, 10, 2);//hands[left] + initTexture(rotate_image_from_image(im, 0, 52, 12, 12, 0), M_ZOMBY, 3, 0, 6, 0);//legs[left] + initTexture(rotate_image_from_image(im, 13, 52, 12, 12, 0), M_ZOMBY, 4, 0, 6, 0); + initTexture(rotate_image_from_image(im, 26, 52, 12, 12, 0), M_ZOMBY, 5, 0, 6, 0); + + initTexture(rotate_image_from_image(im, 27, 2, 8, 8, 0), M_ZOMBY, 0, 1, 4, 8);//head[right] + initTexture(rotate_image_from_image(im, 29, 10, 4, 12, 0), M_ZOMBY, 1, 1, 2, 0);//body[right] + initTexture(rotate_image_from_image(im, 29, 10, 12, 4, 0), M_ZOMBY, 2, 1, 2, 2);//hands[right] + initTexture(rotate_image_from_image(im, 39, 52, 12, 12, 0), M_ZOMBY, 3, 1, 6, 0);//legs[right] + initTexture(rotate_image_from_image(im, 52, 52, 12, 12, 0), M_ZOMBY, 4, 1, 6, 0); + initTexture(rotate_image_from_image(im, 65, 52, 12, 12, 0), M_ZOMBY, 5, 1, 6, 0); + end; + + procedure freeSkin;//Выгрузка текстур + var + i, j, len:integer; + nullimg:image; + begin + for i:=0 to MOB_TYPES do + begin + bytecode + getstatic field 'mob', 'texture_left', '[[Ljavax/microedition/lcdui/Image;'; + iload_0;//i + aaload; + arraylength; + iconst_1; + isub; + istore_2;//len + end; + for j:=0 to len do + begin + texture_left[i, j]:=nullimg; + texture_right[i, j]:=nullimg; + end; + end; + end; + + procedure saveData;//Сохранение всех данных + begin + + end; + + procedure loadData;//Загрузка всех данных + begin + + end; + + procedure resetData;//Сброс всех данных + var + i, j:integer; + begin + for i:=0 to MAX_MOBS do + begin + mob_type[i]:=M_NONE; + mob_x[i]:=0; + mob_y[i]:=0; + mob_vx[i]:=0; + mob_vy[i]:=0; + mob_posi[i]:=0; + mob_hp[i]:=0; + mob_jmp[i]:=false; + for j:=0 to MAX_ANIMREG do + mob_anim[i, j]:=0; + end; + end; + +initialization + // TYPE W H HP SX JH, AI_TYPE + initTab(M_NONE, 0, 0, 0, 0, 0, AI_NONE); + setMaxParts(M_NONE, -1); + + initTab(M_ZOMBY, 8, 32, 10, 1, 7, AI_ZLOY); + setMaxParts(M_ZOMBY, 3); + // TYPE PART, TEX, X, Y ANIM + initPart(M_ZOMBY, 0, 0, 4, 8, 0);//Head + initPart(M_ZOMBY, 1, 1, 4, 8, 0);//Body + initPart(M_ZOMBY, 2, 2, 4, 10, 0);//Hands + initPart(M_ZOMBY, 3, 3, 4, 20, 1);//Legs +end. diff --git a/src/particles.mpsrc b/src/particles.mpsrc new file mode 100644 index 0000000..ba3c7c4 --- /dev/null +++ b/src/particles.mpsrc @@ -0,0 +1,139 @@ +unit particles; + +interface + var + bubble:image; + pr_1:array [0..7] of image; + none1:image; + pr_2:array [0..7] of image; + none2:image; + pr_3:array [0..7] of image; + none3:image; + pr_4:array [0..7] of image; + none4:image; + pr_5:array [0..7] of image; + none5:image; + pr_boom:array [0..15] of image; + none6:image; + + max_particles:integer; + s_particles:boolean; + gb_up_pa:integer; + + procedure create_particle(tp,ix,iy:integer); + procedure update_particle; + procedure draw_particle; + +implementation + uses vars,maps,particles_store; + +procedure create_particle(tp,ix,iy:integer); + var + i:integer; + begin + if s_particles=true then + for i:=0 to max_particles do + if get_particle_type(i)=0 then + begin + set_particle(i,tp,0,ix,iy); + exit; + end; + end; + +procedure null_particle(i:integer); + begin + set_particle(i,0,0,0,0); + end; + +procedure pr_ai_1(i,maxani:integer); + begin + set_particle_y(i,get_particle_y(i)-1); + set_particle_ani(i,get_particle_ani(i)+1); + if get_particle_ani(i)>maxani then null_particle(i); + end; + +procedure pr_ai_bubble(i:integer); + var + xx,yy:integer; + begin + set_particle_y(i,get_particle_y(i)-1); + xx:=get_particle_x(i) div 16; + yy:=get_particle_y(i) div 16; + if getmap(xx,yy)<>50 then null_particle(i); + end; + +procedure pr_ai_boom(i:integer); + begin + set_particle_ani(i,get_particle_ani(i)+1); + if get_particle_ani(i)>15 then null_particle(i); + end; + +procedure update_particle; + var + i:integer; + begin + if s_particles=true then + begin + for i:=0 to max_particles do + if get_particle_type(i)>0 then + begin + if get_particle_type(i)=1 then pr_ai_1(i,5); else + if get_particle_type(i)=2 then pr_ai_1(i,5); else + if get_particle_type(i)=3 then pr_ai_1(i,5); else + if get_particle_type(i)=4 then pr_ai_1(i,5); else + if get_particle_type(i)=5 then pr_ai_1(i,5); else + if get_particle_type(i)=6 then pr_ai_bubble(i); else + if get_particle_type(i)=7 then pr_ai_boom(i); else + null_particle(i); + end; + gb_up_pa:=gb_up_pa+1; + if gb_up_pa>=2 then gb_up_pa:=0; + end; + end; + +procedure draw_particle; + var + i:integer; + begin + for i:=0 to max_particles do + if get_particle_type(i)>0 then + begin + if get_particle_type(i)=1 then + begin + if (get_particle_x(i)-camx>-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-8) and (get_particle_x(i)-camx-8) and (get_particle_y(i)-camy-32) and (get_particle_x(i)-camx-32) and (get_particle_y(i)-camyx2) and (x1y2) and (y10 then + isSolid:=true; + end; + + function mapColl(x, y, w, h, velx, vely:integer):boolean; + var + i, j:integer; + minx, miny, maxx, maxy:integer; + begin + minx:=x div TILE_SIZE; + miny:=y div TILE_SIZE; + maxx:=(x+w-1) div TILE_SIZE; + maxy:=(y+h-1) div TILE_SIZE; + for i:=minx to maxx do + for j:=miny to maxy do + begin + if isSolid(i, j, velx, vely) then + begin + mapColl:=true; + exit; + end; + end; + end; + + function canSeeObj(x1, y1, x2, y2:integer):boolean; + var + deltax, deltay:integer; + signx, signy:integer; + error, error2:integer; + begin + x1:=x1/TILE_SIZE; + y1:=y1/TILE_SIZE; + x2:=x2/TILE_SIZE; + y2:=y2/TILE_SIZE; + + deltax:=abs(x2-x1); + deltay:=abs(y2-y1); + + if x1x2) or (y1<>y2)) do + begin + if isSolid(x1, y1, 0, 0) then + exit; + + error2:=error<<1; + if error2>-deltaY then + begin + error:=error-deltaY; + x1:=x1+signX; + end; + + if error2MAX_VELY then + vely:=MAX_VELY; + + jmp:=false; + + if vely>0 then + for i:=1 to vely do + begin + y:=y+1; + if mapColl(x, y, w, h, velx, vely) then + begin + y:=y-1; + vely:=0; + jmp:=true; + break; + end; + end; + else + for i:=1 to abs(vely) do + begin + y:=y-1; + if mapColl(x, y, w, h, velx, vely) then + begin + y:=y+1; + vely:=0; + jmp:=false; + break; + end; + end; + end; + + function fixVYup:boolean; + begin + if (vely>-5) and + (mapCollType(49, x, y, w, h) or + mapCollType(103, x, y, w, h) or + mapCollType(108, x, y, w, h)) then + vely:=vely-2; + else + if (vely>-4) and + (mapCollType(50, x, y, w, h) or + mapCollType(51, x, y, w, h)) then + vely:=vely-2; + else + fixVYup:=true; + end; + + procedure fixVYdown; + begin + if (vely>5) and + (mapCollType(49, x, y, w, h) or + mapCollType(103, x, y, w, h)) then + vely:=5; + else + if (vely>4) and + (mapCollType(50, x, y, w, h) or + mapCollType(51, x, y, w, h)) then + vely:=4; + end; + + procedure jumpObj(vel:integer); + begin + if fixVYup then + if jmp then + begin + vely:=-vel; + jmp:=false; + end; + end; + + procedure calcX; + var + i:integer; + begin + if velx>0 then + for i:=1 to velx do + begin + x:=x+1; + if mapColl(x, y, w, h, velx, vely) then + begin + x:=x-1; + velx:=0; + break; + end; + end; + else + if velx<0 then + for i:=1 to abs(velx) do //there for-downto-do have a bug! + begin + x:=x-1; + if mapColl(x, y, w, h, velx, vely) then + begin + x:=x+1; + velx:=0; + break; + end; + end; + + if velx>0 then + velx:=velx-1; + else + if velx<0 then + velx:=velx+1; + end; + + procedure calcY; + var + i:integer; + begin + if vely>0 then + for i:=1 to vely do + begin + y:=y+1; + if mapColl(x, y, w, h, velx, vely) then + begin + y:=y-1; + vely:=0; + break; + end; + end; + else + if vely<0 then + for i:=1 to abs(vely) do //there for-downto-do have a bug! + begin + y:=y-1; + if mapColl(x, y, w, h, velx, vely) then + begin + y:=y+1; + velx:=0; + break; + end; + end; + + if vely>0 then + vely:=vely-1; + else + if vely<0 then + vely:=vely+1; + end; + + function getX:integer; + begin + getX:=x; + end; + + function getY:integer; + begin + getY:=y; + end; + + function getVelX:integer; + begin + getVelX:=velx; + end; + + function getVelY:integer; + begin + getVelY:=vely; + end; + + function getJmp:boolean; + begin + getJmp:=jmp; + end; + + procedure calc(gravity:boolean); + begin + calcX; + + if gravity then + begin + calcGravity; + fixVYdown; + end; + else + calcY; + end; + +end. diff --git a/src/player.mpsrc b/src/player.mpsrc new file mode 100644 index 0000000..3e9f361 --- /dev/null +++ b/src/player.mpsrc @@ -0,0 +1,363 @@ +unit player; + +interface + const + ANIM_HAND=0; + ANIM_LEGS=1; + + var + fly:boolean; + hp, hunger, air:integer; + posi:integer;//Сторона в которую повёрнут игрок + velx,vely:integer;//Переменные для физики игрока + jmp, an_pr:boolean; + s_get_drp:boolean; + invslot:integer; + + procedure setX(val:integer); + procedure setY(val:integer); + function getX:integer; + function getY:integer; + function getW:integer; + function getH:integer; + + procedure loadSkin(str, path:string); + procedure freeSkin; + procedure draw(camx, camy:integer); + procedure playAnim(anim:integer); + procedure cancelAnim(anim:integer); + + procedure dropItem(item, sum:integer); + + procedure calcPhysics; + + procedure gotoUP; + procedure gotoDOWN; + procedure gotoLEFT; + procedure gotoRIGHT; + + procedure getDrop; + +implementation + uses func, phy, vars, Canvas, drop, items, jsr75i, inv; + const + PLAYER_W=8; + PLAYER_H=32; + PLAYER_SPEED=2; + + POSI_LEFT=0; + POSI_RIGHT=1; + PLAYER_ANIM_DEL=1; + var + plx, ply:integer; + + //Skin + PlayerBody: array [0..1] of image; + PlayerHand: array [0..1, 0..3] of image; + PlayerLegs: array [0..1, 0..2] of image; + animHand, animLegs, animDelay:integer; + + procedure setX(val:integer); + begin + plx:=val; + end; + + procedure setY(val:integer); + begin + ply:=val; + end; + + function getX:integer; + begin + getX:=plx; + end; + + function getY:integer; + begin + getY:=ply; + end; + + function getW:integer; + begin + getW:=PLAYER_W; + end; + + function getH:integer; + begin + getH:=PLAYER_H; + end; + + procedure setVelX(val:integer); + begin + velx:=val; + end; + + procedure setVelY(val:integer); + begin + vely:=val; + end; + + function getVelX:integer; + begin + getVelX:=velx; + end; + + function getVelY:integer; + begin + getVelY:=vely; + end; + + procedure setJmp(val:boolean); + begin + jmp:=val; + end; + + function getJmp:boolean; + begin + getJmp:=jmp; + end; + + procedure dropItem(item, sum:integer); + begin + if posi=POSI_LEFT then + drop.create(item, sum, getX-8, getY); + else + drop.create(item, sum, getX+getW, getY); + end; + + procedure loadSkin(str, path:string); + var + im:image; + i:integer; + begin + im:=ld_tex(str, path, 'mobs/'); + + PlayerBody[POSI_LEFT]:=rotate_image_from_image(im, 0, 0, 8, 20, 0); + PlayerBody[POSI_RIGHT]:=rotate_image_from_image(im, 8, 0, 8, 20, 0); + + PlayerHand[POSI_LEFT, 0]:=rotate_image_from_image(im, 40, 0, 4, 12, 0); + PlayerHand[POSI_RIGHT, 0]:=rotate_image_from_image(im, 44, 0, 4, 12, 0); + + for i:=1 to 3 do + begin + PlayerHand[POSI_LEFT, i]:=rotate_image_from_image(im, 16, (i-1)*6, 12, 6, 0); + PlayerHand[POSI_RIGHT, i]:=rotate_image_from_image(im, 28, (i-1)*6, 12, 6, 0); + end; + + for i:=0 to 2 do + begin + PlayerLegs[POSI_LEFT, i]:=rotate_image_from_image(im, i*12, 20, 12, 12, 0); + PlayerLegs[POSI_RIGHT, i]:=rotate_image_from_image(im, 36+i*12, 20, 12, 12, 0); + end; + end; + + procedure freeSkin; + var + i, j:integer; + nullimg:image; + begin + for i:=0 to 1 do + begin + PlayerBody[i]:=nullimg; + for j:=0 to 3 do + PlayerHand[i, j]:=nullimg; + for j:=0 to 2 do + PlayerLegs[i, j]:=nullimg; + end; + end; + + procedure playAnim(anim:integer); + begin + if anim=ANIM_HAND then + begin + animHand:=animHand+1; + if animHand>3 then + animHand:=1; + end; + else + if anim=ANIM_LEGS then + begin + if animDelay=0 then + begin + animLegs:=animLegs+1; + if animLegs>2 then + animLegs:=0; + end; + + animDelay:=animDelay+1; + if animDelay>PLAYER_ANIM_DEL then + animDelay:=0; + end; + end; + + procedure cancelAnim(anim:integer); + begin + if anim=ANIM_HAND then + begin + animHand:=0; + end; + else + if anim=ANIM_LEGS then + begin + animLegs:=0; + end; + end; + + procedure draw(camx, camy:integer); + var + x, y:integer; + begin + x:=getX; + y:=getY; + + DrawImage(PlayerBody[posi], x-camx, y-camy); + DrawImage(PlayerLegs[posi, animLegs], x-2-camx, y+20-camy); + + if animHand=0 then + drawSmallItem(inv.getItem(invslot), x-camx, y+14-camy); + else + if posi=POSI_RIGHT then + drawSmallItem(inv.getItem(invslot), x+10-camx, y+5-camy+animHand); + else + if posi=POSI_LEFT then + drawSmallItem(inv.getItem(invslot), x-10-camx, y+5-camy+animHand); + + if (animHand=0) or (posi=POSI_RIGHT) then + DrawImage(PlayerHand[posi, animHand], x+2-camx, y+8-camy); + else + DrawImage(PlayerHand[posi, animHand], x-6-camx, y+8-camy); + end; + +procedure loadPhy; + begin + phy.loadObject(getX, getY, getW, getH, getVelX, getVelY, getJmp); + end; + +procedure storePhy; + begin + setX(phy.getX); + setY(phy.getY); + setVelX(phy.getVelX); + setVelY(phy.getVelY); + setJmp(phy.getJmp); + end; + + //Player collision. +{function coll:boolean; + begin + coll:=CollObj(getX, getY, getW, getH); + end; + +//Player collision by block id. +function coll_bl(id:integer):boolean; + begin + coll_bl:=CollObjBlock(getX, getY, getW, getH, id); + end; + +//Player collision by XY. +function coll_xy(xx,yy:integer):boolean; + begin + coll_xy:=CollObjXY(getX, getY, getW, getH, xx, yy); + end; + +//Controll jump velocity +procedure jmp_ctrl; + begin + if (coll_bl(49)) or (coll_bl(103)) or (coll_bl(108)) then + vely:=5; + if (coll_bl(50)) or (coll_bl(51)) then + vely:=4; + if (coll_bl(0)) and (coll_bl(50) or coll_bl(51)) then + vely:=7; + end; + +//Controll fall velocity + procedure phy_ctrl; + begin + if (coll_bl(49)) or (coll_bl(103)) then + vely:=-5; + if (coll_bl(50)) or (coll_bl(51)) then + if vely<-4 then + vely:=-4; + end;} + + procedure calcPhysics; + var + old_vely:integer; + cl:boolean; + begin + loadPhy; + phy.calc(not fly); + storePhy; + + {if fly=false then + begin + old_vely:=vely; + calcGravY(getX, getY, getW, getH, CONST_PHY_ACC, vely, CONST_PHY_MAXVEL, jmp); + setY(PhyGetY); + vely:=PhyGetVelY; + jmp:=PhyGetJump; + cl:=PhyGetColl; + + if cl then + if old_vely<-10 then + hp:=(hp-(abs(old_vely)-10)); + end;} + end; + + procedure gotoUP; + begin + if fly then + setVelY(-PLAYER_SPEED); + else + begin + loadPhy; + jumpObj(7); + storePhy; + end; + end; + + procedure gotoDOWN; + begin + if fly then + setVelY(PLAYER_SPEED); + end; + + procedure gotoLEFT; + begin + setVelX(-PLAYER_SPEED); + + posi:=POSI_LEFT; + + if fly=false then + playAnim(ANIM_LEGS); + end; + + procedure gotoRIGHT; + begin + setVelX(PLAYER_SPEED); + + posi:=POSI_RIGHT; + + if fly=false then + playAnim(ANIM_LEGS); + end; + + procedure getDrop; + var + i, maxd, sum:integer; + begin + maxd:=drop.max; + for i:=0 to maxd do + if drop.isNull(i)=false then + if CollTwoObj(getX, getY, getW, getH, drop.getX(i), drop.getY(i), drop.getW, drop.getH) then + begin + sum:=inv.giveItem(drop.getItem(i), drop.getSum(i)); + drop.setSum(sum, i); + drop.fixNull(i); + end; + end; + +initialization + +end. diff --git a/src/randoms.mpsrc b/src/randoms.mpsrc new file mode 100644 index 0000000..4720898 --- /dev/null +++ b/src/randoms.mpsrc @@ -0,0 +1,37 @@ +unit randoms; + +interface + procedure srand(s:integer);//Устанавливает зерно для ГПСЧ + function rand:integer;//Возвращает случайное число + function rnd(max:integer):integer;//Возвращает число от 0 до max + function rnd_pr(pr,p1,p2:integer):integer; + +implementation + var + next:integer; + + function rand:integer; + begin + next:=next xor (next << 13); + next:=next xor (next >>> 17); + next:=next xor (next << 5); + rand:=abs(next); + end; + + procedure srand(s:integer); + begin + //Debug('srand('+s+')'); + next:=s; + end; + + function rnd(max:integer):integer; + begin + rnd:=rand mod max; + end; + + function rnd_pr(pr,p1,p2:integer):integer; + begin + if pr>=rnd(101) then rnd_pr:=p1; else rnd_pr:=p2; + end; + +end. \ No newline at end of file diff --git a/src/sign.pas b/src/sign.pas new file mode 100644 index 0000000..01552cb --- /dev/null +++ b/src/sign.pas @@ -0,0 +1,63 @@ +unit sign; + +interface + var + b_sign:array [0..31] of boolean; + none0:boolean; + t_sign:array [0..31] of string; + none1:boolean; + + function createsign(ii,ij:integer):integer; + procedure destsign(id:integer); + +implementation +uses maps; + +function createsign(ii,ij:integer):integer; + var + ix,ymp:integer; + tx:array [0..3] of integer; + exitCmd,cli:command; + begin + for ix:=0 to 31 do + if b_sign[ix]=false then + begin + b_sign[ix]:=true; + t_sign[ix]:=''; + setmapinfo(ix,ii,ij); + debug('Sg'+ix); + + clearForm; + exitCmd:=createCommand('Ok',CM_OK,1); + showForm; + addCommand(exitCmd); + ymp:=formAddString('Text:'); + tx[0]:=formAddTextField('','',15,TF_ANY); + tx[1]:=formAddTextField('','',15,TF_ANY); + tx[2]:=formAddTextField('','',15,TF_ANY); + tx[3]:=formAddTextField('','',15,TF_ANY); + repaint; + delay(100); + repeat + cli:=getClickedCommand; + until cli=exitCmd; + t_sign[ix]:=formGetText(tx[0])+#13+formGetText(tx[1])+#13+formGetText(tx[2])+#13+formGetText(tx[3])+#13; + showCanvas; + + createsign:=0; + exit; + end; else + createsign:=-1; + end; + +procedure destsign(id:integer); + var + ix:integer; + begin + b_sign[id]:=false; + t_sign[id]:=''; + end; + +initialization + +end. diff --git a/src/utils.mpsrc b/src/utils.mpsrc new file mode 100644 index 0000000..6f69a9a --- /dev/null +++ b/src/utils.mpsrc @@ -0,0 +1,63 @@ +unit utils; + +interface +const + MaxTimers=2; + TIMER_ERROR=-1; + TIMER_OK=0; + + T_CONSOLE=0;//Timer for call console + T_KEY_DIVITEM=1; + T_KEY_DROPITEM=2; + +procedure SetTimer(t,i:integer); +function GetTimer(i:integer):integer; +procedure ResetTimer(i:integer); +procedure ResetAllTimers; + +implementation + var + Timer_value:array [0..MaxTimers] of integer; + Timer_time:array [0..MaxTimers] of integer; + +procedure SetTimer(t,i:integer); + begin + Timer_value[i]:=t; + Timer_time[i]:=getrelativetimems; + end; + +function GetTimer(i:integer):integer; + var + dt:integer; + begin + if Timer_value[i]>-1 then + begin + dt:=Timer_time[i]-getrelativetimems; + Timer_value[i]:=Timer_value[i]+dt; + if Timer_value[i]<0 then Timer_value[i]:=0; + Timer_time[i]:=getrelativetimems; + GetTimer:=Timer_value[i]; + end; + else GetTimer:=-1; + end; + +procedure ResetTimer(i:integer); + begin + Timer_value[i]:=-1; + Timer_time[i]:=-1; + end; + +procedure ResetAllTimers; + var + i:integer; + begin + for i:=0 to MaxTimers do + begin + Timer_value[i]:=-1; + Timer_time[i]:=-1; + end; + end; + +initialization + ResetAllTimers; +end. diff --git a/src/vars.mpsrc b/src/vars.mpsrc new file mode 100644 index 0000000..5ac6cb8 --- /dev/null +++ b/src/vars.mpsrc @@ -0,0 +1,90 @@ +unit vars; + +interface + const + max_sounds=13; + + FONT_STD_COLOR=$FFFFFFFF; + FONT_YELLOW_COLOR=$FFFFFF00; + FONT_MAX_SYM=127; + FONT_SYM_SIZE=8; + + MAP_W=256; + MAP_H=128; + + TILE_SIZE=16; + + var + pl_world:integer;//мир в котором находится игрок (0 - обычный мир, 1 - нижний мир) + fps:integer;//Текущий фпс, можно использовать для синхронизации + camx,camy:integer;//Координаты камеры + curx,cury:integer;//Координаты курсора игрока + game_time:integer;//Игровое время + gamemode:integer;//Режим игры + bon_chest:boolean;//Генерировать бонусный сундук? + //invslot:integer;//номер слота на "поясе" + + + tex_pack:string; + bl_ani5:integer; + + bl_ani5_v,bl_ani5_d:boolean; + + fish:boolean; + + + fish_time:integer; + hung_time,hp_time,air_time,portal_time:integer; + fx,fy:integer; + + maxBlockTex, maxItemTex:integer; + + tex:array [0..0] of image; + none0:image; + tex8:array [0..0] of image; + none1:image; + item:array [0..0] of image; + none2:image; + item8:array [0..0] of image; + none3:image; + font:array [0..127] of image; + none4:image; + + procedure initBlockTex(i:integer); + procedure initItemTex(i:integer); + +implementation + + procedure initBlockTex(i:integer); + begin + maxblocktex:=i; + i:=i+1; + bytecode + iload 0; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + putstatic field 'vars', 'tex', '[Ljavax/microedition/lcdui/Image;'; + end; + bytecode + iload 0; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + putstatic field 'vars', 'tex8', '[Ljavax/microedition/lcdui/Image;'; + end; + end; + + procedure initItemTex(i:integer); + begin + maxItemTex:=i; + i:=i+1; + bytecode + iload 0; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + putstatic field 'vars', 'item', '[Ljavax/microedition/lcdui/Image;'; + end; + bytecode + iload 0; + multianewarray class '[Ljavax/microedition/lcdui/Image;', 1; + putstatic field 'vars', 'item8', '[Ljavax/microedition/lcdui/Image;'; + end; + end; + +end. diff --git a/src/video.pas b/src/video.pas new file mode 100644 index 0000000..98cef80 --- /dev/null +++ b/src/video.pas @@ -0,0 +1,66 @@ +unit video; + +interface + procedure initVideo(scrW, scrH:integer; canScale:boolean;); + procedure drawVideo; + +implementation + uses scri, keyboard; + var + useRes:boolean; + + procedure initVideo(scrW, scrH:integer; canScale:boolean;); + var + tmp:integer; + begin + keyboard.scrMulX:=1; + keyboard.scrMulY:=1; + useRes:=false; + if (getWidth>getHeight) and (scrWscrW) and (getHeight>scrH)) or ((getHeight>scrW) and (getWidth>scrH)) then + begin + debug('Scaling: '+getWidth+'x'+getHeight+' -> '+scrW+'x'+scrH); + if getWidth '+scrW+'x'+scrH); + + ScriCreate(scrW, scrH); + if canScale then + begin + keyboard.scrMulX:=getWidth/scrW; + keyboard.scrMulY:=getHeight/scrH; + ScriScale(getWidth/scrW, getHeight/scrH); + ScriPosition(0, 0); + ScriSwap; + useRes:=true; + end; + end; + end; + + procedure drawVideo; + begin + draw_virtual_keys; + if useRes then + begin + ScriSwap; + ScriDraw; + Repaint; + ScriSwap; + end; + else + Repaint; + end; + +end. diff --git a/src/worldgen.mpsrc b/src/worldgen.mpsrc new file mode 100644 index 0000000..ca52210 --- /dev/null +++ b/src/worldgen.mpsrc @@ -0,0 +1,963 @@ +//Thanks: +//ZeroNoWing +//Andrey59 + +unit worldgen; + +interface + procedure genworld;//Вызывается из главного модуля для начала генерации мира + procedure gennether; + procedure genflat; + procedure genportal(xx,yy:integer); + function get_up(Xi:integer):integer; + + procedure genwood1(xx,yy:integer);//дуб + procedure genwood2(xx,yy:integer);//берёза + procedure genwood3(xx,yy:integer);//ель + + +implementation +uses maps,randoms,vars,items,func, player, chest, items_store; + + function rnd_min:integer; + begin + rnd_min:=rnd(3)-1; + end; + +procedure create_bonus_chest(chx,chy:integer); + var + ix,l,id,time:integer; + begin + time:=getcurrenttime; + if ((getmonth(time)=0) and (getday(time)<3)) or ((getmonth(time)=11) and (getday(time)>29)) then + setmap(102,chx,chy); + else + setmap(28,chx,chy); + setmap(26,chx-1,chy); + setmap(26,chx+1,chy); + setmapinfo(31,chx,chy); + id:=chest.create(chx,chy); + debug('Bonus Chest'); + for ix:=1 to rnd(10)+1 do + begin + l:=rnd(26); + if rnd(2)=rnd(2) then + begin + chest.setItem(127 ,l, id); + chest.setSum(rnd(6)+1, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(9 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(4 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(131 ,l, id); + chest.setSum(60, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(132 ,l, id); + chest.setSum(132, l, id); + end; + if rnd(2)=rnd(2) then + begin + chest.setItem(141 ,l, id); + chest.setSum(60, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(142 ,l, id); + chest.setSum(132, l, id); + end; + if rnd(2)=rnd(2) then + begin + chest.setItem(147 ,l, id); + chest.setSum(60, l, id); + end; else + if rnd(2)=rnd(2) then + begin + chest.setItem(201 ,l, id); + chest.setSum(rnd(16), l, id); + end; + end; + end; + + procedure genflat; + var + ix,iy:integer; + begin + for ix:=0 to 255 do + begin + setmap(2,ix,121); + setmap(1,ix,122); + setmap(1,ix,123); + setmap(3,ix,124); + setmap(3,ix,125); + setmap(3,ix,126); + setmap(6,ix,127); + + setBackMap(121, ix); + setBiomMap(0, ix); + end; + if bon_chest then create_bonus_chest(get_spawn_x,get_spawn_y+1); + delay(200); + end; + + procedure drawmap; + var + ix,iy:integer; + begin + for ix:=0 to 255 do + for iy:=0 to 127 do + begin + if getmap(ix,iy)<>0 then setcolor(0,0,0); else setcolor(255,255,255); + plot(ix,iy); + end; + repaint; + delay(1); + end; + + procedure gencave(xx,yy:integer); + var + ix,iy:integer; + mask:array [0..63,0..63] of boolean; + begin + for ix:=0 to 63 do + for iy:=0 to 63 do + mask[ix,iy]:=true; + ix:=(63+1)/2-1; + iy:=(63+1)/2-1; + while (ix>=0) and (ix<=63) and (iy>=0) and (iy<=63) do + begin + ix:=ix+rnd_min; + iy:=iy+rnd_min; + if (ix>=0) and (ix<=63) and (iy>=0) and (iy<=63) then mask[ix,iy]:=false; + end; + for ix:=1 to 62 do + for iy:=1 to 62 do + begin + if mask[ix,iy]=true then + if mask[ix-1,iy]=false then + if mask[ix+1,iy]=false then + mask[ix,iy]:=false; + end; + + for ix:=0 to 63 do + for iy:=0 to 63 do + begin + if mask[ix,iy]=false then setmap(0,xx+ix,yy+iy); + end; + end; + + procedure genportal(xx,yy:integer); + begin + setmap(10,xx+1,yy); + setmap(10,xx+2,yy); + setmap(118,xx,yy+1); + setmap(118,xx+3,yy+1); + setmap(118,xx,yy+2); + setmap(118,xx+3,yy+2); + setmap(118,xx,yy+3); + setmap(118,xx+3,yy+3); + setmap(10,xx+1,yy+4); + setmap(10,xx+2,yy+4); + setmap(110,xx+1,yy+1); + setmap(110,xx+2,yy+1); + setmap(110,xx+1,yy+2); + setmap(110,xx+2,yy+2); + setmap(110,xx+1,yy+3); + setmap(110,xx+2,yy+3); + end; + + procedure genportal_big(xx,yy:integer); + begin + setmap(10,xx,yy); + setmap(10,xx+1,yy); + setmap(10,xx+2,yy); + setmap(10,xx+3,yy); + setmap(118,xx,yy+1); + setmap(118,xx+3,yy+1); + setmap(118,xx,yy+2); + setmap(118,xx+3,yy+2); + setmap(118,xx,yy+3); + setmap(118,xx+3,yy+3); + setmap(10,xx,yy+4); + setmap(10,xx+1,yy+4); + setmap(10,xx+2,yy+4); + setmap(10,xx+3,yy+4); + setmap(110,xx+1,yy+1); + setmap(110,xx+2,yy+1); + setmap(110,xx+1,yy+2); + setmap(110,xx+2,yy+2); + setmap(110,xx+1,yy+3); + setmap(110,xx+2,yy+3); + end; + + procedure surprisechest(x,y:integer); + var + ix,l,id:integer; + begin + id:=chest.create(x, y); + debug('Surprise!'); + setmap(102,x,y); + for ix:=1 to rnd(8) do + begin + l:=rnd(26); + if rnd(22)=1 then + begin + chest.setItem(162 ,l, id); + chest.setSum(rnd(5), l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(165 ,l, id); + chest.setSum(rnd(6), l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(181 ,l, id); + chest.setSum(rnd(2), l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(182 ,l, id); + chest.setSum(rnd(2), l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(176 ,l, id); + chest.setSum(rnd(32), l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(183 ,l, id); + chest.setSum(rnd(10)+1, l, id); + end; else + if rnd(11)=1 then + begin + chest.setItem(186 ,l, id); + chest.setSum(1, l, id); + end; + end; + end; + + procedure genwood1(xx,yy:integer);//дуб + begin + setmap(75,xx,yy); + setmap(75,xx,yy-1); + setmap(75,xx,yy-2); + setmap(21,xx,yy-3); + setmap(21,xx,yy-4); + setmap(21,xx,yy-5); + setmap(21,xx-1,yy-3); + setmap(21,xx-1,yy-4); + setmap(21,xx+1,yy-3); + setmap(21,xx+1,yy-4); + end; + + procedure genwood2(xx,yy:integer);//берёза + begin + setmap(84,xx,yy); + setmap(84,xx,yy-1); + setmap(84,xx,yy-2); + setmap(112,xx,yy-3); + setmap(112,xx,yy-4); + setmap(112,xx,yy-5); + setmap(112,xx-1,yy-3); + setmap(112,xx-1,yy-4); + setmap(112,xx+1,yy-3); + setmap(112,xx+1,yy-4); + end; + + procedure genwood3(xx,yy:integer);//ель + var + time:integer; + begin + setmap(87,xx,yy-5); + setmap(87,xx-1,yy-4); setmap(87,xx,yy-4); setmap(87,xx+1,yy-4); + setmap(86,xx,yy-3); + setmap(87,xx-1,yy-2); setmap(86,xx,yy-2); setmap(87,xx+1,yy-2); + setmap(87,xx-2,yy-1); setmap(87,xx-1,yy-1); setmap(86,xx,yy-1); setmap(87,xx+1,yy-1); setmap(87,xx+2,yy-1); + setmap(86,xx,yy); + time:=getcurrenttime; + if ((getmonth(time)=0) and (getday(time)<3)) or ((getmonth(time)=11) and (getday(time)>29)) then + begin + if rnd(3)=1 then surprisechest(xx-1,yy); + if rnd(3)=1 then surprisechest(xx+1,yy); + end; + end; + + procedure genfungus1(xx,yy:integer);//красный гриб + begin + setmap(88,xx-1,yy-4); setmap(88,xx,yy-4); setmap(88,xx+1,yy-4); + setmap(88,xx-2,yy-3); setmap(88,xx-1,yy-3); setmap(88,xx,yy-3); setmap(88,xx+1,yy-3); setmap(88,xx+2,yy-3); + setmap(88,xx-2,yy-2); setmap(88,xx-1,yy-2); setmap(88,xx,yy-2); setmap(88,xx+1,yy-2); setmap(88,xx+2,yy-2); + setmap(89,xx,yy-1); + setmap(89,xx,yy); + end; + + procedure genfungus2(xx,yy:integer);//коричневый гриб + begin + setmap(90,xx-2,yy-4); setmap(90,xx-1,yy-4); setmap(90,xx,yy-4); setmap(90,xx+1,yy-4); setmap(90,xx+2,yy-4); + setmap(91,xx,yy-3); + setmap(91,xx,yy-2); + setmap(91,xx,yy-1); + setmap(91,xx,yy); + end; + + procedure gencactus(xx,yy:integer); + begin + setmap(30,xx,yy); + setmap(30,xx,yy-1); + setmap(30,xx,yy-2); + end; + + procedure gencane(xx,yy:integer); + begin + setmap(65,xx,yy); + setmap(65,xx,yy-1); + setmap(65,xx,yy-2); + end; + + procedure treasurechest(x,y:integer); + var + ix,l,id:integer; + begin + id:=chest.create(x, y); + debug('Treasure Chest'); + setmap(28,x,y); + for ix:=1 to rnd(8) do + begin + l:=rnd(26); + if rnd(22)=rnd(22) then + begin + chest.setItem(161 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(11)=rnd(11) then + begin + chest.setItem(164 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(11)=rnd(11) then + begin + chest.setItem(183 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(11)=rnd(11) then + begin + chest.setItem(167 ,l, id); + chest.setSum(rnd(4)+1, l, id); + end; else + if rnd(11)=rnd(11) then + begin + chest.setItem(171 ,l, id); + chest.setSum(1, l, id); + end; else + if rnd(4)=rnd(4) then + begin + chest.setItem(220 ,l, id); + chest.setSum(rnd(8)+8, l, id); + end; + end; + end; + + procedure genteasures(xx,yy:integer); + var + ix,iy:integer; + begin + for ix:=0 to 6 do + for iy:=0 to 6 do + begin + setmap(0,xx+ix,yy+iy); + end; + for ix:=0 to 6 do + begin + setmap(12,xx+ix,yy); + setmap(12,xx+ix,yy+6); + setmap(12,xx,yy+ix); + setmap(12,xx+6,yy+ix); + end; + + setmap(76,xx+3,yy+5); + setmapinfo(1,xx+3,yy+5); + + if rnd(2)=1 then + treasurechest(xx+1,yy+5); + + if rnd(2)=1 then + treasurechest(xx+5,yy+5); + end; + + procedure genrude(t,r,xx,yy,xxx,yyy:integer); + var + ix,iy:integer; + begin + for ix:=0 to xxx do + for iy:=0 to yyy do + begin + if getmap(xx+ix,yy+iy)=3 then if rnd(r+1)-1=0 then setmap(t,xx+ix,yy+iy); + end; + end; + + procedure genallrudes; + var + ix,iy,iu,iv:integer; + begin + //алмазы + for ix:=0 to 255 do + for iy:=111 to 127 do + if (rnd_pr(1,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(10,19,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //золото + for ix:=0 to 255 do + for iy:=95 to 127 do + if (rnd_pr(3,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(20,16,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //лазурит + for ix:=0 to 255 do + for iy:=107 to 127 do + if (rnd_pr(2,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(40,54,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //редстоун + for ix:=0 to 255 do + for iy:=107 to 127 do + if (rnd_pr(2,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(40,20,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //железо + for ix:=0 to 255 do + for iy:=63 to 127 do + if (rnd_pr(4,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(40,17,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //уголь + for ix:=0 to 255 do + for iy:=0 to 127 do + if (rnd_pr(6,1,0)=1) then + begin + for iu:=0 to 2 do + for iv:=0 to 2 do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(50,18,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //гравий + for ix:=0 to 255 do + for iy:=63 to 126 do + if (rnd_pr(2,1,0)=1) then + begin + for iu:=0 to rnd(5) do + for iv:=0 to rnd(5) do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(90,8,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + + //земля на камне + for ix:=0 to 255 do + for iy:=63 to 127 do + if (rnd_pr(1,1,0)=1) then + begin + for iu:=0 to rnd(5) do + for iv:=0 to rnd(5) do + if (ix+iu<255) and (iy+iv<126) then + if getmap(ix+iu,iy+iv)=3 then setmap(rnd_pr(90,1,getmap(ix+iu,iy+iv)),ix+iu,iy+iv); + ix:=ix+3; + end; + end; + + procedure dec_0(ix,iy:integer); + var + t:integer; + begin + t:=rnd(30); + if t=0 then setmap(22,ix,iy); else + if t=1 then setmap(23,ix,iy); else + if t=2 then setmap(24,ix,iy); else + if t=3 then setmap(25,ix,iy); else + if (t>3) and (t<8) then setmap(57,ix,iy); else + if t=8 then genwood1(ix,iy); else + if t=9 then genwood2(ix,iy); else + if t=10 then setmap(66,ix,iy); else + if t=11 then setmap(73,ix,iy); else + if t>11 then begin if (getmap(ix-1,iy+1)=50) or (getmap(ix+1,iy+1)=50) then gencane(ix,iy); end; else + exit; + end; + + procedure dec_1(ix,iy:integer); + var + t:integer; + begin + t:=rnd(25); + if t=0 then setmap(58,ix,iy); else + if t=1 then gencactus(ix,iy); else + if t>2 then begin if (getmap(ix-1,iy+1)=50) or (getmap(ix+1,iy+1)=50) then gencane(ix,iy); end; else + exit; + end; + + procedure dec_2(ix,iy:integer); + var + t:integer; + begin + t:=rnd(30); + if t=0 then setmap(22,ix,iy); else + if t=1 then setmap(23,ix,iy); else + if t=2 then genwood1(ix,iy); else + if t=3 then genwood2(ix,iy); else + if t=4 then genwood3(ix,iy); else + if t=5 then setmap(66,ix,iy); else + exit; + end; + + procedure dec_3(ix,iy:integer); + var + t:integer; + begin + t:=rnd(20); + if t=1 then setmap(24,ix,iy); else + if t=2 then setmap(25,ix,iy); else + if t=3 then genfungus1(ix,iy); else + if t=4 then genfungus2(ix,iy); else + exit; + end; + + procedure decorator; + var + ix,iy,t:integer; + begin + for ix:=0 to 255 do + for iy:=0 to 127 do + if getmap(ix,iy)<>0 then + begin + if (getBiomMap(ix)=0) then + begin + iy:=iy-1; + if (getmap(ix,iy+1)=2) and (getmap(ix,iy)=0) then dec_0(ix,iy); + break; + end; else + if (getBiomMap(ix)=1) then + begin + iy:=iy-1; + if (getmap(ix,iy+1)=7) and (getmap(ix,iy)=0) then dec_1(ix,iy); + break; + end; else + if (getBiomMap(ix)=2) then + begin + iy:=iy-1; + if (getmap(ix,iy+1)=48) and (getmap(ix,iy)=0) then dec_2(ix,iy); + break; + end; else + if (getBiomMap(ix)=3) then + begin + iy:=iy-1; + if (getmap(ix,iy+1)=74) and (getmap(ix,iy)=0) then dec_3(ix,iy); + break; + end; else + break; + end; + end; + + procedure genwater; + var + ix,iy,i:integer; + g:boolean; + begin + for ix:=0 to 255 do + for iy:=0 to 127 do + begin + if rnd(5)=rnd(6) then g:=not g; + if iy>63 then + if (getmap(ix,iy)=2) or (getmap(ix,iy)=48) or (getmap(ix,iy)=74) then + begin + if g then + for i:=0 to rnd(4) do setmap(64,ix,iy+i); + else setmap(1,ix,iy); + break; + end; else + if (getmap(ix,iy)=7) then + begin + if g then + for i:=0 to rnd(4) do setmap(64,ix,iy+i); + break; + end; + if getmap(ix,iy)<>0 then break; + if iy>=63 then if getmap(ix,iy)=0 then setmap(50,ix,iy); + end; + end; + + procedure minechest(x,y:integer); + var + ix,l,id:integer; + begin + id:=chest.create(x,y); + setmap(28,x,y); + for ix:=1 to rnd(6)+4 do + begin + l:=rnd(26); + if rnd(75)=rnd(75) then + begin + chest.setItem(133 ,l, id); + chest.setSum(getItemMax(133), l, id); + end; else + if rnd(25)=rnd(25) then + begin + chest.setItem(162 ,l, id); + chest.setSum(rnd(2)+1, l, id); + end; else + if rnd(15)=rnd(15) then + begin + chest.setItem(165 ,l, id); + chest.setSum(rnd(3)+1, l, id); + end; else + if rnd(15)=rnd(15) then + begin + chest.setItem(166 ,l, id); + chest.setSum(rnd(6)+4, l, id); + end; else + if rnd(15)=rnd(15) then + begin + chest.setItem(161 ,l, id); + chest.setSum(rnd(6)+4, l, id); + end; else + if rnd(15)=rnd(15) then + begin + chest.setItem(160 ,l, id); + chest.setSum(rnd(6)+3, l, id); + end; else + if rnd(15)=rnd(15) then + begin + chest.setItem(164 ,l, id); + chest.setSum(rnd(5)+1, l, id); + end; else + if rnd(4)=rnd(4) then + begin + chest.setItem(220 ,l, id); + chest.setSum(rnd(8)+8, l, id); + end; + end; + end; + + procedure minestruc0(x,y:integer); + var + ix,iy:integer; + begin + for ix:=0 to 3 do + for iy:=0 to 2 do + setmap(0,x+ix,y+iy); + + if rnd(8)=0 then setmap(26,x+1,y+1); + + for ix:=0 to 3 do + if getmap(x+ix,y+3)=0 then setmap(4,x+ix,y+3); + end; + + procedure minestruc1(x,y:integer); + var + ix,iy:integer; + begin + for ix:=0 to 2 do + for iy:=0 to 2 do + setmap(0,x+ix,y+iy); + + if rnd(8)=0 then setmap(59,x,y); + if rnd(8)=0 then setmap(59,x+2,y); + setmap(4,x+1,y); + setmap(93,x+1,y+1); + setmap(93,x+1,y+2); + for ix:=0 to 2 do + if getmap(x+ix,y+3)=0 then setmap(4,x+ix,y+3); + end; + + procedure minestruc2(x,y:integer); + var + ix,iy:integer; + begin + for ix:=0 to 2 do + for iy:=0 to 2 do + setmap(0,x+ix,y+iy); + + if rnd(8)=0 then setmap(59,x+1,y); + + for iy:=0 to 2 do + begin + setmap(94,x,y+iy); + setmap(94,x+2,y+iy); + end; + for ix:=0 to 2 do + if getmap(x+ix,y+3)=0 then setmap(4,x+ix,y+3); + end; + + procedure minestruc3(x,y:integer); + var + ix,iy,id,l:integer; + begin + for ix:=0 to 2 do + for iy:=0 to 2 do + setmap(0,x+ix,y+iy); + + minechest(x+1,y+2); + + for ix:=0 to 2 do + if getmap(x+ix,y+3)=0 then setmap(4,x+ix,y+3); + end; + + procedure genmines(x,y:integer); + var + mask:array[0..15,0..15] of integer; + ix,iy,by:integer; + begin + for iy:=0 to 15 do + for ix:=0 to 15 do + mask[ix,iy]:=-1; + + for iy:=rnd(8)+8 downto rnd(8) do + for ix:=rnd(8) to rnd(8)+8 do + begin + if ix-1>=0 then + begin + if mask[ix-1,iy]=-1 then mask[ix,iy]:=rnd(3); else + if mask[ix-1,iy]=0 then if rnd(16)=5 then mask[ix,iy]:=2; else mask[ix,iy]:=1; else + if mask[ix-1,iy]=1 then mask[ix,iy]:=0; else + if mask[ix-1,iy]=2 then mask[ix,iy]:=rnd(3); else + if mask[ix-1,iy]=3 then mask[ix,iy]:=rnd(3); + end; + + if mask[ix,iy]=0 then + begin + if rnd(16)=0 then mask[ix,iy]:=3; + end; + end; + + for iy:=15 downto 0 do + for ix:=0 to 15 do + begin + if rnd(16)=0 then by:=rnd_min;; + if mask[ix,iy]=0 then minestruc0(x+(3*ix),y+(4*iy+by)); else + if mask[ix,iy]=1 then minestruc1(x+(3*ix),y+(4*iy+by)); else + if mask[ix,iy]=2 then minestruc2(x+(3*ix),y+(4*iy+by)); else + if mask[ix,iy]=3 then minestruc3(x+(3*ix),y+(4*iy+by)); + end; + end; + + function get_up(Xi:integer):integer; + var + iy:integer; + begin + for iy:=127 downto 0 do + if getmap(xi,iy)=0 then begin get_up:=iy; break; end; + end; + + function get_down(Xi:integer):integer; + var + iy:integer; + begin + for iy:=2 to 127 do + if getmap(xi,iy)=0 then begin get_down:=iy; break; end; + end; + + procedure gensoulsand(gx,gy:integer;); + var + ix2,iy2:integer; + begin + for ix2:=gx-2-rnd(3) to gx+2+rnd(3) do + for iy2:=gy-1-rnd(2) to gy+1+rnd(2) do + setmap(rnd_pr(80,113,getmap(ix2,iy2)),ix2,iy2); + end; + + procedure genglowstone(gx,gy:integer;); + var + ix2,iy2:integer; + begin + for ix2:=gx-1-rnd(2) to gx+1+rnd(2) do + for iy2:=gy-1-rnd(2) to gy+rnd(2) do + setmap(rnd_pr(85,111,getmap(ix2,iy2)),ix2,iy2); + end; + + procedure gennether; + var + ix,iy,h,wtd,ty,ga,tmp:integer; + begin + for ix:=0 to 255 do + for iy:=1 to 126 do + begin + if (getmap(ix,iy)<>10) or (getmap(ix,iy)<>110) then + setmap(109,ix,iy); + end; + h:=63; + ty:=4; + for ix:=0 to 255 do + begin + wtd:=rnd(100); + if (wtd>0) and (wtd<30) then h:=h+1; + if (wtd>29) and (wtd<60) then h:=h-1; + if wtd=0 then h:=h+(2+rnd(3)); + if wtd=99 then h:=h-(2+rnd(3)); + if h<30 then h:=31; + if h>70 then h:=69; + setBiomMap(ty, ix); + setBackMap(0, ix); + for iy:=h-10-(1-rnd(3)) to h+rnd(2) do + begin + setmap(0,ix,iy); + end; + end; + + for ix:=0 to 255 do + for iy:=65 to 127 do + begin + if getmap(ix,iy)=0 then setmap(51,ix,iy); + end; + + for ix:=1 to rnd(3)+3 do begin iy:=rnd(256); debug('SoulSand'); gensoulsand(iy,get_up(iy)); end; + for ix:=1 to rnd(4)+7 do begin iy:=rnd(256); debug('GlowStone - '+iy); genglowstone(iy,get_down(iy)); end; + + for ix:=0 to 255 do + begin + setmap(6,ix,127); + setmap(6,ix,0); + end; + player.setX(get_spawn_x*16+4); + player.setY((get_up(get_spawn_x)-1)*16); + setmap(109,get_spawn_x,get_up(get_spawn_x)+1); + setmap(0,get_spawn_x,get_up(get_spawn_x)); + setmap(0,get_spawn_x,get_up(get_spawn_x)-1); + genportal_big(get_spawn_x-2,(get_up(get_spawn_x)-1)-2); + end; + + procedure genworld; + var + ix,iy,h,wtd,ty,ga,tmp:integer; + begin + pl_world:=0; + for ix:=0 to 255 do + for iy:=0 to 127 do + setmap(0,ix,iy); + h:=63; + ty:=rnd(4); + for ix:=0 to 255 do + begin + wtd:=rnd(100); + if (wtd>0) and (wtd<30) then h:=h+1; + if (wtd>29) and (wtd<60) then h:=h-1; + if wtd=0 then h:=h+(2+rnd(3)); + if wtd=99 then h:=h-(2+rnd(3)); + if h<0 then h:=0; + if h>80 then h:=80; + if wtd=rnd(100) then begin ty:=rnd(4); debug('Biome:'+ty); end; + setBiomMap(ty, ix); + setBackMap(h, ix); + if getBackMap(ix)>63 then + setBackMap(63, ix); + for iy:=h to 127 do + begin + if ty=0 then + begin + if iy=h then setmap(2,ix,iy); + if (iy>h) and (iyh+3 then setmap(3,ix,iy); + end; else + if ty=1 then + begin + if (iy>=h) and (iy<=h+1) then setmap(7,ix,iy); + if iy=h+2 then setmap(rnd_pr(50,56,7),ix,iy); + if iy=h+3 then setmap(56,ix,iy); + if iy>h+3 then setmap(3,ix,iy); + end; else + if ty=2 then + begin + if iy=h then setmap(48,ix,iy); + if (iy>h) and (iyh+3 then setmap(3,ix,iy); + end; else + if ty=3 then + begin + if iy=h then setmap(74,ix,iy); + if (iy>h) and (iyh+3 then setmap(3,ix,iy); + end; + end; + end; + + genallrudes; + + for ix:=1 to rnd(4)+1 do begin debug('Cave'); gencave(rnd(256),64-rnd(10)); end; + + for ix:=1 to rnd(3) do begin debug('Mine'); genmines(rnd(256),rnd(64)+64); end; + + for ix:=1 to rnd(4) do begin debug('Treasure'); genteasures(rnd(256),rnd(64)+64); end; + + genwater; + + for ix:=0 to 255 do + for iy:=117 to 127 do + begin + if getmap(ix,iy)=0 then setmap(51,ix,iy); + end; + + decorator; + + for ix:=0 to 255 do + begin + if getBiomMap(ix)=2 then + for iy:=0 to 127 do + if getmap(ix,iy)<>0 then + begin + if getmap(ix,iy)=50 then setmap(62,ix,iy); else + if (getmap(ix,iy)<>22) and (getmap(ix,iy)<>23) then setmap(63,ix,iy-1); + break; + end; + end; + + for ix:=0 to 255 do setmap(6,ix,127); + + if bon_chest then create_bonus_chest(get_spawn_x,get_spawn_y+1); + + //drawmap; + delay(200); + debug('World Generated!'); + end; + +initialization + +end. -- 2.29.2