From 11e955cc5672167085f180e279df989f919b0004 Mon Sep 17 00:00:00 2001 From: Jalen Winslow Date: Mon, 6 Nov 2017 10:09:43 -0700 Subject: [PATCH] Added project --- .gitattributes | 17 ++ .gitignore | 114 ++++++++ ...DodgeGame-d41d8cd98f00b204e9800998ecf8427e | Bin 0 -> 6730 bytes .../core-fb83b73eb3c879b18d343675f32aca61 | Bin 0 -> 12435 bytes .../desktop-9bccb601584b92d9c041663102aef73f | Bin 0 -> 15442 bytes .nb-gradle/profiles/private/aux-config | 16 ++ HELP.txt | 15 + build.gradle | 61 +++++ core/assets/DodgeGame_boundsMask.png | Bin 0 -> 116 bytes core/assets/b&w_DodgeGame_GameOver.png | Bin 0 -> 1298 bytes core/assets/b&w_DodgeGame_arrow.png | Bin 0 -> 238 bytes core/assets/b&w_DodgeGame_background1.png | Bin 0 -> 2766 bytes core/assets/b&w_DodgeGame_background2.png | Bin 0 -> 4085 bytes core/assets/b&w_DodgeGame_block.png | Bin 0 -> 450 bytes core/assets/b&w_DodgeGame_buttons1.png | Bin 0 -> 531 bytes core/assets/b&w_DodgeGame_font1.fnt | Bin 0 -> 704 bytes core/assets/b&w_DodgeGame_font1.png | Bin 0 -> 704 bytes core/assets/b&w_DodgeGame_gamePaused.png | Bin 0 -> 104 bytes core/assets/b&w_DodgeGame_health1.png | Bin 0 -> 90 bytes core/assets/b&w_DodgeGame_man1.png | Bin 0 -> 1008 bytes core/assets/b&w_DodgeGame_manTest.png | Bin 0 -> 163 bytes .../assets/b&w_DodgeGame_originalGameOver.png | Bin 0 -> 383 bytes core/assets/b&w_DodgeGame_playButton.png | Bin 0 -> 1032 bytes core/assets/b&w_DodgeGame_scoreBoard.png | Bin 0 -> 351 bytes core/assets/b&w_DodgeGame_tallWall1.png | Bin 0 -> 371 bytes core/assets/b&w_DodgeGame_timerCase.png | Bin 0 -> 112 bytes core/assets/b&w_DodgeGame_wall1.png | Bin 0 -> 741 bytes core/assets/b&w_DodgeGame_wood1.png | Bin 0 -> 453 bytes core/assets/badlogic.jpg | Bin 0 -> 68465 bytes core/assets/customFont1.fnt | 57 ++++ core/assets/customFont1_0.png | Bin 0 -> 535 bytes core/assets/customFont2.fnt | 57 ++++ core/assets/customFont2_0.png | Bin 0 -> 527 bytes core/assets/customFont3.fnt | 42 +++ core/assets/customFont3_0.png | Bin 0 -> 457 bytes core/assets/customFont4.fnt | 66 +++++ core/assets/customFont4_0.png | Bin 0 -> 879 bytes core/assets/scores.txt | 11 + core/assets/testScores.txt | 0 core/build.gradle | 11 + core/src/com/jalenwinslow/game/Handler.java | 112 ++++++++ core/src/com/jalenwinslow/game/Main.java | 48 ++++ .../jalenwinslow/game/gameobjects/Arrow.java | 109 ++++++++ .../game/gameobjects/ArrowGenerator.java | 120 ++++++++ .../jalenwinslow/game/gameobjects/Button.java | 105 +++++++ .../game/gameobjects/GameObject.java | 48 ++++ .../game/gameobjects/GameObjectHandler.java | 78 ++++++ .../game/gameobjects/HealthBar.java | 57 ++++ .../game/gameobjects/PlayButton.java | 68 +++++ .../jalenwinslow/game/gameobjects/Player.java | 258 ++++++++++++++++++ .../game/gameobjects/ScoreBoard.java | 78 ++++++ .../game/gameobjects/ShortWall.java | 170 ++++++++++++ .../game/gameobjects/TallWall.java | 128 +++++++++ .../jalenwinslow/game/gameobjects/Timer.java | 77 ++++++ .../jalenwinslow/game/gameobjects/Wall.java | 25 ++ .../game/gameobjects/WallGenerator.java | 116 ++++++++ .../jalenwinslow/game/gameobjects/Wood.java | 76 ++++++ .../game/gameobjects/WoodGUI.java | 60 ++++ .../game/gameobjects/WoodGenerator.java | 92 +++++++ .../jalenwinslow/game/states/ExitState.java | 66 +++++ .../game/states/GameOverState.java | 62 +++++ .../jalenwinslow/game/states/GameState.java | 117 ++++++++ .../jalenwinslow/game/states/MenuState.java | 131 +++++++++ .../jalenwinslow/game/states/PauseState.java | 57 ++++ .../com/jalenwinslow/game/states/State.java | 32 +++ .../src/com/jalenwinslow/game/utils/Grid.java | 59 ++++ .../com/jalenwinslow/game/utils/Score.java | 83 ++++++ desktop/build.gradle | 55 ++++ .../game/desktop/DesktopLauncher.java | 15 + gradle.properties | 3 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54208 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++++++++ gradlew.bat | 84 ++++++ settings.gradle | 1 + 75 files changed, 3235 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .nb-gradle/private/cache/DodgeGame-d41d8cd98f00b204e9800998ecf8427e create mode 100644 .nb-gradle/private/cache/core-fb83b73eb3c879b18d343675f32aca61 create mode 100644 .nb-gradle/private/cache/desktop-9bccb601584b92d9c041663102aef73f create mode 100644 .nb-gradle/profiles/private/aux-config create mode 100644 HELP.txt create mode 100644 build.gradle create mode 100644 core/assets/DodgeGame_boundsMask.png create mode 100644 core/assets/b&w_DodgeGame_GameOver.png create mode 100644 core/assets/b&w_DodgeGame_arrow.png create mode 100644 core/assets/b&w_DodgeGame_background1.png create mode 100644 core/assets/b&w_DodgeGame_background2.png create mode 100644 core/assets/b&w_DodgeGame_block.png create mode 100644 core/assets/b&w_DodgeGame_buttons1.png create mode 100644 core/assets/b&w_DodgeGame_font1.fnt create mode 100644 core/assets/b&w_DodgeGame_font1.png create mode 100644 core/assets/b&w_DodgeGame_gamePaused.png create mode 100644 core/assets/b&w_DodgeGame_health1.png create mode 100644 core/assets/b&w_DodgeGame_man1.png create mode 100644 core/assets/b&w_DodgeGame_manTest.png create mode 100644 core/assets/b&w_DodgeGame_originalGameOver.png create mode 100644 core/assets/b&w_DodgeGame_playButton.png create mode 100644 core/assets/b&w_DodgeGame_scoreBoard.png create mode 100644 core/assets/b&w_DodgeGame_tallWall1.png create mode 100644 core/assets/b&w_DodgeGame_timerCase.png create mode 100644 core/assets/b&w_DodgeGame_wall1.png create mode 100644 core/assets/b&w_DodgeGame_wood1.png create mode 100644 core/assets/badlogic.jpg create mode 100644 core/assets/customFont1.fnt create mode 100644 core/assets/customFont1_0.png create mode 100644 core/assets/customFont2.fnt create mode 100644 core/assets/customFont2_0.png create mode 100644 core/assets/customFont3.fnt create mode 100644 core/assets/customFont3_0.png create mode 100644 core/assets/customFont4.fnt create mode 100644 core/assets/customFont4_0.png create mode 100644 core/assets/scores.txt create mode 100644 core/assets/testScores.txt create mode 100644 core/build.gradle create mode 100644 core/src/com/jalenwinslow/game/Handler.java create mode 100644 core/src/com/jalenwinslow/game/Main.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Arrow.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/ArrowGenerator.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Button.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/GameObject.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/GameObjectHandler.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/HealthBar.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/PlayButton.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Player.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/ScoreBoard.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/ShortWall.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/TallWall.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Timer.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Wall.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/WallGenerator.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/Wood.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/WoodGUI.java create mode 100644 core/src/com/jalenwinslow/game/gameobjects/WoodGenerator.java create mode 100644 core/src/com/jalenwinslow/game/states/ExitState.java create mode 100644 core/src/com/jalenwinslow/game/states/GameOverState.java create mode 100644 core/src/com/jalenwinslow/game/states/GameState.java create mode 100644 core/src/com/jalenwinslow/game/states/MenuState.java create mode 100644 core/src/com/jalenwinslow/game/states/PauseState.java create mode 100644 core/src/com/jalenwinslow/game/states/State.java create mode 100644 core/src/com/jalenwinslow/game/utils/Grid.java create mode 100644 core/src/com/jalenwinslow/game/utils/Score.java create mode 100644 desktop/build.gradle create mode 100644 desktop/src/com/jalenwinslow/game/desktop/DesktopLauncher.java create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..bdb0cab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5814594 --- /dev/null +++ b/.gitignore @@ -0,0 +1,114 @@ +## Java + +*.class +*.war +*.ear +hs_err_pid* + +## Robovm +/ios/robovm-build/ + +## GWT +/html/war/ +/html/gwt-unitCache/ +.apt_generated/ +.gwt/ +gwt-unitCache/ +www-test/ +.gwt-tmp/ + +## Android Studio and Intellij and Android in general +/android/libs/armeabi/ +/android/libs/armeabi-v7a/ +/android/libs/arm64-v8a/ +/android/libs/x86/ +/android/libs/x86_64/ +/android/gen/ +.idea/ +*.ipr +*.iws +*.iml +/android/out/ +com_crashlytics_export_strings.xml + +## Eclipse + +.classpath +.project +.metadata/ +/android/bin/ +/core/bin/ +/desktop/bin/ +/html/bin/ +/ios/bin/ +/ios-moe/bin/ +*.tmp +*.bak +*.swp +*~.nib +.settings/ +.loadpath +.externalToolBuilders/ +*.launch + +## NetBeans + +/nbproject/private/ +/android/nbproject/private/ +/core/nbproject/private/ +/desktop/nbproject/private/ +/html/nbproject/private/ +/ios/nbproject/private/ +/ios-moe/nbproject/private/ + +/build/ +/android/build/ +/core/build/ +/desktop/build/ +/html/build/ +/ios/build/ +/ios-moe/build/ + +/nbbuild/ +/android/nbbuild/ +/core/nbbuild/ +/desktop/nbbuild/ +/html/nbbuild/ +/ios/nbbuild/ +/ios-moe/nbbuild/ + +/dist/ +/android/dist/ +/core/dist/ +/desktop/dist/ +/html/dist/ +/ios/dist/ +/ios-moe/dist/ + +/nbdist/ +/android/nbdist/ +/core/nbdist/ +/desktop/nbdist/ +/html/nbdist/ +/ios/nbdist/ +/ios-moe/nbdist/ + +nbactions.xml +nb-configuration.xml + +## Gradle + +/local.properties +.gradle/ +gradle-app.setting +/build/ +/android/build/ +/core/build/ +/desktop/build/ +/html/build/ +/ios/build/ +/ios-moe/build/ + +## OS Specific +.DS_Store +Thumbs.db diff --git a/.nb-gradle/private/cache/DodgeGame-d41d8cd98f00b204e9800998ecf8427e b/.nb-gradle/private/cache/DodgeGame-d41d8cd98f00b204e9800998ecf8427e new file mode 100644 index 0000000000000000000000000000000000000000..b891a8ff97a9066225406ec6f3327cabc4901d93 GIT binary patch literal 6730 zcmb_h%WoS+7#}Bg?W~=(V50jyFGUj-OwQiW)V`VbR>x>3<&#_wmi!aForH`_(rp0p$tgW3KpyQq_>X@y2 ztYL6znGlFox;_%)J+po%;AAq4h-0|5V#RZ75Rx%<-c`EC$#Q=Y3DeVb zxV;tT5R}2xc%V|UZab8diEuO9D~k6xf6L%?PNrkdY;y*=gwR4PCS+uVj|J)DqbDE# z^wFi?hDd6IWDX6dNn4CeYN5?$W0$fI9)ET|_v!DCh9ICm#NdAB?}wj&wT-?an{=Wc z;T?ifY8bYwj?c-h{}DK)w8N+fN=}rtBE3W2C6h7+kk6AE2HPZNu7}6N6_PdUwqr5s zaxxd|j1|vupbepKz?&)6AYjy|jN257=4RsA!uC+jp?uIA>&I*}Qf!EqTZ+bf8EPG9?KZQ}Hke<4bcCm%Xm z?$`1;*<2}A?*^0w)qTUEZWS!UY;824!>gML1TNn5*g@bMCarEa8x6`X-nhPWtGeo0 zHF_JIubLjCRe9{AAyRG0P(RDb-ND*cSk$(~tApA?TID2D5@&&`xYWHWqTq*BAj$wb zHdA9>(^q*+yE>;MhY(%p*eK+qQQ$a9i|sfWUMgG{{A(Sxx+rUP5&XH*-JcLtcc6pI ztJ)e60`%umRpmW&{v4d`c1viK;SSmGoXO31`QXyl5#*%)t?`qZ^xR>1(u zODRo3`MH?R1hc-+{ z91Xl1QBTN6T?g(uLRYNFn?_xrt(lJP17ebKDWYCc^4xLB6|tjeG)`vYDiIxZRUG3o z8y18m-$6n7h2wjvdgNp#uA``^myhX{Ex2ruQ7J8+Q6}z-pu;t)DGDR>MN?2-Wytgz zJ`9-+xMM+vVs9vic0;)xNJJ=`SF%V!`AOv~$a`*BR%1dmd_gIdA4?UVDe-SS{)&?G zp}mOppbS^fS{<5 zqJ)YAkfYm^z-je@QtCYNegx-{EAmwIIk*MU7YlM!X9$uk4OmGo_9ibM*QIo?>&cf= z;u-l1c>4Mvz|Nw<0r&g_xPEis=93WnwE^y;Ks#GfhmwJM4n|uHVMi2CgY4H*OkW7E zN|3!OsepRt&|1mZIUcY(V>)J zR5x7^{dA;|0P31402?qzEO-#@lb~V&B|!Ulw8b%W*YWBK@H*v*7_Y+#SlTblpN~9J zN;?3U{UW^{yP(_+>~(NJs2ASr;IJlq5)8vH23Vgw@iw57BY?i+LZJIKb_+@blQUCF zn3$PT!lcYeB8E9}LJF;D!(8kQ!!#jnMA75qv=EBkQ4IEXZ7~eQg2Yp$#L+og^1BbP toM84ET&GHjQz=_IVumji$%uLqBPMlI{JCisz8bd&(5F@W&jd9H{sTdI-NXO@ literal 0 HcmV?d00001 diff --git a/.nb-gradle/private/cache/core-fb83b73eb3c879b18d343675f32aca61 b/.nb-gradle/private/cache/core-fb83b73eb3c879b18d343675f32aca61 new file mode 100644 index 0000000000000000000000000000000000000000..0037c2fd9f15955eec11151b7bfc53f4c6fcdae6 GIT binary patch literal 12435 zcmd5?U2I%e5kCHl|9_G+anm+QOOvQ7_1fz?j=kZhsl7>T94Ew1irQ_{yLXT6o7~;I zz4vUg=|fc>fQJf-phZFmgai^V5fV}n6>o?K9?DC30U-f>=p#HK1VTtKGw1K_?%ivL zZUvFDclVr`Idf*_%r|GQ@BM}KMIp-t;dZ9NMUgv|D6<_pC7)-iVQ`bXB2x}Z+|O+A z&~tq6RbE;zULb-?I36+iudAE&JkO4VK_H&<#7j{H8#%cf>$Chs7OY^ z#@B8-x1H&l@cijZPW9{>8{Xy>SjSzdYz2bNuYp?ATCHiR*0fS(ZO5-U0xX-a-1fqtQsxyQ*kY>roT?{H_)3k3 zcc-P7Hl1*r3vk3x+40a%HJ=N1I#m$v-#A053~cC4+Q>#w3tf=1uvaN&+maLf3GTd@ zW;NK0j8fW5Ccc*x({-=0Q5jR$d5Cc-*Z~=lzEjzr-Vh;#FKz>Os7PL6ud#jgs$lzO zGugRJR0kSro=oU!Kq)0Sd*#vspx(p{c zM(q<`gS+C!OmSEj#fclZfimz@yK7~rK_`sy(@9E^Wiq5vvP*0(fPg+I&D7vHidmQv zbhulmFq|QZ=aKF(sBwxGqs+M!_&z`YoQ>$jwF;=>ZFx@7=jiHxji1c^^v_?L=w`6@ zUUWLSyB@Nqb{Aj;A9p`@+GXe&fP)LSgI6^CVK?arSo%&&ZZ1lr_gTcUYkQsKAN`k$xlq+0|AR88LIzF!y z;0Qv7ESDh>7S>gH@aS_vcq^(pE-!4<%4HrtIy;j+Q&@2YE?QxaGEOmfCFLya${9t4%eVLB7*hea+G#wa6U(- zo21W&L3}qQuWr!isrLF%Fs}kkZxA#>60nLv@D0)7!{ZHUYC0uiP>zIqOlwz=0b*wo zs|LsxOL`Et51GF#*ddwPs7Tt}34=R`2*45F{199KphA#2a!-rPk^&iU@vv4AUb$s) zwAC|E8cCG9fR-nl9ieOjR(5s)Mv6}t7oF^^ zvpDBw=jV_EvL$ese5sXstAk2S6@&V0NvY<}&Moq-xtaMHXKu?WIg6)fw`R{Q%$+{% zE^M7CF1khMX*avzkZ#1-q@e_m$4JrhjTS|ZUBr)7tY~@>bHF`&2?`r~_5{JvmM4fK z(xX_&)`NlA;UNa83Xc&;8nQ6eM0Lsqr-&e~W|x9vW+3pzCL_ZE`$%AGRIzX?PX}g{ z9?B>^V35SiY*UpfGYXxr28+NQ-t}uG4oO1rumXuC`HoKFBr23r@IiKH-nMf7xYxKV8YUf%*_;rs?5NOy z)Ntr;;n8<`-g|=T4CH$8wbWvRq^+7vPkuogDBrLHkYYkMMr4?lGxJz$AU5nT>@7b@7GcO3$NklOM(qv&2L=3c6BMgvAaf{t4Tp4IvNFY zQrarmcX{(-{wldf>i-#1bg4yMU1j$o?J4}&zz>y&?votdgcn<4yG)U%2h^-)?9^#lyQUKUT!gFOYmOrWbhVHGq?xcc3PqY)!E)%oz6K9BbU@^AGxR# z)tWEX>Av&nJr<9fx-nuCJzNWIe+A`Yd4*3~pxWE@CwED=n6_{YY}VK%AgRX7#gTg1 zHz15F9VZCKEq`360A){sIcvU%q=RwYuRX>OW)OR%$v_W`Ac>E_Bt>LoCd2gM0pQ~4GE??|M2``AuM=yjNRyi6o^RS6|y zfJHjK@!{8h{pRC;f=%*Ql2UMFNixaA?*UCj6e)-_q z36@<=bDOcOd~?ybqZIQ(oDO3lskYy)Z<=g4#k3i6s#fsbh#JE9I7l`~ZA3O|9TS(L zG1RRC?hZ6xLU;+#u9*fwqu#WD(2v@h?ZeI%9n-_KrT@BrXu_7>2w`vU>__Y-qMfBu z_t80IR4U6$+c5~Nj&^}YTDw3nWX`6%X~0NQ7YJJEo#+CMl9%?-5(L7Ju~GC1!9MOr z5iIfl*eC)&8t{Yf@kSAuJf%@IMd$1YeI5nGIYF^{0;2R(Qu>n#M5b{B;FaYD2p-sq z^%xtpLeGy;Pb>#LAzp?Kk6;7(D=iQ2zJ?_Qm6d|^(NoVIip?$aDzB6vA7R6ssO*TQ zKOCcPc#Szh46z~2u|LMK&UuMLXH<4rhuzvMT&ud;E zUW_9zKK0xI%?o3B*Y~P`ityGBNz_kG`EV;G^`Wqz1pTx)iy7Cv%8qfG)e^kj9d8=Z z^ha9PQoteD!8nf^)qLYIzLgRb6!@A0wu0X^O}USK#jy zws*kF`&-5|kBS_w9pA6M>3J2;YSg$DFs^w>bEsXZX>#(A{h_HIkh-b~K1~zLR(i{&-Ez~r|NsQ}(q+!jevKx?KT?>h6K!4Q~$__AW zDx}z(Y)z&1Lp2cWhn{*)Ss$+&@tZwlPIWSHhC&0LY&iCdu5dFX=Ma6`l&{_mU}^JU zB0;=<`2kTJr%yn`&v)X2T;kC!5mezW@EnRUq%gu+kIC^+|FEiLD4L7Ox$Q^X47rx4=cKg4|0KG>VSz=HNC$Am)KG4XN2EbP1L=2uVl3aY(gh!znhGPHtc>{t>f83;bJqwXFcG%M*(LYfeDkz19IojYf*;eo6tGc7eHFHDHYcL}>+qH4eTy zWHK|#7qIpOM?LkXy{_+c|7(;FbH3L?}`Yx83^D)k4Lm=f& zhRCOg_L9U0awcAyW?1pf+=2hD0v2;Bf4hHq#i%FxC@n z6p74lO$O^%JVYgY=)rxt#MC*MtF}*I!#J6ixc21|v(iBBPUuvTk@c%@m}0ulz>RXF N14p!=UnZy=@E@&iCm{d; literal 0 HcmV?d00001 diff --git a/.nb-gradle/private/cache/desktop-9bccb601584b92d9c041663102aef73f b/.nb-gradle/private/cache/desktop-9bccb601584b92d9c041663102aef73f new file mode 100644 index 0000000000000000000000000000000000000000..daa1ccc853a5572a1ec86b4c672a7654d20ccf45 GIT binary patch literal 15442 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 tcZP?jIqV!2nT{-12Bq2Mz0~U + + + + + + + + + + + file:/C:/Users/jalen/Programming/Netbeans%20Workspace/Summer%202017/DodgeGame/desktop/src/com/jalenwinslow/game/desktop/DesktopLauncher.java + + + + diff --git a/HELP.txt b/HELP.txt new file mode 100644 index 0000000..c34c613 --- /dev/null +++ b/HELP.txt @@ -0,0 +1,15 @@ +Dodge Game + +A 2d black-and-white pixel art game, in which you dodge arrows, while collecting wood to build small +wood walls to help you survive longer. + +Controls +-------- +W, A, S, D = Up, Left, Down, Right +E -> Hold down to destroy wood or build walls. (In menu, you use it to select choices.) +Space -> When you have 7 pieces of wood you can create a wall. +-------- + +There are executables in "/desktop/build/libs/". Latest build DodgeGame_1.2.jar. + +Created using libgdx. \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..9291d47 --- /dev/null +++ b/build.gradle @@ -0,0 +1,61 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + jcenter() + } + dependencies { + } +} + +allprojects { + apply plugin: "eclipse" + apply plugin: "idea" + + version = '1.0' + ext { + appName = "DodgeGame" + gdxVersion = '1.9.6' + roboVMVersion = '2.3.1' + box2DLightsVersion = '1.4' + ashleyVersion = '1.7.0' + aiVersion = '1.8.0' + } + + repositories { + mavenLocal() + mavenCentral() + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { url "https://oss.sonatype.org/content/repositories/releases/" } + } +} + +project(":desktop") { + apply plugin: "java" + + + dependencies { + compile project(":core") + compile "com.badlogicgames.gdx:gdx-backend-lwjgl:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + compile "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-desktop" + compile "com.badlogicgames.gdx:gdx-controllers-desktop:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-controllers-platform:$gdxVersion:natives-desktop" + } +} + +project(":core") { + apply plugin: "java" + + + dependencies { + compile "com.badlogicgames.gdx:gdx:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" + compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion" + } +} + +tasks.eclipse.doLast { + delete ".project" +} \ No newline at end of file diff --git a/core/assets/DodgeGame_boundsMask.png b/core/assets/DodgeGame_boundsMask.png new file mode 100644 index 0000000000000000000000000000000000000000..d856d1fbf632bb920b8d5aa853733dc95de331a3 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzYfl%)kcif|*9{pN3^-Ue1})Y& z#%lK>gjdIsdHz@B)z5Rbah`a!Gy1VTP%#2D+}QV=|C9w!rT^4hPe8(+u6{1-oD!M< Dj3*%e literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_GameOver.png b/core/assets/b&w_DodgeGame_GameOver.png new file mode 100644 index 0000000000000000000000000000000000000000..092a746d88457f7fb5500bcd76fbebaef662fb5d GIT binary patch literal 1298 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Xs4mP03*$GQmF)*;)^mK6yshIQj?!nw<2N4Iy zj-d1^Z>iFCg6#?{+%wFB8IEyRMb#$S_+S2F%g9n2Q_I8k z`N#NRF}~*bd4}t6=DvJ8SFv{<=iS<4+poX)YJ2)%_xTF#PHn4sF=FpYsJ@~5Oi zZn}N>$-OrinIf4uQaBYRq_XXJly`n_Z0=i2=Wmu(wP#KKr?Z1)Kzbw}9D4En@Lp@< z{Tt84-T(D<3o|U8o#rWc_~!d_+g!I3dvo^w&oXwjh9|x=3=jMF{@)lhd*NPdgy<(@ zhw~3}i@)SA{SNfXxp_bD=GM+Xhwww?tYz<4`!hY@DuXx{;y$R$M>((v8-fAymr3A5 WTPpJ&zB*u8$KdJe=d#Wzp$Pz|OnLVJ literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_arrow.png b/core/assets/b&w_DodgeGame_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a428a1e0bf8c2c955874ba1ebb17803a673728 GIT binary patch literal 238 zcmV~`U~W}`4%|)e<^87!!5uLBjh-t8Fxg1|1Be|ZIdqHxFLc1% oBujTep+Rbt&H2N6;X)mfUx>`RM^@~eJOBUy07*qoM6N<$f=_Q?3;+NC literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_background1.png b/core/assets/b&w_DodgeGame_background1.png new file mode 100644 index 0000000000000000000000000000000000000000..70878cdb9dce54429ec47568db5b6b0c939e19a5 GIT binary patch literal 2766 zcmZ8jdpwi-ALlF~YMfsZl{v=|xtzsv>LjL)TPc#u8b6kz$Fb zwUXNZi8t`*M-nWEPlL4ES1Ff6iL=QNJ89lWT?f} z{>?$l%Tor81K`*+hT|&)w!NxY1_6Pk$^^wtJCq}$DB;f(0RjHo0-K;$u^A*dM6asHjw)uE7 zH};_?g%h{v1srhAmlR4K8m4gcN4|}tZ4`1TAcqzCWmjAIi)w&&{QzZyxg)8XOf&e9 z%JO)?R?T3ot*|zj`3iym>3& zCc*v92(clJ=>E1Vu=dVvTqScQ`@*YxgSiIWpz-*ja$ubbZBZ|tRg8^T)UcW@O*{-8 zI1S;3o`4xXm5^y!x)lYPTozZ4;Un`Dclh$&QrRggla6zgrk_k*AuhBRV={E-;{xRb zT}RrFC45bsF@aBrf#UHR6DXM&-f!wuL8ff(o=dm;!>_4A9_<8&A$XzM7gug98`V1f zSnC~hs7iVj?={@5^HH)c%AWpnjqpr&_0Sqv*Cneo1l0B}F9zGC6++tR7^bcaZ7vE! z=V)t!S+OxUu9_Bt%R=^!Bb?Y@qrDyHt5es(rGnAjlT_eiw|bP*b0cbUJ^sscs}GG+ zk9yK^mDS}qXBVkTSfbJSfJ3G72twC-AvOKdMVj^w*-3n|JO&qbxuakFzyc#8Hb-qH z3&LxIs!XtuP@U0aFn8A(^PO5jPp4V)n5NssanWDBqIgj+cxw%IQCP>LbRF?qU0ZP*Mz$a{ zj(*a4v-r$T=C(sk+hpK_B;oaWS9_2*Z3_v9YNXTXS zmf7>y+VcYljy~?@vMPZ~ff_xvV5VN#dGleLoBfBd0yU0uU>H6|9ld_EBu?rNofKMk z+dRVhsK_{JESLrHd&wtx775BK38mQQW-%eQA-nt-H5SE$-n}8cNezNy1*BonMnZ-^ zHm3R4_>@YqWVgX@FN!kve1(pkgNG&NN-hN|LjFZ~~7-;_+d&cT2+16CETt@jcOwpOy1SZejW@TopoN`IhTe zET0CIG+tx~Dpt}RM_V^KPrdki3E3NGv~kZ#Gz%(H{-BPBI*1mkGFJKoFv~dXpglGj zs#@-3_Pp}*pMKx7DPADoXpQIc1y%*sdh0G{)W%*Yv89B3>6QBh%A7^IyoCFZqwp80 zPj<=ug)tt4_l#T=9-(GxF?@h_q#XXMGxYIcaZDdUJUSY3Zx-$;Vt+`lo01&tkoSXq ze-EiST1}BJmKY;gGQh9S*GSdGa-n^^ms==s$9_>->2p z6J>1{%?28{;iZkN;qD34u*jV{uz&Xe1l|AYyPO|ZqOW&m%Tqs`Z6)Oi5_4bImnxda z$=CYZgo*<=O7R+x!c*`ERhp)#h>Qn%aD(H@8AO!l>B=&nY+0s7E>3?9*LQ!f5Mef{SL zjBHY~+?-kZjyGbFzzvA4fw)gXu9#{e`uazn6&WB@KHn#mg0~<=i9P>)%2tj1b4(}L zp+QU=LPq~AG>N&-)YI3Q<7-$>2eOdQ5O-?}-dl(ll~WcVk>&DrmW@42n`SAyV@kc4 zKp#dv>2$&nrE$FA;y~R9RaAC4O48m%9^dz{Y#(B1NG)3G$61qmW2*66Gc20QUQ}+m zK~EaBA*nG=q9^?L1dl)zFt&;p1%Zmzoa$7B;OgmLNpMCO`kYb1PrrnU3s%;6eP3WP ztc*POxjaTDt^~nz1^d%Eg^VQm|81aN6cgw`vf#1W5_ff#W;T-tRddWR5I}I?Ent|W zuJ8f)h;6?Q)>h43cz?kl-2mbkK$* zH$e@Js8xAFWDpA~BAhLjln#GYIe>xjC}lZgtOt zCtnY6_nr9Dwz;FE%bS}eGb0MohS!*vOy7YOXSe5#tvF35jn=k|h%it$yk|>eGrPjC zbRPpIaBVFgZK%wVxBh!k8^es4EA+Lw( zB9pHZ-M7&OD~8=NNx59e$@1r#FZ5jVTScxW*jWLgoKD&&8T#Ds?7cL@vL@&~RpGdU Lt9{k6bBX^0;;;9R literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_background2.png b/core/assets/b&w_DodgeGame_background2.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec81744a4b717012e09ef2aadfc24da68f7c4f1 GIT binary patch literal 4085 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 literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_buttons1.png b/core/assets/b&w_DodgeGame_buttons1.png new file mode 100644 index 0000000000000000000000000000000000000000..a84add56b188f184162a14af0e0c2b003f305445 GIT binary patch literal 531 zcmeAS@N?(olHy`uVBq!ia0vp^1wcH3gAGVtSn~cP0|VnNPZ!6KiaBrZIA%2`NVr}+ z|43}}DV=l`B?ud$Hn7^j4K!kh*wGw!^+GVS2}>YaP8xU{=x z%-MTkU20m|*6zF8`X+~OJ^N>qc-59k=bp>h>hd#lmHV&P`#s@bD{Wi?^jf>K{dz@7 vNYK1|!+xjRJ>!nm`?CSZ*QU;#`IAl6-B|L-+AH?J$Y$_#^>bP0l+XkKOR(5i literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_font1.fnt b/core/assets/b&w_DodgeGame_font1.fnt new file mode 100644 index 0000000000000000000000000000000000000000..fab0facb1689675cafae6688a14489f005f1c95c GIT binary patch literal 704 zcmV;x0zdtUP)F<1q&f3>( zGWuCM(m&Fh!OP0av8ewoeJkZVPj&sP=m-2N%>8?7#|@VTI*&C0sUxCaL-YV@HaxwX zGN#$h1Ox-=Pm9jj^ZYOAXUil1-W}Hd?*X*JsH8;>_-y-UVa5URZtG5e!r{Bq9LMt} z$44OFOP-GmAZGKt2~>d&AbUV9KE^>ako8O7XjC?4*HPU+OP)QTD_~tP(x)=BqBf&7 zMP3F_wC0_C8)i#5jjz&oRZ;N^lex2C=VS#j+tYTQ)!A|re>K|p?FA7Gp4M9X2~IEq z?M9N5xl@|=;H_nZRqxNlDxZ0WU#^k$PZqLw_RbIL5i@&a23E8Os;2NriRSTXJe3l{ zyRo{%rT$EhmtCKwU$d9dE#;#<>TLU(JjxK`ST$37Sk(r+c=7#+-i~aI7}c*mqif$9 zn7X_w&(QAztGtof1@TyVo5N%2h>m%4^K7rg)|&l0P#+spIC>S*91;DU0U^3+@^=VL zhLN8&e-EfHys~f9E;Ll0MuJg}p;xpsA14^y`&_ji$a{ffUgxy&D>j{d=KdyBvX6&I zHqj0sn`O|vD!t9D3gX}VBPGs37#KkGkq6mFfg1^IYYmwa&a&}TRI=c#7J$9|qb&qN zYW~(MTsG1fCun5=a;CLm^0q@I7789u9&K2)1iNzy$6(x7?G^9r9)>Qv3>i6pPkyIc zKcr^B+)i2jS0A3M?XLn_A5&F~-(K)|nS`|y!Hlzg&=Y+n(}1!S`^q%}z0hd#vr34H mehW{zK+ejNPk)6o*Zl`*xhyk$LjigK0000F<1q&f3>( zGWuCM(m&Fh!OP0av8ewoeJkZVPj&sP=m-2N%>8?7#|@VTI*&C0sUxCaL-YV@HaxwX zGN#$h1Ox-=Pm9jj^ZYOAXUil1-W}Hd?*X*JsH8;>_-y-UVa5URZtG5e!r{Bq9LMt} z$44OFOP-GmAZGKt2~>d&AbUV9KE^>ako8O7XjC?4*HPU+OP)QTD_~tP(x)=BqBf&7 zMP3F_wC0_C8)i#5jjz&oRZ;N^lex2C=VS#j+tYTQ)!A|re>K|p?FA7Gp4M9X2~IEq z?M9N5xl@|=;H_nZRqxNlDxZ0WU#^k$PZqLw_RbIL5i@&a23E8Os;2NriRSTXJe3l{ zyRo{%rT$EhmtCKwU$d9dE#;#<>TLU(JjxK`ST$37Sk(r+c=7#+-i~aI7}c*mqif$9 zn7X_w&(QAztGtof1@TyVo5N%2h>m%4^K7rg)|&l0P#+spIC>S*91;DU0U^3+@^=VL zhLN8&e-EfHys~f9E;Ll0MuJg}p;xpsA14^y`&_ji$a{ffUgxy&D>j{d=KdyBvX6&I zHqj0sn`O|vD!t9D3gX}VBPGs37#KkGkq6mFfg1^IYYmwa&a&}TRI=c#7J$9|qb&qN zYW~(MTsG1fCun5=a;CLm^0q@I7789u9&K2)1iNzy$6(x7?G^9r9)>Qv3>i6pPkyIc zKcr^B+)i2jS0A3M?XLn_A5&F~-(K)|nS`|y!Hlzg&=Y+n(}1!S`^q%}z0hd#vr34H mehW{zK+ejNPk)6o*Zl`*xhyk$LjigK00009 pPciz%!kn_|dSbODJ5UJ{Sn+FLBEzhE-adXHK~Gmdmvv4FO#r6v8A|{F literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_health1.png b/core/assets/b&w_DodgeGame_health1.png new file mode 100644 index 0000000000000000000000000000000000000000..667332fea14ce975d5839b6e0a32ccf990501b7c GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQi`4~jv*QolT#8Bew=q;OjzXd o`GG;h)Bp8dO$h=OjY-T5k`r0@SmrLb11e_lboFyt=akR{0NLFcMF0Q* literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_man1.png b/core/assets/b&w_DodgeGame_man1.png new file mode 100644 index 0000000000000000000000000000000000000000..06b334cd4d29f98cd37d66bf831bc6abdc879165 GIT binary patch literal 1008 zcmVT6!ZSkQh)|NL5!k$_Iax1|;bLm^QRI{D=1*oO1vGUQ+&T zX4T)j|HxSV$VUJG_@jVJ*T8#^%Tb@KS$Tm*NgY-`lq2;cA6xM%{ihD#oU`5_wSbzu zRe$gPOX`n(jEA&rFGE8IHxx?0Ax(L!{*nCuNoqJ?=Uj3e&mWu#1T^EV`bYDhS_7C2 zHySJ)OXfc-|Frey|EU9b?;X`x)RSJj61M6e(SLR>*|zO;VqMo<`ENsEkrDS+B+PL` zS&qjJ2!_H-`mKB||2f}F{1yGl8sO8$XRZj9tm}%MV_V0)kKwcP7{{YJM9xz@u2;+7 z>Hp!QCwwpRoR2yE)z<(mEOOv>{!R-c!10Z3&L=L>W!S76|exi;Z78zF}F zt^VhDjk)Mp@&;71{b?iE%m=8*zsOkq@jk)K2dK}7a-@FYG-lyd`e!~sMP6{dbq6fg zANxq=0|@NZ@$kvZ`7XACr?oR`E0`_ZQ#@XKtrq{ZY4!g^1soTS1dxSea}hU5G|s|X z^^fTP%m=8*|5y0{`@WOns7eTt952oXhv7i)Zrzh>BJ5{MtOa{s^zl2jKWZ+w8Sgd>8ou0RQH&tMPm*kFS+jBma%(-_2v2 z`2aH?pwD>z%m>i%GarCJ8}eoN@G<5Ub(q?pHkfIH3cd6stNvm9rxHR+!<^(MJn{gn z`bYG?YB=}>55T0~%J=AhwgY7Lq+b)y&hb|LBlu6n0#5L;gM?wR<$@Zmd8__W{3l}p zmc3|7K(MP1K+9Y8kK}*y{{eE9Nh^Np0a*2q=zn%DiGQM8U{3LDJoKCz%*>%y-m2fq zWBr^-{lCKFssLpAvugks{mM1;Fm5Qq!HAfb+(0WY(XSasE&c=041fJSG3j z#A)?sWMVo_>BNKxt!h5t9%;?NT=A_jdt1n~>8+bGG$n$Xlr3&=n_+v{`KMTnph>WE z@zlDLA7{C|Gg3WrpGUV2$!8>U|@9fba4!+nDh3oV_&m@0El(f2t2Y17{C z|4)5AcRarK-__T>uZlyzzBjk}clCX-U0i8xdHnr!D+Lx#Fyc)=F!AQhyt1|x^Eltx zJwCf?-TS=NucKq-WnqRdOLv%;`+eW*?H3spJs3b}MGf1Y+xx|l?KeOJhd;g{iZjJ7I#`632-*b(Xz88J{_1Q<_hXNCaBM`k~Pg!|0 z{f$lT{1EmQ1x65B@KW-E-5t}_|Fx~P|Gw+F`~J|5+dV6pohC4VP(c3Ly_eJ({g=W7 eAi@yxf;4kli)&SDz;0l`GI+ZBxvXgnuh=|_pL}G$B714OspH8H|Jon4*naz09DCAi zQldm%y}oFa!oj1{*nhr1^qrBNMWc`5sNjMfcLOuLo=)`de#>yuYXA3!Ro|X(TzCK1 zzvzB*<}YS_kFQ_KvO^DJZDbI82oOkct z|0MSJPq=*kLROH-8)0RQ`F?Nnwz^K(D06Qmr_~GQqfc`uOtAc%@BjMa^8C)3%U-^I zef{;*e^vQwufMOgQ4In4;IHh@AmR5PWjuIa|1$mEs&`r_Z{p+gw&J&LU#{q@zWbm~9-yj!Ov|F>>gD>QJC!iw9Te@*P_ zo^N;3@*gs<5q-P!>^+Tzz+jvc>9qa(_C2ol|F0g8&S(S$?C&ESr}7I?gK1;@igk)h zr^vnOUi)@pM&+t&Q+lS(cu{}wXP(#9O%lN5_2rx@|D-^8?8IEX&;MnEtU~1T?{WcG z|Jhvo8hyY1^~dG*!jttU$p1V#@z(X~?7emGA8Udg@!HOCsaoCFsMV#luOl!2`Obd5 zlz01ykI(0EzkU14uCg2GAF&yoH&`P$3})Qgn+0~cjH<~7<;5}A_g-35{=@dk=R=kA z{O?=$5t*)Jj#DpP9gdQieLq)Yom&5z8|?ey9l)t8^F6~6CwYx`6Zd`RS-LY*GRW(t Z{X3rKSrt>NfLWV?!PC{xWt~$(697k?|G5AF literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_scoreBoard.png b/core/assets/b&w_DodgeGame_scoreBoard.png new file mode 100644 index 0000000000000000000000000000000000000000..0db885bf8f77d75dcdb310ae127c11162d127631 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^1wfp@!3HFcnti*#z`&^H>EaktG3V_S!z^b*0f&Qk zC;X0&T-U_g7c2Qk{)~v$mfi;&Z|$^pKKW1fQ0w1)((@L-o%-h8=evJ4Hy(<;oqS@x z{=Q~@0Rz7S7L1QsdW45Aqb%**>W7y4?llMB+1)=oyCG)2zR9~n_1vV>=g!<=*k;YY V^ZkCN8^C~L@O1TaS?83{1OQi*zdY~vY?+|m8mU@Af>50{;U1d1b+4lN6S6Ma}Z`CV`TKt%A~gNOj&)(?nn z-uoYJQ^!d}C%%y|H^G?-CkMxIJU(FNhn<<<-BkrvK$kCwfjACmdKI;Vst02e?efdBvi literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_wall1.png b/core/assets/b&w_DodgeGame_wall1.png new file mode 100644 index 0000000000000000000000000000000000000000..e4dbc44d22c7c6fb5dec432c060fc2fe559e0ae2 GIT binary patch literal 741 zcmVWgoGr+3{jx{B*lgznVY7 zgS98e#+p;qXNI@6c91wT{C7_P87PFzjFi;V{6!WOGP%)>fuNGVhnX(2fUMZ91;ZX} zQ6PMo1wZ4ztG_zXPQZ-Z2#d6L0#!^v*6yeIM{id|zZzbwBj3md?m7{?ZGiDQVg^GJ zLFMbkl#OJ9hQgD(pt?M69R{HYtjLu8Ri8Ot6skql;B zJ>OaW6*=}OpE=F7l#bEY5Um$7nS|$Sx&bn&O9!)qtt*e6RCXcE_*?d}{MkaV%XJ@_ z#gjRCH9L}HM4yQz!e8A0Ri~_V;#p}$)dWaCmdwl-lQ(DiM~lxH(A!4FUs(qrv1Dtb z4F9(ckO_VyB6n{DRTGf4qs4+uNY%z=PRlG0q#e%IU{P4L5>rQM{9iUeWqw^*#4xCc z<&*p~sP3m*cJBaN>oNS@cYq8sg_M?7L~>yZ*|dn^fZ7`i=B(eSPl-qy7qQROf|(mP z^bl6H_%)}|tGt?%L}Wm-?ZZ1zbr5J^`F}drjwpZi9e@SXI<)jNix2hT*{JGZAwb%! zccm#-x)-rIdk13mCA`x<%D=P-)_`8o&&FG;v&{k|~Yy4Rt{8tUI@YVPQ X%+gO@%aLEA00000NkvXXu0mjfobYR0 literal 0 HcmV?d00001 diff --git a/core/assets/b&w_DodgeGame_wood1.png b/core/assets/b&w_DodgeGame_wood1.png new file mode 100644 index 0000000000000000000000000000000000000000..06f5ceb47415061388ec134b686ce07206015909 GIT binary patch literal 453 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%0D_mtl(=kJ_v@+V;1Dd59><)1Vxf({Tq^pY-s)84 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 literal 0 HcmV?d00001 diff --git a/core/assets/customFont1.fnt b/core/assets/customFont1.fnt new file mode 100644 index 0000000..186dc75 --- /dev/null +++ b/core/assets/customFont1.fnt @@ -0,0 +1,57 @@ +info face="Arial" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=1,1,1,1 spacing=2,2 outline=0 +common lineHeight=12 base=9 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=3 greenChnl=3 blueChnl=3 +page id=0 file="customFont1_0.png" +chars count=37 +char id=48 x=40 y=11 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=49 x=48 y=11 width=4 height=9 xoffset=0 yoffset=1 xadvance=5 page=0 chnl=15 +char id=50 x=191 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=51 x=199 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=52 x=83 y=0 width=7 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=53 x=207 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=54 x=215 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=55 x=223 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=56 x=231 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=57 x=239 y=0 width=6 height=9 xoffset=-1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=58 x=60 y=11 width=3 height=7 xoffset=0 yoffset=3 xadvance=3 page=0 chnl=15 +char id=65 x=24 y=0 width=9 height=9 xoffset=-1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=66 x=16 y=11 width=6 height=9 xoffset=1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=67 x=137 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=68 x=146 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=69 x=155 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=70 x=247 y=0 width=6 height=9 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=71 x=164 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=72 x=173 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=73 x=54 y=11 width=6 height=9 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=15 +char id=74 x=8 y=11 width=6 height=9 xoffset=0 yoffset=1 xadvance=5 page=0 chnl=15 +char id=75 x=182 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=76 x=32 y=11 width=6 height=9 xoffset=0 yoffset=1 xadvance=5 page=0 chnl=15 +char id=77 x=13 y=0 width=9 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=78 x=55 y=0 width=8 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=79 x=65 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=80 x=24 y=11 width=6 height=9 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=81 x=74 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=82 x=92 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=83 x=0 y=11 width=6 height=9 xoffset=0 yoffset=1 xadvance=6 page=0 chnl=15 +char id=84 x=101 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=5 page=0 chnl=15 +char id=85 x=110 y=0 width=7 height=9 xoffset=0 yoffset=1 xadvance=7 page=0 chnl=15 +char id=86 x=35 y=0 width=9 height=9 xoffset=-1 yoffset=1 xadvance=6 page=0 chnl=15 +char id=87 x=0 y=0 width=11 height=9 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=15 +char id=88 x=119 y=0 width=7 height=9 xoffset=1 yoffset=1 xadvance=5 page=0 chnl=15 +char id=89 x=128 y=0 width=7 height=9 xoffset=2 yoffset=1 xadvance=7 page=0 chnl=15 +char id=90 x=46 y=0 width=8 height=9 xoffset=1 yoffset=1 xadvance=6 page=0 chnl=15 +kernings count=15 +kerning first=89 second=65 amount=-1 +kerning first=89 second=58 amount=-1 +kerning first=86 second=65 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=84 second=58 amount=-1 +kerning first=80 second=65 amount=-1 +kerning first=76 second=89 amount=-1 +kerning first=76 second=87 amount=-1 +kerning first=76 second=86 amount=-1 +kerning first=76 second=84 amount=-1 +kerning first=49 second=49 amount=-1 +kerning first=70 second=65 amount=-1 +kerning first=65 second=84 amount=-1 +kerning first=65 second=86 amount=-1 +kerning first=65 second=89 amount=-1 diff --git a/core/assets/customFont1_0.png b/core/assets/customFont1_0.png new file mode 100644 index 0000000000000000000000000000000000000000..09af3b0cbdc32c5bd87a85dfbf8de64666b2c8df GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5890C>L#5>RT|mw~PZ!6KiaBp@oSybbL4e`H zDw+TPr_XF{`OtMM-7NY1UT$l~u5ji~w?EH~yi#0Tru1|aEt_}!t5$ZM?u6o~wU73^ z@a`|2dg4~lHnrka>AkNuJ^QfwzxRi4b$<0ZX=P20oe=e+Y#me;$e8zvEl zcXwN^)}H_M^PGw4PTTIJpWbThy))`V1lx@4@ZueRQgrgYU8cpZ6fgY!ar={LvAa(G zUtruXUio_e|Cv$RXKv5h-ShjV)#2~P8(ZSFEAkfeFvo6l%YIimKeZ=1%t3zg?7q^k z&+6Kg7ELLebw^BVXJ6{&)-uzjYc2+Rr=Nbl%;tS@jPZK41*_M@%&x9Bn)9kYaeM!@ zNwatETwi&8`Rb#2se7`^chz6nVqSQ+NWb>g=gn)^746rJI`MYdi%q+_PwZYHGf(!e zko>>0+Plk`>mReXU$cK@ILG2^Zbe0SjNh_v=l*E(O;+}*mO0CRrLf_7^Ojoa6H8B+ zTPf99^t_k<{GcPo?9*NAqiKih|4SAev10xlo&NQp`5gU{nm>FyV}IYbSHFAx_Uq|Q nFWFlxABNkqg5ruyuL#5>RT|mw?PZ!6KiaBp@oGyB-Ai!`y zGW_5F={K7hKTeu^$IS2hLAS%w%AG|=EB7CIX?M$8 z?%K0`PcP3{C)YmrGxyb%T@0Ept-t-fA6)(bCI`aR86$& zcv=18hXnh-ZFA;Xd^NF|E4p1h_+;3N+wFV)-%$3dmtCuWrLyX+YZU(rd4umAE1oyV z`>OSyjDIb-b1vh%b0YQ@OaI9A-w02zEe-oE`=3+$(~obGpOnr1;akJ>FVdQ&MBb@0R3F)8vp>m4Y3D4bU$6NSuiQIh z^KUPonb#xjQuS6BzdE^lTK})Se^GD$R{vfhYHak*ZhGX-bs3AFTV}~^{pNoC0^j=0 z-QnG*?tABZor$dW@{yE(xg^q3)6njGl>OUfPZsqY?<=2mvF=H1+TO)h?u*V#mPRqW z3wX_v`ceLSdHJ(b&wrj2)@-OV+RpWs&;JDD{x)uhy5OW};qA-U?*7@jMfv$+j+n0t z_utbJTARDt>*iY5Tk~(W-BQ1wwS(cz9X7kv?lrf5y4tE0eCaUB{-~X+@qKDt_p?=U zj7sM-I^|-+e}^;t3D13Yq;K0&zZo;vvE_xyotl0-zWJLQfix5ttYkU~#aKbLh*2~7aWPR&jL literal 0 HcmV?d00001 diff --git a/core/assets/customFont4.fnt b/core/assets/customFont4.fnt new file mode 100644 index 0000000..d91ffc5 --- /dev/null +++ b/core/assets/customFont4.fnt @@ -0,0 +1,66 @@ +info face="MS Gothic" size=-10 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=1,2,1,2 spacing=2,2 outline=0 +common lineHeight=10 base=9 scaleW=256 scaleH=64 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="customFont4_0.png" +chars count=62 +char id=48 x=200 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=49 x=79 y=28 width=6 height=12 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=50 x=40 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=51 x=77 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=52 x=44 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=53 x=87 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=54 x=97 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=55 x=107 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=56 x=117 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=57 x=127 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=65 x=137 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=66 x=147 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=67 x=157 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=68 x=167 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=69 x=177 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=70 x=187 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=71 x=197 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=72 x=207 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=73 x=87 y=28 width=5 height=12 xoffset=-1 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=74 x=217 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=75 x=227 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=76 x=237 y=0 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=77 x=0 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=78 x=0 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=79 x=70 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=80 x=10 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=81 x=20 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=82 x=30 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=83 x=40 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=84 x=50 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=85 x=60 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=86 x=33 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=87 x=22 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=88 x=80 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=89 x=11 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=90 x=90 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=97 x=100 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=98 x=110 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=99 x=120 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=100 x=130 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=101 x=140 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=102 x=150 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=103 x=160 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=104 x=170 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=105 x=94 y=28 width=5 height=12 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=106 x=70 y=28 width=7 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=107 x=180 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=108 x=101 y=28 width=5 height=12 xoffset=0 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=109 x=55 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=110 x=210 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=111 x=220 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=112 x=230 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=113 x=240 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=114 x=247 y=0 width=7 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=115 x=190 y=14 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=116 x=10 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=117 x=20 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=118 x=30 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=119 x=66 y=0 width=9 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=120 x=50 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=121 x=60 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 +char id=122 x=0 y=28 width=8 height=12 xoffset=-2 yoffset=-1 xadvance=5 page=0 chnl=15 diff --git a/core/assets/customFont4_0.png b/core/assets/customFont4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..173a232c1a08b744e002c41da4ce64b8f40138c4 GIT binary patch literal 879 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K595~p3fAxCLv*6oSpQ_Ccnrknel6!mG-^by7^SYm9*Wb5x zm{K$GZNSdkrQbG7O~0tW`e$bS3ijaql$+afvy;vaxNoz^xfIP&7Osq44Pu9usi z8Gds4wdJQ`G#;ILd+XY)(~{!3zmvsvT=^bMeLUrP`gQT%)8{76y&d^@4P!#e|G0yP zy$%Fji-^C!IjQ$zXx!d?dHhD-wRWD!+O_#-R*#f)WYbzX_H+BfZUq&){?ec1-&y1{v3`^E}-jncHs@FLiNG&D>_yvla&7 z|K{y5H|V{#`&QYb&v*VCc-;K?n)U0>6OQjYy6^mansYre+C+cC+kGMyoAPdL+)_Rz zD!%s5zEcgaD}TK{pgrH@+^?ALHVolq^BK=r{k*EZEh=7m`>!0f8E;?Kv#jc`RzKRa zvSP`;&@J<4#w<;HpuIx=-`PLE1YvH%OBWdaXXsWq_)Glt#3LYup00i_>zopr0ItZm A2LJ#7 literal 0 HcmV?d00001 diff --git a/core/assets/scores.txt b/core/assets/scores.txt new file mode 100644 index 0000000..b20930c --- /dev/null +++ b/core/assets/scores.txt @@ -0,0 +1,11 @@ +19 +209 +314 +11 +8 +3 +6 +2 +2 +0 +4 \ No newline at end of file diff --git a/core/assets/testScores.txt b/core/assets/testScores.txt new file mode 100644 index 0000000..e69de29 diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..03cd1be --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,11 @@ +apply plugin: "java" + +sourceCompatibility = 1.6 +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' + +sourceSets.main.java.srcDirs = [ "src/" ] + + +eclipse.project { + name = appName + "-core" +} diff --git a/core/src/com/jalenwinslow/game/Handler.java b/core/src/com/jalenwinslow/game/Handler.java new file mode 100644 index 0000000..de625b0 --- /dev/null +++ b/core/src/com/jalenwinslow/game/Handler.java @@ -0,0 +1,112 @@ +package com.jalenwinslow.game; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.jalenwinslow.game.gameobjects.GameObjectHandler; +import com.jalenwinslow.game.states.*; +import com.jalenwinslow.game.utils.Score; +import java.io.File; +import java.io.IOException; + +public class Handler { + + //--- Propreties + private FileHandle scoreFile; + private Score score; + + private State menuState, gameState, gameOverState, pauseState, exitState; + private GameObjectHandler gameObjectHandler; + + private BitmapFont font; + private String message = ""; + + //--- Constructor + public Handler() { + + } + + + //--- Methods + public void init() { + score = new Score(this); + + menuState = new MenuState(this); + gameState = new GameState(this); + gameOverState = new GameOverState(this); + pauseState = new PauseState(this); + exitState = new ExitState(this); + + gameObjectHandler = new GameObjectHandler(this); + + font = new BitmapFont(); + font.setColor(Color.RED); + + createScoreFile(); + + State.setCurrenState(menuState); + State.getCurrentState().init(); + + } + + public void update(float dt) { + if (State.getCurrentState() != null) { + State.getCurrentState().update(dt); + } + } + + public void render(SpriteBatch batch) { + if (State.getCurrentState() != null) { + State.getCurrentState().render(batch); + } + font.draw(batch, message, 32, 32); + } + + public void dispose() { + gameState.dispose(); + menuState.dispose(); + gameOverState.dispose(); + gameObjectHandler.dispose(); + + font.dispose(); + } + + private void createScoreFile() { + File file = new File("scores.txt"); + try { + file.createNewFile(); + } catch (IOException ex) { + ex.printStackTrace(); + } + scoreFile = new FileHandle(file); + if (scoreFile.readString().equals("")) { + String scoreString = "0\n"+ + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0\n" + + "0"; + scoreFile.writeString(scoreString, false); + } + score.getScoresFromFile(); + } + + //--- Getters and Setters + public GameState getGameState() {return (GameState)gameState;} + public MenuState getMenuState() {return (MenuState)menuState;} + public State getGameOverState() {return gameOverState;} + public PauseState getPauseState() {return (PauseState)pauseState;} + public ExitState getExitState() {return (ExitState)exitState;} + public GameObjectHandler getGameObjectHandler() {return gameObjectHandler;} + public FileHandle getScoreFile() {return scoreFile;} + public Score getScore() {return score;} + + public String getMessage() {return message;} + public void setMessage(String message) {this.message = message;} +} diff --git a/core/src/com/jalenwinslow/game/Main.java b/core/src/com/jalenwinslow/game/Main.java new file mode 100644 index 0000000..120f00f --- /dev/null +++ b/core/src/com/jalenwinslow/game/Main.java @@ -0,0 +1,48 @@ +package com.jalenwinslow.game; + +import com.badlogic.gdx.ApplicationAdapter; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +public class Main extends ApplicationAdapter { + public static final int WIDTH = 640, HEIGHT = 640; + + SpriteBatch batch; + Handler handler; + //BitmapFont bf; + + @Override + public void create () { + batch = new SpriteBatch(); + handler = new Handler(); + handler.init(); + //bf = new BitmapFont(Gdx.files.internal("b&w_DodgeGame_font1.fnt"), new TextureRegion(new Texture("b&w_DodgeGame_font1.png"))); + } + + @Override + public void render () { + //Update + handler.update(Gdx.graphics.getDeltaTime()); + + + //Render + batch.begin(); + + handler.render(batch); + //bf.draw(batch, "Hello", 32, 32); + //bf.draw(batch, str, WIDTH, WIDTH, WIDTH, HEIGHT, true) + batch.end(); + + + } + + @Override + public void dispose () { + batch.dispose(); + handler.dispose(); + } +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Arrow.java b/core/src/com/jalenwinslow/game/gameobjects/Arrow.java new file mode 100644 index 0000000..8eefbcc --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Arrow.java @@ -0,0 +1,109 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.states.State; + +public class Arrow extends GameObject { + + //--- Propreties + public static final double MAX_SPEED = 4; + public static final double MIN_SPEED = 2.5; //normal -> maxSpeed: 4 && minSpeed: 2.5 + + private int dir; + private double speed; + private double vecX, vecY; + //private static Texture boundsTexture = new Texture("DodgeGame_boundsMask.png"); + + //--- Constructor + public Arrow(Handler handler, double x, double y, TextureRegion image, int dir) { + super(handler, x, y, image); + this.dir = dir; + speed = MIN_SPEED; + vecX = 0; + vecY = 0; + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/40, Main.HEIGHT/40); + } + + + //--- Methods + @Override + public void update(float dt) { + isArrowVisible(); + updateSpeed(); + if (dir == 0) vecX = speed; + if (dir == 1) vecY = speed; + if (dir == 2) vecX = -speed; + if (dir == 3) vecY = -speed; + x += vecX; + y += vecY; + if (y < 96) depth = 0; + else depth = (int)y + Main.HEIGHT/20; + setBoundsPosition(); + checkCollision(); + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(image, (int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + //batch.draw(boundsTexture, bounds.x, bounds.y, bounds.width, bounds.height); + } + + @Override + public void dispose() { + + } + + private void isArrowVisible() { + if (x < -128 || x > Main.WIDTH + Main.WIDTH/5 || + y < -128 || y > Main.HEIGHT + Main.HEIGHT/5) { + //handler.getGameState().getArrowGen().getArrows().removeValue(this, false); + handler.getGameState().getArrowGen().getArrows().removeValue(this, false); + } + } + + private void updateSpeed() { + int modifier = handler.getGameState().getTimer().getTime() / 60; + speed = MIN_SPEED + (0.05 * modifier); + if (speed >= MAX_SPEED) speed = MAX_SPEED; + } + + private void setBoundsPosition() { + switch (dir) { + case 0: bounds.setPosition((float)x + 48, (float)y + 26); break; + case 1: bounds.setPosition((float) x + 26, (float)y + 48); break; + case 2: bounds.setPosition((float)x, (float)y + 26); break; + case 3: bounds.setPosition((float)x + 26, (float)y);break; + } + } + + private void checkCollision() { + if (bounds.overlaps(handler.getGameState().getPlayer().getBounds())) { + handler.getGameState().getTimer().stop(); + State.setCurrenState(handler.getGameOverState()); + State.getCurrentState().init(); + handler.getGameObjectHandler().dispose(); + handler.getGameState().dispose(); + } + for (int i = 0; i < handler.getGameObjectHandler().getGameObjects().size; i++) { + if (handler.getGameObjectHandler().getGameObjects().get(i).toString().equalsIgnoreCase("TallWall")) { + TallWall wall = (TallWall)handler.getGameObjectHandler().getGameObjects().get(i); + if (bounds.overlaps(wall.getNoArrowBounds())) { + wall.setHitPoints(wall.getHitPoints() - 6); + handler.getGameState().getArrowGen().getArrows().removeValue(this, false); + } + } + } + } + + @Override + public String toString() {return "Arrow";} + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/ArrowGenerator.java b/core/src/com/jalenwinslow/game/gameobjects/ArrowGenerator.java new file mode 100644 index 0000000..552fcc5 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/ArrowGenerator.java @@ -0,0 +1,120 @@ + package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Array; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import java.util.Random; + +public class ArrowGenerator extends GameObject { + + //--- Propreties + private static final int MAX_ARROW_LIMIT = 40, MIN_ARROW_LIMIT = 5; // max: 40, min: 5 + private static final double ARROW_DEPLOY_END_TIME = 0.07, ARROW_DEPLOY_START_TIME = 0.5; // endTime: 0.07, startTime: 0.5 + + private int currentArrowLimit; + private double currentDeployTime; + private int highestAmountOfArrowsAtOnce; + private int amountOfArrowsCreated; + + private Random rand; + private TextureRegion[][] arrowTextures; + private Array arrows; + private float elapsedTime; + //private BitmapFont font; + + //--- Constructor + public ArrowGenerator(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + + currentArrowLimit = MIN_ARROW_LIMIT; + currentDeployTime = ARROW_DEPLOY_START_TIME; + highestAmountOfArrowsAtOnce = 0; + amountOfArrowsCreated = 0; + + rand = new Random(); + arrowTextures = image.split(16, 16); + arrows = new Array(); + elapsedTime = -3; + //font = new BitmapFont(); + //font.setColor(Color.RED); + } + + + //--- Methods + @Override + public void update(float dt) { + elapsedTime += dt; + updateArrows(); + if (arrows.size < currentArrowLimit && elapsedTime >= currentDeployTime) { + addArrow(); + amountOfArrowsCreated++; + if (arrows.size > highestAmountOfArrowsAtOnce) highestAmountOfArrowsAtOnce = arrows.size; + } + for (Arrow arrow : arrows) arrow.update(dt); + } + + @Override + public void render(SpriteBatch batch) { + for (Arrow arrow : arrows) { + arrow.render(batch); + } + //font.draw(batch, "Current amount of arrows: " + String.valueOf(arrows.size), 64, 64); + } + + @Override + public void dispose() { + //font.dispose(); + } + + @Override + public String toString() {return "ArrowGenerator";} + + private void updateArrows() { + int modifier = handler.getGameState().getTimer().getTime() / 30; + currentArrowLimit = MIN_ARROW_LIMIT + (1 * modifier); + if (currentArrowLimit > MAX_ARROW_LIMIT) currentArrowLimit = MAX_ARROW_LIMIT; + if (currentArrowLimit > 10 && handler.getGameState().getTimer().getTime() % 40 == 0) { + currentDeployTime -= 0.1; + if (currentDeployTime < ARROW_DEPLOY_END_TIME) currentDeployTime = ARROW_DEPLOY_END_TIME; + } + } + + private void addArrow() { + int dir = rand.nextInt(4); + TextureRegion texture = arrowTextures[0][dir]; + int xx = Main.WIDTH, yy = Main.HEIGHT; + if (dir == 0 || dir == 2) { + if (dir == 0) { + xx = -96; + } + if (dir == 2) { + xx = Main.WIDTH + 32; + } + yy = rand.nextInt(Main.HEIGHT - 160) + 64; + } + else { + + if (dir == 1) { + yy = -96; + } + if (dir == 3) { + yy = Main.HEIGHT + 32; + } + xx = rand.nextInt(Main.WIDTH - 160) + 64; + } + + //handler.getGameObjectHandler().add(new Arrow(handler, xx, yy, texture, dir)); + arrows.add(new Arrow(handler, xx, yy, texture, dir)); + elapsedTime = 0; + } + + //--- Getters and Setters + public Array getArrows() {return arrows;} + public int getAmountOfArrowsCreated() {return amountOfArrowsCreated;} + public int getHighestAmountOfArrowsAtOnce() {return highestAmountOfArrowsAtOnce;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Button.java b/core/src/com/jalenwinslow/game/gameobjects/Button.java new file mode 100644 index 0000000..aaaec15 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Button.java @@ -0,0 +1,105 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.states.State; + +public class Button extends GameObject { + + //--- Propreties + private TextureRegion[][] images; + private BitmapFont font; + private String message; + private int imageIndex; + private boolean drawHealth; + private HealthBar health; + private int hitPoints; + + //--- Constructor + public Button(Handler handler, double x, double y, TextureRegion image, String message, int scale) { + super(handler, x, y, image); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/4+32, Main.HEIGHT/8); + images = image.split(112, 48); + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(scale); + font.setColor(Color.BLACK); + this.message = message; + imageIndex = 0; + drawHealth = false; + hitPoints = 60; + health = new HealthBar(handler, x, y, new TextureRegion(handler.getMenuState().getHealthTexture()), hitPoints); + health.setHealth(0); + } + + + //--- Methods + @Override + public void update(float dt) { + //checkIfMouseWithin(); + checkPlayerCollision(); + if (hitPoints < 0) {hitPoints = 0;} + health.setHealth(hitPoints); + if (hitPoints >= 60) { + buttonAction(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(images[imageIndex][0], bounds.x, bounds.y, bounds.width, bounds.height); + font.draw(batch, message, bounds.x+bounds.width/2, bounds.y+bounds.height, 0, Align.center, false); + if (drawHealth) health.render(batch); + } + + @Override + public void dispose() { + font.dispose(); + } + + @Override + public String toString() {return "Button";} + + private void buttonAction() { + if (message.equalsIgnoreCase("play")) { + State.setCurrenState(handler.getGameState()); + handler.getGameObjectHandler().dispose(); + handler.getGameState().init(); + handler.getMenuState().dispose(); + } else if (message.equalsIgnoreCase("Stats")) { + handler.getMenuState().setSubState(1); + } else if (message.equalsIgnoreCase("Exit")) { + State.setCurrenState(handler.getExitState()); + handler.getGameObjectHandler().dispose(); + State.getCurrentState().init(); + handler.getMenuState().dispose(); + } else if (message.equalsIgnoreCase("back")) { + handler.getMenuState().setSubState(0); + } + } + + private void checkPlayerCollision() { + if (bounds.overlaps(handler.getMenuState().getPlayer().getBounds())) { + drawHealth = true; + imageIndex = 1; + if (Gdx.input.isKeyPressed(Keys.E)) { + hitPoints++; + } else {hitPoints--;} + } else { + drawHealth = false; + imageIndex = 0; + hitPoints--; + } + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/GameObject.java b/core/src/com/jalenwinslow/game/gameobjects/GameObject.java new file mode 100644 index 0000000..554e2ae --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/GameObject.java @@ -0,0 +1,48 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; + +public abstract class GameObject { + + //--- Propreties + protected Handler handler; + protected double x, y; + protected int depth; + protected TextureRegion image; + protected Rectangle bounds; + + //--- Constructor + public GameObject(Handler handler, double x, double y, TextureRegion image) { + this.handler = handler; + this.x = x; + this.y = y; + this.depth = 0; + this.image = image; + } + + + //--- Methods + public abstract void update(float dt); + + public abstract void render(SpriteBatch batch); + + public abstract void dispose(); + + @Override + public abstract String toString(); + + public boolean getCollision(double x, double y) { + return (x <= bounds.x + bounds.width && x >= bounds.x && y >= bounds.y && y <= bounds.y + bounds.height); + } + + //--- Getters and Setters + public double getX() {return x;} + public double getY() {return y;} + public int getDepth() {return depth;} + public Rectangle getBounds() {return bounds;} + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/GameObjectHandler.java b/core/src/com/jalenwinslow/game/gameobjects/GameObjectHandler.java new file mode 100644 index 0000000..4b3a525 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/GameObjectHandler.java @@ -0,0 +1,78 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.utils.Array; +import com.jalenwinslow.game.Handler; + +public class GameObjectHandler { + + //--- Propreties + private Handler handler; + private Array gameObjects; + private int numberOfShortWalls; + private int numberOfTallWalls; + private int highestNumberOfShortWallsAtOnce; + private int highestNumberOfTallWallsAtOnce; + + //--- Constructor + public GameObjectHandler(Handler handler) { + this.handler = handler; + this.gameObjects = new Array(); + numberOfShortWalls = 0; + numberOfTallWalls = 0; + highestNumberOfShortWallsAtOnce = 0; + highestNumberOfTallWallsAtOnce = 0; + } + + + //--- Methods + public void update(float dt) { + sort(); + numberOfShortWalls = 0; + numberOfTallWalls = 0; + for (int i = 0; i < gameObjects.size; i++) { + //System.out.println(gameObjects.get(i).getClass().toString()); + //if (gameObjects.get(i).toString().equalsIgnoreCase("TallWall")) {handler.setMessage("Its here");} + if (gameObjects.get(i).toString().equalsIgnoreCase("ShortWall")) {numberOfShortWalls++;} + if (gameObjects.get(i).toString().equalsIgnoreCase("TallWall")) numberOfTallWalls++; + gameObjects.get(i).update(dt); + } + numberOfShortWalls -= 10; + if (numberOfShortWalls > highestNumberOfShortWallsAtOnce) highestNumberOfShortWallsAtOnce = numberOfShortWalls; + if (numberOfTallWalls > highestNumberOfTallWallsAtOnce) highestNumberOfTallWallsAtOnce = numberOfTallWalls; + //handler.setMessage("number of short walls: " + numberOfShortWalls); + } + + public void render(SpriteBatch batch) { + + for (GameObject gameObj : gameObjects) { + gameObj.render(batch); + } + + } + + public void dispose() { + gameObjects.clear(); + } + + public void sort() { + for (int i = 0; i < gameObjects.size - 1; i++) { + if (gameObjects.get(i).depth <= gameObjects.get(i+1).depth) { + gameObjects.swap(i, i+1); + } + } + } + + public void add(GameObject gameObject) { + gameObjects.add(gameObject); + } + + //--- Getters and Setters + public Array getGameObjects() {return gameObjects;} + public int getNumberOfShortWalls() {return numberOfShortWalls;} + public int getHighestNumberOfShortWallsAtOnce() {return highestNumberOfShortWallsAtOnce;} + public int getHighestNumberOfTallWallsAtOnce() {return highestNumberOfTallWallsAtOnce;} + + public void setGameObjects(Array array) {this.gameObjects = array;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/HealthBar.java b/core/src/com/jalenwinslow/game/gameobjects/HealthBar.java new file mode 100644 index 0000000..54a5924 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/HealthBar.java @@ -0,0 +1,57 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class HealthBar extends GameObject { + + //--- Propreties + private TextureRegion backHealth; + private TextureRegion healthArea; + + private float health; + private float totalHealth; + + //--- Constructor + public HealthBar(Handler handler, double x, double y, TextureRegion image, int totalHealth) { + super(handler, x, y, image); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/40); + TextureRegion[][] images = image.split(16, 4); + backHealth = images[0][0]; + healthArea = images[1][0]; + this.totalHealth = totalHealth; + this.health = this.totalHealth; + } + + + //--- Methods + @Override + public void update(float dt) { + + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(backHealth, bounds.x, bounds.y, bounds.width, bounds.height); + batch.draw(healthArea, bounds.x + 4, bounds.y + 4, (bounds.width - 8) * (health/totalHealth), bounds.height - 8); + } + + @Override + public void dispose() { + + } + + @Override + public String toString() {return "HealthBar";} + + //--- Getters and Setters + public float getHealth() {return health;} + public float getTotalHealth() {return totalHealth;} + + public void setHealth(float health) {this.health = health;} + public void setTotalHealth(float totalHealth) {this.totalHealth = totalHealth;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/PlayButton.java b/core/src/com/jalenwinslow/game/gameobjects/PlayButton.java new file mode 100644 index 0000000..69047a3 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/PlayButton.java @@ -0,0 +1,68 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.states.State; + +public class PlayButton extends GameObject { + + //--- Propreties + TextureRegion[][] btnImages; + TextureRegion currentTexture; + + //--- Constructor + public PlayButton(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + btnImages = image.split(image.getRegionWidth(), 48);//image.getRegionHeight()/3); + currentTexture = btnImages[0][0]; + bounds = new Rectangle((int)x - Main.WIDTH/8, (int)y - Main.HEIGHT/16, Main.WIDTH/4, Main.HEIGHT/8); + } + + + //--- Methods + @Override + public void update(float dt) { + handleAnimation(); + if (Gdx.input.justTouched() && Gdx.input.getX() < bounds.x + bounds.width && Gdx.input.getX() > bounds.x && + Gdx.input.getY() < bounds.y + bounds.height && Gdx.input.getY() > bounds.y) { + State.setCurrenState(handler.getGameState()); + handler.getGameState().init(); + handler.getMenuState().dispose(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(currentTexture, (int)bounds.x, (int)bounds.y, Main.WIDTH/4, Main.HEIGHT/8); + } + + @Override + public void dispose() { + + } + + @Override + public String toString() {return "PlayButton";} + + public void handleAnimation() { + if (Gdx.input.getX() < bounds.x + bounds.width && Gdx.input.getX() > bounds.x && + Gdx.input.getY() < bounds.y + bounds.height && Gdx.input.getY() > bounds.y) { + if (Gdx.input.isTouched()) { + currentTexture = btnImages[2][0]; + } else { + currentTexture = btnImages[1][0]; + } + } else { + currentTexture = btnImages[0][0]; + } + + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Player.java b/core/src/com/jalenwinslow/game/gameobjects/Player.java new file mode 100644 index 0000000..c54a18c --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Player.java @@ -0,0 +1,258 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.Animation; +import com.badlogic.gdx.graphics.g2d.Animation.PlayMode; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Array; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.gameobjects.TallWall.TallWallStates; + +public class Player extends GameObject { + + //--- Propreties + public static final double SPEED = 3.0; + + private int dir; + private double vecX, vecY; + private int wood; + private int highestNumberOfTallWallsCreated; + private int highestNumberOfTallWallsDestroyed; + private int numberOfWoodPickedUp; + + private Animation animDown, animUp, animRight; + private TextureRegion texture; + private float elapsedTime = 0; + private Rectangle boundsFeet; + + //private Texture boundsTexture = new Texture("DodgeGame_boundsMask.png"); + + //--- Constructor + public Player(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + + dir = 3; + vecX = 0; + vecY = 0; + wood = 0; + highestNumberOfTallWallsCreated = 0; + highestNumberOfTallWallsDestroyed = 0; + numberOfWoodPickedUp = 0; + createAnimation(); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/10 - 40, Main.HEIGHT/10 - 24); + boundsFeet = new Rectangle((int)x, (int)y, Main.WIDTH/10-40, Main.HEIGHT/10 -48); + } + + + //--- Methods + @Override + public void update(float dt) { + elapsedTime += dt; + handleInput(); + handleCollision(); + handleAnimation(); + x += vecX; + y += vecY; + depth = (int)y + Main.HEIGHT/20; + bounds.setPosition((float)x + 20, (float)y + 8); + boundsFeet.setPosition((float)x + 20, (float)y); + checks(); + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(texture, (int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + //batch.draw(boundsTexture, bounds.x, bounds.y, bounds.width, bounds.height); + } + + @Override + public void dispose() { + //image.dispose(); + //boundsTexture.dispose(); + } + + private void createAnimation() { + TextureRegion[][] splitTexture = image.split(16, 16); + Array array = new Array(splitTexture.length * splitTexture[0].length); + for (int i = 0; i < splitTexture[0].length; i++) { + array.add(splitTexture[0][i]); + } + animDown = new Animation(0.1f, array, PlayMode.LOOP); + array.clear(); + + for (TextureRegion t : splitTexture[1]) { + array.add(t); + } + animUp = new Animation(0.1f, array, PlayMode.LOOP); + array.clear(); + + for (TextureRegion t : splitTexture[2]) { + array.add(t); + } + animRight = new Animation(0.1f, array, PlayMode.LOOP); + array.clear(); + texture = animDown.getKeyFrame(elapsedTime); + } + + private void handleInput() { + if ( (Gdx.input.isKeyPressed(Keys.W) && Gdx.input.isKeyPressed(Keys.S)) || + (!Gdx.input.isKeyPressed(Keys.W) && !Gdx.input.isKeyPressed(Keys.S)) ) { + vecY = 0; + } else if (Gdx.input.isKeyPressed(Keys.W)) { + vecY = SPEED; + dir = 1; + } else if (Gdx.input.isKeyPressed(Keys.S)) { + vecY = -SPEED; + dir = 3; + } + + if ( (Gdx.input.isKeyPressed(Keys.A) && Gdx.input.isKeyPressed(Keys.D)) || + (!Gdx.input.isKeyPressed(Keys.A) && !Gdx.input.isKeyPressed(Keys.D)) ) { + vecX = 0; + } else if (Gdx.input.isKeyPressed(Keys.A)) { + vecX = -SPEED; + dir = 2; + } else if (Gdx.input.isKeyPressed(Keys.D)) { + vecX = SPEED; + dir = 0; + } + + if ( (Gdx.input.isKeyJustPressed(Keys.SPACE)) && wood >= 7) { + int arrayX = ((int)(boundsFeet.x + (boundsFeet.width/2))/64); + int arrayY = ((int)(boundsFeet.y + (boundsFeet.height/2))/64); + handler.getGameState().getGrid().setFree(false, arrayX, arrayY); + handler.getGameObjectHandler().add(new TallWall(handler, arrayX * 64, arrayY *64, new TextureRegion(handler.getGameState().getTallWallTexture())) ); + wood -= 7; + } + + } + + private void handleCollision() { + if (boundsFeet.x + boundsFeet.width + vecX >= Main.WIDTH-64) {vecX = 0;} + if (boundsFeet.x + vecX <= 64) vecX = 0; + if (boundsFeet.y + boundsFeet.height + vecY >= Main.HEIGHT-64) vecY = 0; + if (boundsFeet.y + vecY <= 0) {vecY = 0;} + + handleWallCollision(); + } + + private void handleWallCollision() {// Also breaking walls + + for (int i = 0; i < handler.getGameObjectHandler().getGameObjects().size; i++) { + if (handler.getGameObjectHandler().getGameObjects().get(i).toString().equalsIgnoreCase("ShortWall")) { + ShortWall wall = (ShortWall)handler.getGameObjectHandler().getGameObjects().get(i); + if (wall.getShowHealthBounds() != null && boundsFeet.overlaps(wall.getShowHealthBounds()) && Gdx.input.isKeyPressed(Keys.E)) { + if (wall.getHitPoints() > 0) { + wall.setHitPoints(wall.getHitPoints() - 1); + } + } + if (vecX < 0) { + if (wall.getCollision(boundsFeet.x + vecX, boundsFeet.y) || + wall.getCollision(boundsFeet.x + vecX, boundsFeet.y + boundsFeet.height)) { + vecX = 0; + } + } else if (vecX > 0) { + if (wall.getCollision(boundsFeet.x + boundsFeet.width + vecX, boundsFeet.y) || + wall.getCollision(boundsFeet.x + boundsFeet.width + vecX, boundsFeet.y + boundsFeet.height)) { + vecX = 0; + } + } + + if (vecY < 0) { + if (wall.getCollision(boundsFeet.x, boundsFeet.y + vecY) || + wall.getCollision(boundsFeet.x + boundsFeet.width, boundsFeet.y + vecY)) { + vecY = 0; + } + } else if (vecY > 0) { + if (wall.getCollision(boundsFeet.x, boundsFeet.y + boundsFeet.height + vecY) || + wall.getCollision(boundsFeet.x + boundsFeet.width, boundsFeet.y + boundsFeet.height + vecY)) { + vecY = 0; + } + } + } + if (handler.getGameObjectHandler().getGameObjects().get(i).toString().equalsIgnoreCase("TallWall")) { + TallWall wall = (TallWall)handler.getGameObjectHandler().getGameObjects().get(i); + if (wall.getState() == TallWallStates.startCreation) { + if (wall.getShowHealthBounds() != null && boundsFeet.overlaps(wall.getShowHealthBounds()) && Gdx.input.isKeyPressed(Keys.E)) { + if (wall.getHitPoints() < wall.getTotalHitPoints()) { + wall.setHitPoints(wall.getHitPoints() + 1); + } + } + } + + if (vecX < 0) { + if (wall.getCollision(boundsFeet.x + vecX, boundsFeet.y) || + wall.getCollision(boundsFeet.x + vecX, boundsFeet.y + boundsFeet.height)) { + vecX = 0; + } + } else if (vecX > 0) { + if (wall.getCollision(boundsFeet.x + boundsFeet.width + vecX, boundsFeet.y) || + wall.getCollision(boundsFeet.x + boundsFeet.width + vecX, boundsFeet.y + boundsFeet.height)) { + vecX = 0; + } + } + + if (vecY < 0) { + if (wall.getCollision(boundsFeet.x, boundsFeet.y + vecY) || + wall.getCollision(boundsFeet.x + boundsFeet.width, boundsFeet.y + vecY)) { + vecY = 0; + } + } else if (vecY > 0) { + if (wall.getCollision(boundsFeet.x, boundsFeet.y + boundsFeet.height + vecY) || + wall.getCollision(boundsFeet.x + boundsFeet.width, boundsFeet.y + boundsFeet.height + vecY)) { + vecY = 0; + } + } + } + } + } + + private void handleAnimation() { + Animation currentAnimation; + if (vecY > 0) dir = 1; + else if (vecY < 0) dir = 3; + else if (vecX > 0) dir = 0; + else if (vecX < 0) dir = 2; + + switch (dir) { + case 0: currentAnimation = animRight; break; + case 1: currentAnimation = animUp; break; + case 2: currentAnimation = animRight; break; + case 3: currentAnimation = animDown; break; + default: currentAnimation = animDown; break; + } + + if (vecX != 0 || vecY != 0) + texture = currentAnimation.getKeyFrame(elapsedTime); + else texture = currentAnimation.getKeyFrame(0); + + if (texture.isFlipX()) texture.flip(true, false); + if (dir == 2 && !texture.isFlipX()) texture.flip(true, false); + } + + private void checks() { + if (wood < 0) wood = 0; + if (wood > 20) wood = 20; + } + + @Override + public String toString() {return "Player";} + + //--- Getters and Setters + public Rectangle getBoundsFeet() {return boundsFeet;} + public int getWood() {return wood;} + public int getHighestNumberOfTallWallsCreated() {return highestNumberOfTallWallsCreated;} + public int getHighestNumberOfTallWallsDestroyed() {return highestNumberOfTallWallsDestroyed;} + public int getNumberOfWoodPickedUp() {return numberOfWoodPickedUp;} + + public void setWood(int wood) {this.wood = wood;} + public void setHighestNumberOfTallWallsCreated(int tallWalls) {this.highestNumberOfTallWallsCreated = tallWalls;} + public void setHighestNumberOfTallWallsDestroyed(int tallWalls) {this.highestNumberOfTallWallsDestroyed = tallWalls;} + public void setNumberOfWoodPickedUp(int wood) {this.numberOfWoodPickedUp = wood;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/ScoreBoard.java b/core/src/com/jalenwinslow/game/gameobjects/ScoreBoard.java new file mode 100644 index 0000000..c9627b1 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/ScoreBoard.java @@ -0,0 +1,78 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class ScoreBoard extends GameObject { + + //--- Propreties + private BitmapFont font; + private String message1; + private String messageOfScores; + + //--- Constructor + public ScoreBoard(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH*3/4, Main.HEIGHT/2 ); + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(2f); + font.getData().down = -20.0f; + font.setColor(Color.BLACK); + message1 = "Seconds survived in last round\n" + + "Longest survived in game\n\n" + + "Highest amount of\n" + + " arrows created\n" + + " arrows shot at once\n" + + " Short Walls created\n" + + " Short Walls at once\n" + + " Short Walls destroyed\n" + + " Tall Walls created\n" + + " Tall Walls at once\n" + + " Tall Walls destroyed\n" + + " wood picked up\n"; + messageOfScores = "" + handler.getScore().currentSecSurvived + "\n" + + handler.getScore().highestSecSurvived + "\n\n\n" + + handler.getScore().highestNumberOfArrowsCreated + "\n" + + handler.getScore().highestNumberOfArrowsShotAtOnce + "\n" + + handler.getScore().highestNumberOfShortWallsCreated + "\n" + + handler.getScore().highestNumberOfShortWallsAtOnce + "\n" + + handler.getScore().highestNumberOfShortWallsDestroyed + "\n" + + handler.getScore().highestNumberOfTallWallsCreated + "\n" + + handler.getScore().highestNumberOfTallWallsAtOnce + "\n" + + handler.getScore().highestNumberOfTallWallsDestroyed + "\n" + + handler.getScore().highestNumberOfWoodPickedUp; + } + + + //--- Methods + @Override + public void update(float dt) { + + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(image, bounds.x, bounds.y, bounds.width, bounds.height); + font.draw(batch, message1, bounds.x+bounds.width/20, bounds.y+bounds.height-8, 0, Align.topLeft, false); + font.draw(batch, messageOfScores, bounds.x + bounds.width - bounds.width/20, bounds.y+bounds.height-8, 0, Align.right,false); + } + + @Override + public void dispose() { + font.dispose(); + } + + @Override + public String toString() {return "ScoreBoard";} + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/ShortWall.java b/core/src/com/jalenwinslow/game/gameobjects/ShortWall.java new file mode 100644 index 0000000..a1be368 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/ShortWall.java @@ -0,0 +1,170 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.states.State; +import java.util.Random; + +public class ShortWall extends Wall { + + //--- Propreties + enum ShortWallStates { + creation, + normal, + standard + } + + private Random rand; + private ShortWallStates state; + private TextureRegion texture; + private Rectangle deathBounds; + private Rectangle showHealthBounds; + private Rectangle noPlayerBounds; + + private int hitPoints; + private HealthBar health; + private boolean breakable; + private boolean drawHealth; + private float timer; + private float elapsedTime; + private float alpha; + //Texture boundsTexture = new Texture("DodgeGame_boundsMask.png"); + + //--- Constructor + public ShortWall(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + rand = new Random(); + chooseImage(); + depth = (int)y + Main.HEIGHT/20; + hitPoints = 1; + this.breakable = false; + drawHealth = false; + timer = 0; + elapsedTime = 0; + alpha = 1; + state = ShortWallStates.standard; + } + + public ShortWall(Handler handler, double x, double y, TextureRegion image, boolean breakable) { + super(handler, x, y, image); + bounds = new Rectangle(); + noPlayerBounds = new Rectangle((int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + rand = new Random(); + deathBounds = new Rectangle(); + showHealthBounds = new Rectangle(); + chooseImage(); + depth = (int) y + Main.HEIGHT/20; + hitPoints = 900; + health = new HealthBar(handler, x, y, new TextureRegion(handler.getGameState().getHealthTexture()), hitPoints); + this.breakable = breakable; + drawHealth = false; + timer = 0; + elapsedTime = 0; + alpha = 0; + state = ShortWallStates.creation; + } + + + //--- Methods + @Override + public void update(float dt) { + + switch (state) { + case creation: + elapsedTime += dt; + if (!noPlayerBounds.overlaps(handler.getGameState().getPlayer().getBoundsFeet())) { + bounds = new Rectangle(noPlayerBounds); + } + if (elapsedTime >= 0.25 && timer <= 2) { + timer += 0.25; + elapsedTime -= 0.25; + if (alpha == 0) alpha = 1; + else alpha = 0; + } + if (timer > 2) { + alpha = 1; + if (bounds == null) { + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + } + deathBounds = new Rectangle((int)x+8, (int)y+8, Main.WIDTH/10-16, Main.HEIGHT/10-16); + showHealthBounds = new Rectangle((int)x-8, (int)y-8, Main.WIDTH/10+16, Main.HEIGHT/10+16); + health.bounds.x = bounds.x; + health.bounds.y = bounds.y + bounds.height + (Main.HEIGHT/40) + 4; + state = ShortWallStates.normal; + } + break; + case normal: + boundCollisions(); + health.setHealth(hitPoints); + if (hitPoints <= 0) { + for (int i = 0; i < handler.getGameObjectHandler().getGameObjects().size; i++) { + if (handler.getGameObjectHandler().getGameObjects().get(i).equals(this)) { + handler.getGameState().getPlayer().setWood(handler.getGameState().getPlayer().getWood()+2); + handler.getGameState().getGrid().setFree(true, (int)(x / handler.getGameState().getGrid().getAreaWidth()), (int)(y / handler.getGameState().getGrid().getAreaHeight())); + handler.getGameState().getWallGen().setHighestNumberOfShortWallsDestroyed(handler.getGameState().getWallGen().getHighestNumberOfShortWallsDestroyed() + 1); + handler.getGameObjectHandler().getGameObjects().removeValue(this, false); + } + } + } + break; + case standard: + + break; + default: + + break; + } + + } + + @Override + public void render(SpriteBatch batch) { + batch.setColor(1, 1, 1, alpha); + batch.draw(texture, (int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10+(Main.HEIGHT/40)); + batch.setColor(1, 1, 1, 1); + + if (drawHealth) { + health.render(batch); + } + } + + @Override + public void dispose() { + //boundsTexture.dispose(); + } + + @Override + public String toString() {return "ShortWall";} + + private void chooseImage() { + TextureRegion[][] images = image.split(16, 20); + texture = images[0][rand.nextInt(images[0].length)]; + } + + private void boundCollisions() { + if (deathBounds.overlaps(handler.getGameState().getPlayer().getBoundsFeet())) { + handler.getGameState().getTimer().stop(); + State.setCurrenState(handler.getGameOverState()); + State.getCurrentState().init(); + handler.getGameObjectHandler().dispose(); + handler.getGameState().dispose(); + } + drawHealth = (showHealthBounds.overlaps(handler.getGameState().getPlayer().getBoundsFeet())); + } + + //--- Getters and Setters + public boolean isBreakable() {return breakable;} + public int getHitPoints() {return hitPoints;} + public Rectangle getDeathBounds() {return deathBounds;} + public Rectangle getShowHealthBounds() {return showHealthBounds;} + + public void setBreakable(boolean breakable) {this.breakable = breakable;} + public void setHitPoints(int hitPoints) {this.hitPoints = hitPoints;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/TallWall.java b/core/src/com/jalenwinslow/game/gameobjects/TallWall.java new file mode 100644 index 0000000..5740944 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/TallWall.java @@ -0,0 +1,128 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class TallWall extends Wall { + + //--- Propreties + enum TallWallStates{ + waitingCreation, + startCreation, + normal + } + + private TextureRegion[][] texture; + private TallWallStates state; + private int imageIndex; + private int hitPoints; + private int totalHitPoints; + private boolean drawHealth; + private HealthBar health; + + private Rectangle showHealthBounds; + private Rectangle noPlayerBounds; + private Rectangle noArrowBounds; + + //private Texture boundsTexture = new Texture("DodgeGame_boundsMask.png"); + + //--- Constructor + public TallWall(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + bounds = new Rectangle(); + depth = (int)y + Main.HEIGHT/20; + texture = image.split(16, 24); + state = TallWallStates.waitingCreation; + imageIndex = 2; + hitPoints = 0; + totalHitPoints = 600; + drawHealth = false; + health = new HealthBar(handler, x, y, new TextureRegion(handler.getGameState().getHealthTexture()), totalHitPoints); + health.setHealth(hitPoints); + showHealthBounds = new Rectangle(); + noPlayerBounds = new Rectangle((int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + noArrowBounds = new Rectangle(); + } + + + //--- Methods + @Override + public void update(float dt) { + switch (state) { + case waitingCreation: + if (!noPlayerBounds.overlaps(handler.getGameState().getPlayer().getBoundsFeet())) { + state = TallWallStates.startCreation; + bounds = new Rectangle(noPlayerBounds); + showHealthBounds = new Rectangle((int)x-8, (int)y-8, bounds.width+16, bounds.height+16); + health.bounds.y = bounds.y+bounds.height+(Main.HEIGHT/20)+4; + imageIndex = 1; + } + break; + case startCreation: + boundCollisions(); + health.setHealth(hitPoints); + if (hitPoints >= totalHitPoints) { + state = TallWallStates.normal; + noArrowBounds = new Rectangle(bounds); + noArrowBounds.width += 8; + noArrowBounds.y += 16; + imageIndex = 0; + handler.getGameState().getPlayer().setHighestNumberOfTallWallsCreated(handler.getGameState().getPlayer().getHighestNumberOfTallWallsCreated() + 1); + } + break; + case normal: + boundCollisions(); + health.setHealth(hitPoints); + if (hitPoints <= 0) { + for (int i = 0; i < handler.getGameObjectHandler().getGameObjects().size; i++) { + if (handler.getGameObjectHandler().getGameObjects().get(i).equals(this)) { + handler.getGameState().getGrid().setFree(true, (int)(x / handler.getGameState().getGrid().getAreaWidth()), (int)(y / handler.getGameState().getGrid().getAreaHeight())); + handler.getGameState().getPlayer().setHighestNumberOfTallWallsDestroyed(handler.getGameState().getPlayer().getHighestNumberOfTallWallsDestroyed()+1); + handler.getGameObjectHandler().getGameObjects().removeValue(this, false); + } + } + } + break; + default: + + break; + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(texture[0][imageIndex], noPlayerBounds.x, noPlayerBounds.y, noPlayerBounds.width, noPlayerBounds.height + (noPlayerBounds.height/2)); + //batch.draw(boundsTexture, noArrowBounds.x, noArrowBounds.y, noArrowBounds.width, noArrowBounds.height); + if (drawHealth) { + health.render(batch); + } + } + + @Override + public void dispose() { + //boundsTexture.dispose(); + } + + @Override + public String toString() {return "TallWall";} + + public void boundCollisions() { + drawHealth = (showHealthBounds.overlaps(handler.getGameState().getPlayer().getBoundsFeet())); + } + + //--- Getters and Setters + public int getHitPoints() {return hitPoints;} + public int getTotalHitPoints() {return totalHitPoints;} + public Rectangle getShowHealthBounds() {return showHealthBounds;} + public Rectangle getNoPlayerBounds() {return noPlayerBounds;} + public Rectangle getNoArrowBounds() {return noArrowBounds;} + public TallWallStates getState() {return state;} + + public void setHitPoints(int hitPoints) {this.hitPoints = hitPoints;} + public void setState(TallWallStates state) {this.state = state;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Timer.java b/core/src/com/jalenwinslow/game/gameobjects/Timer.java new file mode 100644 index 0000000..8780aeb --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Timer.java @@ -0,0 +1,77 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class Timer extends GameObject { + + //--- Propreties + private int time; + private float elapsedTime; + private BitmapFont font; + //private Label label; + private boolean playing; + private Texture timerCaseTexture; + + //--- Constructor + public Timer(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + time = 0; + elapsedTime = 0; + + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(3, 3); + font.setColor(Color.BLACK); + + playing = true; + timerCaseTexture = new Texture("b&w_DodgeGame_timerCase.png"); + } + + + //--- Methods + @Override + public void update(float dt) { + if (playing) { + elapsedTime += dt; + if (elapsedTime >= 1) { + time++; + elapsedTime = 0; + } + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(timerCaseTexture, Main.WIDTH/2-(Main.WIDTH/12), Main.HEIGHT-Main.HEIGHT/20, Main.WIDTH/6, Main.HEIGHT/20); + font.draw(batch, String.valueOf(time), Main.WIDTH/2, Main.HEIGHT+4, 0, Align.center, false); + } + + @Override + public void dispose() { + timerCaseTexture.dispose(); + font.dispose(); + } + + @Override + public String toString() {return "Timer";} + + public void stop() { + playing = false; + } + + //--- Getters and Setters + public int getTime() {return time;} + public boolean isPlaying() {return playing;} + + public void setTime(int time) {this.time = time;} + public void setPlaying(boolean playing) {this.playing = playing;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Wall.java b/core/src/com/jalenwinslow/game/gameobjects/Wall.java new file mode 100644 index 0000000..96060c9 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Wall.java @@ -0,0 +1,25 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.jalenwinslow.game.Handler; + +public abstract class Wall extends GameObject { + + //--- Propreties + + + //--- Constructor + public Wall(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + } + + + //--- Methods + public boolean hasCollided(double x, double y) { + return (x >= bounds.x && y >= bounds.y && x <= bounds.x + bounds.width && y <= bounds.y + bounds.height); + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/WallGenerator.java b/core/src/com/jalenwinslow/game/gameobjects/WallGenerator.java new file mode 100644 index 0000000..f626d82 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/WallGenerator.java @@ -0,0 +1,116 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.jalenwinslow.game.Handler; +import java.util.Random; + +public class WallGenerator extends GameObject { + + //--- Propreties + public static final byte MIN_WALL_COUNT = 5, MAX_WALL_COUNT = 30; + public static final int END_DEPLOY_TIME = 15, START_DEPLOY_TIME = 30; + + private Random rand; + + private int wallLimit; + private int baseTimeCount; + private int timeCount; + private int timer; + private float elapsedTime; + private int highestNumberOfShortWallsCreated; + private int highestNumberOfShortWallsDestroyed; + + //--- Constructor + public WallGenerator(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + + rand = new Random(); + + wallLimit = MAX_WALL_COUNT; + baseTimeCount = START_DEPLOY_TIME; + timeCount = baseTimeCount + (rand.nextInt(7) - 3); + timer = 0; + elapsedTime = 0; + highestNumberOfShortWallsCreated = 0; + highestNumberOfShortWallsDestroyed = 0; + + for (int i = 0; i < 3; i++) {addWall();} + } + + + //--- Methods + @Override + public void update(float dt) { + elapsedTime += dt; + if (elapsedTime >= 1) { + timer++; + elapsedTime--; + } + if (timer >= timeCount && (handler.getGameObjectHandler().getNumberOfShortWalls() - 10) < wallLimit) { + if (rand.nextInt(100)+1 <= 75) { + addWall(); + } + timer = 0; + if (baseTimeCount > END_DEPLOY_TIME) baseTimeCount--; + timeCount = baseTimeCount + (rand.nextInt(7)-3); + } + + + } + + @Override + public void render(SpriteBatch batch) { + + } + + @Override + public void dispose() { + + } + + @Override + public String toString() {return "WallGenerator";} + + public void updateWallStats() { + + } + + private void addWall() { + int arrayX = rand.nextInt(8)+1; + int arrayY = rand.nextInt(8)+1; + while (true) { + if (handler.getGameState().getGrid().isFree()[arrayY][arrayX] == true) { + break; + } else { + if (arrayX < 8) arrayX++; + else { + if (arrayY < 8) { + arrayY++; + arrayX = 1; + } else { + arrayY = 1; + arrayX = 1; + } + } + } + } + + handler.getGameState().getGrid().setFree(false, arrayX, arrayY); + + int xx = handler.getGameState().getGrid().getAreaWidth() * (arrayX); + int yy = handler.getGameState().getGrid().getAreaHeight() * (arrayY); + + handler.getGameObjectHandler().add(new ShortWall(handler, xx, yy, image, true)); + + highestNumberOfShortWallsCreated++; + } + + + //--- Getters and Setters + public int getHighestNumberOfShortWallsCreated() {return highestNumberOfShortWallsCreated;} + public int getHighestNumberOfShortWallsDestroyed() {return highestNumberOfShortWallsDestroyed;} + + public void setHighestNumberOfShortWallsDestroyed(int number) {this.highestNumberOfShortWallsDestroyed = number;} + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/Wood.java b/core/src/com/jalenwinslow/game/gameobjects/Wood.java new file mode 100644 index 0000000..f226a7f --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/Wood.java @@ -0,0 +1,76 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import java.util.Random; + +public class Wood extends GameObject { + + //--- Propreties + private float timer; + private float elapsedTime; + private float alpha; + + //--- Constructor + public Wood(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + bounds = new Rectangle((int)x+16, (int)y+16, Main.WIDTH/20, Main.HEIGHT/20); + depth = (int)bounds.y + (int)bounds.width/2; + timer = 0; + elapsedTime = 0; + alpha = 1; + } + + + //--- Methods + @Override + public void update(float dt) { + elapsedTime += dt; + boundCollision(); + if (timer >= 10) { + if (elapsedTime >= 0.25) { + if (alpha == 1) alpha = 0; + else alpha = 1; + } + if (timer >= 13) { + handler.getGameObjectHandler().getGameObjects().removeValue(this, false); + } + } + if (elapsedTime >= 0.25) { + timer += 0.25; + elapsedTime -= 0.25; + } + + } + + @Override + public void render(SpriteBatch batch) { + batch.setColor(1, 1, 1, alpha); + batch.draw(image, (int)x, (int)y, Main.WIDTH/10, Main.HEIGHT/10); + batch.setColor(1, 1, 1, 1); + } + + @Override + public void dispose() { + + } + + @Override + public String toString() {return "Wood";} + + public void boundCollision() { + if (bounds.overlaps(handler.getGameState().getPlayer().getBounds())) { + handler.getGameState().getPlayer().setWood(handler.getGameState().getPlayer().getWood() + 1); + handler.getGameState().getPlayer().setNumberOfWoodPickedUp(handler.getGameState().getPlayer().getNumberOfWoodPickedUp() + 1); + handler.getGameObjectHandler().getGameObjects().removeValue(this, false); + } + } + + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/WoodGUI.java b/core/src/com/jalenwinslow/game/gameobjects/WoodGUI.java new file mode 100644 index 0000000..b418af5 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/WoodGUI.java @@ -0,0 +1,60 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.math.Rectangle; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class WoodGUI extends GameObject { + + //--- Propreties + private BitmapFont font; + private TextureRegion[][] texture; + private TextureRegion backTexture; + + private Texture boundsTexture = new Texture("DodgeGame_boundsMask.png"); + + //--- Constructor + public WoodGUI(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + bounds = new Rectangle((int)x, (int)y, Main.WIDTH/5, Main.HEIGHT/20); + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(3, 3); + font.setColor(Color.WHITE); + backTexture = new TextureRegion(handler.getGameState().getHealthTexture()).split(16, 4)[0][0]; + texture = image.split(16, 16); + } + + + //--- Methods + @Override + public void update(float dt) { + + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(backTexture, bounds.x-bounds.width, bounds.y, bounds.width, bounds.height); + font.draw(batch, "x " + handler.getGameState().getPlayer().getWood(), bounds.x-64, bounds.y+Main.HEIGHT/20, 0, Align.left, false); + batch.draw(texture[0][0], bounds.x-bounds.width+16, bounds.y-4, Main.WIDTH/16, Main.HEIGHT/16); + } + + @Override + public void dispose() { + font.dispose(); + boundsTexture.dispose(); + } + + @Override + public String toString() {return "WoodGUI";} + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/gameobjects/WoodGenerator.java b/core/src/com/jalenwinslow/game/gameobjects/WoodGenerator.java new file mode 100644 index 0000000..7a02495 --- /dev/null +++ b/core/src/com/jalenwinslow/game/gameobjects/WoodGenerator.java @@ -0,0 +1,92 @@ +package com.jalenwinslow.game.gameobjects; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.jalenwinslow.game.Handler; +import java.util.Random; + +public class WoodGenerator extends GameObject { + + //--- Propreties + private Random rand; + private int timer; + private float elapsedTime; + private int baseTime; + private int countDown; + private int numberOfWoodCreated; + private TextureRegion[][] images; + + //--- Constructor + public WoodGenerator(Handler handler, double x, double y, TextureRegion image) { + super(handler, x, y, image); + rand = new Random(); + timer = 0; + elapsedTime = 0; + baseTime = 20; + countDown = baseTime + rand.nextInt(11); + numberOfWoodCreated = 0; + images = image.split(16, 16); + } + + + //--- Methods + @Override + public void update(float dt) { + elapsedTime += dt; + if (elapsedTime >= 1) { + timer++; + elapsedTime--; + } + if (timer >= countDown) { + if (rand.nextInt(10)+1 <= 6) { + int arrayX = rand.nextInt(8)+1; + int arrayY = rand.nextInt(8)+1; + + while (true) { + if (handler.getGameState().getGrid().isFree()[arrayY][arrayX]) { + break; + } else { + if (arrayX < 8) arrayX++; + else { + if (arrayY < 8) { + arrayY++; + arrayX = 1; + } + else { + arrayX = 1; + arrayY = 1; + } + } + } + } + + handler.getGameState().getGrid().setFree(false, arrayX, arrayY); + + int xx = handler.getGameState().getGrid().getAreaWidth() * arrayX; + int yy = handler.getGameState().getGrid().getAreaHeight() * arrayY; + + handler.getGameObjectHandler().add(new Wood(handler, xx, yy, images[0][rand.nextInt(8)])); + numberOfWoodCreated = 0; + } + timer = 0; + countDown = 20 + rand.nextInt(11); + } + } + + @Override + public void render(SpriteBatch batch) { + + } + + @Override + public void dispose() { + + } + + @Override + public String toString() {return "WoodGenerator";} + + //--- Getters and Setters + public int getNumberOfWoodCreated() {return numberOfWoodCreated;} + +} diff --git a/core/src/com/jalenwinslow/game/states/ExitState.java b/core/src/com/jalenwinslow/game/states/ExitState.java new file mode 100644 index 0000000..a6c2add --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/ExitState.java @@ -0,0 +1,66 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class ExitState extends State { + + //--- Propreties + BitmapFont font; + Texture texture; + float elapsedTime; + float timer; + String dots; + + //--- Constructor + public ExitState(Handler handler) { + super(handler); + } + + + //--- Methods + @Override + public void init() { + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(6); + font.setColor(Color.WHITE); + texture = new Texture("b&w_DodgeGame_gamePaused.png"); + elapsedTime = 0; + timer = 0; + dots = ""; + } + + @Override + public void update(float dt) { + elapsedTime += dt; + if (elapsedTime >= 1) { + timer++; + elapsedTime--; + } + if (timer >= 2) { + Gdx.app.exit(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(texture, 0, 0, Main.WIDTH, Main.HEIGHT); + font.draw(batch, "Exiting", Main.WIDTH/2, Main.HEIGHT/2, 0, Align.center, false); + } + + @Override + public void dispose() { + font.dispose(); + texture.dispose(); + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/states/GameOverState.java b/core/src/com/jalenwinslow/game/states/GameOverState.java new file mode 100644 index 0000000..ba1c057 --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/GameOverState.java @@ -0,0 +1,62 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class GameOverState extends State { + + //--- Propreties + private Texture gameOverTexture; + private BitmapFont font; + + //--- Constructor + public GameOverState(Handler handler) { + super(handler); + } + + + //--- Methods + @Override + public void init() { + handler.getScore().updateScores(); + handler.getScore().updateScoreFile(); + handler.getGameObjectHandler().dispose(); + handler.getGameState().dispose(); + gameOverTexture = new Texture("b&w_DodgeGame_GameOver.png"); + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(3, 3); + font.setColor(Color.WHITE); + } + + @Override + public void update(float dt) { + if (Gdx.input.justTouched()) { + State.setCurrenState(handler.getMenuState()); + State.getCurrentState().init(); + dispose(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(gameOverTexture, 0, 0, Main.WIDTH, Main.HEIGHT); + font.draw(batch, "CLICK LEFT TO CONTINUE", 16, Main.HEIGHT-16); + font.draw(batch, "SURVIVED FOR " + String.valueOf(handler.getGameState().getTimer().getTime()) + " SEC", Main.WIDTH/2, Main.HEIGHT/2 - 64, 0, Align.center, false); + } + + @Override + public void dispose() { + if (gameOverTexture != null) gameOverTexture.dispose(); + if (font != null) font.dispose(); + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/states/GameState.java b/core/src/com/jalenwinslow/game/states/GameState.java new file mode 100644 index 0000000..beea938 --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/GameState.java @@ -0,0 +1,117 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.gameobjects.*; +import com.jalenwinslow.game.utils.Grid; +import java.util.Random; + +public class GameState extends State{ + + //--- Propreties + Texture background; + Texture playerTexture; + Texture woodTexture; + Texture arrowTexture; + Texture wallTexture; + Texture tallWallTexture; + Texture healthTexture; + + private Player player; + private WoodGUI woodGui; + private Grid grid; + private ArrowGenerator arrowGen; + private WallGenerator wallGen; + private WoodGenerator woodGen; + private Wall[] bottomWalls; + private Timer timer; + private Random rand; + + //--- Constructor + public GameState(Handler handler) { + super(handler); + } + + + //--- Methods + @Override + public void init() { + background = new Texture("b&w_DodgeGame_background2.png"); + playerTexture = new Texture("b&w_DodgeGame_man1.png"); + woodTexture = new Texture("b&w_DodgeGame_wood1.png"); + arrowTexture = new Texture("b&w_DodgeGame_arrow.png"); + wallTexture = new Texture("b&w_DodgeGame_wall1.png"); + tallWallTexture = new Texture("b&w_DodgeGame_tallWall1.png"); + healthTexture = new Texture("b&w_DodgeGame_health1.png"); + player = new Player(handler, Main.WIDTH/2, Main.HEIGHT/2, new TextureRegion(playerTexture)); + woodGui = new WoodGUI(handler, Main.WIDTH, 0, new TextureRegion(woodTexture)); + grid = new Grid(handler); + arrowGen = new ArrowGenerator(handler, 0, 0, new TextureRegion(arrowTexture)); + wallGen = new WallGenerator(handler, 0, 0, new TextureRegion(wallTexture)); + woodGen = new WoodGenerator(handler, 0, 0, new TextureRegion(woodTexture)); + bottomWalls = new Wall[Main.WIDTH/64]; + for (int i = 0; i < Main.WIDTH/64; i++) { + bottomWalls[i] = new ShortWall(handler, 64*i, 0, new TextureRegion(wallTexture)); + } + timer = new Timer(handler, Main.WIDTH/2, Main.HEIGHT-(Main.HEIGHT/10+32), null); + + handler.getGameObjectHandler().add(player); + handler.getGameObjectHandler().getGameObjects().addAll(bottomWalls, 0, bottomWalls.length); + } + + @Override + public void update(float dt) { + handler.getGameObjectHandler().update(dt); + arrowGen.update(dt); + wallGen.update(dt); + woodGen.update(dt); + timer.update(dt); + woodGui.update(dt); + if (Gdx.input.isKeyJustPressed(Keys.P)) { + State.setCurrenState(handler.getPauseState()); + State.getCurrentState().init(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(background, 0, 0, Main.WIDTH, Main.HEIGHT); + handler.getGameObjectHandler().render(batch); + arrowGen.render(batch); + wallGen.render(batch); + woodGen.render(batch); + timer.render(batch); + woodGui.render(batch); + } + + @Override + public void dispose() { + if (background != null) background.dispose(); + if (playerTexture != null) playerTexture.dispose(); + if (arrowTexture != null) arrowTexture.dispose(); + if (wallTexture != null) wallTexture.dispose(); + if (woodTexture != null) woodTexture.dispose(); + if (tallWallTexture != null) tallWallTexture.dispose(); + if (healthTexture != null) healthTexture.dispose(); + if (timer != null) timer.dispose(); + if (woodGui != null) woodGui.dispose(); + } + + //--- Getters and Setters + public Texture getHealthTexture() {return healthTexture;} + public Texture getTallWallTexture() {return tallWallTexture;} + + public Player getPlayer() {return player;} + public Grid getGrid() {return grid;} + public ArrowGenerator getArrowGen() {return arrowGen;} + public WallGenerator getWallGen() {return wallGen;} + public WoodGenerator getWoodGen() {return woodGen;} + public Wall[] getBottomWalls() {return bottomWalls;} + public Timer getTimer() {return timer;} + +} diff --git a/core/src/com/jalenwinslow/game/states/MenuState.java b/core/src/com/jalenwinslow/game/states/MenuState.java new file mode 100644 index 0000000..9b5cea6 --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/MenuState.java @@ -0,0 +1,131 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; +import com.jalenwinslow.game.gameobjects.Button; +import com.jalenwinslow.game.gameobjects.Player; +import com.jalenwinslow.game.gameobjects.ScoreBoard; +import com.jalenwinslow.game.gameobjects.ShortWall; +import com.jalenwinslow.game.gameobjects.Wall; + +public class MenuState extends State{ + + //--- Propreties + private int subState; + + Texture menuBg; + //Texture playButtonTexture; + Texture buttonTexture; + Texture playerTexture; + Texture wallTexture; + Texture healthTexture; + Texture scoreBoardTexture; + + private Button[] buttons; + private Button backButton; + private Player player; + private Wall[] bottomWalls; + private ScoreBoard scoreBoard; + //private PlayButton playBtn; + + //--- Constructor + public MenuState(Handler handler) { + super(handler); + } + + + //--- Methods + @Override + public void init() { + subState = 0; + + menuBg = new Texture("b&w_DodgeGame_background2.png"); + //playButtonTexture = new Texture("b&w_DodgeGame_playButton.png"); + buttonTexture = new Texture("b&w_DodgeGame_buttons1.png"); + playerTexture = new Texture("b&w_DodgeGame_man1.png"); + wallTexture = new Texture("b&w_DodgeGame_wall1.png"); + healthTexture = new Texture("b&w_DodgeGame_health1.png"); + scoreBoardTexture = new Texture("b&w_DodgeGame_scoreBoard.png"); + buttons = new Button[3]; + buttons[0] = new Button(handler, Main.WIDTH/4-64, Main.HEIGHT*3/4-96, new TextureRegion(buttonTexture), "PLAY", 6); + buttons[1] = new Button(handler, Main.WIDTH*3/4-(64*2), Main.HEIGHT*3/4-96, new TextureRegion(buttonTexture), "STATS", 6); + buttons[2] = new Button(handler, Main.WIDTH/4-64, Main.HEIGHT/4+32, new TextureRegion(buttonTexture), "EXIT", 6 ); + player = new Player(handler, Main.WIDTH/2, Main.HEIGHT/2, new TextureRegion(playerTexture)); + backButton = new Button(handler, Main.WIDTH/2-96, Main.HEIGHT/4-64, new TextureRegion(buttonTexture), "BACK", 6); + bottomWalls = new Wall[Main.WIDTH/64]; + for (int i = 0; i < bottomWalls.length; i++) { + bottomWalls[i] = new ShortWall(handler, 64*i, 0, new TextureRegion(wallTexture)); + } + scoreBoard = new ScoreBoard(handler, Main.WIDTH/8, Main.HEIGHT*3/8, new TextureRegion(scoreBoardTexture)); + handler.getGameObjectHandler().add(player); + handler.getGameObjectHandler().getGameObjects().addAll(bottomWalls, 0, bottomWalls.length); + //playBtn = new PlayButton(handler, Main.WIDTH/2, Main.HEIGHT/2, new TextureRegion(playButtonTexture)); + } + + @Override + public void update(float dt) { + switch (subState) { + case 0: + for (Button button : buttons) { + if (button != null) button.update(dt); + } + break; + case 1: + backButton.update(dt); + break; + default: + + break; + } + handler.getGameObjectHandler().update(dt); + } + + @Override + public void render(SpriteBatch batch) { + batch.draw(menuBg, 0, 0, Main.WIDTH, Main.HEIGHT); + switch (subState) { + case 0: + for (Button button : buttons) { + if (button != null) button.render(batch); + } + break; + case 1: + scoreBoard.render(batch); + backButton.render(batch); + break; + default: + + break; + } + handler.getGameObjectHandler().render(batch); + + } + + @Override + public void dispose() { + menuBg.dispose(); + buttonTexture.dispose(); + playerTexture.dispose(); + wallTexture.dispose(); + healthTexture.dispose(); + scoreBoardTexture.dispose(); + scoreBoard.dispose(); + for (Button button: buttons) {button.dispose();} + backButton.dispose(); + //playButtonTexture.dispose(); + //player = null; + //buttons = null; + //bottomWalls = null; + } + + //--- Getters and Setters + public Player getPlayer() {return player;} + public Texture getHealthTexture() {return healthTexture;} + public int getSubState() {return subState;} + + public void setSubState(int subState) {this.subState = subState;} + +} diff --git a/core/src/com/jalenwinslow/game/states/PauseState.java b/core/src/com/jalenwinslow/game/states/PauseState.java new file mode 100644 index 0000000..00462a7 --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/PauseState.java @@ -0,0 +1,57 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.utils.Align; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.Main; + +public class PauseState extends State { + + //--- Propreties + Texture background; + BitmapFont font; + + //--- Constructor + public PauseState(Handler handler) { + super(handler); + } + + + //--- Methods + @Override + public void init() { + background = new Texture("b&w_DodgeGame_gamePaused.png"); + font = new BitmapFont(Gdx.files.internal("customFont4.fnt")); + font.getData().setScale(6); + } + + @Override + public void update(float dt) { + if (Gdx.input.isKeyJustPressed(Keys.P)) { + State.setCurrenState(handler.getGameState()); + dispose(); + } + } + + @Override + public void render(SpriteBatch batch) { + batch.setColor(1, 1, 1, 0.2f); + batch.draw(background, 0, 0, Main.WIDTH, Main.HEIGHT); + batch.setColor(1, 1, 1, 1); + font.draw(batch, "Game Paused", Main.WIDTH/2, Main.HEIGHT/2, 0, Align.center, false); + } + + @Override + public void dispose() { + background.dispose(); + font.dispose(); + } + + //--- Getters and Setters + + +} diff --git a/core/src/com/jalenwinslow/game/states/State.java b/core/src/com/jalenwinslow/game/states/State.java new file mode 100644 index 0000000..5f46c1e --- /dev/null +++ b/core/src/com/jalenwinslow/game/states/State.java @@ -0,0 +1,32 @@ +package com.jalenwinslow.game.states; + +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.jalenwinslow.game.Handler; + +public abstract class State { + + //--- Propreties + protected static State currentState = null; + protected Handler handler; + + //--- Constructor + public State(Handler handler) { + this.handler = handler; + } + + + //--- Methods + public abstract void init(); + + public abstract void update(float dt); + + public abstract void render(SpriteBatch batch); + + public abstract void dispose(); + + //--- Getters and Setters + public static State getCurrentState() {return State.currentState;} + + public static void setCurrenState(State state) {currentState = state;} + +} diff --git a/core/src/com/jalenwinslow/game/utils/Grid.java b/core/src/com/jalenwinslow/game/utils/Grid.java new file mode 100644 index 0000000..e459577 --- /dev/null +++ b/core/src/com/jalenwinslow/game/utils/Grid.java @@ -0,0 +1,59 @@ +package com.jalenwinslow.game.utils; + +import com.badlogic.gdx.Gdx; +import com.jalenwinslow.game.Handler; +import com.jalenwinslow.game.gameobjects.GameObject; + +public class Grid { + + //--- Propreties + private Handler handler; + private int width, height; + private int areaWidth; + private int areaHeight; + private boolean[][] free; + + //--- Constructor + public Grid(Handler handler) { + this.handler = handler; + this.width = Gdx.graphics.getWidth(); + this.height = Gdx.graphics.getHeight(); + this.areaWidth = width/10; + this.areaHeight = width/10; + this.free = new boolean[width/areaWidth][height/areaHeight]; + for (int j = 0; j < free.length; j++) { + for (int i = 0; i < free[j].length; i++) { + free[j][i] = true; + } + } + } + public Grid(Handler handler, int width, int height, int areaWidth, int areaHeight) { + this(handler); + this.width = width; + this.height = height; + this.areaWidth = areaWidth; + this.areaHeight = areaHeight; + this.free = new boolean[width/areaWidth][height/areaHeight]; + for (int j = 0; j < free.length; j++) { + for (int i = 0; i < free[j].length; i++) { + free[j][i] = true; + } + } + } + + + //--- Methods + + + //--- Getters and Setters + public int getWidth() {return width;} + public int getHeight() {return height;} + public int getAreaWidth() {return areaWidth;} + public int getAreaHeight() {return areaHeight;} + public boolean[][] isFree() {return free;} + + public void setFree(boolean free, int i, int j) { + this.free[j][i] = free; + } + +} diff --git a/core/src/com/jalenwinslow/game/utils/Score.java b/core/src/com/jalenwinslow/game/utils/Score.java new file mode 100644 index 0000000..fdd7f6f --- /dev/null +++ b/core/src/com/jalenwinslow/game/utils/Score.java @@ -0,0 +1,83 @@ +package com.jalenwinslow.game.utils; + +import com.jalenwinslow.game.Handler; + +public class Score { + + //--- Propreties + private Handler handler; + + public int currentSecSurvived; + public int highestSecSurvived; + public int highestNumberOfArrowsCreated, highestNumberOfArrowsShotAtOnce; + public int highestNumberOfShortWallsCreated, highestNumberOfShortWallsAtOnce, highestNumberOfShortWallsDestroyed; + public int highestNumberOfTallWallsCreated, highestNumberOfTallWallsAtOnce, highestNumberOfTallWallsDestroyed; + public int highestNumberOfWoodPickedUp; + + + //--- Constructor + public Score(Handler handler) { + this.handler = handler; + } + + + //--- Methods + public void updateScores() { + currentSecSurvived = handler.getGameState().getTimer().getTime(); + if (currentSecSurvived > highestSecSurvived) highestSecSurvived = currentSecSurvived; + + if (handler.getGameState().getArrowGen().getAmountOfArrowsCreated() > highestNumberOfArrowsCreated) + highestNumberOfArrowsCreated = handler.getGameState().getArrowGen().getAmountOfArrowsCreated(); + if (handler.getGameState().getArrowGen().getHighestAmountOfArrowsAtOnce() > highestNumberOfArrowsShotAtOnce) + highestNumberOfArrowsShotAtOnce = handler.getGameState().getArrowGen().getHighestAmountOfArrowsAtOnce(); + + if (handler.getGameState().getWallGen().getHighestNumberOfShortWallsCreated() > highestNumberOfShortWallsCreated) + highestNumberOfShortWallsCreated = handler.getGameState().getWallGen().getHighestNumberOfShortWallsCreated(); + if (handler.getGameObjectHandler().getHighestNumberOfShortWallsAtOnce() > highestNumberOfShortWallsAtOnce) + highestNumberOfShortWallsAtOnce = handler.getGameObjectHandler().getHighestNumberOfShortWallsAtOnce(); + if (handler.getGameState().getWallGen().getHighestNumberOfShortWallsDestroyed() > highestNumberOfShortWallsDestroyed) + highestNumberOfShortWallsDestroyed = handler.getGameState().getWallGen().getHighestNumberOfShortWallsDestroyed(); + + if (handler.getGameState().getPlayer().getHighestNumberOfTallWallsCreated() > highestNumberOfTallWallsCreated) + highestNumberOfTallWallsCreated = handler.getGameState().getPlayer().getHighestNumberOfTallWallsCreated(); + if (handler.getGameObjectHandler().getHighestNumberOfTallWallsAtOnce() > highestNumberOfTallWallsAtOnce) + highestNumberOfTallWallsAtOnce = handler.getGameObjectHandler().getHighestNumberOfTallWallsAtOnce(); + if (handler.getGameState().getPlayer().getHighestNumberOfTallWallsDestroyed() > highestNumberOfTallWallsDestroyed) + highestNumberOfTallWallsDestroyed = handler.getGameState().getPlayer().getHighestNumberOfTallWallsDestroyed(); + + if (handler.getGameState().getPlayer().getNumberOfWoodPickedUp() > highestNumberOfWoodPickedUp) + highestNumberOfWoodPickedUp = handler.getGameState().getPlayer().getNumberOfWoodPickedUp(); + } + + public void getScoresFromFile() { + String[] strings = handler.getScoreFile().readString().split("\n"); + currentSecSurvived = Integer.valueOf(strings[0]); + highestSecSurvived = Integer.valueOf(strings[1]); + + highestNumberOfArrowsCreated = Integer.valueOf(strings[2]); + highestNumberOfArrowsShotAtOnce = Integer.valueOf(strings[3]); + + highestNumberOfShortWallsCreated = Integer.valueOf(strings[4]); + highestNumberOfShortWallsAtOnce = Integer.valueOf(strings[5]); + highestNumberOfShortWallsDestroyed = Integer.valueOf(strings[6]); + + highestNumberOfTallWallsCreated = Integer.valueOf(strings[7]); + highestNumberOfTallWallsAtOnce = Integer.valueOf(strings[8]); + highestNumberOfTallWallsDestroyed = Integer.valueOf(strings[9]); + + highestNumberOfWoodPickedUp = Integer.valueOf(strings[10]); + } + + public void updateScoreFile() { + String message = currentSecSurvived + "\n" + highestSecSurvived + "\n" + + highestNumberOfArrowsCreated + "\n" + highestNumberOfArrowsShotAtOnce + "\n" + + highestNumberOfShortWallsCreated + "\n" + highestNumberOfShortWallsAtOnce + "\n" + highestNumberOfShortWallsDestroyed + "\n" + + highestNumberOfTallWallsCreated + "\n" + highestNumberOfTallWallsAtOnce + "\n" + highestNumberOfTallWallsDestroyed + "\n" + + highestNumberOfWoodPickedUp; + handler.getScoreFile().writeString(message, false); + } + + //--- Getters and Setters + + +} diff --git a/desktop/build.gradle b/desktop/build.gradle new file mode 100644 index 0000000..1790403 --- /dev/null +++ b/desktop/build.gradle @@ -0,0 +1,55 @@ +apply plugin: "java" + +sourceCompatibility = 1.6 +sourceSets.main.java.srcDirs = [ "src/" ] + +project.ext.mainClassName = "com.jalenwinslow.game.desktop.DesktopLauncher" +project.ext.assetsDir = new File("../core/assets"); + +task run(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + workingDir = project.assetsDir + ignoreExitValue = true +} + +task debug(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + workingDir = project.assetsDir + ignoreExitValue = true + debug = true +} + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDir) + from files(sourceSets.main.output.resourcesDir) + from {configurations.compile.collect {zipTree(it)}} + from files(project.assetsDir); + + manifest { + attributes 'Main-Class': project.mainClassName + } +} + +dist.dependsOn classes + +eclipse { + project { + name = appName + "-desktop" + linkedResource name: 'assets', type: '2', location: 'PARENT-1-PROJECT_LOC/core/assets' + } +} + +task afterEclipseImport(description: "Post processing after project generation", group: "IDE") { + doLast { + def classpath = new XmlParser().parse(file(".classpath")) + new Node(classpath, "classpathentry", [ kind: 'src', path: 'assets' ]); + def writer = new FileWriter(file(".classpath")) + def printer = new XmlNodePrinter(new PrintWriter(writer)) + printer.setPreserveWhitespace(true) + printer.print(classpath) + } +} diff --git a/desktop/src/com/jalenwinslow/game/desktop/DesktopLauncher.java b/desktop/src/com/jalenwinslow/game/desktop/DesktopLauncher.java new file mode 100644 index 0000000..6722223 --- /dev/null +++ b/desktop/src/com/jalenwinslow/game/desktop/DesktopLauncher.java @@ -0,0 +1,15 @@ + package com.jalenwinslow.game.desktop; + +import com.badlogic.gdx.backends.lwjgl.LwjglApplication; +import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; +import com.jalenwinslow.game.Main; + +public class DesktopLauncher { + public static void main (String[] arg) { + LwjglApplicationConfiguration config = new LwjglApplicationConfiguration(); + config.width = Main.WIDTH; + config.height = Main.HEIGHT; + config.resizable = false; + new LwjglApplication(new Main(), config); + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..339fa15 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.daemon=true +org.gradle.jvmargs=-Xms128m -Xmx1500m +org.gradle.configureondemand=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bafc550b87fe65a78f9b11ebb03e513ae6e0a2dd GIT binary patch literal 54208 zcmaI7W3XjgkTrT(b!^+VZQHhOvyN@swr$(CZTqW^?*97Se)qi=aD0)rp{0Dyr3KzI>K0Q|jx{^R!d0{?5$!b<$q;xZz%zyNapa9sZMd*c1;p!C=N zhX0SFG{20vh_Ip(jkL&v^yGw;BsI+(v?Mjf^yEx~0^K6x?$P}u^{Dui^c1By6(GcU zuu<}1p$2&?Dsk~)p}}Z>6UGJlgTtKz;Q!-+U!MPbGmyUzv~@83$4mWhAISgmF?G;4 zvNHbvbw&KAtE+>)ot?46|0`tuI|Oh93;-bUuRqzphp7H%sIZ%{p|g{%1C61TzN2H3 zYM3YD3j9x19F@B|)F@gleHZ|+Ks>!`YdjLB;^w;?HKxVFu)3tBXILe21@bPFxqwIE znf7`kewVDrNTc3dD>!$a^vws)PpnUtdq<^;LEhuT$;)?hVxq?Fxhdi{Y)ru*}G{?0XIuDTgbgDhU{TZBc@$+^ay*JK-Y1#a7SpO zHyWJnsR7T|T~Bv6T*n>U;oojNGn}}GOCkMk$tSQ6w{djY2X8sv z`d;xTvUj&RwNbF9%Uq2O~P)32M5LhEvu)YifH{1z#~{bWNWb@jLMh zVUJV2#fMpMrGIr%9Y7o#C)zVd+KQX8Z)V`&oL^y}Ut?pT;i8{o%0fdIdjtoI5(~Y{ zl$R_`XQt0k0VLP&_!>>&wg55P~iFB}0=c!p}&pO(~&fo}p9!sAW37Mf!kAsUZ4@ zwYFm>c`ib_KqQ|-f1mK47)b3M%)Z2KT)vjM>^`gn=~VsD%Iyl77GI{(9#eGF0Ao6S(TAGLd+S<_FpyMWx={C_7^bT$Bbrg{4Bex-6CxC+|3- zq-eUnX4He-g``+N04TM@rr|3$bFmDJz_Oxtgj-HMLL}x?xt0LJZOW+8cgLnDeSviP z+~H_$+_wl(UWUCKktl{p{0p7l8GOP((+bpm>KqIG{0Nc^gP2jVEgeGC1)41Qmf$GA ztV|uyJTjG?BbIT|YCPeWKDTUGMHyo??xB-yw_N?@6)--PTy6=|ge97~FsHIA6+Zlj z?>&AY_|8}uVjW^javZJ#ZHh9@$;1T%RK%qs3oX3Q{|U=4C0pAP;TvE&B?eaxJ+_g}vtIrE=zaCbk^9am`Fyhw!*X zf(5y2gXmQUWg)$8X>C~+g}k_F8P+fni0nq}RN_pq`P0P^!I*Mp(gK0|RlKIWBA6z+ zZvXp_Hp8KRiwNMwLun?;)l})q>G{HkK^3t@znN?AGnI5!^ogl;>Cq#F|Orith$uD5^dob0h8vyOzOu2MKJUyq{(MIx-^e>y#K0oqJug- znT^aGBM&`u6gvDu6;_!pIhv`i?^JJ3pDprdv}(_9;+=Ub<&Vj_z7nL#{lzISdygW$ zS;Mm_eAx{{ZeO`u(NFR~UdmTUQehNB{7>b+o!b|<@4Vfd*OWj(U=bxEug6FmX;Iuc zldB0@l*UM&GRw8n>=)-VlXN+q$~%nY>?zH2by=_U&1$aGwXNL`A>|})<{n{soC{$f z6i{}Rq~K;U@!0~l0*!C)-VOGv&L>;)DIe{~MOx}*9-Ilor5hAU<|QurOl76NzoN3V zFz=oQ*mRGk@zvH6bG=PAVuhP#vQ)|NqkokQjR$y!VE`vqM(9pk6O3%eF#5L)yu2A+ zs*{Pv!F6}w4%j=vsHRJRBQFSruEA8b+xm116n3s9l*X^2CIqvWhj3h>YKD7;Vodb*~~wfg>xvIfk;u|-e5I|v(RV` zfVcu;xAAxGfjJ}RpiGe>hrN<&TjLbp$?XY{pD8hDB;3DtAmV zOU8|p1xwqShBr-NT}{v1+|S!xNU5h>%WD}IS5wdewOiX8W;fOdo*A_H&U|h?L(e>Y z+pdZ5JuYFFG5hLVA*lzhsL6A!QJrgiynro+pe}MwuJMaD?c>~oZ86oJv^p`~seL|~ z1ArVq0QgvgpqnwMr|XIY4uJWp1|TCsL??Ec(|na|KJjYy28(mJ+-pqtRmNvp*i%Bn>YoSNj+$8+o{rJE{3LOmHi-8jE|VJk_ot%f8pC+4sRyV(3# zW3O2ekaOSg_hUNR7YtwtYU4(m-K}~6*>ToXhNBN4SJ^3&JH}VFGf2J)odBc@>*Gl- zu!@kC8GN(Z%CmDFt?t)BFVTrrZ!TnsPU=#=U$g_cdL4gn$zU5h5vGgRrg@pWEHx`Y z|LMgbYmX`<5rDTUZj18LN6hc9Y_ch?Mvg14mUt;M@RzemPs;Q4n8`|C<7dRgZGJHI zwVvX>w5PjdBjX<^bnISW$31*#3Mt_V3Ao-Pm*S)!i<{%`o-C~T>iy;u%@3-6-z`da z;}xiz)MqEgBfPGcZ39Q~i%t-b3?ye+s zkV{&6m%A-gUR^>9Cg;E*M8+;83~U?~k$A^f&yHwE4pT*`ItMWs>*JDDl0*7UOs3rb z{N%7rt%axd2NKO377KmHN-?%orIejNHen&@RYXd9e{|0?3Z@QR&K_88nhI*wn zl_95|n6VThK4AIQu(kAlGG#LYNFwEsi~vd_%0*~WeMfzssz;mj4JG${`-^wNa@^*u z?1Se|Y4gsSwq$N7$s7O8lxI5YL)Oh?M$6Cl%*79o9n4SU9#^DbV)ckzuSjG(`2aL} zwyJ#Mm9)AVg#`Ve-l&XvA!>fDv5SG+-nff!a0Z3VkR6sLz14*8$!#4O56%GT?HC$Q z5UTKdWBAPI=Ng*Kfg^*L&X6^-Zs>jlJ<+WKk}kp#?ZhoI{iAYRH_Fh8@wW)lPUOBO zy%**V{0Xh--4K$N^hncGQ@CX^6{yB?J(OpDDQEN^8Jn}a zkClUmg|oT7h0oKtm5qh7zC918qdLFWd$5n<43cw2ta>hB1zq{>t``4oEHts?wEyHs=F{&{>VYY$DN|T5^;50-h$n*X8tDV$ zVr~9Nk&!g~n6K}EH8Uk&F@*5|$fEErn^6)H8!_VPoN7$moX&?~o% z!6kGR_z~thhh53cpJ1*`T)(qa+tG*IhNzCAH3wpZPe@O&rOclYvKv_ z$Hytrd^BA-$jHy+Y|Qan157h8Y#;?EzO(dW?&*I);tr@ysC4#JwcOXX^jUhA$=kjE zJfioI8g;!`WvNYLW4-xBl{dVBfX8L;w$#Wu$YH1zDokI{a0e!=41*dG;R1vbHGEHp z88sW%D^$I^8JgM;&}_x0%tdqs#BdypVQMz43>ih(iH+fx)VuUpW=ol9ek9@GA_dT18;t9-Mb&B2VurL628tpA$#ZPxIjlxWVD(7rsfn(hajk_}%sP9xNhl zrJ{)y=?ZENjKlW>@fHaLx`TaX7bSGN=!p~g5#y22p|5_@a+hV=mdqo3 zCuyRIO;)UZ1<=N0Ml8GsSAZ+d8gPqO2u%0N1Y#K13SxsT46W@7M`X^-G#AdceVFsls%T{Z^LV&`j4|WDsRZ{7y557 z5BiXpTcO`?X(K>&nMIwU#I)&g9PjW{o~Ij!#IUhElGfxc)lQ#Q$iOjA+x%=@2{t!X z`&-aD`#Mar42lblnS=)o**}54&DVL5xKCWAi)ww!HKT85aIf`c)Gi*QBZ6)C;(fhE zJRDf-=;x5!szU?NF{J3|Xp*V+W|4&ns|StSqY|=Pmay6SSXTCIe#$ilOgaR2wCa1V z;=4b@*@z+}3wK7y0X2B(?GepcPFzP-97U%GXP$aA!LCHq{9S{hYNR@IM%Stzp4(;u z?@Sj@=pNq5>}tl&r=HbUM%ZUW%l=T6o+l5Jxk}i&A}ZJ&<3In4q%mB*PPhMCE8(C3 z02u$hRtmcrS~)wKyBLd@TN(2k8X7w~O6%L`oBmJX)O5r&Mfc%RpI^Ut!nfI1VXsc$ zBPMN*M-hvYE-e`556f(=GdOQ%(w5Y{j8g3|Xp%6%LxM18Pga!NfJ@yA)}fo6MK33E z3$_Dg)Ec;jY`uhLowVb3>(*YoBfnl`{EoiabKiM++g{rFei`8fWDD0lbHgfv@j^gd zq^sJC;MjMQ8HkJ~lCXH_)aaUxMqT&*6*^pP62#?kg%POWZPqiHB zjK-Gm`fY`sQkQFkg{|Crb(`3w!P&hDj_ZsKh`~|4YXNj#b27M))fy}etvh$C46TcJ zN}WBC)5fMlmfgwbtnbx%o5`npSMNMD&XLTSk_F+lk%b9=I__!1UAw8b?tr0?OITYm zZwZ3v3@8tGTJ0XKXa{_zTZiSGiq)je$wm_^h6<5p?&r2$Ay-#o)^TrDz(M&H&wL?v zG()L5-FUQNvBMGh`+=p(C?cCTCF`LooUlRFyFw+w=lQUyexY`Lp-*=GxT%AC59vYJ&WHijkfN>?*}Xx%{_#wN<6Q3-=x z#yg8RzNweQR4j?ybGpetSoSMyPQk`7KgPFGL0E0 zg|d`R9ScEK^)03o*8-GQ-qY{-RbB`#JXlx*w?%|i?OFj27IiqI6cxuB)g`4fznbzQ z=t66!^#15RjJ#FZ2tt?};n9t1Lvg$-&Fr?zHbGC@Z$lGK+=00=CYmemy!LIt1$6N6 zS=qh(HuL0F;=w2%Vu!KYjDf-8V};oV&rXfQ$Q~@o#|6*Bgs)C4KwHTfHYF2gt%E=~ z1sYV844uKUAgBvGoU}I6YG$3AD{(Z-e_)Ah5bT^9QoJK+x7jaE@7NJ8N%yod&;##c zq~7YbR?2tUslO(C5u(9&5D%{RzJ(3ls*N@$ScyA-r5s*V?|D9^#?tJMPRr~5-f&|| z5hG4_qe_t?&JYXofBA`%*zTKF@&}e~+-eQbzS;U|V4!bYf3kU3qDfy}Xi2#cwA91u zj_?Lz=NH$77i>?Pf1aOj}Wer%O5^pQg2XI&tg@}X|aQ9xmEwfVE_C@_)0A@ zSGbHYe0oR3Gf4i43Hljw_0hu?@Ie-iHVqD)AY?D`Sb*oU*SI=y?DNMJeH**aXfzIW zEEVH=en4^dv`L(oJv;9AMCYDGAdYbBJ63c8>xcQn1DBAQA>FTxCXeW`yB zVT|dk=M&LV6!Mh4MYhG<2jZ*1=nl}&+nl-lSJ*9#SxOy z?b$iv;=He)Bb670FaOG}HWrc_?A`tcSF~bngbktNmslVzr3`Y`*o^@}`<;VXcMii= z=FGm2$Z2w-t{?Y9bN!c3eTM3yvIysmd zI6Il!+WZ&kub?T3$&d6sZL+oGRAJxLysp{k9%^~9zOO0Cj{t(-7=(iBMJ5%GFVnsT zogf|YBhe>!o5$OWtIWk1JYNduwVLMmLF2eO(Szy>&^c7WKB-p)1}iK5IEgjm-T5d_ z@@maI8l#j$w{sevL!hGGS%dKAvsq3leS2@nTzUz|f{}JTh)um77U^p~cO!}I3;%Yv zt%v71C1f$|j;mCD9~0Ph{&*)oH)iz^ySrT9Ohm<`M8ON~DP7hB{tKaBWEo*BZ+86f zAm1_)0mZsz`nkyh#xbcVa2HRysG8Wn$lb`bylI>o!AEm7?(K)TBU{1w;rKe7YebV7 zom96W&t~j`C=+gtr4>M!3k*(=yBEs@_%-#Zj^EAIH|BC!LtJP*jF+{eJ_!**xncaC ziKX%(XYY!$@Wo1Avwzn^ zPfE}$xxI4jvV^r|P&w5rGW2kuo|IImxq`L9 zyCnpoTEiCp0N#LriHe0Nio6-=zo=rPncSuGj1@+m5CtzTfZ9zJI4YTL!-s_C|powj7a%txF*KQ(sgv@^^Fq6{h218-K34C$?^mfUa*|L-w z?9l+DEk8JVrcj#Pj>?DOyTZivZ6|Rr!O?m%`kW(CV35Nos1;(Ij2fs}S#FWLOpe-i z2&lK72Yv1-iGGA`i6|fz7<$NsAX}|3worY-PRsm!L(~& zF%V64k%>!j>#dHjkdkS<=~pPQVH&tG1iZ$Sot>eD&DJj;mzN`v!q<7}_YB8o%^CEV zRJ$5ar>Yh74Ew$1ho)*4iZ%#w#!z+PQCZ;<-UnrZ%{LB*^u@G_RWK6t4k6dm8^vOi zs*+pOUb+hHwACR}wc4+6@b6R7U=4h8DPJ!LwOy8C`H^d3rg%!QFf8|*SdK-48Bz~x z_C4vZpU3(Fr;N2963h1zueM5{oDJIkGr^2JCU@fhCKvZ#p_T666HL+F(aG5QZ+89F zBc05R9mVu*{)(CZMKMLGXew$dBYm@ov*BZncQJ`+7B&THD$t4%H&P%GAp;SE73rMg zXOe^jJMNE(1KK{lYv^K`o(I^%OtVcdrqGQ>dcTO4?Z^-uE{_}4Kd)PQdtNp5G_A;d zzkkH=0(OSldY=vz`jg|H)13`COHroY^$|wdzUAtv$Pg%W%Cpmm z)sYQJ<0?^!yH&zZxRt}qerk7WQqzHlUubrT5*JxYd21*th(^py+7g5K zbrD{*0kGDNd<3{(b%~OONM{9sUm=9xuuYA;gWvVRU`lB}I20DBI`T_i#p*B& zt;lg`Zmz#JGVTE)a?U;@a?XKYIPGnbe~pq?lr6|F*=+?N>ZBAkKI)<&wlT8D8H{m*1(^qX#M5Zs~^uY9_HY(sgHR5yrRiBe_-U6uCrAQc64e zU@d95dqi)+O9UxR6|!e00zhixU>_U_+A~NiuD=MF)g6cr z!)U%>KSa}*le&IsOYJ&Fg#|t$))2q~6`k4T z8N6{9<2Cl)J{A3=Kn+0mhd&w`t)EU_i>f;yLu|K2aIxxYfSENl;6v0c7zejsQ1I&$ zKapAFStLZ%!EAS><+t-DHFD3#7>-9lh};UyoX}%g^D&kNT0V0~bDVc0FZy)e0YDbe zTpVyFid*1?Qai}-mX9lp>G~(T6L0_R++iD*$1t}KY*WrG`{B!>w&@vnFFUHr%Qrik z2Ndetsc3B2Z+mv$cluy^rg=hGTw%^5bvJvMsl&P?sP{2lT=k0+)6hl`_Go!bQfhsK zhH&`RMjpHZSoEjg-}-N$HM^>j$KqNBjXX{W$cHrgk8rMO>w->*YoZ?3o#83B4CG68 z0hFR=#7&LS_K*9fT78yOLAX1PD|C`{@>DW?u1V`nUVyqK&muaW54!){-?A#uUKjt8 z0W7fp-x7h1qm#as6%qY^f~Ks$)B}<#x{vHL!-UBnI1M{ZvpJDfDrm?&IdDG+aBIO7 zK1=}+L+5%3#c_47lN5t(D z72Y$f_o_$49UxP>fnm>nhbChvPEC(QJu?vbQv>ei8-c~VLV#=Y`{ zyiB$E@}}T@gQ+3)3)RM`Mvv2u#x|MAM14TDE$H1Qpb|Hm!}yqZzMj6~6wPO-V8uHE zIekC2?=Ac!EjkC=;2T7&qt?)7Xd**j;!$I{B@_eFvv+L6ChdsF=zW1kb7;khE2icG zt=A^&t4Mdm1^s#e2Ak8qC;CM%C7RzWpgUdg?3DyZNo_--;0t+zCN(=c!i|5V<83q^$>9^jYxY_Y&AT@s7w(?6IR>jTJ}ovoqtf{CONXPfB(nIXG?*K zv_iwOtk!4D0KsU$D4Pqyb(0OI@0fex7C4;p(qcnoo#l_Pt_~43wx0XkV+$o%oBK$WL#QLM z{dERKhszLa4B9snqT%6#Nt(7B<%ivM@`q)HHIsw0DW+*ucY*i}`U@3H|6~92=7tBu z5M;kZgP%)AuC?wk$9glV>NGV<8%mZj~TT znW@zaG*6L;2x8FNNQb6Edo7bcCI54Lov1d>C-or0_@ch;&rYpoBx()nqXl>;zJpHs26q$+#~UgR2JePYBZWD2A;z** zDuXm7FO<7UWwRQ&24Gmb$OW9pADw8A+fMioI;ggQJF$F}E?2IgR5w*xUD18FV+f9N zH5cr$1Jyb7>PL!X*P30qq4A2&FFA}dgC*h09WCJ(;mSO|FgmX~511Bh80rq)KPX*+ zW=60pbL^Wu?bie{wCJW&UYUMo6dFV8;CDPBu8T??ib|&y`!E#B_NK26S*^0dHTvEl zWoD;W)nOc!?3>(hokwq6aFRpSds*SA(cJfsG(oJfXrV12Z6W*$_SeKhijaxnGkK=_ z^S(MY?$OG3*Ax}~Zl8BY#VD-i=^~Naqd{5p!SB2tCLzg zoN?jWFst}W-dL9G&xF!4R|Gi@M)O4ON_Zi~WBDhCI3h6G`bj&5Lpyc2KfQ3@LHbQN zzZXe#BpBS(p!agicj27@Llz&CJ-}mrRi+Ixyt@Oy(#s?!XWY@{?7xz#Gx-M? z!MH0PC~0tqiN31nD_|3)3m&TSUyYEZ;piW>*riHEGYnIB+>~4yGV28245RIl5z9*q zcRa`CjR*w)(v7QSO)ks7xkq@6Udo;9*kgk~?SUN$cmvtS?aUbboeFX5t2{Kr^!h>j z&zgASp^dSPfDuA+VKzL(TuAN5~HWY?N7u* z;U*hv^(l9EA`U{76b7`C?6n7yqi?At*$EDJjEc3k{r*x*u%irpX>Hr^a?hc4^_MfQ zB&5Vg1vwb$j1(jjTZMyTD?m@@ChbLys)B$^Fo^~~l`;RNNrSqQ<}9tf5{4j=rmn23 zOdYjjDKxh|D*g(+)_n30#e; zrlB&+&Yg&THMR9hn%4bm%49}r(thGWQ@z>TvRFPoSDySnJx;RBn6RUd>i48wBf0F< z=uqdel4w(9fstNSPz_@MT7Ui@m?#*Bb*jHnyJkTf$TZW`WNiNOpp1BkA3CudfD+uI zecGD|xs+u6v3eA%gTEoDy0HKO8<7+3b^Cy=;ORU>>{~4CyMoz#`r01UkgN^_!?R1W z^_Y!i`$S*W_-1I{#^1He0|RA|yuxQnqjfOi+tm#^!60}>N>LrCc^ARko2Lgp1o~25 zCHe%tr2lNS7I(E4A0W1nQ6>l4B6&sJoFZR(=#XPJs~B-6A<^Y9O?c24q`C-|yy!KA zcJ&d^G>4ipI-G4v2r+Uw$P_S`T^QToGw`Tj#8AHC@ZQe)AklsEdPb+4veveTem1*% z2kG$1GO6tRj%bJ?)~XaQ)*wapnxEG1D@G6%kNRS{&(GNf%2e^dC zBi=B5tzIw{_&#f(iO_+9o>LLEi0m8^`Xjt?LkxQXgkEe3!Az?dg0O=}O%WnX($gPh zfhp_kK}#a%@?^-A7mmAayl}C^1*4#Dyrx8zF~dL46SDNFX;4=c2EL$sMP;Ur-HQ8v z+)hm+rJzGe-F{J^L135e?h=CZf9v9g_tXA-KOluL4Sa$;P^+&Gh7H7^I?c!K@CXa)ja&8#UC-etu4?M+p4Do7U+ zo1ps5jBU-`Oy^`771U@XfkDpUl%x>U?iWJZk|Vyp6_Ee}4s;^zQ7GGzvSOSVEB$0X z?Me)`U=O^pPUvvlUM0AJvjk8AB51#GL!t(tovE?C|CfAPBlWB&dQU!$}YoI8d9Rx zK5L8CKckM5!?+(4TIzzLgi*@*qYfNAY~b~wNM4)bJ!!EGIEG?UGN!OJkXs_<r2(QEvMBbQX}G>ErdB+ZtJRo;yuUZJpc_U$E!yQ21mXP!KAU^ChICNq zE0XyLwJdHj#vu^s!>8~KPLkq-cb`-V#v)ctC~?nVuu38U&pvbC8J7H;OIpr6YgGVW zuNx{={f(0#C+;)Y%sY6Mp%nz&c)o__PlKafvP?6#9Xu!Ct1`g!+ioIkbWchTRUTzv zw+#LV)&R1^b-@InMgfiC*NGsmo*^M2H7{BmQ;HXw>SBJr{DGye$_G{x}_3CIE#f~E!)cd{c zssrB)IXbxM%zqYPeUI~zerpUsVr-l0F;}CR^?gA9rQ8!oaN`F;oV^BnMepd@y*7JE zZ^eOg`b&;((?~4dDx+u6U%9$-|IP<=8{vi1{?7Y`5_R?(>Q%jC{q>EayAT&2(UTz1 zP2<{Ky@xp;Xgj_q%>LPh)lD2?JF&;<@LJ7ufa~;G;D_%eJM!ZE$u|HCeL1Aa@h#5t zqaObmk@-~taP{ zmP;ehKFgGMkw4aJuYYO~L?bnhOlclwwmd|k-FRxyMAP4{RuIwDu0{&lXkpMr!eT~1 z0079CJ+*G5JABWzfe04UK0Wj%=ZOFfHg&TVY5ae+H_dUafCDm~r7 zI;K6tQatQE@#^i&O5DYfnzrtuC$--3K6a8ig5yAa$E86fc=&K@5}_=>$a31V+0$&8 z#yz!G_PC^^h!j)iWj@==$7V9Qxn{g=I+CesW=t|KGR83R{LtHPxt^ZToj2trtiyUr z-s2Cz+$uD)2D*YeCowg#uweSh#rWr)6?4b2`oeQ-2FhwDNE^1~+}_iC`l^^_s9w!c zk)mW*T>;JOgmt_Pox%|_HW_}nX$ki6T;b7Lht1hcu@ckP>fiGu=b$bVkyof`oA?_! z&Y>s66dWtr({h@wcae|9RiUWnP5bjz(iw4Mjz;l3iJmRdtzXF*;*#ag%1TGIYDAmb z!f5gI1f&-gY)WZpO1}@)r!K{g7?W*dQuJG^yIC!6D)lDHjaD2J-TLg^lkB3{kllbR zH_j#K4z~ldvf_`-h3(}jU@9m@ll=GGhSui~-Ig*!HW#Uah%-Ag>W!OgE2&BBrN-&) zX^*9i=u8P9M}%ZxQ0Zj{O}u$gC&n(5pDhd$$gBGZf$A!hf-#d*RLkL3EDRdRn?p-U zn$!0=?7PTq;5MYV{(MM(lK4y@v4&q!QAD)ORv^q}mrs))D>!ef;))|%JFMn~xhOh? z${^N^*k-s<;+#Acy=g<(N;{z=Wk}18i(R!pef{euv#k7*BBOcCZ`R&NL(G8mF0`?WHAR3J4z*$uD&Vs zF-TS@;A<#rO)I-FjYJ?{6!fW2H5W-N7hCJRu+XkIPi>TZUzMh(8z>ZtIV3R*Dkz*V z>9BV{TQFOZ2C0%78}M9cqE=|hWB-20wryak(i5wHmXGGG*+x)R&fRXTGRBr%mmg^O z8hCC@nz;q7D?1NT6f7}HT_TQqBdw~{nnzlpj<8LUXh2HuFr~QiC>Q1&dVR)z22f5+ z`ZjakxF?~WSLxX)TUFRMO@@!O(p6@xvkwbTHz{rU1}BWyi(Gp-UISFQ-O?%fDBbyF zL5wS(4ks>yh+j{(l+Ln#wy!=146rWobRD$R@-=97Ym5(466kKN_AWwoCHFC2k5Ju) zUdq}jtpu5vDqS!3QKlJHuDOYieoNZ{cWTozDZ4MWIPO-TkQUQxAnz!SVlON`S^=n1 z*PPj6I`PkVM%Tm84;v{0jQWJy_n|m&tB1wE3|p+ER@6H9EIoJ|S|hWJf#`NKw|<*+ z&1yJs*F@n@69=wlW-NIx*qk{!JL0_i!OiFt56x9Ww*_A=N>)6UTA5k;NY-(#$9|l! z#c-E>O3u%*>=&}WrX03ZMx|i1L050%*H(S`b2>qxsL*irL+2u2_qb}X;O&W>y)fZc zUPNVi!1`IqxSuhd?Ru@RcUcv1bH)+7V);oN+x5`>S!i43D)-~CjO{vopQ4oqqu^XEm*20FDU1b#;=dYdK554TnG0xMJ)>N8!>{IY zni*o8P@T>GWJNI5WykKJ^;QUd+m`1InBR4P&eZ726EOT-Z3?%maw|?eb=^3|&l^%AT_0=4K-|c&-N^h`O?jJE(yQk;m zms4(!1sg(y$Wu@&scQ=hH$)K{eMP_(E`Mj)z4hB;pk^%*CiLz0KNs1S%*)K&MprBv zQBAEr)n`w(g_k9BaN8=qQKU=7T^pz2r%@N_5Uby-vN)n3xCLJw`@fh(ZfUSa8qf-c z@x3xVbN04T+g_Bfy%TU!XeRYRpSl5iB7dV-u`X2W>UWwiy8eRQLw0%r5xJ|FOdvVu z71plt$JbVMd5+jKK?k$WB#R&z2a9_P|ko=t69ab}>GjRiRC) zHQ)*xvemft;tPxmy}K!(9b)x~EZk;On$;!vMQeEb5Xhtd17dY&yXgY^zJK9r<27@M!LsJkn7P0(H@pS`nap9Cz7WhG^0OLk3L5nK`knIwlcb60>(; ziXm@jV{}|pcMsf(m9Nv|Bu}?9dXbPqF46VhN}b$)&psq%@9>3--g$!LWi;KrutVCJ z0)O+dUt#G}UvrCz_JI42s{6a&iDr%gJ=&pfhae|<+0q;QpxLU_jo!Q}Y@Jgw46e&C^DaRD``Hf$5s}}NgM^4bG(WOwnL8F zcZ>c87Ib4Vm*k078x>~sCx(weoR%~`PmC^Zkswb<;YN%|Qy>egv3ihr^J_4^)|-0D z1N+c-H!uwk{+D6ms_a8doA))K{EfNjPY!#PsdT##$5K~&o#3wq$%;Q5Pz|3)Me+j4=#tiuF8JDVu zL?OH2o;zUr)B&*8xG`Y)fx}y6Y_URmxmWcuM$pNJyI((~@o+xC)WOhv&)|&YQJd5t zx8m?LgdF|KyL%g#>fzm5CqwVaZ5v?c5_u;D-$XB@;nO^m*a8`n3S`j3XQzlqIueiW z-pp&;+KgpU0WsgnJ%{=7?^mGhTszA@%eQX4wuvVs=H)=0X)R=4dHvQ5=6}DwYX)e# z6^5{dm8-b5-i!F^6y%|aE0)lw=Cj_cwiEr+Y~PVH;IsU-Nq+BgWY3D3zf|P2O+FI} zhN#Sjk}IQzAkCHI`O07}6@&=5J{C2v#z0?oOB3V?yh!MHut^H}E<85@{Hfk8z*7_3 zLODdLO6G-(NM9yhmuj;t+9)I-O9zUHp}JyivE5pbSLS>WT&$eI!ct|qR@ZHFfKl9k zEZL;3AuSZ)yws>s41b|9%~Z{UBdMk_xn3z8KYL_BqD!>BRFomLka1w5DxFdmMCc)1 zQ}*WV&B-+q^foIUjO^|rfO0AZ|{X3%g%o{t- zsDHJnhK0aGTQnqFta8a9omw*rGidmL27rABg3v^bGL44j3#5xjJpnO7yE$!46BqVE z3Nbw@bvr(?`QlgvI$+<=Ed*t)GA-DvgriHP1#o7{?ue>8ObE|AcVLlO(v}VZWkJ0f z!^%F}&a7lEiHUh4bR;>2U50g^*#OaASoE1qaZNnIUqru_HR`$0%a(yq>Hzzmeye<~ zF%MiZyuPH-#S$`w%34|^jYLG~DY%k9sD|J5;nb#hh_vy3lfI%?9ex@*I1S!H&2-76 zd+9XJb`^nb&eKR;U~i_68tqa{L~onQ?<6t0P~jMbJKLr!CJg$Mxi2A$x!|1kDW zQJQthzIRsIwr$(4v~AmVR%WGb+qNog+qP}<#?^q47}~AMXi&C`()sm#Ybsc~_IhTYnNR+VvBI)uvlWik#~q%MF$hQK>jbXkDKys1)#IMY8yRh{!JQ%TNuy2b6()&oc!C-Zr}GhI zLuPX3_nc*2>V|{LT{k*+01BIOi7d1d-9Kd*JD+;)ZDLAV#3y4J4I!prCyWOowwo1R zG=6}xOfO`s7?a5X*A{a5+@&6ktTj@aGO|9nb=sxE9peF+fxx-R`mDh2SJFOBOJ6T^ zr~$Qfw_z^WQHnGXCJrtUE{EYGgqPY)Fve# zPud^{Udiq(xbjmrZ7~mNj#J-8d`^S9p-d)ladBrr(&z?+toB*y&O&A@PoGvYaO_sm z#nq*uK%9ol*xJ~>JaZDKzr56afl<2f=-54RvskyBnctuCBjQ)ptl~FkU}=`G#0kb* zrZD&fA@T9LQO`>PrHC3Za%%2@@}lSrd9(7?`Q1IS`iKY8M}W7pI+Z_$%*65#7 zFRt%~gIygaa*fFSIMg7n@GeG*9JDS>|Tl1F&Q3bHKiEHe$mhgaxLRw3E0y zt3bh(KtVGdaRVK4>?NdJwROnc_XcJn)LDa%6cdB`NJ+qQSe7D}%@`CoXTtE{dtR&A z*w1Od@%B%PdGx;brAFN_n?$_*4}%&YN}up225Y`5c#2JknvmeUY#G2ryj|P!hUiO` z7knSlgR5T3b?anxk>E^6p_|E=bm&Y>Y-HX_ViiP7AQ9~&;l@w7KTVQwjb|RzM&>iP zD>XtLK?~a2i1knoOqg}8EKrfSX-671Q&0~n_S6lpLN!iZ*A6i%iGmu=7T6ZS1!gc9 z5a>h5I6Emd)DY&R!ji^Jdi^HJ8n~y-dowYpb>l{Y=Lg7g3wdhfZL`q1MP)FF#1aN4 z4d`(WazPoF5d&NbjoOtLWKN9g!nR)YW34ST<3@QE6!uCl4t5Jq4p5UCD ze2XC(=!;?Rn(lB)Uf~$UT-s zE&pP^Nu-n||3c1Je*L8M+38#BW>ry09;D$61unVdkejt*Ks%4YW+{Z|%_sNFk(hl1 zbW(z&IIuH*RVT}3NZHj*7p6ofes>EFWn9LcsJp{MPTr4)C|O-p99glb^h>&E;&tCI zvb3EyDbBXA#?ngODiXg5Lz%fCZoJkCtYAZnWqg&{pH20Xzn zk27dh<^b>Z4Dw6t0PhZq@+)AgU#(gZwCo-AOX=Xx3(kB_Rb#Y7*HJdbyJO-OiqpH_ zmZYYKRAkXD-HzdBqMqrXnP~-V?x207`kfNd1+1QMyFsgY!#>dvF&p+plr^L!L8yqelQe-7F zjZd}UNLlM@(OigQZwytWzxABpIQBz3R#kF#uVh+A+uhI))*l8q(>}k)dfLx{*$Cpb zX3=I5aP@oko0N^Er^#247O5$GrgysM(PTomX=viH;zEg-;=LtPYzLO0b(4@2SzC4| zg7+kn7p#YVUn6pjoj7=ye=NVGz9o+Cot?67*bdA&MBu4!3Q-WvpkLJ5@!mVHny>Ko zN91-|S9oeYP&mX(U6LRT9?<84(P9}!M6`Lo8jJOW$}7#D?~7ez6l5M(TgvtmiAyHC zVYY}r<}>=@@hlV8O?{maOkAtG#7VM^&k*S%w5ZO$L9g{i4c!+;Tjv# zYTZT(3$^O`gKMBqa)0zcY3s=YWS%yvaR({T?vk?<&L4nwPbTwsm}@ew#q^=!Aq_c= z4i;dbHtD>nIVxO>>(&5Ads-#lxoGJb2OFqBqnH|($3BHCZooa|EfnnJ&a=eczmj05 zU$o_*6bFnmut~(xF`==>@hlcgC>Jrwj1rH{u{#2aDg0TNv$mLc4<@qIYsmyk+v^a^ zAZHG8H=43P$j$Maep__LCCf-VZ>tU1`?W-sr)S;-A)+&a+yaYV(AwC)+FZ&ea!=04 z1Q3rm_f|1~bPU6UR1Z0RtmXKU$CX*Wyj_Dev_3y?w5HcjGk zRl9huBzrW3JlW3)L|a@+b%!drsz{JSbFV`VcJ&cS)aWhrjxj5q-WAUK#|7GrGYq-g zO@=0~nEQbcvKiHQwiq2uoJY!FqAE6NVf!up%V;_5+_MmCFxIpT5#B0?8b;oT6Q@y% zWPJ&+t?6_mI)$s*Z1VA#@MHRL|6{sXqG4C47ViD8z|Jt-*h6p-u^va`0RU;W@S>c; zcYDm}?uenWYm_If!Y4R*c67J!_5)!9POvC)0PZtw{BU z)6lP=n_lDf0wbw!(cWqt{Ph;O2j@)!kPDPqg`b2z(@*0a%szxT zP_JR{;Z>Z1#S4cZcc5lbPd1})lpuFt$M-Y>KU)uNRxXY{hIHU4fs`1nk`|Z|E&}1( zB1xxJ_zkhN+z=*;E|{ZfgK}M_Q|DnF15UVS&4HX}N#=ioI?ow9QREZ@naQsOWXfG5 zR&;`ijOO2&Lu^Ps#p)(ZraW-A;)w|M>n#A?;}@jxx0&(b_^Lxu2yFF2(wPY#6TGsH zw<2o6eQ(wyiC0)}G@DV@>%Mz2NP1a);haSU*tWwaB_07&dM{?@ki$llB#-Q(I#yZZ zGX%g^swjg7#8M+&i)M@anj?s^$y{V#Zgl|08B+Xukm*Z6FOO1OR&-DgNs&2JEOe_b z9KW9qH4ZR564Adm_l}jVsl=xA?~TsBg93`otRRp8OTz^yC0!j3F_y+nN`a4eE;9sx zT0O}f!2#5cyvB*}sGpVAEy|VFojIyXr4!x>s8Cr+Zqd`TJ1LolTn7^L?P<3N(eVhe z0>XQ#@Sj>CTL9-AbUq0Zw^fb(I6yxMJB&uFxjI6%nmrmh zQ>*0L=lwqyf2`Jlxc@}#4WxN959@QG(z(lA3fBN=tFt;>6J<*7=?%Ye0B=Pj z$b-X=9=>DPM*y=zQ)F0e)Bo_)t9`3ES&znmnxpo*gx_h)FLfo< z&+SXj4!{Z5vl+ep!Jzg^Z(s;+#|??!3AX(KTZ6du2$0bcGKhBkQ|$xOijQt)Y`Zzw zWR}V|4{u${BT>gc+0vZsBSt4U8LxL8Zzg)ib@`WPU(ll{#*~jRUo8(`=w|;_W>b*u zv?gnV<31x*qrJ^Qa`!KdohTxwk^BM}IZwx*`a=MLj+ez+R{~Q#QpYH(+);phQ?tl9 z)|7HYm{RuS1#accS(~+el%h6cie9+B34RmCC@$Ped%4vQ6&dQG(%TIVSUQPJXn?x@ z`-w37u%i#y>ld+VJ@X)ag6ub6gwXehY8?@JZXl$dC=}-`#P7-G1juN)sQ%gzCLNMp zzRPp#u$z?`MN8Iqp{_m^Hr_{?Bej}IC(NFSFPAa&XOLi#5`DT zEeZM&nXv0be-vxY6e#fIj~V$Ha_%Px!hm*ptceCePwE61@W)s0*K}Qgq$)4ue z!JbEQ9Gt#t(*sUuPwv-j1-@p4rp>rm>E~ollRlvF@g%gJcr5bHM6F}5^zOAOeK!Tn zc+ogj1jp)6fQ-iB1Wt&iUx5Zr@B~iaO8P#*HSqGQUYN+eBfMT^Q;C_;)-J&Av6fx9 znpU<98VjB~Ft{#3Dl#Jt=}I8aA!E{g;L31^YrwES!B^&58e#T)0Kv%qZ2I#478?S8efz>410xbZ0KN^Pf-W8+Erzq^+XK`dLIAkFxWNu_B9(sWbk#B2@$}r)R!=P%d{fQ0eX{w~`Qd%_);Sda<^Ie7 zklv4q!e#d-Y{D&6ONTN!nSwn(Ps}g;+5x2cdN1);yTqkV^TuI3Qn6eQ)K^N)4EkO(S`A`C0bjkIee2b4%4+l#0 zULPf|Uv$|sI&al3lAB-;8H$(004sOt?%Z<(UUnjL_TAncWG6mf7dc#ZT(E9jMAq%z zSlo>2`*WFJwYcVG(%8~Rv(V?SzG&OBXVlKhZLVKls)#%QwxT|Hj8a4}T+N{LHX_~v11vu^ z5jA|20abDCXUD7_7pk6$J|I+0*TP721~Kz%S7GlC&<_NA<9w4PqyA7*(cgVGl+t|3 zl*T|)Zk0n(*Aee-bsl- zw)G2NRZh^>&J*URFCXP|d=TFrom5#WRHLSBr1RMx=4V)!`7_sNEH_izf3h?^c$@GzkoQ zmHC4HH#)RdfJWS5)%v1BY8xZ3SDFo074TZ$(xh};=A~S#G>Y)J3&Eey%<{xxEV=Y~ zy|N3!5H_Y5ElE2vRVd^WBnV~XiB6bf16~&Ggrm&zw3Nv5rJ+9wb3!PkmBI(Y)bc_x zYZGMB_c~{{m|kX+Wz=SxV|fxRfKh6tkkG`vy+zH7NRz@*0J&E0g?k$Wi9k0HObG)B z8F&&gi%o?@Cya)b+4?6DIMbN-a>3Kr5qOLPES3r_(oG7@uVM{F`e*wkY9%C~%?%on z(V*AZ+zn@2M(e#AM6|}IA5#dhNcQsripqhN#mGd+3s=hvEDb8vibEgrRJIv!?JT9q z_0iJhEY?GWqeUWP<(TbpKc&M;=7f2w4Ba2e=_0h!Q%N_h;H2OB6PJi1t>uLCNm)Z8 z+oSxf`qG+#|4pm}ij=C1{Uis!QxqnnnpKS^q<$0|HX!DU7Ru|E0Kl8|%F1Ts>8Z4_! z-wWxy>`?TcaAle5c=seZ)*hK9UHO5+CB1mNuql#|4rNmwZU>rn_d?e>s>9EnQYQJLge*V(hP&T@uV`l94)IBn8c z7TIcs)k=y~&h2<%hiP-L1?_>oj5-9-@lHcFPiDkz&E93!CdDeMx^zy+49hrPSfpk_ ztn*058P}bl>W!+qnOD_=4#pjdzx393#E%usL1_9Ijn{194&F52=69hU#c|Oz6n^3( zxE<_q?zshu(!;t>yMZ{=f>nA4p99woX4pNTKp#BlI2~ckdrwX`HB8=VNl;}{bQHhr z^YC4*jH4vyAp;cw$k!I^S zrMzXM>ExeRsb4MA&b2e}OtR18RN(bmSPjAg@B%Xg0AUAJ@7Vm1XvUjdDPPAMUrDz2 zAve{Pfh54A*QzEXhUQQM`U!&s54TDl+=9B+o!I=l{1Bgi2;nmc-w(kcRxKm9S)ms< zyWg*BP@MYwaQ7@#aON5~EZti`7j*P@PW7?;b1)jH#A~qkk48TKS?C4~yHwz0$?M+~ zN-=eHE#zv%=4c?^Fc`pT;big)6~HKh;l*;&2?H3^BRQnQ@r4tgIX-*Deh&2&Ek=FB zv=%D<7JbM`aA1-}HGYpeWmDs#P z+r3(1P*xYprI()mA#k2f*V=2L*u z?8P`xfL7%LVOx!gt>+PgQEc)MYr3LVL`rW-&LP|9C(0G-ES)~HCdR5JGtMa+KLG2R zNyhRP2FhzuCiQ^6tf84fdNH&Ze@nldw>mB_7_HnSUe>imSH*i=mG&M&HyPEi_)9W1 zTU~vSpQZIS?F>R_*+(&^0nuPsb)iX;(AyPW$)BU^EKl==mXlsbI94%MA~nBO(3Hn@ zwyZB0kr)Gf1i&D0`dUCUI>XY3R_$Eyq&(=b2)STo{d|=mov6RT?)|t`K0keB7EkyASRR?*SXdB~cKN<+VOpN+(8n~a?*G2a$ghetO+SD+g?yd7 zXq@tJoA8{9eWPrc?wK92ex$QQiSJ6^@;uia%9^+*d;ac^A5#OcND(Vf3A0R{jJ&r_ z(dqP)x7A<0)bG7Cu9LvRBF~LY+7wtbjS?!pT z(SEHZkc;c-^pv|Greb?zI*#Yf7XFgj&pdA+Cx|qb`bvdXGuOo$+33}#eX^!~x}|`Q zF~=a0(xc~#wi(?~xO6~hw?I4_`1&_8C2*<7hSqnxxcs-E=zkFt{T=BlI~qHP*;*S* z+1gq<+x;EvMk;E`VtxZkL}IlU9~3Ic8=EXNfi+h&E|ll`$I3#L!0{nujRGO6Xxog` zt=?5Th%GE;hj{NrS$O&ssD}O9Mp`CZI~@{ zh-f{B!i&`4@3i>E0Cd26$creLN%u-ZNJ7VJzCOMRQ0lIZRM{5Z&kD#)CArLHI|bRD zF0->RkJXfGOgc)pwT{wnL{fcww}`9>G)Yg7Sbej(TC6O6Pmn$fhuyBgr6(v}=4O-C zqNmtgzASQjVAf1Xl86GS^eZ;Y;PnZtU{o}3cH=%u^eT#X7y50SRG1*)QTuX@1r|!w zCEhlXj!A9n;sadf=C-qWw^4hUG-nI%=2Zk!^hmOInzX1UYmE&0Ta6V9*TVgbBF#gC z-vq1SOcZg-!t?@KyzX`4A^Qjd#O(^T5h$P!CNMvIq^~b)OWgcXP@dpTQjW9UMCKYO z*Nwro=gQr}UFWNl?xD)vqT!(LT(QBNue-!vuTzpcqU0_sc5X2H^b$QWmIyGfA_!2s zyh#u{Y)0JZ@H6dWj+?zDg3KnW=&3hD>v#a{`Lp(d(JzNQ=Le}bUgbS-K0?CG<4^|B z&3ofFM17FIo2&2%QrU&#;*n>>m}Y^X(DZaQW5`GJsMw>xh?VhtDY%JodYN$><7G9B z?wR|%laJ{xKm0rb`D05!I|KZaV>pF+pF!1AmI4Wdp$Sz&T%e=HC-H+?&Uz71$w?nc z=1#k+k|{L36ji}d=yC$UNAA4=iNdz5=lwBVGP4hMmqazagZKf~Z zTJZnHO#hjR3EA41n43B~=>IoICoPjn+XC=nL!yE zMa)a6$}WlMAZlHkVszf-JkwgOKS_{V zW79;8n)6d>mhE!XLzCxxUHg+sInw6EWooANT>XnWF;dU(3#NI@swLLdtd_0Xh^Z`h zFDv&!nSE95qx_9a4^mTtb+0wZMcVduxyljSsW%73T94Y``lLennK{bhJ=&_$^YXOd zvaiQ75z)3dQ{fea(m$ptAAp` zpg_;)=-SX$vz)eRPP`somPfKV!}t#~L1+9T_@ugFL5^9H+btT84Eh1{bCdlcTQ{+a zQ+HS7YNu9fI`SkDDuGbMJ^qpJ7Sb-sY1EC4_bYI!V}e#nCjP{PU9a6d3F);M)YhmS4jVGQJ%*721f#$n z%J;7V5zG!a@GtuJT}_FY0%*p3;Fd~I@lkxog48P@1$g{;iI@uLx*Xt^e9)0m{AlsJ z0yr^wUnvR!1;$}V5;0|%xHy3%@%mY?0%Cp(iI@gx1y#S}Zx|GGolM%2H~%Q05$F8+ z2h{&8HtYpX>*9VF8L+>fzf?(oPn)3m=LiX!f6RZd`=$fa+WmhF7b^16DG6y>iY93~ z38@kB1?kC=eM-s+s*!Q&Mv#9I1U>xQ(2H-1!as&y{Bxj%p_Tdnm{9T8>!LFz=W*XV zE#q51^l$jZzg`!zwYL5S$Vi#n7|ZE9e4h!#vUY#%G{tXrm5u4&$3mjwg$&X+v1ksi zDWOq&G?_fjPkEKbm|~YKWDpaH=m!!s=oid|T9TD(`o_R<{xk4rqA>nUKiG9{gliF% z;2Q9=pcB)z0 zvv#_DKtb$J>Ci2WJfE?eu&(KgCdX?wj;Z?HmcdO&arFjmF3qF#n&&)A=@ixs#1=Y2 z^hQfosufp%Tmrt5uGj@#Zco=&b~|bI$Wy^xFMI{In;nd?PM>xhrdRkN`3?s30Ch}x(x#a zEuqc2^JbT&{XC!ZV^%gt#ehWXVSv8z&;}OBZEfJc*0_l~eS?&?^?3WG-QI98J>*F_ zE*TP~kIw0U9(x!YMGbABQ)=c`VTeHmjkHmieYGYd^vs#1r#u8B#ZVI#b(S)FosjE5 zaSA>7^@_#inTN|bp25fDG4_+gCO;kL1Xl1exQB~t-5CAMv8C|oe$>56VQV1Le9*qXNlU5%lOC{_|ze;cakm*5(& zh(wTof@uRb!3RqG7i-X@l^53zGrnc5{(#Wce54!w3vyl-YNZ36Ij+DJXmmCp8JC_= z*o5ddOq^(MZt6jcVLxo^cA8&$CJ`CaG(FA)e_uq}?|YkE-{#m}>-7_Tk=@o*bJG;* z@>zy)O3nU));RQyOCGJCm~7^Ov9JHK;r=plT{zy^{BIMd0Q-M5aRHNW{q)~saCbQ=VTJ>&GDNF~#w;zQu90>A05N)%gJ+Hy8$rGKX20azZAq%1}-a=?+7R zs+6Ei&A5O1tA2#1eAkV&&ust=rksqRfG zk)Y#L6PQk{@71N=B)qu&FwVGncd145pf}dTND53-CY-?M$XG9Y$QE$usi5`Hy-Cg4 zz1%q70yhFX9D|gAboY$n%pkt2dIjqTn!wsHJ)^e!z?Q?@fll8#c)%WuiU})*f)=xp zgLXVLP$!yDNpmm#eA1e{Ib#kct7nX7zXWYwIL*^m^zGEkX6w~QDe03csH^8f5;h&K z_<%AfeZ_Y-MEuA>4N5{L$O|Qt6t*#hf76a_c@*#Qz>wI80@6dgydIB@l2$WbKlC7Z_dwaqO5QG#0#7IR9Qj z0gtN!dY@!Hj3EJ5h+wQVh9RgPVGp4)=a}3}^tC0|M?}J8`RN3p1_MyidI`1${zsux z6mj7GT{C*_l?aPvoQ2mMvAdJos zbDN>-w5>o=GOnV^M6*eRWu#{q6H+NkJbJ}gzn$L#rHKtT1N#; zD3AmH!!PDrATE^ivsPJDDOOAUaQ3a^1FHSL@}Ll|L9w@B-08Jn$n=%$RcQ5>sEW}_ zon%pb=w#MH)`qQX7tbx8&$qMkO}??l=AtJt?x`SBn zr@3*H99)A~527>_5aErQJT3K$VJ7GxD#&xA9?TiC6D8k@?13*Mv0p@nlN1pj^h7i& z-#<=LPnu@=CE8JbNEv0bU&L&xCODL!!>n9vV2Sv+*o9MS1G7MVScI*~7T!nZE+~It zU@Xp*c>+d)y9!@}$ujSdN}7)8OoU<2C_g>wuIbt%CKj}zs6H*xl%yIsQelxkFA;KP z(pkr!xh%#8-fE_qI9qW^Ey2DHzFHUFl2?feO_R)azh2VVP>>dAzcEj`F>Hf4gRn85 z8IP!N0uaF4D$aP-ipo5J&V0s*GN82>TmX4P zwfqvHm4Q4>_G2@VJ~w4Q4upr$jjZVh&M=FJ*l3zXMRCfLs=uQl5HZdao9zz z=riLcu7$ic$VdGyKiTV2KOn(Z=}^%5JZDkSM%Cw=MFe6laZRF zY|L9v!M3RqggNcg;6ljI;H4#bU-SjP979ekDsUWSNs@_z9=$npa~>OcA*OJ@o{FB7 zfQyrvuevA>6=f1aR7h+BSjU*k{3Lz&_?!Z$vBji{HcXehyEgx=SMoSNW4-)l%luAh z_=&BjyX*|R1E9^(Do1HZ+E*9#UxOrw?lHFn7QaNf2({>pvjj)Eh1S*;8~6l>@0b>O z1R9EB>#0J-n;q;xa1e0~umYR=??OYz=|Z5Z_|5yy^S|kip_{9*dya4hUY7-5$gR`i zxQBJ=YC)j~+=UDp?ZV;EG(oZ3SE(P|sfX#Rb}7#xkfQX!&9gGtB)5hMC{@Z6_I%Z< z6qz~67AhQ<0TY}*E@~}f9K*>I-qv%J$2=p9SiEmmY;EUS1vn^tMmWfH24lMih`mL_2&Y5Nx2;t_6(0Ut{)4CSoN9e~zL<` zA`U^;-rRI+foNa?vPQmGRU%W>jYx+VzfcRPEb+3eusNWKWtuzky62TR%c9!)`7del zUtXQjO0`MiJCXtZ_Ut168QcG7ur8$UX#6b-Ft%|tclze1{~fh|zh4Yie=aNT<5VQ6_CnoCppyOO$BCV**PnGbv_ zS;rj4IKBrxfU9*-r^Sx)M_Gj;y|oWh~rW{N2@sZO&yRr3a+$17c&xF?FjPi z?Xwgcc;X<$2;-st^$DO-$f03XLOV{8u#5|~*EJ1|9Rn}o3ek|t;tL;L#{gRVg~TYpVs z8Bx&2g9U??Nc7?IMFh@Ld@FC?V;EQgSei}_M%dZ0IHEr<+h`sfJ#3Y8UZyx#I5iAj z=&9;8-M*cXx%4T%>@MfaA+|5fer`5|I66r*I1X8Q^#UC{*Xm0||D@F0&59pIH3D}a zu`E#^6MYLtoyt)vLiuBpJUG>XeLS~}E4@9`AB3@vyfoLmG+TsxyqLWhFA(s$sq&(>_O^xDWNe36o0Uz<@OCmRMcv<E&}=w2K4{^TmKHb{{HZ9Vw02cKXYjX?Y|h%JoW1JF4EEsX}hiw6e1Kh z$hyRYX8g#0kg?p)tl~iz!zL;wWF%ktT?Mj%yw5Ut%J@>m1Z*-jLJN%LH{5;0Sk3fBsOE*a|v$U$q1(on5-Yj zr(2p|?G;#djs)oMJdO;jZP;gmZ!oS;SFblJ2(l4o5&Mx3O{fJ6l(^F&3b4g}!&#qN zPFHyITSvKKIs3dS$mb75peI^jc@i)VH}6Z8pGYOUP#z3_YWR1`1?}XmdhKty!`q{P z(&QIHo+(mI2KQ>+>?GmA1D$>T-Wpg1Z|ueUG%kX1Ta-FD18P?M{3;gyABjK zNK$m}VJ|~CrU)zw1@4%=D$^tDXt!Q)hta~kIAbQGkH(AYlS>n}ka+aco+k$yni8t= zw1NZ}F_=91^t_1w_FqXb^8We_hkPUg{QL~w+`vj*&>SL5L95R(kT-!w?PyH>OYk^i zV5MsyoTyifJ5r@KDXFsf9mWD~)cDv+fAS%gj2iwIsj&XzzbLc*GW2i(7Avps#fSP{ ze9r%L%ikoui=X~3U%GsAdjAX8l^G`~+sls}I0XVM?8PV7mv`O`jEUsD zMyt%1o0)IN=p0w6vrfTULAf?!v@eN}p=)winuCh^IVw=>EDJ^-hf?yXc>xD6nZB7fbS9+$yq z*b=6<#|Jjjj@>`g6-=Xci(QG{^pXz~L+)O`Xfi$3Iw4~6g2z8=TnG|Gu^!102dW6Q z_(y&?k{84ngI4s;y~e3MD2=z!obIs%U|QDCvCv}+z_iq#R1hUEu4JVTaR1YJkpYWA zV|=fv>0gC||6J4meF-Dwr6v3L;l1Y;2j{EH$fgLHAw{aCDa7QF0U;qa|D3d1iL=#h zBz&^MeFFF-G)w0K#|xq*WxCg2eWSyUp3bnkc_wk3a54}xh!vr#U~;#himiIy6DW4N z(5qJ14+J1Qab(>M0IMMpIHSh`d@xf>Tl|^)u*7pyMp($!7a-sy)QlRG2+=|9vE3dK zvpn^S0_m933)W>7PP!O)j^gE6(-~MG3Rhd|&u|J@JF7AWgOPu(siGK!DwrL2dy?IQ z+ILxSS7a(A9B}T)GB&=Vk+jTsKxl1MsRfK(Or}={T>3!uPPpv)qrOB?)vqX}^PA~8 zr_l%^(WGCjR2bi|Vq>w?=qjzJNerpL+Nt$h?t>2vc;5aCo9VAT<3_rxr1yOZh50>n zm+L?OUjc)^cy|A9o2F7l(-rd@Y7Gl5#h7~Nm&-z0DGrSS2vgZ)PQxrQH?KGHvozG4 z%EcEV71_kjBt-bj|ElW1Q}+zYT1!$j`vd0_);aq(zEMq~dhf2*%eP%?o@de-hgh*mWT= zToY&wPk_DG02x=iJN_=g)|XiS5}^b1XF-wWBceYW_KE>~Qe@sJecX(bbBD@E`Jp$7 zE~z-aA#%cPl7WTSCL-ixmI;H_6uJq84r8K$dL-JY26y5gD@BUs^dfm>X-&mS<9r4A zdqTE0t79-?r3v6ZHE|vl&h?Vjv|Of$V4_s-1OCutln&&n)uN(gG3VYw579=H$_iAB zB997n5JgLMY-;q^DwVQSU=Cznh$f)bA_I+paHO4TPQ##;rL*{^8HaCm5GmsaplC^0nUPk=!qzhg~-|5Xx%VK4kQ=gM$Qgc_Lhk!L9 z@(qkJTX~|>fJ@!m9@gDT@!Bv&Pt_yL@JdVUmMWAB;V!ED=xMUMVX3BVRaFZR&XH^l&w+vp6YHI3|0&17<=CrvWM=KX=aG z#gv-Jk682uV@4-=_`wA`7WH>y0@dYO>T_>l^rFF0Gj^-&IoFC4j%I0Kk~oRkdl>?4{3X{BHZ{ zsDi;+VA)Pm7$NywT=+iP`rwZB7c#}46qh?s^NP?GUI%G~YS2*3KZ)nf-Xd!}U9$&F zrps=Gq#xbLPn@R6IM6Ri&`gfM1~{&x!3S-58n33QWq3BEpAWPBKLml`NJ}5Mdhv_8 zuPXC>@0tO?0qJ05_~uSc-DNqi^s9^;Bvy4!=|sG{dg}KwZM)Mq5K55hV4fEZV4jx@ zm{G9Mmp_**0RS80ft|uSj}Qo>v3s26G?0EXLC!?SZh|Z4&|jFeyTzbBeUiC9DQ1T| zbiqKg;^XLt=zq*27zJh52>LTY)9tiSNP+*}0Tn^@7TB6X51(~L>;2Ne8(t==YaqiuQgTM|{=A#)H=+-937xGO!M;x;h{ z;Ycr$+97?`i}?|84+c2Czyi1iuy!QpQL zL&!(q!FO^ALkJ5Cm60_9>-3h0759#fg3_cCbgy-_#89Fs(SG@UZ4WN>Mq;tG*0l4a zLLvx~*zX)}Uamc5bb4P-?0;PSxdPa?*A#%>gXE;25h%}~kMG?d=t=N19~ZV~3A2QD zSlP?M9l#cPM{pf$Z6gJQJ_TA^+%OJL9`i`mHyE&w%-FfjD?EZsO4W3cAhAJHmC~%< z6*=9$gC@AdgdRyWeFvFRUuSi&%(7es#TkGKRtwt6ALo^=jmpN41({>*_zBA6ol(mn z;5lHrh|xPH6B~AhN>QFTTXe~Ln4Uzdvya@|IH|38?ytA(X%Qy|Bzu0;bT|8}`5-mw zBRPX6!45GcYs>g}(_2T!AyPv8503&{=1NYDp<>Wk<>}gHT#P4UruiS)FhjiAP4gU^ zwFm~CJtBwE%{nIr12**T>r+1F8h4jX+qwoG3Mriw3jHDs5se>nV~ZJKn$uUQc^{>Q z97wy7lpZr=aok5mF5KOzSke=O8eF$m-J!oI2n#UR7vDl0S$Kh2Ze zB8cUAGuM7JP|eUvb?O>|#Wd9N1T>uE_O3qT?&EOA#1N+YNilsQFunl?dW*2V`SCuY z6dy~KBkBQ|0{D>78huJ=QM^#eONHc_+S4|3O6nMi?<_TX5)$@yzO-9BFmD^PNB01v zLdDcIMGvPFZC^R-wSac=k1F*z?ia>)^Lg2orOA25MudNcr=VZ?n#4Nvqd-_E&#(S8 z!;^QoCCDdKTbAu#scwx!R8~0^qoW1W!YaT&2~S~7!r=p0<4{-t!{bw&C{;%3OXNR7 z7XivN6noxVR z*iB3(?)QjPN-BVSN!~o=gM4|Op0{dgrOHq75c!JAD+B9t?+sq7tBZ$C%{5P3&ovKA z&6BRj)YNe)SklM6y>lMV>W;U-FkPUhO280U*CeLAU&%#Y?7=|h}HCraHxGB4bMd$F7-HznMY zM}FM2`%L>x8heD9u-E8#(F^9>(R0hybHun;drSvUz%NqBVd9+HeevE})I_EureP6M z4>!zaBXizfO@mBMko4jEh>?=cWd@J-sSO9W5W``RFG`U9lsjCCy!FDejW#a0*?o@t zia9r0nW&D9gLh6EqjxMiIrfnXvbaz)iIktF?BOU&)f>5&sc0?E-4XOR);KwuOz+J$-9;; zyh>$M!S|fC@H-xM!+h@nF?A33NLQ9XGd0}v?^$2m>eY@MGXGqoaHh8}3{B)gywBv- z4^;Bn#E-Z{`b+g2Re%RqnrRP53{;@cr6_0K=n=1@M}ziRJI6-JFj))|$w&TSkgj4f zTnw`thaB>|*_NS7524u7$?UY@nroKqTkDI}*7tO1#E4X%8EnS*!wf61J5Zc@rblUq z4$FkH0A|P#(qw9xZ*2kTS!x}rDeuW#WFKJOfXTs!9yx&3)+AUB%d`#%I##hLHb08F z)XZe;yQ*z6KN=IxJv@fq{VUSRk|DF!;$an~9J7geevxjguGQsY^&pv<{zcV>$u&(` z`$n&X(xOqltz0GD-V8-&n3>Xms;z=+#83&-xnl()ZGBKrb2-BGXKmj>YJK>5HUZPR ziZPQ~Gb5sPxkY#y4MBMs2XckPxwSF9)ygQX7GM^L2|4nLGTyp%Bk}k^KUNJ8OV$qE zIC7I(rhNH|Ql~F6IULq%oqsGPO9L-vKfPKugR~$;SyC2SM5?9`D)pr{GBntpWQrC^ z;aSSMb1bSPD^w$9D`%6&Ors#UJQdM|iCHEF%;;5r4%a4b0Hz|ZzHO7Ku$Q<*b$|pR z9iL~+$Q*@a%3-1vw$;F_m3)|wWE#KSuqEy@L=UVLK<1b$o92jbKki|2fqbPeXs4-l#TcsToBj}~h@98k&Jyq(foKD{W6QqgWRWZS)F=SYd9`oUv zh7hGUfkiqg7*iW0`=!(l2CzSz);g+CNbWiu_lrzyJfuuztz7Z32m3I=1#t=L99FCP z?vA(opn$&-W0A{Y;P&?#;shcx0CiL&R0ujWgR#bCtkzAKAzfRARM4db99gZr99~Is zNKmK&G5yv08D}bI!VG&jQi;NYf^|KL^(G4$>S1K=i#>~)>X8s^Oi>WGLX7b5kHs1W z!bszXaZwrpY%51mMq=NY8&yCJ^GYq-7GRc_&4XI;=M4k*bLbnq$~& z_PCrLir?dWY7&D-XeuGL_SPmwu1iZC$`oAvQNhhl+COq4)?{(UN{_Iv7+;$}RcG9d z!a$`w?Dof{u_;V;5C*Y9Y9gdrg#wRp>gh*N_^6SgWTq=|eBb(f@#L`*<*A8dJxaKA zI+r8q+^9SI z&0{%z?MQeYa=cFf@L;TNxfqs1r1ra9$K+71=Iv|SHl4FM!6ytwySY*R0_U-Vn7YQ- zxSLead_>vhsb#_3kJx7#>fVuqZ_u4d)pKrLJ=q6mFrV0402yOZH2${xKq3BNkp6sA zY~RgW6wDo`sOoHc=p`k~ZZEqN2cTQMV9=e3U3%Bn??3%*kGKHLNF)slA;Ja{jX}3Y zzygnH{jUy%0IXT)<`^Y|`_0`$Yr`fIjm5^8*`-y|$MR>y=C}Lu?w5Piv7j5p1eqS4 z;e1B6JzseJuh4|JyIs-W@%fCd`@Dv?>E?JqzlSSYc=c~rga5GtgB@k{$J?tW1tLW1 zBKg&sxwG9UKj!D3Y64U5`+q9?3aG5Mt!=uM?nXMK8>G8LI;Fe2yE~-2yO9RzkZzz( z^TnHpq)ZrezAlLnrC9@)tyIpR&4kwVM-O9up8*P_ZjS*J)Yyc^q7M;)*=P9>G}_># zFUH69#MmZ#Lso1^v@B|>A#aRLrAl9si6omRD=&uihB|_89P}_!8pvbW!7de_3_^VA ztT4Gx*6Y5I#10&&VncdukIpL6Y0Zcckezm5fUyt^krJA+uvTT@rwn&OQ7vDiFT65BKz^Ppi@l}-HpogVwp?onP0FD7E00*j7P){h67|<3xG_fk+rHoe z)oe==omT5hH)-C+mjz!$UO|S)oC(uAI$3e-4Cpl6q&`@6pj*G?C#=z zpnYiBjp!+h;Dd+0v~ID=EFI-2R8Zk@8Kd#^ZQ3%-Li@^Hfr-2y17ozY+Ei(0mBd2? z+SJaAdcVq4o_lVWm-EErU$VnAbJH7{bkIfa7tkgSh}%ui%SC-X19BlxXRQxeYhXru zK>3l)38i7tq8F=l$@(JGw`m+#kw-Y;69?+b4X(kJVq>ew#=wG}Y_NbzGv6|qgI!XV zG8*5627xktzsXaJ6jSQ>@WJ}xqVnvFGEsJ@xFTEp`Wxb%$-2r8ZP=%wgN2hc13msk z43*Z|A)H=Y-kF*}G`M=@=1qcQ;0h}iQ04lOn9c%9t<+jH`~j}R=+LZ!onnw% zRA0Zd#D{v6vlI=DID~K)v`d4+Doiw5rN2p>&yFr1x!{XdOMLz6^gE$7tM1N_jGz%( zHSwr8^R|EG{QDi`Rmk0JU4f!NU!O3XdVDQm1ENgxv9nTTTc$*}gCC#B!fsx(VCKiQ zERXvUgRtHy#a>)ay?}ll6}H=&v6&t6Izb@?viSt9hT1p3J&OrEL1d(P}P>g6SS3wKDoY=ePnB-TE8M6Tc3|ON;o#9 zZyfJ3QsHqF2h(1t%!&>q6p8m-Fc?eh2jXKaf~_n>ryMzI>rgm2EQn&YQPalWl0XST{;q7uR#m~L2L64VbGii{A2>X zp=nx9q0Qje$jN>@tPA;&GNs*m%5VjX5QVqg{E<43P`A|w6{}BO=NOHCML!76M?tY2 zc{W)u&mK1Qt5AT`oJ8--jXUi9G`{3e{Z#j02 zCF8#`DPV}VPIjN(3C+!Pg0OitnM2vRotIIJa zgni%+JE8ZxSKnz5vua9OS@aRf4WP=lX78^z+xW|9Im@OO~`oe0_2+dd2SOp%zvns0l z8291AaYmIr=y;cq&BcI+Mz`-%gCa&0b^~Hctn{9K`S5uO2)keP&#)rgxN5Qkw;+kr z)hW{>J^-zRGexkB%Xd4`Xh@@vqp3 zuqI+m%M-EEXN1oqGka1}o3WCQeGS?a?J2{0hQF)$NVU|9KY73&^N4iEEm~=z*QK;; zdc7V#*oj)*p=@8mL(0sSZ?RXIq@!zzzB~&YU7wmN%94sg+;cKc*W#o z=47UC>r7zU1MrLs(ihVkb{7b4__#C9%5HkG3miuV_;FXT+qIeYFG3c$BJt9jA7$~m zAycl%=!IpuGos5_x?8;-p`Ic({PFe~C33G>Z>pv+dAu*Gr2LEqAVt3#%#e23Gq zrd3|tZr8z&c_2vvZ_a8AsFL!*ZmrF1Ysp#{{JfxWKyixFh|e#M=4>$Q1Uj%-Jka5Q zzBP9HfY*IQ3*ufIRFu^TfsCaV-5%59L+6dBYV&>SP9Kz>9ejqAAPK%M39NZYQ0*0M zsW<*i*C_TX>$oHGJu|emmaC8mu_tngdiyETEt=7yJn!UM23chnbEZ?0X2+ZkZ~665 z9vg9$Eplsd2&yKf7vmB>w}fVz+_*(h55_*z&}VEu<-DrH53!oH9XeAl5< z2_Bj;d)xT92$oUSXhK8eEfMdM)J}$Q`N&N78JmBG zTqBfti`$aR_*pMaIV*CeWK;Y)$-8rKk@me@EQrxmQ#f}mBDN}m=%FEU-3PF-1$C#! zRtgyi=UC2;aZRT^QoptM0y#n_5)cVqQgrBj5ts!2=5L~_(@?O;#@NEihy2On@k{V! z(gf#^;J}x*e&csg2`hwt@A${uB*|0?>Vbk+*4$iDw#OWA)Nk=-$FCa0m)A7T->!)B zd{^4(yXScDlkt&2T7I3a!$zScGz*kSqGwBZNACjL!YukFtxdr44cAJ6F;FuZ{T-*@ z<<(Tk^w!_>Q~?%STY}st>MPzAR3N7DX7iR(ixmNz3JKD z&dqyEI~aVsonVv&sWBy^)ShI}>MC|)`kh9-rn)q;E+3tgiCZ>t%83*&e-UWpe(M65 zeP1IRkD*ZD=d)|i$#dB{`B3t5Iw6O|cyr3&N18AjSVlnL9sQip=tiL!|DDk% z43TO26kj+5qftK33LgjbeYZRx2iDhqh?M0^Y_AIPG9LtC=4FU8AJDFqY>3EK0wr&b zx_6cR6}jG^Iq;+_7%CN{h2q`fYX|i_Nqlis-v9b`A`ShiL)K>GnD`0*VO*OYUVvf$ zqF}15P<0p~oX6MU{5^{D;X8hdSw?w93{L42L-O<5VnT=zKa=nMT<4Fa#O^_*Xkj=) z8Vwb}I_TL;;hbu$^8n+TfGg@ex6zePpW&Eh*?oiWWutu)+JQYrhMxn^{AhM7-kFdQ zPv9j)Eo+nQ4$%Cl?;~j~tFHy_*g3A{A!p=pRP^Wn|5tb(ym@|{Y&S9E3unGuZtUZn5({7mpen7x8>jswuE7Y-8?t6rO0WuP za7Tu~ARPO!I798iVy`ZddmSI=9{Ab1jCm6)c;;P~^{!cu7rl;&#aGe}X4nYF+dDsl zh+2rNLmlhG!nLVdjmNDvaLLw5x>xlQtNiZPr~1NK4cnodF3uxn7${H|%GRedsFD*I zSe&^FkhKEPor1TeiSZayX1-Uz4Bg8}%8s$dQi*K}?Bk1?i(Z|j-_^b`G#^AyC0aCr zH1C~tO;;|;Lz`kcN4r^rl+0ZvA6)(rQU5?QrufASw?x>^F>-52O;dHns>Bg~;WXPrVLbXecIH#W z8z81lgqw1tck0^oZfMu8kRCHvBlmrI*7zfi9!_PC8JZtPorF4sS|}?$2z$yuMF;(0 zxtIgZX)0c2zV}a<1!u{f#*Dz4jjh9blhHkGK;!~iA?hU8p+3SOmLo$PV4U7wBE{K#56T;OjBTnF0ry!Bx}=4>@8VDwD-pvG&W$$d z48zf)-Kh0@3b&3I1t3zE4b9yJJU&?WubQIBzi z#+&HJWSv)}WY@FmDIYm`@)}uIOY$W^Q^T+6Wvr@bO%<6aVugzHh;f*ZS+)^$$|WH0 zl=HvJ>*&0jFk5psKFqv1a`BOaBQDCQn+sTlD}?d{gC!)kK|Gbe%n2ua z9r_$mitMZMyGtGXRX#JvV92V?JiP9@K(3%N+BZKgH{>v}Ng~^LIKo2$D~(@&wbIky zaW2Jr8=mgZWc6BUDD$+Z*SJ&~U*t3r`mJSZPcjl*bmr#*#`?K_JOmj&B$?QYf-03% zz62+<*7Z_HU;DPpp;xyj#&A*QAdptJS{n!|G8-%=ViHbR3bBO-?lsC}bir}9$~;3O zOI9387nE&nTE%DYdu-D=deBh{k-119#5uU~GL5dq(}(&g3|pKiLU~fxzL1#bI(gxU zNu%lS_lr&GtL(UzHD%5!9zWu++^Vu(+?e5KkK1G6UwV!DOXpg8=yQN5p+>Y*FCn|8 z7@Qy~stL7E`xsQ1-eRW|$lC5bc;4uk&}RB(#@Nnr1#*b@-HLWGWmB7Dg-4U(8}R$& z^R>`Cw%MbZtH7}2qSjuWNd=W}Ox-;ZzfXtnv`2vmf>nN_nP1u}TIGpaA394%sM%+I z0zul7;-uW-AG>a@j+Ahm?gaUSc=Un#@sPbGbkQ@_#v!pf8|6w1*`kLp<^d0UjZrh; z$(ORHFZ#^4-EJJ?T4fPJ7P?r32C7P`n)tO&ZBuKBK}G3;mIz8O3^C9 zbp3Ir@_TKVbv}QJF<%%tt3V}fxNxnhACLhBYjp4SNL1MC)-cNb!y+fIkO?2L_c8R{ zp)Cq%DZ7+qRw}%oj5!1P_)ni+tPo;>IFo+*ecc0&gW3POLU@^p{gatO{RqwnfZ|gyZzCl(9l27zTfpo#+!^LMkbx)Ulv#LfyHkRL?SarDB|l@ zNo716eHu<}Z1HSq18xU4OCW#`Co)6HQt=xGF+_RO#E~k;|YeqO7)$qo29eD1nY&0kVW~iuI`$|Z=ep`T4`o+!3R^2lEmr-v zm0%Kz)UU4Pm7NB%LoU92G7top&jb3-j*gyOvcEN)(I_C}eC`C?lM$$qgaI|vdylD%Gyl|+dg zXM0D>3s`1Ci&JjtR=w6orLy(?N=4rWGYxh~Y?a@3UhBp3B`b;6js|>~I-9e|2=M3I zY*m=zcc%NQPhkJ;_9a{gb;S*Eb*k9sI5;I&9o!eGL zXj(#{Acv-xlZjznji2xuG>_Oo>U=6%b-p%BnoaKET2M{ffgMGMkSo>7K80|;QF}% zJWZsSlru4$R8u^?ewU;l*#VT6rv5Qu#RJN0L-i9P9FBm8j;ALlmHe9vSM@Gp`#2PRf@Z$*ja0H`i`RBfx zeDSCEf)ykq2OU0N-y0QNNLK_F{Q*wHu^QH4XsLpKP{=UV?I zE&NZPo7l7#)E2-bO8|&_p#JMb`>&y>_siJ)HKy&SXa&H*=CQ7x=71SLZqV5d;eZmlF)}A{+2Eydov&;MT|N($}7E>hMLq`&Eu%Bf$GcE_v+mB zwh%}dB-bG`YbCz?>cPvzxqZ(^Z-UNG z8yvL2LT1BC&6Fd8T1hD9DRRslG9##*DVU>(VJg z<&OP{fx4exjuOwr2`q*St5eLme4K%MoXOeC4qCNSw~1>>n)%a-V3!<)(dARGbAZ0C zYr_Ob+u55k`uc=Mg0@|?o@X9%-DBHr!iRE$xs5R$(UW`9#V3Bpyb zGqsK1^*O2p(}o813!#VCvMzC5^&VjiPv}PkPJVbycl-c3vb7z=3B-G!%OVZyL?$1T zBKe$*>%Jm>JY?MIg!$<{3cQn&A9gWM>oFIfsMjD1IAb=nZN{Q-dPwO}Rh@(pjg?}F z&qQ{@SM43CwxUSc-?Y8Q$37icVlr^Uv@;aw{XkBIeZCsw16o)GuXnGT(0lVb{99cI zJAT~Li#TRACyT^S0E0vy;%|Lt{xS;wj3`k0=83I@`Y626KOtD9&=;{psxZkGug@Mp zJmypsxlB93PvrY(jLsg6>HVX9vVPy0=+-1TcUa4+mgCdoFsPK zB)HmW@GJ+eBm52wz5y~Q*yuUW)Y;|qrxk_n#c(KpzL;38RmF=QV<=zsU zQDjM9j5);jZF~PGV^qk{cvW&^-!l^TW9#W+BY$XHYguL(xu&c%8|sKKM0SO`+7N@e zL&d!D>rw-`&5qtQAm7(fc{IrqsvVHx#!6-qxb-2^LhH6UpI;k_S3vEwV%M>BM1=1J zSVW5L49!raRx(R)f1D7$9T5$ZOazy58a*~B4&7${0evFH@A5TONy1QG0^QWIre`yi z)Q>+_3YyTp!tavf2uHWh_$1|n!?hh~T+|ZfQdrmd$o@AcQc+GF+MPI{B~rJ&uLj|l zmjnUCc1#nM>gBT5Y`mW5hljznVPN{Y5{5#(>vbwr*Oz7=-y?mJPyjfmhj-={!Djo$ z;@dGOo)C2Ov>2j|p|7oTtGs%L9$)k7<&B`N!UWhhcv z?WevPC{SyecZeLzVk)7w_&VylDRo>O zyMyzz!;|P8Zm}}fF)O0nL-E9)AhUD}AL`%BcZ?p}LPNG%v!(79eP;|uk8YlIQVVW{ zXqVfjt&Tz+TK(jMdheq&N-F2;DD*C8HQ^dHP`JW}LXs*G=;nc0QU6}JgN(jlwf-7c z#Ca)9s{m#C!*EHC(iU@MU|P9M(sH`EWiQ=klzY6A z;qNT;WQ3`x_R$vUvZ-B7j-RXKv6Ax-ze=zk*(lrG4n?U!rj_B+rwVP*IR+C8`lS6B zO|OFxI2;W#e}(y-UPR4_-|8_V#elS^98Q(43 z*X*o>9lo@<-E?f)w&K$ZOIr)(M#@vRpH1(QO7M&)gtd#^l{IQY= znWvyg6dEo(w6D7VF=6?)oyS{(*+7=kpBIG0H}Ap-zjk>sdC}<|w!}1pQ#fL0HL5|a z@cQX|(%FajZci^=<*&025%XaBo>+2wwo*4vgP%@5@&Bieh<& z9T~p6(g)wsg=$n*VbiXAwD`ekl8WVUS*HSj6J65|BMc}Q4;4A4f9y*nS!attu#CAz zcKYOi*V&g=LC6Ojv5v7S8i^>>3H=pj8o!beHyZM*xSN zctD6ar(DL+WUg`)=Jvp( zB!AFO-wBv8>?|U6?Z`D)MqW4HKBAisClQ}{<6}yHD(XJNEhNA4g|Q?XOlO)1P9Mi2 zXdANm&=tlSaq1n=oDfZ-6$E-bM4P!&kLpI6a(uADf6Sex=1+BaLD(PQcI=J0$?uJr1*36(SB()a<6 zMAJd@9yQy~Kf*|WqnTB3TeaZKvuk8wCrRQclx=#E7UmMo%VerADm?n`enviCA`tpxN1CEOmlK z(fSwaD^cwX5_caoKu}lsz=itw=zx|4m|DONEmrk~KWQu{8M!mjR~}k^g;teJr7W0; z$)F*+c5vXF6t&5P?%PID#TD=V7J6N3c=u}b^1Y|I!|g?ESqXj#-cNgIe^^$W$efwGJ9qsku!8*D797R5u>lZ~yfwn<`h#VpT5=h$<&;Q z54}u+HU{)htpvJ3US6a=wDi(U9a=t0@TE!2OL7xvE3_>qz1R-~nxffnPCDUN0~yi_ zXl$`1dgDnC*kwj<(q?P_mF7Fs4;7XEyF#~YP%IP4bO|L=V!WXc#jqefb`LW|&%FIB z2|@Zky7Rf%46B9lgI5X79KM&lP)nMOjT<|!yVSo`m-G}5Q{`(e(uc1nE0kEvQeg96 zJ&;E5##4L^A%wd^>*BA&=e39>tTs>}&)_p|Xj594IVf;j$c%VpjG$twpsNjzOPj~v|q+XjJR)?*F11Z{(A zZrZTD&pH+PunB}q!&#Z#NdSNgdCVe2k(ptT}V&&fwJ7z$U5(G1Nw3F z@JL4;F|>}ds^Qth40GDprK7=QVw8nvjl;ml@_>rJ!`chBF+0J0|KMr1PW~#whmq}v zwUGqKh(L%8CPC7Zw-qj^e-X#0Bl89sytfC~ELH`7ZkT`1DZ4(t4nhl7oy+}n+# z>8_WL7e|(~K)Kc*dsT+gvJEtaF>G-#F_F;psaI8jBpOCef)lB2OQGgoVKOMP&p=d; zSj+W7yo;j`l8Q(TL#Sgr#i_@u?x_qHdKw1@A=?ZqFSszEvHhWC>OqzYGG8b zP*Sdf$xjPdFw)YO%D8lW6k*$1Vo^6RN#XmN+>F(QsXb>hC7x_ALZdK%^fgKUb5ogW zQzC14Oy(eh=J;Vsd|kepee)POvpWMhc0iWOw_?=_Q?QgXV$6fRAZaXeeBS1uNoTYG zzDe@AV*PFWZ%xKlZX{RnxiX5*=Uwcd! zL+x_hkJmHeas_{Xy$GJX1urGn3Sq&HXA(=f5@xN=(wGP*;tdQ3zamcQTqDi7yXDI8 zCb`zg05iLFUpETYpo>y2IS2>muw4?i5jC|d$VaOkOauQ65-qNa0GWQWd9?K$TN%ELe>BiI$)xeb0+_FObhv?k$-^L(}|Uh0lP@ZPJi zYK5>WX5u*x1~cE~Q1-w_{RHLEwg6~JBy;-Y>}Yu4eS!cmT=!4k#dNSfAP}oGIX7^X ziB8#y&^Tl&ezEF8OQWMlpMdG2m)K)8v>OJ~snJLREA|j=+jc%D%Kcg8QQs8`CKmiUmECrm z&5Cw*Z2*VS4|D8{4CLY`WT{Hm z4u7nMBktDg@TA0e3vzf^6(0ppWR^=cDOgwM{T!n#p*gjD?!&_suZY|2Ljs}}Wsg(8 zvYz23@^~{}SBy|2t9)83eMBFXwJ%hl56X1sP)^W}b2iGS!cof)z#G_95N3}CwXt9O ztI}mal*>U#8TsfTD61rS=Tr5Kb_^&kaJOdF=u+s1gpp#}yXUbEy)mqC;dNF6$pt<} zh|KOMR}CMT8*s`Ek$Y1c^$&}!OT_o)mL+{ZMaej4&R|NA1r(8r{BSESuj z%bpW(M~z=2NO*_--`%REREpuJ5~(l1^!SgwK>k>j{a$G$O@8!Wwn&2}eQoos(;ThO zKB`&o^(Y8L#e;H#p{o#);ewa*5Axwu90m^KuPfRIQXpMVK!QnoYdk-l3_FzZo0_oM zEvH}(yjoZoD8)iY`wxT8L!IJ9rp?#`JBiRuaIme+ZPg{5a3O-+pm>E z7@xtTHTKnFNe81yw9jRlt6X&%TlO;rgQ~S@=R1US`8)DL@W2T}(W5l53HwV>8IJI3 zS2rRq#0ES8omp$@3NzT1dZ>C8>(+p8$AU|BL&-E!op`VX<;ksR>6Xro%W>jxE;Ng> zlZ|ehqNy;GXwqF~ZzPtYZ!|bI0;WSk+|e^*H3<>#1!iHP`j#J-OVv$lmAI=-_=-5Q zu}-cAm0Shc;|TL+F%aT^+}-rVH2Ez)0bvGQ>USaX$pu$m&=wE#&Trw9)HnIh<$vgH zTR1nFfi1FNUYfQL!xbm+)&r5LD%bU0bN(2izoyn4VaeVG_q}ME8*kDbp?D()j5NwX zRAYO%(z?sI=|d?ET9*^;XAHc{FVM*t3pQ9C+SdU_SO&Lg9Sq$3zQXHh+$yisp(UEN z=ack|RS`ZmfIUgR?t>}=rRq8wBvkY)bl9-;NIw1-gDWF2W^B4-fj1D;Z{HlXZ-HOZ4!T zZf@`9g3(;7KqZD;I&e7VQ;H%TGqdcPR5e#j>_t4|5`-O0Z;@8SDLvQglbS?Wb39!= zMihL0;GFN=1ff#|OIpA(Q8zDiEb7`TZ4&`~y%?|&`Tywae2&^Sf2xE2GMknu08~L` z5xDCC8XXQ*s97GXkUEG>C@{?Z1u#hT#IKU4m^wV`4^+|Xo3{>UB1KN1?>FG31jC8n zc>%O|)#6nrl7-eYMn;B`Z1Wwr4j=C?9w5D(OUa_TU%ld}J~igg$wrOzXT6zHji zKm|l5FcZ@i=x7Q>6ROyzNF7c|#OpGIC8&>+Gl5ks7-Si!`S+f1pC&ZXb(9(Fo8-!11WI;dqESg4#j zF>vpw6lK2guZ^ft9-|Lpj{O2CIkto6^TEn7sJWveME+tOR70soFP25)w)Mm4o5YDZS ztKqax{tGl`w1e`yd3&-2NoT6V=Pmo4I2wz=$m&9kxwMaiaooG#%&rR4(oMN=3c|** zKNL6`f_2&Sc-yJIPYW-WM)q5OUN8f7m? zIyYRctk4EywjeWayt}|YE(7Fy$2>B|Dd&6c50Ik!5apLuIYnX+bwO-udlNJccA?%D zV6zL%8x6cO1e?U}A4jMVIRh0u1dE&qFZ-+A-uR0ME@F9GQG z^nbf*0PM5v&Gjwpgq(Es|0RL@r+GbkSR9ld#b4%@G3RrgsyWqO=V7e^cPCFIk`lUs;YxM3uiIR@T zcJ^(b0&bt%EKeEyB6L|qmj`)kM2E-#FnY{#SH`7 zI)rJ*eyiOHl;`|HeTZj1L9Pi55k(l-{r)gDiNWW4>{{>?3E2{>z0_hxMnzxL5o!~h z?(*SC#or~}%vjN9s$`2@_pV@4(SQmv&nWKA{rP+HeeQOGM(>q&>%cQ2xZaZJ&wh5;?I0GNna z|F%{Bw21ui(FIsatbP?Xi&OZQYO9CE?6@okhNavwxF8(1rM?#d9Ac^t8aiDP;fXHh zF!iqLghO}68vI)5$97Sj>-|Wg^aU2%O7S%TSHRwneYEkarPj0D;{oD*dqf!1mfrcP z68shkbw5HCxi0h|lBT$FboBZiil&(I#<4xL5HvQDCZnA>M*NyN1F_AGJ4BTp{vMn= zYS)BgN;v4!O(||-E@t5z^YG#`2qX}zTa+~gP zUB820#`Y8p!;aE1gc?#ErsB~Y5?}m63Kh2b>b)G&G9~#MuKngPKfPH`0JU+sW}W(y z&8tziaZcUH9s-oGRqie)^%*vcPgzz+jSUV}nKp0&vUxdZk(RKO8X8wV1Wbj1Pz^O~ zdHdy<`b82gZ48S@%VfKJueW@@e8!^++56+Kl!ipYdp?iDY?sT$(&~D*S++89xu4sk z5FW?pECC(Js~VR_rM?S1_5}m>JwIF*ckm~Si39S|<^s#$rIg*dPwS7VEgwoHv<5zb zHKfvE2Dl@8{Z5W@INZg6@4Y~jB+IZ;t2Q}Up2cNT~97Xk~Z|Jo|u|(nGJk_$d zd_~GVJ1!TUyL}>4LFpWHP=dj6Ug!GT*;iFzMjd#(*Q`g1*MwB1@> z;_>u+gs=*F0}8#rGsle35dn-l8h6F-%#Q1f3yv!k;M8-WuA(2bby@(Yx^!d}FdgvY zBv!j(SZL715n7DZZDB86wNv2^x^Q6h&?{@|*k6~UbI-2P*ioZq22WJ`TlL|UOZ=>? zp8X2vHouLm!Cb@8#pkDtqa9MgIK>im5|$;rH*kH8y-D^KNg9K;L-i=x%7ct^&6k+< z`t0}tqM;->6V-J=KILK)rf;XYsr$nL{w=FM+NPTALmexS^eC-6pW-k}Dg1x1d)JX0 z>(ObtS2=%dYGWO%>a!}@` zzeef8{NuD(XS;d8ko|0&AoQJBBAe(s-fPSd)2ITI)><4)Y)opoMQ-T7zKnJA4%mYaXwF-o2uMW5%coztRNCf z3}-QmHDjp=vnVzI-SJ7II2wgRYGF~;lJ)^B3x(`2Nr)y>=Zuuerf1&?E52#IfsKwt z4@yT7e`DnT!P;+b8S3O{5{62T&l$RO(&J5`JjS*(C52_$a%Fq7jErBloRe4Jr;?Fq zXf_tIZHzvi&d z;xyIFGmH=b|2#;jjm4?}fXhA*;FKKjcVG|{AVBQ^&@gUq{sj#fHUBCA53d(RN=TlM zMod~5pt||rx6RypU;Na1kq7*KKI(J%DGm0Y+obrU#e{|A6Q$G?dI z28v%wGT{2BhRomH0WgdHQriB!<4@I@zq|40dw4FpfXiRxYW~bP@E7L!$3WmdC?KFu zfV+R{Ha-^|z)I;i07^F6R#y5pLQeX+_Ww~8eOayTeP!EX0Mr8DNAwH{xT1jhEvlFx zKsCqAQd{qjh1N?vooi#N9l-hk>-8Vr5YLdvfY8M`?uWQOHAFl z!(?j!CIZ|aO7YK_Jb>Q)8%)4r(9GTzpsXrvY^KkrtE+EoE2V9rZTP-QFo@{>i@^-{w+t_RVMPH+CH`kK zq?KS?PXU^N1(3huzq^Vg;IF@F27tt^owk`7@t*>sFKc_`qMC37sO>bMwm-AUJQpp% z`27tYzon(!PyIQopNT#Jd)jA##+T4WK6(Z@0K93y@69tV;41m;Z=wJ5s{cn_^PK6L z6aj4q1o*K3oK2sL2kmbGB`ppAXLnn=U7^4LD8MfRIv3$H65t9EU?Tm^ga5mBzaMfC z=J?6DfJtE=@YV?a3(g2IJN^dl&vyAe+RLP?&wyPYev2mZ`xLA%o8)DRt7qIYjlaSD zUBauE&@a;xJwwZD{TBMqnejJCie5s$%nI`iO{e>xZ|a{j_HVzdzXJaBnfwXxvmgB| zfN}Ioi39-t(pW$BX~PNCcl?;f2oW6%mQNn7nc7ImE4y+FSS~qd1f5`!t+aK zda)&X3Hwr_^cj}L=`XPV-f{gCmEV^{FC_(^iH_X#O|CgitOXQdC!q3RYIsZ5E?;HB1tI{(jU&&uE z|N2_~#&PLo?O(ctJTnQD{{yDKaS(aQ^zz{NnJKXPA29u&v*61U#Ap2F+JAumcjt*O zALZo%&NJ25`hQII`{SIKR4)zZ&s42Ve@FE{%;+!SUs`~l;pJNX4*t*a_j`NrOOlsH zv}Y3gFMlEV_XPh-ul_&gke7y$XLz8_|19bLmzm_>b^W(dZgeiU?c<>M2Z3b7YOM80USuVL;wH) literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..0eb9142 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 09 23:06:52 EDT 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4453cce --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..74fc652 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include 'desktop', 'core' \ No newline at end of file