From 0d363f0c8d75732b4ebe43db1f74808694b699a1 Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Sun, 27 Oct 2024 23:52:11 +0100 Subject: [PATCH] two minutes to miiidnight --- CMakeLists.txt | 18 ++- README.md | 12 +- assets-fx/anvil0.png | Bin 0 -> 5103 bytes assets-fx/anvil1.png | Bin 0 -> 5684 bytes assets-fx/anvil2.png | Bin 0 -> 5701 bytes assets-fx/anvil3.png | Bin 0 -> 5475 bytes assets-fx/blood.png | Bin 0 -> 1242 bytes assets-fx/fxconv-metadata.txt | 36 +++++ assets-fx/hands0.png | Bin 0 -> 944 bytes assets-fx/hands1.png | Bin 0 -> 998 bytes assets-fx/hands2.png | Bin 0 -> 1015 bytes assets-fx/icon.png | Bin 7429 -> 11045 bytes assets-fx/sprites/anvil_pickup.png | Bin 0 -> 4629 bytes assets-fx/sprites/fxconv-metadata.txt | 5 + assets-fx/title.png | Bin 0 -> 1016 bytes eng/moteur.c | 2 +- eng/sprites.c | 8 +- include/C3D/config.h | 2 +- include/C3D/fixed.h | 8 +- include/C3D/game.h | 14 +- include/C3D/sprites.h | 2 +- include/C3D/utils.h | 6 +- src/game.c | 111 +++++++++++--- src/game.h | 29 +++- src/gfx.c | 64 +++++++- src/gfx.h | 13 ++ src/main.c | 54 ++++--- src/map.c | 201 +++++++++++++++++++++++--- src/map.h | 22 +++ 29 files changed, 506 insertions(+), 101 deletions(-) create mode 100644 assets-fx/anvil0.png create mode 100644 assets-fx/anvil1.png create mode 100644 assets-fx/anvil2.png create mode 100644 assets-fx/anvil3.png create mode 100644 assets-fx/blood.png create mode 100644 assets-fx/hands0.png create mode 100644 assets-fx/hands1.png create mode 100644 assets-fx/hands2.png create mode 100644 assets-fx/sprites/anvil_pickup.png create mode 100644 assets-fx/title.png diff --git a/CMakeLists.txt b/CMakeLists.txt index b5ca519..3d907db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ find_package(Gint 2.9 REQUIRED) find_package(LibProf 2.1 REQUIRED) # le nom de votre jeu -set(NAMEOFGAME "Test3D") +set(NAMEOFGAME "Illusion3D") # Nom de l'auteur -> votre nom/pseudo set(AUTHOR "Fcalva") @@ -30,8 +30,20 @@ set(SOURCES ) set(ASSETS + assets-fx/title.png + assets-fx/blood.png + + assets-fx/hands0.png + assets-fx/hands1.png + assets-fx/hands2.png + assets-fx/anvil0.png + assets-fx/anvil1.png + assets-fx/anvil2.png + assets-fx/anvil3.png + assets-fx/sprites/friendlyguy.png assets-fx/sprites/friendlyguy1.png + assets-fx/sprites/anvil_pickup.png assets-fx/textures/briques0.png assets-fx/textures/buisson1.png @@ -53,8 +65,8 @@ target_link_options(Copy3DEngine PRIVATE -Wl,--print-memory-usage) if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) generate_g1a(TARGET Copy3DEngine OUTPUT ${NAMEOFGAME}".g1a" - NAME ${NAMEOFGAME} ICON assets-fx/icon.png) + NAME "Illu3D" ICON assets-fx/icon.png) else() generate_g3a(TARGET Copy3DEngine OUTPUT ${NAMEOFGAME}".g3a" - NAME ${NAMEOFGAME} ICONS assets-fx/icon.png assets-fx/icon.png) + NAME "Illu3D" ICONS assets-fx/icon.png assets-fx/icon.png) endif() diff --git a/README.md b/README.md index bb7bbb7..cef9151 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Copy3DEngine +### Illusion 3D, ma participation au CPC #31 +Je ne recommande pas de prendre ce code comme base de quoi que ce soit :E -Un moteur de raycasting, fork de Maze3D, avec le but de faciliter la création de jeux de style 3D +Tout est sous license GPLv3, assets inclus -### Utiliser - -Pour faire votre propre jeu, vous avez juste à changer le nom du jeu dans CMakeLists.txt, inclure vos propres assets dans assets-cg/ et les inclure dans main.c. -Vous pouvez aussi éditer la carte dans map.c, et sa taille dans map.h +Dépendances : +- gint +- libprof diff --git a/assets-fx/anvil0.png b/assets-fx/anvil0.png new file mode 100644 index 0000000000000000000000000000000000000000..48cf6ca92099ad8e7717b46b60ed084dd098d8c3 GIT binary patch literal 5103 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 literal 0 HcmV?d00001 diff --git a/assets-fx/anvil2.png b/assets-fx/anvil2.png new file mode 100644 index 0000000000000000000000000000000000000000..e275cd7dcc80a871695ed02c7bc968004add0785 GIT binary patch literal 5701 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 literal 0 HcmV?d00001 diff --git a/assets-fx/anvil3.png b/assets-fx/anvil3.png new file mode 100644 index 0000000000000000000000000000000000000000..306059e31b9969e73700ee3a719312c2fa0ca750 GIT binary patch literal 5475 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 P?ErTdZ|7piu;l*$Qm0Kk literal 0 HcmV?d00001 diff --git a/assets-fx/blood.png b/assets-fx/blood.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4a1f401866cfab42aeb455f2b38641c3c2b2d7 GIT binary patch literal 1242 zcmV<01SR{4P)EX>4Tx04R}tkv&MmKpe$iTg6f;4t5ZA$WX<>4t^kxwF*V35Nd^19ZW9$f+h_~ zii@M*T5#}VvFhOBtgC~oAP9bdI6F8gx=4xtOA0MwJUH&hyL*qjcYwc9VXD~`2UN{6 z(#eF7&8-SOuLxlXL5yKSVx~SPiYa)GuY36TdKcqa-sk=ty-MC>fKMQfGu^O=H;898 zEuHf|afFp5h4`F!+@K2*KXP4m`HgeYVL#7|7@71uafDbXcCg&RtYoOf)5K9l)hOSe zby?xO#aXS?SnHnrh2gxmvdndw!$@KgOAsMIMh#_DU?E1UMv93v?I%3^gN|P$mrSlQ z7&#VDg$l{>ga5(rZq35fq?;5@0NpRP{V@Xc>;lcYZGRuzcJl-XJOfu++h1(}v!A5b z+gkJp=-UP^uG^Zt2VCv|15dhSNRAYs=`R$3_cQvY9MFFYgx1{NTKhPC05a57>IOJC z1V)RLz3%buU}tato@w>>1MGWp*Ru(@mjD0&24YJ`L;wr`mH_wW^!0-P000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j~hL5*r|Pk!L&r000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}00089Nklg>2a;9g`S$th4003+r16Q(+JGbhnyjOrav=ijA~q}dU1C* z-Rdxz5EM=RHlHKwCEtsPKeGW_kX`aV@gnN~krK#>H<>UrDsOE~Ddlsi1R&xj4m`rF zbTj6wIW3* zhL$C(joVSx>BYtawv{-t7m#1~Gf+C9U19*Zlce_bWMC=f!_fd{Hc!0(S+W@TA{l}? zqk!6+6$?a6rIb%Oul;7(pF05W>dH21+J06Dg%nmSvsf@!b3zpH@i+- zFOxxA+uQFg!<{(OD3dl0rgo6bWTgplmjdayCC`lnoD9qvYAnC)A@BV?B3eO2MAF{d z{7eb3k;!i0WKtsHF8Kg}G+eZ@#~Ved44Ey?1F&}T(g~J1*UP|>5;PUy4zTmo=C2oA zL?kQoEV4)tMkJ8gZvlUcDT!BG2;gV zFMDLU=aV*P5kn!+lv<4X1eq|B0Hj<*BgefBp3fYncZ3Z9@H=CJ*Jkb?``c!Hj<5#+!u*T2 zefhvh0^Hl?Mu7C75qb9`{kV%Ewbt)+jprMuVd5K(Kk4fqtHSHOPXGV_07*qoM6N<$ Ef>2gA%m4rY literal 0 HcmV?d00001 diff --git a/assets-fx/fxconv-metadata.txt b/assets-fx/fxconv-metadata.txt index 8b13789..04dd09d 100644 --- a/assets-fx/fxconv-metadata.txt +++ b/assets-fx/fxconv-metadata.txt @@ -1 +1,37 @@ +hands0.png: + type: bopti-image + profile: gray_alpha + name: hands0 +hands1.png: + type: bopti-image + profile: gray_alpha + name: hands1 +hands2.png: + type: bopti-image + profile: gray_alpha + name: hands2 +anvil0.png: + type: bopti-image + profile: gray_alpha + name: anvil0 +anvil1.png: + type: bopti-image + profile: gray_alpha + name: anvil1 +anvil2.png: + type: bopti-image + profile: gray_alpha + name: anvil2 +anvil3.png: + type: bopti-image + profile: gray_alpha + name: anvil3 + +blood.png: + type: bopti-image + profile: gray_alpha + name: blood +title.png: + type: bopti-image + name: title diff --git a/assets-fx/hands0.png b/assets-fx/hands0.png new file mode 100644 index 0000000000000000000000000000000000000000..234c5d2df6e48eec23b5ce02c8d717f28a31fa8d GIT binary patch literal 944 zcmV;h15f;kP)EX>4Tx04R}tkv&MmKpe$iTcuJf4i*t{h)|vE;uns!3Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWDYS_3;J6>}?mh0_0seZKsb)tUP&La) zClf+8w;}{z5kfz@F@<4?nfk0KrrU5saWpZjz4D0!0sK7lySbi*QEC!XH4 zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYTlQ5n`d(#&R38lA#h$5=RwPqkMnX zWrgz=XSG~q&3p0}hV$C;64z-CA&CVnLWBSrRcxRP3o%+XQcR?2KjGmYbo?T@WO8kQ zkz*besE`~#_#gc4)+|hnyGh{$(D`E9A0t3;7iiRM`}^3o8z(^E8Mx9~{z@H~`6Rv8 z(xOK|?>2C8-O}Ve;Bp5Tc+w?9a-;xFf1v=ppV2qvfWBKGwCeWO+{ftykfE+pH^9Lm zFj}PSHIH|9wfFY#nPz`K;1Y7uvZY{000006VoOIv08ao<08hR};u`<}010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=n5JT4LU4Sn3@0p02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00D?eL_t(o!|j;ej)Nc&h0kEG`h4E%v#E2-BX*s=Q9=;mqg!V1dUTd+f2TF|+y$KP67Yxk~+<1w}=4o@O#llQ6RYFzb~9QXkl= z&DMKX#t1Wmh|qN%nAv_(U*B)cn2oN!?*RbAFdzqx%7NmV4XEq7+rg|Fn0ce8X&Q{< zm<%Tc%qs-LW3*iF3wgY)eZ5(2(zV0000EX>4Tx04R}tkv&MmKpe$iTcuJf4i*t{h)|vE;uns!3Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWDYS_3;J6>}?mh0_0seZKsb)tUP&La) zClf+8w;}{z5kfz@F@<4?nfk0KrrU5saWpZjz4D0!0sK7lySbi*QEC!XH4 zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYTlQ5n`d(#&R38lA#h$5=RwPqkMnX zWrgz=XSG~q&3p0}hV$C;64z-CA&CVnLWBSrRcxRP3o%+XQcR?2KjGmYbo?T@WO8kQ zkz*besE`~#_#gc4)+|hnyGh{$(D`E9A0t3;7iiRM`}^3o8z(^E8Mx9~{z@H~`6Rv8 z(xOK|?>2C8-O}Ve;Bp5Tc+w?9a-;xFf1v=ppV2qvfWBKGwCeWO+{ftykfE+pH^9Lm zFj}PSHIH|9wfFY#nPz`K;1Y7uvZY{000006VoOIv08ao<08hR};u`<}010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=n5JT4KcfcK@tD}02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00F*9L_t(o!|j;el7cV{g-;4s`+VF+Urp_;Z>W;JX*wA! zrA7JC-OMl+q$Ts^Bn<%nmbB)@xfBiw*XXYUZ37H3P~4kU|M^^%n^u=Ma15_wsM4-AIyBy0BW$p zSe5`I0B-uQ>-G8s1pto6quzfD%2``6Pij6K4gi4D=~M;B)jU+8bX}JPG)Sw}jG3da zI*z+R)8KqQ7sGLdYKdl{qyTBuh+-BkolZZww6&0&bIG!hGAj7Lw@MhA1(b^3!eANz z_c3)_6qh<0 z)f>u9C{3XOeOkGXne=r+*)HWTl}NN;@vWfDf|ChqHkG83_^i2aHUdC{bS^3bV}8>s z_6wI;tOfAc0Th^*Sg3+*?=@Al$5Lrd5u;Qeu>&}{bT69g zUR29o&6y8rRa?En(bo7rQ!RV7zO?n9Z15@z?&Cu~s@-j^sZos!lWRXkw)k@U1vO{_ U2%KuOegFUf07*qoM6N<$g5#vTuK)l5 literal 0 HcmV?d00001 diff --git a/assets-fx/hands2.png b/assets-fx/hands2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c411e04488ea4562fb0cbc6d79db941ae0d1e24 GIT binary patch literal 1015 zcmVEX>4Tx04R}tkv&MmKpe$iTcuJf4i*t{h)|vE;uns!3Pq?8YK2xEOfLNpnlvOS zE{=k0!NHHks)LKOt`4q(Aou~|?BJy6A|?JWDYS_3;J6>}?mh0_0seZKsb)tUP&La) zClf+8w;}{z5kfz@F@<4?nfk0KrrU5saWpZjz4D0!0sK7lySbi*QEC!XH4 zbk6(45mu5E;&b9LgDyz?$aUG}H_kbWYTlQ5n`d(#&R38lA#h$5=RwPqkMnX zWrgz=XSG~q&3p0}hV$C;64z-CA&CVnLWBSrRcxRP3o%+XQcR?2KjGmYbo?T@WO8kQ zkz*besE`~#_#gc4)+|hnyGh{$(D`E9A0t3;7iiRM`}^3o8z(^E8Mx9~{z@H~`6Rv8 z(xOK|?>2C8-O}Ve;Bp5Tc+w?9a-;xFf1v=ppV2qvfWBKGwCeWO+{ftykfE+pH^9Lm zFj}PSHIH|9wfFY#nPz`K;1Y7uvZY{000006VoOIv08ao<08hR};u`<}010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=n5JT4JS`k^g{pu02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00GZQL_t(o!`+y@vcez`g%5DOg)e7Ai@k59($e^H7I%_x zo2;{80LdST?o4JhMSyS5p4~)XUijd@z?a0FgLrE#06d*@N3AuCF}df82*}-roTw6l z0)henr_%}jeGlL;@%bMM1`G-a3jf{5U!ayMWoE6FTYwpqLJW#?jw`3VTrQ$tr&}9N z4@Giivuibv5db<;ODqTw^BRKx3!nwitjNWOsy4>pe!oKqL3LnYMK@E2N_)WSn4h1=~`3`dqip-gD4 zLz5kN%;WK>YPJB5x%D_CDPPC^S;Av{&Q~HC6BXwc6)RENuQ4XtLEp?>ia;VXL7Dyo9w~PUj3#+Bs zKqw+e&f6db_2=srdnHJyW$Tw=VT=J?rQ=1aq++Gi08kS<(H;Q#(3n#OoNF9%0kyQ) zPk25q(1CMMQkEg-sHJpR+QN({mby=YQ6J_lxiLhIDRCwSA7*=MC)#6lbJhH@U)Tzx l;a)RFHIiq3WGDLS_y;ap=Xm;h-I)LY002ovPDHLkV1n)ExkUf~ literal 0 HcmV?d00001 diff --git a/assets-fx/icon.png b/assets-fx/icon.png index c92f12afab0af9f7b3d8e2bec76a1dc5cc9c08a1..9c19e0506405340a469ca3286ec9b023be87c5d2 100644 GIT binary patch literal 11045 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 delta 7418 zcmV)s1kA&7FrL#p=;ikpxTGYzY}xg?r7BaR$a{etA|f+Ev;XJ6kNGdYO3m5C#6!#3 z@)cWbzVk!1pI`g+_&n!qy#Kzx-0NRwzW$;6*PlJl1RlflYk!Ha=fmsy_l5GuBNzI` zA6)wB4dLVd{_BlP|G2ULVMU?2ZNGli&;QR^^_>0euE&fS^0TSu7Uq2!UO2E)xNpmR z7yeKDT<&+{yV`E2i+0&*2j9~*=UuSJMYoLW?zrt1kJC-o82$EzNAIT(_qiI1Z+-?F zT!{L1$CuE;3V${DF#Qf8L=*hSTHL*FyZ4)}a_8lEsdrq=@s@AD&7WTIH{a(>i;bL< zF}uIEVqIQAz%t}H{maX6h&wO8rEB2#_s5s{;@E%((=~HtgWZnj5+k|K*a|lQ0m0m-QHPu{8t+mzOd<&#xYPpqGTWh^@&mK)rop*O$(fjZtj5yNBql`M*=#%i7 zai*DPnSXV**_U5o#g$fGW!2SI-)<91X2+d&-euR_c0a`02`8R(@+qgDcKV0cUS9pj z_rLI(dwI=YPw92#!)rWSiY|07;e<0uKEq=^Iy_$F0Rq~~XSTW+y*wwM+2+ZLb(H08ojSwWHIG#SPvsDb{z8uNI#9!}G<359c$HOLH(1AE))o5hMX=aP z0)O!ObY=Ehx0PGB?m5e7?D3@d+Kv7CXr3QN#UO(nm%A~)*w_JU_bynz*E6vx80%eK ztTD`Nx2uI1v(2%mGR^qoW+Lg4&vFEsEoTzP8^Ax^^^+#S@9JFVkRmgszrNV-?P&h} zy?=dc^V^N^0@!JsG4bejd1Hx&5ldKn#eYWNoz@GaQ}?P37$FR1AtJ<*(~nVc&5f-U zh}Kha<6dsel1Qf0(;lU_RHt2?+~QBGuNBNBLAWUdOged+i-PzJ+t)a&?T~O_NFWM{ z8V;$G(%3_*_hrwu6LG)6Hj`FsM+v?r;S#DNjldd9q9xh35q@Po;m5M<01X_=Qh)Se zkU^3<;JukV2tQJi@N03~#;OQE>j*#l4!^NWJk_S{(<&pi<5oH>j3i&XC)mhu(?}fh z2;7Lr_nHs%;+l1}xi%dDws#)8j>mBRWk5XPdORWZQ%Qjs3cyALWBTKAYsDWo8z`7C zqZ3}jce8qXLgOvq!ggUCV)`HqN`K!4p)*N>vkj}TVXrqD;3%%yOI?9zVJ!hduxns? zxv!D^b)+y_tUJ_wHW(RU*71P;?*Ux9K zb~@<1}9jR+hsR6pP)|mAf<#7}iRiV}G)76DC&M zVEa_qkkyOWm;fY*elnI;wC3n>1<@QYc5ziDNcE*EE$pr-nq~Flu}MEDNkZBV5!c!O z;Vz3{7>Khmz0zY>qQ~dPt+5;a@owb0x)fWiJxvTipwvn_wyjv)Eo~ANgQc+|9xiW# z4SZ0~04T}9Qn=QhS`pXHC4WgOvg#|)Q>w@LGO>`w=>w|8Kdd&*MR2a7mq+hX;c{`H zKv8D~`+DeM@n+(e)c5fVf`Fbc46*iwB1A`_sQN&5(LAqwp3{@ zP^-iV<453}EMIll41ZcBR7(J9v5te1Ba#J+%>(Epm1YY08O8%s-pE!D?d)&u|=Zag5nnG47P+D9N0oS>Z~jF;!()pj@1fLvmX zlme+DY?((4Gblub@?^q_CP%Q@9#%2Hzu25ZHQ^)&N;Oi9`+wU_T#JEP!stLhDYCW? z%k4t?6X--HrDz4~%bXSKct`=(hl~3~G^`gCq^w6YPDob;2-oET5q>(Nf+gD;f{29N z=&OSOXxp`t;ruy911wXh8Ie!r0!%suQ@s2~fPptR-MdRjdzcp45ib}3WCg$1H6}>o zAW@Rt*|87QTYq`=QC_Sp(ZpRLs?wH^1M9LKVwi{bD8VBawKSbYAo2=wmbP zcrHAPvjW1dfH|GA7i3hRg2}OA9V=lX@;S#B+-?mV%omvn1PbFY;Cw+PXqT!%;T0r1C0E?1ZdIxwO zCU;LIfq$}@hzLqXG{@Rw@djilkk^!nRtlsl6Y=BNZ6R360kWba`xBBGH4-C8J)9s= z@>Q8wdzpDXTNtR8>$3sJ!5y%qRLuZ!v}vALYdNHZa?hRA98D z#sRD-FQ|CPx z^oar4et>3HZd#;<2ihpc+ru+%3N1tvO*|6-95==sq8aq>niDSZ)V^WL6liT#2!F&8 zIN4Md_k(CVR}@nsKqeHEbJ;j@Y_KC4&-H@M=!j9>fCO`}m7KtzHk%~g#F`knA6u!v zx{B)a=kw-8FPbQ!)g5O-1P(*Zls1n-kgGieO%TYWzhs@=TgxEN};>I9qI};r? zCrC?)Mm2kiBaI}Ukq0=25*;ZL3V$-m;6kZmvS|Cto(HK&-NJLbkxvz2Sm(?g&ZiFc zmdgMnq&XR`uv@5HxTcv|-gM-=s!4)H1jbt*e5&Gtrqp1`a62GU&c%YEyk{2z-+fF+ zU7*VkwJ17;be#}0tb!6G1s&!?mqN9+BC3d0NKb_o$iX{VFFF-}=V)eks(;|ZHJmB3k<+ghg2sBfW2j4Dzs}Zun{UUC^OlGcDtndABha0 zKI{vDU&1D#q*9`)=q*raW=O-1b*n3~E4R|s1!`*7x&+J-`Kd$noj45LZ%YxBk=&u} zg#p$^e@M#nFzVNY3S>!FfhUl)lkj0`>PmM_vm|lV*V*mKJ^KBL(r-W3LxhY0v{(FL?Emz_x1t^ z^V;bQyr{iN2@Wa@-fY#C1pZW~1A+xA#pjR~<&k;{1Ty4EDt}>Jlz`x8hGb?y#oqU` z^?t!PeFbCQUes)QGfO-#)>8?9J+Uc*?o@NDX&4^P27eYvaa3@E9c)akr;VJ)90O$~ zsI8w+>tMMeHv;hC>g+w8x^FDG=tE6)l=tZANuU1(tUbc%#y01hYC49Dcp9l1Tw@*hY_kMm`p?wx;wo^e~d1Tv&8jey@Sv5{UHDW_u zPGsL28bi!lc{+v=a@?D=Zj&PVT#8ICS~MhJPk(ec=oL`Kz+4nZZ;(bkjm$EjiH>P7 zMSzWy8ql3+uMyZJvb%(|k%9)cejECK5&6iSGfe;>-`zwMJZVjQ-Ljo5#2!vS>$GU% zIak0ZsQW}UNsOqoqk?&qZ1^8LP)ATbG*EsLFjSCaD-nCweU$FkQ%RDSccZ!#q2Ll0 zY=0;aY5;7M(W^=*IBS7>6tYkJ&x=gh=Mi!y?8H zbaN+(Z@ox7A9C|yRkE)VH4>;1G`ac|QFiqy88{qXrECHklA)NU${bSRvAs7YQS)rf zp2WJ@7&Q?a)3AtLu{V;CA~q-66a3|ank?iFoKp_YIX}+w1j>Ts4?NbK;X!1nqA!?S z4Pp8ZK-PtRgk;PGYH5}v(U{smCz}mgWJGtrEj`Ms!tZ4GK~<=SomHW( z$AG-R4yjQp3{)MI&P7n{h58c>>A45t0?7lE_V$_YIErZVdBk4~E`RlC`d_~A50An8 zy*a=L$k4X?X*7)Q?C&3GThW_=D&I4{x-USxA=BA0*#MzwhhiEkbcd+G*J+H}@##+xEplj8n%|A6M zxA9_`xF3g8Al;Gj{rTfgM$UY0Moiq>>7@%60Bj^JQBfoGxvF|orx#5=DE$`!ML9^_ zY)R`F4AhitM3Acw9e;ELKsoyv;_9@Q*EIbp{cr%xRjN(_Xnv(4%r%ph*roAmZa7dM zqQw=0rtg~9x=h77i)M-i%WO5|P6`XfrMW418>fzV7zC4glvL^Poxg`P5W*YUM^?Cr z!rseV9$>y4EjJ^yU_domC z;BT;kUiFQrbEMYdOSS#xQORY(_$Uxm(fr(f9=9c8-wo&Alw`QxsD*d0Y^A9mSxp)g zL^1d>)B+~Fo{HSY4jl(Z81ilCYXPEnHpJb$JTIbV$RnCfLH>Bc2Un#$Ft z{t=0!szzr}YN0sRIC22d;dR1@+AgYX1W9S4ir2Re9V&O9(9`7ZIi^ANbB}2Zsu*Se zMjAgeKqchwlOVqPU7Fr}>32QC-jEEZ)z^&h7k7GY^z=qun7X=#jLMMe_p6;p83nNE zRA6vwMt?t@T@6uJb)U^>9q(9kw%d#*E3o&|j2=Yo>$n1CmN?z2QpLrjBJ0jn6U`@Q z`#9(^pVK5QG@Df`yuI4F>X%S5TNU>%NcjUI!VnKbP2F5mZE+Hgtpmk9A)!!IQmbS; zL^%6$2kp9aN9cFeHH@@xVaX@%p>ftdn1lrOgnuTk= zhD1kTN^)TOf9hd(lXbGrt4UB^(4L-=ynW>X1fe_#X{TH1k_H&K z9)Ff`U~Z*BuA|{pqcdaFc^Yg^W8sC`Rqs$6200=eXIg4rM203PPG{d7#j4J;H+IMSXJmWx;+!3@5P!fr zZ=>}dLNvD^&*OElisJeuY;+9qhBpa1%ANZVQ;~2*Ic+L0JOMT*sb&SG!MHn49gkW^ zXBCD<#eH@l9W$bJNyNTN{6ij2yhik39UanYa4%Vf%0fl}S!m-Mg9YJ4Y%RQrJ1tnJ z`U9b^BSviokRlj7K(>-B&-moq#DB%$7IR!I1V`F>rdz_off^ycf|V$b`s4ty5$g=~ z7ES8VWz^9Yg}>M-8(2s#-Q4+P}!Tnf!N^oK%FN1zAV;GPU3edP75lf`PYJgn@? z%kISel1bN0!I+w=IA#NEePE@wW%;uRFnVXhsYR+ci- z<%jV-;%loy@R~f{b2A%Fg2gL~HTU2Q>kMpaQt!roQ4Swq`ggW|R?jmu0pEs`(x@#j z9gmEo2Lh5Gwv@w;I)#~FU#tyJtL~ssu->X=UeQcy-1%!1lw`{^y~6 zIMU~35C-au^pcB{j!A3kI4pH&$#D^R-bC%l-$T+6N2Efp31N@QV!>ADgh}<&yR>5l zrT45)=#3tArfw6ym2yOVNDa+S4oUM_t?9=>zUKH>i+`D>obwu`2!HngaJ4j^a{OBh zyhP2nNP3KpJ6y+<|Jw!4`-&eI>?(_$-&IB03?wKrW5Mn^=gy9)^i-~T9TsXjP!EEV znMMbo*Gz!;zAz3s5eI_wQPCticaooT*q2kijP+Z*AAc%;K-%a`==&sAy_5cwxZ6E5?1%cw1o3lVIA*OZ&C7In(1j2X z68B?d%QVdpf(H6Kfy^JHf?8gq0+9FR=JY;S_A6~*{v-~h4aR=7*>}3ubR555XJ^ib z_f`Hq{?|FW`{u|0Z||#!e|ewF;C~$(`r>`%GKHX1+U4GK+JCNuADL1u@6YPvkI=M-~pqw_W9s;;(H1x1_vWQ`UWxiYe^NZU4!h0CnX(Cp)WM|ev(n2O{4;m z^Hwc?{=AL3AMN<#(QbR&j^AC*eEFov|LJo7{NTxdcz-$bo6pev>&uyMKa%q=E@%Gy z*{8p|oEd-lQK~;(&isvQ|K@V$?<3{=%b9;0c)z=x`Oo6`pO-V=`r;v?^&qH@!J$yr z^BiyBZBRsf&bgX2^f7}UKbRCgK9;0UB~2I^m8U6E&?#yP^dCR+b03ZWq7%pa*yV?O z)7<6}a3R1y67Jnn`)9MweA|Wl7mwdxNT5m4Z2lM4+8jS#poD{yHYzNC;|32CDlR7a z`m_K50IEquK~zY`#Z}P?fG`Nm*#H0X^$@~k>SVM$2vUxDC({W491S=*5V^k$%2A$; zHRt_vZg8O9mCP~la+~8#*Em&fW;AZgg|p>Qz4=RpE3Ul}$u?eivsWL9isRA(i57+D s+-|QG>9X@#%pCVFkhVFVy)-*;0Z!m*Ewrrq(*OVf07*qoM6N<$f?vFCKL7v# diff --git a/assets-fx/sprites/anvil_pickup.png b/assets-fx/sprites/anvil_pickup.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9ec71c417b2f111f0a4a39242964a7df3499b8 GIT binary patch literal 4629 zcmeHKeNYo;8egCyjl$3lcW~94TjM8nHv5sy*P8Gl36Me%kV?>YU^lx7Ta#=|mL!I$ zVu2R?ho`@AyPnR8I+iNea#wnH)?TY9rFUcTT1v}EM{QN^-2@QkI&;I^ z`5&3t?7q+YJiqsOe(&#n=Y5-ti}Dg>Pskt$N;KyiOTinKo`iVt?+b-Sz-uT}W)(~6 z0POJ!cHYUs;zkb#b3xt?LBT6KO4fxhz;k~bNU3eu)sPp?sl3=%70y&N_*Y!apVv(K ztFa}6$3I_qcYo*J`opE~TrW&esocw+++huc4;gM%2{D zyKYUXc=f677dr@k%YokX5$ok24w7@vHZ>2dd2vbKV%dUiH;U5-O8KQbKP;_MXARcv ze)+TD6Z*xAvQFK}-l0&AhJ3Xni|_kdzl)z|@VB4K$u5APm_|M)r`Vj6GhR8UcmMOd z4f*G@=66-D>neRR$)8;FL2*}S(k3{3LS{OW{9NOjUluCvy|5(Fymi}~{cAnn*?#*~ z|38i$tv?DUY^u|)(583fH;)#`5Js;ZdjE9o&eMUqb0zfKmwz_9tcSSR-LR{tRc1Jz zKqq8xr<EGnQ^m4~CD|-o715{bxnr!2S7WpXy`lR>5KAwe}`WlS7TXb~9r`!`?-W zxAzCH9-Q-druSL@ogKcv(V2hQp7!d9enW$GnZNyN=P~xkg^w?km_Awd`GJ~>FV1vT zv|h4){rcU;FV39&-G?noms=ewDzk;w+jOivGef2iQUJik zi8LH^Io&=gXpl#6Dex_sQ8^rO5!V~!R!cFQBX~KORFDb`F$H-)A`xg4coKI-L&12$UcY;DPuyxU-7P+WnbE*CmE!Y7*i0AwtopN#O8ffbFG zaz3HPYvW9Q&MhvS48hta;ypE9XQUj~hH_5M1zde#RD8;id1g!TM1(|vgLio%QGo0z zo+595K-QGpq@GAQlM?~q6Sz~n$7_!`122n(G77dDDLu2%AeY9cSi#1#ROC}dFgVU? z2}Dh*RS1cz)CjF+8H6Qpj9>|jz%bh+D6`uq(rz0kK>=_D4{+={!cJ&e0%1r70}whA z(Q%v(Q4<`)X<4;R#gLOAR(W}#O4>O&D+!7PP->3B7!qR;wOY*~Bw^Pfw1x)A8dk$# zoK~Y&sUuLVjmj0gE*eZH@1h+X>Tx?F9TMSGcCpzYCluHNOR zyo*~c(h{4vMu}krsnX(@1}C+XqStUItzC{PR_mX>r103xuU7AnWf z(W2lj69lJ0E~NxZkrUk(u$)+0q>Z%50Z=d~g<}+mW5g6)QLDKP(N?tSXqT;;b~`w* zdyL6-+|K`m6tpUh61NjNgus5_lm&Bwgdq|tS%zyVrIJ!f{>QXO9VYFgfSRZc?9X7k zM<@3CG0vo&^&$SoA8fUDIMx0IzYtAUF-LGo7Y`_M9_Cm$z>C$ebRI6>l9URZwwaCDW!CfG?CpH? zU3jkPEX>4Tx04R~2kg-a`P!xv0R8c8)QaY$Z21h%Z$-$}+1cewY7@g9j#bOdel2UvF z-$Wm#gCO_}&I-={H##_&#S4f3<8aRZ-+Q5DCsA51?n9bYh3of&%izjhexuDMT{`T9 zQJMEW?}Wzl`HE%qrDwdF=l(oP@u-ZXb5$1QMFrNL*qK$iVHNAQ1OHI`AhzQ)i^Wgk z?Kq7Mn_WLmrqPe5xlL!3U7VY~Y73WRPVulAGG#(SMNgWkbA-dL)TJQgo{~tKFj8-( znTi`xDJPc$(LkizG~{j6d7e^+@|eiWB;1k8)8t|P_j~Q*tlqS`^E@oVy0xHcjmPl* z2&)0CJwyAtA#3IL+Ztw^dgh;R`~o&

Z=-3Ecny010qNS#tmY6Nmr+6Nmw$iU}wH z000McNliru=n5MaFC$aCZLI(R0%=J^K~#9!?OWN_tsn^AxO~5Q)OtexixvwdA#FIv zk}mcxC6f0ZaN{>*Ojf_$I)$&R_#lxWA|j$@?5rU&NGQCn z+Ta)f0NX@{@32;4be^|>SvQUkcmX@~v};=xJ7+p&lxo)1_66d8*~6100+PUZ~z_%&Ht`edN#7yS6JB83wxn%d0_YEt+M^vc+7jNr#pT90 zphsEj{`-ic);We$);+R++^1{32KJXcW;o(v>yZC`XK+NRN(6(xSYg#&QS#Ijvr04Y zc_@=BI|n$_w_IF#Sd_LAYR3!W(fO;ZsxF;zDc(cex}CC5l=PpL(35O~TL{vK01%=8 z65X8UZXJ+E;P&n3C6a=ksek1ja%jALFUrwO_xrN_nY^dteHp*!G&OJN-=V?PT`o|P me0m77JTzqssj%p|49Xvlv{-ZRHA)-+0000flags.v_offset; bopti_image_t *tex = tex_index[map_test[mapX*map_w+mapY]]; diff --git a/eng/sprites.c b/eng/sprites.c index e464896..8532b68 100644 --- a/eng/sprites.c +++ b/eng/sprites.c @@ -31,9 +31,9 @@ void clear_sprites(){ spritec = 0; } -void remove_sprite(Sprite *sprite){ +int remove_sprite(Sprite *sprite){ if(!sprite) - return; + return 0; int pos = -1; for(int i = 0; i < spritec; i++){ if(sprite == sprite_index[i]){ @@ -42,7 +42,7 @@ void remove_sprite(Sprite *sprite){ } } if(pos < 0) - return; + return 1; memmove(&sprite_index[pos], &sprite_index[pos+1], sizeof(void*) * (spritec-pos)); } @@ -219,7 +219,7 @@ fixed_t raycast(RcGame *game, RcActor *origin, Sprite **hit){ //perform DDA while(true) { //Check if the ray is out of range/bounds - if (sideDistX >= max_dist || sideDistY >= max_dist || mapX < 0 || mapY < 0 || mapY >= map_w || mapX >= map_h) { + if (sideDistX >= max_dist || sideDistY >= max_dist || mapX <= 0 || mapY <= 0 || mapY >= map_w || mapX >= map_h) { coll = 0; break; } diff --git a/include/C3D/config.h b/include/C3D/config.h index 3b7bdca..4355c05 100644 --- a/include/C3D/config.h +++ b/include/C3D/config.h @@ -11,7 +11,7 @@ #define viewport_h 64 #define max_dist fix(32) //Max sprites to attempt to render -#define max_sprites 16 +#define max_sprites 32 #define TSIZE 32 diff --git a/include/C3D/fixed.h b/include/C3D/fixed.h index ed9ed39..76c16e6 100644 --- a/include/C3D/fixed.h +++ b/include/C3D/fixed.h @@ -13,9 +13,13 @@ typedef int32_t fixed_t; /* Standard arithmetic. */ typedef struct { - int32_t x ,y; + int32_t x,y; } V2d; +typedef struct { + int16_t x,y; +} V2d16; + static inline fixed_t fmul(fixed_t left, fixed_t right) { /* Generally optimized by the compiler to use dmuls.l and xtrct */ @@ -25,6 +29,8 @@ static inline fixed_t fmul(fixed_t left, fixed_t right) static inline fixed_t fdiv(fixed_t left, fixed_t right) { + if(!right) + return 0; /* Pretty slow */ int64_t d = (int64_t)left << 16; return d / right; diff --git a/include/C3D/game.h b/include/C3D/game.h index 3bf7de9..27db1dc 100644 --- a/include/C3D/game.h +++ b/include/C3D/game.h @@ -3,13 +3,15 @@ #pragma once +#include #include "utils.h" typedef struct { V2d pos; Rect coll; - int tex; -} Sprite; + int16_t tex; + int16_t hp; +} GPACKED(4) Sprite; typedef struct { int w, h; @@ -20,6 +22,8 @@ typedef struct { Sprite sprites[SINDEX_S/2]; + V2d start_pos; + } RcMap; @@ -28,7 +32,9 @@ typedef struct { V2d pos; Rect coll; - int tex; + int16_t tex; + int16_t hp; + V2d dir; V2d plane; @@ -37,6 +43,8 @@ typedef struct { typedef struct { uint8_t exit; + uint8_t __pad; + int16_t v_offset; } RcFlags; diff --git a/include/C3D/sprites.h b/include/C3D/sprites.h index 75c4831..285efc1 100644 --- a/include/C3D/sprites.h +++ b/include/C3D/sprites.h @@ -15,7 +15,7 @@ void add_sprite(Sprite *sprite); void clear_sprites(); -void remove_sprite(Sprite *sprite); +int remove_sprite(Sprite *sprite); void draw_sprites(bopti_image_t *tex_index[], RcActor *player); diff --git a/include/C3D/utils.h b/include/C3D/utils.h index a36b58c..9b71398 100644 --- a/include/C3D/utils.h +++ b/include/C3D/utils.h @@ -11,10 +11,8 @@ #define min(x, xmin) (x > xmin ? xmin:x) typedef struct { - int x0,x1; - int y0,y1; + int16_t x0,x1; + int16_t y0,y1; } Rect; -bool rect_rect_coll(Rect *a, Rect *b); - int cmpfunc (const void * a, const void * b); diff --git a/src/game.c b/src/game.c index 48378ea..9113449 100644 --- a/src/game.c +++ b/src/game.c @@ -4,7 +4,10 @@ #include "C3D/sprites.h" #include "C3D/fixed.h" #include "C3D/game.h" + #include "game.h" +#include "gfx.h" +#include "map.h" int sreserve_c = 0; Sprite sprite_reserve[SINDEX_S]; @@ -14,7 +17,21 @@ Rect sprite_colls[] = { {}, {}, {}, - {.x0 = fix(.25), .y0 = fix(.25), .x1 = fix(.5), .y1 = fix(.5)} + {.x0 = fix(.25), .y0 = fix(.25), .x1 = fix(.5), .y1 = fix(.5)}, + {}, + {}, + {} +}; + +int16_t sprite_hp[] = { + 0x1000, + 0x1000, + 0x1000, + 0x1000, + 2, + 0x1000, + 0x1000, + 0x1000 }; Sprite *cc_mksprite(V2d pos, int type){ @@ -24,50 +41,71 @@ Sprite *cc_mksprite(V2d pos, int type){ spr->tex = type; spr->coll = sprite_colls[type]; spr->pos = pos; + spr->hp = sprite_hp[type]; add_sprite(spr); return spr; } -void cc_rmsprite(int pos){ +int cc_rmsprite(int pos){ if(pos < 0 || pos >= sreserve_c) - return; - - remove_sprite(&sprite_reserve[pos]); + return 1; + if(!remove_sprite(&sprite_reserve[pos])) + return 2; if(pos+1 != sreserve_c){ memmove(&sprite_reserve[pos], &sprite_reserve[pos+1], sizeof(Sprite)*(sreserve_c-pos)); } sreserve_c--; + return 0; +} + +void cc_load_msprites(Sprite *mapsprites, int spritec){ + sreserve_c = 0; + for(int i = 0; i < spritec; i++) + cc_mksprite(mapsprites[i].pos, mapsprites[i].tex); } void cc_hit(CCGame *game, int hitstr){ if(game->hit > 0) return; game->hit = 40; - game->hp -= hitstr; + game->_bgame.player.hp -= hitstr; } -int cc_ai_mov(RcGame *game, Sprite *spr, fixed_t spd, int hitstr, int coll){ +void cc_ai_mov(RcGame *game, Sprite *spr, fixed_t spd, int hitstr, int coll, fixed_t range){ fixed_t dx = spr->pos.x - game->player.pos.x; fixed_t dy = spr->pos.y - game->player.pos.y; fixed_t player_dist = fsq(dx) + fsq(dy); int dxs = (dx >= 0) * 2 - 1; - int dys = (dy >= 0) * 2 - 1; - - if(player_dist > fsq(max_dist)) - return 0; - if(fixabs(ffloor(dx)) <= 1 && fixabs(ffloor(dy)) <= 1) + int dys = (dy >= 0) * 2 - 1; + + if(player_dist > fsq(max_dist) || player_dist < fsq(fix(0.5))) + return; + if(player_dist < fsq(range)) cc_hit((CCGame*)game, hitstr); + + int nx = spr->pos.x; + int ny = spr->pos.y; if(fixabs(dx) >= fixabs(dy)) - spr->pos.x -= dxs * spd; + nx -= dxs * spd; else - spr->pos.y -= dys * spd; - return 0; + ny -= dys * spd; + if(!game->current_map->dat[ffloor(nx)*game->current_map->w + ffloor(ny)] || !coll){ + spr->pos.x = nx; + spr->pos.y = ny; + } + + return; } int cc_ai(RcGame *game){ for(int i = 0; i < sreserve_c; i++){ Sprite *spr = &sprite_reserve[i]; + if(spr->hp <= 0){ + if(cc_rmsprite(i) == 2) + game->flags.exit = 2; + continue; + } switch(spr->tex){ default: case 0: @@ -76,7 +114,7 @@ int cc_ai(RcGame *game){ case 3: break; case 4:{ - cc_ai_mov(game, spr, fix(.025), 5, 0); + cc_ai_mov(game, spr, fix(.025), 5, 1, fix(1)); break; } } @@ -84,12 +122,51 @@ int cc_ai(RcGame *game){ return 0; } +WeaponStat weapon_stats[] = { + {0}, + {.range = fix(1), .dmg = 1}, + {.range = fix(1.5), .dmg = 5} +}; + +void weapon_hurt_stuff(CCGame *game){ + Sprite *hit; + int dist = raycast((RcGame*)game, &((RcGame*)game)->player, &hit); + if(dist > weapon_stats[game->curr_weapon].range || !hit) + return; + //:p + if(hit > 0x90000000) + return; + hit->hp -= weapon_stats[game->curr_weapon].dmg; +} + +extern WeapAnim weap_anims[WEAP_ANIM_C]; + int cc_logic(RcGame *_game){ CCGame *game = (void*)_game; - if(game->hit) game->hit --; + if(game->hit) + game->hit--; + + if(game->weapon_use){ + game->weapon_use = (game->weapon_use+1) % + (weap_anims[game->curr_weapon].framec*4); + if(game->weapon_use == weap_anims[game->curr_weapon].frame_hit*4) + weapon_hurt_stuff(game); + } + + if(_game->player.hp <= 0){ + death_anim(_game); + switch_map(game, game->curr_map); + } + return 0; } +void use_weapon(CCGame *game){ + if(game->weapon_use) + return; + game->weapon_use = 1; +} + void init_logic(){ add_logic_hook((RcLogicFunc*)&cc_ai); add_logic_hook((RcLogicFunc*)&cc_logic); diff --git a/src/game.h b/src/game.h index acde659..e385532 100644 --- a/src/game.h +++ b/src/game.h @@ -5,18 +5,37 @@ #include "C3D/game.h" enum { - stype_frenguy = 4 + stype_frenguy = 4, + stype_anvilpick = 7 +}; + +enum { + weap_none = 0, + weap_hands = 1, + weap_anvilstick = 2 }; typedef struct { RcGame _bgame; - int curr_map; - int16_t hit; - int16_t hp; + int8_t curr_map; + int8_t hit; + int8_t curr_weapon; + int8_t weapon_use; } CCGame; //CpC game Game struct +typedef struct { + fixed_t range; + int dmg; +} WeaponStat; + +void cc_load_msprites(Sprite *mapsprites, int spritec); + Sprite *cc_mksprite(V2d pos, int type); -void cc_rmsprite(int pos); +int cc_rmsprite(int pos); + +void use_weapon(CCGame *game); + +int cc_logic_onframe(CCGame *game); void init_logic(); diff --git a/src/gfx.c b/src/gfx.c index fd64337..8b7e687 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1,5 +1,7 @@ //Par Fcalva et est sous GPLv3 #include +#include +#include #include "C3D/fixed.h" #include "C3D/game.h" @@ -18,6 +20,7 @@ extern bopti_image_t bwain0; extern bopti_image_t bwain1; extern bopti_image_t meat0; extern bopti_image_t meat1; +extern bopti_image_t anvil_pick; bopti_image_t *tex_index[TINDEX_S] = { &briques0, //0 @@ -26,7 +29,8 @@ bopti_image_t *tex_index[TINDEX_S] = { &briques0, //3 &sprite_tst, //4 &bwain0, //5 - &meat0 //6 + &meat0, //6 + &anvil_pick //7 }; int state = 0; @@ -43,7 +47,59 @@ void init_gfx(){ add_logic_hook((RcLogicFunc*)&anim_tex); } -void draw_gui(CCGame *game){ - dprint_opt(127,20,3,C_NONE,DTEXT_RIGHT,DTEXT_TOP,"%d",game->hp); - dtext_opt(127,30,3,C_NONE,DTEXT_RIGHT,DTEXT_TOP,"HP",-1); +extern bopti_image_t blood; + +void death_anim(RcGame *game){ + for(int i = -23; i < DHEIGHT; i+=2){ + dimage(0,i,&blood); + dupdate(); + sleep_us(10000); + } + dtext_opt(DWIDTH/2,DHEIGHT/2-20,0,C_NONE,DTEXT_CENTER,DTEXT_TOP, + "Votre inconscient",-1); + dtext_opt(DWIDTH/2,DHEIGHT/2-10,0,C_NONE,DTEXT_CENTER,DTEXT_TOP, + "l'a emporte...",-1); + dtext_opt(DWIDTH/2,DHEIGHT/2+10,0,C_NONE,DTEXT_CENTER,DTEXT_TOP, + "[shift] recommencer",-1); + dupdate(); + while(getkey_opt(0,NULL).key != KEY_SHIFT){} } + +extern bopti_image_t hands0; +extern bopti_image_t hands1; +extern bopti_image_t hands2; + +extern bopti_image_t anvil0; +extern bopti_image_t anvil1; +extern bopti_image_t anvil2; +extern bopti_image_t anvil3; + +WeapAnim weap_anims[WEAP_ANIM_C] = { + {}, + {.frames = {&hands0, &hands1, &hands2, &hands1}, + .x = 15, + .y = 42, + .framec = 4, + .frame_hit = 2 + }, + {.frames = {&anvil0, &anvil1, &anvil2, &anvil3, &anvil2, &anvil1}, + .x = 0, + .y = 0, + .framec = 6, + .frame_hit = 3 + } +}; + +void draw_hands(CCGame *game){ + WeapAnim *anim = &weap_anims[game->curr_weapon]; + dimage(anim->x, anim->y, anim->frames[game->weapon_use/4]); +} + +void draw_gui(CCGame *game){ + draw_hands(game); + dline(100,0,100,63,3); + dprint_opt(127,10,3,C_NONE,DTEXT_RIGHT,DTEXT_TOP,"%d",game->_bgame.player.hp); + //TODO : replace w/ icon + dtext_opt(127,20,3,C_NONE,DTEXT_RIGHT,DTEXT_TOP,"HP",-1); +} + diff --git a/src/gfx.h b/src/gfx.h index 5ba9844..fbd5eb1 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -13,6 +13,19 @@ #include "game.h" +#define WEAP_ANIM_C 8 +#define WEAP_FRAMES_C 8 + +typedef struct { + bopti_image_t *frames[WEAP_FRAMES_C]; + int8_t x; + int8_t y; + int8_t framec; + int8_t frame_hit; +} WeapAnim; + +void death_anim(RcGame *game); + void init_gfx(); void draw_gui(CCGame *game); diff --git a/src/main.c b/src/main.c index a9fdeb3..86105ab 100644 --- a/src/main.c +++ b/src/main.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -43,10 +44,14 @@ CCGame game = { .player = { .pos = {fix(3.1), fix(3.1)}, .dir = {fix(0), fix(1)}, - .plane = {fix(0.66), fix(0)} + .plane = {fix(0.66), fix(0)}, + .hp = 100 }, - .flags = {0} - } + .flags = {0, 0} + }, + .hit = 0, + .curr_weapon = 1, + .weapon_use = 0 }; int frame_time = 1; @@ -56,6 +61,10 @@ void keys_get(RcGame *game){ move(game); + if(keydown(KEY_SHIFT)){ + use_weapon((CCGame*)game); + } + if (keydown(KEY_F1) && frame_time_timer <= 0) { if (disp_frame_time == 0) { disp_frame_time = 1; @@ -74,7 +83,7 @@ void keys_get(RcGame *game){ } if(keydown(KEY_F3)){ - cc_mksprite(game->player.pos, stype_frenguy); + cc_mksprite(game->player.pos, 7); while(keydown(KEY_F3)){ clearevents(); pollevent(); @@ -90,22 +99,7 @@ void keys_get(RcGame *game){ #endif } -Sprite tsprite = { - .pos = {200000, 300000}, - .tex = 4 -}; - -int movdir = 1; - -int test_logic(GUNUSED RcGame *game){ - tsprite.pos.x += movdir*500; - if(tsprite.pos.x > fix(4) || tsprite.pos.x < fix(2)) - movdir = -movdir; - - return 0; -} - -extern bopti_image_t sprite_tst; +extern bopti_image_t title; int main(){ RcGame *rcgame = (RcGame*)&game; @@ -122,17 +116,15 @@ int main(){ rcgame->flags.exit = 1; dupdate(); - dclear(0); + dimage(0,0,&title); + dupdate(); + sleep_us(2000000); #if debug EngineTimers timers; //gdb_start_on_exception(); #endif - add_sprite(&tsprite); - - add_logic_hook((RcLogicFunc*)&test_logic); - init_gfx(); init_map(&game); init_logic(); @@ -158,6 +150,8 @@ int main(){ if (disp_frame_time == 1) dprint( 0, 0, C_BLACK, "%d ms", frame_time/1000); + draw_gui(&game); + #if debug dprint( 1, 27, C_BLACK, "pX %d", ffloor(rcgame->player.pos.x)); dprint( 1, 36, C_BLACK, "pY %d", ffloor(rcgame->player.pos.y)); @@ -166,7 +160,7 @@ int main(){ timers.raycast_time = prof_make(); timers.draw_time = prof_make(); #endif - if(game.hit > 20){ + if(game.hit > 30){ drect(0,0,127,63,C_INVERT); } dupdate(); @@ -179,7 +173,11 @@ int main(){ prof_quit(); - //Libérez vos textures générées procéduralement - + if(rcgame->flags.exit > 1){ + dclear(0); + dprint(0,0,3,"Error %x !", rcgame->flags.exit); + dupdate(); + getkey(); + } return 1; } diff --git a/src/map.c b/src/map.c index dc6e07e..07808a1 100644 --- a/src/map.c +++ b/src/map.c @@ -5,40 +5,195 @@ #include "C3D/map.h" #include "C3D/moteur.h" #include "C3D/game.h" +#include "C3D/fixed.h" #include "map.h" #include "game.h" -uint8_t __attribute__((section(".rodata"))) map_dat0[] = { - 1,1,1,1,1,1,1,1,1,1, - 1,0,0,0,0,0,0,0,0,1, - 1,0,4,0,0,0,0,2,0,1, - 1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,1, - 1,0,5,5,6,6,0,1,0,1, - 1,0,0,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1,1,1, +#define SEC_ROM __attribute__((section(".rodata"))) + +int trigger_weapon_anvilstick(RcGame *_game){ + CCGame *game = (void*)_game; + game->curr_weapon = weap_anvilstick; + game->weapon_use = 0; + + return 0; +} + +uint8_t SEC_ROM map_dat0[] = { + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,6,5,5,5,6,6,6,6,6,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,6,6,6,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,0,6,0,0,6,0,0,6,0,0,6,0,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,1,6,5,5,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,1,0,0,0,0,0,0,6,0,0,6,0,0,6,0,0,6,0,6, + 6,0,1,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,0,6,0,0,6,0,0,6,0,0,6,0,6, + 6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 }; -RcMap map0 = { - .w = 10, - .h = 10, - .dat = (void*)&map_dat0 +CCMap SEC_ROM map0 = { + ._bmap = { + .w = 20, + .h = 20, + .dat = (void*)&map_dat0, + .start_pos = {fix(3.1),fix(1.1)}, + .sprites = { + {.pos = {fix(4.2),fix(14.2)}, .tex = 4}, + {.pos = {fix(8.2),fix(10.2)}, .tex = 4} + }, + .spritec = 2 + }, + .triggers = { + {.pos = {10,2}, + .dat = {.tolvl = 1}, + .type = 0 + }, + {}, + {} + } }; -#define MAPC 1 - -RcMap *maps[MAPC] = { - &map0 +uint8_t SEC_ROM map_dat1[] = { + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,6,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6, + 6,0,6,6,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,6, + 6,0,0,0,6,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6, + 6,6,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6, + 6,0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,0,0,0,6, + 6,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,6, + 6,6,0,6,6,6,0,6,0,0,0,6,6,6,6,6,0,0,0,6, + 6,0,0,0,0,0,0,6,6,6,6,0,0,0,6,6,0,0,0,6, + 6,0,5,5,0,0,0,6,6,6,6,6,0,6,5,6,0,0,6,6, + 6,0,5,0,0,5,0,6,0,0,0,0,0,0,0,0,0,6,0,6, + 6,0,0,0,5,5,0,0,0,5,0,6,0,6,6,6,6,0,0,6, + 6,0,5,0,0,0,0,6,6,0,0,6,0,6,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,6,0,0,6,0,0,0,0,0,6, + 6,0,6,6,6,6,6,6,6,6,6,0,5,6,6,6,6,6,6,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,6, + 6,6,6,5,5,6,6,5,6,6,6,6,6,6,6,6,6,6,6,6 }; -void init_map(CCGame *game){ - switch_map(game, 0); +CCMap SEC_ROM map1 = { + ._bmap = { + .w = 20, + .h = 20, + .dat = map_dat1, + .start_pos = {fix(1.5),fix(1.5)}, + .spritec = 4, + .sprites = { + {.pos = {fix(17.25),fix(2.25)}, .tex = 7}, + {.pos = {fix(12.25),fix(3.25)}, .tex = 4}, + {.pos = {fix(15.25),fix(6.25)}, .tex = 4}, + {.pos = {fix(8.25),fix(1.25)}, .tex = 4} + } + }, + .triggers = { + {.pos = {3,12}, + .type = 0, + .dat = {.tolvl = 2} + }, + {.pos = {17,2}, + .type = 1, + .dat = {&trigger_weapon_anvilstick} + }, + {} + } +}; + +uint8_t SEC_ROM map_dat2[] = { + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,6, + 6,0,0,0,0,6,5,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,0,0,0,0,0,0,5,5,0,0,5,5,0,0,5,5,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,5,6,0,6,5,0,5,5,0,0,5,5,0,0,5,5,0,5,0,0,0,0,0,6, + 6,0,0,0,5,0,5,0,0,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,6,0,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,6,0,0,6,5,0,5,5,0,0,0,0,0,0,5,5,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,6,6,0,6,5,0,5,5,0,0,0,0,0,0,5,5,0,5,0,0,0,0,0,6, + 6,0,0,0,5,0,6,0,0,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,5,0,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,6,0,0,6,5,0,5,5,0,0,5,5,0,0,5,5,0,5,0,0,0,0,0,6, + 6,0,0,0,6,0,6,6,0,6,5,0,5,5,0,0,5,5,0,0,5,5,0,5,0,0,0,0,0,6, + 6,6,5,6,6,0,5,0,0,6,5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,6, + 6,0,0,0,5,0,6,0,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,6, + 6,0,0,0,5,0,0,0,6,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, + 6,0,0,0,0,0,5,0,6,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, +}; + +CCMap SEC_ROM map2 = { + ._bmap = { + .w = 30, + .h = 20, + .dat = map_dat2, + .start_pos = {fix(18.5),fix(1.5)}, + .spritec = 0, + .sprites = { + } + }, + .triggers = { + {}, + {}, + {} + } +}; + + + +#define MAPC 3 + +CCMap *maps[MAPC] = { + &map0, + &map1, + &map2 }; void switch_map(CCGame *game, int map){ - game->_bgame.current_map = maps[map]; - game->curr_map = map; + clear_sprites(); + RcMap *nmap = (RcMap*)maps[map]; + game->_bgame.current_map = nmap; + game->curr_map = map; + cc_load_msprites(nmap->sprites, nmap->spritec); + game->_bgame.player.pos = nmap->start_pos; + game->_bgame.player.hp = 100; } + +int map_triggers_agent(RcGame *game){ + CCMap *map = (CCMap*)game->current_map; + for(int i = 0; i < LTRIGGER_C; i++){ + LevelTrigger *trig = &map->triggers[i]; + if(trig->pos.x == ffloor(game->player.pos.x) && + trig->pos.y == ffloor(game->player.pos.y)){ + if(!trig->type) + switch_map((CCGame*)game, trig->dat.tolvl); + else + if(trig->dat.func(game)) + game->flags.exit = 1; + } + } + + return 0; +} + +void init_map(CCGame *game){ + switch_map(game, 0); + add_logic_hook((RcLogicFunc*)&map_triggers_agent); +}; + diff --git a/src/map.h b/src/map.h index 5e30974..fb5b54a 100644 --- a/src/map.h +++ b/src/map.h @@ -8,6 +8,28 @@ #include "game.h" +#define LTRIGGER_C 3 + +typedef union{ + RcLogicFunc *func; + int tolvl; +} TriggerType; + +typedef struct { + + V2d pos; + TriggerType dat; + bool type; + +} LevelTrigger; + +typedef struct { + + RcMap _bmap; + LevelTrigger triggers[3]; + +} CCMap; + void init_map(CCGame *game); void switch_map(CCGame *game, int map);