From 31a1cf70fd16b8c3374ce7c4b8b5c10db5827b9e Mon Sep 17 00:00:00 2001 From: "theo@manjaro" Date: Wed, 24 Nov 2021 15:47:52 +0100 Subject: [PATCH] Added result screen, and medals --- gamedata/assets/fontmap.png | Bin 7736 -> 7836 bytes gamedata/assets/medals/clock.png | Bin 0 -> 806 bytes gamedata/assets/medals/clockoff.png | Bin 0 -> 724 bytes gamedata/assets/medals/wave.png | Bin 0 -> 797 bytes gamedata/assets/medals/waveoff.png | Bin 0 -> 707 bytes gamedata/assets/trash.png | Bin 0 -> 754 bytes gamedata/game.py | 3 +- gamedata/maps/Level 1/map.json | 11 ++- gamedata/maps/Overworld/map.json | 2 +- gamedata/maps/Overworld/overworldtiles.png | Bin 14398 -> 27178 bytes gamedata/objects/ingame/endflag.py | 14 +++- gamedata/objects/ingame/ennemies/ennemy.py | 4 + gamedata/objects/ingame/ennemies/robot.py | 7 ++ gamedata/objects/ingame/ennemies/trashbag.py | 20 +++++ gamedata/objects/ingame/player.py | 7 +- gamedata/objects/ingame/tileset.py | 7 +- gamedata/objects/levels.py | 32 +++++++- gamedata/objects/results.py | 78 +++++++++++++++++++ gamedata/objects/transition.py | 5 +- gamedata/scenes.py | 1 + 20 files changed, 172 insertions(+), 19 deletions(-) create mode 100644 gamedata/assets/medals/clock.png create mode 100644 gamedata/assets/medals/clockoff.png create mode 100644 gamedata/assets/medals/wave.png create mode 100644 gamedata/assets/medals/waveoff.png create mode 100644 gamedata/assets/trash.png create mode 100644 gamedata/objects/ingame/ennemies/trashbag.py create mode 100644 gamedata/objects/results.py diff --git a/gamedata/assets/fontmap.png b/gamedata/assets/fontmap.png index 9e8f840fc374778b29cefda0d0ad627e211e0416..05b8a0b091bf6388537d74e24b14264a9f5e60e9 100644 GIT binary patch delta 4157 zcmV-D5W?@cJe)m{BmrHKB_DrlmLn?;g#YI%W(f!oh~*$2=gbaf`SZzk)!eSzfBKHy zepEV>1Vtz!=;!?B-}m_!kE~`-)oyLHmUz@rN1lAK^nT3OyQKPhe;?|fZ}RK$NAl;Q z%%Q?(dH-qc{V89^KNoy`%H*5=WguIhANk|CDKR?&M%fRc2x6)r@e-HBW@7k%}Rt}b&Pmz*%&&A#oDDje~OnwmF zbE%vtrM|!OUW$BXLP364r|-vLMmMHfe|yp|sC<9>fz}6Emi7a!nm?zMA4P88pT9l+ zi2fdxSLy$9=W3sC`PYBrYrk3dq#xCf*S*{BYt5`;)<&t@XHj2Ee0}3Q=N55mdze~F zotH91e?13JW9q?a^Q?8uX=aR(~Yd%lze93u%U>vm4^T?~b@#85s z_cF>Z29^uh3rF+!T;z4zk=FCNn{nqYoSKEfgiHST`TXex_eOs!h`j1KU$tUhIY+UX zMj#jOoCYFtKSkA7fxn(VAAxHDL5(U$iws8g_Ykh~KP4zHpbIA|pYL{&zCQy{B5tir zhR&!0YEo31q@HsZp^yeZlc`6~I0%Sp-b^yrQX1G;j$3m{m)EITGlw6JBW56>rIijg zqfEf6RpC#s28Vy97Okq z(bUmKA2!CAlY34^o?JaSVNTCpyt+Q#yu11ExuDOgOIKTc*&1u^yvs&EcH4d19(x`+ zQ0dg8r=5Q6j59A(yXCp{>TS1QyW`Gp)IPBO?fD0&$p?S6{6Z>D?BA$ywD+$eB;-T` zGXTp^6%g+M0ff$hSu&|L2XcW~8kw%p%p^51+Y*R@U_Fxc$`^J|ej^&l{a?5}z5aq* z{-?-20o@-W_jlZWhuRJeUN6MnT^L18h3-4q>)o33IOi@3k#4GI45Wq?KDVdIbt_Nr zQ}Q0kz0Q9{ANeS$)zilvmX0$$-?jCEe3p68yaO6-E}wG^f6nP~#{@JW1%>wJhNHJ~ z67{47_d-OoX9|6GlU5zL=iE0n4|vPHG3c(e->N!rUw>r}8_4W!zgr&nt1b)?I5S8FcTRjc>re6ihhR|FlxLX>CNWhIju zFUt;)x!x*febr8n?&@cA+1R!2-A6e}^_e*&+Sf~OXS;hD&uV?FUKiun4ks(j3k&L{ zB-4L<`r6f2fj>-<1t&owPwM3?+M%+Fo6p?sVFB0ImBPva>UbZS`P){jo|pJp<~r9x zJChCi#HelV)R3Coa!V6yvY(h{@O1~38e)&n!@jHe!%G*B;IHTsk3G zLx3jBL#W3?YEV`bTrG}crs*TmBC>)pc%N_FQOmq`q8Ii9q^Zi!3tqIO2&F_eD}IZfl_M)bK$_Eb2b)a*P5mxQaJHf~68zVgak zj?92H(i^t5p&4_xvDNkUXTQyKpH`s9q@j?JI~4MvR_Syw9GhZN=+%8th_M@D2u4|v)+7|eqPLy3&V71}Wkd~U2Wn9D&YcZFmLhJtgo zFv?2&Wgin>V>Ca85x=fzkz2h?g|{B85$abkP+&{k2~wQF*c8ps&`<`JUbz~jl-S~uF6$pY*qo9DsSTHAxD)AoTf%QZ%9Jy!|E$b3!Z+;R>SyI4dX zFzK{;yXK1Hp{?FGH8FoITQ_}R^w=uRCo9Pzsk&F+s0kcYfd%9OXIrwzfr+zs7vM!p z+rns|=pfc$0sa!zLsD8DX_)=$W_xlxh(y{bm#odvMHEll(eciFM@)&he({i-A9}M1 z#fEY7hAeUo`|5Ri3)9rL#aAmc!>zd&#HITL#`rciP}|@MV~>BwSy82XF+>U-Va6K^ zh%Cbf%WuJ6xEPRJQG`tU12M8+s52!O{j!)gJD)0D?G5c8+zz zXiU)tQi0I1+K@Uj0oJO-S({}L2$|tdG!x(>0o@|jkduG0MwD+N8iWTYZPFqL7#Xcr zqrF>fLdoxuFgmK4&=?=k^x}EU2?vAOXgb}qf==)d*;q`bvI)Sa*;@!!O8OVXn2Bt* zAEe273Sl~%GT}ms-}|ZkAfT`RGay(H$B8#+1>Q7RQzeczi)~`zWrP~q8|wpBW=ty( z1|qo7{hNOrKvUGvM}bsi3^EO6#OhEf#9`?H9(6LfG9$bg4JT&NABZW#AEnD52o6?C zK*sb`uzYgHeC68)<00{6uidR+u9a*;;6UZb^W<#mP0T z#WH~%rKaQUMqom)P#9DK|J!uReme5Xgp(Qz9UF_HEe;ke;*g;_Sr8R*)G8FALZ}s5buhVp zLX%PpEq`cKm}+*71FB{jsYG1NWLL%RSM(u*5C##DnW@i7QWBoy>mEM7-o<#9_qjhu zD3>=G;1h{wnQmCb8^qI_md<&fILu0Nj`*B-%%BSrKXP4h`HgeYVS#6cjdW_BI7}=S zJ6P#pRx(uLDdK2O)hJ)cxSZp>#aXS?SnHnrg@3`kwzAB1n!`w75lfIDLO~5>RA3=S zt44~66z#`7{6mgkB9}t0G8j1)P=yNF@q_=t?{3Y)uoK11oUqM7uRh~*#jRa5L^M1gb-XLHZd?}I5symEn+q^H7ztSHZUz=IW#scIXGlCVPiEnHZU_XlLQe< z2{cqOG&(XgIy19a5pM_N7xn7VJkE~+S=b4W2Tj-w|+E!*y=OX@02Xp^W|CYD3HkliK&t-z5H5> zcgr9|l!R4eB@g6B?g5H#(aP~&O?H#O^0?c_Av zL|6s~@71W(zD0*=1y$>NYD1EH4Y7b=RRP&vl6H`9%<&%^(o}n=h^?wm|=QLxLG-3t4(yG+b4%K(f z07JL>UNTz-nYW#!_L5$ZiAmC-vQT`r-sRPh@gFqk<2-E?;bLtUrJ=(M$&1jCTEb`XQP_0FBGbgwn$1+D- z0QAsLEPw)sn4HkTQ!64XX`~mwNbbINFl%4xa({({RKGZRYe7R(KwINQ^~v*Hh}Q0i z4k?-*@BgSm!d2ewQDeu$=Mi5F1a`4=vQ(Z^G*pHQ$4hFX)=oK~r3@8Ku_~8ZtC8JW zUCqghro(&RIDqI-E4Ni1DJ#(XhKR(&dP4*P?QH>pz@Bl+2Z48WI(kDy3oo?V+2fXk zlz+yF1ZXr6wXAwQ>zqcezENM}Xgt$lJ^F*%6uAwB1A2{3Ah4UsNmD>NWAIyplxIOB z8aONg4LQb{4bQ53#MZriQZuP&78;h~;(9<_G6H-tlLj?ASA^%!J+m2VUp_e=>@fw{Fv0BkI zN9$Qw?VS+e{(uO=00000NkvXX Hu0mjfRM+Xg delta 4213 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
@YAHqVFym*g{3s%oT}%&GG=WGPAk zoaTR5^y{@sB3XsM-T%T%L#)~(>ocSc&6F8(Un9&V(hFqMsy%|2hBz%%u}sqTRh;Lg kA*{FX>MFnQm|i{Se^)G&`pn}%7ytkO07*qoM6N<$fEX>4Tx04R}tkv&MmKpe$iQ^l`}g9S@*$WWauh>AFB6^c-y)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HI!Hs@X9PsG4P@ z;xRFkT@|}t(T5OvFodwgOnokyOu%z|-NVP%yC~1{KKJM7S8^r;d?N8I(+!JwgLrz= z(mC%F2U$^4h|h_~47wokBiCh@-#8Z>7I+@wGZ=zOv5j}f427iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrH|z&3Dk-O}Ve;Bp5DJ?WAmIg+2Ikk13}XY@^3VDJ{`U2}VD?&I_UNK;pd8{ps& z7%foty2rb_+k5->OtZfqRY`K2T8mx700006VoOIv03QGj02~Eu%4q-q010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{0068>L_t(I%dJzp4TLZZefAisQ>KqH0LlvV%te1Ipc??u zQ&O`AR7Mu(B&R#vM0)Xi{u2!AyWz0#*L$QpMiy~iCX0_0^M?>=vJk~_-&O#C^8s2o z#e9j7CTpVe;d(VDLL$Oes^Zwf0DyILNx5eGwj#xhd7036!@=J~srj&0E=8EX>4Tx04R}tkv&MmKpe$iQ^l`}g9S@*$WWauh>AFB6^c-y)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HI!Hs@X9PsG4P@ z;xRFkT@|}t(T5OvFodwgOnokyOu%z|-NVP%yC~1{KKJM7S8^r;d?N8I(+!JwgLrz= z(mC%F2U$^4h|h_~47wokBiCh@-#8Z>7I+@wGZ=zOv5j}f427iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrH|z&3Dk-O}Ve;Bp5DJ?WAmIg+2Ikk13}XY@^3VDJ{`U2}VD?&I_UNK;pd8{ps& z7%foty2rb_+k5->OtZfqRY`K2T8mx700006VoOIv0M`JU0DT=~LZ$!!010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008w#L_t(I%VT7~0($z_{l_L=QW(UDF2;yWgf-Bs1@D7~qu(*q1)1*#@p8j?J zSlo4-%dmRo0L%s0oDT!YF2LngCS(b8e?Q*0j)4$h!ljv5z(hy^A%juU z!A&I*tcqlvf>6Ape(w$TbbuUaUiK;|(U;y>hKS00vl#FuozSY5(3XBPIPOqI+; bZgvI$sV#qI9!R0n00000NkvXXu0mjfWH?>0 literal 0 HcmV?d00001 diff --git a/gamedata/assets/medals/waveoff.png b/gamedata/assets/medals/waveoff.png new file mode 100644 index 0000000000000000000000000000000000000000..538ba9336c8970cd53466e800e3eb7b1c889f05a GIT binary patch literal 707 zcmV;!0zCbRP)EX>4Tx04R}tkv&MmKpe$iQ^l`}g9S@*$WWauh>AFB6^c-y)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HI!Hs@X9PsG4P@ z;xRFkT@|}t(T5OvFodwgOnokyOu%z|-NVP%yC~1{KKJM7S8^r;d?N8I(+!JwgLrz= z(mC%F2U$^4h|h_~47wokBiCh@-#8Z>7I+@wGZ=zOv5j}f427iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrH|z&3Dk-O}Ve;Bp5DJ?WAmIg+2Ikk13}XY@^3VDJ{`U2}VD?&I_UNK;pd8{ps& z7%foty2rb_+k5->OtZfqRY`K2T8mx700006VoOIv0M`JU0DT=~LZ$!!010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{005gwL_t(I%VT7~0wP?K|6>zhv3o8fx)>uijmJ;!#HOFY z(%c=xAVy@(FpV&U=m1$BW(Xs)W?UMv83Z$g1(%{{cdnrDrBrmVs$;}vJ4~~biVg}J zn=4rG+5GIz6`VH1024k*LYgrQK=(H~AFlz#C??qp#2Ac{4&;TUafSu5K@ZEX>4Tx04R}tkv&MmKpe$iQ^l`}g9S@*$WWauh>AFB6^c-y)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HI!Hs@X9PsG4P@ z;xRFkT@|}t(T5OvFodwgOnokyOu%z|-NVP%yC~1{KKJM7S8^r;d?N8I(+!JwgLrz= z(mC%F2U$^4h|h_~47wokBiCh@-#8Z>7I+@wGZ=zOv5j}f427iiRM`}^3o8z+GO8Mx9~{z@H~`6Rv8 z(jrH|z&3Dk-O}Ve;Bp5DJ?WAmIg+2Ikk13}XY@^3VDJ{`U2}VD?&I_UNK;pd8{ps& z7%foty2rb_+k5->OtZfqRY`K2T8mx700006VoOIv0M`JU0DT=~LZ$!!010qNS#tmY z3ljhU3ljkVnw%H_000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{007EKL_t(I%e_)D4udcZJfr@A4F(j6k=(>K1OI?loV4P!jsf6OB1zoz!}|m@KGrvh;Zd^AJa#PAM-O{DS#`Z`2pxD09e{ kW@`i2HMF(1M`4_$7ylz&NJtys5&!@I07*qoM6N<$f)koT{r~^~ literal 0 HcmV?d00001 diff --git a/gamedata/game.py b/gamedata/game.py index 881dadb..8502883 100644 --- a/gamedata/game.py +++ b/gamedata/game.py @@ -95,6 +95,7 @@ class Game(): self.globals["hitpose"] = False self.globals["finishedlevels"] = [] # Levels where the player went to the end self.globals["completedlevels"] = [] # Levels where the player kicked all non-respawnable ennemies + self.globals["speedrunlevels"] = [] # Levels where the player finished fast enough self.globals["allunlocked"] = True self.scaleCamera() @@ -289,7 +290,7 @@ class Game(): self.globals["tempsubsurface"] = pygame.Surface((neww,newh)) def getchar(self,char,width=9,height=9): - chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@\"#&()*:;?!abcdefghijklmnopqrstuvwxyz" + chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@\"#&()*:;?!abcdefghijklmnopqrstuvwxyz/" charsperline = self.fontmap.get_width()//width result = None if char in chars: diff --git a/gamedata/maps/Level 1/map.json b/gamedata/maps/Level 1/map.json index f3e2170..57344ee 100644 --- a/gamedata/maps/Level 1/map.json +++ b/gamedata/maps/Level 1/map.json @@ -1704,6 +1704,7 @@ [1, 0], [1, 0], [1, 0], + [1, 0], [2, 0], [-1], [-1], @@ -1734,7 +1735,6 @@ [-1], [-1], [-1], - [-1], [10, 6], [9, 6], [10, 6], @@ -1881,6 +1881,7 @@ [1, 1], [3, 0], [1, 2], + [1, 2], [2, 2], [-1], [-1], @@ -1911,7 +1912,6 @@ [-1], [-1], [-1], - [-1], [10, 7], [9, 7], [10, 7], @@ -6095,7 +6095,7 @@ {"name": "Solid", "id": 31, "_eid": "17026310", "x": 1056, "y": 208, "width": 80, "height": 64, "originX": 0, "originY": 0}, {"name": "Solid", "id": 32, "_eid": "17026310", "x": 1136, "y": 192, "width": 64, "height": 80, "originX": 0, "originY": 0}, {"name": "Solid", "id": 33, "_eid": "17026310", "x": 1232, "y": 176, "width": 96, "height": 16, "originX": 0, "originY": 0}, - {"name": "Solid", "id": 34, "_eid": "17026310", "x": 1360, "y": 144, "width": 160, "height": 32, "originX": 0, "originY": 0}, + {"name": "Solid", "id": 34, "_eid": "17026310", "x": 1360, "y": 144, "width": 176, "height": 32, "originX": 0, "originY": 0}, {"name": "Solid", "id": 35, "_eid": "17026310", "x": 1392, "y": 176, "width": 96, "height": 16, "originX": 0, "originY": 0}, {"name": "Solid", "id": 36, "_eid": "17026310", "x": 1584, "y": 224, "width": 80, "height": 48, "originX": 0, "originY": 0}, {"name": "Solid", "id": 37, "_eid": "17026310", "x": 1664, "y": 208, "width": 48, "height": 64, "originX": 0, "originY": 0}, @@ -6335,7 +6335,10 @@ {"x": 2448, "y": 288} ], "values": {"Speed": 3} - } + }, + {"name": "TrashBag", "id": 30, "_eid": "74601465", "x": 1680, "y": 192, "originX": 0, "originY": 0}, + {"name": "TrashBag", "id": 31, "_eid": "74601465", "x": 1456, "y": 224, "originX": 0, "originY": 0}, + {"name": "TrashBag", "id": 32, "_eid": "74601465", "x": 1088, "y": 192, "originX": 0, "originY": 0} ] } ] diff --git a/gamedata/maps/Overworld/map.json b/gamedata/maps/Overworld/map.json index aa43faf..a9b8e56 100644 --- a/gamedata/maps/Overworld/map.json +++ b/gamedata/maps/Overworld/map.json @@ -1583,7 +1583,7 @@ {"x": 512, "y": 96}, {"x": 640, "y": 144} ], - "values": {"0": "Beginning", "1": "The Docks"} + "values": {"0": "Beginning;20", "1": "The Docks;40"} } ] } diff --git a/gamedata/maps/Overworld/overworldtiles.png b/gamedata/maps/Overworld/overworldtiles.png index 4d3ccf9448914d998198ec985b833f5cecea6020..74d1012441df99d24ca9b16492e5c9eb960dee06 100644 GIT binary patch delta 22335 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 Hu0mjf8|3?e delta 9441 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 UOv#3$|2hLwQBaq!k~I(bA9!?O761SM diff --git a/gamedata/objects/ingame/endflag.py b/gamedata/objects/ingame/endflag.py index c356f05..5f267da 100644 --- a/gamedata/objects/ingame/endflag.py +++ b/gamedata/objects/ingame/endflag.py @@ -1,5 +1,5 @@ from gamedata.objects.ingame.ennemies.ennemy import Ennemy -from gamedata.objects.transition import Transition +from gamedata.objects.results import Results class EndFlag(Ennemy): @@ -54,12 +54,18 @@ class EndFlag(Ennemy): self.game.addParticle(sprites,self.rect.center[0]+offsetx,self.rect.center[1]+offsety,velx=velx,vely=vely,modvely=0.1,fps=2) if not self.game.globals["levelname"] in self.game.globals["finishedlevels"]: self.game.globals["finishedlevels"].append(self.game.globals["levelname"]) + if self.game.globals["totaltrashes"]==self.game.globals["trashes"]: + if not self.game.globals["levelname"] in self.game.globals["completedlevels"]: + self.game.globals["completedlevels"].append(self.game.globals["levelname"]) + if int(self.game.globals["timetobeat"])>=int(self.game.globals["timer"]): + if not self.game.globals["levelname"] in self.game.globals["speedrunlevels"]: + self.game.globals["speedrunlevels"].append(self.game.globals["levelname"]) self.sfx.play() if self.ended: - if self.endtimer.tick(self.game.dt): - t = Transition(self.game) - self.game.gameloop.summon(t) + if self.endtimer.tick(self.game.dt) and self.endtimer.getloops()<2: + r = Results(self.game) + self.game.gameloop.summon(r) def draw(self): sprite = self.sprites[int(self.spriteindex)%len(self.sprites)] diff --git a/gamedata/objects/ingame/ennemies/ennemy.py b/gamedata/objects/ingame/ennemies/ennemy.py index 42c2807..5f402d9 100644 --- a/gamedata/objects/ingame/ennemies/ennemy.py +++ b/gamedata/objects/ingame/ennemies/ennemy.py @@ -25,6 +25,9 @@ class Ennemy(Movable): self.dustparticles = game.getSpriteDir("particles/dust/") + def deadtrigger(self): + pass + def step(self): if not self.dead: @@ -45,6 +48,7 @@ class Ennemy(Movable): if self.rect.colliderect(self.player.hitrect): # Die self.dead = True + self.deadtrigger() # Add particles self.game.addParticle(self.dustparticles,self.rect.center[0]+self.particleoffsetx,self.rect.center[1]+self.particleoffsety) # Dust self.game.addParticle([self.deadsprite],self.rect.center[0]+self.particleoffsetx,self.rect.center[1]+self.particleoffsety,fps=0.6,vely=-1.5,modvely=0.15) # Die sprite diff --git a/gamedata/objects/ingame/ennemies/robot.py b/gamedata/objects/ingame/ennemies/robot.py index 17635ca..ceccfdc 100644 --- a/gamedata/objects/ingame/ennemies/robot.py +++ b/gamedata/objects/ingame/ennemies/robot.py @@ -16,6 +16,8 @@ class Robot(Ennemy): self.falling = 20 self.spriteindex = 0 + self.respawn = False + self.gravityway = 1 # Vertical flip self.walkingway = 1 # Horizontal flip @@ -29,6 +31,11 @@ class Robot(Ennemy): else: self.endpoints = None + self.game.globals["totaltrashes"]+=1 + + def deadtrigger(self): + self.game.globals["trashes"]+=1 + def step(self): if not self.dead: diff --git a/gamedata/objects/ingame/ennemies/trashbag.py b/gamedata/objects/ingame/ennemies/trashbag.py new file mode 100644 index 0000000..442bd52 --- /dev/null +++ b/gamedata/objects/ingame/ennemies/trashbag.py @@ -0,0 +1,20 @@ +from gamedata.objects.ingame.ennemies.ennemy import Ennemy + +class TrashBag(Ennemy): + + def __init__(self,*args): + + super().__init__(*args) + + self.sprite = self.game.sprite_lib["trash.png"] + self.deadsprite = self.sprite + + self.rect[2],self.rect[3] = self.sprite.get_size() + + self.respawn = False + self.canhit = False + + self.game.globals["totaltrashes"]+=1 + + def deadtrigger(self): + self.game.globals["trashes"]+=1 diff --git a/gamedata/objects/ingame/player.py b/gamedata/objects/ingame/player.py index f8e2790..d955713 100644 --- a/gamedata/objects/ingame/player.py +++ b/gamedata/objects/ingame/player.py @@ -132,6 +132,7 @@ class Player(Movable): if canmove: if self.canmove: self.horspd=(keys["right"]["pressed"]-keys["left"]["pressed"])*self.game.dt*self.speed + self.game.globals["timer"]+=self.game.dt if self.landingtimer<=0: self.sprite = self.spritestill @@ -293,9 +294,9 @@ class Player(Movable): self.horkb = hor self.verkb = ver self.canfastfall = True - self.game.globals["scamerax"] = 4 - self.game.globals["scameray"] = 4 if resetcombo: + self.game.globals["scamerax"] = 4 + self.game.globals["scameray"] = 4 self.combo = 0 self.hurtsfx.play() self.hp-=1 @@ -309,7 +310,7 @@ class Player(Movable): self.rect[2],self.rect[3] = 0,0 self.dead = True - t = Transition(self.game,time=1,holdtime=0.5,level=self.game.globals["levelname"]) + t = Transition(self.game,time=1,holdtime=0.5,level="Level "+str(self.game.globals["levelname"]+1)) self.game.gameloop.summon(t) self.game.addParticle([self.spritehurt],self.rect.center[0],self.rect.center[1],fps=0.6,vely=-1.5,modvely=0.15) # Die sprite diff --git a/gamedata/objects/ingame/tileset.py b/gamedata/objects/ingame/tileset.py index 15d87a0..be9ce87 100644 --- a/gamedata/objects/ingame/tileset.py +++ b/gamedata/objects/ingame/tileset.py @@ -4,6 +4,7 @@ from gamedata.objects.ingame.ennemies.crate import Crate from gamedata.objects.ingame.ennemies.balloon import Balloon from gamedata.objects.ingame.ennemies.spring import Spring from gamedata.objects.ingame.ennemies.waterchange import WaterChange +from gamedata.objects.ingame.ennemies.trashbag import TrashBag from gamedata.objects.ingame.endflag import EndFlag from gamedata.objects.levels import Levels @@ -20,6 +21,10 @@ class TilesetRenderer(BaseObject): self.level = game.levels_lib[mapfoldername] self.reinit(self.level) + self.game.globals["totaltrashes"] = 0 + self.game.globals["trashes"] = 0 + self.game.globals["timer"] = 0 + self.bgs = [game.sprite_lib["fallbackground.png"]] if len(self.level["backgrounds"]): self.bgs = self.level["backgrounds"] @@ -72,7 +77,7 @@ class TilesetRenderer(BaseObject): self.layers = [] self.spawns = [] spawnlists = {"Spawns":self.spawns} - ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring,"WaterChange":WaterChange,"Levels":Levels,"End":EndFlag} + ennemies = {"Robot":Robot,"Crate":Crate,"Balloon":Balloon,"Spring":Spring,"WaterChange":WaterChange,"Levels":Levels,"End":EndFlag,"TrashBag":TrashBag} self.queue = [] # For spawning ennemies after beeing initialized if "layers" in json.keys() and type(json["layers"]).__name__=="list": solidlayer = False diff --git a/gamedata/objects/levels.py b/gamedata/objects/levels.py index 0d30264..317e756 100644 --- a/gamedata/objects/levels.py +++ b/gamedata/objects/levels.py @@ -17,6 +17,11 @@ class Levels(BaseObject): self.playerwalking = self.game.getSpriteDir("player/walking/") self.playerstill = self.game.sprite_lib["player/still.png"] + self.medalwave = self.game.sprite_lib["medals/wave.png"] + self.medalwaveoff = self.game.sprite_lib["medals/waveoff.png"] + self.medalclock = self.game.sprite_lib["medals/clock.png"] + self.medalclockoff = self.game.sprite_lib["medals/clockoff.png"] + self.flip = False self.moving = False self.spriteindex = 0 @@ -28,14 +33,14 @@ class Levels(BaseObject): v["x"]+=8 # Center on tiles v["y"]+=8 self.flagsindex.append(self.game.lib.randint(1,3)) - + # Get sprites for "Level N" sprite = self.game.getchars("Level "+str(i+1)) self.textnumbers.append(sprite) # Get sprites for the level's name if str(i) in customvalues.keys(): - sprites = self.game.getchars(customvalues[str(i)]) + sprites = self.game.getchars(customvalues[str(i)].split(";")[0]) self.names.append(sprites) else: self.names.append(None) @@ -64,7 +69,13 @@ class Levels(BaseObject): # Launch the level t = Transition(self.game,level = "Level "+str(self.cursor+1)) self.launched = True - self.game.globals["levelname"] = "Level "+str(self.cursor+1) + self.game.globals["levelname"] = self.cursor + if str(self.cursor) in self.customvalues.keys(): + props = self.customvalues[str(self.cursor)].split(";") + self.game.globals["levellore"] = props[0] + self.game.globals["timetobeat"] = props[1] + else: + self.game.globals["levellore"] = None self.game.gameloop.summon(t) self.cursor = min(self.cursor,len(self.nodes)-1) self.cursor = max(0,self.cursor) @@ -87,7 +98,7 @@ class Levels(BaseObject): def draw(self): for i,v in enumerate(self.nodes): # Draw flags sprites = self.blueflags - if "Level "+str(i+1) in self.game.globals["finishedlevels"]: + if i in self.game.globals["finishedlevels"]: sprites = self.greenflags sprite = sprites[int(self.flagsindex[i])%len(sprites)] x = v["x"]-sprite.get_width()/2-self.game.globals["camerax"]+8 @@ -110,6 +121,19 @@ class Levels(BaseObject): x = self.nodes[self.cursor]["x"]-self.game.globals["camerax"]-sprite.get_width()/2 y = self.nodes[self.cursor]["y"]-self.game.globals["cameray"]-sprite.get_height()/2-50 self.game.window.blit(sprite,[x,y]) + # Medals + wave = self.medalwaveoff + if self.cursor in self.game.globals["completedlevels"]: + wave = self.medalwave + clock = self.medalclockoff + if self.cursor in self.game.globals["speedrunlevels"]: + clock = self.medalclock + + x = self.nodes[self.cursor]["x"]-self.game.globals["camerax"] + y = self.nodes[self.cursor]["y"]-72 + self.game.window.blit(wave,[x-wave.get_width()-1,y]) + self.game.window.blit(clock,[x+1,y]) + # Draw the level's name if self.names[self.cursor]: sprite = self.names[self.cursor] diff --git a/gamedata/objects/results.py b/gamedata/objects/results.py new file mode 100644 index 0000000..907a92d --- /dev/null +++ b/gamedata/objects/results.py @@ -0,0 +1,78 @@ +from gamedata.objects.base import BaseObject +from gamedata.objects.transition import Transition + +class Results(BaseObject): + + def __init__(self,game): + + super().__init__(0,0,game) + + self.maxcount = self.game.globals["totaltrashes"] + self.currentcount = 0 + self.count = self.game.globals["trashes"] + self.text = self.game.getchars("Cleared : 0 / "+str(self.maxcount)) + self.levelname = self.game.getchars("Level "+str(self.game.globals["levelname"]+1)) + self.levellore = None + txt = "Time : "+str(int(self.game.globals["timer"])) + txt += " ( "+str(self.game.globals["timetobeat"])+" for medal )" + self.seconds = self.game.getchars(txt) + if self.game.globals["levellore"]: + self.levellore = self.game.getchars(self.game.globals["levellore"]) + + self.fill = self.game.pygame.Surface((self.game.globals["cameraw"],self.game.globals["camerah"])) + self.fill.fill([62,33,55]) + + self.fadetimer = self.game.lib.Timer(2) + self.faded = False + self.alphamax = 200 + self.alpha = 0 + + self.medalwave = self.game.sprite_lib["medals/wave.png"] + self.medalclock= self.game.sprite_lib["medals/clock.png"] + + self.transition = False + + self.depth = 3 + + def step(self): + + past = int(self.currentcount) + self.currentcount+=self.game.dt + self.currentcount += (self.count - self.currentcount)*self.game.dt + self.currentcount = min(self.currentcount,self.count) + + if int(self.currentcount)>past: + # Make a noise + self.text = self.game.getchars("Cleared : "+str(int(self.currentcount))+" / "+str(self.maxcount)) + + if not self.transition: + keys = ["up","down","left","right"] + for i in keys: + self.transition = self.transition or self.game.inputs["keys"][i]["timer"]==1 + if self.transition: + t = Transition(self.game) + self.game.gameloop.summon(t) + + if not self.faded: + self.alpha = (1-self.fadetimer.getratio())*self.alphamax + if self.fadetimer.tick(self.game.dt): + self.faded = True + else: + self.alpha = self.alphamax + + def draw(self): + self.fill.set_alpha(self.alpha) + self.game.window.blit(self.fill,[0,0]) + cx = self.game.globals["cameraw"]/2 + cy = self.game.globals["camerah"]/2 + + self.game.lib.drawcenter(self.game,self.levelname,cx,cy-50) # Level names + if self.levellore: + self.game.lib.drawcenter(self.game,self.levellore,cx,cy-39) + + self.game.lib.drawcenter(self.game,self.text,cx,cy) # Clean + self.game.lib.drawcenter(self.game,self.seconds,cx,cy+20) + if self.currentcount == self.maxcount: # Medals + self.game.lib.drawcenter(self.game,self.medalwave,cx+150,cy) + if int(self.game.globals["timetobeat"]) >= int(self.game.globals["timer"]): + self.game.lib.drawcenter(self.game,self.medalclock,cx+150,cy+20) diff --git a/gamedata/objects/transition.py b/gamedata/objects/transition.py index ba6c577..15f83d6 100644 --- a/gamedata/objects/transition.py +++ b/gamedata/objects/transition.py @@ -28,7 +28,10 @@ class Transition(BaseObject): else: if self.holdtimer.tick(self.game.dt): if self.level: - self.game.scenes.ingame(self.game,level = self.level) + if self.level!="END": + self.game.scenes.ingame(self.game,level = self.level) + else: + self.game.scenes.end(self.game) else: self.game.scenes.overworld(self.game) diff --git a/gamedata/scenes.py b/gamedata/scenes.py index a843365..abcd4bf 100644 --- a/gamedata/scenes.py +++ b/gamedata/scenes.py @@ -9,6 +9,7 @@ from gamedata.objects.ingame.manager import FightManager from gamedata.objects.ingame.hitbox import Hitbox from gamedata.objects.ingame.tileset import TilesetRenderer from gamedata.objects.ingame.water import Water +from gamedata.objects.results import Results def main(game): game.scaleCamera()