From 1d1f99605cb4fea810a9db73a067bfea38157f09 Mon Sep 17 00:00:00 2001 From: Song Minjae Date: Wed, 13 Jul 2016 21:48:14 +0900 Subject: [PATCH] Greek support, modular weather, command history for console window Former-commit-id: b72d0b018c084e80cf4fef77e1b1a81101d6daea Former-commit-id: 32da6a2998826de6519a901dcff7bf058f689b2f --- res/books/polyglot_test_2.txt | 29 +++ res/graphics/fonts/ascii_majuscule.png | Bin 2575 -> 21274 bytes res/graphics/fonts/cyrilic_majuscule.png | Bin 1463 -> 1742 bytes res/graphics/fonts/greek_ef.png | Bin 0 -> 934 bytes res/graphics/fonts/greek_majuscule.png | Bin 0 -> 2056 bytes res/graphics/fonts/han_johab.png | Bin 19732 -> 1320 bytes res/graphics/weathers/generic_light.png | Bin 0 -> 16031 bytes res/graphics/weathers/generic_skybox.png | Bin 0 -> 16356 bytes res/locales/jakanaJP/game.json | 2 +- res/raw/Creature_raw_doc.md | 46 +++++ res/raw/Creature_raw_doc.txt | 27 --- res/raw/creatures/CreatureHuman.json | 34 +-- res/raw/weathers/WeatherGeneric.json | 8 + .../{klankbeeld-freesound => }/.gitattributes | 0 .../ambient_forest_01.ogg | 0 .../ambient_meadow_01.ogg | 0 .../ambient_windy_01.ogg | 0 .../ambient_woods_01.ogg | 0 .../crickets_01.ogg | 0 .../crickets_02.ogg | 0 src/net/torvald/gadgets/HistoryArray.kt | 57 +++++ src/net/torvald/imagefont/GameFontBase.kt | 95 ++++++--- src/net/torvald/imagefont/GameFontWhite.kt | 9 +- src/net/torvald/serialise/WriteGameMapData.kt | 8 +- src/net/torvald/terrarum/COPYING.md | 9 +- src/net/torvald/terrarum/DefaultConfig.kt | 52 ++++- src/net/torvald/terrarum/StateInGame.kt | 72 ++----- src/net/torvald/terrarum/audio/AudioMixer.kt | 48 +++++ .../terrarum/audio/AudioResourceLibrary.kt | 31 +++ .../torvald/terrarum/console/CodexEdictis.kt | 15 +- .../torvald/terrarum/console/CommandDict.kt | 3 +- .../terrarum/console/ConsoleCommand.kt | 6 + src/net/torvald/terrarum/console/ExportMap.kt | 6 +- src/net/torvald/terrarum/console/GetTime.kt | 2 +- src/net/torvald/terrarum/console/LangTest.kt | 19 ++ src/net/torvald/terrarum/console/Seed.kt | 2 +- src/net/torvald/terrarum/console/SetAV.kt | 4 +- .../terrarum/console/SetGlobalLightLevel.kt | 4 +- src/net/torvald/terrarum/console/SetTime.kt | 6 +- .../torvald/terrarum/console/SetTimeDelta.kt | 6 +- .../terrarum/gameactors/AIControlled.kt | 2 +- src/net/torvald/terrarum/gameactors/AVKey.kt | 2 + .../terrarum/gameactors/ActorWithBody.kt | 103 ++++----- .../terrarum/gameactors/CanBeAnItem.kt | 2 - .../terrarum/gameactors/FixturesTikiTorch.kt | 2 +- .../torvald/terrarum/gameactors/LandHolder.kt | 8 +- .../terrarum/gameactors/NPCIntelligentBase.kt | 57 ++--- .../terrarum/gameactors/PhysTestBall.kt | 3 +- src/net/torvald/terrarum/gameactors/Player.kt | 6 +- .../terrarum/gamecontroller/GameController.kt | 4 +- .../torvald/terrarum/gamecontroller/Key.kt | 11 +- .../terrarum/gameitem/InventoryItem.kt | 8 +- .../torvald/terrarum/gameitem/TileAsItem.kt | 2 +- .../gamemap/{GameMap.kt => GameWorld.kt} | 9 +- .../terrarum/itemproperties/ItemPropCodex.kt | 3 + src/net/torvald/terrarum/langpack/Lang.kt | 3 +- .../torvald/terrarum/mapdrawer/Light10B.kt | 195 ++++++++++++++++++ .../terrarum/mapdrawer/LightmapRenderer.kt | 6 +- .../torvald/terrarum/mapdrawer/MapCamera.kt | 60 +++--- .../torvald/terrarum/mapdrawer/MapDrawer.kt | 2 +- .../terrarum/mapgenerator/MapGenerator.kt | 100 ++++----- .../mapgenerator/ThreadProcessNoiseLayers.kt | 12 +- .../terrarum/realestate/RealEstateCodex.kt | 6 +- .../terrarum/realestate/RealEstateUtility.kt | 4 +- .../terrarum/tileproperties/TilePropUtil.kt | 5 +- .../torvald/terrarum/tilestats/TileStats.kt | 6 +- .../terrarum/ui/BasicDebugInfoWindow.kt | 6 +- src/net/torvald/terrarum/ui/ConsoleWindow.kt | 47 +++-- src/net/torvald/terrarum/ui/UIHandler.kt | 3 +- .../terrarum/weather/BaseModularWeather.kt | 18 ++ .../torvald/terrarum/weather/WeatherMixer.kt | 155 ++++++++++++++ work_files/Controls.numbers | Bin 242389 -> 244343 bytes work_files/Controls.pdf | Bin 87375 -> 92975 bytes work_files/civil_settlement.tmx | 4 +- 74 files changed, 1067 insertions(+), 387 deletions(-) create mode 100644 res/books/polyglot_test_2.txt create mode 100644 res/graphics/fonts/greek_ef.png create mode 100644 res/graphics/fonts/greek_majuscule.png create mode 100644 res/graphics/weathers/generic_light.png create mode 100644 res/graphics/weathers/generic_skybox.png create mode 100644 res/raw/Creature_raw_doc.md delete mode 100644 res/raw/Creature_raw_doc.txt create mode 100644 res/raw/weathers/WeatherGeneric.json rename res/sounds/ambient/{klankbeeld-freesound => }/.gitattributes (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/ambient_forest_01.ogg (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/ambient_meadow_01.ogg (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/ambient_windy_01.ogg (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/ambient_woods_01.ogg (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/crickets_01.ogg (100%) rename res/sounds/ambient/{klankbeeld-freesound => }/crickets_02.ogg (100%) create mode 100644 src/net/torvald/gadgets/HistoryArray.kt create mode 100644 src/net/torvald/terrarum/audio/AudioMixer.kt create mode 100644 src/net/torvald/terrarum/audio/AudioResourceLibrary.kt create mode 100644 src/net/torvald/terrarum/console/LangTest.kt rename src/net/torvald/terrarum/gamemap/{GameMap.kt => GameWorld.kt} (97%) create mode 100644 src/net/torvald/terrarum/mapdrawer/Light10B.kt create mode 100644 src/net/torvald/terrarum/weather/BaseModularWeather.kt create mode 100644 src/net/torvald/terrarum/weather/WeatherMixer.kt diff --git a/res/books/polyglot_test_2.txt b/res/books/polyglot_test_2.txt new file mode 100644 index 000000000..3839d757b --- /dev/null +++ b/res/books/polyglot_test_2.txt @@ -0,0 +1,29 @@ +"APP_WARNING_HEALTH_AND_SAFETY": "" + +bgBG ВНИМАНИЕ-ЗДРАВЕ И БЕЗОПАСНОСТ +csCZ POZOR-ZDRAVÍ A BEZPEČNOST +daDK ADVARSEL-SUNDHED OG SIKKERHED +de WARNUNG-GESUNDHEIT UND SICHERHEIT +elGR ΠΡΟΣΟΧΗ-ΥΓΕΙΑ ΚΑΙ ΑΣΦΑΛΕΙΑ +en WARNING-HEALTH AND SAFETY +es ADVERTENCIA-SALUD Y SEGURIDAD +fiFI VAROITUS-TERVEYS JA TURVALLISUUS +fr ATTENTION-SANTÉ ET SÉCURITÉ +huHU VIGYÁZAT-EGÉSZSÉGÜGYI ÉS BIZTONSÁGI +isIC VIÐVÖRUN-HEILSA OG ÖRYGGI +it ATTENZIONE-SALUTE E SICUREZZA +jaJP 警告ー健康と安全のために +jakana けいこくーけんこうと あんぜんの ために +koKR 경고—건강과 안전을 위하여 +nlNL WAARSCHUWING-GEZONDHEID EN VEILIGHEID +noNB ADVARSEL-HELSE OG SIKKERHET +plPL UWAGA-ZDROWIE I BEZPIECZEŃSTWO +ptBR ATENÇÃO-SAÚDE E SEGURANÇA +ptPT ATENÇÃO-SAÚDE E SEGURANÇA +roRO ATENȚIONARE-SĂNĂTATE ȘI SIGURANȚĂ +ruRU ПРЕДУПРЕЖДЕНИЕ-ЗДОРОВЬЕ И БЕЗОПАСНОСТЬ +svSE VARNING-HÄLSA OCH SÄKERHET +thTH คำเตือน-อนามัยและความปลอดภัย +trTR UYARI-SAĞLIK VE GÜVENLİK +zhCN 警告ー健康和安全 +zhTW 警告ー健康和安全 \ No newline at end of file diff --git a/res/graphics/fonts/ascii_majuscule.png b/res/graphics/fonts/ascii_majuscule.png index bb2adcc074fce64921372900a2038b58eb5fcba3..1476cf22c00dd4de4dc2026406b086b5c3f01144 100644 GIT binary patch literal 21274 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 Y{80z_Kv?Mp_twyOgM~qXo^#}X02;OiD*ylh literal 2575 zcmV+q3h?!bP)3aO1(H`gQ{Ht!`V~a?COF``6=~>tl|y+W(%`!_RS=JK{1c}tRW&~_T<+9qXim#t zEIB!r+!p+&@fn}-8K3bPpFs>X&=pX9;~EtKNu(`G1P|^lBwJP6Q;<9Z*9OM?@o1l(t|*g9Cc76O#6V zL=*H829)Er4ZhO@b!d^65tpisNbDgIg>vIpR%q-Sow(H!BX1aKW^o@PQR6y z*yTPczab=cA#edpv|?F)fp54-Ec~BFMjGG@3V88_GuJqOb>r_7ie1@&Dp+GcrjoH# zj9Z>&=&^JPasUM<3P^`pyN)#uqVm|% zM!oVt;*1gT-O{xIr8uAkK-m|vg%XmX#znc$2qd2SU-zvD8U&UBE%)%(4$04?^Gr|A z&NL!HbEFsrpsoi6P+ zIhvoFsz)A39r+N?bhULp=f@@mF~Nw|HXzN1AVkOaU0e~kKDA`DK}M)a1tZIdctx-? zw7x^|1G+YCs%0XY*;dafVr%BRnFvBp=;h;nEd@jNa{p2tOr zT;mnb;|dlD?32YC^SI$e!F#dw1AQ-+meB(KltKLG{g5^g_YuN?^h-ehC0e%-eqh?R zvQ<}W%N%Vgd8kkBR0%&V8*y#%Dx$n+v9xQum@OOWF)ggLX+#DZn${M0XonS{-U%-Y zR5)~Zuotwfh83Y{q!SGq7?8jVf^o8M8vdV*hpU0B`=Uk`X+b$Y{WK{arM*JyCvlEr zdIBfTd~*)-_#Bx%l#dwa;RTd70h=rYdQt8L1?1VVrJG;AiG2WDoY1Q$F*V9xc&iWU(RlJdZXx9cWcuX!CDQR&J|G>FGn9;G zgVQ0?$@&=?B>?h(-H1*!u8R$wA+G{TU`2ucq!Q&W8u`-=T2}T5CJhL9OzITnk~qr?HE2Mdr^pa8_l4+tKthT-Z0 z2XPKwe1QZY92!v$S}jXPE+8mjiY1OHf$oVtkLhOcXZHh2>>KFg7lw>Jj>T*6-<{C^ zE6C2l=5;Uai$>xa=cl@sQ4>%FzafKdI~05!P=+C?7#;cKS&upwks$aPP>LbhOkcnW zQbw{zK(Gu}7D$wjbp~hH%#m!Ni`_NFvwiX-D*2NN>K=(blvrbO6crwX_D@0<6h@=XLjpZv0hI+1al zG<$*@16PXgL9IDyZg-cRWrrPYTTb3U=CCX4(w!{ttORj?C)*g@`_&Bx}K8_{61@w#88Uzw$)M|!ukXAbR1J}sN zf$HnRTnt}=*oz8>&K7+0iajj;jZLj>tAMtc5pQp95kNlAzg~olz*HI1R4V*HP+cSA zK&M}EdQTS;0FzDVzWCmu&mnM{eNF@D^@NI|D2dD~6yk#JngU(zp(}Q7j&iSmO^7#| z9vvKuot~rA>iU9?0TGWWpCd)8n5>lomeYPr0^S z&za9O-GCXrIcK`*1~l%17V--`qPB{Yot|z$pI^|dGfpVEwIak#u#+M((h- z+AB^fn2Md$1?g-jYiw!5$xctj?#u!-#}`cWnts5lHv$+9EL|AgXuPmT7zFtj;i7TO?kuEe}Wv)bC#p zI9po;Uau`D3TUe6A=$QOJzra_b7uZrz{zs2f6dnx)LOqn5_LUWTmFH6&;2VTaQ*#y zZBYdL8vlA8-`y9F)VfWc;Zc%LEpPb0p2z9It(x>1wS2G=LEN0jd1qgg=w*rOqcS9( l$li}E_Vx4uN>Cu|;h)>Y+O;%lw8H=Z002ovPDHLkV1hRvuQvby diff --git a/res/graphics/fonts/cyrilic_majuscule.png b/res/graphics/fonts/cyrilic_majuscule.png index e284256b979dabcd256470866c0950f6469b103a..50a6da46501bdfbce9a59e26be73688ac2648b78 100644 GIT binary patch literal 1742 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 diff --git a/res/graphics/fonts/greek_ef.png b/res/graphics/fonts/greek_ef.png new file mode 100644 index 0000000000000000000000000000000000000000..928d49059301f88e66bf27d7183695b549e84a7c GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^0YEIm!3-pI*}R@IFfcO&_=LFr|Nphd6rldwj@IGT%NUAaz-nJ~w3 zbt~VBR%+3-%yW)Z<000Bj1Bb{em5Rw^s#!h%T3;Rbzd4}ybbMUBGdLwEAXt3_ie4BI z05pYuB;ujep?75kMW#4C&B0Ywu}A#S86y4iqhX0i7H)KGB8X3GPzY`u5KboX&)ZJJz3Ii{)GdyIKY=xsNVv+_f+8P@S=TgO}{gY}$TX)QPl%NXc^)WR{I`v`#H}JJV zzT+aEJft44L5Udv7~=#P@{)m~&}WmcwQt zK+SMd=p79sve2NUr^?a{RqB#8@k-}@xs)I`W%;K+*+@1L{BvNGm2}Njn%<5L1I(8*a9?)dSMsl*wNuym}t8KfI)Ol<;!D2%h}{*I0u>Jcp4W>dK* zl_Jw2I0a0)f~=yo=pJ6>SU)G%cdW+C7>4;aBqg6&pleKM!jAP$ihpne48AQ}vbUmb z9z5T50sR!sn%8{x*hu>n)HlpwcCUhYxy({<^u{>2W zlnH+4<*|t1T=wBf8sy~qJ7JGuU7B8_+MM!Qq{{-X7jAy|;~3CGsHCJQVe(CF$CP7J zas^0>5|V1t=01SV>xyG1&tN?8Hik~38%5pAN%;KgqE{8xc58`@?QHMZXXp;Ol_W$AiCr=ZtiN+C$ZCB%rm zrZFGEqS>3R;uk_E3wFX7%l}9-+!E=t7x+FYfQ(?6RP|>dcTqqeiXQZDhQz(MLjryM zN7~P?ySRcsh0Ae3B!A^0>mcfpmM9J$?kJv<;uxv1rOj8D=BDH)f*~hD2P>Us1kfi^ z*C}}_ncM2jN3xTv^T#Lc9m3_8{%}ylas|=pFY8nChR+&JybJg#W70D#V{P7Ds~f@v z_*@NNX!@S#61ulv^8(Dvrt zKswMfqdO7r4X51goK4ite?0(7yY&iza?9IOXMPHSDhG#} zWFkT46jbD#0zmsT>v;LIWzw?dRl2CT5E`NRpES)|rB_A9<@fdiewh|EOm4^i@d>)d z2sbd6x|R2)>o06<`%$+`KBxfOSy=!8 literal 0 HcmV?d00001 diff --git a/res/graphics/fonts/han_johab.png b/res/graphics/fonts/han_johab.png index 351d61d73a3068da4c60bcaa3b139741bad06395..9793c376e4307e0fb2790a1f3703954ff4ba4f1d 100644 GIT binary patch delta 1301 zcmV+w1?u{gngOT^kR^XmOjJex|NnP)cmMzY)zTKs00003bW%=J|Nj8j$_+sP00hfP zL_t(|+U;F|mYXmPv-tmy-peI=KA!M6Ud=|Y^43GOiOGqOHX3HJJ<0+N`?Xkn85Sf$ zhBaEXAPNk$%ablPkSy2HZFFp3e*mmrBLE==!xoB(W(!8I5tDx{#uhwoAbola*^lTR zTg31em>VI6h(Q@A)!9^H=&7UWOU!ga@14ZNRbpfmjTe0~Vs;=i7g4$7GBXN#A2eb# znk`z1fn3%PAf{nrtVR(=u!_>Rtjx?T_Y(tbYm-x72ihdxMxfF3O_Qi*xtAK7i7_!I z<|Z>SrI{ELV`6`L%zBLV80#_CW30zmkFg$OJ;r*BSJz%$Z(b7EzFBz0)XM@B;}PQ# z(>HFc$P^#glw=a+Q4gbai;3pnVg=0x+4dFGZOlA~0VsX|F_8!|z(ABs*n-h3#AJ(= zZXI_(`t%sfx4Mw%#_K2u!Jm6#bSbUlq&}OZgNQ9OswjUmtNufFo<ENRc_S+)vD25W%!p zQRd9|3?4<(x2(ua=tbl|wJ3gdVoZ$nn2*w9wA0pO`ecV+sK@ln z4ywmkb{Ky?uAePCSa$I0+N*1S^Zgt`!o(b3OeV%7#v{g)uj`duujG0q*DJYR$@NOE zS8~0Q>y=!V^CJrrV`46U-!(CwW4yXHF($^uSdaM>Jw`iiJ?2z)s00Iz>d1O?J?4Jd z0f1!(%MO+uyt?-4+Nm$I2kbo3FjjQc+(M6&oMZePlT*r zGsk%H^{3KBO8SY(_o@l=J%6kh4QsP4guq10oA5J;!73`|HXJ0lo_wQ5!Kq zYbSq3I-O&pIR8Q=NFZt|_oiLRd@s#0dkH$AJ|&^>9rl?hkWSEqm?WSg=KN9uw`|f; zmID;NOXw&DRJ#FHG4JvL=|Ab7Yyp?$xRA?*T-IZ($2{+wugaR%V~)S|T8}A+u^v+p z6Jb5(kQh(C#pG+*p&U0)SY0>B4$Z6Uc*K9|xgWRmLd@`j`eOk5ih5)fF!G`MM8g*1!KRD8M47obU00q5km!59@+p4+ zar#deLG-;R!$(AzDFVoCVC6^zq5xxpCX`+YG&=ho-D$m?44)>a9->lm9DIn;}}Lj|53Skxu2psn)w8YO1|@H=dTyL z`{UZ*V@!;RF)=2_#F!WpV`5Cqa|M5y`_suH@=%uuz4=T98EuOWK}Iu!uk!Y{CPjwC zl!^=>#2g7Ss>rknGOEaoZAna%A`|B~lZu9SB*>^D(Q=@UMdlAy*)tK2Nb?P^00000 LNkvXXu0mjf&!=bk literal 19732 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 diff --git a/res/graphics/weathers/generic_light.png b/res/graphics/weathers/generic_light.png new file mode 100644 index 0000000000000000000000000000000000000000..da689f9188c927af6882c647080cdbf84c428362 GIT binary patch literal 16031 zcmeI3e{9_38ONQnO(XnN+pPp`#k-c#LVf;m=ex7#T$@bHO-9n9u0H$q#p|7Y zJv+_a4Rws7L6}BMt3frDLN%r#3Z+_CRwxzQSm}N+6|x^l6-_rJDh+L8Q;{~d(d@PF z*L#;s-)bODlU^&iJbC?np67i(&+F&xKRmf+;Fc@euWhF&>Wcop#2`gox*ytYAD;(5 zhgbf+7yh|4*Ei}=)MX32-!|&od#<4U z;L<6OHm%OUJ4as((5BuQxLr(g$y_fOGy6(;u(mWXq?I;lk{;-aw<`r12FLI`&y3F(pK8oJlc16mA57>(z7Iw}QuF%}ZU6|}(dBFjlE z&oLY?^PDVjbma)d+o7f8bweIZ++0Zq|LY8lxo%Eo*@=mX;6x~B=hG}NNfOHmtROH@ z!8k?BRSS&eEGY-6#z_E2%bPjZv@P0;tETL6w=)p%64j2%y0W=iBFm|;gB00 z5HHG{B!~H%;3vl+LCVUe7)iMMb=6goC{czNhJ=tT^0F94qcmunND{o`J;_F&;?v*hKjDqhMmu< zZrseOX~5>Jw8GX0>xsO=CzEo&<+v(bYJb9?xd~^Uk^~?MQHe1$Ltw(;sK`hmF~p?8 zd`QssaM;iy{%&Y=pB1_~PZ+w~BXwJY;p>%%X&}r&MobJ^49~-qDi;$NO*djdl_IfJ zO0OnDg3U^FTi%2%T+JYwY87G{AL3Oh#E3B!Rv{AQnUn^rpy`spX~2LJNL5p`2s0~H zpXu$1VpGAqDy{{a8%OJV!f&=YHSYkgm2?KGy`jmy ztGA}aj84@WqINlCoGM70#$>q3|lBXBSNcZF!#YX6so z@Q|1DYh$XF26~*WuB|%o|5Uq+>xraxjV-WzH8ys}YPX%;NfqxtNrqh*b_CV$e!RlY z8msS`vVO$trkQbH9~C%wz`JR9R9w;1&90*tc12G&yVgC2Ez^w)m26GJh?jRWSH2@z z3!ghcJR*uAQDK{hn?2T;1&|p@nDCCo@xBiP_-$PAYChG{b+qmZVfxv8KV-b(SFRQE zh~Ss9JPIE`;Ij`~d-!Rra_u|lLpJIQ`j7*o;Ybpc2G%CHu!v9r!G+Sm+5{IC5h@_K zP#Rd9;KCw81q2sL18WmpSVX9R;6iC&ZGsDn2o(@qC=IMlaA6Ul0)h*rfwc)PEFx4u zaG^A?Ho=8OgbD~Qlm^x&xUh&&0l|gRz}f^C77;2SxKJ8co8ZDCLIngDN&{;XTv$Y? zfZ#%DU~Pg6iwG4ETqq5!O>kimp#p*nrGd2xE-WHcKyaZnur|SkMT80nE|dn=Cb+PO zPyxY((!kmT7ZwpJAh=K(SexL&B0>cO7fJ(bUl3P&{dHns!FPx!;LF0F8etxSFB;QY z-(ZrWO4n1=UE3(?y&3rTj}$e|QPkTTDN5c=QH$)IUpjs>e4%+?f1-P+aOzLDuYcer z`to;oPp7|o?5EQ+@#BZCd!gqiOZv|Z^F1#2?1|W9;&12vb;D)eaptPU$*UJWG4EAw zVSE2ap3I4xzxKq(rWRj0@Z04Zz~m8^|La@df65M-&4x#SG6TR zao5VkJ@i*jADKS6W8uCBpL-;5^;mdbVBLeMGrt-<^0OZ=I}O~wjJ&yU$+qsP+ur)( z=-aRBGr#-I`X9ae)rS^*`dh#F`as*gD<6AC*m2GN?Zc(-SsmNY?8xny6owBWk_YvVg7M%UeO_Gx{!a^lp{UCcjjc`eyyy!&_u)A7x) z5m;)z%$$03`uW4b6)RTU*>%2+qGo0;q3-_m*5~ec|E34LSIGNU4I~cqY`ptFZ7G>j literal 0 HcmV?d00001 diff --git a/res/graphics/weathers/generic_skybox.png b/res/graphics/weathers/generic_skybox.png new file mode 100644 index 0000000000000000000000000000000000000000..15762dab423fedee9b31f6dd3456ee837d224602 GIT binary patch literal 16356 zcmeI3dvp_38o-CgB6O+3g3Cj|7(pI7otY%lWX3e5G|*NWsHOHHTVOgfNrxtxn3=Yr z)dPZ+mo5mxslt}s^;GGK?jFl7vQYM*zyitv5egzG`|4H}%9~QpV)stcG`VTYut(3? zv**k`ZIbVP_xrwkf8V{|%=|Gcb7o~ECX7x%5F{}x)1HeUgWd(d`wr|2K0iNEa|wJ6 z@?{oD2=e1$%6}i^&CMeb#2OIt3gtpaHqDBjB!&}9_@scx2Sx*3YQV>^WxT8_;a!3^ zMSpqMpY%F`OVJmQ4&32O=SzjmDnCD`YE~XwRmM`BKGl|B4bZ@WhnE>$z~lBxbRb0^ z^h<-^N;jt01&7FGDf%=epsvu7qe~b4ypBvtMp=R&bY?1vAT34%`Gn4Z6C{RH7=fcW zK@&J_z;#_sZ%Y8btbWc(=h|mR+bm5Q<`m5RNXcB^}Jz_HyyedT_4aBUom@owJ3du0jO5pe^9oH!iarg7)%@x-;1 zm6nqJq;2ZUbC6ivu1xD`Sf zvVyhJ>3*J(MSq?sx^1CdmJ>#=OHU8(D%~Up!wOy{ACs+EtWhN65r4d$k$D@~k;y1d zg1cZ z85!lHdzaDaqFeMkM2@!^tysM7xK?(NEmwA1nwRAz09lHH4^j|3kkc3!+#6Q71sgz} z#0ea2WGTu?l$cSo#o|Owl-Y!qBr`b55e5n;SmpdvR!ljDz$h{k#Z#~sjuE|pyUozb zv9we4dl=a!co-Lt`MfSG7U_%xQWEcQ&{a#zL+n2*>rjp4L>9P@WP;>a6GvEpdkf2>1YxF72Dcbc zmUCKohDx@SlyKodQO;6GOT1D_QuN_k(p{aw(C%gpmL!^C zl`?H(m6Of`3Q%ukTCrwA&vf1!f{_0x^WI}rmh#@a)rpX+;Hci6NTO4&Wc+-Z3!Jrk zD`FwPuwiU~_$LZb3Z7fH@I6u?F%{o45f&riq>@X(Cg&}vi6A(X;z$nc#bkmdlbwWt zAi|0MZxa!>)c!9Mp&$>%XGW$gT;EFI1|jyF57FY`{SSchjJCnMSK)O^fbs8m*2sjaWY8 z6=WN@9tI~G(;a1{+{}gUNald&4&Ihbl19>s#dgP9xFE|jaNM}*+jEYu4gK)|yP*8T9)<3bls_z(IWS+)x zhD!wytk!VBJX9nNmkJJ=ss7M+v6+p0B!v*tDku+Q?fMB(T3+ACBX}DAX!D%_blyhB_GUKVcr_ChLn(OAc3<~k6hY65~RS%x4To#6W$1S!W6*=1g1If53r$2X7^Q{hSZ9EAQZ^vuEOnb3kGJ$cJn9e)>F~yMBhT_L0Q;Y^L^u zsU1H$yt<(1XEPHgItN@o^3oe)O@Ds;DdWS}<~}xe!$$wfYoottUplwnlwZ8suJ5-= zxV=xR&L2@Mv{Wy4qNl|RAMLdbvCa6rIrG)0M{XW->v-*ZJJSX&=~Go_tnZll_Vi;J z-e_?P zZe2aPviQq?9opBrYIuG|L-XwkgO~c}PI&!=_2xO3?l)BoYS?z}w7h9{L5iokrm@ii z+U*fn|8d`*x_Qd)z(3y_dvW=YqaBr22Vvgw;zun9f5$YwR9(|{cI+Gbk2!Z{pDk!U zx1gVxShBWWqxwB(xS);q`$hjkbX=%ICvgfmZFa5)&Pu&Y&UO#!qesrSe zxS`B>=@UcZ^8Mnj&XzgJjm>BBrLTTnEtx<3cyQa5eE+<*QP-O$882>nvw5CvEv-x> z)B@}lY4O(EmnIqB7wK_hc6V++H61_sCGvKC(YGks=gf^=`0C8H+5NfkYacnedwYHQ zlBs_^HT$*Cs_icOjTHg>cEGxC#lUs1wBEVeI<#qo`S9?eP3_}eX&rj8>ArUhFAwF` z)b>53TefP!n%2F#cRt8in~Kjirv*Gcqgd>asvtm(7t?@wE>^gk`gL)-uW literal 0 HcmV?d00001 diff --git a/res/locales/jakanaJP/game.json b/res/locales/jakanaJP/game.json index 9dc0922b0..c8e097621 100644 --- a/res/locales/jakanaJP/game.json +++ b/res/locales/jakanaJP/game.json @@ -4,6 +4,6 @@ "COPYRIGHT_ALL_RIGHTS_RESERVED": "ぜんちょさくけん しょゆう。", "APP_ADJUST_YOUR_MONITOR": "このゲームは、てきせつにちょうせいした モニターから さいこうのプレイができます。ちょうせいして いなかったら、プレイするまえに ちょうせいしてください。", - "APP_WARNING_HEALTH_AND_SAFETY": "けいこくーけんこうと あんぜんを ために" + "APP_WARNING_HEALTH_AND_SAFETY": "けいこくーけんこうと あんぜんの ために" } \ No newline at end of file diff --git a/res/raw/Creature_raw_doc.md b/res/raw/Creature_raw_doc.md new file mode 100644 index 000000000..3412e1aa5 --- /dev/null +++ b/res/raw/Creature_raw_doc.md @@ -0,0 +1,46 @@ +Creature raw documentation + +## Physical properties ## + +* 1 m = 24 px +* mult: Multiplier. e.g. 1.0, 0.85, 1.25, ... + +|name|unit|description| +|----|----|-----------| +|baseheight|pixels|Base height for hitbox. Also used for attack point bonus calculation| +|basemass|kg|Base mass for creature| +|accel|px per TARGET_FPS^2|Acceleration for walking| +|speed|px per TARGET_FPS|Walk speed| +|jumppower|neg. px per TARGET_FPS^2|Self-explanatory| +|scale|unit|Creature body scale. Mass/strength/accel/etc. will be changed accordingly, hence the prefix “base” for some raw tokens| +|dragcoeff|unit|Drag coefficient| +|speedmult, accelmult, jumppowermult|array of percentiles (Int)|Variability factor| +|physiquemult|mult|Breadth variation for mobs| + +## Creature properties ## + +|name|unit|description| +|----|----|-----------| +|strength|unit|Strength value, no significant unit is given. The value for regular human is fixed to 1 000| +|encumbrance|kg or itemcount|Capacity of carrying| +|basedefence|unit|Base defence value of body. Sterner body composition (material) == higher value| +|armourdefence|unit|Current defence point of armour worn| +|armourdefencemult|mult|Bonus point for armour defence| +|toolsize|kg|Base tool size for the creature. See MECHANICS file for more information| + +## Aesthetic properties ## + +|name|unit|description| +|----|----|-----------| +|luminosity|30-bit RGB (Int)|Self-glow. Set to 0 for not glowing| +|name|String|Given (perhaps customised) name| +|racename|STRING_ID|Racename token in language CSV| +|racenameplural|STRING_ID|Racename token in language CSV| + +* Note: luminosity uses customised 30-bit RGB. The format specifies ```1.0``` luminosity of white (```#FFFFFF```) be ```0000_0011111111_0011111111_0011111111```, and can hold luminosity range of 0.0-4.0 + +## Flags ## + +|name|unit|description| +|----|----|-----------| +|intelligent|Boolean|Whether the creature can speak and talk.| diff --git a/res/raw/Creature_raw_doc.txt b/res/raw/Creature_raw_doc.txt deleted file mode 100644 index 67a29c1ce..000000000 --- a/res/raw/Creature_raw_doc.txt +++ /dev/null @@ -1,27 +0,0 @@ -Creature raw documentation - -== string values == - -racename(plural) : Racename token in language CSV - -baseheight : base height for hitbox. [px] (24 px == 1 metre) -basemass : base mass for creature. [kg] - -== number values == - -strength : strength value, no significant unit is given. The value for regular human is fixed to 1 000. -accel : acceleration for walking. [px / TARGET_FPS^2] -speed : walk speed. [px / TARGET_FPS] -jumppower : self-explanatory. [-px / TARGET_FPS^2] -scale : creature body scale. Mass/strength/accel/etc. will be changed accordingly, hence the prefix “base” for some raw tokens. - --mass : variability factor. [array of percentiles] - -encumbrance : capacity of carrying. [kg] -basedefence : base defence value of body. Sterner body material == higher value - -toolsize : base tool size for the creature. See MECHANICS file for more information. - -== boolean values == - -intelligent : can speak and talk. diff --git a/res/raw/creatures/CreatureHuman.json b/res/raw/creatures/CreatureHuman.json index 85d309e35..e5ff88986 100644 --- a/res/raw/creatures/CreatureHuman.json +++ b/res/raw/creatures/CreatureHuman.json @@ -1,28 +1,28 @@ { - "racename" : "RACE_HUMAN", - "racenameplural" : "RACE_HUMAN_PLURAL", - "baseheight" : 40, - "basemass" : 60.0, + "racename": "RACE_HUMAN", + "racenameplural": "RACE_HUMAN_PLURAL", + "baseheight": 40, + "basemass": 60.0, - "strength" : 1000, - "strengthmult" : [100,100,100,100,100,100,100], + "strength": 1000, + "strengthmult": [100,100,100,100,100,100,100], - "accel" : 0.32, + "accel": 0.32, - "speed" : 3.0, - "speedmult" : [100,100,100,100,100,100,100], + "speed": 3.0, + "speedmult": [100,100,100,100,100,100,100], - "jumppower" : 4.3, - "jumppowermult" : [100,100,100,100,100,100,100], + "jumppower": 4.3, + "jumppowermult": [100,100,100,100,100,100,100], - "scale" : 1.0, - "scalemult" : [100,100,100,100,100,100,100], + "scale": 1.0, + "physiquemult": [100,100,100,100,100,100,100], - "encumbrance" : 1000, - "basedefence" : 100, + "encumbrance": 1000, + "basedefence": 100, - "toolsize" : 15, + "toolsize": 15, - "intelligent" : true + "intelligent": true } \ No newline at end of file diff --git a/res/raw/weathers/WeatherGeneric.json b/res/raw/weathers/WeatherGeneric.json new file mode 100644 index 000000000..ab55c383d --- /dev/null +++ b/res/raw/weathers/WeatherGeneric.json @@ -0,0 +1,8 @@ +{ + "globalLight": "generic_light.png", + "skyboxGradColourMap": "generic_skybox.png", + "classification": "generic", + "extraImages": [ + + ] +} \ No newline at end of file diff --git a/res/sounds/ambient/klankbeeld-freesound/.gitattributes b/res/sounds/ambient/.gitattributes similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/.gitattributes rename to res/sounds/ambient/.gitattributes diff --git a/res/sounds/ambient/klankbeeld-freesound/ambient_forest_01.ogg b/res/sounds/ambient/ambient_forest_01.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/ambient_forest_01.ogg rename to res/sounds/ambient/ambient_forest_01.ogg diff --git a/res/sounds/ambient/klankbeeld-freesound/ambient_meadow_01.ogg b/res/sounds/ambient/ambient_meadow_01.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/ambient_meadow_01.ogg rename to res/sounds/ambient/ambient_meadow_01.ogg diff --git a/res/sounds/ambient/klankbeeld-freesound/ambient_windy_01.ogg b/res/sounds/ambient/ambient_windy_01.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/ambient_windy_01.ogg rename to res/sounds/ambient/ambient_windy_01.ogg diff --git a/res/sounds/ambient/klankbeeld-freesound/ambient_woods_01.ogg b/res/sounds/ambient/ambient_woods_01.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/ambient_woods_01.ogg rename to res/sounds/ambient/ambient_woods_01.ogg diff --git a/res/sounds/ambient/klankbeeld-freesound/crickets_01.ogg b/res/sounds/ambient/crickets_01.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/crickets_01.ogg rename to res/sounds/ambient/crickets_01.ogg diff --git a/res/sounds/ambient/klankbeeld-freesound/crickets_02.ogg b/res/sounds/ambient/crickets_02.ogg similarity index 100% rename from res/sounds/ambient/klankbeeld-freesound/crickets_02.ogg rename to res/sounds/ambient/crickets_02.ogg diff --git a/src/net/torvald/gadgets/HistoryArray.kt b/src/net/torvald/gadgets/HistoryArray.kt new file mode 100644 index 000000000..433d2bb3f --- /dev/null +++ b/src/net/torvald/gadgets/HistoryArray.kt @@ -0,0 +1,57 @@ +package net.torvald.gadgets + +import java.util.* +import java.util.function.Consumer + +/** + * Simple ArrayList wrapper that acts as history keeper. You can append any data but cannot delete. + * Created by minjaesong on 16-07-13. + */ +class HistoryArray(val historyMax: Int) { + + val history = ArrayList(Math.min(historyMax, 256)) // 256: arbitrary-set upper bound + + fun add(value: T) { + if (history.size == 0) { + history.add(value) + return + } + // push existing values to back 1 index + else { + for (i in history.size - 1 downTo 0) { + // if history.size is smaller than historyMax, make room by appending + if (i == history.size - 1 && i < historyMax - 1) + history.add(history[i]) + // actually move if we have some room + else if (i < historyMax - 1) + history[i + 1] = history[i] + } + } + // add new value to the room + history[0] = value + } + + /** + * Get certain index from history. NOTE: index 0 means latest! + */ + operator fun get(index: Int): T? = + if (index >= history.size) null + else history[index] + + /** + * Iterate from latest to oldest + */ + fun iterator() = history.iterator() + + /** + * Iterate from latest to oldest + */ + fun forEach(action: Consumer) = history.forEach(action) + + val latest: T? + get() = this[0] + + val oldest: T? + get() = this[history.size - 1] + +} \ No newline at end of file diff --git a/src/net/torvald/imagefont/GameFontBase.kt b/src/net/torvald/imagefont/GameFontBase.kt index 4dee7436f..39891bd1c 100644 --- a/src/net/torvald/imagefont/GameFontBase.kt +++ b/src/net/torvald/imagefont/GameFontBase.kt @@ -55,34 +55,22 @@ constructor() : Font { } private fun isAsciiEF(c: Char) = asciiEFList.contains(c) - private fun isExtAEF(c: Char) = extAEFList.contains(c) - private fun isHangul(c: Char) = c.toInt() >= 0xAC00 && c.toInt() < 0xD7A4 - private fun isAscii(c: Char) = c.toInt() > 0x20 && c.toInt() <= 0xFF - private fun isRunic(c: Char) = runicList.contains(c) - private fun isExtA(c: Char) = c.toInt() >= 0x100 && c.toInt() < 0x180 - private fun isKana(c: Char) = c.toInt() >= 0x3040 && c.toInt() < 0x3100 - private fun isCJKPunct(c: Char) = c.toInt() >= 0x3000 && c.toInt() < 0x3040 - private fun isUniHan(c: Char) = c.toInt() >= 0x3400 && c.toInt() < 0xA000 - private fun isCyrilic(c: Char) = c.toInt() >= 0x400 && c.toInt() < 0x460 - private fun isCyrilicEF(c: Char) = cyrilecEFList.contains(c) - private fun isFullwidthUni(c: Char) = c.toInt() >= 0xFF00 && c.toInt() < 0xFF20 - private fun isUniPunct(c: Char) = c.toInt() >= 0x2000 && c.toInt() < 0x2070 - private fun isWenQuanYi1(c: Char) = c.toInt() >= 0x33F3 && c.toInt() <= 0x69FC - private fun isWenQuanYi2(c: Char) = c.toInt() >= 0x69FD && c.toInt() <= 0x9FDC + private fun isGreek(c: Char) = c.toInt() >= 0x370 && c.toInt() <= 0x3CE + private fun isGreekEF(c: Char) = greekEFList.contains(c) @@ -121,37 +109,65 @@ constructor() : Font { private fun wenQuanYi1IndexY(c: Char) = (c.toInt() - (0x33F3 + 0x4A)) / 32 private fun wenQuanYi2IndexY(c: Char) = (c.toInt() - 0x69FD) / 32 - override fun getWidth(s: String) = getWidthSubstr(s, s.length) + private fun greekIndexX(c: Char) = (c.toInt() - 0x370) % 16 + private fun greekIndexY(c: Char) = (c.toInt() - 0x370) / 16 + private fun greekEFIndexX(c: Char) = greekEFList.indexOf(c) % 16 + private fun greekEFIndexY(c: Char) = greekEFList.indexOf(c) / 16 + + + private val narrowWidthSheets = arrayOf( + SHEET_ASCII_EF, + SHEET_EXTA_EF, + SHEET_CYRILIC_EF, + SHEET_GREEK_EF + ) + private val unihanWidthSheets = arrayOf( + SHEET_UNIHAN, + SHEET_FW_UNI, + SHEET_WENQUANYI_1, + SHEET_WENQUANYI_2 + ) + private val zeroWidthSheets = arrayOf( + SHEET_COLOURCODE + ) + private val cjkWidthSheets = arrayOf( + SHEET_KANA, + SHEET_HANGUL, + SHEET_CJK_PUNCT + ) + + + override fun getWidth(s: String) = getWidthSubstr(s, s.length) private fun getWidthSubstr(s: String, endIndex: Int): Int { var len = 0 for (i in 0..endIndex - 1) { - val c = getSheetType(s[i]) + val ctype = getSheetType(s[i]) if (i > 0 && s[i].toInt() > 0x20) { - // Kerning + // Unihan-hangul Kerning val cpre = getSheetType(s[i - 1]) - if ((cpre == SHEET_UNIHAN || cpre == SHEET_HANGUL) && !(c == SHEET_UNIHAN || c == SHEET_HANGUL) + if ((unihanWidthSheets.contains(cpre) || cpre == SHEET_HANGUL) && !(unihanWidthSheets.contains(ctype) || ctype == SHEET_HANGUL) - || (c == SHEET_UNIHAN || c == SHEET_HANGUL) && !(cpre == SHEET_UNIHAN || cpre == SHEET_HANGUL)) { + || (unihanWidthSheets.contains(ctype) || ctype == SHEET_HANGUL) && !(unihanWidthSheets.contains(cpre) || cpre == SHEET_HANGUL)) { // margin after/before hangul/unihan len += 2 } - else if ((c == SHEET_HANGUL || c == SHEET_KANA) && (cpre == SHEET_HANGUL || cpre == SHEET_KANA)) { + else if ((ctype == SHEET_HANGUL || ctype == SHEET_KANA) && (cpre == SHEET_HANGUL || cpre == SHEET_KANA)) { // margin between hangul/kana len += 1 } } - if (c == SHEET_COLOURCODE) + if (zeroWidthSheets.contains(ctype)) len += 0 - else if (c == SHEET_ASCII_EF || c == SHEET_EXTA_EF || c == SHEET_CYRILIC_EF) + else if (narrowWidthSheets.contains(ctype)) len += W_LATIN_NARROW - else if (c == SHEET_KANA || c == SHEET_HANGUL || c == SHEET_CJK_PUNCT) + else if (cjkWidthSheets.contains(ctype)) len += W_CJK - else if (c == SHEET_UNIHAN || c == SHEET_FW_UNI || c == SHEET_WENQUANYI_1 || c == SHEET_WENQUANYI_2) + else if (unihanWidthSheets.contains(ctype)) len += W_UNIHAN else len += W_LATIN_WIDE @@ -375,6 +391,14 @@ constructor() : Font { sheetX = uniPunctIndexX(ch) sheetY = uniPunctIndexY(ch) } + SHEET_GREEK_EM -> { + sheetX = greekIndexX(ch) + sheetY = greekIndexY(ch) + } + SHEET_GREEK_EF -> { + sheetX = greekEFIndexX(ch) + sheetY = greekEFIndexY(ch) + } else -> { sheetX = ch.toInt() % 16 sheetY = ch.toInt() / 16 @@ -406,6 +430,10 @@ constructor() : Font { catch (e: ArrayIndexOutOfBoundsException) { // character that does not exist in the sheet. No render, pass. } + catch (e1: RuntimeException) { + // System.err.println("[GameFontBase] RuntimeException raised while processing character '$ch' (U+${Integer.toHexString(ch.toInt()).toUpperCase()})") + // e1.printStackTrack() + } } } @@ -424,6 +452,8 @@ constructor() : Font { return SHEET_EXTA_EF else if (isCyrilicEF(c)) return SHEET_CYRILIC_EF + else if (isGreekEF(c)) + return SHEET_GREEK_EF else if (isRunic(c)) return SHEET_RUNIC else if (isHangul(c)) @@ -444,6 +474,8 @@ constructor() : Font { return SHEET_CJK_PUNCT else if (isFullwidthUni(c)) return SHEET_FW_UNI + else if (isGreek(c)) + return SHEET_GREEK_EM else if (c.isColourCode()) return SHEET_COLOURCODE else @@ -516,6 +548,8 @@ constructor() : Font { lateinit internal var uniPunct: SpriteSheet lateinit internal var wenQuanYi_1: SpriteSheet lateinit internal var wenQuanYi_2: SpriteSheet + lateinit internal var greekSheet: SpriteSheet + lateinit internal var greekSheetEF: SpriteSheet internal val JUNG_COUNT = 21 internal val JONG_COUNT = 28 @@ -544,12 +578,12 @@ constructor() : Font { internal val SHEET_UNI_PUNCT = 12 internal val SHEET_WENQUANYI_1 = 13 internal val SHEET_WENQUANYI_2 = 14 - + internal val SHEET_GREEK_EM = 15 + internal val SHEET_GREEK_EF = 16 internal val SHEET_COLOURCODE = 255 lateinit internal var sheetKey: Array internal val asciiEFList = arrayOf(' ', '!', '"', '\'', '(', ')', ',', '.', ':', ';', 'I', '[', ']', '`', 'f', 'i', 'j', 'l', 't', '{', '|', '}', 0xA1.toChar(), 'Ì', 'Í', 'Î', 'Ï', 'ì', 'í', 'î', 'ï', '·') - internal val extAEFList = arrayOf( 0x12E.toChar(), 0x12F.toChar(), @@ -563,7 +597,6 @@ constructor() : Font { 0x167.toChar(), 0x17F.toChar() ) - internal val cyrilecEFList = arrayOf( 0x406.toChar(), 0x407.toChar(), @@ -571,6 +604,14 @@ constructor() : Font { 0x457.toChar(), 0x458.toChar() ) + internal val greekEFList = arrayOf( + 0x390.toChar(), + 0x399.toChar(), + 0x3AA.toChar(), + 0x3AF.toChar(), + 0x3B9.toChar(), + 0x3CA.toChar() + ) /** * Runic letters list used for game. The set is diff --git a/src/net/torvald/imagefont/GameFontWhite.kt b/src/net/torvald/imagefont/GameFontWhite.kt index 0edee3336..622f3494c 100644 --- a/src/net/torvald/imagefont/GameFontWhite.kt +++ b/src/net/torvald/imagefont/GameFontWhite.kt @@ -46,6 +46,10 @@ constructor() : GameFontBase() { "./res/graphics/fonts/wenquanyi_11pt_part1.png", 16, 18, 2) GameFontBase.wenQuanYi_2 = SpriteSheet( "./res/graphics/fonts/wenquanyi_11pt_part2.png", 16, 18, 2) + GameFontBase.greekSheet = SpriteSheet( + "./res/graphics/fonts/greek_majuscule.png", GameFontBase.W_LATIN_WIDE, GameFontBase.H) + GameFontBase.greekSheetEF = SpriteSheet( + "./res/graphics/fonts/greek_ef.png", GameFontBase.W_LATIN_NARROW, GameFontBase.H) val shk = arrayOf( GameFontBase.asciiSheet, @@ -62,7 +66,10 @@ constructor() : GameFontBase() { GameFontBase.fullwidthForms, GameFontBase.uniPunct, GameFontBase.wenQuanYi_1, - GameFontBase.wenQuanYi_2)//, uniHan + GameFontBase.wenQuanYi_2, // uniHan + GameFontBase.greekSheet, + GameFontBase.greekSheetEF + ) GameFontBase.sheetKey = shk } diff --git a/src/net/torvald/serialise/WriteGameMapData.kt b/src/net/torvald/serialise/WriteGameMapData.kt index de29491c3..b8fa0fcee 100644 --- a/src/net/torvald/serialise/WriteGameMapData.kt +++ b/src/net/torvald/serialise/WriteGameMapData.kt @@ -1,6 +1,6 @@ package net.torvald.serialise -import net.torvald.terrarum.gamemap.GameMap +import net.torvald.terrarum.gamemap.GameWorld import net.torvald.terrarum.Terrarum import java.io.IOException import java.nio.file.Files @@ -29,14 +29,14 @@ object WriteGameMapData { val path = Paths.get("${Terrarum.defaultSaveDir}" + "/$saveDirectoryName/${WriteMeta.META_FILENAME}") val tempPath = Files.createTempFile(path.toString(), "_temp") - val map = Terrarum.ingame.map + val map = Terrarum.ingame.world // TODO gzip // write binary Files.write(tempPath, MAGIC) - Files.write(tempPath, byteArrayOf(GameMap.BITS)) - Files.write(tempPath, byteArrayOf(GameMap.LAYERS)) + Files.write(tempPath, byteArrayOf(GameWorld.BITS)) + Files.write(tempPath, byteArrayOf(GameWorld.LAYERS)) Files.write(tempPath, byteArrayOf(BYTE_NULL)) Files.write(tempPath, byteArrayOf(BYTE_NULL)) Files.write(tempPath, toByteArray(map.width)) diff --git a/src/net/torvald/terrarum/COPYING.md b/src/net/torvald/terrarum/COPYING.md index 8fdb43032..f5bcebe7b 100644 --- a/src/net/torvald/terrarum/COPYING.md +++ b/src/net/torvald/terrarum/COPYING.md @@ -58,9 +58,14 @@ All rights reserved. --- -Amazing ambient sound recordings in ```sound/ambient/klankbeeld-freesound``` +Amazing ambient sound recordings: -Samples used: 173111, 183181, 185290, 195287, 240108, 326914, 337691, 347753 + ambient_forest_01.ogg + ambient_meadow_01.ogg + ambient_windy_01.ogg + ambient_woods_01.ogg + crickets_01.ogg + crickets_02.ogg Copyright (C) 2012, 2013, 2015, 2016 Klankbeeld Sound from http://www.freesound.org/people/klankbeeld/ \ No newline at end of file diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index c73fa35aa..d8acdf035 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -1,6 +1,9 @@ package net.torvald.terrarum +import com.google.gson.JsonArray +import com.google.gson.JsonElement import com.google.gson.JsonObject +import net.torvald.terrarum.gamecontroller.Key /** * Created by minjaesong on 16-03-12. @@ -15,6 +18,53 @@ object DefaultConfig { jsonObject.addProperty("notificationshowuptime", 6500) jsonObject.addProperty("multithread", true) // experimental! + // control-gamepad + jsonObject.addProperty("joypadkeyn", 4) + jsonObject.addProperty("joypadkeyw", 1) + jsonObject.addProperty("joypadkeys", 2) + jsonObject.addProperty("joypadkeye", 3) // logitech indices + + jsonObject.addProperty("joypadlup", 4) + jsonObject.addProperty("joypadrup", 5) + jsonObject.addProperty("joypadldown", 6) + jsonObject.addProperty("joypadrdown", 7) // logitech indices + + jsonObject.addProperty("joypadlstickx", 0) + jsonObject.addProperty("joypadlsticky", 1) + jsonObject.addProperty("joypadrstickx", 2) + jsonObject.addProperty("joypadrsticky", 3) // logitech indices + + // control-keyboard (Java key index. This is what Minecraft also uses) + jsonObject.addProperty("keyup", Key.E) + jsonObject.addProperty("keyleft", Key.S) + jsonObject.addProperty("keydown", Key.D) + jsonObject.addProperty("keyright", Key.F) + + jsonObject.addProperty("keymovementaux", Key.A) // movement-auxiliary, or hookshot + jsonObject.addProperty("keyinventory", Key.W) + jsonObject.addProperty("keyinteract", Key.R) + jsonObject.addProperty("keyclose", Key.C) + + jsonObject.addProperty("keygamemenu", Key.TAB) + jsonObject.addProperty("keyquicksel", Key.CAPS_LOCK) // pie menu + val keyquickselalt = JsonArray(); keyquickselalt.add(Key.BACKSPACE); keyquickselalt.add(Key.L_COMMAND); keyquickselalt.add(Key.L_CONTROL) + // some pro typers assign CapsLock to Backspace, LControl, or LCommand (Mac). Honestly, Control (Command for mac) and CapsLock must swap their places! + jsonObject.add("keyquickselalt", keyquickselalt) + + jsonObject.addProperty("keyjump", Key.SPACE) + + val keyquickbars = JsonArray(); for (i in 2..11) keyquickbars.add(i) // NUM_1 to NUM_0 + jsonObject.add("keyquickbars", keyquickbars) + + + + return jsonObject } -} \ No newline at end of file +} + +/* + +Additional description goes here + + */ \ No newline at end of file diff --git a/src/net/torvald/terrarum/StateInGame.kt b/src/net/torvald/terrarum/StateInGame.kt index bd58f3f12..6e29fdf64 100644 --- a/src/net/torvald/terrarum/StateInGame.kt +++ b/src/net/torvald/terrarum/StateInGame.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum import net.torvald.imagefont.GameFontBase +import net.torvald.terrarum.audio.AudioResourceLibrary import net.torvald.terrarum.concurrent.ThreadPool import net.torvald.terrarum.gameactors.* import net.torvald.terrarum.console.Authenticator @@ -9,7 +10,7 @@ import net.torvald.terrarum.gamecontroller.GameController import net.torvald.terrarum.gamecontroller.Key import net.torvald.terrarum.gamecontroller.KeyMap import net.torvald.terrarum.gamecontroller.KeyToggler -import net.torvald.terrarum.gamemap.GameMap +import net.torvald.terrarum.gamemap.GameWorld import net.torvald.terrarum.gamemap.WorldTime import net.torvald.terrarum.mapdrawer.LightmapRenderer import net.torvald.terrarum.mapdrawer.MapCamera @@ -22,6 +23,7 @@ import net.torvald.terrarum.ui.BasicDebugInfoWindow import net.torvald.terrarum.ui.ConsoleWindow import net.torvald.terrarum.ui.Notification import net.torvald.terrarum.ui.UIHandler +import net.torvald.terrarum.weather.WeatherMixer import org.lwjgl.opengl.GL11 import org.newdawn.slick.* import org.newdawn.slick.fills.GradientFill @@ -41,7 +43,7 @@ constructor() : BasicGameState() { internal var game_mode = 0 - lateinit var map: GameMap + lateinit var world: GameWorld /** * list of Actors that is sorted by Actors' referenceID @@ -57,8 +59,8 @@ constructor() : BasicGameState() { lateinit internal var player: Player - private var GRADIENT_IMAGE: Image? = null - private var skyBox: Rectangle? = null + //private var GRADIENT_IMAGE: Image? = null + //private var skyBox: Rectangle? = null var screenZoom = 1.0f val ZOOM_MAX = 2.0f @@ -92,15 +94,11 @@ constructor() : BasicGameState() { shaderBlurH = Shader.makeShader("./res/blurH.vrt", "./res/blur.frg") shaderBlurV = Shader.makeShader("./res/blurV.vrt", "./res/blur.frg") - // init skybox - GRADIENT_IMAGE = Image("res/graphics/colourmap/sky_colour.png") - skyBox = Rectangle(0f, 0f, Terrarum.WIDTH.toFloat(), Terrarum.HEIGHT.toFloat()) - // init map as chosen size - map = GameMap(8192, 2048) + world = GameWorld(8192, 2048) // generate terrain for the map - MapGenerator.attachMap(map) + MapGenerator.attachMap(world) MapGenerator.SEED = 0x51621D2 //mapgenerator.setSeed(new HQRNG().nextLong()); MapGenerator.generateMap() @@ -132,6 +130,11 @@ constructor() : BasicGameState() { // set smooth lighting as in config KeyToggler.forceSet(KEY_LIGHTMAP_SMOOTH, Terrarum.getConfigBoolean("smoothlighting")) + + + + // audio test + //AudioResourceLibrary.ambientsWoods[0].play() } override fun update(gc: GameContainer, sbg: StateBasedGame, delta: Int) { @@ -139,8 +142,11 @@ constructor() : BasicGameState() { setAppTitle() - map.updateWorldTime(delta) - map.globalLight = globalLightByTime + world.updateWorldTime(delta) + + WeatherMixer.update(gc, delta) + + world.globalLight = globalLightByTime.toInt() GameController.processInput(gc.input) @@ -258,30 +264,6 @@ constructor() : BasicGameState() { } } - private fun getGradientColour(row: Int, phase: Int) = GRADIENT_IMAGE!!.getColor(phase, row) - - private fun getGradientColour(row: Int): Color { - val gradMapWidth = GRADIENT_IMAGE!!.width - val phase = Math.round( - map.worldTime.elapsedSeconds().toFloat() / WorldTime.DAY_LENGTH.toFloat() * gradMapWidth - ) - - //update in every INTERNAL_FRAME frames - return getGradientColour(row, phase) - } - - /** - * @param time in seconds - */ - private fun getGradientColourByTime(row: Int, time: Int): Color { - val gradMapWidth = GRADIENT_IMAGE!!.width - val phase = Math.round( - time.toFloat() / WorldTime.DAY_LENGTH.toFloat() * gradMapWidth - ) - - return getGradientColour(row, phase) - } - override fun keyPressed(key: Int, c: Char) { GameController.keyPressed(key, c) } @@ -320,13 +302,7 @@ constructor() : BasicGameState() { override fun getID(): Int = Terrarum.SCENE_ID_GAME - private fun drawSkybox(g: Graphics) { - val skyColourFill = GradientFill( - 0f, 0f, getGradientColour(0), - 0f, Terrarum.HEIGHT.toFloat(), getGradientColour(1) - ) - g.fill(skyBox, skyColourFill) - } + private fun drawSkybox(g: Graphics) = WeatherMixer.render(g) /** Send message to notifier UI and toggle the UI as opened. */ fun sendNotification(msg: Array) { @@ -399,15 +375,7 @@ constructor() : BasicGameState() { } } - private val globalLightByTime: Int - get() = getGradientColour(2).getRGB24().rgb24ExpandToRgb30() - fun globalLightByTime(t: Int): Int = getGradientColourByTime(2, t).getRGB24().rgb24ExpandToRgb30() - - fun Color.getRGB24(): Int = this.redByte.shl(16) or this.greenByte.shl(8) or this.blueByte - /** Remap 8-bit value (0.0-1.0) to 10-bit value (0.0-4.0) by prepending two bits of zero for each R, G and B. */ - fun Int.rgb24ExpandToRgb30(): Int = (this and 0xff) or - (this and 0xff00).ushr(8).shl(10) or - (this and 0xff0000).ushr(16).shl(20) + private val globalLightByTime = WeatherMixer.globalLightNow fun Double.sqr() = this * this fun Int.sqr() = this * this diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt new file mode 100644 index 000000000..7eeef68e2 --- /dev/null +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -0,0 +1,48 @@ +package net.torvald.terrarum.audio + +import org.lwjgl.openal.AL10 +import org.newdawn.slick.openal.Audio +import org.newdawn.slick.openal.AudioImpl +import org.newdawn.slick.openal.MODSound +import java.util.* + +/** + * Created by minjaesong on 16-07-08. + */ +object AudioMixer { + const val TRACK_COUNT = 32 + + const val TRACK_AMBIENT_ONE = 0 + const val TRACK_AMBIENT_ONE_NEXT = 1 + const val TRACK_AMBIENT_TWO = 2 + const val TRACK_AMBIENT_TWO_NEXT = 3 + + const val TRACK_UI_ONE = 8 + const val TRACK_UI_TWO = 9 + + const val TRACK_SFX_START = 16 + const val TRACK_SFX_END = 31 + + val tracks = ArrayList(TRACK_COUNT) + + init { + + } + + fun getAudio(track: Int) = tracks[track] + + /** + * Queue an SFX to any empty SFX track and play it. + */ + fun queueSfx(audio: Audio) { + + } + + fun update() { + + } + + class MixerTrack(val audio: Audio, var volume: Float, var pan: Float) { + + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/AudioResourceLibrary.kt b/src/net/torvald/terrarum/audio/AudioResourceLibrary.kt new file mode 100644 index 000000000..566be4a3b --- /dev/null +++ b/src/net/torvald/terrarum/audio/AudioResourceLibrary.kt @@ -0,0 +1,31 @@ +package net.torvald.terrarum.audio + +import org.newdawn.slick.openal.Audio +import org.newdawn.slick.openal.AudioLoader +import java.io.FileInputStream +import java.util.* + +/** + * Created by minjaesong on 16-07-08. + */ +object AudioResourceLibrary { + + val ambientsForest = ArrayList