From 224ba8f6be9cf8d97d3433fe368e31c318de4a54 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Wed, 10 Feb 2016 21:27:50 +0900 Subject: [PATCH] ground hit detection and adjust player position accordingly (it's working at least) Former-commit-id: be639eeeac82b35aae145540ede5e0b1f3b02d01 Former-commit-id: 4d214a5160cd80955909da238c3991ede5488ca6 --- .../com/Torvald/ColourUtil/Col12.class | Bin 993 -> 0 bytes .../com/Torvald/ColourUtil/Col256.class | Bin 0 -> 1364 bytes .../com/Torvald/ColourUtil/Col4096.class | Bin 0 -> 1108 bytes .../com/Torvald/ImageFont/GameFontBase.class | Bin 5935 -> 7654 bytes .../com/Torvald/ImageFont/GameFontWhite.class | Bin 1145 -> 1316 bytes .../{HighQualityRandom.class => HQRNG.class} | Bin 1038 -> 1002 bytes .../Terrarum/Actors/ActorWithBody.class | Bin 9414 -> 13006 bytes .../Actors/CreatureBuildFactory.class | Bin 5171 -> 5159 bytes .../Torvald/Terrarum/Actors/PBFSigrid.class | Bin 2328 -> 2328 bytes .../com/Torvald/Terrarum/Actors/Player.class | Bin 7597 -> 8747 bytes .../Terrarum/Actors/PlayerBuildFactory.class | Bin 1041 -> 1041 bytes .../Terrarum/ConsoleCommand/CatStdout.class | Bin 0 -> 2046 bytes .../Terrarum/ConsoleCommand/CommandDict.class | Bin 2010 -> 2095 bytes .../Terrarum/ConsoleCommand/ExportMap.class | Bin 5580 -> 5584 bytes .../com/Torvald/Terrarum/Game.class | Bin 11656 -> 11999 bytes .../com/Torvald/Terrarum/MISC_FEATURES | 4 + .../Terrarum/MapDrawer/MapCamera.class | Bin 9167 -> 9451 bytes .../Terrarum/MapDrawer/MapDrawer.class | Bin 2041 -> 2003 bytes .../MapGenerator/FloatingIslandsPreset.class | Bin 1958 -> 1898 bytes .../Terrarum/MapGenerator/MapGenerator.class | Bin 14549 -> 14513 bytes .../Terrarum/MapGenerator/SimplexNoise.class | Bin 1763 -> 1739 bytes .../MapGenerator/SimplexNoise_octave.class | Bin 12067 -> 12043 bytes .../com/Torvald/Terrarum/Terrarum.class | Bin 4324 -> 4851 bytes .../UserInterface/ConsoleWindow.class | Bin 5134 -> 5134 bytes .../spriteAnimation/SpriteAnimation.class | Bin 5022 -> 5046 bytes .../com/jme3/math/FastMath.class | Bin 10719 -> 10243 bytes res/books/hangul_test.txt | 66 +++ res/books/isl_test.txt | 38 ++ res/books/kana_test.txt | 29 ++ res/books/polyglot_test.txt | 31 ++ res/books/runic_short_2.txt | 24 +- res/graphics/colourkey12.png | Bin 0 -> 305 bytes res/graphics/fonts/cjkpunct.png | Bin 0 -> 20433 bytes res/graphics/fonts/kana.png | Bin 0 -> 23425 bytes res/graphics/terrain/terrainplusplus.png | Bin 79762 -> 45718 bytes src/com/Torvald/ColourUtil/Col12.java | 48 -- src/com/Torvald/ColourUtil/Col256.java | 73 +++ src/com/Torvald/ColourUtil/Col4096.java | 79 ++++ src/com/Torvald/ImageFont/GameFontBase.java | 80 +++- src/com/Torvald/ImageFont/GameFontBlack.java | 2 +- src/com/Torvald/ImageFont/GameFontWhite.java | 12 +- .../{HighQualityRandom.java => HQRNG.java} | 6 +- .../Terrarum/Actors/ActorWithBody.java | 444 ++++++++++++++---- .../Terrarum/Actors/CreatureBuildFactory.java | 4 +- .../Torvald/Terrarum/Actors/PBFSigrid.java | 2 +- src/com/Torvald/Terrarum/Actors/Player.java | 259 ++++++---- .../Terrarum/Actors/PlayerBuildFactory.java | 5 - .../Terrarum/ConsoleCommand/CatStdout.java | 34 ++ .../Terrarum/ConsoleCommand/CommandDict.java | 1 + .../Terrarum/ConsoleCommand/ExportMap.java | 54 +-- src/com/Torvald/Terrarum/Game.java | 55 ++- src/com/Torvald/Terrarum/MISC_FEATURES | 4 + .../Torvald/Terrarum/MapDrawer/MapCamera.java | 34 +- .../Torvald/Terrarum/MapDrawer/MapDrawer.java | 2 - .../MapGenerator/FloatingIslandsPreset.java | 8 +- .../Terrarum/MapGenerator/MapGenerator.java | 6 +- .../Terrarum/MapGenerator/SimplexNoise.java | 4 +- .../MapGenerator/SimplexNoise_octave.java | 4 +- src/com/Torvald/Terrarum/Terrarum.java | 14 +- .../Terrarum/UserInterface/ConsoleWindow.java | 2 +- .../spriteAnimation/SpriteAnimation.java | 9 +- src/com/jme3/math/FastMath.java | 26 - src/shader/Shader.java | 182 +++---- 63 files changed, 1163 insertions(+), 482 deletions(-) delete mode 100644 out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col12.class create mode 100644 out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col256.class create mode 100644 out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col4096.class rename out/production/Terrarum_renewed/com/Torvald/Rand/{HighQualityRandom.class => HQRNG.class} (66%) create mode 100644 out/production/Terrarum_renewed/com/Torvald/Terrarum/ConsoleCommand/CatStdout.class create mode 100644 out/production/Terrarum_renewed/com/Torvald/Terrarum/MISC_FEATURES create mode 100644 res/books/hangul_test.txt create mode 100644 res/books/isl_test.txt create mode 100644 res/books/kana_test.txt create mode 100644 res/books/polyglot_test.txt create mode 100644 res/graphics/colourkey12.png create mode 100644 res/graphics/fonts/cjkpunct.png create mode 100644 res/graphics/fonts/kana.png delete mode 100644 src/com/Torvald/ColourUtil/Col12.java create mode 100644 src/com/Torvald/ColourUtil/Col256.java create mode 100644 src/com/Torvald/ColourUtil/Col4096.java rename src/com/Torvald/Rand/{HighQualityRandom.java => HQRNG.java} (94%) create mode 100644 src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.java create mode 100644 src/com/Torvald/Terrarum/MISC_FEATURES diff --git a/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col12.class b/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col12.class deleted file mode 100644 index 3dd25f212f6b79b2839048e9993a0a224e0b9af1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 993 zcmaJcG$;!vKW^;V&4s z?)(FiNJzx!-e2P{P|uyIveL!9_k7>|9_QTee*gLTD}W^|L=nM61Yu07m9plB}UejYRJWaW zxnmr+wBt_sz%un+FU^s$CYQt2=4uM`H(X8MeXi~Idd6IP{lqoa97j8mviplM2qbSfyln0mI{63las=so z{pPCSI%cQ6BK@I!t;QK)g42y~+SDu65Cw_j=;uB_>lyt4p0VN;L^1R35`hbv0VKE& zFc?Te!61`UM8Iu7oSqadCh}&8#RP64-79*@|I^32jm%);*9WMX_vpVya66@3q3;`= zI7^04pJWE{<4iqW%_I|N%gQxE+gY`nJs(rMW9Ml_?WUFUE2tk?DCp4{Wm&LEj3m;y zgK>;t7NeL))}yxMH~mX(gK?7DIOZ@+6kzmS<_)plJab2g6y}3_AQoX{hL!wxxu8!< zsD!?R>%~t9{2}dOpSOe_^-|Cy{&usZc;pHCdIAWg0RKHFISgQ$rDsTZmhI+f6|jIJ omQlhQk$hucNTnx4!BdP;1b+b@_Jm}R?+KZvBwvUilAUtD0T{ip3;+NC diff --git a/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col256.class b/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col256.class new file mode 100644 index 0000000000000000000000000000000000000000..2e224caf0644ba26439bb4122cfaf43f84a3982c GIT binary patch literal 1364 zcmaJYxd6g|(L@%SrdoF<`RY~m7HY=b{)3{<9#)Sw1ga$~81NTaSM1cVDKW_Cs&ly|Z=fQYy*YU$I_HE~3=uUh}XEL!W z0mGbL<*VDhO1p96N@cy*ZgeFY<(&O*%xb$`X;fA>Hu5N8h1dU6xy)V?D4*JL0sTbg zaOb{bhf$H7@M3jvac+Rf zBJnei2^6^&_}YMZD0q)B3$%cxIGmmZo|s73MS@Atr77rhW+=RCN>D@BUZPNvYr35J z9&@jeH0PBgsDIXt^nOX*e^!3>jyDWapQgD{o?_&i98f>5BugAzU{$>;-BpV|a zBXvzI(@NqTy*d)dJSZ9rAsCjS#uCa?r7wskxjIG>$1kB7&!_rQQXifF9HyUsX6U6u z_34_CI=rsbOXWr76||q26{|gm6zz-b#D^rhMC>Y0HGY>P#od@;rnrOijN_=e%K8$F zE=1as%*jOBl}NjSL@w65GS&NrT$1hJl&*_>0maegXx?$IlBs19AT%e`CtG_7gUuB2l=i1^fXRX$M aLE=Xm@k32T&W(sT9|uf{1&1P|KKd6L1LJi7 literal 0 HcmV?d00001 diff --git a/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col4096.class b/out/production/Terrarum_renewed/com/Torvald/ColourUtil/Col4096.class new file mode 100644 index 0000000000000000000000000000000000000000..023e541856d332c9672e59e11d9e04560d7f2348 GIT binary patch literal 1108 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 JF%J6u{{T7d<6Hm$ literal 5935 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 miDN2m#aSwZ8WqDdwH?7Uy_y^Zx(}15^Y6 diff --git a/out/production/Terrarum_renewed/com/Torvald/ImageFont/GameFontWhite.class b/out/production/Terrarum_renewed/com/Torvald/ImageFont/GameFontWhite.class index fdb2426e4e89616345d0e500a042c837b28b6ecf..76b65cc11a5dce07588189cf6cd95b79974b8907 100644 GIT binary patch delta 520 zcmX|-!A?^_6o$XKx4j+O5-+taqCzPYX#tB;R8WdS)eR(?G%@KC@J0*dLZmEM5se9J za$kX!J7Hmh3GRIY;}iG>#*Oiul9`C(Q``_~mV3y}eVw4h$S#Bj5 zPvTJSAy36Jp*m@qQoU`ds!m((sNS{AsMajAs`o7SRUc@WOE7Qn7TRIEvuJS3l~;yX zW9M~XxU$*~gX5he^YHk0$?fM_G-S3@{X9yuK;2M|mP{`CWOCl3Vx@~eP2PK~INZgQ z)9XD^oa$oD8E}`VM=zWSZ&~d@wf(KNaILxbFKiueCEjOz20_PQrS7HHNxG-jN^n3?o)(i|10zFPm(LmyC=iznzC|D1^^vbQtxTVv z^s`@xpONYE)&HFJZS>0>KWzElDVb)=Pn?o%u1=nj`z&WTT$eaQT4G9W>m^GcC34i{ xt_FiNrH^&Sct?c~R5@pk3+A~YJMx!(a8v4#l{iBbq}O4gm}pVvh~y4t^dEn&Q}+M> delta 352 zcmXAkOHKko5Qe{Q#-SZCL6A{EQ4o0z;sf!$W2qbU045|P#<Jf4Hc(VL(OU3 z&~O?VnohS2EvMTq?8Mm}_C{*Y##K3%X3@6P{al)MLL54Zn!QvRJ60M0z+rugKPvPO z9j;F?ujl4L% RHAY=!CBnKlXE8P~0RZa&D8B#z diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/ActorWithBody.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/ActorWithBody.class index 422263aa7eb9a2bdb917dc8d1238ae01928fb20a..5316f1e3ed6b84b840d3a11c646f288ef004bf95 100644 GIT binary patch literal 13006 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 ZEq#_cMKsnv{ODiHHXyRh#hAkL{tvV+)8POB literal 9414 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 diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/PBFSigrid.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/PBFSigrid.class index bf2bb238f0d37ecf0797a7eaa196019f1decee4d..46d4703b6ac8cfacd386725494a66f467ef6781a 100644 GIT binary patch delta 17 YcmbOsG(%{E9tW$SfW83dWMht}04JCPTmS$7 delta 17 YcmbOsG(%{E9tW$4fW83xWMht}04J#gT>t<8 diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/Player.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/Actors/Player.class index d7ed4b61d1ed9859f700757b7ecbd582f12198d0..01c65c373cf4e7a97ace320f1f7f26580a1fad57 100644 GIT binary patch literal 8747 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 E2cvt&f&c&j literal 7597 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 E13OGbEdT%j delta 423 zcmYL^%Su8~6o$WZH1}z%B?v(fNgxE0S!VZ}-OR3bzu!(5sBo4w^#vLPrw3@-s4NI+ z5IOA;n$#=w0@2<&Xt3A*{J5?9ASrK{Sh z#wpy2;M=+JeEADyPnW8r1e|Lzve&KHS8>oouTs_Y(O=nC2|5kDPq-s5gx+a+RMJF8 Uc*>&?{}EmW7*rF3p|WfE50sue^#A|> diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/ConsoleCommand/ExportMap.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/ConsoleCommand/ExportMap.class index c51a4a7bf654013ee107cbc6b3632f668dc991de..1db4479d596e8464a0d679e539364d940408c213 100644 GIT binary patch delta 328 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 E4V+SjxBvhE diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/MISC_FEATURES b/out/production/Terrarum_renewed/com/Torvald/Terrarum/MISC_FEATURES new file mode 100644 index 000000000..6ce71a3d1 --- /dev/null +++ b/out/production/Terrarum_renewed/com/Torvald/Terrarum/MISC_FEATURES @@ -0,0 +1,4 @@ +* Drawing + +- Players can create their own décors (hang on wall), dresses. +- Two looms (3-3-2 colour mode, 4096 colour mode) \ No newline at end of file diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapDrawer/MapCamera.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapDrawer/MapCamera.class index 681a7b13baaddf11a85bf5cbe6045657a6b8db60..0364dc54cb82e82fee46eb304caa5e2eed0d14ce 100644 GIT binary patch literal 9451 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 delta 770 zcmZXR*-leo6otRj9(sCCel4vn(juTxz*4EG2nwhL>pUwCIHRJ7;?RWa-uVLcHB5vW z(swp}`Jt}cdc$^G~aLUK! zbeuERp7l5v;B!9U0v9d1WS`46cg3QsJ{hk0%yB*71~+Z&mPPX(x82Gca4TbABX?}m zU5|Ut+G^8r?l(%22`5^hTwjV-;{_fVy4X?w9?eI)Wj{m*>LoWmQ()NRp<$e|k>Z1f z!%P|m7&I*K$ncma9*c&jJo8vGJZIVP!e(Bw?9g5R7|o>S7OT~T>gtMNg;$0=y^Z&7 z-kHzo44&j^vQU5~%Vz1J7l)m~5q8P%`@`>7oe08u$q4NbyJg$dBfaV=)|0W>+8)Jn z#PoJ*_bh37c}*A*|EL&7l<814?4!h9S&K&Xci1oN${x@~wYE@Ek)x`%^|9fuCT2}2 zf}LW&98%dve~Y!I(c?@gp#~0xEBN+&|B)4&Z26aLP-H_bvcI^dm==f65efP&>}@C( zrqrVL1#-rN^IzmNiE%{1t)b9dn}`A lnxWscY@B11H|O_+8SU9#ZjiN14jFrySeQuboskz|_7{5$RiOX? diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.class index 1bbecc634cdaf16e531add62e73e3f1d9f22e5bb..ab7e26b6b1eaf7a76b5350cb8b0ea253443cc97f 100644 GIT binary patch delta 199 zcmZ3+|B7#eEMvW_hEH;Su6{^ delta 235 zcmaFGw~T*-EMvW92s?c92c{|( E01!4(4FCWD diff --git a/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapGenerator/MapGenerator.class b/out/production/Terrarum_renewed/com/Torvald/Terrarum/MapGenerator/MapGenerator.class index 366abf65e91716403362a5617ea27306b0a37f43..51cb24843309e90526cd88ef431be0ab6131673d 100644 GIT binary patch delta 98 zcmcawxUq0U5tD?3PjY^)en@^%Sz=C#eo$gwioQo+ke~bJX-pfq#l>()X7a6Km6Fr& L#HHC%WR3~|#7iO3 delta 134 zcmdm3c(rgt5tE9FPjY^)en@^%Sz=C#eo$gwioQo?dPZPrVoqjBC5WG&ySa;L1Glmg V5eftORh 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 E2XT>??f?J) delta 677 zcmW-ee`t(x9LL{}yJzQnzwaKmGj?t}^4#b)xz=PGGj99mHnWvthKD=0Yc@AOOCsfp zk{@3`6N(}d)7D9yl+}cYC`wV3C}e;5Ln7~co^L(9-k;C+^Z9G5A zr%}^y3~a7xGq(3CP=^M045UWJZ3(4ThZO+`l){ZN(loB=2%{Xc5JDAZpqeUU>N=T%H#z)P+z{FDFD&EF~?29SK?C56T|rV)ytTSE3(s_ab0D{>wK*neCeC=vAZ{L zn+3ykYlLp)>DOI)bWgT;)`iJfnZlF&i&rgLjkq zioIW(FI(_N)i+dcP4&+k6Yr?r)3XoqsV^+Md{OlyBcIItDPK%{ruxGCSLT!A8`XEJ sA9T1wnUGn3gYt|2fE@Gd%I_kb&~)W5L6h}bvrwQZ0Zdg&Wlo#-AF8jCvj6}9 diff --git a/out/production/Terrarum_renewed/com/jme3/math/FastMath.class b/out/production/Terrarum_renewed/com/jme3/math/FastMath.class index a9d0dbbd208caa1800b4d7e7570370d6408af448..4ac4affc4bb9f59c3926a89afc2a394952013529 100644 GIT binary patch literal 10243 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 ap{GcEn9s7?Eq1%z<;MRka0#ji>mLA~#ih>x literal 10719 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 literal 0 HcmV?d00001 diff --git a/res/graphics/fonts/cjkpunct.png b/res/graphics/fonts/cjkpunct.png new file mode 100644 index 0000000000000000000000000000000000000000..fec0886e179a50d5282e303a4a5561f24642edaa GIT binary patch literal 20433 zcmeI4c{r5o`@mncpvcjpl1zh6i!qBa%)}&=QAA^jN;MmX*_s(^CGDL`M3OZ{NufPb zmR1!JMWP~E5~3tos^2@7*W~D&IluG0e!uH`UGrYonA`K*_x(K2=YHOM?&tmE{ljjh zrIO-IMF0SltVkAQ@H+wg*vXFr|HiupV!Mq74C$oz7i;=AD09-3o{(*|iNtG~w zvP(tP^xp1$icV9e{uWDeyt|`JkrcPDHep_-`;z_p)*NtLXY@hyW%AXn0d1|Vz0Z4Z zHpVvg75NuW3i?fT?%{@$o&cV_+n7+H8DdMi`!G95b}Ff63{0h=;I{kNdjQZb=kFIN zys)@W<~$dW1$bq8+N$|)e(cP$o4Xo-9R_OPs*Mw5Ldn1bJ%HJQ{XXI(TA0A_ZV-1=^` zIJB{$?oESRBdhK6y_4U)+PQGzoR8JtZyuB#1E{PlZmZl-UtccA%a^&}o$Hmd7N~Rr zJgU20^{W&T)+jy+=sw_Y)Mq+7{)F8FV~tsg6DG9kP)}r|-X0+S(0{|NIS}{-?EPL9 z&<<>hHjPTlOWgTw6NTfGPCnFFFvbkc>1x#ap1*tBw?p$wYOxpB=}z7M(fN-|JGf20 z|8??Vi#ZP?YE_%IVLoae{iYD^s|2L(vCUg~ZT!^&R$kx-8QBBM&ZRzpXy!gISrOc%-kk0X=b0>I68)7PCjqGo+x9sn#7wlBD_Wc%N)PYC`LeDFHcp3tfXFwFkG{WmSqN48&DCHG9$+w}Sw&6)e}CkRS}*h#KIM^Ac{ z%)Bz&B0gD)uS4(?sL@ek*jbMvRs>YWXoLJVjc&W1iy z)$`&hZSvZ(2ZAQI$gkg}a+|dyG}O}B+S&Y!PK(wR)hzkd3Oje9Z~qPtKVy4ECqT9P zt{;_fG1Pfk>f8@=X3vS&S^vB8>4@rb1IFU|F{h4W%%T#` zu6mpj|4jbuKEm-eR_p{HJEZ;Il*w4{Xr0F~)65H!5Q$|^qM7c@E)QgrFiYXp&e=;N zpG1~=y&K=u*tGMr??k0NN;~sO)OjG3rt7$0i-) zIyx`-vS7>9!;e%W2oX*Zff0>o9UKLYi_84aPH;HqIO*Jar>&=#IbODVo1*Y++PSh6 z4aXZPxbz~jFFC}nc-4l)oDJW0^w5+p?b*F7VGk+MftGQ9M(~_z_c4r*&SvF&C%I-_ zuVXgUwU@eEtbNAzs{0@}Ticrp&bp<#9d?Ur*z{ON`ToV4cKnOjey#>^~f-}UCqZv`G% zhwpkMmRKeJo;ml!UiY^KeriOwRPHQlD)u$wrI#^<%EVM9-A%ezmoxwI5wB>stdc8F zg@uI=bYG@cq&{ppgfENril^kfxLMT~y!+JB*n7(l;11*;tvtG=VC+$wqg|=ToQO{T zPMuEAQ?1I^HS0FB%U84P)K|w$j3LAnTsxB%lXll9hFv|Sc1p{UyEW( zbj!F_{1?g>oiFS!#TtdPR5i*M2^VeQ3%v_{SiGCfNpG-sQtqbQX{X%3y{+eZZS-Q)AG+Q# zX)u6$=*J5 z`(-&VIn6OqV@{1X7#lqH#yI3e;#9MV3Q8`T{BUlb+9&mHn*K|7-RP33kL2T~u2Jtn z70$JuUH;plJ;n0XDuLY7-PTQo*W~xrShDtIYBFa;sdaCiGJgT)tls-oSL}tGgk8Gj zsdX;B?%9VvhNK+4zNpIc8sEn~)ssbL(OP0MgEG%%Zui^!b?L`QRpDf9h1Ngn?pEA2 z`QxoXwviRBA6pmga8yW3uYY;+x>`e1Q9-<~v5SFA=oX{h$5bOPEw0}QGqXcZx2;d+ z*l0}tv@2$}?b4i+!6#Q;%*b4B9M%x$6!FFA)uOHDJsx{(mwDgUSFj~7^glc!?7CKm zjgv+B>(t^Gn_eLBM`Dk}CX$tyN3Se=j>?#qVe7VVVYpJAe*^oGdidT)U3FUBf{v=G ztlicniC4(!cFNPNk!KeAt)0HsFO!r_TJuc5+U@)MZmkJBrfta%yFEL-ceZGl?EhE!hane?w0mSr~7u3ovJY)hvl$BT(7=?z5KQCM1W`Kp~qJqKYA=@Krv`tTX-$C z>eC5a;+KH9ZLS4Q-_p)y@ z3Yke&&&q8Ge3fbGYkMy~Wb>)bm=9zr#uGhn>9hXUM$_jhqzaRPWbnlx|%RPj=S zKhcZA-y~m3o?QGW(CLSNv*27~^|#vI6~)ed73~wc4;1I7`=@m9+s>t&C**78Yu+sK zH~DzFFRiF*Yg=YpR&{>1X4Jes)9-d2B|WtK02nX!<56f{3?YolaA$H%;B7Z@;V>rM1isq924%xD zXLvA40epsiz)A;NfENuWQ%2k!-4;qz&(UQ9s!B;_4U>B)z{R191d{>_Cc0KMD_t)`M;%%q zTHA^BEK&m+!#kvWNrQb@&(tp2FtYP-sk!=vX%27&%gZ zc-IWOVpvdw3?jIzaR?L|fx$aq&;*nbLEm5@xVKR#F((6>BYfC!=}b3&F&`KN8s&h( z5YTu6#!%dcnC3_y;9W?k2q_YI5!V&-L#GkkxO_H6NMy1p?hGW4<8F)`ZWPmm_9nrc z%i{9EX)%cU#>ml{N3{aax^@FcU7~<&X$G@eYK}wWaX17<4=wISOm9>_7F?RQ=q6jj zp)mwtLWMf0H;s}HkZ~;~p{qtdh^P!>` zC=4CTKp5hwR0P&YpNgOw;S3N)RE7b~5Rb(e;SKtC)z9X`GaGb0H2R?H{-x@>ffpT* zpt#Wu5LhbK5P`?jQ3xC!g{9E(MpzUbKjd1>{7A_`&)D>H>u_xQQ$3Hu7cfML%mhA^$)Mi`P!+n2`x7F8LKFQ+5NV?Hz@Qr= ze`+0`)<`qvp982b5rP5#V&=ad!`Fks`Kt^w;HqEi*G>dnH=!?u&sgFP-ZOuj`37A6 zY%|jL=r;ujsQ=buG5qdthjq2ZiI#pc9cp%NlC=F`5uQRt(A`i}x;_?7!BJ>K>-%4aP5g&d8a7eR<8pi${C|@5z}!j!Ykvm#qwB`! zvSAb+kHw@>L>Uz6!=Vor&rnGK6LMiSkd0XViI~CR zMl_3AiB7@;CpCNU=?_D+xRFgGwe6UG43@J66FglBL^UxQ2d=8$Xk^c*mM+7VMn4&f zbqpE~+$UlWY5La$fI-+2!$kq6qh8FARQ?# z2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq z6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8F zARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?# z2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq6qh8FARQ?#2!$kq z6qh8FARQ?#2!$lVU*b|6exU<{1HQ$<7kpiVYn7Gp8A*GR`W(opD@Yy-)Ak2VuK2 z^|TwF%t$#KR=$>YU$Z7G@+=`J`Rf~1Ko-123(&QU6TJBXzHTTb{?xVCIk)M(&(^eU zm@Zz%K%d(bVLMK{P@_3G?!9_v>ebwcgWo^TF>?BlSMjdGxycw^7~{F^ zvhQ^6sSWAz-uv@t$HtP(iA~3zZRH8P_B?Q$yZk)_!vusYvNYO5Rm$$ui3o zjY|3$;f;H_xvCvcw$;*(mF~E0(6Hr{a%Y^t{Q1Qik3XtncBEl7qb{XJ_e_6l)_M1Q z!VmeV{k(!kLWMFv9s-r^TQ0DaIE+yT0Kv>y^Ex#dD{#n|Q}A>6-Bs+~ST$ zke}ElRcEN}DNsdS?NRqFWvLRkDp!)|UW(}}a}Vceq$QtIMPS2!qjG7zBGM~jMt?rsw)mspRd0|4TzUJy|&#q3}v$T+?Jdt zIj&WK6Hh6nQ0#X6t`Och`+aW@0cSAtfYBwvx4oJocqXM3xd+ zO9~+oSsF`BO8G|1YACkp|NNm zH#A1jNLN=7!AcdR+OPz);?;(*cCJxljF{YA4es z*E;cCJ3@A{@4xisx;sF{B1{ePTp-reu=!D42sNkSD6JsdoAyRmx)xIZY4ErpY^mlN zRS6nE4Z!qCi?Ba@wSKn7Y`+aa@DgBDh<%coD$WAXDs9!e3(&e7P-qqlXV8W^msQ?Y_ zNgbCD_sZ?6PU`0MUz{Hu+c(zeS*8Q!KEUR}I4+cSIaQd$aFWKjb2|XQyV`UAi?U|i zFR!Fs91_R~+ zC$DOy6g6a@{d^MYNe(3k$Z9)n-B_5Ak;_ zF6r%ilr+ZvHduB+Ao(+6fO}_jeUGu%_MTuWjI_ zhHlf-+Ah+d#-_7vJY)~kwcW|uJXQ^m=d`y@pW>Y4y&b&ew6jSWY_)m|T#;bNgS|Y}b8Lx|2IC+-c!& z5o^|Eej@wciO-=QVJzk6!wzPhH_WzzRXyN|-pBPo7O`Nf^UT|tW=6{6iixv*`Rc5( zAKfQDKhP;-OI@EoTnb$-xum~2*+IqnplozrmYW`Z5FsA^I}bDAt(Qgw+iCc1>$Mfz9CGGA_3*v%Y=V zW3Y^RpS{dIO?XD=5m1tmXHbme@dPWw<{!twraZ17t9$0py}G%x-L2+Qvs-qLQMOq1 z{&(T7uN83I8ZL$CJ9mx2Hl<+i%}2N-b*kOGSc5Rkv_Ui1mIh7UYis%Yz zrHlXZ9(Mj`s#w)PZ>;ZQKTk~UOwKF$ru^pornfe(e6H7g(w7vta}US0vtRbR%x#Iv zyO8IV8PJ|I!TYYJ_tul;?9{udLq#u8PhUP(Z#iA?$wWGp?~y~3IzjvWJkfUSj5dK`BA>YZ;$ZKem64{ZRi3zsR+4gwBcTKGg(O-5K696*L|+0<iuUaKz zVZ{?e*Y9w@dE42Z;jd<=U>6st9Cn5Ma=GTjSwS5$&~DR-JTDV|j>U7SVW#@`u18-t zFRQ9Pq!#}s-8yMS`K9V<-H&ePO%M7$kYhBpki=i&iN7PfWMZxNY`C!N#mN^ymBh5f zv}_9&WOAiszf6^Qm8pxQWCF`L{tc>)FCn~*I4->Evoy%*8D`v*U1?El#>!<3x+#gX z-))bpHmox|_Ec`f<;(P{FmotZU|n3PS#@c}^J<*k!l+Qa{#`ENC`)dCX|RJu4IGD@ z?>*h_)?S|c*=)?#;^?9~erPeq;%x7Y8@iIAHu6dNiI3X7ir*i*1LK4y!H*K$FZbD7 z2TO1#ohZZ<-You5da(M-p{lmI8N->J8LvX3U46-+I(O~9?(_33 zMSKg<6MQF7hla7&0^FBlIx0KbI%pK23Ul_4Zx;?OUQ^6o2}loiXt(}cR8V#A#r}b3 z^)LNTEwP^E=TsdgB+k~}lEm3~)ajpI_Ue5X`ZAW+nXjh)P0-6~1Ao(&jM!5*PSLOE z6K348XwRXN`ucK4l!apSUPB0GA~gg(kUDqO{}$$$1Z$)A#C@@m+`v<>&8Dt(HVrj( zjHCotEi=p*;w5__^}dC`Y*d!|wK~Go#q4x`M}C8QRqH_n@N1awLxotIjI4BV^@Y{( z(1h1{@Vt!lBbw?@Q-<(FXQvIOlW&#w$i?9np_V*8wpS~2#$$&6|b;YsjE_l7>7{tx}q4w?8m!h>19DzE)7 z_f(74EPwD@ndA0ndS^W35D<$iS-Uszd7A#?j_KgaFJ*`Z)aVDN2B)qjyB!2p#_)_U ziR(|oU-cS1Hs}*RC>$M|E+D|i!dtfp?@V}=SDwew)fQyEj-T-l^$_UUk!?b`Es z=GCaK`eJHKY$`)&DVhn+yQPNO2+8H5@Lt#j1C;*_QiNio)9tf_) zNOs`g+L4f&n2=3>+Z+n@TT36Tz8`4>---Oz(#HyqL4Yg}K4@QW7((BV)Dz*~b>0VS zf%plR0#_vU-#WtlxXApzU*zh)#fU|^{7pwTYW~&?fkXa{*+$Jbv#&ArZK~Bs)FHaw z2q+fqZG}dAYJ3aVpVu(bElk`53PXBrT+0rqfqvEh88ts$A@rbFga#?96@fBfpe)!5 ztOAjfgD9v-l44s%W|Na|n!orkA*~=d6bs$tMHUE_v67L6$SFW%z?;4NN%vPjXgJaZ zPm!0OnwxyUVGtLzHwuc?K%$_o2oT20RSopBaFgcO(1jRz`Cy@5Focnw2B|U^W8O^ zgZAqxhoz!l*@gpz`yilU1m91M5);d+z#UtF7dld^9wsOKh~ zjo$yOP5j2qUz##R`jEm5zbX7kLHKoVvqYTybLo!?PvqA<3Ip}_L2N8xb)g??n7pZx z_pA+@uUi2G3ftJ-G+-NXjex6x{#5$2TV%`cX2`!zAZ3)l`QK#z_igyQA-w+4()i}; ztJdE;@j<&_{h{6nZC6rE{L>}-&E=nMe)X*e+Bgb4k^cj;-~;vh_vQeqsHET`FY5x7 zRaQa(<>7EJ&{Fp;aAQGjoUH#mfg$A}q`L%U6Y?KPB&8eaFXn$*h~K@#|GRnQx6W-c|DAXA zzne;aYvng?ezx|5{3gJgauzl6HU-f|d!oHf&~Su?oEqqN#hZNotS0@}$?V%doiuzb z40HsI^mP@%DvF9gS!wWQH=Fc+>*q%{txdWQY$Uxtn>x7>QyVd%19km#>5mFh8uqWH z;J?e=zJ=|d+t@sUf7C;@jVmUEl+u&Z%dZE425InrDcdyguXVN?skx``*VG#Nu zi9>kW>LE#&FrSU91z3?Zs;@@B*8JAe?x&@!{GTj0)qJ=7HgTJt(tHh)Z>6MXK%~b{ zAoBC4zr+tIg#PoNpF{f3`zCwbYJ`k}5@8D$C6vfITe!$5C=s@BQ9_BVvxSR{f)Zg1 z7bTR)I$OBNC@2xOa8W{uth0rSjDiwj3l}An$U0lN$S5cgws28GiLA4Qi;RL2VG9=} zl*l?;xX36d5w>tqLW!)ig^P@W5@8D$C6vfITe!$5C=s@BQ9_BVvxSR{f)Zg17bTR) zI$OBNC@2xOa8W{uth0rSjDiwj3l}An$U0lN$S5cgws28GiLA4Qi;RL2VG9=}l*l?; zxX36d5w>tqLW!)ig^P@W5@8D$C6vfITe!$5C=s@BQ9_BVvxSR{f)Zg17bTR)I$OBN zC@2yBAugt$Z*)L-kzV8APkLWNx4d5_>0J+kFhdIy03d+$(y@@U0Kn=x>H94J;41?F zOgjMpkShQHH#+`A%RvBuHP1*-+X^=@>wtA61W3m2bc_e#%!(obyF z94HKoq9eVx0}a$+BD!D^)plRgAlBqu}eFV zIUI(ov}&8WyPbibzozqy6O(f7b$(V(6^jKov4hhk%G}y5FCvR-IZ{ITS(y{=I$pFb zoY^DB7Z!Hm7Hwp}4TJ1GMI0W{gPI08PJ&U0QO=y#2A+D{uAqQ`!%e+rTnh-@)e*~3 z!pKoq{zNTDtX;P2-3b$hnhQlywc^Yntl>Mk9t=+P%MRqaj$ETDV^OD0i=OL`T0Z_L z{-WcjtXkQ!LpPUs6|Ba)Z$wu6mXy2jSA_H%AI$K3`Rvx)i}aE67>1JIoBIo=%F7oe zL#{;m>ZsbLr;oa$oB0?e{kx7Py0$s2>f4?(qV8;%S5LJMz~Rd;M=WNkTyy2y&ms|c zo9Fn&_4I}jVO{T&i$^e)1LeHHtS|}I!+xPe41~a+9|bQgcrW0v7%8S5tQATvBCZws zVSzeOe|ux}MA;WNsz}q@Aw9`}Xr2fOw2g6-W%b=J?+$d0w%-=s3w7PDqjynHPmO+B z+Yx=?lkIYz@g>wr2Ci2h-&|V{e)?LuEwy?#4mIzv{zm9b?d?~1|HsV2gp;nut!&|# zY=5eg9_901C0b2!@`DRqFYCok14LaWmI+UH)*pR;Vx`KnNH0VP1UVWRY z60ZW9lb2$58MBPriLIOZRuTfdILfkW9hTYbVo&oW_egxmvu&)}v3ysxmFMxGy}|h; z7+u$A+X?+*_^rP5@cxELxAUCqOrRRpODno~7UWD)YPST>#5Dsay?J*)Nobe(eN+)w zL&0c4nL94bT5LIVK5nMJ$?eOHD%O@ql1d$}z3`@iM*CHJ>Y0|tL2ypVgZc*IqbqD< z=G_8uSpY_+I6>0XQm;kgPL=MY!&x?&Gpq!>Ft@3YMWZr74_o}}nqJZ!rcTTKVIZY}e0ZoC$>BdzOXnloRuM9AQ`yv@2t_6uk-C;X~dU z$-_x#Y;QpgRglOD!C1ew-EB)N)wGFu3zaywW+E`pR-jGxj$>Dclh};I;*!?;?1mCG z@oayyo-`?AjVOagp8&ljwMNx2N5}28eGPo3u04>9X8VOhyy+8Sk;wP!cH-IfnV0AT zw;hZh>EErAb4Y!A(G|C4Gux?TcJ`t> z?HJV;K+0kKdEI9A$F)8cm%>@ku$%fk)mjYBQZq6vz9tP#p}%^~QD`hYh#50|cgJJX zoHVWsD2IvE>-;!}=Q|C`VBq8@QE4%;M#35A>xFY`Cy`AvVt5xqguwzlQl~Agg?ds| z((CpP+wIqlS%(iCpG;_^y58c?^vSb_c$FjBtAHifAmjNp50(1h;GA1~cnfN$=q`kX zzsb?X_Z+Fnt{$Cz?y%cVLBzwwGFKmO{-K`mw%`=Tlr^HKrTxlc@j9-L!~4Q0)zr86`O+4<@4dVIoxOyV}G>w6yqTlRXw7t&%1ujFMA zk>=_jYj<+Z=P%J^vNxJSOcxd=qvs=Hg2K)_+7#^WNU#}0_9wMT3P=~;Tv>Kys@~VH zN7rezvM5oFJbvF~>ge#hSW(x9ooP~%h&~O|*5czFHZ$@cQSu-asV98L>$=sX>Z%UC zlOl3v*IXEjF3c6>e{g~eLo}K(!iRBooYGyn=D?Hm$Lottm1nq*g`aTPG4m3A5HxB& z+~^-@*i7S*+SgOt_rVQh>Jgh> z8^8bl8zWZ7bxGwffTO8twPIQN?+D}ScLY=}j3_HD48V8BCzT(nuZGYrT(p{bg#xjh0 z%{19Bn%H(yC&s7BzY4GzIAeZi;Fe{)x=P`M-6)=@dMHYe(b`=YxK4kyk($cyWn{nm z(a^IwOOtA6Bv9VB9XP)v@6k3o%@!xt{cusu_Z4wiP^M@If~>N`SIBg@-zlDWl@n~B z=HZE?YtC}0P*h8<=249oi@75~uY8Qq#Ty=7y;_oJlf>$Y$`06mUgc4u42t?raowgBh&bKq|Mw1S(VEI!|KEdsDp?s<9hi86Fhn&(6 z6WQ297y3{aIwj0h{eltMTr8@39JN_>Wh0h*Iu3Nb_xI*TRoIRt9rXa0VO&2p%y$UC z1#dG+DHSs-Z5=A6eScH-#Yn>W8oNaMoo_C`XiZq*QBO&ZQ(0z|=DqZ}b6c|O8~(bwVK4DWOFh{>rUZYyN3W7E1^!w?WP5)m9@7UQ$-~ct*d)=a(1^b zd7iYjdDvp-XeZtu5HWG6Goc)}W6~Kv$rKCT*PNZDDfl&K)iw(`XuBB6wo6bu@HXI+ z67w_N&@mO&(Ni&Do-#a|cOZaOefSn5giMN4#mh7IH4N88 ztJ$%|z8GeP!*}jf%1NPVnw@oSzZF4GCmyC5r1Vb3ZEDGRxxBZ#BKuem_or;aK}Wv2 zd7$nmv2?w4812oL3+@`HdD!|MpXQ5vv@B&MQYAKrUbomg+RspWfI0ld+XdkQB_>aU z?5XQgU9C*qhyd*wB3n*Y4gq?bG4yS0>r`xKkt{F9H@@CFg7wBn+>9w9UCNk~e*k$U`Dq+oxG zwOhga9_Pulh)RML%h0=hij1WIt^#A;M+t|UcnLDE?VT-;%=yWte_52rM z*jV6^nb9`1zUCp#u@xaKAD)gnuAP_72(tFr-YFSc6T^b&+$&D6*lO>XZiEgWzUc2+ zLxZHbuIW}oopW(|4Hyu=&e0VrBSy30l*;{20;1eHxY&@dk*Uh{BQi;6-9}(iv41`EX#XR{{{t>J^~)^eKhw)i oF251jC0G#hEq}~tSl-m9jDO$0$Uod5dZ)H literal 0 HcmV?d00001 diff --git a/res/graphics/terrain/terrainplusplus.png b/res/graphics/terrain/terrainplusplus.png index 15fcdffd5a4d8ff33c28689a88c21684d75b8ea0..7f7bf9dacc7081059692c3a85b216074b7d61c65 100644 GIT binary patch literal 45718 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 Ig+svq1Eq{L1poj5 literal 79762 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%0DJ#(2(g$~<`B>-{@1EAaReL$Oi2llT zJgxS~tSFcoqXnQ{=q--fDpplhq};Zq#IpTpPrtuZx*=56(E5?ss#B3{xQSX)Bq^!s z9{p)8VW*^VJj5byvnT4x;wsv;K#r*>9mmz1uzt~w`1n?ZJL(#B);tZ=)W8FUn}&DX zkzzu3xl>Nc*ME4w_PG3yMSV>3Y-AL7dnPBmUsjcH`i_*EJhN;PiKR(2M0(2~U<� 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 diff --git a/src/com/Torvald/ColourUtil/Col12.java b/src/com/Torvald/ColourUtil/Col12.java deleted file mode 100644 index caf138d1f..000000000 --- a/src/com/Torvald/ColourUtil/Col12.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.Torvald.ColourUtil; - -import org.newdawn.slick.Color; - -/** - * Created by minjaesong on 16-01-23. - */ -public class Col12 { - - private short data; - - /** - * Create new Col12 format - * @param data 0x000-0xFFF, in RGB - */ - public Col12(int data) { - this.data = (short) data; - } - - public Color create(int i) { - if (i > 0xFFF || i < 0) { - throw new IllegalArgumentException("Colour range: #000 - #FFF"); - } - int r = (i & 0xF00) >> 8; - int g = (i & 0x0F0) >> 4; - int b = i & 0x00F; - - return new Color( - (r << 4) | r - , (g << 4) | g - , (b << 4) | b - ); - } - - public byte[] toByteArray() { - byte[] ret = new byte[3]; - int r = (data & 0xF00) >> 8; - int g = (data & 0x0F0) >> 4; - int b = data & 0x00F; - - ret[0] = (byte) ((r << 4) | r); - ret[1] = (byte) ((g << 4) | g); - ret[2] = (byte) ((b << 4) | b); - - return ret; - } - -} diff --git a/src/com/Torvald/ColourUtil/Col256.java b/src/com/Torvald/ColourUtil/Col256.java new file mode 100644 index 000000000..a673ab880 --- /dev/null +++ b/src/com/Torvald/ColourUtil/Col256.java @@ -0,0 +1,73 @@ +package com.Torvald.ColourUtil; + +import org.newdawn.slick.Color; + +/** + * Created by minjaesong on 16-02-07. + * + * 3-3-2 256 colour RGB + */ +public class Col256 { + + private byte data; + + /** + * Create new Col256 format. + * @param data 0x00-0xFF + */ + public Col256(int data) { + this.data = (byte) data; + } + + public Col256(int r, int g, int b) { + if (r > 7 || g > 7 || b > 3) { + throw new IllegalArgumentException("Colour range: RG: 0-7, B:0-4"); + } + + data = (byte) (r << 5 | g << 2 | b); + } + + /** + * Create Col256 colour and convert it to Slick Color + * @param i + * @return + */ + public Color create(int i) { + if (i > 0xFF || i < 0) { + throw new IllegalArgumentException("Colour range: #00 - #FF"); + } + int r = (i & 0b11100000) >> 5; + int g = (i & 0b00011100) >> 2; + int b = i & 0b00000011; + + return create(r, g, b); + } + + /** + * Create Col256 colour and convert it to Slick Color + * @return + */ + public Color create(int r, int g, int b) { + if (r > 7 || g > 7 || b > 3) { + throw new IllegalArgumentException("Colour range: RG: 0-7, B:0-4"); + } + + int[] colIndex3 = {0, 36, 73, 109, 146, 182, 219, 255}; + int[] colIndex2 = {0, 85, 170, 255}; + + return new Color( + colIndex3[r] + , colIndex3[g] + , colIndex2[b] + ); + } + + /** + * Retrieve raw RGB value + * @return 0bRRRGGGBB + */ + public byte getByte() { + return data; + } + +} diff --git a/src/com/Torvald/ColourUtil/Col4096.java b/src/com/Torvald/ColourUtil/Col4096.java new file mode 100644 index 000000000..8ba8a4833 --- /dev/null +++ b/src/com/Torvald/ColourUtil/Col4096.java @@ -0,0 +1,79 @@ +package com.Torvald.ColourUtil; + +import org.newdawn.slick.Color; + +/** + * Created by minjaesong on 16-01-23. + * + * 12-bit RGB + */ +public class Col4096 { + + private short data; + + /** + * Create new Col4096 format. + * @param data 0xARGB + */ + public Col4096(int data) { + this.data = (short) data; + } + + /** + * Create Col4096 colour and convert it to Slick Color + * @param i + * @return + */ + public Color create(int i) { + if (i > 0xFFF) { + int a = (i & 0xF000) >> 12; + int r = (i & 0x0F00) >> 8; + int g = (i & 0x00F0) >> 4; + int b = i & 0x000F; + + return new Color( + (r << 4) | r + , (g << 4) | g + , (b << 4) | b + , (a << 4) | a + ); + } + else { + int r = (i & 0xF00) >> 8; + int g = (i & 0x0F0) >> 4; + int b = i & 0x00F; + + return new Color( + (r << 4) | r + , (g << 4) | g + , (b << 4) | b + ); + } + } + + /** + * Convert to 3 byte values, for raster imaging. + * @return byte[RR, GG, BB] e.g. 0x4B3 -> 0x44, 0xBB, 0x33 + */ + public byte[] toByteArray() { + byte[] ret = new byte[3]; + int r = (data & 0xF00) >> 8; + int g = (data & 0x0F0) >> 4; + int b = data & 0x00F; + + ret[0] = (byte) ((r << 4) | r); + ret[1] = (byte) ((g << 4) | g); + ret[2] = (byte) ((b << 4) | b); + + return ret; + } + + /** + * Retrieve raw ARGB value + * @return 0xARGB + */ + public short getShort() { + return data; + } + +} diff --git a/src/com/Torvald/ImageFont/GameFontBase.java b/src/com/Torvald/ImageFont/GameFontBase.java index 9a7754fe7..68b0da141 100644 --- a/src/com/Torvald/ImageFont/GameFontBase.java +++ b/src/com/Torvald/ImageFont/GameFontBase.java @@ -15,6 +15,8 @@ public class GameFontBase implements Font { static SpriteSheet runicSheet; static SpriteSheet extASheet; static SpriteSheet extASheetEF; + static SpriteSheet kanaSheet; + static SpriteSheet cjkPunct; static final int JUNG_COUNT = 21; static final int JONG_COUNT = 28; @@ -24,7 +26,8 @@ public class GameFontBase implements Font { static final int W_LATIN_WIDE = 9; // width of regular letters, including m static final int W_LATIN_NARROW = 5; // width of letter f, t, i, l static final int H = 20; - static final int H_CJK = 16; + static final int H_HANGUL = 16; + static final int H_KANA = 20; static final int SHEET_ASCII_EM = 0; static final int SHEET_ASCII_EF = 1; @@ -32,6 +35,8 @@ public class GameFontBase implements Font { static final int SHEET_RUNIC = 3; static final int SHEET_EXTA_EM = 4; static final int SHEET_EXTA_EF = 5; + static final int SHEET_KANA = 6; + static final int SHEET_CJK_PUNCT = 7; static SpriteSheet[] sheetKey; static final Character[] asciiEFList = { @@ -47,12 +52,20 @@ public class GameFontBase implements Font { * Runic letters list used for game. The set is * Younger Futhark + Medieval rune 'e' + Punct + Runic Almanac * + * BEWARE OF SIMILAR-LOOKING RUNES, especially: + * + * * Algiz ᛉ instead of Maðr ᛘ + * + * * Short-Twig Hagall ᚽ instead of Runic Letter E ᛂ + * + * * Runic Letter OE ᚯ instead of Óss ᚬ + * * Examples: * ᛭ᛋᛁᚴᚱᛁᚦᛦ᛭ * ᛭ᛂᛚᛋᛅ᛭ᛏᚱᚢᛏᚾᛁᚾᚴᚢᚾᛅ᛬ᛅᚱᚾᛅᛏᛅᛚᛋ */ static final Character[] runicList = { - 'ᚠ','ᚢ','ᚦ','ᚯ','ᚱ','ᚴ','ᚼ','ᚾ','ᛁ','ᛅ','ᛋ','ᛏ','ᛒ','ᛘ','ᛚ','ᛦ' + 'ᚠ','ᚢ','ᚦ','ᚬ','ᚱ','ᚴ','ᚼ','ᚾ','ᛁ','ᛅ','ᛋ','ᛏ','ᛒ','ᛘ','ᛚ','ᛦ' ,'ᛂ','᛬','᛫','᛭','ᛮ','ᛯ','ᛰ' }; @@ -90,6 +103,14 @@ public class GameFontBase implements Font { return (c >= 0x100 && c < 0x180); } + private boolean isKana(char c) { + return (c >= 0x3040 && c < 0x3100); + } + + private boolean isCJKPunct(char c) { + return (c >= 0x3000 && c < 0x3040); + } + private int asciiEFindexX(char c) { return (Arrays.asList(asciiEFList).indexOf(c) % 16); } @@ -114,6 +135,22 @@ public class GameFontBase implements Font { return (Arrays.asList(runicList).indexOf(c) / 16); } + private int kanaIndexX(char c) { + return (c - 0x3040) % 16; + } + + private int kanaIndexY(char c) { + return (c - 0x3040) / 16; + } + + private int cjkPunctIndexX(char c) { + return (c - 0x3000) % 16; + } + + private int cjkPunctIndexY(char c) { + return (c - 0x3000) / 16; + } + @Override public int getWidth(String s) { int len = 0; @@ -122,7 +159,7 @@ public class GameFontBase implements Font { switch (getSheetType(c)) { case SHEET_ASCII_EF: len += W_LATIN_NARROW; break; - case SHEET_HANGUL: + case SHEET_HANGUL: case SHEET_KANA: case SHEET_CJK_PUNCT: len += W_CJK_DRAW; break; default: len += W_LATIN_WIDE; @@ -159,7 +196,7 @@ public class GameFontBase implements Font { Math.round(x + getWidth(s.substring(0, i)) ) - , Math.round((H - H_CJK) + y) + , Math.round((H - H_HANGUL) / 2 + y + 1) , hanPos[0] , hanPos[1] ); @@ -200,20 +237,37 @@ public class GameFontBase implements Font { sheetX = (ch - 0x100) % 16; sheetY = (ch - 0x100) / 16; break; + case SHEET_KANA: + sheetX = kanaIndexX(ch); + sheetY = kanaIndexY(ch); + break; + case SHEET_CJK_PUNCT: + sheetX = cjkPunctIndexX(ch); + sheetY = cjkPunctIndexY(ch); + break; default: sheetX = ch % 16; sheetY = ch / 16; break; } - sheetKey[prevInstance].renderInUse( - Math.round(x - + getWidth(s.substring(0, i)) - ) - , Math.round(y) - , sheetX - , sheetY - ); + try { + sheetKey[prevInstance].renderInUse( + Math.round(x + + getWidth(s.substring(0, i)) + ) + , Math.round(y) + , sheetX + , sheetY + ); + } + catch (ArrayIndexOutOfBoundsException e) { + System.out.println("char: '" + ch + "' (" + String.valueOf((int) ch) + ")"); + System.out.println("sheet: " + prevInstance); + System.out.println("sheetX: " + sheetX); + System.out.println("sheetY: " + sheetY); + e.printStackTrace(); + } } @@ -229,6 +283,8 @@ public class GameFontBase implements Font { else if (isRunic(c)) return SHEET_RUNIC; else if (isExtA(c)) return SHEET_EXTA_EM; else if (isExtAEF(c)) return SHEET_EXTA_EF; + else if (isKana(c)) return SHEET_KANA; + else if (isCJKPunct(c)) return SHEET_CJK_PUNCT; else return SHEET_ASCII_EM; } diff --git a/src/com/Torvald/ImageFont/GameFontBlack.java b/src/com/Torvald/ImageFont/GameFontBlack.java index f1b2e847f..c63a83cfb 100644 --- a/src/com/Torvald/ImageFont/GameFontBlack.java +++ b/src/com/Torvald/ImageFont/GameFontBlack.java @@ -13,7 +13,7 @@ public class GameFontBlack extends GameFontBase { hangulSheet = new SpriteSheet( "./res/graphics/fonts/han_atlas_black.png" - , W_CJK, H_CJK + , W_CJK, H_HANGUL ); asciiSheet = new SpriteSheet( "./res/graphics/fonts/ascii_majuscule_black.png" diff --git a/src/com/Torvald/ImageFont/GameFontWhite.java b/src/com/Torvald/ImageFont/GameFontWhite.java index 8cefa51d5..b10b4396b 100644 --- a/src/com/Torvald/ImageFont/GameFontWhite.java +++ b/src/com/Torvald/ImageFont/GameFontWhite.java @@ -12,7 +12,7 @@ public class GameFontWhite extends GameFontBase { hangulSheet = new SpriteSheet( "./res/graphics/fonts/han_atlas.png" - , W_CJK, H_CJK + , W_CJK, H_HANGUL ); asciiSheet = new SpriteSheet( "./res/graphics/fonts/ascii_majuscule.png" @@ -34,6 +34,14 @@ public class GameFontWhite extends GameFontBase { "./res/graphics/fonts/LatinExtA_ef.png" , W_LATIN_NARROW, H ); + kanaSheet = new SpriteSheet( + "./res/graphics/fonts/kana.png" + , W_CJK, H_KANA + ); + cjkPunct = new SpriteSheet( + "./res/graphics/fonts/cjkpunct.png" + , W_CJK, H_KANA + ); SpriteSheet[] shk = { asciiSheet @@ -42,6 +50,8 @@ public class GameFontWhite extends GameFontBase { , runicSheet , extASheet , extASheetEF + , kanaSheet + , cjkPunct }; sheetKey = shk; } diff --git a/src/com/Torvald/Rand/HighQualityRandom.java b/src/com/Torvald/Rand/HQRNG.java similarity index 94% rename from src/com/Torvald/Rand/HighQualityRandom.java rename to src/com/Torvald/Rand/HQRNG.java index 43c392b0d..594bc7d8f 100644 --- a/src/com/Torvald/Rand/HighQualityRandom.java +++ b/src/com/Torvald/Rand/HQRNG.java @@ -13,17 +13,17 @@ import java.util.Random; * @author Numerical Recipes */ -public class HighQualityRandom extends Random { +public class HQRNG extends Random { //private Lock l = new ReentrantLock(); private long u; private long v = 4101842887655102017L; private long w = 1; - public HighQualityRandom() { + public HQRNG() { this(System.nanoTime()); } - public HighQualityRandom(long seed) { + public HQRNG(long seed) { //l.lock(); u = seed ^ v; nextLong(); diff --git a/src/com/Torvald/Terrarum/Actors/ActorWithBody.java b/src/com/Torvald/Terrarum/Actors/ActorWithBody.java index 070b11bc6..c043eee0c 100644 --- a/src/com/Torvald/Terrarum/Actors/ActorWithBody.java +++ b/src/com/Torvald/Terrarum/Actors/ActorWithBody.java @@ -1,6 +1,6 @@ package com.Torvald.Terrarum.Actors; -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; import com.Torvald.Terrarum.MapDrawer.MapDrawer; import com.Torvald.Terrarum.Terrarum; import com.Torvald.spriteAnimation.SpriteAnimation; @@ -35,7 +35,9 @@ public class ActorWithBody implements Actor, Visible, Glowing { private @NotNull float veloX, veloY; private final float VELO_HARD_LIMIT = 10000; - private boolean grounded = false; + boolean grounded = false; + boolean walledLeft = false; + boolean walledRight = false; SpriteAnimation sprite; @Nullable SpriteAnimation spriteGlow; @@ -55,7 +57,8 @@ public class ActorWithBody implements Actor, Visible, Glowing { private float scale = 1; private float mass = 1f; - private static int TSIZE = MapDrawer.TILE_SIZE; + private static final int TSIZE = MapDrawer.TILE_SIZE; + private static final int AUTO_CLIMB_RATE = TSIZE / 4; /** * Gravitational Constant G. Load from GameMap. @@ -69,6 +72,11 @@ public class ActorWithBody implements Actor, Visible, Glowing { private float gravitation; private final float DRAG_COEFF = 1f; + private final int CONTACT_AREA_TOP = 0; + private final int CONTACT_AREA_RIGHT = 1; + private final int CONTACT_AREA_BOTTOM = 2; + private final int CONTACT_AREA_LEFT = 3; + /** * A constant to make falling faster so that the game is more playable */ @@ -77,10 +85,19 @@ public class ActorWithBody implements Actor, Visible, Glowing { long referenceID; public ActorWithBody() { - referenceID = new HighQualityRandom(0x7E22A211AAL).nextLong(); + referenceID = new HQRNG(0x7E22A211AAL).nextLong(); actorValue = new ActorValue(); } + /** + * + * @param w + * @param h + * @param tx +: translate drawn sprite to LEFT. + * @param ty +: translate drawn sprite to DOWN. + * @see ActorWithBody#drawBody(GameContainer, Graphics) + * @see ActorWithBody#drawGlow(GameContainer, Graphics) + */ public void setHitboxDimension(int w, int h, int tx, int ty) { baseHitboxH = h; baseHitboxW = w; @@ -131,17 +148,16 @@ public class ActorWithBody implements Actor, Visible, Glowing { if (veloY > VELO_HARD_LIMIT) veloY = VELO_HARD_LIMIT; // Set 'next' positions to fiddle with - updateNextHitbox(delta_t); - if (!playerNoClip()) { + updateNextHitboxY(); updateVerticalPos(); + updateHitboxY(); + + updateNextHitboxX(); updateHorizontalPos(); + updateHitboxX(); } - // Apply previous fiddling - updateHitbox(); - - /** * clamp position */ @@ -156,87 +172,6 @@ public class ActorWithBody implements Actor, Visible, Glowing { } } - @Override - public void drawGlow(GameContainer gc, Graphics g) { - if (visible && spriteGlow != null) { - if (!sprite.flippedHorizontal()) { - spriteGlow.render(g - , Math.round(hitbox.getPosX() - (hitboxTranslateX * scale)) - , Math.round(hitbox.getPosY() - hitboxTranslateY * scale) - - (baseSpriteHeight - baseHitboxH) * scale - + 1 - , scale - ); - } - else { - spriteGlow.render(g - , Math.round(hitbox.getPosX() - scale) - , Math.round(hitbox.getPosY() - hitboxTranslateY * scale) - - (baseSpriteHeight - baseHitboxH) * scale - + 1 - , scale - ); - } - } - } - - @Override - public void drawBody(GameContainer gc, Graphics g) { - if (visible) { - if (!sprite.flippedHorizontal()) { - sprite.render(g - , Math.round(hitbox.getPosX() - (hitboxTranslateX * scale)) - , Math.round(hitbox.getPosY() - hitboxTranslateY * scale) - - (baseSpriteHeight - baseHitboxH) * scale - + 1 - , scale - ); - } - else { - sprite.render(g - , Math.round(hitbox.getPosX() - scale) - , Math.round(hitbox.getPosY() - hitboxTranslateY * scale) - - (baseSpriteHeight - baseHitboxH) * scale - + 1 - , scale - ); - } - } - } - - @Override - public void updateGlowSprite(GameContainer gc, int delta_t) { - if (spriteGlow != null) { - spriteGlow.update(delta_t); - } - } - - @Override - public void updateBodySprite(GameContainer gc, int delta_t) { - sprite.update(delta_t); - } - - boolean collideBottomAndAdjusted() { - // noclip off? - int feetTileX = clampWtile(Math.round((nextHitbox.getPointedX()) / TSIZE)); - int feetTileY = clampHtile(FastMath.floor(nextHitbox.getPointedY() / TSIZE)); - - if (feetTileX < 0) feetTileX = 0; - if (feetTileY < 0) feetTileY = 0; - - int feetTile = Terrarum.game.map.getTileFromTerrain(feetTileX, feetTileY); - - if (feetTile != 0) { - nextHitbox.setPositionYFromPoint( - feetTileY * TSIZE - ); - return true; - } - else { - return false; - } - } - /** * Apply gravitation to the every falling body (unless not levitating) * @@ -266,37 +201,338 @@ public class ActorWithBody implements Actor, Visible, Glowing { } private void updateVerticalPos() { - if (collideBottomAndAdjusted()) { + if (collidedBottomAndAdjusted()) { grounded = true; veloY = 0; } else { grounded = false; } + + if (collidedTopAndAdjusted()) { + veloY = 0; + } + } + + boolean collidedBottomAndAdjusted() { + if (getContactArea(CONTACT_AREA_BOTTOM, 0, 1) == 0) { + return false; + } + /** + * seemingly adjusted and one pixel below has ground + * + * seemingly adjusted: adjustHitBottom sets position one pixel above the ground + * (stepping on ground in-game look, as the sprite render is one pixel offseted to Y) + */ + else if (getContactArea(CONTACT_AREA_BOTTOM, 0, 1) > 0 + && getContactArea(CONTACT_AREA_BOTTOM, 0, 0) == 0) { + return true; + } + else { + adjustHitBottom(); + return true; + } + } + + boolean collidedTopAndAdjusted() { + if (getContactArea(CONTACT_AREA_TOP, 0, -1) == 0) { + return false; + } + /** + * seemingly adjusted and one pixel below has ground + * + * seemingly adjusted: adjustHitBottom sets position one pixel above the ground + * (stepping on ground in-game look, as the sprite render is one pixel offseted to Y) + */ + else if (getContactArea(CONTACT_AREA_TOP, 0, -1) > 0 + && getContactArea(CONTACT_AREA_TOP, 0, 0) == 0) { + return true; + } + else { + adjustHitTop(); + return true; + } } private void updateHorizontalPos() { - + if (collidedRightAndAdjusted()) { // treat as 'event--collided right' + veloX = 0; + walledRight = true; + } + else if (collidedLeftAndAdjusted()) { // treat as 'event--collided left' + veloX = 0; + walledLeft = true; + } + else { + walledRight = false; + walledLeft = false; + } } - private void updateNextHitbox(int delta_t) { + boolean collidedRightAndAdjusted() { + if (getContactArea(CONTACT_AREA_RIGHT, 1, 0) == 0) { + return false; + } + /** + * seemingly adjusted and one pixel below has ground + * + * seemingly adjusted: adjustHitBottom sets position one pixel above the ground + * (stepping on ground in-game look, as the sprite render is one pixel offseted to Y) + */ + else if (getContactArea(CONTACT_AREA_RIGHT, 1, 0) > 0 + && getContactArea(CONTACT_AREA_RIGHT, 0, 0) == 0) { + return true; + } + else { + adjustHitRight(); + return true; + } + } + + boolean collidedLeftAndAdjusted() { + if (getContactArea(CONTACT_AREA_LEFT, -1, 0) == 0) { + return false; + } + /** + * seemingly adjusted and one pixel below has ground + * + * seemingly adjusted: adjustHitBottom sets position one pixel above the ground + * (stepping on ground in-game look, as the sprite render is one pixel offseted to Y) + */ + else if (getContactArea(CONTACT_AREA_LEFT, -1, 0) > 0 + && getContactArea(CONTACT_AREA_LEFT, 0, 0) == 0) { + return true; + } + else { + adjustHitLeft(); + return true; + } + } + + private void updateNextHitboxX() { nextHitbox.set( hitbox.getPosX() + veloX + , hitbox.getPosY() + , baseHitboxW * scale + , baseHitboxH * scale + ); + } + + private void updateNextHitboxY() { + nextHitbox.set( + hitbox.getPosX() , hitbox.getPosY() + veloY , baseHitboxW * scale , baseHitboxH * scale ); } - private void updateHitbox() { + private void updateHitboxX() { hitbox.set( nextHitbox.getPosX() + , hitbox.getPosY() + , baseHitboxW * scale + , baseHitboxH * scale + ); + } + + private void updateHitboxY() { + hitbox.set( + hitbox.getPosX() , nextHitbox.getPosY() , baseHitboxW * scale , baseHitboxH * scale ); } + private void adjustHitBottom() { + int tY = 0; + int contactArea = getContactArea(CONTACT_AREA_BOTTOM, 0, 0); + for (int lim = 0; lim < TSIZE; lim++) { + /** + * get contact area and move up and get again. + * keep track of this value, and some point they will be set as lowest + * and become static. The very point where the value first became lowest + * is the value what we want. + */ + int newContactArea = getContactArea(CONTACT_AREA_BOTTOM, 0, -lim); + + if (newContactArea < contactArea) { + tY = -lim; + } + contactArea = newContactArea; + } + nextHitbox.setPositionYFromPoint(FastMath.ceil(nextHitbox.getPointedY() + tY)); + } + + private void adjustHitTop() { + int tY = 0; + int contactArea = getContactArea(CONTACT_AREA_TOP, 0, 0); + for (int lim = 0; lim < TSIZE; lim++) { + /** + * get contact area and move up and get again. + * keep track of this value, and some point they will be set as lowest + * and become static. The very point where the value first became lowest + * is the value what we want. + */ + int newContactArea = getContactArea(CONTACT_AREA_TOP, 0, lim); + + if (newContactArea < contactArea) { + tY = lim; + } + contactArea = newContactArea; + } + nextHitbox.setPositionYFromPoint(FastMath.floor(nextHitbox.getPointedY() + tY)); + } + + private void adjustHitRight() { + int tX = 0; + int contactArea = getContactArea(CONTACT_AREA_RIGHT, 0, 0); + for (int lim = 0; lim < TSIZE; lim++) { + /** + * get contact area and move up and get again. + * keep track of this value, and some point they will be set as lowest + * and become static. The very point where the value first became lowest + * is the value what we want. + */ + int newContactArea = getContactArea(CONTACT_AREA_RIGHT, -lim, 0); + + if (newContactArea < contactArea) { + tX = -lim; + } + contactArea = newContactArea; + } + //nextHitbox.setPositionYFromPoint(nextHitbox.getPointedX() + tX); + nextHitbox.set( + FastMath.ceil(nextHitbox.getPosX() + tX) + , nextHitbox.getPosY() + , nextHitbox.getWidth() + , nextHitbox.getHeight() + ); + } + + private void adjustHitLeft() { + int tX = 0; + int contactArea = getContactArea(CONTACT_AREA_LEFT, 0, 0); + for (int lim = 0; lim < TSIZE; lim++) { + /** + * get contact area and move up and get again. + * keep track of this value, and some point they will be set as lowest + * and become static. The very point where the value first became lowest + * is the value what we want. + */ + int newContactArea = getContactArea(CONTACT_AREA_LEFT, lim, 0); + + if (newContactArea < contactArea) { + tX = lim; + } + contactArea = newContactArea; + } + //nextHitbox.setPositionYFromPoint(nextHitbox.getPointedX() + tX); + nextHitbox.set( + FastMath.floor(nextHitbox.getPosX() + tX) + , nextHitbox.getPosY() + , nextHitbox.getWidth() + , nextHitbox.getHeight() + ); + } + + private int getContactArea(int side, int translateX, int translateY) { + int contactAreaCounter = 0; + for (int i = 0 + ; i < Math.round((side % 2 == 0) ? nextHitbox.getWidth() : nextHitbox.getHeight()) + ; i++) { + // set tile positions + int tileX = 0, tileY = 0; + if (side == CONTACT_AREA_BOTTOM) { + tileX = div16(Math.round(nextHitbox.getHitboxStart().getX()) + i + translateX); + tileY = div16(FastMath.floor(nextHitbox.getHitboxEnd().getY()) + translateY); + } + else if (side == CONTACT_AREA_TOP) { + tileX = div16(Math.round(nextHitbox.getHitboxStart().getX()) + i + translateX); + tileY = div16(FastMath.ceil(nextHitbox.getHitboxStart().getY()) + translateY); + } + else if (side == CONTACT_AREA_RIGHT) { + tileX = div16(FastMath.floor(nextHitbox.getHitboxEnd().getX()) + translateX); + tileY = div16(Math.round(nextHitbox.getHitboxStart().getY()) + i + translateY); + } + else if (side == CONTACT_AREA_LEFT) { + tileX = div16(FastMath.ceil(nextHitbox.getHitboxStart().getX()) + translateX); + tileY = div16(Math.round(nextHitbox.getHitboxStart().getY()) + i + translateY); + } + else { + throw new IllegalArgumentException(String.valueOf(side) + ": Wrong side input"); + } + + // evaluate + if (Terrarum.game.map.getTileFromTerrain(tileX, tileY) > 0) { + contactAreaCounter += 1; + } + } + + return contactAreaCounter; + } + + @Override + public void drawGlow(GameContainer gc, Graphics g) { + if (visible && spriteGlow != null) { + if (!sprite.flippedHorizontal()) { + spriteGlow.render(g + , (hitbox.getPosX() - (hitboxTranslateX * scale)) + , (hitbox.getPosY() + (hitboxTranslateY * scale)) + - (baseSpriteHeight - baseHitboxH) * scale + + 1 + , scale + ); + } + else { + spriteGlow.render(g + , (hitbox.getPosX() - scale) + , (hitbox.getPosY() + (hitboxTranslateY * scale)) + - (baseSpriteHeight - baseHitboxH) * scale + + 1 + , scale + ); + } + } + } + + @Override + public void drawBody(GameContainer gc, Graphics g) { + if (visible) { + if (!sprite.flippedHorizontal()) { + sprite.render(g + , (hitbox.getPosX() - (hitboxTranslateX * scale)) + , (hitbox.getPosY() + (hitboxTranslateY * scale)) + - (baseSpriteHeight - baseHitboxH) * scale + + 1 + , scale + ); + } + else { + sprite.render(g + , (hitbox.getPosX() - scale) + , (hitbox.getPosY() + (hitboxTranslateY * scale)) + - (baseSpriteHeight - baseHitboxH) * scale + + 1 + , scale + ); + } + } + } + + @Override + public void updateGlowSprite(GameContainer gc, int delta_t) { + if (spriteGlow != null) { + spriteGlow.update(delta_t); + } + } + + @Override + public void updateBodySprite(GameContainer gc, int delta_t) { + sprite.update(delta_t); + } + @Override public long getRefID() { return referenceID; @@ -360,12 +596,14 @@ public class ActorWithBody implements Actor, Visible, Glowing { } private static int div16(int x) { - if (x < 0) { throw new IllegalArgumentException("Positive integer only!"); } + if (x < 0) { throw new IllegalArgumentException("div16: Positive integer only:" + + String.valueOf(x)); } return (x & 0x7FFF_FFFF) >> 4; } private static int mod16(int x) { - if (x < 0) { throw new IllegalArgumentException("Positive integer only!"); } + if (x < 0) { throw new IllegalArgumentException("mod16: Positive integer only:" + + String.valueOf(x)); } return x & 0b1111; } @@ -421,6 +659,14 @@ public class ActorWithBody implements Actor, Visible, Glowing { return grounded; } + public boolean isWalledLeft() { + return walledLeft; + } + + public boolean isWalledRight() { + return walledRight; + } + public int getBaseHitboxW() { return baseHitboxW; } @@ -452,4 +698,8 @@ public class ActorWithBody implements Actor, Visible, Glowing { public void setUpdate(boolean update) { this.update = update; } + + private int clampMulOfTSize(float v) { + return (Math.round(v) / TSIZE) * TSIZE; + } } diff --git a/src/com/Torvald/Terrarum/Actors/CreatureBuildFactory.java b/src/com/Torvald/Terrarum/Actors/CreatureBuildFactory.java index e7a778fde..b8bcf94b2 100644 --- a/src/com/Torvald/Terrarum/Actors/CreatureBuildFactory.java +++ b/src/com/Torvald/Terrarum/Actors/CreatureBuildFactory.java @@ -1,7 +1,7 @@ package com.Torvald.Terrarum.Actors; import com.Torvald.Rand.Fudge3; -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import org.newdawn.slick.SlickException; @@ -67,7 +67,7 @@ public class CreatureBuildFactory { for (String s : elemSet) { float baseValue = jsonObject.get(s).getAsFloat(); // roll fudge dice and get value [-3, 3] as [0, 6] - int varSelected = new Fudge3().create(new HighQualityRandom()).roll() + 3; + int varSelected = new Fudge3().create(new HQRNG()).roll() + 3; // get multiplier from json. Assuming percentile int multiplier = jsonObject.get(s + "variable").getAsJsonArray().get(varSelected).getAsInt(); float realValue = baseValue * multiplier / 100f; diff --git a/src/com/Torvald/Terrarum/Actors/PBFSigrid.java b/src/com/Torvald/Terrarum/Actors/PBFSigrid.java index 0b06f8238..70a56f1bd 100644 --- a/src/com/Torvald/Terrarum/Actors/PBFSigrid.java +++ b/src/com/Torvald/Terrarum/Actors/PBFSigrid.java @@ -52,7 +52,7 @@ public class PBFSigrid { p.actorValue.set("name", "Sigrid"); - p.setHitboxDimension(20, 47, 7, 0); + p.setHitboxDimension(17, 47, 9, 0); p.inventory = new ActorInventory((int) p.actorValue.get("encumbrance"), true); diff --git a/src/com/Torvald/Terrarum/Actors/Player.java b/src/com/Torvald/Terrarum/Actors/Player.java index c135ce69b..2151ab8fe 100644 --- a/src/com/Torvald/Terrarum/Actors/Player.java +++ b/src/com/Torvald/Terrarum/Actors/Player.java @@ -1,6 +1,5 @@ package com.Torvald.Terrarum.Actors; -import com.Torvald.Terrarum.Game; import com.Torvald.Terrarum.GameControl.EnumKeyFunc; import com.Torvald.Terrarum.GameControl.KeyMap; import com.Torvald.Terrarum.Terrarum; @@ -8,12 +7,16 @@ import com.Torvald.spriteAnimation.SpriteAnimation; import com.jme3.math.FastMath; import com.sun.istack.internal.NotNull; import com.sun.istack.internal.Nullable; +import org.lwjgl.input.Controller; +import org.lwjgl.input.Controllers; import org.newdawn.slick.*; +import java.io.Serializable; + /** * Created by minjaesong on 15-12-31. */ -public class Player extends ActorWithBody implements Controllable, Pocketed { +public class Player extends ActorWithBody implements Controllable, Pocketed, Serializable { @Nullable public Controllable vehicleRiding; @@ -21,7 +24,7 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { int walkPowerCounter = 0; private final int WALK_FRAMES_TO_MAX_ACCEL = 6; - public float readonly_totalX = 0; + public float readonly_totalX = 0, readonly_totalY = 0; boolean jumping = false; @@ -42,6 +45,9 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { public final long PLAYER_REF_ID = 0x51621D; + private final float AXIS_POSMAX = 1.0f; + private final int GAMEPAD_JUMP = 5; + /** * Creates new Player instance with empty elements (sprites, actorvalue, etc.).
* @@ -73,34 +79,74 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { * FastMath.pow(super.getScale(), 3)); } - private void walkHorizontal(boolean left) { - readonly_totalX = super.getVeloX() + /** + * + * @param left (even if the game is joypad controlled, you must give valid value) + * @param absAxisVal (set AXIS_POSMAX if keyboard controlled) + */ + private void walkHorizontal(boolean left, float absAxisVal) { + if ((!super.isWalledLeft() && left) || (!super.isWalledRight() && !left)) { + readonly_totalX = super.getVeloX() + + + actorValue.getAsFloat("accel") + * actorValue.getAsFloat("accelmult") + * FastMath.sqrt(super.getScale()) + * applyAccelRealism(walkPowerCounter) + * (left ? -1 : 1) + * absAxisVal; + + super.setVeloX(readonly_totalX); + + if (walkPowerCounter < WALK_FRAMES_TO_MAX_ACCEL) { + walkPowerCounter += 1; + } + + // Clamp veloX + super.setVeloX( + absClamp(super.getVeloX() + , actorValue.getAsFloat("speed") + * actorValue.getAsFloat("speedmult") + * FastMath.sqrt(super.getScale()) + ) + ); + + // Heading flag + if (left) + walkHeading = LEFT; + else + walkHeading = RIGHT; + } + } + + /** + * + * @param up (even if the game is joypad controlled, you must give valid value) + * @param absAxisVal (set AXIS_POSMAX if keyboard controlled) + */ + private void walkVertical(boolean up, float absAxisVal) { + readonly_totalY = super.getVeloY() + actorValue.getAsFloat("accel") * actorValue.getAsFloat("accelmult") * FastMath.sqrt(super.getScale()) * applyAccelRealism(walkPowerCounter) - * (left ? -1 : 1); + * (up ? -1 : 1) + * absAxisVal; - super.setVeloX(readonly_totalX); + super.setVeloY(readonly_totalY); if (walkPowerCounter < WALK_FRAMES_TO_MAX_ACCEL) { walkPowerCounter += 1; } // Clamp veloX - super.setVeloX( - absClamp(super.getVeloX() - , actorValue.getAsFloat("speed") - * actorValue.getAsFloat("speedmult") - * FastMath.sqrt(super.getScale()) - )); - - // Heading flag - if (left) - walkHeading = LEFT; - else - walkHeading = RIGHT; + super.setVeloY( + absClamp(super.getVeloY() + , actorValue.getAsFloat("speed") + * actorValue.getAsFloat("speedmult") + * FastMath.sqrt(super.getScale()) + ) + ); } /** @@ -130,30 +176,6 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { return 0.5f + 0.5f * -FastMath.cos(10 * x / (WALK_FRAMES_TO_MAX_ACCEL * FastMath.PI)); } - private void walkVertical(boolean up) { - super.setVeloY(super.getVeloY() - + - actorValue.getAsFloat("accel") - * actorValue.getAsFloat("accelmult") - * FastMath.sqrt(super.getScale()) - * applyAccelRealism(walkPowerCounter) - * (up ? -1 : 1) - ); - - if (walkPowerCounter < WALK_FRAMES_TO_MAX_ACCEL) { - walkPowerCounter += 1; - } - - // Clamp veloX - super.setVeloY( - absClamp(super.getVeloY() - , actorValue.getAsFloat("speed") - * actorValue.getAsFloat("speedmult") - * FastMath.sqrt(super.getScale()) - ) - ); - } - private void walkHStop() { if (super.getVeloX() > 0) { super.setVeloX(super.getVeloX() @@ -232,94 +254,137 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { } public void processInput(Input input) { + Controller gamepad = null; + float axisX = 0, axisY = 0, axisRX = 0, axisRY = 0; + if (Terrarum.hasController) { + gamepad = Controllers.getController(0); + axisX = gamepad.getAxisValue(0); + axisY = gamepad.getAxisValue(1); + axisRX = gamepad.getAxisValue(2); + axisRY = gamepad.getAxisValue(3); + + if (Math.abs(axisX) < Terrarum.CONTROLLER_DEADZONE) axisX = 0; + if (Math.abs(axisY) < Terrarum.CONTROLLER_DEADZONE) axisY = 0; + if (Math.abs(axisRX) < Terrarum.CONTROLLER_DEADZONE) axisRX = 0; + if (Math.abs(axisRY) < Terrarum.CONTROLLER_DEADZONE) axisRY = 0; + } + /** * L-R stop */ - // ↑F, ↑S - if (!isFuncDown(input, EnumKeyFunc.MOVE_LEFT) - && !isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { - walkHStop(); - prevHMoveKey = KEY_NULL; + if (Terrarum.hasController) { + if (axisX == 0) { + walkHStop(); + } + } + else { + // ↑F, ↑S + if (!isFuncDown(input, EnumKeyFunc.MOVE_LEFT) + && !isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { + walkHStop(); + prevHMoveKey = KEY_NULL; + } } /** * U-D stop */ - // ↑E - // ↑D - if (isNoClip() - &&!isFuncDown(input, EnumKeyFunc.MOVE_UP) - && !isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { - walkVStop(); - prevVMoveKey = KEY_NULL; + if (Terrarum.hasController) { + if (axisY == 0) { + walkVStop(); + } + } + else { + // ↑E + // ↑D + if (isNoClip() + && !isFuncDown(input, EnumKeyFunc.MOVE_UP) + && !isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { + walkVStop(); + prevVMoveKey = KEY_NULL; + } } /** * Left/Right movement */ - // ↑F, ↓S - if (isFuncDown(input, EnumKeyFunc.MOVE_RIGHT) - && !isFuncDown(input, EnumKeyFunc.MOVE_LEFT)) { - walkHorizontal(false); - prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT); + if (Terrarum.hasController) { + if (axisX != 0) { + walkHorizontal(axisX < 0, AXIS_POSMAX); + } } - // ↓F, ↑S - else if (isFuncDown(input, EnumKeyFunc.MOVE_LEFT) - && !isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { - walkHorizontal(true); - prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT); - } - // ↓F, ↓S - else if (isFuncDown(input, EnumKeyFunc.MOVE_LEFT) - && isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { - if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT)) { - walkHorizontal(false); + else { + // ↑F, ↓S + if (isFuncDown(input, EnumKeyFunc.MOVE_RIGHT) + && !isFuncDown(input, EnumKeyFunc.MOVE_LEFT)) { + walkHorizontal(false, AXIS_POSMAX); prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT); } - else if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT)) { - walkHorizontal(true); + // ↓F, ↑S + else if (isFuncDown(input, EnumKeyFunc.MOVE_LEFT) + && !isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { + walkHorizontal(true, AXIS_POSMAX); prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT); } + // ↓F, ↓S + else if (isFuncDown(input, EnumKeyFunc.MOVE_LEFT) + && isFuncDown(input, EnumKeyFunc.MOVE_RIGHT)) { + if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT)) { + walkHorizontal(false, AXIS_POSMAX); + prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT); + } + else if (prevHMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_RIGHT)) { + walkHorizontal(true, AXIS_POSMAX); + prevHMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_LEFT); + } + } } /** * Up/Down movement */ - if (noClip) { - // ↑E - // ↓D - if (isFuncDown(input, EnumKeyFunc.MOVE_DOWN) - && !isFuncDown(input, EnumKeyFunc.MOVE_UP)) { - walkVertical(false); - prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN); + if (Terrarum.hasController) { + if (axisY != 0) { + walkVertical(axisY > 0, AXIS_POSMAX); + } } - // ↓E - // ↑D - else if (isFuncDown(input, EnumKeyFunc.MOVE_UP) - && !isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { - walkVertical(true); - prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP); - } - // ↓E - // ↓D - else if (isFuncDown(input, EnumKeyFunc.MOVE_UP) - && isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { - if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP)) { - walkVertical(false); + else { + // ↑E + // ↓D + if (isFuncDown(input, EnumKeyFunc.MOVE_DOWN) + && !isFuncDown(input, EnumKeyFunc.MOVE_UP)) { + walkVertical(false, AXIS_POSMAX); prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN); } - else if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN)) { - walkVertical(true); + // ↓E + // ↑D + else if (isFuncDown(input, EnumKeyFunc.MOVE_UP) + && !isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { + walkVertical(true, AXIS_POSMAX); prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP); } + // ↓E + // ↓D + else if (isFuncDown(input, EnumKeyFunc.MOVE_UP) + && isFuncDown(input, EnumKeyFunc.MOVE_DOWN)) { + if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP)) { + walkVertical(false, AXIS_POSMAX); + prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN); + } + else if (prevVMoveKey == KeyMap.getKeyCode(EnumKeyFunc.MOVE_DOWN)) { + walkVertical(true, AXIS_POSMAX); + prevVMoveKey = KeyMap.getKeyCode(EnumKeyFunc.MOVE_UP); + } + } } } /** * Jump control */ - if (isFuncDown(input, EnumKeyFunc.JUMP)) { + if (isFuncDown(input, EnumKeyFunc.JUMP) + || (Terrarum.hasController && gamepad.isButtonPressed(GAMEPAD_JUMP))) { if (!noClip) { if (super.isGrounded()) { jumping = true; @@ -327,7 +392,7 @@ public class Player extends ActorWithBody implements Controllable, Pocketed { } } else { - walkVertical(true); + walkVertical(true, AXIS_POSMAX); } } else { diff --git a/src/com/Torvald/Terrarum/Actors/PlayerBuildFactory.java b/src/com/Torvald/Terrarum/Actors/PlayerBuildFactory.java index 20994ec65..29cf6545b 100644 --- a/src/com/Torvald/Terrarum/Actors/PlayerBuildFactory.java +++ b/src/com/Torvald/Terrarum/Actors/PlayerBuildFactory.java @@ -1,14 +1,9 @@ package com.Torvald.Terrarum.Actors; -import com.Torvald.Rand.Fudge3; -import com.Torvald.Rand.HighQualityRandom; -import com.google.gson.*; import org.newdawn.slick.SlickException; import java.io.IOException; -import java.nio.file.FileSystems; -import java.nio.file.Files; /** * Created by minjaesong on 16-02-03. diff --git a/src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.java b/src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.java new file mode 100644 index 000000000..418348a68 --- /dev/null +++ b/src/com/Torvald/Terrarum/ConsoleCommand/CatStdout.java @@ -0,0 +1,34 @@ +package com.Torvald.Terrarum.ConsoleCommand; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.Files; + +/** + * Created by minjaesong on 16-02-10. + */ +public class CatStdout implements ConsoleCommand { + @Override + public void execute(String[] args) { + + Echo echo = new Echo(); + + if (args.length == 1) { + printUsage(); + return; + } + + try { + Files.lines(FileSystems.getDefault().getPath(args[1])).forEach(echo::execute); + } + catch (IOException e) { + echo.execute("CatStdout: could not read file -- IOException"); + } + + } + + @Override + public void printUsage() { + new Echo().execute("usage: cat 'path/to/text/file"); + } +} diff --git a/src/com/Torvald/Terrarum/ConsoleCommand/CommandDict.java b/src/com/Torvald/Terrarum/ConsoleCommand/CommandDict.java index 36a4c55a6..67cd466ec 100644 --- a/src/com/Torvald/Terrarum/ConsoleCommand/CommandDict.java +++ b/src/com/Torvald/Terrarum/ConsoleCommand/CommandDict.java @@ -25,6 +25,7 @@ public class CommandDict { dict.put("setlocale", new SetLocale()); dict.put("zoom", new Zoom()); dict.put("teleport", new TeleportPlayer()); + dict.put("cat", new CatStdout()); } public static ConsoleCommand getCommand(String commandName) { diff --git a/src/com/Torvald/Terrarum/ConsoleCommand/ExportMap.java b/src/com/Torvald/Terrarum/ConsoleCommand/ExportMap.java index 834639613..832634aad 100644 --- a/src/com/Torvald/Terrarum/ConsoleCommand/ExportMap.java +++ b/src/com/Torvald/Terrarum/ConsoleCommand/ExportMap.java @@ -1,9 +1,7 @@ package com.Torvald.Terrarum.ConsoleCommand; -import com.Torvald.ColourUtil.Col12; +import com.Torvald.ColourUtil.Col4096; import com.Torvald.Terrarum.Terrarum; -import com.Torvald.Terrarum.Game; -import org.newdawn.slick.Color; import javax.imageio.ImageIO; import java.awt.*; @@ -51,7 +49,7 @@ public class ExportMap implements ConsoleCommand { private static final byte WATER = (byte) 239; private static final byte LAVA = (byte) 255; - private Hashtable colorTable = new Hashtable<>(); + private Hashtable colorTable = new Hashtable<>(); @Override public void execute(String[] args) { @@ -61,7 +59,7 @@ public class ExportMap implements ConsoleCommand { mapData = new byte[Terrarum.game.map.width * Terrarum.game.map.height * 3]; for (byte tile : Terrarum.game.map.getLayerTerrain()) { - byte[] colArray = colorTable.getOrDefault(tile, new Col12(0xFFF)) + byte[] colArray = colorTable.getOrDefault(tile, new Col4096(0xFFF)) .toByteArray(); for (int i = 0; i < 3; i++) { @@ -121,34 +119,34 @@ public class ExportMap implements ConsoleCommand { } private void buildColorTable() { - colorTable.put(AIR, new Col12(0xCEF)); - colorTable.put(STONE, new Col12(0x887)); - colorTable.put(DIRT, new Col12(0x763)); - colorTable.put(GRASS, new Col12(0x251)); + colorTable.put(AIR, new Col4096(0xCEF)); + colorTable.put(STONE, new Col4096(0x887)); + colorTable.put(DIRT, new Col4096(0x763)); + colorTable.put(GRASS, new Col4096(0x251)); - colorTable.put(COPPER, new Col12(0x6A8)); - colorTable.put(IRON, new Col12(0xC75)); - colorTable.put(GOLD, new Col12(0xCB6)); - colorTable.put(ILMENITE, new Col12(0x8AB)); - colorTable.put(AURICHALCUM, new Col12(0xD92)); + colorTable.put(COPPER, new Col4096(0x6A8)); + colorTable.put(IRON, new Col4096(0xC75)); + colorTable.put(GOLD, new Col4096(0xCB6)); + colorTable.put(ILMENITE, new Col4096(0x8AB)); + colorTable.put(AURICHALCUM, new Col4096(0xD92)); - colorTable.put(DIAMOND, new Col12(0x9CE)); - colorTable.put(RUBY, new Col12(0xB10)); - colorTable.put(EMERALD, new Col12(0x0B1)); - colorTable.put(SAPPHIRE, new Col12(0x01B)); - colorTable.put(TOPAZ, new Col12(0xC70)); - colorTable.put(AMETHYST, new Col12(0x70C)); + colorTable.put(DIAMOND, new Col4096(0x9CE)); + colorTable.put(RUBY, new Col4096(0xB10)); + colorTable.put(EMERALD, new Col4096(0x0B1)); + colorTable.put(SAPPHIRE, new Col4096(0x01B)); + colorTable.put(TOPAZ, new Col4096(0xC70)); + colorTable.put(AMETHYST, new Col4096(0x70C)); - colorTable.put(WATER, new Col12(0x038)); - colorTable.put(LAVA, new Col12(0xF50)); + colorTable.put(WATER, new Col4096(0x038)); + colorTable.put(LAVA, new Col4096(0xF50)); - colorTable.put(SAND, new Col12(0xDCA)); - colorTable.put(GRAVEL, new Col12(0x664)); + colorTable.put(SAND, new Col4096(0xDCA)); + colorTable.put(GRAVEL, new Col4096(0x664)); - colorTable.put(ICE_NATURAL, new Col12(0x9AB)); - colorTable.put(ICE_MAGICAL, new Col12(0x7AC)); - colorTable.put(ICE_FRAGILE, new Col12(0x6AF)); - colorTable.put(SNOW, new Col12(0xCDE)); + colorTable.put(ICE_NATURAL, new Col4096(0x9AB)); + colorTable.put(ICE_MAGICAL, new Col4096(0x7AC)); + colorTable.put(ICE_FRAGILE, new Col4096(0x6AF)); + colorTable.put(SNOW, new Col4096(0xCDE)); } diff --git a/src/com/Torvald/Terrarum/Game.java b/src/com/Torvald/Terrarum/Game.java index cf33f6331..c1a7273bd 100644 --- a/src/com/Torvald/Terrarum/Game.java +++ b/src/com/Torvald/Terrarum/Game.java @@ -59,7 +59,11 @@ public class Game extends BasicGameState { private Shader shaderBlurH; private Shader shaderBlurV; - public Game() throws SlickException { + public Game() throws SlickException { } + + @Override + public void init(GameContainer gameContainer, StateBasedGame stateBasedGame) throws + SlickException { new GameController(); KeyMap.build(); GameController.setKeyMap(new KeyMap()); @@ -83,7 +87,7 @@ public class Game extends BasicGameState { MapGenerator.attachMap(map); MapGenerator.setSeed(0x51621D); - //MapGenerator.setSeed(new HighQualityRandom().nextLong()); + //MapGenerator.setSeed(new HQRNG().nextLong()); MapGenerator.generateMap(); new CommandDict(); @@ -122,11 +126,6 @@ public class Game extends BasicGameState { uiContainer.add(msgtest); } - @Override - public void init(GameContainer gameContainer, StateBasedGame stateBasedGame) throws - SlickException { - } - public Player getPlayer() { return player; } @@ -136,6 +135,7 @@ public class Game extends BasicGameState { setAppTitle(); MapDrawer.update(gc, delta_t); + MapCamera.update(gc, delta_t); GameController.processInput(gc.getInput()); @@ -177,10 +177,6 @@ public class Game extends BasicGameState { @Override public void render(GameContainer gc, StateBasedGame sbg, Graphics g) { - // shader12BitCol.setUniformIntVariable("pixelSize", 1); - // shader12BitCol.startShader(); - // shaderBlurH.startShader(); - // shaderBlurV.startShader(); drawSkybox(g); @@ -190,37 +186,30 @@ public class Game extends BasicGameState { , -MapCamera.getCameraY() * screenZoom ); + MapCamera.renderBehind(gc, g); + actorContainer.forEach( - actor -> { - if (actor instanceof Visible) { - ((Visible) actor).drawBody(gc, g); - } - } + actor -> { if (actor instanceof Visible) ((Visible) actor).drawBody(gc, g); } ); actorContainer.forEach( - actor -> { - if (actor instanceof Glowing) { - ((Glowing) actor).drawGlow(gc, g); - } - } + actor -> { if (actor instanceof Glowing) ((Glowing) actor).drawGlow(gc, g); } ); + + MapCamera.renderFront(gc, g); MapDrawer.render(gc, g); - // Slick's MODE_COLOR_MULTIPLY is clearly broken... using GL11 LightmapRenderer.renderLightMap(); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA); - // draw lightmap + setBlendModeMul(); LightmapRenderer.draw(g); - // draw environment colour overlay // MapDrawer.drawEnvOverlay(g); - GL11.glDisable(GL11.GL_BLEND); - g.setDrawMode(Graphics.MODE_NORMAL); + setBlendModeNormal(); uiContainer.forEach(ui -> ui.render(gc, g)); debugWindow.render(gc, g); consoleHandler.render(gc, g); //bulletin.render(gc, g); + + GL11.glEnd(); } private Color[] getGradientColour(int timeSec) { @@ -282,4 +271,14 @@ public class Game extends BasicGameState { GradientFill skyColourFill = new GradientFill(0, 0, colourTable[0], 0, Terrarum.HEIGHT, colourTable[1]); g.fill(skyBox, skyColourFill); } + + private void setBlendModeMul() { + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_SRC_ALPHA); + } + + private void setBlendModeNormal() { + GL11.glDisable(GL11.GL_BLEND); + Terrarum.appgc.getGraphics().setDrawMode(Graphics.MODE_NORMAL); + } } diff --git a/src/com/Torvald/Terrarum/MISC_FEATURES b/src/com/Torvald/Terrarum/MISC_FEATURES new file mode 100644 index 000000000..6ce71a3d1 --- /dev/null +++ b/src/com/Torvald/Terrarum/MISC_FEATURES @@ -0,0 +1,4 @@ +* Drawing + +- Players can create their own décors (hang on wall), dresses. +- Two looms (3-3-2 colour mode, 4096 colour mode) \ No newline at end of file diff --git a/src/com/Torvald/Terrarum/MapDrawer/MapCamera.java b/src/com/Torvald/Terrarum/MapDrawer/MapCamera.java index 19046a585..dbc444997 100644 --- a/src/com/Torvald/Terrarum/MapDrawer/MapCamera.java +++ b/src/com/Torvald/Terrarum/MapDrawer/MapCamera.java @@ -136,24 +136,31 @@ public class MapCamera { // position - (WH / 2) cameraX = clamp( - Math.round(player.pointedPosX() - (renderWidth / 2)) + Math.round(player.getNextHitbox().getPointedX() - (renderWidth / 2)) , map.width * TSIZE - renderWidth ); cameraY = clamp( - Math.round(player.pointedPosY() - (renderHeight / 2)) + Math.round(player.getNextHitbox().getPointedY() - (renderHeight / 2)) , map.height * TSIZE - renderHeight ); } - public static void render(GameContainer gc, Graphics g) { + public static void renderBehind(GameContainer gc, Graphics g) { /** * render to camera */ - drawTiles(WALL); - drawTiles(TERRAIN); + setBlendModeNormal(); + drawTiles(WALL, false); + drawTiles(TERRAIN, false); } - private static void drawTiles(int mode) { + public static void renderFront(GameContainer gc, Graphics g) { + setBlendModeMul(); + drawTiles(TERRAIN, true); + setBlendModeNormal(); + } + + private static void drawTiles(int mode, boolean drawModeTilesBlendMul) { int for_y_start = div16(cameraY); int for_x_start = div16(cameraX); @@ -222,10 +229,16 @@ public class MapCamera { int thisTileX = nearbyTilesInfo; int thisTileY = thisTile; - - if (isBlendMul((byte) thisTile)) setBlendModeMul(); - else setBlendModeNormal(); - drawTile(TERRAIN, x, y, thisTileX, thisTileY); + if (drawModeTilesBlendMul) { + if (isBlendMul((byte) thisTile)) drawTile(TERRAIN, x, y, thisTileX, thisTileY); + } + else { + // currently it draws all the transparent tile and colour mixes + // on top of the previously drawn tile + // TODO check wether it works as intended when skybox is dark + // add instruction "if (!isBlendMul((byte) thisTile))" + drawTile(TERRAIN, x, y, thisTileX, thisTileY); + } } else { drawTile(mode, x, y, mod16(thisTile), div16(thisTile)); @@ -236,7 +249,6 @@ public class MapCamera { } tilesetBook[mode].endUse(); - setBlendModeNormal(); } private static int getGrassInfo(int x, int y, int from, int to) { diff --git a/src/com/Torvald/Terrarum/MapDrawer/MapDrawer.java b/src/com/Torvald/Terrarum/MapDrawer/MapDrawer.java index a683fe3a7..3695710b2 100644 --- a/src/com/Torvald/Terrarum/MapDrawer/MapDrawer.java +++ b/src/com/Torvald/Terrarum/MapDrawer/MapDrawer.java @@ -31,11 +31,9 @@ public class MapDrawer { } public static void update(GameContainer gc, int delta_t) { - MapCamera.update(gc, delta_t); } public static void render(GameContainer gc, Graphics g) { - MapCamera.render(gc, g); } public static void drawEnvOverlay(Graphics g) { diff --git a/src/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.java b/src/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.java index 065163a7c..49fe68071 100644 --- a/src/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.java +++ b/src/com/Torvald/Terrarum/MapGenerator/FloatingIslandsPreset.java @@ -1,17 +1,17 @@ package com.Torvald.Terrarum.MapGenerator; -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; public class FloatingIslandsPreset { public static int presets = 5; - static int[][] generatePreset(HighQualityRandom random) { + static int[][] generatePreset(HQRNG random) { int index = random.nextInt(presets); return generatePreset(index, random); } - static int[][] generatePreset(int index, HighQualityRandom random){ + static int[][] generatePreset(int index, HQRNG random){ if (index == 0){ return processPreset(random, FloatingIslePreset01.data, FloatingIslePreset01.w, FloatingIslePreset01.h); } @@ -30,7 +30,7 @@ public class FloatingIslandsPreset { return null; } - private static int[][] processPreset(HighQualityRandom random, int[] preset, int w, int h){ + private static int[][] processPreset(HQRNG random, int[] preset, int w, int h){ int[][] temp = new int[h][w]; int counter = 0; boolean mirrored = random.nextBoolean(); diff --git a/src/com/Torvald/Terrarum/MapGenerator/MapGenerator.java b/src/com/Torvald/Terrarum/MapGenerator/MapGenerator.java index eb678bec7..83ff56859 100644 --- a/src/com/Torvald/Terrarum/MapGenerator/MapGenerator.java +++ b/src/com/Torvald/Terrarum/MapGenerator/MapGenerator.java @@ -1,6 +1,6 @@ package com.Torvald.Terrarum.MapGenerator; -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; import com.Torvald.Terrarum.GameMap.GameMap; import com.jme3.math.FastMath; import com.sun.istack.internal.NotNull; @@ -8,7 +8,7 @@ import com.sun.istack.internal.NotNull; public class MapGenerator { @NotNull private static GameMap map; - private static HighQualityRandom random; + private static HQRNG random; //private static float[] noiseArray; @NotNull private static long seed; @NotNull private static int width; @@ -93,7 +93,7 @@ public class MapGenerator { * Generate terrain and override attached map */ public static void generateMap() { - random = new HighQualityRandom(seed); + random = new HQRNG(seed); System.out.println("[MapGenerator] Seed: " + seed); worldOceanPosition = random.nextBoolean() ? TYPE_OCEAN_LEFT : TYPE_OCEAN_RIGHT; diff --git a/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise.java b/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise.java index a78ba6e95..d32ff4cab 100644 --- a/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise.java +++ b/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise.java @@ -1,6 +1,6 @@ package com.Torvald.Terrarum.MapGenerator; -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; import com.jme3.math.FastMath; public class SimplexNoise { @@ -30,7 +30,7 @@ public class SimplexNoise { frequencys = new float[numberOfOctaves]; amplitudes = new float[numberOfOctaves]; - HighQualityRandom rnd = new HighQualityRandom(seed); + HQRNG rnd = new HQRNG(seed); for (int i = 0; i < numberOfOctaves; i++) { octaves[i] = new SimplexNoise_octave(rnd.nextInt()); diff --git a/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise_octave.java b/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise_octave.java index 867f556fd..3387c3061 100644 --- a/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise_octave.java +++ b/src/com/Torvald/Terrarum/MapGenerator/SimplexNoise_octave.java @@ -17,7 +17,7 @@ package com.Torvald.Terrarum.MapGenerator; * */ -import com.Torvald.Rand.HighQualityRandom; +import com.Torvald.Rand.HQRNG; public class SimplexNoise_octave { // Simplex noise in 2D, 3D and 4D @@ -64,7 +64,7 @@ public class SimplexNoise_octave { // Simplex noise in 2D, 3D and 4D } //the random for the swaps - HighQualityRandom rand=new HighQualityRandom(seed); + HQRNG rand=new HQRNG(seed); //the seed determines the swaps that occur between the default order and the order we're actually going to use for(int i=0;i 0); + if (hasController) { + for (int c = 0; c < Controllers.getController(0).getAxisCount(); c++) { + Controllers.getController(0).setDeadZone(c, CONTROLLER_DEADZONE); + } + } + game = new Game(); addState(game); } diff --git a/src/com/Torvald/Terrarum/UserInterface/ConsoleWindow.java b/src/com/Torvald/Terrarum/UserInterface/ConsoleWindow.java index b5b3e5d3e..e757edb09 100644 --- a/src/com/Torvald/Terrarum/UserInterface/ConsoleWindow.java +++ b/src/com/Torvald/Terrarum/UserInterface/ConsoleWindow.java @@ -85,7 +85,7 @@ public class ConsoleWindow implements UICanvas { else if ((key >= 2 && key <= 13) || (key >= 16 && key <= 27) || (key >= 30 && key <= 40) - || (key >= 44 && key <= 52) + || (key >= 44 && key <= 53) || (commandInputPool.length() > 0 && key == 57)){ commandInputPool.append(c); inputCursorPos += 1; diff --git a/src/com/Torvald/spriteAnimation/SpriteAnimation.java b/src/com/Torvald/spriteAnimation/SpriteAnimation.java index 9a9557734..5cd7ec35e 100644 --- a/src/com/Torvald/spriteAnimation/SpriteAnimation.java +++ b/src/com/Torvald/spriteAnimation/SpriteAnimation.java @@ -7,6 +7,7 @@ package com.Torvald.spriteAnimation; import com.Torvald.Terrarum.Game; import com.Torvald.Terrarum.Terrarum; +import com.jme3.math.FastMath; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; import org.newdawn.slick.SlickException; @@ -149,10 +150,10 @@ public class SpriteAnimation { flippedImage.startUse(); flippedImage.drawEmbedded( - Math.round(posX * Terrarum.game.screenZoom) - , Math.round(posY * Terrarum.game.screenZoom) - , width * scale - , height * scale + FastMath.floor(posX * Terrarum.game.screenZoom) + , FastMath.floor(posY * Terrarum.game.screenZoom) + , FastMath.floor(width * scale) + , FastMath.floor(height * scale) ); flippedImage.endUse(); } diff --git a/src/com/jme3/math/FastMath.java b/src/com/jme3/math/FastMath.java index c70529e48..46e1bce8e 100644 --- a/src/com/jme3/math/FastMath.java +++ b/src/com/jme3/math/FastMath.java @@ -70,8 +70,6 @@ final public class FastMath { public static final float DEG_TO_RAD = PI / 180.0f; /** A value to multiply a radian value by, to convert it to degrees. */ public static final float RAD_TO_DEG = 180.0f / PI; - /** A precreated random object for random numbers. */ - public static final Random rand = new Random(System.currentTimeMillis()); /** * Returns true if the number is a power of 2 (2,4,8,16...) @@ -655,30 +653,6 @@ final public class FastMath { * (m10 * det12 - m11 * det02 + m12 * det01)); } - /** - * Returns a random float between 0 and 1. - * - * @return A random float between 0.0f (inclusive) to - * 1.0f (exclusive). - */ - public static float nextRandomFloat() { - return rand.nextFloat(); - } - - /** - * Returns a random float between min and max. - * - * @return A random int between min (inclusive) to - * max (inclusive). - */ - public static int nextRandomInt(int min, int max) { - return (int) (nextRandomFloat() * (max - min + 1)) + min; - } - - public static int nextRandomInt() { - return rand.nextInt(); - } - /** * Converts a point from Spherical coordinates to Cartesian (using positive * Y as up) and stores the results in the store var. diff --git a/src/shader/Shader.java b/src/shader/Shader.java index 584804791..60ef571ce 100755 --- a/src/shader/Shader.java +++ b/src/shader/Shader.java @@ -22,43 +22,43 @@ import org.newdawn.slick.util.ResourceLoader; public class Shader { public static final int BRIEF = 128; public static final int MODERATE = 512; - public static final int VERBOSE = 1024; + public static final int VERBOSE = 1024; private static final int NOT_LOADED = -1; private static final String ERR_LOCATION = "Warning: variable %s could not be found. " + "Ensure the name is spelled correctly\n"; private static int logging = MODERATE; - + private ShaderResourceManager srm; /** - * ID of the Shader. A Shader may have programID of + * ID of the Shader. A Shader may have programID of * -1 only before construction is completed, or * after the Shader is deleted */ private int programID = NOT_LOADED; private Map vars = new HashMap(); - - + + private Shader(ShaderResourceManager srm, Collection vertex, Collection fragment)throws SlickException{ this.srm = srm; StringBuilder errorMessage = new StringBuilder(); - + programID = GL20.glCreateProgram(); - + int[] shaderIds = new int[vertex.size() + fragment.size()]; int index = 0; - + //Load Vertex Shaders - for(String vertShader: vertex){ + for(String vertShader: vertex){ int vsid = srm.getVertexShaderID(vertShader); srm.createProgramShaderDependancy(programID, vsid); - + //Add to shader ids array shaderIds[index] = vsid; index++; - + //Check for errors with shader if(!compiledSuccessfully(vsid)){ errorMessage.append("Vertex Shader "); @@ -67,20 +67,20 @@ public class Shader { errorMessage.append(getShaderInfoLog(vsid)); errorMessage.append("\n\n"); } - + scanSource(vertShader); } - - + + //Load Fragment Shaders - for(String fragShader: fragment){ + for(String fragShader: fragment){ int fsid = srm.getFragementShaderID(fragShader); srm.createProgramShaderDependancy(programID, fsid); //Add to shader ids array shaderIds[index] = fsid; index++; - + //Check for errors with shader if(!compiledSuccessfully(fsid)){ errorMessage.append("Fragment Shader "); @@ -89,10 +89,10 @@ public class Shader { errorMessage.append(getShaderInfoLog(fsid)); errorMessage.append("\n\n"); } - + scanSource(fragShader); } - + //Attach shaders to program for(int i=0; i l2 = new ArrayList(); l2.add(fragmentFileName); - + return new Shader(ShaderResourceManagerImpl.getSRM(), l1, l2); } - - - + + + /** * Reverts GL context back to the fixed pixel pipeline.
*/ public static void forceFixedShader(){ GL20.glUseProgram(0); } - - - + + + /** * Sets the number of characters to be returned when printing * errors.
Suggested values are the constants @@ -159,8 +159,8 @@ public class Shader { logging = detailLevel; } - - + + /** * Deletes this shader and unloads all free resources.
* TODO should this be called from finalise(), or is @@ -170,9 +170,9 @@ public class Shader { srm.removeProgram(programID); programID = NOT_LOADED; } - - - + + + /** * Returns true if this Shader has been deleted.
* @return true if this Shader has been deleted.
@@ -180,9 +180,9 @@ public class Shader { public boolean isDeleted(){ return programID == NOT_LOADED; } - - - + + + /** * Activates the shader.
*/ @@ -194,10 +194,10 @@ public class Shader { forceFixedShader(); //Not sure why this is necessary but it is. GL20.glUseProgram(programID); } - - - -//UNIFORM SETTERS + + + +//UNIFORM SETTERS /** * Sets the value of the uniform integer Variable name.
* @param name the variable to set. @@ -206,28 +206,28 @@ public class Shader { public Shader setUniformIntVariable(String name, int value){ return setUniformIntVariable(name, new int[]{value}); } - - - + + + public Shader setUniformIntVariable(String name, int v0, int v1){ return setUniformIntVariable(name, new int[]{v0, v1}); } - - - + + + public Shader setUniformIntVariable(String name, int v0, int v1, int v2){ return setUniformIntVariable(name, new int[]{v0, v1, v2}); } - - - + + + public Shader setUniformIntVariable(String name, int v0, int v1, int v2, int v3){ return setUniformIntVariable(name, new int[]{v0, v1, v2, v3}); } - - + + public Shader setUniformIntVariable(String name, int[] values){ ShaderVariable var = vars.get(name); if(var==null){ @@ -238,8 +238,8 @@ public class Shader { return this; } - - + + /** * Sets the value of the uniform integer Variable * name.
@@ -249,31 +249,31 @@ public class Shader { public Shader setUniformFloatVariable(String name, float value){ return setUniformFloatVariable(name, new float[]{value}); } - - - + + + public Shader setUniformFloatVariable(String name, float v0, float v1){ return setUniformFloatVariable(name, new float[]{v0, v1}); } - - - + + + public Shader setUniformFloatVariable(String name, float v0, float v1, float v2){ return setUniformFloatVariable(name, new float[]{v0, v1, v2}); } - - - + + + public Shader setUniformFloatVariable(String name, float v0, float v1, float v2, float v3){ return setUniformFloatVariable(name, new float[]{v0, v1, v2, v3}); } - - - + + + public Shader setUniformFloatVariable(String name, float[] values){ ShaderVariable var = vars.get(name); if(var==null){ @@ -283,9 +283,9 @@ public class Shader { } return this; } - - - + + + //TODO implement using ShaderVariable //TODO Test public Shader setUniformMatrix(String name, @@ -293,7 +293,7 @@ public class Shader { float[][] matrix){ //Convert matrix format FloatBuffer matBuffer = matrixPrepare(matrix); - + //Get uniform location int location = GL20.glGetUniformLocation(programID, name); printError(name); @@ -307,12 +307,12 @@ public class Shader { case 4: GL20.glUniformMatrix4(location, transpose, matBuffer); break; } - + return this; } - - - + + + private FloatBuffer matrixPrepare(float[][] matrix){ //Check argument validity if(matrix==null){ @@ -327,7 +327,7 @@ public class Shader { throw new IllegalArgumentException("The matrix must have an equal number of rows and columns."); } float[] unrolled = new float[row*col]; - + for(int i=0;i * @param shaderID @@ -355,8 +355,8 @@ public class Shader { return GL20.glGetShader(shaderID, GL20.GL_COMPILE_STATUS)==GL11.GL_TRUE; } - - + + /** * Returns true if the shader program linked successfully.
* @return true if the shader program linked successfully.
@@ -366,15 +366,15 @@ public class Shader { return true; // return GL20.glGetShader(programID, GL20.GL_LINK_STATUS)==GL11.GL_TRUE; } - - - + + + private String getShaderInfoLog(int shaderID){ return GL20.glGetShaderInfoLog(shaderID, logging).trim(); } - - - + + + private String getProgramInfoLog(){ return GL20.glGetProgramInfoLog(programID, logging).trim(); }