From c4f5671e6fb151e841b84cdd4970354c1c4c4db2 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Tue, 14 Apr 2020 12:52:05 +0200 Subject: [PATCH] The map can now be edited --- CMakeLists.txt | 4 ++ Makefile | 4 +- assets/ui/reset.png | Bin 0 -> 21668 bytes assets/ui/rotate.png | Bin 0 -> 449 bytes assets/ui/texture.png | Bin 0 -> 262 bytes assets/ui/tile_select.png | Bin 0 -> 216 bytes assets/ui/up_down.png | Bin 0 -> 179 bytes assets/ui/vertex_select.png | Bin 0 -> 468 bytes include/components/game_display.h | 24 +++++++ include/map_editor.h | 71 ++++++++++++++++++++ lib/my/src/formaters/ptr_formater.c | 2 + prefabs/editor_ui.gcprefab | 14 ++++ prefabs/game.gcprefab | 9 +++ src/components/game_display.c | 59 +++++++++++++++++ src/components/map_manager_component.c | 58 ++++++++++++++++ src/game_loader.c | 20 +++++- src/main_menu.c | 5 ++ src/map_editor/brush_component.c | 57 ++++++++++++++++ src/map_editor/map_interactions.c | 71 ++++++++++++++++++++ src/map_editor/selectors.c | 39 +++++++++++ src/map_editor/toolbar.c | 88 +++++++++++++++++++++++++ src/systems/game_display_system.c | 62 +++++++++++++++++ 22 files changed, 585 insertions(+), 2 deletions(-) create mode 100644 assets/ui/reset.png create mode 100644 assets/ui/rotate.png create mode 100644 assets/ui/texture.png create mode 100644 assets/ui/tile_select.png create mode 100644 assets/ui/up_down.png create mode 100644 assets/ui/vertex_select.png create mode 100644 include/components/game_display.h create mode 100644 include/map_editor.h create mode 100644 prefabs/editor_ui.gcprefab create mode 100644 src/components/game_display.c create mode 100644 src/components/map_manager_component.c create mode 100644 src/map_editor/brush_component.c create mode 100644 src/map_editor/map_interactions.c create mode 100644 src/map_editor/selectors.c create mode 100644 src/map_editor/toolbar.c create mode 100644 src/systems/game_display_system.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 38e75f4..8024313 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,6 +274,10 @@ add_executable(my_rpg src/systems/dialog_manager.c src/map_editor/map_interactions.c src/map_editor/brush_component.c + src/map_editor/selectors.c + src/map_editor/toolbar.c + src/components/game_display.c + src/systems/game_display_system.c include/map_editor.h ) diff --git a/Makefile b/Makefile index 0dfff26..bc4ea95 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,9 @@ SRC = src/main.c \ src/systems/controllers/keyboard_controller_system.c \ src/map_editor/map_interactions.c \ src/map_editor/tile_collision_manager.c \ - src/map_editor/brush_component.c + src/map_editor/brush_component.c \ + src/map_editor/selectors.c \ + src/map_editor/toolbar.c OBJ = $(SRC:%.c=%.o) diff --git a/assets/ui/reset.png b/assets/ui/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..a3086d28580b2289451834362dd866b62cfa4583 GIT binary patch literal 21668 zcmeFZ^;?wR6E}YEvcQ5Op`i3q(gqy@OLwOtp>zq7lDil*(jwAIHzFMi2Bj?BZ(NjE zx;u8C+t2g;AHKglT$dO8aL$}_&zYGs=QXb}+CWd8ijs*E001gY4HY8*fP#NQ0XP}> z>)^%M82~_@xhN|exY*eN0AG?{(tx0f;jM0zsIr*ajVpbB?+g`W(D7(@e{~!Y<9jvm zpRCOq)~_|-wr)dzx6;F?`06)Abmiy5R8F3UCs#r|#H_aOyK-YU|2v-a!S4HGeLC4C z<3G;cgR7P=a`W2FJa)Bq3*tm3`hUGzKsCvx&;9p8_P6IwX%MSvI{|l$ckZ*dA_*Dz z$`!Gh`nu=!f*_COZiH8{p@!4z<2PJySqx5;R)gZ%>G5tCWm6fNdT5)&u{{L~VwYMM zKV{^b;8@4$6ZwP|O+L2)J?+hR)33CXHJ>`Kq(1ywpkh+SlX1Dpe6gonE5xQukf3LI zzQ`XX$?5vA#j$W%Ww77L$gr7+9UY*e9&d?!I&?B0csF$D3+cG-;JMUJ+ZqRK>(8&U z^K_o#VaZ|1^+(%mUn;x$0FYLWYt( z-_6Tsj7D4H`|ZR*9~u1mui(niqne4|+xtPAlL1n0FLI89CW3O>j~=<{zwac6(x3qt z0)W7g!2kR6|LNiX8NvTg&ai{n5lHyL{RVW#A!XZ{FD|jz_xBfuf84aWm_rfIan%j5 zv&*RII;Xn@HaExXcgn2~%lgiO*)E?=7Ay}=;CveCWr}b%CTBM{itn7C8tvmn1r{_f z39qYA(}ftK`18NtySI-}mzSus|CB`)0cal#4kR-sL80}$2wqGC%ch8TO}zHCpofYN z)h3P3+ULS0E%XG)Zk*X9lfXSC9hF7326haMC zPlJ11s<_F|7}9E!t0u1r2y!{eS%)YtO;>!i@txyf-8RV%aGjX{`=zayJlq1D`+df{ zmn!@!ymy)%LEcmp^Jsi)<8U-khp+cx@r1~m5K+@`wbK;ryE%zsfHjbM=YkjB;dS{#V3K=(!{ovN0lm9J711|P@ zN}v}8F1FHq=`Y}DCplO| z1EwH>2;>oLaRu{K&*oZ~-(}YOI#G8%gMHh-+e%)AQkFiX>07b#6PACIKe*U8=UIoRPaZ8U(GDpI@$ zKcE|8?bxiu8C`Re`}=s{nwJEGRYnR51G>a1po)1Z z=(*K(h1r!egVEK&`*E~b1vp;ex5~g#ld@u`WvvJNwF)S`U;@bi|3X`na_C#^sYeWL zDQfEMIwfDdko}Y8WLis2M45f!9bB)ceAGEi>LX@K`$w<%`A4!nY=Wby9zE*mpi7 zhsAKt%MIP&xpj!ly8{y&Cq|K>s#`DpC8UTe*{EQjj*6o;BvDFFltgl@kUGyv8nnp% zKYEqoyoh4Y;BJp6xX0o+^=$_V@hkq%#>~Ffw*g7Fplsl%2ewH!pr7ax7l`%!78uiO zSX{RAKo;seI$~6ux#o*3zmZaBJODv6^BO54#36FCxQEzv9|7B?BPB1wmWJELMGr@x zb;%fE-h)VT8|x1N>X++!(q zxlDVc`scCW!sGKt>Uo>8+F#j<5%W8=x*s;gIlu!*iBKEZpy=JL=1})~sbyW8ePnzO)ncMX&hMd2kud~N|jA8mUS{5EsPpy}ePBpdrHL|FlW6$)TUmVWdh!^3`OS@d& z@pyB{@G9m<^ThAwpofq9j=V8zILq)(aciZNresjAz;p#)8Yx8gc)NOal!)zNGsftRGo9&fr)i1zQ*Q*a(LmnFK&-b5+_?qiNACLDWV-oum{7hzKs9VS9XI+%2l{?KXF}PS+r%j^Aw|mK;p-TAM{EZ-8&K-fVpQW z9_L5(!f61N3EQYlYKU}L>ujTJz9jEBx{k4L+Dqx^;^d)L(SdXI8{44JNEI0F7=c%D6U5z^hkn)%Bxh^ z;z|0XZNR&%vstT{&eMeptBr!R+fRc}i|ujBb&&M4744Z5_|;G>W3G(GRfr^X!2B?$ zI{cYSItwlJ@}0HA0!7>-a@iCI8d?3E2Z1wVrN-46(mu@axJ*u!(c!`ab&jeba*xL{-Ikp0O`dQwDC z;yrI!dTzk;@DgC-IKQQhc5&$hm`Rh=xblR<{8P6bq=&{9u~0o5O}#TBt7{Rjai6L3U#Kd5IW_bAMqY}#cYGdufv114N4h$Pb$j?$bx->1&6-_Qod=D!`quN5- zXGKUtF;$3ppWpN;`37Jhdh@sFa|PUa=(n-MbnDM{8|SpH`H6hB*Gug}>O^w>=Y{qd zCF2JF^uc1yJVuLWWeSqRhY|4E03~>W^!H7Z>51RB%$ojb&4Zbn8HpSvL^^w&YB3?j z*?#2?+iu7iCr3P|-{<3NG7D-qp8QUeMt`PaYTjQDF;!4&2n)tYRtWSt?7q6gTi) zF9!gd6nk!-5dBZ7K(@dog>#ME!{(#I!H1cl^T$yGtKJtq1y59R4qyi_Z0QFmr%uV) z$HsjQeCM(;Ngi1HOG6D#IU`%cINGB+i+Xb$OQ&){o(TY4f74~D|B*jniFe;sn`%WBsx=Nsq)N5guQvLDhFjsKF(p(98yuoUZKLgxC z9~JWO6@@c!Sv99y_~b@n-IidO*6Eh%lOE@tFO0PEw6uxB3b!q-r7C;*Hyv#KAgRZ) z6pf|srx{;#dL?Bb)ut7n%+)Dqytr(y5WENr65w}RDg zQ3;6DdcKr#|M4CAAVcR(6Uo5$kP^#S^}OnwPi!3bG4IvJQePRC1ZXu1z|TJGEuX70 zF)UJ~AbpNI@jP>XHR;TL|pk}X1{g8|%>mf-yoD!QB6tnm( z*n^5U6Zv4!fTu+Zzo)_uvV1+I zhNxs_5aaCH^4^CxZ;Uw#sMUcKK8CYTt8J zi^jm67Xk3SldM1FK;Vfb1dsB9cKIY(V(a3G`JU1H@AaH{NZXbyVzNux+b^g#zEDYX zT$4cM??oTpP6=dyS;4ROXtE~N#f$CojQw1mQ0niePVPGNLV8%@z>$SU+4MPUn|zWC zYV`RXE4+)l#kBSlx?;}Gt4INN`~H{cEKGYOfwjXy^+A&rZx7~ebw@$9B&3qcqCIeL zq3jMf=N9|s+GQ@m!uWFO$<1udl(*pBvf7m7rUKp^3e`#bsNsggKNsp^A3iuv`VVC~ z$R2eo&T^jrcke3wb3)NakN7r=h1bU|c^^J#3e;ynG~UGPe4;TZmbW-fI1=U>>Ds*0 z*B;9tIk#MXca>u(0ev zW|9-AY^2n2%sVd*KfkGe4c?}Nyb}Cw(&U7=rm%nR7479!xBoj})QUJRAC$}hm4|(i zn73MEc3OMXB5U)b;aZ0ft7N{ysYRsaBPbxLSJ00}7v0%5yDxZhgFbWLiM>vLJz3%k zl(J&bRC>0)zwG_KXX#;6SYRd_`GfbQqWvd#AqRJ9mP%R=K_5y|uU(`a5rns$DEj}`RN**E=%E=h_ zsO52SS9<%Up0M^uPB`CuhuWe0{3CPw%Ym`8sI&i8tIm?1-Gev+HE$pP3tSanu|%OP zRMoQbAAb0Xbn^f#G4c-$GTmJ)i65_tZF6HE?geg9Ba;R)q@M#NX# zS+lDB;MB;)i*)bdXfYaiH2NiASu*pY&Q|5pi4p;ij5ln*0DHwG5hj>eQ$->BQTONX`a)P6l0}E; z{zL$pL}PHTwMgZ%KH8EN?^)(v$(+E-l%3Qk#dA@Cz?5R2cn@Z{mVWGH3G7pcjkA}Vdamp*g34y&t zAk>@dVYQ+%ZSvuuvp=D=YFJ82AP0{Ue5v`~gUlJmtH|txZ8DVx9rDp&#pV}SbH)y z`5?aQH1pb{Nc-x)%L^K4pp*7S-x+A63XgGZ&u`^gkWn+kmo6F$Dme^zp#wdTbm|f5 zkA&GM$l93yr?q}Av?0ZW6ebHJ9cFnVSqgpC^TwOt&Qn$^H)-W}h%f)q`J3w=A^O*; zP`egRq%)xLN(rlYf>B?) zu+$A~b(DA!>hZ$t<*jgmD4z z0*kr=DGOi<4sc zn~hdYHsiE&(hrJDiIZvQ1OX132av<~H{6Rpx1Hm#7>XAh@us+IZ2r;E&t!QjC-=?f z9-jmh+vnC<5~8w*?o?hd%zY+=$W5)zrI3V9C#cOtoZ6s;Dc^UrpdHQCrsq)lO=j>S zppYUWg|E~qaeKXB%7?ZvzW>G`SUjA6EfDmdp?=2IlGgBe6O%!TK#1Q_#|QsDeCUOX z+6f;SbeMK%Za<0cOo_cqnVH(X_A>)aCfk4IlN0?29bl4AA3OTzB&zsQ_kh{=7-Rgr zse}T$d)>LibyDwK=i>G9g(cLD^;`P&H`Py|P&AW75L23Xd_($Pd!d|XNp?GrU3v(0 z|7mr$TEHF%TwiaXe^ngu93JxER?s6CtJ!oQuS$5kv{B|boztJt@E66XpQd>Y0vDrj zX6SSTc2Z~n) zPov4;@*;CC`l%N|HzWOHv@Asp70tgHKT!U**pKh-eZ>AASr?eQ#PI&#IeIWLw*Sgr z$J_aHu~0iYKe&a-cy846H5yDzycQhuKggUb(#jHfy$BC2AP&g9S7_ma(A!FQPtmkd zu}`NDXZA5*3R&}-8%nOmw5orLnfcr~**k<90zaXxIRv~3yi~I8@c3ORbHM!m6 zy1IbDTm$Pv(YZ^M;TxeFE(JuA_Gn$c82yy;p1~F`6f(^4$)0zLT;gWsDmP5~)B%IEcfTyC{jmD#D;K(pcimj~y5pW3 zuz;v$B-(K%tO^y(O7H$7b>qVF!$E~zi6vJZRn0Tut&(c9et(t|+CDK{JX7L?w@H#c z4H~Hi^Od~xq!-6%KM$88zALeG`_F)Q){5 zQVYt&#nk#HSw37Eb$wEEi@W{lWe$Ltc=ywMYuBfa>p4N~6JAyIl=Gu69GRzzlzpa` z;zQiL#|e=^T@PTL+ZpqpNCeRG|0yD~|3pkEaC#G{H64RJ_}RhX51Y>#6q2M()@FQM8owHWv(WPXr>|(Qbu32%aNNyT|ro zmGiV=uiqg5I}D(A{bgu6JV#uml_AD%^6-3G(+h(mZGEBMMK%Wf4TzfE=+4v3_dan| zfmu8tSUUYI5Cn6hiZ0{Bg)hoI4sz0I4er23=nPOHkL`N@&`J{{%34kXr7E%a@mxSu z^Pxzp6{{`E@4vuNhKEK4#OyD7$slUl8;NFs<&^B^+3_Zg-#8igLB~YW_$yMQsgMqM zJuC4>s|cHM_CuOSnn*19%|-b}#eoKmz7DA*e_D=j?@B~oH#0;Axf9m0)3~MCF*X8ft>Nb7Q+G99xoy?$QTwt*c82<=_2%) z6D9Iz3<)HD6kfdWz^s!mU0`*S7Q zY&o&5J}CMY1g&lZf)z%SR{fu!iOz_?~S+JuV&5Ppy0 z$dg_B7UCul7!ufC-FCm&iL5jK&^H}Zdv%&~+GVb9z+&@V11*Vn591`x{E`Ao{TGtu{Ai6}BrUFcpwf%Hg@fWj%#t$Rb ztF9}M!ro|MvOD`o{Z2v z&wtvRYNPFufYec{b|D(4Eu+I$>EaG6jf-?LJi*)*J8G@@dGWA)@r%=HbT^v@{vtBx za{K+wEB&BC_PFwD9p7o;?)-SMCTzm6FuvHAlAbN@HbMG3P5oUsBU+y7HXapCm^-#* zQD2ZT7)+991&vfcIqvP*ZF*5c=*(W~HaA{N0}g@1RFPfh`rL`_^>qs={ts>yJT_Y@ z&GL8&eV=j<23XlHU2N{e45-JOI3Rneh6GpQ!U~Ka{hM_I~n~ zt*)(P{WOU=4vL_Wh8z;F&zjzP@?b@qb78Nj3}+T548A@`Q^%%$t_LAeRrkyGJ(nAu z)}6|JQ9(BwXRoCQE?~t*EW5aWK0HcJLP{UeYi|-9W?4Vp#gB?5#-L#bkh$Y<+XLr2%3~&)&7}IVJbfBb(vIR%2xcwFMc(8G1pXB{(Sfa{dqcnxl1JY7)@>-L|&$#3Q*#0K9V zBZYxRtHTPPUPT<6oU!i_YHb>I!}9s}Lt6g-cH>Y{9nAcf8HG&HG-WWV;u_10R)V_yxjLRZO+J2%eY&&YB6Qx<+S(Nrte6(`YI_eD3#|EsjqQp7D}*^tV`KM zt<3!X%?g2WMT8qvLEG4tabf&>^mRemD+ZYWQt$ZiD9()ROIS1(BfeQ5xhO57OWunZ z45}3AU(sRPBU%Sg9=|BKD^@zQ9b2~JYsK25!aH{waHaHsx3og|3VlvL!axKfH?tl* zG;^=EpQ(CGUG}<5B=G-n0dSTgRsWS$>jH?Ek|iAETi@<rl%@n+= zzwoRc7TRty4(#3m_kX*Ak!4r*V}htY*BjQJ?6qfnx(a$so!YtMSXsGR&8N< z2!P-{e?~PWH|RXeTqd;O`umbTaB;Ewz7(pyCpO=odwOIk*)t(73-#$%nq>9H!LWg! z+8y|!%KYPW@1IP$v-X*H=Sk)s(_GUrUImbY=K-~HCzY+g!)|Cv+*u%wE@z)=P_4cX zTu46Dy-~-X+b$>6lrXbu);H-R6}A0^h@SVMr4l(NFBXF;A{3ws`T{a}yRO;X5A7~G zK10x1L=F))*`!LmX-8!Q<@cuLqz5-|K6x;5yg7Ghzu49tJMi&=+&S(GoK4=Z_f-ET z#?*VcF>8%Kw7i7+=7S?vB$(Echr(#Jj-&7v`3g5N|?p?~90MwUm8L z-<=exF62D>`@=J{wR21Bu=#CyMMRG^eUJTu4Trw0Y?NF0imVCljr12eRV9QJ)Vspz z__{#N?zGBdL8%vvaFbF-fGTT$twp0-)c3g+y4yi_da5u{F;j*<=|^@DSewe4ug*?anPqp>rwzI zwK2UrBy1YaWd4cABmHIE#>{YLedFsRZ)HEi?fN3pS5rQMcw%7i>jJl}m)WTDmIQvd zloYjPo(>$QmbV*$Jcr54n{VAmIzR!ccgKBUzwiI5QI@EZSQvCWpIsY3aQWfxzRZQD z<&++cL5qL!;fbuPXQoz1TKKp6U0tK*9t@m?O!lvkLa+@7cSTuZQOJ5Xbj%d11p`yi zhBs?e^j-ui`VG0g7CnCtl^)-HhK;s}7;(h=Cgm$Yti_f41`^XFJjov0oG)1;k7{l$ zl7D{FzoqQ|#VXnKJ#zoPWkSTYOFKkb)>(D-C!A~6RI_L6#uB|pr+}u>Kr`&mdK(YT%)|D6a7I7hw zeJr6so>MouYiEP`+0i9T;{9>2l#cvtUtTL_PEA}U?a3^MacIn9v7U_~ith zhC!l|!rzuxYwcQTcPzeibi{lJ8K~ztlF*i?DPaj8%Et5+hn-9agjeeTL+&?Z6}PtU zUtOM4OSQe&?|Ufsu6t*MMf5Qlrna^gS3G>zgYCJrK_IHk&4}^rtapwFcSZ@*c_t60 zdhi?5C~>{(z-w2(52P)l*J22SxaN{ugP&gRsS;;-sfD&!P2M+jY$Q=$$e-ux%5S2#^0jT(rHafHg}u`5$&Q1mvP zNh~5x7Z)-4t^Z}8IT+=H3!0IP9J|yH+890DPSo)xRj8fYL|CftzSn#kRB>FPoZRh(! zhGGdYyQ3AmM(J8ipZDBPtmsq7(bxC;ODATlpI_$yowW~~UiIg-=@b)x%s;3-G0_gc zx~M(Mrn*eCuCt*~g*$X!kzYZ{a4rrpFZ{S=RJ6*G1b2anB3 zmaEm4)Wbkx2-1Jfhuh0}q3&!hpX0u^ptc7I+L2~xNI`62?U|0v=~(ziXXZ~XFT$Vz zOb;cKAB*%6680KMfCf7bX)g4 z7$e0a?6#+vXA45mYs^nBe!3QUJU*=29kZ6Xd0Bh}L6aHDYT)r5!i+6G@rv@Q!$(iq zwiB|5lBui2Ri;MVt%FT7u^;pP9a%&WBJBmjqu|btKVO~?IXN;%#{M9bh61)!C5nFP zRNa{89=|?FWhy3lE)e;%%yah~i34eYg4tOZQny@>LGzR&DNX+~c^m73NTfT=*KUX4 z-kokPHkjXb`gCDN-x`X(O%L(~5bEAeMxQ3WPv4lo@ZeY`PTwEEvP+|a9cr@IETTdx zwY)*zl3#;`_GFhgA-%b*0V1@hK`qIUT^x*RKv&Z-Q@vc+e zgaAR0o`Zn6vmmnT4L!tf-h`eeZ%$U&Q{FsvKoW%BR(6r1^n%4nq6H6NfJfyMa#EL? zdY_!lyu7#i!`(}6-1qx=i#s%vb7V$QRE6h}Bb7rr5^AAx*+iYy)@H||u+;BS+Z+ap zP&;{cRKX!&FIB+JG`w~rhxQ(~8Nwa^9ji4_N`5W@%9uNH!&pUHrpTw#wGxj|< zcQO6ba1D64EA5LB)9laP3Zw@xpep``r3~YEB+vfF=eVC~=B7(2`#4M1U;Y%nLJg&5 z9Uhx=GYg*EYIu_H7P=SzsqQBCkU)WSwV3=3bIk^F)2pwY0$35qUIi#ZJ@h4i@4&1VX; zg2bN6)gkHJE%OgxS!rx}erubh-{+Sxa6$({Qyb79;|eEtBUYRU8CFPV`V(*a~82->$N6Dxa;+yTO#)WFBY3DNW4K# zyZ-GpY6x0+-{rO~Igj??S`Tepd9^*gfae3C=H|`S7VVZw8%cb1=N^qT@sj0NA~#J5 z73A>BEa~Vzh08^X5Df6E)u0+-)|%W6Fl}97O|B)I%3xxB{1#<;*}fndyllziG< zYu>CE`9-aH{B}V=S;EYXck$<%a7495d(T!P^Y>hjFh7=iL(`d^;M0m3f;{f|grR>f zDxT2zG~B_K3fWIKyg%!cI^F=6kf*)nwvt`izh_k?LfDFeL3b*?wBrO|@f9?^P-YVaB4Z$r@0w1((5xq_y=32vSYB z2w|%%O;jipzJtJzo0Bg3T-$Q&yVj5>mz6ZZ0J0-nt{V`gI?Ma*tKgyx!2&z<7Rft`34=@bwTeDMa|{iAtghwsG$2Qq{%m#K8Z z7GdjMnB{8F9nHa)@#30UIonBtfsTLGY9Gxq-(y4o;fk=fsi zxsmT=Skwh4Lo z4Be2>>hfHFqrl@dB= zJx^XohY4%}XKd<>fTEKh8OHWu&Bt?f%H$7v8)Nn~i|@J?Ic^s;{0Rn?dK0SMs73W6 zBqJ$yne?U>U~q5eXw5euFqt6lm$Shw%b)76KtRf|Gwr-ipM0|w;o~Gg zW#_bz=13vYcjFGyd(?#t0FO#oR>RIu4O=OY7SZEfv>ZrYS2*~yCSvAR3kbo9M! z#Lf-&=WDu1kU8c|3lF_0SJI{hU{f)aP=u<37x>?w9$IOZ|<9CEylC89zcZp(q7^#e%!^9Ipkye>L_?!sB8G!AD^ zmiIzd-}F=5v+E9Rg>pW9SaHJyktO3f$v+p@GoxT&wY~F${MS^m4iiUmbnR_mr?x41 zv_HS{4lR?QfwoAP6O`v?Kq*^x+uTD7I#3sdbVGAQN;+E(bB=x{8?j4NdU@Ra0OWRfs-*!#Dg;HhP5vMhw&hK}b3Z{0xHZ}wOF>2cJl zk$nHRL}#hh=Z(!Q``crgmcCMveQ=z(twAakEJLrw32u=Ax_xbN`6*wufF3dP>jpHc zFjK0(bagj4&6ifUQcf7}>O|@r!ude56Du=i9zZCT=0q^U5Ht{o2XR(6G`Q;4Gc&Pw z*31wiPudK~jv9kH*_`koucpnjbO|LqZfYT6KjGVQA|1%;=>~s_iE@t6?6TgLwz3@2 zuUFA2(yEy&*OM>oQ{4A3t-<7aB@~Wn(qQ>{0vF3eWwdlrNw< zAH%+!c#0n$nzj~R^DWw2ZCW|g)CT5z1ZT#ASZXp}2Lz>+1Aa?D6ruDy&bzLlr5BaB2{V2*G=bXm#|r6B=8G z;eb)b^NWndoyJ54qJ*xN7a^e>8z4y2EESgQ47S5H(G6Yg+$i$#8yHEc>fBw+8dFkB zt{oYa5+5mIO4Z_TJz#)k*=i{>!t<$1tj(5-EYHP&oN%<+qJH|HZG8akqN61&52Xa zYXM9D32*yO-E>+@TPlZ38ASmyVs zuWJaWR6a6OWdKS`1Agx$_p)Ng$9GE?Joqauffj0f`~cmp9j z-*om^(bX6851-EdQ8-$ulVG0!#)?V}Z-5<+$mcNMW6vuw?F@vp)r(B~4jY#IJ-5HK z$WsqA>|ZaWfI1R_Zr2L1Hva+jB2c@Xp)}0{%M;%+q6NNi%KYn+gh!znNM@Px-)CWl z&z~USS7_fbqLuC$Q-G~w;Xxq1&ZfON4cmu-dEq^&L@fh|^{pIL*2xJ}$ z)O)4j&7IqL&%CNTk!H>HbpPXygI)tSi9l}=aJ&u^eujLBvc!mzN0+FW*k7jF3pWZ) zbzKg?ayq!i28Ht za!~_`#aW+-?p!a~mkb=l(rVvOy$+}h>%jkgJ>miM!x=`!Xh1>ZGddg7esuhLCyGH3 zyhduYY+Vk3nj-#1^!!%rcT})`&`6T*(qpT=awovbU zx6d0eo!LZ~+>qAkin_3_17~_k1piABXi6kO;#ojU=aX6)R9~oJyJd}WFegU^1Y8t=Wx@G? zlUBMr6WLM`vZ%fX;Nkvv&>+rsFY8y1%D(|%riUedh|0$3UM_66=-fgaZjCyFe1!iU z3x@TmPO%_>aQotkTMpMKjAAXmRNec9DO|;fU)sz{5~$psfh;>263vC%ww^+x;ze$eP2!3{ z@Egj=w}g@2Yz(NGQ|fy+q3EY)wDqYPNcDGBoW%-OoKp<9GY@5y10=Qu47tl9kUOw3 zr>gYCpI@#pO=n}G!%#bU+BXsbkUM6QtpKWI^RPiA*!(ovqh5Ce>7P&5M8B7gW=Jh0O9)BF?Ccz*mJt;z>S^{A1H6{2fTRAwFnrqVm-)L_7^2q@AW?1L zEh`U4Km~dqqvk}gx%FU&j?|vkHhQO2MgiKguV9Wv$wo2}N)-QkTwB$EhWB4Lz)YK8 zE-!*eXZlz*zAWTbd2p1;{mTx$SB|fHkH=#ii?hY>@x{p0r^7K~C0_}zPev7a<^;G^X$UtLJ zOcD};dJj=+e9SpcrcNIDcG?(Yq3S18i9m;be&f zURQrN!svGb&XAFl+0r*!ZV>gk-5_?dESGfJ#Xpz}1L@3bx|R3-B-ZD$nF zmqQJyG$F)j5j1VFxYXz#pO3`UFy>p zuZnL@cSTbGB2dly(=;`$47%)9id>%5nVJxRzDZ$964;lwOHaFeUvY>@gH{w zc*)Ns*j7ck@(6Z4=ANTgw!o!b)Ab*VH^1K(mYn+dUg>zD@V3#0Nh@VBJqA$BVVh-wz z4ektE{e0)*%S{asy*pB+XEEtndeIzxR4D zEXH!b=f=v$52#{`3Il8`prhFP=$47u>r1<-d_@M8?TQY&yLbPlkbvy|Wgv|+^7{J+ zfqQLCC2hGW>M~6OyiBrtu1|t~@WFg1iSoiC^`u24=eh-#cDLSvuT_1fH_U;NV8bAA zh5rq@sCRHAd-qONnz_AKoyS{pHv>DKI=62r&t9JO2d)WjGe>;nytI3)y6W?eEjO_J z;)?Mu*b6*A7{|g$JLJ18F5vpA;BT2klO~S2V6;c9bM9S%EN(I#%|iS=Ku=)hJ@dO> zYD=``)m3!V2MlPO%U1P~ik((xjz1Jb1f-hkO+p`HvOZ3u^=+AHR&M8oJ?Z+>uW2tZ zrLdK*=O!Q(#;F<5!JZ93I#;gpKY>Am8k$pOF5(6L`iVEyt*Wo(ju3sAcCaiEu7`q1 zq#jDMbeGC%JHW8`C6?G%w2!y&xJlBBpn@RDX!xIsK`EhT<~_tpty)r_czsgx#{9&B z?c5tM?%%udY9Ic~2e0JD{d4NErGvF~%A*9Q!zR1y;JdNaV74U2n-(ysHRT%99F%Pw z0&JaD2MxQrg!@h#QK(mhlb0_cmh4@{f59$K>cklG)kjmNU$MneZVWKJuVL^(4QGt1b%x9|6l`2Or5i_qj+4B4hG;=PxlAuu%du<2Agw@se)DsrJ(`gHsmxtEWC- zHNa<%{9@FpI)+wV_7EKS5PT>+U|`Dq8Y6>z5hUh?88ke<uwhmVX64*K=v_uLR<4@J#e?tiRFKnSQIvFF)BGFG5Lt#*uXJw6T#MoLvO>6IZ zt*46&t+fowG}-^<(I2om5x{rvqEml>4f>-ms57gw3nXYU=B*WOjXi>-%7pk?|C;aB0YV=+U^~;6 zaiJyPUXMu4;gHQB1rhLU;oMfCOe=}?Y22rP0|s1z_un;p0$_sX3+3v!&=DEa&tdLlP z8oX{YjqlF**w4r^_|}yr0pxOI6V~4hZ17yy`{>jQN+ZX)3twQABVoQ76m_Gl()8Ys zcbnIS4|`XtXDGf>M_qIc)*_gy4r3|K^zrizn(a235xVCFOe-A%e!s#nxNXbs~z#XP^;`h*#1t&SGI+lFTx?Fk3NoJtZXtkqdMD! zmB<{2@HCeOp?@sKqXPp28+;T?=lJA-`V3xl+Nwcx&^E@DP=2dmx#NimRx})%P2Hm3 zo%PQf=i<1^^Kap30m(Bc_-PR^>+*&g^fJ5DFhA^o;CQ=2GzmQMXunM)PVifQJmo=P z%1X};^?gsce{V8zS;4fZIa9fuLtVM(i@+#++EoB4Fb>3bdS>}%Uzb4g3#aKM_2a%k z4@3%;a(?cbyV2%fz7E2XgUE^i&3mKz4AZ;nO;WGN`l}eEazQb4hui-*AT#WY(jjWX4r6RayqXVn$^b1EWeVH=qPy>gO1N$S~&&vO{-;B zA7Xkxe-jDFEO^>pDFbexm~1mjD#VXKB;fMKQ#>_uP>%Tr*@Jbk(faD<((S&mMkVZB zJ0Q7OFmviBh#G_wpU)p1f+gv{m)jh%OJGh*P!>IgtilI7%!pP1VM`k8gGPtzuGs6b zPX&*@TwZ_Ck6$i60Wi%w?K`|gJwE(Fg*{f2))SKSu06<71J@Z{_nbC8KOBJTZU>0# zJGA`LL+sTg;7U_RURk6#EgtY$Vd+jbQWEg_b&4V-_w}Lp*ZL+b)sakSei@@?iIjHt z&cNOYDRiA};>0sR*n?K8F*!-`S=Zd{o21XGt`-})r#RFiOB*lyJZaY>j{dfk$dZ%n zw;{ek%+T2kqL}!MyH|fByPZ~YEGJ54-{?IOhkgfG*H&KMFl(3Jqqe^&LdNd2>+Q?* zKt-FGVQVvlloR52&etV};4RazpetDC1i;+Mb+5@W)gnATvP^(BuBc5jRhlI?Y-R>> zfsy6(=0=42OF$x|$hsm~=P^KH`XvF)utN!NI;HBTev~WK%TF5JIEdUX8Jx2z@R!0% z;p@Lj695^95B6k-8)b918I2=Jq8iDs+=c!5F&ffjuOmMHlW{N<)ZW+P z>iyRoR)>ZV^PL;ajvBK3N|o*U9Yk`ycFg$!K<0cH=$zf1OBCq~fBA_JW`cOdJWI0h zzdUy!vMMB9$&-+>h9UfXNb3|wm*mM#ufmHM#CXT$CzR5&cAgWd?5B#*058U^=01^}ijl0x0&*vtsef-1C!QW@E#!YbwfDU?UHKU;buv=g( z`;iU`F2Sl?im904zhka07NI5-NI#k+4gJy|6*J|6w<0K6N4>{@Qm2oB`c3sgxl%?L zTA&*;kG?JD+i4S*Zr1JIF~yqw)n(xdse@EOB;9s+D|P+;C};=UXyT+ymu8}L(_Uuk zKISJ_Ysd|rT-f(qSk|UpNokAy0RWC*`AwYc6&az$zK_1Euh0d!q!1_Tt!esblAlp~ z@PQ;q2%@sbCL>+|3{$pV5z=_7m1 z03L}Lm|Bcwe>RM6LC}>2=Z&jXqm#go9Cu$T4DRZt-?=XFJf5*O4i6Lwcf&(YRHIGV3X zV*a5jYJCs|CG70-;)XJ2ZE3_WV)@0{sD<0M*!$(kck=Vx;?V8teBRLqp)(PXsnbB& z>(*rNj+NTw=Zr@oIXI_J5n;UyoC3|1B76t)qF2We_4PRQyp@4OjRoEd*vAeZE*5}H zVbF`h?9YzXZ)jmcxRA-MXE%7Yba&Z#W4Cbb%+?Z=ds)tp$tf&#LFCAD|B;p!Z`S9&=7_@MpN)(>foVfqCb7#&m9Tj1hW%;K!xUTNjT5~cSJIF zFu>k@%!FH9}@ilcyz@1;neddHyq48C_xJj%WomQdP z4c)gZ)(^-A%OOXISS$jfX7o3?p%LdZ=*Mnz4{J%POqjkX+fYc6cax4fr5=~;>%^NJ zd*sDQOKnO4dfDm8^0m9({01g3$5C8xUVHk!G!XX3*!`l~u zzhl*V_rJsY@&P!%m+I~wJQfOtLZQ$Q8P+JUzxc)mbG)Hd^z0v`5bkSH57C6D) z>4ZMiOHjZ%GEnas2iOWnUFS%6*lOi^<}Vv zL4?+q;w;9mQCBm-U%42+M_l803-~!iT=D5o6vlfy#7JClr#RlrAy(pIOWpDAhme1r zL*4Q2hmd#ORCm1lA*|qkyr)B$7Ce-t6_4FFWt7Lu2IATUZq6uN|dh zyEDq;BOHDIWgEq}sAIJbz$-f95n+fWcCZynJU2Gp(H05R8^Ag^BSQy`)yF4(ZycT@MQiF| riWPov7C+7{Ru~~hC=?2XLeBjGq;P0ZkTvM100000NkvXXu0mjfK10Fx literal 0 HcmV?d00001 diff --git a/assets/ui/texture.png b/assets/ui/texture.png new file mode 100644 index 0000000000000000000000000000000000000000..fcde0062f9486caf3ff4ff968a7d89f7faaba634 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB&U(5yhEy=Vxx7&DumMl&!zRAK zfPfc*JbU^VCN6L@cq1UG!_2~F!Oy|s%C*7I;r+X0Ci{!pVzYPf@OG#^oTjIB=Ph^t zxAww|`FY%L3~s0$DYr;qyjnLona%n~*c~J5wzVJF3ZJO8x#uNSoOJEk)6qGD<*Ly# z?*7e;m0gmz7UT#o=2u!gLw1wa35{h9SwNNHwnsU-XLS6m=*o1Mm&7(|k1|%Oc%$NbB=6kw0hEy=Vy}nlPkb?l*1@#FY zTniYu9F7Gus47ep?9gU%R1}%8NZ>?*vcmCB*0dYun~Tc#o$-C=?$x->Vv)^Czu51K zzBep&6Ynt&y)t#?Kk2IcsN^0Vla;+zf0rb3L~Kel`oH4i>8>!w&&C11Y*|08t=>L* ze%xDg>HGYi%4w+!_Va!bp8n@=`#i_;HCG}ZNXegwT+Hjo=pD8}SY;{u5r>uC{UJ-9 Q0G-O<>FVdQ&MBb@09`3mZvX%Q literal 0 HcmV?d00001 diff --git a/assets/ui/up_down.png b/assets/ui/up_down.png new file mode 100644 index 0000000000000000000000000000000000000000..c56e6a269be2203ddbee2589bba051e087c5b709 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBsytmBLn;{Go-^bUs zAj`GL$BM;CfyJpoWXbD~PgZ)D$i4HfuV3b|@;2Ajq<(iv9-CDO9}XU$5ZJMB@w$p- zvh!Z1waDC?>cC{FGr@r=@B-68rn!aw)^{$SH7h@o|HeM9tuV0R;bMlv?u>2ykCFwx cN+>S1bGp@bAn>1MI?xpip00i_>zopr0EtsTi~s-t literal 0 HcmV?d00001 diff --git a/assets/ui/vertex_select.png b/assets/ui/vertex_select.png new file mode 100644 index 0000000000000000000000000000000000000000..f15e04b686e3bea9a06e38dc48118d2d4312c874 GIT binary patch literal 468 zcmV;_0W1EAP)Bga9yv1B4Jl2qA?u&=~ zNN?M#IDPp5S?le;z3J^gRzqmj@bp3$D}0@hRKyI%nxgQGnVI4QbHy)4DBpWEwlFa* z@D8ta5W$E8R+w08{J@A4KH#N+96Z7hC0whDDU9eMRb4sYF6Pjd@g>JdyiygpOmk!q zx2(+GDalL)*uz*`1V~y|R%(G*wP36>@<>}5=0X|HtzfJ^yd;A@a$a7UojiP1m4~NO zb-Am&CeNvY%PYhZ#u~$SYuWqc)kSt}5yE#9hwpmm35{=kmtL}!+zDQjJ<;&}PI65E?zs@?Mhun=5>ErBUm9;=u%8IbT2%$B`?#gGo z@LEF#-PIly+@%cKIu{BNR%ju>L&~8kd(#qi_rZVt`| + +enum modes_on_tile { + VERTEX_0 = 2, + VERTEX_1 = 4, + VERTEX_2 = 8, + VERTEX_3 = 16, + ALL_VERTICES = 30, + INVERT_ADD_VALUE = 1 +}; + +bool map_onclick(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ +enum gc_mousekeys key); +bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); +bool switch_texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __); + +enum brush +{ + MOVE, + RESET, + ROTATE, + TEXTURE +}; + +struct map_manager_component +{ + gc_component base; + bool tile_mode; + enum brush brush; + void *selected_texture; +}; + +const struct map_manager_component map_manager_component; + +#define ADD_VALUE 10 + +void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r); +int get_index_nearest_vertex(struct tile *sel, gc_vector2 pos); +struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos); +bool map_manage_click(gc_engine *engine, int id, gc_vector2 pos); +gc_vector2 gc_vector2_from_coords(float x, float y, float z); +bool is_pos_in_tile(gc_vector2 pos, struct tile *tile); + +#endif //MY_RPG_MAP_EDITOR_H diff --git a/lib/my/src/formaters/ptr_formater.c b/lib/my/src/formaters/ptr_formater.c index bcd0c41..e78259e 100644 --- a/lib/my/src/formaters/ptr_formater.c +++ b/lib/my/src/formaters/ptr_formater.c @@ -10,6 +10,8 @@ #include #include +void print_ptr(void *var); + int ptr_formater(va_list ap, char mod[MODIFIERS_SIZE]) { void *var = va_arg(ap, void *); diff --git a/prefabs/editor_ui.gcprefab b/prefabs/editor_ui.gcprefab new file mode 100644 index 0000000..ae21278 --- /dev/null +++ b/prefabs/editor_ui.gcprefab @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab index 443025a..5ccfbdc 100644 --- a/prefabs/game.gcprefab +++ b/prefabs/game.gcprefab @@ -19,6 +19,13 @@ + + + + + + + @@ -34,6 +41,8 @@ + + diff --git a/src/components/game_display.c b/src/components/game_display.c new file mode 100644 index 0000000..f2161e6 --- /dev/null +++ b/src/components/game_display.c @@ -0,0 +1,59 @@ +/* +** EPITECH PROJECT, 2020 +** DPR +** File description: +** game_stats +*/ + +#include +#include +#include "xml.h" +#include "component.h" +#include "utility.h" +#include "components/game_display.h" +#include + +static void ctr(void *component, va_list args) +{ + struct game_display *cmp = (struct game_display *)component; + + cmp->type = va_arg(args, display_type_enum); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct game_display *cmp = (struct game_display *)component; + struct renderer *rend = GETCMP(entity, renderer); + char *display_type = xml_gettempprop(n, "stats"); + + if (!my_strcmp(display_type, "selected_tile")) { + cmp->type = SELECT_TILE_DISPLAY; + return; + } +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct game_display game_display = { + base: { + name: "game_display", + size: sizeof(struct game_display), + dependencies: (char *[]) { + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/components/map_manager_component.c b/src/components/map_manager_component.c new file mode 100644 index 0000000..4d78460 --- /dev/null +++ b/src/components/map_manager_component.c @@ -0,0 +1,58 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** map_manager_component +*/ + +#include "map_editor.h" +#include "engine.h" +#include "entity.h" +#include "xml.h" +#include "my.h" + + +static void ctr(void *comp, va_list args) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + + cmp->tile_mode = true; + cmp->brush = MOVE; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *comp, node *n) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + void **data = scene->get_data(scene, "tiles", NULL); + + cmp->tile_mode = true; + cmp->brush = MOVE; + if (data) + cmp->selected_texture = data[0]; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct map_manager_component map_manager_component = { + base: { + name: "map_manager_component", + size: sizeof(struct map_manager_component), + dependencies: (char *[]){ + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/game_loader.c b/src/game_loader.c index a712a0c..2c75a02 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -17,6 +17,7 @@ #include "components/controllable_component.h" #include "callbacks.h" #include "components/game_manager.h" +#include "components/game_display.h" #include "my.h" #include "map_editor.h" @@ -36,6 +37,18 @@ const struct callback callbacks[] = { {NULL, NULL} }; +const struct callback map_editor_callbacks[] = { + {"map_manage_click", &map_onclick}, + {"tile_select", &tile_select}, + {"vertex_select", &vertex_select}, + {"up_down", &up_down}, + {"reset", &reset}, + {"rotate", &rotate}, + {"texture", &texture}, + {"switch_texture", &switch_texture}, + {NULL, NULL} +}; + int register_customcmps(gc_engine *engine, bool map_editor) { engine->add_component(engine, &controllable_component); @@ -47,12 +60,17 @@ int register_customcmps(gc_engine *engine, bool map_editor) engine->add_system(engine, new_system(&keyboard_controller_system, engine)); engine->add_component(engine, &game_manager); engine->add_system(engine, new_system(&game_manager_system, engine)); + engine->add_component(engine, &map_manager_component); + engine->add_component(engine, &game_display); + engine->add_system(engine, &game_display_system); engine->finish_physics(engine); for (int i = 0; callbacks[i].func; i++) engine->add_callback(engine, my_strdup(callbacks[i].name), \ callbacks[i].func); if (map_editor) - engine->add_callback(engine, my_strdup("map_manage_click"), &map_onclick); + for (int i = 0; map_editor_callbacks[i].func; i++) + engine->add_callback(engine, \ +my_strdup(map_editor_callbacks[i].name), map_editor_callbacks[i].func); return (0); } diff --git a/src/main_menu.c b/src/main_menu.c index a79c27b..2a0296f 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -10,6 +10,7 @@ #include "scene.h" #include "setup.h" #include "my.h" +#include "prefab.h" bool start_button(gc_engine *engine, gc_entity *entity, gc_vector2 _, \ enum gc_mousekeys __) @@ -21,6 +22,10 @@ enum gc_mousekeys __) return (true); } engine->change_scene(engine, scene); + + if (engine->get_callback(engine, "map_manage_click")) + if (prefab_load(engine, "prefabs/editor_ui.gcprefab") < 0) + my_printf("Couldn't load the map editor's ui.\n"); return (true); } diff --git a/src/map_editor/brush_component.c b/src/map_editor/brush_component.c new file mode 100644 index 0000000..95ab5b0 --- /dev/null +++ b/src/map_editor/brush_component.c @@ -0,0 +1,57 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** map_manager_component +*/ + +#include "map_editor.h" +#include "engine.h" +#include "entity.h" +#include "xml.h" + + +static void ctr(void *comp, va_list args) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + + cmp->tile_mode = true; + cmp->brush = MOVE; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *comp, node *n) +{ + struct map_manager_component *cmp = (struct map_manager_component *)comp; + void **data = scene->get_data(scene, "tiles", NULL); + + cmp->tile_mode = true; + cmp->brush = MOVE; + if (data) + cmp->selected_texture = data[0]; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct map_manager_component map_manager_component = { + base: { + name: "map_manager_component", + size: sizeof(struct map_manager_component), + dependencies: (char *[]){ + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/map_editor/map_interactions.c b/src/map_editor/map_interactions.c new file mode 100644 index 0000000..f501b2a --- /dev/null +++ b/src/map_editor/map_interactions.c @@ -0,0 +1,71 @@ +/* +** EPITECH PROJECT, 2020 +** Gamacon +** File description: +** map_interactions +*/ + +#include "map_editor.h" +#include "components/clickable_component.h" +#include "entity.h" +#include "my.h" +#include +#include "components/transform_component.h" +#include "map_utils.h" +#include + +void click_tile(gc_engine *engine, struct map_manager_component *manager, \ +struct tile *ret, bool is_left) +{ + bool r = manager->brush == RESET; + + switch (manager->brush) { + case ROTATE: + ret->data = (ret->data + (is_left ? 1 : -1U)) % 4; + break; + case TEXTURE: + ret->texture = manager->selected_texture; + break; + case MOVE: + case RESET: + move_verticies(engine, ret, ALL_VERTICES | is_left, r); + break; + } +} + +bool map_onclick(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ +enum gc_mousekeys key) +{ + printf("Map clicked\n"); + struct vertex_component *map = GETCMP(entity, vertex_component); + struct map_manager_component *m = GETCMP(entity, map_manager_component); + struct transform_component *tc = GETCMP(entity, transform_component); + struct tile *t = get_tile_from_pos(map, gc_vector2_add(pos, tc->position)); + bool r; + int ind; + + if (!map || !m) { + my_printf("map not found\n"); + return (false); + } + r = m->brush == RESET; + if (!t) + return (false); + if (m->tile_mode) + click_tile(engine, m, t, key == GC_LEFT); + else { + ind = get_index_nearest_vertex(t, gc_vector2_add(pos, tc->position)); + move_verticies(engine, t, (int)pow(2, ind + 1) | (key == GC_LEFT), r); + } + return (false); +} + +void move_verticies(gc_engine *engine, struct tile *ret, char mode, bool r) +{ + int val = (mode & INVERT_ADD_VALUE) ? ADD_VALUE : -ADD_VALUE; + + for (int i = 0; i < 4; i++) { + if (mode & (int)pow(2, i + 1)) + ret->corners[i]->z += (r) ? -ret->corners[i]->z : val; + } +} \ No newline at end of file diff --git a/src/map_editor/selectors.c b/src/map_editor/selectors.c new file mode 100644 index 0000000..f09384c --- /dev/null +++ b/src/map_editor/selectors.c @@ -0,0 +1,39 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** selectors +*/ + +#include +#include "map_editor.h" +#include "engine.h" +#include "entity.h" + +bool tile_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->tile_mode = true; + return (true); +} + +bool vertex_select(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->tile_mode = false; + return (true); +} \ No newline at end of file diff --git a/src/map_editor/toolbar.c b/src/map_editor/toolbar.c new file mode 100644 index 0000000..cc98a5d --- /dev/null +++ b/src/map_editor/toolbar.c @@ -0,0 +1,88 @@ +/* +** EPITECH PROJECT, 2020 +** My3D +** File description: +** toolbar +*/ + +#include +#include "map_editor.h" +#include +#include "engine.h" +#include "entity.h" + +bool up_down(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = MOVE; + return (true); +} + +bool reset(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = RESET; + return (true); +} + +bool rotate(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = ROTATE; + return (true); +} + +bool texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + manager->brush = TEXTURE; + return (true); +} + +bool switch_texture(gc_engine *engine, gc_entity *entity, gc_vector2 _, +enum gc_mousekeys __) +{ + gc_scene *scene = engine->scene; + gc_list *list = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *manager; + void **data = scene->get_data(scene, "tiles", NULL); + static int index = 0; + void *next = NULL; + + if (!list) + return (false); + manager = GETCMP(list->data, map_manager_component); + index++; + if (data) + next = data[index % (arraylen((const bool *)data) - 1)]; + manager->selected_texture = next; + return (true); +} \ No newline at end of file diff --git a/src/systems/game_display_system.c b/src/systems/game_display_system.c new file mode 100644 index 0000000..365467c --- /dev/null +++ b/src/systems/game_display_system.c @@ -0,0 +1,62 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** teams_system +*/ + +#include "entity.h" +#include "system.h" +#include +#include "components/game_display.h" +#include "components/game_manager.h" +#include "map_editor.h" +#include "text.h" +#include "components/renderer.h" +#include +#include "sprite.h" + +void display_current_texture(gc_scene *scene, struct renderer *rend) +{ + gc_list *li = scene->get_entity_by_cmp(scene, "map_manager_component"); + struct map_manager_component *map; + + if (!li) + return; + map = GETCMP(li->data, map_manager_component); + ((gc_sprite *)rend->data)->texture = map->selected_texture; +} + +static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ +float dtime) +{ + struct game_display *disp = GETCMP(entity, game_display); + struct renderer *rend = GETCMP(entity, renderer); + struct game_manager *manager; + gc_scene *scene = engine->scene; + gc_list *entities = scene->get_entity_by_cmp(scene, "game_manager"); + + if (!entities) + return; + manager = GETCMP(entities->data, game_manager); + if (disp->type == SELECT_TILE_DISPLAY && rend->type == GC_TEXTUREREND){ + display_current_texture(scene, rend); + return; + } +} + +static void destroy(void *system, gc_engine *engine) +{ + (void)system; +} + +const gc_system game_display_system = { + name: "game_display_system", + component_name: "game_display", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &destroy +}; \ No newline at end of file