From def72f84b240d46190b04313e94078b9b16cad9f Mon Sep 17 00:00:00 2001 From: = <=> Date: Mon, 14 Nov 2016 15:32:39 +0100 Subject: [PATCH] First implement of Worlds --- app/app.iml | 16 ++-- .../com/example/julian/endlessroll/R.java | 13 +-- .../assets/debug/levelpacks/Grasslands.xml | 3 +- .../assets/debug/levelpacks/Testcave.xml | 3 +- .../blame/res/debug/single/anim.json | 4 + .../blame/res/debug/single/layout.json | 8 +- .../incremental/mergeDebugAssets/merger.xml | 2 +- .../mergeDebugResources/merger.xml | 2 +- .../res/merged/debug/layout/worlds.xml | 3 +- .../intermediates/res/resources-debug.ap_ | Bin 1351352 -> 1351800 bytes app/build/intermediates/symbols/debug/R.txt | 13 +-- app/src/main/assets/levelpacks/Grasslands.xml | 3 +- app/src/main/assets/levelpacks/Testcave.xml | 3 +- .../endlessroll/entities/Background.java | 15 +++- .../julian/endlessroll/entities/Obstacle.java | 6 +- .../julian/endlessroll/entities/Player.java | 2 +- .../entities/textures/TexturePack.java | 16 ++-- .../entities/tileLists/Ceiling.java | 5 +- .../entities/tileLists/Terrain.java | 5 +- .../entities/tileLists/TileList.java | 9 +- .../endlessroll/levels/LevelManager.java | 10 +-- .../julian/endlessroll/levels/LevelPack.java | 21 ++--- .../endlessroll/levels/worlds/World.java | 77 ++++++++++++++++++ .../endlessroll/main/DataStorageHandler.java | 2 +- .../julian/endlessroll/main/game/Game.java | 10 ++- .../endlessroll/main/game/GameScene.java | 20 +++-- .../julian/endlessroll/main/game/Physics.java | 2 + .../julian/endlessroll/main/game/Scene.java | 7 +- .../endlessroll/main/game/StartScene.java | 3 +- .../endlessroll/main/screens/StartScreen.java | 1 + .../rendering/renderer/GameRenderer.java | 4 +- .../endlessroll/sqlDatabase/MyDatabase.java | 10 +-- .../endlessroll/views/ToolButtonBar.java | 51 ++++++++++-- .../julian/endlessroll/views/ViewManager.java | 2 +- .../julian/endlessroll/views/WorldButton.java | 11 ++- app/src/main/res/anim/fade_out.xml | 8 ++ app/src/main/res/layout/worlds.xml | 3 +- particlelab/particlelab.iml | 16 ++-- 38 files changed, 274 insertions(+), 115 deletions(-) create mode 100644 app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java create mode 100644 app/src/main/res/anim/fade_out.xml diff --git a/app/app.iml b/app/app.iml index 7e28fff..a90aae5 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + diff --git a/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java b/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java index f79f6d5..c54a123 100644 --- a/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java +++ b/app/build/generated/source/r/debug/com/example/julian/endlessroll/R.java @@ -22,12 +22,13 @@ public final class R { public static final int countdown=0x7f05000a; public static final int decrease=0x7f05000b; public static final int fade_in=0x7f05000c; - public static final int rotate=0x7f05000d; - public static final int scale_up=0x7f05000e; - public static final int shrink=0x7f05000f; - public static final int slide_in_left=0x7f050010; - public static final int slide_in_right=0x7f050011; - public static final int slide_in_top=0x7f050012; + public static final int fade_out=0x7f05000d; + public static final int rotate=0x7f05000e; + public static final int scale_up=0x7f05000f; + public static final int shrink=0x7f050010; + public static final int slide_in_left=0x7f050011; + public static final int slide_in_right=0x7f050012; + public static final int slide_in_top=0x7f050013; } public static final class attr { /**

Must be a reference to another resource, in the form "@[+][package:]type:name" diff --git a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml index fc1fd33..bfdcc0b 100644 --- a/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml +++ b/app/build/intermediates/assets/debug/levelpacks/Grasslands.xml @@ -1,4 +1,5 @@ - + + GRASSLANDS diff --git a/app/build/intermediates/assets/debug/levelpacks/Testcave.xml b/app/build/intermediates/assets/debug/levelpacks/Testcave.xml index 34902b7..b708464 100644 --- a/app/build/intermediates/assets/debug/levelpacks/Testcave.xml +++ b/app/build/intermediates/assets/debug/levelpacks/Testcave.xml @@ -1,4 +1,5 @@ - + + TESTCAVE diff --git a/app/build/intermediates/blame/res/debug/single/anim.json b/app/build/intermediates/blame/res/debug/single/anim.json index e1a60fd..78f37b2 100644 --- a/app/build/intermediates/blame/res/debug/single/anim.json +++ b/app/build/intermediates/blame/res/debug/single/anim.json @@ -47,6 +47,10 @@ "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\anim\\abc_grow_fade_in_from_bottom.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\anim\\abc_grow_fade_in_from_bottom.xml" }, + { + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\anim\\fade_out.xml", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\anim\\fade_out.xml" + }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\anim\\shrink.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\anim\\shrink.xml" diff --git a/app/build/intermediates/blame/res/debug/single/layout.json b/app/build/intermediates/blame/res/debug/single/layout.json index 6dbb5b3..93c411c 100644 --- a/app/build/intermediates/blame/res/debug/single/layout.json +++ b/app/build/intermediates/blame/res/debug/single/layout.json @@ -7,14 +7,14 @@ "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\layout\\toolshop.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\layout\\toolshop.xml" }, - { - "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\layout\\worlds.xml", - "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\layout\\worlds.xml" - }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\layout\\abc_screen_simple_overlay_action_mode.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\layout\\abc_screen_simple_overlay_action_mode.xml" }, + { + "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\layout\\worlds.xml", + "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\src\\main\\res\\layout\\worlds.xml" + }, { "merged": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\res\\merged\\debug\\layout\\abc_screen_simple.xml", "source": "C:\\Users\\Julian\\AndroidStudioProjects\\EndlessRoll\\app\\build\\intermediates\\exploded-aar\\com.android.support\\appcompat-v7\\23.1.1\\res\\layout\\abc_screen_simple.xml" diff --git a/app/build/intermediates/incremental/mergeDebugAssets/merger.xml b/app/build/intermediates/incremental/mergeDebugAssets/merger.xml index 5ad049f..513b438 100644 --- a/app/build/intermediates/incremental/mergeDebugAssets/merger.xml +++ b/app/build/intermediates/incremental/mergeDebugAssets/merger.xml @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/build/intermediates/incremental/mergeDebugResources/merger.xml b/app/build/intermediates/incremental/mergeDebugResources/merger.xml index b001cfa..b88a02a 100644 --- a/app/build/intermediates/incremental/mergeDebugResources/merger.xml +++ b/app/build/intermediates/incremental/mergeDebugResources/merger.xml @@ -1359,4 +1359,4 @@ 2 2 2 - \ No newline at end of file + \ No newline at end of file diff --git a/app/build/intermediates/res/merged/debug/layout/worlds.xml b/app/build/intermediates/res/merged/debug/layout/worlds.xml index ee19fb2..1dafdbe 100644 --- a/app/build/intermediates/res/merged/debug/layout/worlds.xml +++ b/app/build/intermediates/res/merged/debug/layout/worlds.xml @@ -16,7 +16,8 @@ android:layout_height="match_parent" android:layout_below="@+id/worlds_topbar" android:layout_centerHorizontal="true" - android:layout_margin="10dp" > + android:layout_marginTop="10dp" + android:layout_marginBottom="10dp"> jXh z1PGl#2mwM5z5U*qc|U2w?w)whp8acoobyQY-207Y^v<2pXe5i>2jX6T8<(bjEqgMT z#b!xq88EE(wlwGMcHHl{V-K|I6EBkm8xyILAGbQtRb$l3dn-~{Ef&mU2~W(DDs;!I z6d8;fXR26ZqOt$?#zaIwCSxKtO-5s)RUli22Zb3e3xls16GK8q858fEVOF=ctng&^ z?GLc1pRv5OxbN4ge{_8BZoQ&A$9L@1Heuj^0z-QBY(1k;-J=E5k6+q1+rGF7{#g!x zd%VfI7b)A1zMgDDjT)8Xs!hK%EMWSPBYy4fO}n|L-<+ATZ~wWn^h0>dinp^{MzvCV+}5RU-A@IdZF7C!^nK+odd&Nx)wypw{axr)#o}Ri2K@A6 zgSr8G?$lW24xFCt>FtICo-Msy=33J_ryn0!aPiZ&)bR|wJS{ft zehj31iL+*G{&|1tWVD=13@~PmxOApL1I$|6Zm|@>tSOF zS57eINWa=@TUYb=2*#@|*BjB?l=$N|4I)Sotp>kw)8*DnzV%`wBZyWo7lZxm3@QuHXqr(xwIh zAdTlp+Q26IqC8=tf%}Z9OX&lh`kHwjXAJzhtF{!+?6H9tQ|VJZrv?6F)ODB<_`;ZK zIVn_X>9A>mNS`_%sXp8$g@R@#`@l;zGxXI{!wK_1^X!BnmnA4bw z*%Ua>m^!&NaH>()a!24cV`)L(1gd@KLWcOQ@`B_Tx-=ID_6Tw-CAIe8SZC1)~Fe-Aoaychreh4 z-N25<@){kA8<7)ZFTG7wxQ*p$HJ-Tp@}#Ce2>jiqAIsNYZT}z&h57J+dDPR#ff>}b znJ%Yiy4?80YQ_DsmVb>vy6E&JAw`wQ#V6`t{T0E z(gs~NrWU6U>SR1}vhbkRMq9_sLCTopV}v})>?}bmjkc26g02};8FB<&H>Td^3~Fx7 z+ayoWZez-kFKDFEJ3D_+Z)3_H9dyf>`m3O{H7^_#Y0NRaNRV+H@)Rl-RL)qdekFtc zG^SdX4dNK>6C1S4uD`tbw<@&Z72@xTu^}&SJ>!SsbuD^uLcg9J`)e<6(`LseI18me z-u7Zew$^P*M>RU+t%5~_-`BCzssGCZBEa+9sJ9xd~?&M|1Ey3wevw+ z#Hi6hqmDJTq{{O2Zr|GtuV$+>;_Z)j?|u_;Xv@Q>Z*sdgISO4~{c7skdYgZbUDc_j zz4XnDyRDDLR4YHW;ggKREfI&CK1nk?#i0t$HZ3D#htu+USP{ z-Pc~r{OontmFM%-TN^hkRj;1AGn7eO@jmm#ti>mE-(Do+P!ufdv2lbwJVIO((KfB#j1cMtvf{=pLW`RDFh*FL@fwDC#w&dYHvqhJ12A@%4NSJqsvasK>`Ja^)s z59<(p;#~B;_Zi!a3|&|B$^CInx;*^u@&*4*2bW*3x-M|hq5}`|w(0$#Kz7eUbtOmi zjK+80JQ{Pi+q+wfchwq}?(O-rCDXpGd+)>6*=_cF+!OLv2?D{Myj2{IviguY*>=ls zeNNdd8iB?cQNqA}9Xj|EtW!{GnfUA`&-^;z+~_Puw=pZ zFP;U13ycQGL7J=P8^K>7XAZ0!*Z}?j;W@F*!9cJW z90Rso7$0CH*ar@Rleye@HkkMuJO^*UN025r(ge9dQBVoQfq2jz3u_zUxUryTW}U!0r$W^z+M1*N&#&D9GJ)lih)|7 z3Frt005_NeR)Y0l3)lyK1UJDQ@CdvG_GqL9vVlUNB4`MjgPveCm}oeKfZJ zc}&~|&w!<%#gY=F0}-GQr~s;i7N9E_2*!YEAQ5Z@$G~Nfq7ZgtP!6;M1He*n2wVd1 zL3Cm4DWEp!>Bh|*umWrXKY-id8ORZX6#!L18!#NK1DAlM2;u`VpbF>*W`fONKR605 zfSceMNM01XAIJjofzqG`aJRxuPcR5f0`tI9a2i;Op%C-{6To(G8oUNYietqB`|hCAy5U>0o_0!FdR$=i@_%FO9^cMKQQqDM3lr#pdx4ox`Gj40$2<-fbYNs za35GpApwvL6bH3IYtR>r1{1*yFdrNOH^4iPqO`@55#$EdOJn;t!^AMK0PF#0z+(_p z1_u&Q4zvWLfd^a!_d#%3Y$6Z~I)Q0m75En10Kw((!Uk%9fnW+)2v&fN;2`+Pjhk!W z9Y__6g@W9mENB8cg8sk_=74qJ0JsYN0B?Y!JYM%f9#9Ze1@%BY=nsa28DJ6E0*-*6 z!ENAvg_~p*aFhZWL2ghI)CHZvP%swE0!zR;a0r|Pm%$y7tRjvXpa7^0;z2j?1(*$1 zgT3H8a1vYvFMz8Owtr+LY;({6v;zrXBKQg%1-HOE5LOvyE}$0Z4u*nxU=`Q~j(`i` z5AX=Q0ja8B6M(#+7$^tgKvysnOsL|ctK`R0F(pOKz+~} z^a6vx7%&%jz)#=?cn;nHS2YZ7Py#dn@n8TL2Nt_=vjH3hXTWuEAAAG>)v;Yc2~Zg{ z2mQe)uoUb8$H6V|4+yG(F#rmKs-O-S4Q7FD;4nB2E`V#`IdEHRV%vi#Py|#54M86; z7R&^z!2xg@Tm(;nwU)&a2r_~EAQsdET|s{^4om|}z((*b_!Yba_S%>a#MH+2uZoHG zU=&yhPJ?T}RtF~|ARDL*T7d!J3or$I1-5{1!8!0dcmeEnksL@1qChE7A2b72|9z`U<{ZIzINkgEBFyy1b>0oAWZ}8QXnrV2FilEARY_=ZZHpQ1V_N{;57(} z!$Ao|gVLY{=nB37( z=fQmt&U1Rn4UxCYWR!R`in zfhk}<*b6RzJK!boZ;I0^5Dm(JYM>S93x07`>8pb_W{hJdkPI#>wSgWceJa0dJiUb%7O z-@;;v1Vunu&=B+nlflmwH3C1D%_+6SwK-x0W=3g!8kAjtOt9*58yFK*BW~UC<2-RH&_jJgG(S)8>9)U zfPTOY)_{w^))u=oXa)wi#r9v0iF+V#I~-EMW^e%90>SY(bb>hG22;Uuun+tO?t_=W z-X3EGgo8YwG^h`ngLYsDm;|2G_tx z;OvBx6i^2=106sg;08;<7H|Xn4N`W-xBzuQXD|WG2m8Pykh}}Vn;SQEL1(Z48~}fS zPat(y9LqsD&>JiQ-+_A|q8lC@R046J1?UC_gHd1xSOV67UEmNn2d;vrz|tL?3Aoea zCKreSt-*NU0at;m2VO`(UoZ(Q0z1Jykh&*MHb6Tt5iA3Hz$NfENZkv26(|Opf#F~- z*a1#~2jF8bY=38OY%|ahbOB?*B5)9V2Yv-tz+(`QfI}*X10%t5um{`#4?%Dr9Q{Bv zs0~_!!C*X?2fhXy!2xgq-0g$y{}>YieKD#*6o>(pK|?SQ%mrJ)QE&si18MtVr9mms z1`G#_!FF&ITmz~5W1N6iU>Z0Eu7QdJu&aXU;Dj4D*T8+?8i=D8SO>lb)%IX39^FXpekq#I)Ywc444HDfWLv?5G)V4^W&xxXsZd>2(Ex+ zL-8IT#DI#RF6a*WgDGGuI1QeFpf7Ni3kHD2;1ozV49^_&1&LrexB&hF_TjkJ1j-J_ z_V0~}N#G1fH3A8MPGAIB4t@r%kvQ)I9l=^~8~ACvE?5M<1=m5yD2ySn44eQj!6(pk zG?D~ggG1mGaE!qw9D|uUV`2q34Qyj^Rs))XS>OloD@Z>MNq`Yx71#^Tf`_2&c)ZGi z>EI*?{}Klv&>9Q^%fV0J0&q;gyJQdt`U2&~%}?NO;5QM^6l4SSKs=ZU)`7F&Dfj>) zCgIQuT7rq-7`P2SfRvN*x&WdI0a|az+DJ8v7iH32o8dGAm3D^ z0LFkH!2=L54ci&?02{$&@ClThj%2|1;8*YjB%6U10a2hds0rdgPcR6K1@mTL`>(;o ze((dh4_<=gGqEp&3?M(K3fh9MU?3O|7J$uQ7dQe=fveyycmm#lfLYj8K@=zg%7ccW z1LzHg&BFGdj)~Ra5V!ztfj1!IY>ZM+1e5~}Ku<6fOb1_qm0%w@0WO03-~&jNh;0pW zfM`$=Gyq+}U@#KQ0;}D)*#}O7i{KV`2~y9&nuE+B3X})+Kr7H4i~!TYc5nz>0dGLc zxj2^qRX{xG2gZTrU^}=5-hq_!uzQ2jQQ8e?3_5}SU>ukRmH`hq4K9I);5A655UsK( z>q195YeDt?D@P|aXMrPF^%{xK%~~&TB-jcRP)|dG3aH<|azrZILPuKleu1N@y0gU* zlzKp?{sRj1>D|SWBZtZt8kj>ZT8jBR901%ID*vkMUHTFbr=@b?<+?iTb?{B^DI|7{bM$lC2d;m8x8!(r)Q@@ zoqG0H>sL4msuDXK0c!nHheM5DiJJ#298YYybE~f|1%_)M90sVfOC8zOm?e&uwx}qz zO}V1f)g_K*4yV)ffL-EybyCqw9nDqF<&L5%dXb~HEjn5`zII@h9YGGerEpCHkj%PRl%nN zood2z$8B3ojJA3)s@)PtR&{WdBc0l`-jSewUF&cvcV9f^h*gfIIfH|>73>#381(8> zU~v2(hVZYib*M9|u<#VC92vBD>#uf%s;aB;V1KN36td;ZrsrSLm3EDzuq}Un?|iA$r?nw|%Du*sM|*^y zo4Il(w#%MUZCK}ctfp^raf8LlZF>G@N zRYsd(<6?}m_VGP?>Z2@ECY93PmdS3xb4=Kb?&1AiY1Gcu7!lRhILa#j&5r7-*Jj5Q z6}QX1ncw-Z zhZ&I2r+s`sH32K<`LM-N$f~CAz~Je;&GD@*Lk6{N5{65sZI0aP+pn>woZE)+@#A*f z9Npo_p&IXSlvD+_A$APlOe*JgM=AAjts}V#+JQBByxmblP2J!K@cgsG(Pp@{qo-lP z5U16eO?4?0a@27ZuPfP-S&V;Hyn1>{7Y+$a?(UiuFF;^87!T%x)!-X&5m>U}+!Mrs zp)E$(N6o!|-xh{9PKXb-dt z<$J)*C>-|v^5P5{GzQw0@R?u>xB|2b;bHl3*az*wD6k4>7rvi@u>9x)O~4qi1ZWqz zAA|4$IEMjUzyz=c`~V(+z-YXE0FB(Z83eQo(%Qx7b3nWP>@0}bK?Bei%mF*WdGHdX zD};W~3XBC?!4+UHj0Xnoz;tjB{0;nL@FYQfFa#_HCxH7VZr%Y`5uDh7reGr21TKSj zAZt;)G=LUh4A=s$0smrng9PG1A~*sbf!xLMjtfix`@mz6tprj66TlAe7f4wW+rL0b z!~lkaRp2yu1tLq~90MePjo=;#E{*r5pa)n2j)A{HNEwV3Fa{h0??9=tI7I-Pz!eZu z&bR_Q823BC0}vUD?O!|=D*zI}EU+D12Fc1JGSCo=0b9Wt@CM|qfG9yfupFERwu-p^ z0Gfd5;2`)DgjT|d70|9}P6k`SS?~cwxGSR*v;|YaL2whKsDkqaP!se3%fNnc4J50I z!39czreFvd3%&+N!5xsg8de^(1QWr2@B*Z-jyJoYBbWl*yKr+81lGVd2F-zXt#Bpy z1-t-3HL**9`d~0v15SX4AZ;z|0U#b|m-&u>Cm?feoTq@nU={ckyar))u&F>-Ft!f1 z|4K}J2krv@x>#!v2L^$K;2`)N*yqYKr-62bEjNe*{lE(F3wQ>?8eqjhH!vCO z0DpiCao9v)A~+J~##&*bSVI(ol|Z|g^%3N6gv|nGfxX}<$k7;YV!=eP5bOrpHL52d zqzO(DL2b|v%mTZ>b&$L%&fY+E5D&(I<=`hbZtj8P&2ZoXbwEF$fCu~z{F~!hf_h*u zm<4u$+rZfZdjx0<`hi8@IQR!-YKikr&>egUv`augfTtj9E37DRkHpP7a22FzjX?$4 zftlbCcmUG3!I?K00KNi0fCnJ7EyfH;0JFhna1Q(f9PO}YfhJ%eSPJ%o%fJ?ol>;T> zvHe?NVlvnYv`ab9L1cT3eo!5B1z&>Y;0N$GNY%l(Y*Q8Yt-(OB02~CDzzY!B5zi0| z0?WWr@F(~H(sn`uAi9$qy8|XVf@xqQI0^0oduN>XgQ`F-+swf9T5uR#2G2o27c2}E z0o6cDkO0O41$Kh7;6AW-#ij&x!2qzxjhhuDfdLIVf<&NQsks3D20=Y>mBt zgG~nVYnOd0Vxk^s1$uyCUgXDd2+y;d~HP9OL0mHylun4RN`@mUn zAAA65`e8hQBA^;*1$w%1GYm`s+I6Fi;4ruV9)mX^Rev1$Kxt4LGy*L_H_#Uh1*5a_oP9Y~7d7kbG`6jCad#xoU_{F%lcT%3KA#JsfVD#o&Y_3ngO>aPdLdU^HuYXF{ zM!NQ}ujte1ujw=B@8}ch?~Qx6eKs3Dv0yIU&#FJL9ZyqVKyo^st?nu5U(mHLgkeSO z!|18$Bj{=9h*+OLM0dBvK8_6m#=U(!-N_lgq`T-7=-QXVwFOq8r=zE(htkv0)6+xg z88pZ4V^7b9j4a4N52I(KhttF8ndss4%=Aq32)c_NNspjsfxES55XpwDEXYF7M$bym zPR~ZqLC;RtzSOHdUJiOLdQN(7x<5US6^Acv2DIzjMEkO@<~Dj>x}Bbno{XNK?nf^` zPfm}fr=S<4V;TDL3R{uCwm`Vv5W|Ah^dfYQ4NFma8uk~X2hxkvgXksb!Ss@J2fb8v zHiWRDG~G!rL(fbvOD{t&M=$HScrzr%=GemaUyXbFHc!~?kZd;Vc2Ddb+`Esl|1A4i zXE{ed$o`A;UG(4RKhZDIf23cg|3JS&|DJx;xOdx+v*88{zN7y^KT5wtKSKYLewcoj z{w@74`XTx~`T_cV{T{pfel|Q{!9M!m^u6?l^gZ-P^xgEwbPxR*{Tupo`tS6Aw0jIU z`w2F@V8KoLOFEOWyrExb|6BSs`Ug6rwS1&Adc2YtW1E}CVukCwJGY(1#sY3zeK*v0 z25x&xGWK8K0#ne>)BWijJC*=C$Cf3K&Q}~ukkwL7-`jrX0|c|+4BbILO)o@01-II& zTNpHd!S<0 zlg4zjhatt({f8kr)lN)VZyT+_k1+j*r`n^C2%EbSSF0jdt1`V3y)?Zty(+y5y&AnL zy*j-by#`&52{q|8jDEMh78`1EhT8O6^g{I7^gQ%B^t|-C^nCPs^!)Vt^a6D4FOyQ@ zI+pguK>aWo$AW_NhV)!&!qbolcMO}Gu(=4mDZLoI8NE1N`!2UO087$a&`Z%<(o4`= z(WB_C4R_mfv!M+O>d@QLE704~%hTiO<>>9{spuW(qv;*#irz_g9ApyN(3u6D>0Rg@ z=w0bW>D}lR>D}qE^d9uF^q%xF^j?~42boc9kQbzp^xm9dI6Z+rl-`Fvgx;5q$JDoc zKl%cCfBJm7_Emg8Z5z(>ta%>N(CS#s4tXYDc~ZX!iLtsjuwBOPM!JmMO>`L}Yv?it zHq&L3uBXc;TSAvjwu;V87H40<24kC9?91q~$-bt`CR<9EO|*_KPi(CUdKD7kSjpyr z3}(3}_7$FQ@K&_jY{8axxc399(2v25LbRjWZ(3w%ae?_3)u*EC%QQ&PGMJArQ}urn z678OXCarlGnHV;gB@{f&&j%Gp0IZzDXi`(^pEVHO6Lo^ zWg7hf`=`_O7iP50pucASO!_+Q3@j-7{lZE@@Py zOBxmEl153oq*0D8X_Tf*8kOjhMlr+x=f}1ZESB+8mM)Q$r_1;$PM7ghhAvr^qDxj) z=*%jsy&@YVtjcun_)+yTI3v}&WX`eP#Okm{5^G48#A?zdvD$P=ERHUT)u2mapYMhB zjDFu<*qAfO_-RC!V_5^bq*$FUDORIPiacSmNQ(8@FDcg5{r`L~ypY_q7q;d?B*m_D zNwEuEQfx_=6nPeAkrZ37Us7yCmvPt5a9@h;Ss*Dkr%Q@W=#pYHx}?~YE-AL6ONt%o zl44ukO|J;?ERY?y6J5q)XS#1J9*V?R+>z2W7W=VAQv9zolLXdFii7BqVsE;nIG8Re z_BFhw_gL1A1(M=Wx}?~XE-Ch)ON!l9kiRp!!az35jyi-c+4Q1IHht*6Y!duU2emKR zEwK!z%itPCm%%lXF0l-wODt3963aNc#A2LK;?kp>ZcJc-#KINvzEF;4zr-?vF0qWK z%ix+wm%%lLE`w{5?xtPz3l>O#JjM2&Zn)X+4bY;#j>h>$j{wu?;zmsJSsNGTJ@4hS z@$RGCdfu}(rsF;D<>n~mjgfgbx#jW6d3FTQu)j-qnYy|_AA@^T<;u_Y=klR3)A-9<>Lv9sahTKNOeM9bR z7D!gyvfiwgv0sMVI=T$GwR9PBOX)J?meXa(t=8Q%9=#t`Yx}^9GT~gd;xGL(vJFP?Plw;Q}x+J!rE{W}?CzyPD~A`r{(&;Iz(&kYgs^BO5V7`c-$+xyCgX$i8`zE+g$1x;I7@(F*4pp0uVEZ?Pt+DgMEFN%0|FQvCcy^)~w@ z#ixe*QoO?gN%1aSQoKi(6d%wf#Yc2W@d;g0{EIFr{;j*|2=|x;lHz^3r1&S@o1*dV zb9Sid2=@5}4Wx}^AuE-60OJ+<#W{4*7u0dIF-vd$Zp_Eu{}4UP)CKc81pb4vADPN`L`jLrym z3N}j|fpos)+XLv5#!#-6q!Ge?NkjV}*?e8dL6H3 zN=BD46-+n9G#YzmtuW_UZ&vA8lhmvtSTAELOyvqkR$19BS*52-RvGD%RXAO;%0`#0 zGSOw^xag8qW;(NKXiv)q$tnX~vWlcjR!+KP6-xJJ#TSEInM{YVTr5gzSlTcCn0LVZ zblCxm&}9cKOqUe18}8cyqgWs@#?U3koOFq?AYEe2O_vx8(PamWrb~)BbT=Kw@~}W+ z%tx0P^U_T*>hBHg5vCYRvM8xB7G=GRx$<<0u@YTktU{L<%NXv9u^bB|#>#Ywu{d2~ ztU#9-OVcIB5_E~NB3)uEtGnqnHI@YuV=21CSd8wCQQ`gjif(d%i(|J0Sc}d#ANGcH zzA3UdrAvT~=@MXFx&&BXUCDx-x+a??rY3ZWsWx3=YCxBms?sH<>U4>z8eL*)MCU#m zW3R^siKz}!`?#=2P=RLr6VvS_=UvIA3vR<-ku5L^~7Twq^W2yyR4sdPg zl2r$~WED@BtXk0}tB!QZsy&@q#o4>CLBeWBmjhg9x@4vO(wKJak*r$Ny;-RG;-<1(ISfx}-Re?oH7cas6^S$9eb8VXR4NiX&MsDUP5^ilgb0;v|)j z%Nb#vsAk};!_}u;&S=M%Y?deLR?)dl?;n@4Tb|=| zx*UOK)8z;>moCq7K3$&U61qIc1#}rHiwyUTlsPPrkurlWBV`s{Vp&L+SiYi5EQ{$9 z%S^h&lBm1sRCJnpkO!xtigl6`KYNRca*k^*hwE*uk+A;j5VVQ)64qL}gtbD2=EWgt z8Jp!0w1zH`tfxyP%jpuyR=Py8jxLdGp-UvI>5Qb3eFGch5VVpmJI`ji>^vLklGQ4k zeibKqKGS=gJ*-J;R{L2mS#76FRtM=ausn1bSceVw4XkfjASv#mONs~RlHzWg0!i@*T~gdZmlPlJO!ant(~^q6i}5rIB*v3;iSawS#P|bUV*HsdF@8^%7=NKlj6dmaI>kD}0*UbiU1B^& zml#*6rO~GMkQdpV)BvxrUIM(X78S%n`m)-GJNNJGl{9YCC5>xzN#i_S(zrpFG|tf_ zjSF;1;}+d}CiNQ|B#mF`lEziKq`}M73k#Wc&Bv^fNE-6}t{n59v0sk)cj*$z1GnFtexOT=Z|IWZd%C3fjxH%C(^tr}SAJrFq-fkDV8Ioc!T~Z9BONuEC|DS*DAPtKpF@L%w7DAWAg1OU3V#(PriQ$I^ z^p%s>)YNnameuZLgCrJ2m&6{bpyH+zwan~JYFLr1mmwEQm$1U=5>{Hegq6YYDDUTR z*;yb%E(=|T96mQJfg@xXnQsmT>$y(CwFF3A<9OL7J2l3WhMeLHIu3naOmbV*M8 zy=ZM5%h1b5m!X%JE|JF2CDPA#)@Z%obc<9U6+yNpf>O?+7#A^ZZ%Lv`>~}O;W=u z&Uy)}B3;5NMwhTE&?T(OhWo-Q$pQ(hC|$xTO_#7@=@M2Mx`b7hE@73Y%lIp$yXmy8 z3JYWamY~Z3tVI7T#Uo`*Db`_4Qd4ZmdPy;kE-8L~)>e!Cl43o>eLHJy7D$R*5$^}V z4b-Qy*jcNyOu}kFm#}KkC9JA+*;(t;C9Ar0$*Lw@vRZ{#4fD=At(%{_zqz_#p=}MQKt`l8$y6$wzsy|(_N}x+t19dm;blq4W18D$VQtV0h zrpWh7O)HvW9LFMw@xRW>hO%B_97dNI$I>N6H(g>JW4JHI#@tR4V3!o zfHpEE#vycx@e8`dIEXGWj?&!}<46`rjHBri<6yeP$T#kVE1Qm8Q&=M@eo2>i2UF=X z7$?&u#W{3IaTZ-tRCGykw&AKu6@2|-9y=wmM7kt4o-T>aq)TFx=#tnpx+FG%E(fp~ zbOx5yK9LQQ*mSxiHeWriVmd4Piro^{e+{`cte3D>(j}~AbP4Ngx`egRaNm$y!U7p` z%jpu}YPtltjxGVNrAvS-=n~*kx&*jbchitt!~z*|3+NKyD!K&7H>CHgImgwMBme*T zbv5-vb!TSxW-d$8+CY~h|9@RrThDq4>wojYT0{G1SJwWA3u_y>014~AFRZEH;`k=Z z_cct1xm|paq>j1$td}wO4PD0E4!VrFZFEU-pW(hSx03}j=C;yh%W7 zoVbj+?W~tE=h59X=Jv2aVmv^XF}H>O*_c~i%XFCgfBEluvi|qq^Qg9UOrKMpW}rzO za^JIFhTJi_47tN}8FDAou)4Sg{}Y>KV4YGM(Cj|SW*I-n=`w!4qs#dDfiC0cBwY^r zXXr9~zNO3XIYgJ?V?SuuuWz@gXBt1}Sd`RAeqp^ta+xlXZ05OwL~@D!vKRhpxbGDI zA`2v}YjoKQFDO+X;oV@fgmslJVO^n1SijLFtn+jU>nvTu`k5|aeg1y@S|ewOD&D|! z{CdPWlA7E-)=P2^=#t#;bV=?nx+HhUaNqIkF$*NQTXae830;m~x9Kwe{-#T$59t!= zUAjbiQ+LzFv->QNO#h@yrhm}AnHnGQIvbi&e8-xkrudTelHwb>r1+dJDL$o3iXRMD zIT|@LG|Z(f{%k3L=E6m*FoIb9-f&?N$!;l6>Ch6OT^Qqv_Cf4anyiY~DP(8kf4vnb#CnObFkNCSNS7F6=n`Xo!+kLpVS&V$i!L!1 zpi7K-=n|v$-_mJMKw^xhON{yG5@RvlEBU_E8N~vLF*jXeEKZjg<)vc3s`n`*RE=q2 zdU-9&S{a0&|9N#O_Dgyd=#t*&SIlDBFX@$|%Uc8Of7iv6cYFWLq$CR@y)tx3uOeO2 zD?yj^D$ymq@^neBDqUV@tLPr)`<_o}7I@RrzK-oX_%&vCQioej)=Oa3=@M8Ix(v4( zbP24X;lANkiv=>=>d+;yMsx|RK3xK9N|(T@(Iv13bP24k?&{~(PX9vn*e4?`jxHmu zHeIsQ-?c}our{XswG(TS8enVIOMqSI5@2(>1lWu&0k${X_b0$@Ss(#+RMpzzge{)U zl2aSHYsz7D$Y}=n`W$ zy2SWUed>-^+H>*FvEDC~jbx3aIGipAIX7KiX(!Mn#bIVY+Rb_i>l?a+wVf_u?V?Lqdkpstxveaau=dd`vGmjG|* zZW@OdSRetOqf3D2>D~a1FEPCBX*yf^|F7+8@8cw~|KYcqjH^i(dz*IL=S(%J5}3zx_8_e=XX2$m{NSjnxv-q59=kxH*`tSiXU*(wxp!^mi>~V&FI(v za=pRlf4Q#x`kOYhB=(UrOJc9-lGq2jB=$)~_rn)oU#fbzbG&D-@98J>Gaa|=Tv$?{ zc}mvHGY_K6Gk4JCnWv`9Gj|&9yBZ$I0vSIk=rVp%sT2KiYMh46@}!f~djC6@HhAuHC@!O4#+?-F+dZ=y;H65YKG0ddqRFd_QQ)#;7 zRF*C|m7+^d#SQo6RGtNrQ!HI_`me8Smtei*^j}}uE~D3*hTH${SGM`(pv%KdXI2fk z5=l+5GV3M9igZb_23=CDN0$_98SYE58Ve-Fx^zjgDqTifeY%XcN_0uF4qZlD1-k6C zwRJb8Sd#^^(^jF&PFtPs9frpF>8=r`6dST8sVO#Ly`q+6x-7!#df-zQjBMTq}Y}&DK?{jmf~!;DaEd=NotCn zST8C1@qi&I+Ub&_jV>v6H0JlE_`kbHci{?1iXG^ZVrROf`1z49nZ81%bJqXeJzBp^ zw4%Fw?dt#jONZ(?24BnS&F3Yfts7lN+y9+c2=C`oh3(zBKpAa4=`z}S&}Fpok5y`p zHI26am)}!n`|s}y@q^{u<4va~eHg3kpy~M@LN0fIejPUl`(+2sM3)^j16_8|&#&WV zG5UQwXlBkJ11}q023}6O9OlC4vV&%&%MKbzmmM@CT@G{EbvNyx37-wT2+kk_FPts| zj~^P?CpgD?zZ}``vlRd9I_@CWONt}?)XfRl3qSwig8{6QcL;sy64ns9g!Kho!Wu!B zu!hnlEH|BD#n}h4LDCvdmp2vt>9Us&qf1zW>AtWIO*DN+Z9KbWwEb63(^)S$jiSqF zn?{$>_NBTq$r({$9GfMkNpy*6DqUh4O_!J^sM3@1FjLqpVa%XQ7-Q)2!+J?z30)GHO_v1b)8z$mmf^nrZ2=1;o3H7T&0@M_GmkFWB+_LF zEv3u;wummFDcw!`+gujN5L!r=6lcl`+E=nbQrk@Tr4}>Y zxm4Yn?#zwj7yf)9aE7x?s!#Z*U2j^WD$Q^XcJQYrL!^1RI)P^EN>yp*|GXE?TJJ39 zV6}IKGe8}m4#pq9NG49=#t)I=X?K9ub z84AY4G}Inohxmd8Lp9$i^K<`Ez+Q2G;{o=G zCpUb*I1@Y|zSHPGD9&NP3ypr(57^*XzJD>hUNl35rHzWP5*^LL}Z%kSvEvdBs zImp7_Z}hWrh4>SZepYm9{rpKtYZlh?H!1zB_-iu#0r(@BepbGm@;4*B&fl2yKHv#? zM(K?OoD>f+{FLFz7A{y&PFsP~^xc`q>wZS+BaQ!Q%<{7|aE*WY%+HGBFI2S$JSWZ- z{#Bft=)5>L;RVC3X_&x8>Ceqk`kOS+FNyQdv@d_=SHxZF*nDTSJJ47!{wAfLEx_=b zEVE@boPX)>XUlIme-6^m#+{8n-{@!SWAyXqAN_0$n!n!YXG>@F^T!hX+%_i9pL6uX ze`%rz#h+vJvvCFa^N!wr{`#VyjeG9{V}-q2?r*wmxrd+mBg0E2J9V|TyyVI7cMCIucf}s z-AePFYVcBLtm+-(a;Y}=Lkg+a`ahK5cV`SzoEJ?ao|&uhCmVMQnFw zv%XP1&|-b7619$Z=qRsu_`Szu1${Eh2TU$7J=jP1B9mKH-W|?ZhYh=Jgz+C3>g!$4_|D0nAGsEOdg~hAav%8#?GilFD`=>oO7wWz= z)umMley+5tgvS|TO{Z#koMCA~Q4)ehVMQ&!sTpW;yuyF_h7F*zmsOqE?W|?Zrb72PbE(dIoGulI z8*2{LMQhllH7wU|u4^|xX*bFD;^vt)RY04{sNFQtZYtu&npZX5>&%rUAJ+V^>B;5) z%nPWcD6>YZ@3p&v>M`yz6++QO%%nZtxqP15!AX0bg;mTxtk9T!SWs`=Sc|B!Xs{Ml z8*t}W46`0rpY}P!QkB4*+8o8zJFTY#dVWy#_M@j5drGQW`<=ORltRx5(>j)hpE7wF z_%^j>KR&uLKb2Um*;G~@ZtkxDH$QAexcOl#!RMRi#~x={X!06x?Vq-r6){p!MGrVz zTWhMs1I`ZCTI!W{S6j6_h|O6?4L*nsSXUiA=kHY4Fi>ICMpHdfCMIb-uT zK|xLqR+%{km)#V7O-#?RnQHqjR=&9!hP$*a&>Ly>?e#6;UDS-j*soiuGvDIrwN_z= zone{UprbpVLLRHWBWTZ5U%$4h;bCVkN4w7+D_%`Ov$eh2q1|;*R}Le)jw<#Dj*^|! zz9Y^UYiIQscaAQYQ~qgBxT}geibZ!*Ztbq8I&l^zj2eo5N&!;bZtjYVq z$CqGZ&ZeF*KRI_Nvrbi|&p6Lmr+HHU>~#8Br>ltb&>8CSc_ckkmA-&goTU;jIFI_x z#=J{Zk4w&IYoh9M5gl{XqKnR^sk9%%)BgFXPY0aol;byNe(O9H`x~~TLRVYU3eHz! ze{&{S7pUjI;qe!$*h^U5MXJjsyy7fI?boK-ui(WHp7zk%C|IKQU2;yaE>)E-BdM>| z*vrld`j5s%n`T;$nF^YG1-y{SSHd%xT>B}8!Y0@LbT!80+TY3+F}e2Jbwz#dwyZ-# zF<*m4`<1%lCf@*0W^(OE<4TxZ`*A!!lWTtqd&K10uhtzkx%S7nCB2Tri}qK;rMwMR z%XWBalkb2hH@Wr$ZDmZZ{XSb+lkb9;Gr0#IYjW)e;!=pav0b#ExGOIWaN`%@e8-S| z=&xYv-w#h^@&oXSCf9!Au9C?Q!7H2mTX+?^e#ktGhN`B5Bk*b_KMFr%@?-GoCjSop zi^-3}Ync3d_)wE;zwI{3aJN1(e?&t~Q-Sv5ZM95(0$$tX+KE`CtI03G8<_kee1^%j zpI=L@Io|N-D{u)7Gff4T;j>MC1#UC>RkiOr&Iqod`IjO9g~TsiW~4bCcg=v zYx3XW^GtpVu1tO#zQp8zz?Yi*4%~FKaa;aGgZYK=F1)E}2JIKtnwk6_yt&D>UuJ4x_zIIhgAX_Pb9ft* zYrp7bJ{D`grnXZ0ae8BUiH3I40DlFKH@Ws}YpYEDM(w-l40FFlb6!*PJ9v7NzlV1) z`3LwKlWU*&uQj>$ab9ZEIfw-pbk>>rt?)Fyez!&YgtDWlK>Gxkje{1ppcnZ@3)4wO!Fs$J5BEA+3>`9+iFejneoi|*lJDTasPugx29AZ-Z;bjQlb1S zwdIX7)SlB`T*1~1>Vcmt7v7yaljAN-l}_#oD;aL8_85<3tz=1~ z59v&%zWqj@eidI^N@g_!kCG|ERPqgH&y8!7S_%HCkVK52LUDmINP z%$i!Y#GN|;#g9x2&kBEN@@()YCeIFkZ1NoNrzXz{e`)eu@E0b}4gbgIZc83CJohzN zqTsJgo)`Yc}Li2A`ekAKnY<_bSJN8xf)7@&a^SEwM0s+!N~cUf z%Q;l2gK1p_J>7G<{z-9W8wba?`04G(YGyoLUWc{vqb!WHX|Wpnav7oTX$El&>}{Y>`?bX(?s zbgxK1c<`XUT9xR93m4YCvaerXOch_h?o|z!T-=swY>@S=&KZuK7^Q#oU4uSxo<;YX ztoP^hu0>BxuWfjyx|t{G3#`NW>s2eRdtG{o!a3m>VD;FLH&+(DpgtWdpnC&4RzUYS z`imDYbZx;LR$tXR?bB)cga3KlG=7c`@1$zrTfbHlxZ zv;{pcpK(ii0eUNXZhC9OwV|ayej7Tr_I0S*51SD=3&7jJl`Tn9_)576FM zAEVWG@YP3X-qF{;L-S6){>hqm_Vq^=(;B+?3bJe7l^!1-uQHT&WpW=la6n&j4|Y6# z`c(Ix^sH&G-qB|4MbG<3g)5r(rU!-3(mjE0dG<;7KJ*&3YUtkA@Jwyn_SGN1pW*Is zdBFZGsB+oJar}>BH#>^bxv;S?u_1TVKFP7WAdN zJ+Wn6TdWxduzexh2htaLQj~M8v8EbC-{JAZx+eI!N73)Ge)MNP<})ArnUDL-$A9Ku ze&!SY?f#aD(%`vR#r4Xn9#wM%tJBq7k)Ds$TvJo%pYLW>?s_;(4;a>4EvV-zr%zn2 z=c=SnMAmmz)+f5ucQw){4%T;7(Y<)h9MIaMjW$-ZXGk*C#5+xoYbZ ziE*wP`oxVmR|S0{TSHfQeWG(iS8QG^y+(L4`*!WeV6?AXq{Y4QFVeDWbO5wpr~c9L zy}R{_R<-N9(no4Dj2YVIa5EGy#w(sv>Mhy~QR&oo4P9CE$G_Lm6=vHJnz$`psLIsH z6`(ifYlOzy8B~o%tm=gZ>lXD(BYa4@q>;;|FCcS`pN{3n0!Cp0VgFiyD_oszm6}sObd({c{LhUY#_Jsg# zrnXZYm;dCt{`*;7Ri~P{@+7v)p3=9z+nQkw0;AOFX0EdODg`#j=BuDaHFss3x87k? z>S^W5@ysQUo9ACE(>tFU-Q3mKwkUsMe6z5`o%u4W;O^Kxvb1nzv;{@$jcuaSsopJI z1#MLd(!>QD z*IP5S#Z$=LK%X8J@A8}1)0I_+v=@#_d3#Ptx>k{cr@f!v4OegmQeLOqM}C!eU`-?UA1hUjxrspB0IT?+Wb0W$zh3^J7rbxI=O-q=XDJ>ZL8JY z^xi{VBemWrYYH{9vn#*){(zB4uo~DI>(sH2n$_9W%eJ_$c3)1F>*9*GRqn4zcJ+3@ zBfYWd_H{vRzX3+`q5XIQ#=z@}=2-)^=5RG?zayh6(+w-qa*%mNdJH!DgZ4YZ_1O}C z9AfUjG&Hf$@NgB;%~j3z;tNdYP%~PFxYXa>UFnpk8 zj7@>A1$x-!_>eu=Iui6h5{Y0o(&4sFI!A>Eca zo{iXD>f;E8zcJ!JZRaUBQ8{|KYU(?Gn_f5?RGy?YgsM?Hv9k4g@i@On>$))|@!I5K zzQ(ZLXna03@#&NT`oS`#b^!8E^XiszC%Dqt;-;e~R6SaQZTkerQhgaeY4gmSq4#|3 z?TXYJvm~H##mvNIGycD>t^};A>j*y|?;(ra`(8Zk2nYrNStJlqt6&l_f*P?&zxLB8 z5TelvvWcuBh`X}r14cF>f@u^5u{GMXY8q3CsUq4~mxxwBW0PPEwl=Pn{^z_4a>38< z$;^Ld=FH5QIrrRqpMkVIMM36rV#N-DY)xVA0(p)TFPK0aNqs5IUl0RQLA+hjPn1om zF?vc(Rhsb@&izlN>3+oo>P}UJ-{r(A0x^if)0n-GGdB&y$<;#6nl$Dm3g5MLh7Rtw zR6K~NE~q1F=`U$)3LjdPj*%bN@!x$-owe2!oS`UM$T?BFgv`QLV+b8jS2$-mr=X#q z<45;e(E3wU&!Q4-R`m=(ox zFYhHg(MtmQhluLw(#*%0#x=Q$7z#(sSqa^VdrS$4HC6e|wKV82b!Iu6Pt$ z`QbU__d6in=*CK=ul4cafqOw@G(MAs2@6^^rB;tIh@Y?d_m379Olsjs)2w|?LYc7O zL?%S!?ibVfDUAwxHzR%R!AZW??}V+^3K%Y^$tnwKUvD>rP3_)oh&&YY=$kY#kImLbjie2E zEJ~YykTyfTU(I5*)2*pV9yRG*n+>^r7oTN^blJx`oC~qCOXCoH?#D*1}m++$Cy@ zkQ^vyEeoXC4Dcy>HoHJ79v6t|8=3DmNDzq^qrD7f!5q(CgH zj;eN(>$3pi_WotagFUxc|WoSOI{eYu{!EC{`v z@S8nkw}JTzr=Lp7jyefLAHdL8REAo8ERn}yINh_|Xh)kjC`+m2+15iBFraYw(0#dU zi+Mm*mC|AQHo%POt%{gVC)t{2Z&aqTU?X_l?Fz49BeNIg43F4Uv=BK^0S)S1f6^ZW zc3jmaWp3{LAD*8GYAB^_QUn)p^4TL2-8?F})0}o>+<=pAa^9^!3SPJ%i>sK!_4P^3 zP-q1oc&L2v=ugOmPY)SA$iG^t$o@}Wc{mj@n~e>YvkH9WIJIqNV}+luY=)*eCncKw zx#UThC-*xC>kOyFuz89y@EsN9@Lqs|R@`@@_`MtyuopGrtL|ZVQh)Io_EJozh6^ zf_!1njjd39w`+ifwBn5&d31bGQ8ufl9h6i`nItN0(IE2`60i-#lI*RNp zP8-Y)S)KHbw`l}MvU6I0G^x(%O2wP^iAdecd_~w?PG~Bs~glKOv`o74XBXcA4 zy^8bIz2(i@0AFiD9pRoAo_qo!!}4iG85>P2;&DhFS;h=vTJ_t$UBdrEor5sdM`h;s zcPOPyY3O6)3zzYG7W^eewTmjg<0wzcZN??UK;)j4A#!0oX4a%~WzRLQ98+ny%cs(8 z^b=@t@w@NZdp-WJfwxL^uP-Lo?MRF6a^@lC(FY0I2fgIB9i1y@W*FJHy2f0PFu?O&b|g*>YOtvMqW3;NC#_rYGU4E zs-r8AQ198wlwc!!(4qJ9Y$kzBmkK+|U!qwR9wga9f( zWVEGTm|{-H4j+vt{I(LW{-{gD0cVc)CUrf}tAZ%|QDzn|=R(S;=Z#n2gu(od)T=6k zGd;}E@t(4tmvjNQooR7krUF-6Esq|6+lg8)@Q435=V=`9n;>3oWRn-Q5t}Hy`UAnV zm@%B-I;0^)?*z-=$IR+GDh+C=d%@D#`Xa>F_8Xn$A!$LqeB=lIWLK>mq)nso=owz%2v&LV%<9a?p7C&18;6)2ab!>{Qp zeCocBhac9Qz!_3xJ+@^!>;AUMm{a}Mq=zN VJyw=R(}O$L`~{ z*ew2*)h+w%3jEP-$Mfzxc867;ctOr-WZWp$#f*4Xubu1jULSnwK4SVC0l461J< zxBu>sshmckD|H29qG_7b#zaIwxG_;7Ftahy#=(|RL7_&=(%_$siD4mQjfrGE)a*;!x&}#za(DCu3qtc$_hDKT9=ZqDW+QV`5ZPLu2AX)>6hqK(^Ax zM6K)vjENCBII%Tn8KdRTTrtK(Xr6+`ME$&ZjERx?&b8J*x z`K&fZPy5-N--Z%kxbw#1m& zyL_p!U559HI{yZwAEZtST#{z(XubFI^l7Jjo<0BsCVigXF;SmwQmKrNgT~aW zOb(a67D<6&j@8|@*CZuQbX-ZTPfefgcy824la?CX9hVOCgGM1Kq zpJR(LbuGyeV)Q=xLe|;$kmH8YcK3**zp>m_Cme2Ls{d(+uQBK0XB>Vuhqi}3YjQNT z1zYi$RXNW)!qnz#Z4Vr`jJCOt9DR*8>l4Ra zW9qM`jz5g4OV1rY+w?gBU92(uN)FO#YxTMsH$)AO;jwFz7d<&9AVu4J{HBX}n@-v7pb5-UcOt${TAn zw{*~5V`_N$AdbS>6@&KK1GO>L{hQszu45b&RSl~KW$_&C=PKkrz3SPrULlni#%9ZN zHSZEwbqprj}$T1@Gv!CL6pDbITc=X$UYGj@A&Ah7> zUTtjF%d^mbWuxqGvZlK_u-}HSnw>v&{X%?;W-m(?Dt&%c&0QzsUTz4vJ}l?SI+sg5 zdKT32LC)8<@)H`Ly4ow=Z%o_=YjEg=Vh^@|Q9imr+|27?Z=Y2hdhx4Q!AB1q{UKM2 zM>kIeZ5k5trr6HF>lwGNJW*lkGmm|H`0H1PJw+bxO!eW>rdO*zK5AR+!=%f(_MXdH z}= zfDG8_D}kYxMg zfMwtt@Ct;uES5Z=8(07m!71<@gt#r1nqUxE2TpqM@E8Q7vsiM1-r#d^2K)v>Ft`eW zSl|JxKoWQlDrc}*Mu6Sm9*D%~YXfG1o!}-r;2^jOGKEjPwt>Guo}AdcU>*1j>;b29dMuVpnD`mo0(Zd+V98~%1cPvp7nBCIKqC+b z`hk&PJeUubgKc0RI0J5i``|5bFU6b02lQ_vMm1oJ$2*Z{r&N5LuZ9ry#h2lhM| z10Xvn3@U+Upbh8<`h$^R9GDFjgSB7_*bBY{cYr-F206$E%7fNmJn*c;!$EKhya1Mb z*mfWI{M_`~jXblE}sbCS<1P*``;3BvV?t|wbumHBd zy8yN^C<4lZx}Xi{21bFIU_MY_9oPlF2Is(K@Ef=f-h;F;7_1-Ca1T5NA3&;tm=VYg3WCZY7PJLD!C){FEC$=am*5ddR|rQ-P!qHP zQ@}=W9Q+P46vmzcih?F!lm`zpz(SA+z6IAnU=geUC;+O1&R`xm4(@^HAhalskf0S9 z1{Q(!U@JHRz6RI8L+~1;E`~!chz5l~Rp4oYhjySp7z3t&ec&F5E{0K?6Tw381vpz0+y4$GQkBAsKps#N#DXrM zAD9Rdz;#R)M47d+-_rmct<%)B}UTEU*cj2Cso{dBhCbf`MQ>m;n}m z&%o#4D-RxSgD2n>2(EyA9h3)kL2J+ri~{q(25=Ib1-HN(V6BLwBFG2|fD)h^vwK`e*^{lM^Q9*lTQB!G2bA2I5mS(pcZHYdV`4|!GnjbAPJlT--Em0 zIk48m3qd|m3A6^?!4$9t>;PxLb?^!}Yau0202Bi~z;LhxYz8~P5%3lG8T<)6Z}AXP z8~ZdU2+DvKpcfbhW`hl2A2IW}lfeS82^<19zOa75EFh18M8w-Gi#24d@64f=NJuP2eE-2K)lil9Dd0(ydpU^ZA?AKQO3Cia6<;3x19d;q}>uq%QRpb}^fx`B8w8*B!rz_;Ks zxDFnIS0HsPk^$L4K~M$M2hBiFFak^ki#>SQ1&)FX;3jwhEDbSoK^Bl56bH3H8_*4m z0Smwu@C~>LUV*?yILUx$P#MI6j-U@10~UbQU^h4fJm2Ht7w{Oo2d>6gASeo|g65zj z7y>4MIUo`21&6`+;5m2$f|}rp2^0sFKywferhzr!05}8ggEUQXxNnN>UlS8O!A!6U zd;z`!FF;H)>}Fsf7z@^dBj6mk0iFU!bG&1a4a9(|pe5)4`h&4x9#{o7f-k_A;3x1` zb8LTG3k((z1*Qc!A0;Jcmq}C<4uVtQCU^k+T4R3)VIUtU1!{rTpa&QO zW`V_EGuRKl0vEwG@F#czJpbS!bsKCqkQ-D2aiBLC3g&|~AQ4;vA3$(hEErS--N0R01_Y2hblZ0eirC5Y!3d1yt|kK_@15fFFRhGY+|+ zJ{SdNgRj6{@D60^g6#|{f;ylD=mw?$1x|xY;4w(w6?+1x5Bh&#&9)hTD==b2E zJ{Si!fV1Ea@C;<`j*|{(1}1>*;37!X12YGCL1|DKGz9HIcQ6!826Mnlun`;tC&5qP z9(V#QJ+b|R@DK{Bfj(drI0@c^0==*+f&O3uSPm|NXCPy5#0%oVG_VF72baJzVC#c} z7pMq2gVA6a*b9CDcfq?p*#6GG81{z;lqUAKo$O3Z{cK;57IV zyas{sI2M4Spc-fo`hYQDDp&wEfFs~MxDt=;{~Qw^KuCWi0rG(|pe+~;7K5$eG`J1^ z0nPz9xq#}RGnfdLg00{y@C+0ih=UOr47P! z1a*dBUj`FF0$2;Sf&<_LI18?VKfybYW+<+PK><(>)CEmJPcR&80GGhu;5|q;4BJ01 z9%_JYU;#J*9)OP^bU4-+6bFq!YcLQj2K&HO@CpmK za32JW!odzS8-?xP9}`L735Xeu%W2RBOb7eHdr)Ky-VK-wz6F1S>ezG>z$S1Cyaf%$ zVlaZ;;0E{uR2YXO!Bnsj`~lto=XmUSwlzgO|WQ0|ztU$%%(L zU_AH?+y?HMNCET&yTA|NIVdy>p9jGL@Fn;IM9oGrU?(^Pu7U@^Zw~e-5Df~0(x3@w z2YP`qV9p$D|Mi$i1mA-j;30SotaC9!K><($#Dcb<4;Tj)ft6qj*b7dA^WZAD1)hU{ zK*&6ttUxYM2Gjw~KqoL{9=88%Ol$;4z!`80*ydxDf-sN+lmbma92f#7ftg?(*bR$60=L0q@DYS8!X6WihjO4EXbpOU!C)F#1@?jC z;74#1JOIx@x^%cp9@BY1+|am=y}QH=>N0Rpf%v}NRQNJyKNYgvna)~J1ul1HR!^2W zo2w?voWaVWJ#<*^TxyGmP&ZMc#!hsnQ7hLv>)8qyR>!jjWl}rm;>U0c*Ex%+kOsk4LfY;Z=Y zs5Q>ks^xZPpn9;znO5NkWZ~+@8fR9Oeyy{~qP5QSYVRs%xEip^nb8&*sn$Glr1u-x zqfdPAE^631XBO3Hoind3CPvNM?#!q@EOO)Cdw~L)T3y`aEM+sQqSVek4qp|&$(dT!+Tbj%&a88`PH4a)Z>BfEb7hqbpRC)G9VH#5YxeVSRdALPOOz%j}_gP{+17b0kFO_E(3uI3J}8 z4%WsBh6?BtUtnn55KGab3C=}D)q@SrQtHQT*kFZsAa&~wXCYN?uQNdPED;o_N^N&W zs-oMRVag8=3ClJ()s?N-YO990ovMM>9=QwKuXJg3V~D%7+PDpyzB@3?V|O?+CNZJ zg5A!X>etVmOVoxv&eEEewPnhr`p6#UnZeRqM4wiu};4F9naz^9G3i^UcU^BQ3?twQTZ8jWzK|?SYECGkW zEfA6&7dW6T=nkfUE#L}x2D0VAp}j^9oTR{7a2h-YuADgDfX-kXSOboOo8Th|%Y~yQ zXa%&p>xn?SoBjf1&yAxnm;^S13&5HOmkppf7z1{IAHmx^IJ8IS#m70&9ZUl2!3FRT z1n0w95;O;c!BTJxXg9Qj^P>;c0YgCo*b9CK&I0(D2ef@hf9fLfrJ z2M^i}XYFS5*WeG}Ul6f_>Yyu_1~!8;;66xO2>qZT7zQ?g3*a@#Q5ctVU;@|;Zh?;= zx(Kc}Kp&vpB0dIw1fIuuNL>`?4^S7325Z52@EBw$hMNF_gYUsdkiR(2l3*%G z0=GeU30yIOQ6Lfg4l5@&H-K*$ zoFzdAkN~~_w?L}07%N~X_yRlzG39Vw0@i{HAXRzH5A+6`z)g^@0cjBCd|WP_O}<1P?)EB}56j0R_&0S0J=9-X)j-c7vZmKoxw>08N1hYyhXh zQ{b+OJ`Wz6fN@|q_z}DZ*{b2{3UmOAz%KAT(C#%ltK%Jlx}Xmj1{Q+-;2N;hz{-PI zFdFOve}TZ7xH><1HHj=a18tg($v8o z0GfgEAPL+7uDZAm0lmRe@D2DI1lPl+0&T%Cu%sTg{{c)~2OmLneXKm_1?GU=;4*jx zA{$^g1T(-1@D7B>q8@Yui@_=I2MBJ66$9;n2W$dA0Y@WjA}|^xfxjDh@Cmsw3c(Wa zC3pt1Ho;~Alfh1K7i4aV3m`BW%mLfMDR2j*YK9vlpc3c?CWEcu2k;I=G{-v!&A@P= zz)^6+gNJt@OACBN2i?F-unk-WA3=Ca#0h$X$zUtE3bb27c|dK@4a^1FEucR^NNZdU zg7#n}SPBkpUc_h4cJI0x>5bR9AJK{?PCj06fC z2DiWm5Y`DR1sZ{#U^dtdz5{=Obe-`IK`*cf><2%CryxxiBmlC3LR~!A9WXH-tO3Wt zb?_Qw>WYPc)?gHv2v&f7;5@hotlh9MkQ;24;fI;57IZyawUj@u>{-0CT}& z4<2@c)8HY{ZrPLv-M}oc2V4dJfQ&s6Ij9G^fe~O9(C)@;09QdkFAQj)-I19JHiK`$ zE#T7|hj~y9bOPgmXAvH@fs^1{@GE!${QF?rgNz^w&-2+MjXTVi( z54;2J{y6=DvY-*@0^-3qFc+)>i9ov*^ecD@Yy&W!KyFYLGz4)V-h+oxU>;Zl_JMD~ z@8BW$03rusyMs!g7KjDyKv&QgX!njrfoWhl*afuvNSDE%z%~fu3Pgh9pblsQ1^~}o zJgfz~z%g(h+yIY(buji-5Dkig+MpZofH`12H~=n!+u$WgI|QQ~6bAJ{cQ6(#09(Le za2ebNxF6+b@gIsomK0evq(j!E8C^rZZIaadV91`VPV9jee{j)wws%!wH$vKb@G`ym zH#Xzdy5FYb*r)qrdI$OwI*u@U|10_&`fK`J`aAk``g`NqV^3hiM;0ui`&#uG+sDxT z=on%80{!XZ>8a@x=xOPb>Dq6A;r-jE(L;3iSnMO%5MVsphtpkr!D70buITCL^Xcj7 z*q`(j%s`((&qz;4&!jotjXgaZGP589J(Ql29!AeZ52t6QXQ7AEBk0xXk@PTn6x^dl z63&LKEO67K=@Im7^hkPkdK5heJu5vYJ(`}2o{gT{isO~G0@>M+hXpz4dFeUn`RHlr z+Hdq}ug8-fc>%hO9z(a&3(|e)g{{b6n}IJIim1pYu=p1X7(lyx-$bvF-2fZvkh+d8!OfOG&CYAjyq=?PAgYB1$XM1AO*xy5DTC|=|9s?(XSiN9{X2p_>~1G>A%yzq~D<*r{AR?qyIraO20=xLjRL~i2j%UjKjb| zHr!{y0r~^_7xcgB`{@tqN%Tkbee|dFJ@jYvoAl?}Glrr43>#h;&vqtZc}c&){x|er z=x^za(((_TQCmLHxhXIXj4{tmWwFBb!vMFX#l`||Ykl|9c9P3npbz_hq-%eAqxEyl zS<=usmMj5uo_Q<|`USo|$Z9FB&)_^8f?4n#-AO-3FGN3^H0(YGcOi}ui)?F-5sPeV zjuDHj=pX9r-y!{MyDjS0-yzx5iu)lBZHLHZ`_^c&RkW&t*Ftisn1>+&wp%RA^eCjb zdiF3RhZ>A2>+Pg%k3u4Bo^o8N%3P`P^eXfU^s4lV^lJ1<^y>7=^cwUkbU9K~rPnh0 zJ@#sBsLdCYrPra?px33>q}QX@qSvR_rZ=G1p~uqe(i`d?ZL!y5Ln9W{r#GfIP!FDl zL}3-Hmh^yPN1TMz+yq3~Z;%Cf!VzO}2tAn`}Luo6KWh z%LZecS?sInvdLD_Ws_~C%O+Y$mp8VBE}P^tx+JuLK3GpIz+zv62JJ*$)T-7z#<6DP zZy}MY!5UYrdbHj(Rek#=Bp`SvYHYS(OB+1<0##^1aI8~%)k!UAv}hw`feQX7WI`Zf zw+z+iZn4i+H{XWDcsij;YaYqwj`UIV_Vm&8cJwjywsh_9D73Art%o+hvGmsTar9XF zc*8yRmTZ{7f)@0N^yc(Q^k($Q^rrMF^d|JF^v3jQ^hR(ku#9;2v#9X*Aw8W9S(Ae` zgOe7&4@qV9OsD_D{uy*$7g%P}|6>0v`ZM}$`YZYzI#1Js;P7@>y6cq1rqDWf5&S7@JXr;?C>^M zmW8)n-W2(XFvTgR<1!^heq^;siec=R6!{6!A}OXf`qLz*m{Hxdx+0=N`8o+J16{&$ zsz_}F|G_4De-7p`zRRy~%%#)3Uvcu(~%bP7o zmp2~uG?J^&b(}wk&#se__!h}=VY_I?>uyQ z-?{1XzO&Qiea9HvUoG=74S@12lHI5pT@FGO>5@rFx@1z0E}4|3OD2`+l1VYc|Hp$+ z2^Pu-C`*?SP=PL?6sODXQid+OODVdfRh2GjRiZPk5PKCiNL&w$gU(PtQ(ARdBWX3F zOIo$)l2#qMq}7lvY1O1lTA%JN^^Jb-L8l2{AVa7zT@E_2bV;!WT~e%0mlSK$CB+7G zNwJ>pWxNNS|E--ZLN)d`rPziGkrcbpCB?3ENwF1OQslK(@bUASKqkpm|rVTKSAzrv8pSVWyH8O@gbQwdV>5|O|x@5z%LGr~D zFC3FkT+@tt?--iQ8AvwVNEXRvEc+#!QFO_MSE9)mRa4k6V`v;*_Qa{WoA$)vERYm= z?Q4+~$FSdQ0zKG)HO1_9jBnrk}hg8fODjiaa+bUz>9LB&W!sYw@Oti-$;c zGRTzTS|**+{q!@|ONv|QG8VVfWj|d{m;H3B;ocNiu|UQmS2j7t)$EtCxQQ-faU)&! z)0K1?i)-jI7B}c_N^u(tWGrr`%UE1T_og`3X*$q-!S0j>xP$c);32vMm_(NV_s}K4 zM8myTp@-G-5Lbj}FY6?ygLKL109|t0PnVo_(j}+Q>BgwD*!R&Trd@Q#6k^}a25(OK z2cMBH(~<8qYf>84Io3;9N9hvQmvjm16kWnPZn$@}9bOA{oV4a|Q1FIN=-LpkH)9(2bYf>86_pFz|uF)m1n{)~6 zN4f-d(Qt2Izp_9AyFr)0exXZXKhq_!t8@wM3S9!bM3=yR(A{*oah(M+?k+3;bo%9n zKDvrzFpaKTEKO-xw^=V?J)lcipPpBLW50y;*l=%Hzq3HXx=WX^?$ITzzvvRy-*gG< z5naOigDzp+*WGk1d&mL_>rc82xjS_4kb9ibbS!(u?vw^-wHdbwBtQ#Y0{qDN$!L2` zmjFK)?hWuC7D#~a=@Q^Ox&-)^E&;xwOMtKF65va^1o%{U(`b9b0txWBTAtZE+U{p| zO>D_gVNcCBo6@lSKM5<%Ct>-j{h>IH2eO$bcY9j8L^6zPD3LhXFOk^j5=k&!BJrV1 zBn~ilocP zilWQN%3!#6WMyK3#28AK7_-tP#xT0XsC^5Lc1KKN45v$sZn})DjJlh4%?K7qj3IQ1 zF+DvwMx~z()@L!Ln1eMbO))>~CB=MnNwElBQY=K56r&CIrkI-rl44=Hq?ny9DaOzx z#hi3Wu^?SiEI^kOv*~V1F&7IY#k_P$F%R9FB0e~HKb4kbcS-{+%6bW~0$l>EOqT$w z(j~w$hI<1n#{vnk3S9y$PL}{H(j~ysbP2EoT>`8`mjKJ^ZVIqG3nai&bO})VrYCKj zdjrJB`bgC#t7#ZEWR0X)o6gT4_C|DmVzM`*ONveCl43o&q}YHiDb_Sx)sJ>%@-$_q zBvywmiN(?-v1)WltOi{Yt4^218q?+QSD((nqV09rAc-}nCnsi6yNcuZS2CMxLMu60 zbY_u6_Fo@X+p%6EYeARDy4h5{Y54I+OSa3|qAgvKQ99`1t zN@rS??d{nhadn}~_-aL$wA#><(^BzGFuvS5Oyet_H7O0NFY6_&;dBXWAYI0n_DyEm z7?<%i*l_P&I)DX|Vn4d1*n=)9_M%IQ!|0OYP`aephc07oi0-Dnv_A_Z#olyDaS+{` z;)R^1!`ujVr!>IPtd{^s(IvpKbO~@OT>_kJxcV)ZE0cAadY{V`(QrI#Bohx^GMPb_ zOvceAlaX{8SQAw5+^!hg7@KmY!QOQ?w`stvWUaj4S#&ud&7;c!X#ri{ucFKQT|t-k zyO=KTcd6mt0h7Q288EZyGGOM?Wxy< zx*}}GkIf>~ro5)K5?L#0{nxQ*8|x*ljdV$CEnU)DMVGWz8}3c(GZsi%o9U9)8oH#l zlP+m(qDxvk=#th3x}>#5chgTF*Rep-+D@0HjECqFV-j6rJV2KikI*H?FX$5EZr#<30=SoP zoPCnm=X6Qzfp+!kz3w{8?v!TrHR~m-ujrE1r=QF(vR|_L(r|B9=U5m|lt=n~^qu$PM_?rbXvhLF*#bXHFq@ z2OA_P?zCG=ns(Z7)}%D82-Ztl>FJUd{+M20NlD91m$Wh(UOM@Q!_h2|;TB1k;g*Fi zDP~evOSvLCy4WmXWu;44QFI9_9bLl0mni7#DT6AEo}86_>nu`DD{b00i?ArAVHIS( zgq5EzVHKiFSTS@7E1TioeKR);B&_Uo2`e96!pcjRA%`!=_}7ptOqUct-8T#9{iciC zTzrAVm_y|oso#{v58@(K=dz}YvT`g`dJgjL1x+Q}oUBnu?0 zqI3zXG+n|fPnWRDsMY20>8S#nWn`72%gCxqmq<#`Wn@*RCyy)@S>ANGs>|+_#?*-Q z5>rFE#PsR)SZ(%8O!W=-?tpbzATe=8l7H$O%YKQey6Rm4JD@bn(5cBXiK!Z0VroE_ znCj6brdo7~30Ga(uNkV)imr*J<=#zG7Ns<-R(ADGMOT)%mVBLzofdQnr5RoB-E^W$ zCe7(GbUM%_lXj|RC09hDI5tZrZRwIpN4jLvSS`lOoNd@FZ=J{KSCvf1>3G)2JMZ?% z#Z_0jTwG~i1FxMdWSDfJ%P{FrmqdEfC6PXcdk;OmSs;=0qe~>+=n_e1y6jCo=yF*w zfG%0}rAt9S|erb|py=#0r_pT!2rN!eAU7<@>aS;I8kma|CG`mf>k z8S5pjb#zHO1i|jOn1|8 zTgn2-aWP$n+j_dhs2}X{CG|M%}~jB{1U|M+({ z#;>@)t8W@@=a^+mN82gZ%V;}6m(g~NE~D)XT}Ip2hO37ST$!9_*(oFIxXKudlg3wU zmH~8X#1Y8 zNNGwJST8C4M3gY#iuYJADgH&56mQZc#Xsnh;_rrg zKWRQ>fuwkgE-5~uONzhICB^&dabtYayvt?@>sPvrzdz}c)g8KIb({XLth{&r-?BTU zF}+~D#PpgjF+HVAOpoaj(|g0c*KW_$%%*souUIE(yrWARFX=L--q2-CJ)uiXAJqG% zt{CS(Z2s4~k5s*znMO)lALCO|N+U?cdWpb~E)n?BC4ykOL|`@CyT1jnKt@U$x{Q?6 zbjik_F4+XpB^w)EvT@QS8@ukN{Z0F?z_ibWGKK=_GKPHU-W2s;?yS+mbZie{jii`? zE*}D1bomgFjV>vM(Iv%S8PWqDc&2 zCvg>~OI-QraxZnidEc$HD$pgbYIMn~s_voqQZM6lZZFLOZ$SD^d9bZ%r)5^I_!@WCYZ5GHd)BdwT^G?~AE~z!3OKQ#Nl3I1Tq!vq;)avQ3 z^0#+o&f1WD5?CF&1SX%(7q>T^3_7zYrHQp+y(HF^E{V0EOJdFGl31MK-o)CmKoaXj zmvPpfE{S!ZOJZ&5l2|voB-V;9iFMT7bTVko0@*QJ(j~?&bcykS(r@z*igQiqA-81X zS(DNfhp}E#97LBChtMU(zACmOuHE~vS+W{Rm#q5JC9A=7$*LD!vg$#XtOn90tDbc3 zlZEXA*dST;rb|}c>E5ggb}}8rMzdRD8cCOf+8DZ=Gbhs}rV(_BX%byxnnstw<}qAV z?u=j5oWM>AYbssBnogIn#?vLN8FUG23SGh)N0$TGC_1x>whw26gf){cVNLWgZuaNx zVmhKNWRXPn>1D=p_Df`nE|JZqOJtv3W~^YpM7G3m@BX=r1v2L5&?UwMy2Ln_E-@~q zON{gA65~?3#5hZL(`CjY7RZ=eK$jTj(ONxh7!Je*&N(b32yY4=^Wc4{+vN}rlX0^Jf=`i;lyHgs|dDcrzXXp~sF}lR` z4P9b7X}EW=9cO{WbdD}DouErhr|1&Xmvo8gYq|`!vve737j!obwr^P=0e(f708i7s z0pdInsh0OP4YtdyNok5dvtCmCg)S*xrAvxG&?Uu-hI>=I&H_pC8eLMnMVAz>&?Uv6 z=#t`1x}^9kT~fTEyD7yVSs*EXPnQ%g(UViet=cFxyszn(HU97Y+W-0eTKyOOo5Y)j z+*1ac(jj-B^)lq{&}GOypv#c^oi0P}Z^OO6hH#e!GUWcE%aD6amm&9u8r$C$5%-AA zGO}*dWn?|1%kk|ux(uv8=`ygM(31z23LaoOzP)63N@IG)dWq>ZU1HL{1Wo&pBr&~V zzrpyz#y@n~0bkK&2YgSLm_E=YCj4>bK>QxhTXjf#;x8bi9b~#1 zvvEyR`p#3aUf#KbF7G^;F7G@IUEXP`Wq>&8GC+dpGC;Ji;MKO6cYx@}?|XwyJ5v~IQkqpb>m{pDx@47sE?H%yOIGO( z_a48qut2iPOqZ;((j}{Cx(pvTU4~COx`Y@(mk^_LHyyt-u|QIE(Iv%5x;I7rj>d_h zreF5S#hR3+SkPDXALhzZC@)_pY2~I%T1Dw{zbA(}HVgwLJDVkwY;?&a4_z|JN0&@u z=#ohRx(uwssv`at*O{Nq^3IE?vBOOVm?FH3o#HpmdKo(T=`wT*(It!+x`dIo%Z+37NL^3f%xy!7Ol=n_+5y2SLq|0{<22pKujbWAG8EK?d*N!CkPrRfq@S-ON( ziY{RlH{2Um1r|tH<>?aEfBmj>3D!$k|Mk1lW%PQ}C&d5N-<8I1)ji3GUsGu@+H|;z zTy~Nm-E-|*GON?#k5@Qp? zy)m|CfyCI1E-^NyON_1P5@QRx#MqE7F~-p)#`e0a4P)_FNbT4si8ZGuC#LYH4&I+d zc4K!+v+B%x$;yXE70Jp*m#nOG$*Pm_dT&<$t9x!&u7G6KkuF(vp-Wbu9_H-&3Ymu7 z|LUG=+}nv%e~&kP#`*vIY|-0zm+Hm@+*Rz(w=Bc!|C=*|_wOBgaCzKGqwT%eAY-m4 zUB(>#4;FuLS4hAue`qBEz;_K|Fm%i95TIfag(OHM=R-ki!#H=PhBvRek)f8{ib z^^%i^E;-Gl%Rrk%mlMKx!&Utmu1uAtvQxsEL6@+`(j~0PbO~#k+B5^d{y&?|63IBa zL@m`R3bje{JU2;%#$ziVH-W_f+3uGXzqDwZ*=#tGs zx@0q-F4?T4%RpL6mmO}A?xr1X0SjaxEul+_bLid_F_0pZeYWYawVE|4O>raZCB?OL zN%1qfq_~+bDQ+;_o8lH0NQyh?lHz*0q_~MLDek08ireUt;#Rt(xJLK9-jn4z7D#H_ z>E6^5=eSm-=2t$3SX9lqt{9(>_@_qBb(K}8=epvZ{KCf&ty#P0u}0OL=NhVZCb;sc z1}{R~>f=0D$^W;i`9@W+IzQjl-MUJZOmGdgu2qS6`X9@aN-l66wR!mMk-k>^e;C@r z`0bLu){=(v%OHKNxeVW8oX32v!G>=YcN@MyQU)<>Hk)V%B0cXf>YV@^cGiJzdcCLZQ%^Wy%h{}SYlU%}O0_PsRo#QlRf^S&g` z?eU}G)jb&noZ#niO!L{!F(yRH3D=7*Bw)p8UE;Ut3ng zZ%P^de;Mt4@GBO5ZQMWjm59E!c%z?RspxBCocu;aUt4;kpI<=eYh%3phD2Wv{{IPm z0sM+XUz@{ler2Ms^z$1HeQkUne;F&7ynXJ|W&1q%#Q&zBJ6l)Zeh&@L<1^>W7v;2f z_{eDRwN^A%;PEH^Bx&(7*95C4c~8f#q`fYAPsf}!mpvUj?m*4Cqx%(PKX-IL=}+F# zyLPRv)hF-hJaQ!O=*RTm?@n5}!Zp|$m*S;bEETo6CNFi#l9rk$FLmjXQvX`&%Uo?V z-<=e{3h&msTj9Banl#^)J}I!gJC9ZS4{IzNlZLHDZ(Qr1tGw=1Xhl{%(9y;k?Mr#C8ik1MC| zTfC&ATE5#AZGERYpe5=(T9%k*@(+BO$t`Nr9#;kYe>C`idX4{^PhYkz>Gd90FKcQ$ z+VLOVShJ|rXI!C4G0$DG)?(Vq`Jp41=>@6b%T4o517BhCv?^e~t4M$Y&GJu`+3%_u zIN4O>R;%~Ba+XSmq7cj*t7>_J|MCo(>jzeCx#>-PSEUa-tJarc(HE{z^>M!|K=t~< z6>QC;Wun&H-0Ob^d_Mtqy7rue68T+C#)aJfzhgYG@Bdw16p zX%7>$hog9~=24dpVq4|KypNmW$oGloS7C>+CIwVg?I}j}##4Af6ivm8w6GR35bbcL zy`MrVQL8MhuHs2uIfUi84r6&mRj$KmFQ#I(r{Zdu_EbWx)}BhLukqw5h1q^gr^ztp?#Kybg+5phyenk`a#WGmF)ug;Q5OKkBMut*0s;LuGwbw*Ge|_6eI_*+3mT zhVc-qt{+3-4N)nhlk?POuLs^pMIJ|nja5zUsfmg|?y6vIsuGX8LY>X*^j|i>Qg>>!=D&hnNcWYJmOIMvzZBSBx`^r1M!xemoZPC}0 zv(9Y{_2e~er!IWy%IR$X$r3s!{}WjAI8{)4>Zn?rK$xA>p%bo=*3PQrNmmhT7u6e2 z&aQZ+{L|v>rV>vg&hF|xp2B;fR~sJM@)mQoO5s_n?5jF|<;q#9A4m-KbhGO)#eo5z)&?&dm5&;okHnwb@LRq#|Ra9+EpZc zBwkXT$;m2~;3|$%@u#uHN2{5rw2o27PGc?}b?-D@KGv{tD)wtvbL)5&{0;ghs0&}C zZ=!C_NtpE@)2dEZHMOECD*hYSN9$A-e+D)!Y4I6XTC4AL6bGxB7hTPhK7Q-k?_-^z z_Fr(Fx6VwOdeP#9Z9T~j=(QKKCXwV|MG+%@omCSMCLWb$?JOeS9sFKlw{%hHON zT>HDzq9)hA?X8&CJr?cT*NS@^EZVoXl`#1hxR1%V!b_T5`#L#alWTuh`lZQtz)zT5 z`@_~!$&LZ8{b_FLCz_=_c2{o~^#gzk@e0`FVJ(?ilylsK0=Q8K#1Z@H8gZzKd+8$+fQ*n{9IK zyUeU6{}JBMOD)ie6y+Fg4;NO zrhe@wkDX2Z+D|6Cm|XioU{|kuEZUDUou(Q1!e4j`EPn8pCQk)_WpaP`Ym=vjzcG0l z_*;{wg{Mkh9zqO2gZWA;5S}%;z-n>8yP0MX1n+M0V0a!=y%Qc|@(_3rQ@snWU7G3R zP22u%H1v`Ncsh7*lc$IGF?j}fUz2BqZ!vi$xWnX`;Xx)3h4-WD2k|g8Y&8{x!?&3{ z3q0QB5%B&dkA&wpz2hi&0h4Ei+fDV+@BxPB&<|nSZ{ch=6==V7GtlHYlCs@#d3>GP z$K+Y2_UB1^{&MB@#pmLik8oM?N<}`#(`(g1dwQc*Yfo?0P3`HOihSa#pnoO~FwH^x zOdM$P4{GcaR}tGstJ?d-Rk#ukocIWBPrh`<=K_54@VX5iVtTn9?lQSgQm&`2+g7V@ zQowW9BdgUf>HQ0=a8xSPX&;%j8F$2|UF^cv3cT|7N8bvS@0}|&Fr8^uX_DgKX)o0l znc38?Ei%;PX%`-H7qJE`e2m9HmCfodQqO^sZl<*kf`^%25=__DhMyy?wQ;*oJH0tS zsSQb5Z*?Pbm%8BR4z=nZ+tbC2wd^t8Me>LBba7k~+BnDT-5@-x#^;ny2xC-!h=M2wcs@%)UTzpdz zDi$Ty$fRNZ?kc{Xmw4l^t=_Hr3jWsQui@`a{sx}P=B?Lmv@|y5sST>8Cf7#M5L3N2 ziiUa}pEXrkhr5EWwkb=fiVk-fYif1K;STjpgO(oZ7$!XrO)C(E=D$sz75>=d(eOtm z&jx>D^6c=JCeHzXVe*{t=O)i(vv@4eObxkF@XF+Q;BQQx7ar<;hZgO2MwrR-!{3?e z3&8&|c?{ggRA11B!=!= zO%0{sPLr30yG&jNp3dZD;pRlj!Oe-3hnqKX1$dIYxAmL+<4G`gryxz>Y}fyskR=xh0U%nS3eKbM?*_fK?8UzlgGl_n!F*r zy~!KFJDI#OytB!hz`L8gDZH<(j(1OPhKBj3g65yNcE={c)ZY@m$K?85nw$+=qq(1{ zxeYwtoP2LWkd`WD@US#-VwnsktM3tjRmUCz!l5e5%R2z-O4e zt2&n6-O1Sv&E{Jc-II!D&<^o0k~)OpIZ7K@Lro(|8(G6l-a~DR!f5K5^mUZGgl{3O ze1xf6D<5g{Uhqq%wdk!1=5$xE_EGWLQ{SY-oW{bh=hL2_;)|i(yDR0y6#-6?+L=nf z51)&Eoz7p|4PHdg!+z~53$L@}RqqSCds%a;ZAINB)T$!xqL|KD%w0}7i@FP7x?)l3 z)~e8hr=*F++!^d1{$iIkz~ZN!s4e^*<8aR=kN#uf0>-kE`}sS@$zG8CIV=JC4-ok~ z$<~~7{)(_QADzF|W=(4>&toad8RTa{F?t?)al^y#W9qTm3YMT_QumUq4`O{Ox`SSt z&IMY^(2X~Y|D(RF(Gb?UWh?z1ms8tHxhr_ev)OOgmB-q0E6_8Hd#Zayx-H9d-7C?L z966$|S7mzP!i9CO;_cTLQ`OtAdo{zo!Bl61Y?&H-!O3sO>ObSINuRpNqI)gYr{No~ zO;1a&V|aM|EYtJ_*5&IP)F`2QJ$lK)Ip7#u_1Ta&XOv#hfQ}W=J(i9Y(7hr3#fulZ zH=^IXc~kes^tW%{>fVGtc<^A|o6;*+uKdwo8{5s;P_SS@y`VWgD#}=)7KSH}#g_EE ze8;Wm1?a8mx#(>S*M^op|F(22`i4i_=Iy)%^)zqqEzp0A*TL}coJUIOGl=un7t!iF zdg~)J@8s>@t$Al}|8&i}c>6uYwT7r}Td-j`8~V^k&^yyd()-az(eZXTv4VS}HT7Wn=Sf8?xu^Jg_!}Med#oSJe(`ai`1ntJ!Y4lQ6QA^n zPyV-OwoLhVgJr7WA(o`7HQcYPs!lC;q$*R(9h}swmV0KZpx8QATL!xum*@VL)h+v| z^bOtR?b<~1hVCl*#EORQs`|w54c$%ji877cHS~!|joj7siSHV@o9h#~8oTT06GIxi zYw8on8@uc36TwZ~we*QLP283AiPcTq74?bRP23eCvCvxMhqpW40+&t8agM_=m;WLy z`^E*NQZ8W_%*YCzE9q8tt_?9oXn3!j>RHFWr-GTkuNjjMd50v%;^Z`WNoA7HFKv^kD9q% z`Woko+_FpCxZ1CLRQ}h?kA)|^%~DmhY3UBoD+kZrbzds0{HxMG0+nUecg@}D^vVUX znTPsge%eQt0{^OP7@065s-XHXnDeYP;m!OzsL+04rPRMFH$|>M?z$7e?2LE1^Tx_(2rH2R_@&1 zW$QiPp~n`TM^$R=&YIxKYrIBZtDM=Nx@94`|Fu@JdA0JUw$b?#;tGc1huY38>OwDf zu)5XSo!RyzKUxc^0&Uy{Z8>8wT|%{O>kddLUf7LaSJ3`xL%~rf;YsnRgqcNywaO6X z*VdiIR;UOY(`zruV@oOqFQ<;ixdYVqTEUr8XvmjPuuQPl7_7>-!vdF<#X=&~@OJJR zwhxtMI$c8Vs{ZOjJIp3eZ8U}^cb2_*S*vdE18-D5Fu5L>ci|J@}tdBc~>KljZJPq}R zhsT{E+C1{uf*R`$j*jkXwnzGOLfxhrw58^;4X)m)&i|r5>~X#WUSxWPFUjGR$8M*6-5VP|(o>mn7~*&UVe zxLt^<)dll;rFC9yr*-1X58d4{wj2Yrwrr}w5obnYyN&FD(k26q z=7T-l6>S3tX%d#OVsd8nzNb4lVfavUhV_Q%-D+e{Y^a075}YH$)UQ1;Os)*abOmj$ z0cv0`yw9g2(2!jPwhakUWqae@-|U5Dr5mNSCREs&Dq-a4%=$_sv>anzLjKWGp$Z-{ z)-ymI>5Vy78G|>TLA~hhE@3-2HeuexY~Hapv=0i3jYnf1wez?$oi-MN)!jZ=Wb+AV z)dxg?nlskztLpc4XR=kAgx08p<Tx9N|=n0{`lm44@fq;1%vVsW&>pTY2-wtq!V zQ5XBVYwP=XmVVg#bEpe_-5C>xPRpo*`te9U934K#r{j?Ec(1dlxBX|d+kTvp5Vz8$ z9&dK~sJWZ4fwg0#zjjVZ6Zq;kRiVE-y{+ghZ_Uw781RWhIP2;0SSGe$yc;7m-W{Q@ z$SpM5Ce2BHO~U25=~dqTd`ap4=p8aodeh@?(b+Rc>)A73@9D7B8I%ybAV~cpy$`hB zQwh==p|7aEyxIfM^Wy@oXVGWQP!-%f#78X|z(e&mt#{ZW_GVi&kV^|1i1x6>`ur*k zbZ6C%hSw(spVm^2$1gbk`;hx^i5fT1T~=SW@=3LR@O{4)<*tNU>qEU+1rEUytF6~MRJkGU9QrK& zPJQR0_N%e)@oTU6J!t;Z##h?Uq%yTyHH7E6quM-zHt9W&hPaFA^VngT?f(X^EQr;} zBeT#~BXo;id2pLElZqe8pgcn{k2YKNo}ELv9-ZD_T!lLrxUXZe{QF$AW}9AlbSrkg z$YGpE%rMO3-gdpG{V?qBJ$I^2+H;4;>d7#7C7-`i+bpW*4rjQ^H_7dL zJi~DvHEXF|eZ9<%BgJse?%{CEu4WOHc7(gOEmLvTe1yBEZFxhrW&~zcu8EID&0OJ( zR;fq21ERG3qw&!~VcNY(?au&kKIT6ywcnJl3SaX7lyN0cQC?SgoJCpxe}+DA!ZM)f z2*_3>lGG|D5#y4Gp0xEewZhbxV4|WB6^|l|Ac!EK$W>qlXzikgMO+d$FtNcJV`Hri zhS&sCZBn(VoTd`fiv8Z3e_(!u!-2W?yZ7CD-@WhM_b(VC=<^~J{OV0CQ1?=ufp*p# z!l`u=i_-7Hs|qyAfhFPn93V0}4eqPW56@7@X7qe7X-Cse-DtBDbiZM=JLrRYY5_<; zxo@W)kv{3IAK)G93ly2=fuc`PwyZ)2!t-mSA6oPyLrsS%c(Y>1?fus1(i`k zK1wq0Ce{jpeJ8dp&wnL zzCso*GNHJ8!@*6++jnqgnCJ|R5*=x*M03rOm1lwnZrnJ}3P0V71^Gj>q@l6~la(A> zl?-eFUH3(xL?OY_WM}fsvqnZT}0}BZ@%VQHjwy#r> z)OQI3(=nAVpj&-Hg*|nKGIy{^&UD*>;p5(u==F0DzGzp%xbg5P+xr+O9RsN=Vs^Jg z1?Lg>w%v*cPnSc*f(w|^E7DjzFD&^{e!0S{0$4RMQ5=~{G^x^}Xu0(ETc{sDd)j{ip-wJxt7jL~%eIn7xUMX?7K{!##BYs_wafbh^lBogH$gmp`AN_6-uDU^bnOg=Fq&%5^WTd%%`5VgZptIEuaw-mY5YR1IS zlhX57ybK(F7gHUm^0q2eCca81<)r0QV1Dql(9lt=((jx9iU$6$4dscE~{4dsu{+e8(PG_w5)uwTFcZ!VM7gv%F;d z)5TxovVx^naU-S{^nM@E^L_>2|KW0PE$G@@nVumQNQ1R(G_}^U0O9E23yV_LDOnSz zvcO~-!iNiJVdQ&n?S`=#r~`F(|7SlAb$0jpgt0pOIU$-(wP0%6u{#I__VZRv7{c`? z-gi=Mcv;1;B$i*>G z8Y?p@caiHk`F^ZS-;b9==^DtwiB+dH_ol%Ke%%b0DU~nYdwv>E`UYkdL&Y>;>=zQK zx&cqRpSLrkkiFMgRLMKD9HeKkOH{*UGZQ&9O2~FXRySd)Ole87`LPR~9oM>7AIGHM z#H9PHbS!_G!t6>982(g45q~@FGLRuE)Pm_UZJ!}qhO@ca4qKNcQ>&dt3Nte<9C`9O zgcD(=dWhiXXuyu+%H$N83TDgU^vHom{B;Mj=z4xEQ_Nx~$w-|JTvljLqh1F~)y>I~ z$+1zM$k9gH{!7`thkUjfcuW%tO}3n*8&GQ+&24;}Q}MKH JDqeWg{2!*K7RLYp diff --git a/app/build/intermediates/symbols/debug/R.txt b/app/build/intermediates/symbols/debug/R.txt index 3c37def..45ba2cf 100644 --- a/app/build/intermediates/symbols/debug/R.txt +++ b/app/build/intermediates/symbols/debug/R.txt @@ -11,12 +11,13 @@ int anim abc_slide_out_top 0x7f050009 int anim countdown 0x7f05000a int anim decrease 0x7f05000b int anim fade_in 0x7f05000c -int anim rotate 0x7f05000d -int anim scale_up 0x7f05000e -int anim shrink 0x7f05000f -int anim slide_in_left 0x7f050010 -int anim slide_in_right 0x7f050011 -int anim slide_in_top 0x7f050012 +int anim fade_out 0x7f05000d +int anim rotate 0x7f05000e +int anim scale_up 0x7f05000f +int anim shrink 0x7f050010 +int anim slide_in_left 0x7f050011 +int anim slide_in_right 0x7f050012 +int anim slide_in_top 0x7f050013 int attr actionBarDivider 0x7f010063 int attr actionBarItemBackground 0x7f010064 int attr actionBarPopupTheme 0x7f01005d diff --git a/app/src/main/assets/levelpacks/Grasslands.xml b/app/src/main/assets/levelpacks/Grasslands.xml index fc1fd33..bfdcc0b 100644 --- a/app/src/main/assets/levelpacks/Grasslands.xml +++ b/app/src/main/assets/levelpacks/Grasslands.xml @@ -1,4 +1,5 @@ - + + GRASSLANDS diff --git a/app/src/main/assets/levelpacks/Testcave.xml b/app/src/main/assets/levelpacks/Testcave.xml index 34902b7..b708464 100644 --- a/app/src/main/assets/levelpacks/Testcave.xml +++ b/app/src/main/assets/levelpacks/Testcave.xml @@ -1,4 +1,5 @@ - + + TESTCAVE diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Background.java b/app/src/main/java/com/example/julian/endlessroll/entities/Background.java index 2e327c2..ca0c2ce 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Background.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Background.java @@ -19,6 +19,12 @@ public class Background extends ArrayList { super.add(createPart(-HALF_PART_WIDTH)); } + public void changeTexture(Texture texture) { + this.texture = texture; + for (Entity entity : this) + entity.setTexture(texture); + } + private Entity createPart(float xLeftEdge) { return new Entity(texture, new Vector(xLeftEdge + HALF_PART_WIDTH, 0), PART_WIDTH, 2); } @@ -28,10 +34,11 @@ public class Background extends ArrayList { for (Entity part : this) part.move(movement); if (!super.isEmpty()) { - Entity last = super.get(super.size()-1); - if (last.getRightEdge() -cameraX < 3) { - super.add(createPart(last.getRightEdge()-0.001f)); - }if(super.get(0).getRightEdge() -cameraX< -3){ + Entity last = super.get(super.size() - 1); + if (last.getRightEdge() - cameraX < 3) { + super.add(createPart(last.getRightEdge() - 0.001f)); + } + if (super.get(0).getRightEdge() - cameraX < -3) { super.remove(0); } } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java b/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java index 55ca967..09c6472 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Obstacle.java @@ -1,16 +1,16 @@ package com.example.julian.endlessroll.entities; import com.example.julian.endlessroll.data.Vector; -import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.levels.ObstacleData; +import com.example.julian.endlessroll.levels.worlds.World; /** * Created by Julian on 20.11.2015. */ public class Obstacle extends Entity { - public Obstacle(Texture texture, ObstacleData data, float terrainEdge) { - super(texture, new Vector(data.getX(), data.getY()), data.getWidth(), data.getHeight()); + public Obstacle(World world, ObstacleData data, float terrainEdge) { + super(world.getObstacle(), new Vector(data.getX(), data.getY()), data.getWidth(), data.getHeight()); if (data.isAttachedToGround()) super.setToTerrain(terrainEdge); } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/Player.java b/app/src/main/java/com/example/julian/endlessroll/entities/Player.java index 2799dc2..e6fe466 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/Player.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/Player.java @@ -26,6 +26,7 @@ public class Player extends Entity { } public void init(float terrainEdge, float startSpeed, float endSpeed) { + GameLog.i("init: "+startSpeed+"; "+endSpeed); super.setToTerrain(terrainEdge); super.getPosition().x = START_X; super.setMovement(new Vector(speed, 0)); @@ -37,7 +38,6 @@ public class Player extends Entity { public void setSpeedByProgress(float progress) { this.speed = ((endSpeed - startSpeed) * progress + startSpeed) * SPEED; super.getMovement().x = speed; - GameLog.i("Speed: "+ speed); } public float getProgress() { diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/textures/TexturePack.java b/app/src/main/java/com/example/julian/endlessroll/entities/textures/TexturePack.java index f826be9..a94663b 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/textures/TexturePack.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/textures/TexturePack.java @@ -1,9 +1,14 @@ package com.example.julian.endlessroll.entities.textures; import android.content.Context; +import android.support.annotation.DrawableRes; import com.example.julian.endlessroll.R; import com.example.julian.endlessroll.entities.tools.ToolType; +import com.example.julian.endlessroll.levels.worlds.World; + +import java.util.HashMap; +import java.util.Map; /** * Created by Julian on 05.12.2015. @@ -12,12 +17,9 @@ public class TexturePack { private TextureLoader loader; - public final Texture background; public final Texture goal; - public final Texture terrain; public final Texture playerArrow; public final Texture player; - public final Texture obstacle; public final Texture star; public final Texture blueParticle; public final Texture yellowParticle; @@ -25,13 +27,10 @@ public class TexturePack { public TexturePack(Context context) { loader = new TextureLoader(context); - background = loadTexture(R.drawable.background); goal = loadTexture(R.drawable.goal); - terrain = loadAtlas(R.drawable.terrain, 1, 1); player = loadTexture(R.drawable.ball); playerArrow = loadTexture(R.drawable.playerarrow); - obstacle = loadTexture(R.drawable.obstacle); star = loadTexture(R.drawable.star); blueParticle = loadTexture(R.drawable.blueparticle); @@ -39,14 +38,15 @@ public class TexturePack { redParticle = loadTexture(R.drawable.redparticle); ToolType.loadAllToolTextures(this); + World.loadAllSpecificTextures(this); } - private Texture loadTexture(int id) { + public Texture loadTexture(@DrawableRes int id) { int texId = loader.loadTextureId(id, false); return new Texture(texId, 1, 1); } - public Texture loadAtlas(int id, int atlasWidth, int atlasHeight) { + public Texture loadAtlas(@DrawableRes int id, int atlasWidth, int atlasHeight) { int texId = loader.loadTextureId(id, true); return new Texture(texId, atlasWidth, atlasHeight); } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Ceiling.java b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Ceiling.java index eb2399e..9f04092 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Ceiling.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Ceiling.java @@ -1,12 +1,13 @@ package com.example.julian.endlessroll.entities.tileLists; +import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.entities.textures.TexturePack; @SuppressWarnings("serial") public class Ceiling extends TileList { - public Ceiling(TexturePack textures) { - super(Type.CEILING, textures.terrain); + public Ceiling(Texture texture) { + super(Type.CEILING, texture); } } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Terrain.java b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Terrain.java index 09a800d..3a84510 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Terrain.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/Terrain.java @@ -1,12 +1,13 @@ package com.example.julian.endlessroll.entities.tileLists; +import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.entities.textures.TexturePack; @SuppressWarnings("serial") public class Terrain extends TileList { - public Terrain(TexturePack textures) { - super(TileList.Type.TERRAIN, textures.terrain); + public Terrain(Texture texture) { + super(TileList.Type.TERRAIN, texture); } } diff --git a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java index 2d7791c..fedb0d4 100644 --- a/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java +++ b/app/src/main/java/com/example/julian/endlessroll/entities/tileLists/TileList.java @@ -1,7 +1,9 @@ package com.example.julian.endlessroll.entities.tileLists; +import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.textures.Texture; import com.example.julian.endlessroll.levels.TileData; +import com.example.julian.endlessroll.levels.worlds.World; import java.util.ArrayList; import java.util.List; @@ -34,7 +36,8 @@ public class TileList extends ArrayList { this.texture = texture; } - public void loadData(float edge, List tileData) { + public void loadData(World world, float edge, List tileData) { + this.texture = world.getTerrain(); this.endless = false; super.clear(); for (TileData data : tileData) @@ -42,8 +45,8 @@ public class TileList extends ArrayList { this.edge = edge; } - public void createEndless(float edge) { - loadData(edge, new ArrayList()); + public void createEndless(World world, float edge) { + loadData(world, edge, new ArrayList()); super.add(createEndlessTile(0)); this.endless = true; } diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/LevelManager.java b/app/src/main/java/com/example/julian/endlessroll/levels/LevelManager.java index 58d0a66..9d0ebf8 100644 --- a/app/src/main/java/com/example/julian/endlessroll/levels/LevelManager.java +++ b/app/src/main/java/com/example/julian/endlessroll/levels/LevelManager.java @@ -23,7 +23,7 @@ public class LevelManager extends ArrayList { dataStorageHandler.readLevelProgress(pack); dataStorageHandler.readLevelPackLocked(pack); pack.tryToUnlockFirstLevel(); - if (pack.getId() == 0) + if (pack.getWorld().getIndex() == 0) pack.setLocked(false); super.add(pack); } catch (Exception e) { @@ -37,7 +37,7 @@ public class LevelManager extends ArrayList { Collections.sort(this, new Comparator() { @Override public int compare(LevelPack lhs, LevelPack rhs) { - return lhs.getId() - rhs.getId(); + return lhs.getWorld().getIndex() - rhs.getWorld().getIndex(); } }); } @@ -55,7 +55,7 @@ public class LevelManager extends ArrayList { public void reset() { for (LevelPack pack : this) { pack.reset(); - if (pack.getId() != 0) + if (pack.getWorld().getIndex() != 0) pack.setLocked(true); } } @@ -73,9 +73,9 @@ public class LevelManager extends ArrayList { } public LevelPack nextLevelPack(LevelPack old) { - int oldId = old.getId(); + int oldId = old.getWorld().getIndex(); for (LevelPack pack : this) { - if (pack.getId() == oldId + 1) + if (pack.getWorld().getIndex() == oldId + 1) return pack; } return null; diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/LevelPack.java b/app/src/main/java/com/example/julian/endlessroll/levels/LevelPack.java index 89fce4f..6d2fd0f 100644 --- a/app/src/main/java/com/example/julian/endlessroll/levels/LevelPack.java +++ b/app/src/main/java/com/example/julian/endlessroll/levels/LevelPack.java @@ -1,6 +1,9 @@ package com.example.julian.endlessroll.levels; +import com.example.julian.endlessroll.levels.worlds.World; + import org.simpleframework.xml.Attribute; +import org.simpleframework.xml.Element; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; @@ -12,22 +15,12 @@ import java.util.List; @Root public class LevelPack { - @Attribute - private String name; - @Attribute - private int id; + @Element + private World world; @ElementList private List levels; private boolean locked; - public String getName() { - return name; - } - - public Integer getId() { - return id; - } - public List getLevels() { return levels; } @@ -51,6 +44,10 @@ public class LevelPack { return levels.size() * 3; } + public World getWorld() { + return world; + } + public void tryToUnlockFirstLevel() { try { levels.get(0).setUnlocked(true); diff --git a/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java b/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java new file mode 100644 index 0000000..b2fd432 --- /dev/null +++ b/app/src/main/java/com/example/julian/endlessroll/levels/worlds/World.java @@ -0,0 +1,77 @@ +package com.example.julian.endlessroll.levels.worlds; + +import android.support.annotation.DrawableRes; + +import com.example.julian.endlessroll.R; +import com.example.julian.endlessroll.entities.textures.Texture; +import com.example.julian.endlessroll.entities.textures.TexturePack; + +/** + * Created by Julian on 14.11.2016. + */ + +public enum World { + + GRASSLANDS(0, "Grasslands", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle), + TESTCAVE(1, "Testcave", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle), + ICY_MOUNTAINS(2, "Icy Mountains", R.drawable.grasslands_preview, R.drawable.background, R.drawable.terrain, R.drawable.obstacle); + + private int index; + private String name; + @DrawableRes + private int previewId; + @DrawableRes + private int backgroundId; + @DrawableRes + private int terrainId; + @DrawableRes + private int obstacleId; + + private Texture background; + private Texture terrain; + private Texture obstacle; + + World(int index, String name, @DrawableRes int previewId, @DrawableRes int backgroundId, @DrawableRes int terrainId, @DrawableRes int obstacleId) { + this.index = index; + this.name = name; + this.previewId = previewId; + this.backgroundId = backgroundId; + this.terrainId = terrainId; + this.obstacleId = obstacleId; + } + + public static void loadAllSpecificTextures(TexturePack texturePack){ + for(World world : values()) + world.loadSpecificTextures(texturePack); + } + + private void loadSpecificTextures(TexturePack texturePack) { + background = texturePack.loadTexture(backgroundId); + terrain = texturePack.loadTexture(terrainId); + obstacle = texturePack.loadTexture(obstacleId); + } + + public int getIndex() { + return index; + } + + public String getName() { + return name; + } + + public int getPreviewId() { + return previewId; + } + + public Texture getBackground() { + return background; + } + + public Texture getTerrain() { + return terrain; + } + + public Texture getObstacle() { + return obstacle; + } +} diff --git a/app/src/main/java/com/example/julian/endlessroll/main/DataStorageHandler.java b/app/src/main/java/com/example/julian/endlessroll/main/DataStorageHandler.java index a058d3f..1672b93 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/DataStorageHandler.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/DataStorageHandler.java @@ -84,7 +84,7 @@ public class DataStorageHandler { public void readLevelProgress(LevelPack levelPack) { database.open(); for (Level level : levelPack.getLevels()) { - database.readLevelProgress(levelPack.getId(), level); + database.readLevelProgress(levelPack.getWorld().getIndex(), level); } database.close(); } diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/Game.java b/app/src/main/java/com/example/julian/endlessroll/main/game/Game.java index bf8805e..f374ded 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/Game.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/Game.java @@ -95,7 +95,7 @@ public class Game extends Rendering { if (scene != null) { collectedStars.clear(); particleSystem.deleteAllSources(); - scene.loadLevel(level); + scene.loadLevel(level, levelPack.getWorld()); player = scene.getPlayer(); if (viewManager.isScreenSizeSet()) viewManager.resetViews(); @@ -124,11 +124,13 @@ public class Game extends Rendering { particleSystem.update(timer); float playerProgress = 0; float playerSpeed = 0; + float playerY = 0; if (player != null) { playerProgress = player.getProgress(); playerSpeed = player.getSpeed(); + playerY = player.getPosition().y; } - viewManager.update(gameState == GameState.RUNNING, timer, playerProgress, playerSpeed); + viewManager.update(gameState == GameState.RUNNING, timer, playerProgress, playerSpeed, playerY); switch (gameState) { case RUNNING: if (player.getPosition().y < -2f) { @@ -237,11 +239,11 @@ public class Game extends Rendering { } viewManager.showMessage(levelPack.isLastLevel(level), MessageType.WIN); - dataStorageHandler.writeLevelProgress(levelPack.getId(), level); + dataStorageHandler.writeLevelProgress(levelPack.getWorld().getIndex(), level); Level nextLevel = levelPack.getNextLevel(level); if (nextLevel != null) { nextLevel.setUnlocked(true); - dataStorageHandler.writeLevelProgress(levelPack.getId(), nextLevel); + dataStorageHandler.writeLevelProgress(levelPack.getWorld().getIndex(), nextLevel); }else{ LevelPack nextLevelPack = levelManager.nextLevelPack(levelPack); if(nextLevelPack != null){ diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java b/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java index 7f7d804..3496b23 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/GameScene.java @@ -15,6 +15,7 @@ import com.example.julian.endlessroll.entities.tools.ToolType; import com.example.julian.endlessroll.levels.Level; import com.example.julian.endlessroll.levels.ObstacleData; import com.example.julian.endlessroll.levels.StarData; +import com.example.julian.endlessroll.levels.worlds.World; import com.example.julian.endlessroll.main.GameLog; import java.util.ArrayList; @@ -26,6 +27,7 @@ import java.util.List; */ public class GameScene extends Scene { + private World currentWorld; private CollisionDetector collisionDetector; private Goal goal; @@ -41,11 +43,13 @@ public class GameScene extends Scene { goal = new Goal(textures.goal); } - public void loadLevel(Level level) throws Exception { + public void loadLevel(Level level, World world) throws Exception { + this.currentWorld = world; reset(); lock.lock(); - terrain.loadData(level.getTerrainEdge(), level.getTerrainTiles()); - ceiling.loadData(level.getCeilingEdge(), level.getCeilingTiles()); + background.changeTexture(world.getBackground()); + terrain.loadData(world, level.getTerrainEdge(), level.getTerrainTiles()); + ceiling.loadData(world, level.getCeilingEdge(), level.getCeilingTiles()); super.add(goal); player.init(terrain.getEdge(), level.getStartSpeed(), level.getEndSpeed()); super.add(player); @@ -77,6 +81,7 @@ public class GameScene extends Scene { } public void onStarCollision(Star collisionStar) { + lock.lock(); Iterator iter = stars.iterator(); while (iter.hasNext()) { Star star = iter.next(); @@ -85,10 +90,12 @@ public class GameScene extends Scene { iter.remove(); } } + lock.unlock(); + //TODO: change lock with atomic lists!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } public void addObstacle(ObstacleData data) { - Obstacle obstacle = new Obstacle(textures.obstacle, data, terrain.getEdge()); + Obstacle obstacle = new Obstacle(currentWorld, data, terrain.getEdge()); lock.lock(); super.add(obstacle); obstacles.add(obstacle); @@ -118,8 +125,8 @@ public class GameScene extends Scene { @Override public void update(Timer timer) { super.update(timer); - float playerProgress = player.getPosition().x / goalX; - player.setSpeedByProgress(playerProgress); + player.setSpeedByProgress(player.getProgress() / goalX); + lock.lock(); for (Tool tool : tools) { tool.update(timer); if (tool instanceof Bomb) { @@ -128,6 +135,7 @@ public class GameScene extends Scene { bomb.explode(obstacles, collisionDetector); } } + lock.unlock(); } @Override diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java b/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java index b59f884..6283719 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/Physics.java @@ -35,6 +35,7 @@ public class Physics { } public void applyGravity(GameScene scene) { + scene.lock.lock(); scene.getPlayer().getMovement().y -= GRAVITY_FORCE; for (Tool tool : scene.getTools()) { if (tool.isFloating()) @@ -70,6 +71,7 @@ public class Physics { tool.setToTerrain(orientingHeight); } } + scene.lock.unlock(); } @Nullable diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java b/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java index ad02da3..c81a9c7 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/Scene.java @@ -8,6 +8,7 @@ import com.example.julian.endlessroll.entities.particles.ParticleSystem; import com.example.julian.endlessroll.entities.textures.TexturePack; import com.example.julian.endlessroll.entities.tileLists.Ceiling; import com.example.julian.endlessroll.entities.tileLists.Terrain; +import com.example.julian.endlessroll.levels.worlds.World; import com.example.julian.endlessroll.rendering.Lock; import java.util.ArrayList; @@ -35,9 +36,9 @@ public abstract class Scene extends ArrayList { this.particleSystem = particleSystem; setTexturePack(texturePack); playerArrow = new Entity(textures.playerArrow, new Vector(0, 0.9f), .2f, .2f); - background = new Background(textures.background); - terrain = new Terrain(textures); - ceiling = new Ceiling(textures); + background = new Background(World.GRASSLANDS.getBackground()); + terrain = new Terrain(World.GRASSLANDS.getTerrain()); + ceiling = new Ceiling(World.GRASSLANDS.getTerrain()); player = new Player(textures.player); lock = new Lock(); } diff --git a/app/src/main/java/com/example/julian/endlessroll/main/game/StartScene.java b/app/src/main/java/com/example/julian/endlessroll/main/game/StartScene.java index 50f0253..00342e3 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/game/StartScene.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/game/StartScene.java @@ -3,12 +3,13 @@ package com.example.julian.endlessroll.main.game; import com.example.julian.endlessroll.entities.Entity; import com.example.julian.endlessroll.entities.particles.ParticleSystem; import com.example.julian.endlessroll.entities.textures.TexturePack; +import com.example.julian.endlessroll.levels.worlds.World; public class StartScene extends Scene { public StartScene(TexturePack texturePack, ParticleSystem particleSystem) { super(texturePack, particleSystem); - terrain.createEndless(-.8f); + terrain.createEndless(World.ICY_MOUNTAINS, -.8f); player.init(terrain.getEdge(), 0.5f, 0.5f); super.add(player); } diff --git a/app/src/main/java/com/example/julian/endlessroll/main/screens/StartScreen.java b/app/src/main/java/com/example/julian/endlessroll/main/screens/StartScreen.java index cf13f7d..cfd4729 100644 --- a/app/src/main/java/com/example/julian/endlessroll/main/screens/StartScreen.java +++ b/app/src/main/java/com/example/julian/endlessroll/main/screens/StartScreen.java @@ -77,6 +77,7 @@ public class StartScreen extends GLScreen implements View.OnClic user.setStarCount(100); levelManager.unlockAllLevels(); levelManager.unlockAllPacks(); + } } diff --git a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java index db49902..f1e5058 100644 --- a/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java +++ b/app/src/main/java/com/example/julian/endlessroll/rendering/renderer/GameRenderer.java @@ -104,9 +104,11 @@ public class GameRenderer implements GLSurfaceView.Renderer { GLES20.glClearColor(1, 1, 1, 1.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); + scene.lock.lock(); renderEntities(gl, scene); renderTileList(gl, scene.getTerrain(), scene); renderTileList(gl, scene.getCeiling(), scene); + scene.lock.unlock(); renderFbo(gl); } } @@ -114,12 +116,10 @@ public class GameRenderer implements GLSurfaceView.Renderer { private void renderEntities(GL10 gl, Scene scene) { entityShader.start(); entityShader.loadMVPMatrix(matrixCreator, scene.cameraX); - scene.lock.lock(); for (Entity backgroundPart : scene.getBackground()) renderEntity(gl, backgroundPart); for (Entity entity : scene) renderEntity(gl, entity); - scene.lock.unlock(); entityShader.stop(); } diff --git a/app/src/main/java/com/example/julian/endlessroll/sqlDatabase/MyDatabase.java b/app/src/main/java/com/example/julian/endlessroll/sqlDatabase/MyDatabase.java index fceb3af..f4a8793 100644 --- a/app/src/main/java/com/example/julian/endlessroll/sqlDatabase/MyDatabase.java +++ b/app/src/main/java/com/example/julian/endlessroll/sqlDatabase/MyDatabase.java @@ -19,7 +19,7 @@ import java.util.List; */ public class MyDatabase extends DatabaseAdapter { - private final static int VERSION = 5; + private final static int VERSION = 6; private final static String DATABASE_NAME = "DATABASE"; private SQLTableColumn levelpackColumn, levelColumn, unlockedColumn, completedColumn, starsColumn; private SQLTableColumn idColumn, toolTypeColumn, lockedColumn, boughtColumn; @@ -31,8 +31,6 @@ public class MyDatabase extends DatabaseAdapter { @Override protected void createColumns() { - //TODO: no names needed for columns and tables - //TODO: really use database adapter??? levelpackColumn = new SQLTableColumn("LEVELPACK", SQLTableColumn.ColumnType.INTEGER, SQLTableColumn.ColumnExtra.NOT_NULL); levelColumn = new SQLTableColumn("LEVEL", SQLTableColumn.ColumnType.INTEGER, SQLTableColumn.ColumnExtra.NOT_NULL); unlockedColumn = new SQLTableColumn("UNLOCKED", SQLTableColumn.ColumnType.INTEGER, SQLTableColumn.ColumnExtra.NOT_NULL); @@ -86,13 +84,13 @@ public class MyDatabase extends DatabaseAdapter { public void writeLevelPackLocked(LevelPack levelPack) { ContentValues values = new ContentValues(); - values.put(levelpackColumn.getKey(), levelPack.getId()); + values.put(levelpackColumn.getKey(), levelPack.getWorld().getIndex()); values.put(unlockedColumn.getKey(), levelPack.isLocked() ? 0 : 1); - super.update(levelPackTable, values, levelpackColumn, levelPack.getId()); + super.update(levelPackTable, values, levelpackColumn, levelPack.getWorld().getIndex()); } public void readLevelPackLocked(LevelPack levelPack) { - Cursor cursor = super.getCursor(levelPackTable, levelpackColumn, levelPack.getId()); + Cursor cursor = super.getCursor(levelPackTable, levelpackColumn, levelPack.getWorld().getIndex()); if (cursor.moveToFirst()) { boolean unlocked = cursor.getInt(1) == 1; levelPack.setLocked(!unlocked); diff --git a/app/src/main/java/com/example/julian/endlessroll/views/ToolButtonBar.java b/app/src/main/java/com/example/julian/endlessroll/views/ToolButtonBar.java index a0931e0..1ee0c58 100644 --- a/app/src/main/java/com/example/julian/endlessroll/views/ToolButtonBar.java +++ b/app/src/main/java/com/example/julian/endlessroll/views/ToolButtonBar.java @@ -2,12 +2,15 @@ package com.example.julian.endlessroll.views; import android.content.Context; import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.example.julian.endlessroll.R; import com.example.julian.endlessroll.entities.tools.ToolSlotSettings; import com.example.julian.endlessroll.entities.tools.ToolType; +import com.example.julian.endlessroll.main.GameLog; import com.example.julian.endlessroll.main.game.Game; import com.example.julian.endlessroll.main.game.GameState; @@ -17,8 +20,22 @@ import java.util.List; /** * Created by Julian on 16.01.2016. */ -public class ToolButtonBar implements View.OnClickListener { +public class ToolButtonBar implements View.OnClickListener, Animation.AnimationListener { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + + } + + private Animation fadeIn, fadeOut; private Game game; private ToolSlotSettings toolSlotSettings; private List buttons = new ArrayList<>(4); @@ -27,17 +44,22 @@ public class ToolButtonBar implements View.OnClickListener { private RelativeLayout button3; private RelativeLayout button4; - public ToolButtonBar(Game game, ToolSlotSettings toolSlotSettings, LinearLayout layout) { + + public ToolButtonBar(Game game, ToolSlotSettings toolSlotSettings, LinearLayout layout1) { this.game = game; this.toolSlotSettings = toolSlotSettings; Context context = game.getContext(); - button1 = (RelativeLayout) layout.findViewById(R.id.toolbutton_1); + fadeIn = AnimationUtils.loadAnimation(game.getContext(), R.anim.fade_in); + fadeIn.setAnimationListener(this); + fadeOut = AnimationUtils.loadAnimation(game.getContext(), R.anim.fade_out); + + button1 = (RelativeLayout) layout1.findViewById(R.id.toolbutton_1); button1.setOnClickListener(this); - button2 = (RelativeLayout) layout.findViewById(R.id.toolbutton_2); + button2 = (RelativeLayout) layout1.findViewById(R.id.toolbutton_2); button2.setOnClickListener(this); - button3 = (RelativeLayout) layout.findViewById(R.id.toolbutton_3); + button3 = (RelativeLayout) layout1.findViewById(R.id.toolbutton_3); button3.setOnClickListener(this); - button4 = (RelativeLayout) layout.findViewById(R.id.toolbutton_4); + button4 = (RelativeLayout) layout1.findViewById(R.id.toolbutton_4); button4.setOnClickListener(this); buttons.add(new ToolButton(toolSlotSettings.get(0), context, button1)); buttons.add(new ToolButton(toolSlotSettings.get(1), context, button2)); @@ -45,6 +67,20 @@ public class ToolButtonBar implements View.OnClickListener { buttons.add(new ToolButton(toolSlotSettings.get(3), context, button4)); } + public void setTopPrimary(){ + button1.startAnimation(fadeIn); + button2.startAnimation(fadeIn); + button3.startAnimation(fadeIn); + button4.startAnimation(fadeIn); + } + + public void setBottomPrimary(){ + button1.startAnimation(fadeOut); + button2.startAnimation(fadeOut); + button3.startAnimation(fadeOut); + button4.startAnimation(fadeOut); +} + public void changeToolButtonTypes() { for (int i = 0; i < 4; i++) { buttons.get(i).changeToolSlot(toolSlotSettings.get(i)); @@ -61,7 +97,6 @@ public class ToolButtonBar implements View.OnClickListener { } for (ToolButton button : buttons) button.setProgress(100); - } public void update(float frameTime) { @@ -97,7 +132,7 @@ public class ToolButtonBar implements View.OnClickListener { public void onClick(View v) { if (game.getGameState() == GameState.RUNNING) { ToolType clickedType = ToolType.NONE; - if (v.equals(button1) && !buttons.get(0).isLocked() && buttons.get(0).getToolType() != ToolType.NONE) { + if (v.equals(button1)&& !buttons.get(0).isLocked() && buttons.get(0).getToolType() != ToolType.NONE) { clickedType = buttons.get(0).getToolType(); } else if (v.equals(button2) && !buttons.get(1).isLocked() && buttons.get(0).getToolType() != ToolType.NONE) { clickedType = buttons.get(1).getToolType(); diff --git a/app/src/main/java/com/example/julian/endlessroll/views/ViewManager.java b/app/src/main/java/com/example/julian/endlessroll/views/ViewManager.java index e769036..3519ff6 100644 --- a/app/src/main/java/com/example/julian/endlessroll/views/ViewManager.java +++ b/app/src/main/java/com/example/julian/endlessroll/views/ViewManager.java @@ -118,7 +118,7 @@ public class ViewManager implements View.OnClickListener { countdown.stop(); } - public void update(final boolean gameRunning, final Timer timer, final float playerX, final float playerXMov) { + public void update(final boolean gameRunning, final Timer timer, final float playerX, final float playerXMov, final float playerY) { gameViewHandler.startInUiThread(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/com/example/julian/endlessroll/views/WorldButton.java b/app/src/main/java/com/example/julian/endlessroll/views/WorldButton.java index a3f404c..e6304ba 100644 --- a/app/src/main/java/com/example/julian/endlessroll/views/WorldButton.java +++ b/app/src/main/java/com/example/julian/endlessroll/views/WorldButton.java @@ -10,6 +10,7 @@ import android.widget.TextView; import com.example.julian.endlessroll.R; import com.example.julian.endlessroll.levels.LevelPack; +import com.example.julian.endlessroll.levels.worlds.World; /** * Created by Julian on 01.08.2016. @@ -17,6 +18,7 @@ import com.example.julian.endlessroll.levels.LevelPack; public class WorldButton extends RelativeLayout { private LevelPack levelPack; + private World world; private TextView title; private ImageView previewImage; @@ -27,6 +29,8 @@ public class WorldButton extends RelativeLayout { public WorldButton(Context context, Typeface typeface, View.OnClickListener clickListener, LevelPack levelPack) { super(context); this.levelPack = levelPack; + this.world = levelPack.getWorld(); + LayoutInflater inflater = LayoutInflater.from(context); inflater.inflate(R.layout.world_button, this); super.setOnClickListener(clickListener); @@ -43,10 +47,11 @@ public class WorldButton extends RelativeLayout { updateInformation(); } - public void updateInformation(){ - title.setText(levelPack.getName()); + public void updateInformation() { + title.setText(world.getName()); + previewImage.setImageDrawable(getContext().getResources().getDrawable(world.getPreviewId())); levelCount.setText(levelPack.getUnlockedLevels() + "/" + levelPack.getLevels().size()); - starCount.setText(levelPack.getCollectedStars() + "/"+levelPack.getAvailableStars()); + starCount.setText(levelPack.getCollectedStars() + "/" + levelPack.getAvailableStars()); setLockVisible(levelPack.isLocked()); } diff --git a/app/src/main/res/anim/fade_out.xml b/app/src/main/res/anim/fade_out.xml new file mode 100644 index 0000000..1bf3f51 --- /dev/null +++ b/app/src/main/res/anim/fade_out.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/worlds.xml b/app/src/main/res/layout/worlds.xml index ee19fb2..1dafdbe 100644 --- a/app/src/main/res/layout/worlds.xml +++ b/app/src/main/res/layout/worlds.xml @@ -16,7 +16,8 @@ android:layout_height="match_parent" android:layout_below="@+id/worlds_topbar" android:layout_centerHorizontal="true" - android:layout_margin="10dp" > + android:layout_marginTop="10dp" + android:layout_marginBottom="10dp"> - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + +