From 13fe7390096db07f1ce13f303462e75280e60b17 Mon Sep 17 00:00:00 2001 From: djonker Date: Fri, 10 Nov 2023 11:32:15 +0100 Subject: [PATCH] push from github --- Makefile | 28 +++++-- Readme.md | 49 +++++------ assets/decoration/rubble.png | Bin 0 -> 1408 bytes assets/nazi/guard/fire1.png | Bin 2522 -> 2086 bytes assets/nazi/guard/fire2.png | Bin 2063 -> 2522 bytes assets/nazi/guard/fire3.png | Bin 2029 -> 2063 bytes assets/nazi/guard/fire4.png | Bin 0 -> 2029 bytes assets/wall/door.png | Bin 0 -> 2295 bytes assets/wall/doorside.png | Bin 0 -> 2411 bytes assets/wall/elevator.png | Bin 0 -> 2636 bytes assets/wall/elevatordoor.png | Bin 0 -> 2168 bytes assets/wall/elevatorside.png | Bin 0 -> 1790 bytes assets/wall/lockeddoor.png | Bin 0 -> 2464 bytes cub3d.h | 99 +++++++++++++++------- maps/{bigmap.cub => level.cub} | 16 ++-- maps/maplegend | 36 ++++++++ maps/postestne.cub | 15 ---- maps/postestnw.cub | 15 ---- maps/postestse.cub | 15 ---- maps/postestsw.cub | 15 ---- maps/smallmap.cub | 32 ------- maps/spritetest.cub | 15 ---- maps/treasuretest.cub | 15 ---- src/action/enemy.c | 63 ++++++++++++++ src/action/fire.c | 111 +++++++++++++++++++++++++ src/action/interact.c | 41 +++++++++ src/{main => action}/pickup.c | 51 ++++++++++-- src/draw/flash.c | 118 ++++++++++++++++++++++++++ src/draw/menu.c | 146 ++++++++++++++++++++++++++++++++ src/draw/minimap.c | 62 ++++++++++++++ src/draw/sprite1.c | 106 ++++++++++++++++++++++++ src/draw/sprite2.c | 62 ++++++++++++++ src/draw/stats.c | 44 +++++++--- src/draw/texture.c | 18 ++-- src/draw/weapon.c | 95 +++------------------ src/draw/world.c | 44 +++++----- src/input/acro.c | 34 ++++++++ src/input/game.c | 23 ++++-- src/input/{rest.c => guns.c} | 36 ++++---- src/input/move.c | 71 ++++++++-------- src/main/cleanup.c | 96 ++++++++++++++------- src/main/init.c | 147 ++++++++++++++------------------- src/main/main.c | 110 +++++++----------------- src/{draw => main}/raycast.c | 15 ++-- src/main/reset.c | 91 ++++++++++++++++++++ src/parse/elements.c | 111 +++++++++++++++++++++++++ src/parse/file.c | 39 +++++++++ src/parse/flood.c | 85 +++++++++++++++++++ src/parse/{parse.c => line.c} | 55 ++++-------- src/parse/map.c | 141 ++++++------------------------- src/parse/player.c | 60 ++++++++++++++ src/parse/sprite.c | 8 +- src/sprite/check.c | 65 --------------- src/sprite/draw.c | 91 -------------------- 54 files changed, 1684 insertions(+), 905 deletions(-) create mode 100644 assets/decoration/rubble.png create mode 100644 assets/nazi/guard/fire4.png create mode 100644 assets/wall/door.png create mode 100644 assets/wall/doorside.png create mode 100644 assets/wall/elevator.png create mode 100644 assets/wall/elevatordoor.png create mode 100644 assets/wall/elevatorside.png create mode 100644 assets/wall/lockeddoor.png rename maps/{bigmap.cub => level.cub} (82%) create mode 100644 maps/maplegend delete mode 100644 maps/postestne.cub delete mode 100644 maps/postestnw.cub delete mode 100644 maps/postestse.cub delete mode 100644 maps/postestsw.cub delete mode 100644 maps/smallmap.cub delete mode 100644 maps/spritetest.cub delete mode 100644 maps/treasuretest.cub create mode 100644 src/action/enemy.c create mode 100644 src/action/fire.c create mode 100644 src/action/interact.c rename src/{main => action}/pickup.c (64%) create mode 100644 src/draw/flash.c create mode 100644 src/draw/menu.c create mode 100644 src/draw/minimap.c create mode 100644 src/draw/sprite1.c create mode 100644 src/draw/sprite2.c create mode 100644 src/input/acro.c rename src/input/{rest.c => guns.c} (73%) rename src/{draw => main}/raycast.c (86%) create mode 100644 src/main/reset.c create mode 100644 src/parse/elements.c create mode 100644 src/parse/file.c create mode 100644 src/parse/flood.c rename src/parse/{parse.c => line.c} (66%) create mode 100644 src/parse/player.c delete mode 100644 src/sprite/check.c delete mode 100644 src/sprite/draw.c diff --git a/Makefile b/Makefile index 5884e04..09f9c06 100644 --- a/Makefile +++ b/Makefile @@ -6,35 +6,47 @@ # By: houtworm +#+ # # +#+ # # Created: 2023/10/26 10:46:29 by houtworm #+# #+# # -# Updated: 2023/11/05 22:29:47 by houtworm ######## odam.nl # +# Updated: 2023/11/10 10:44:46 by houtworm ######## odam.nl # # # # **************************************************************************** # NAME =cub3d CC =gcc -FC =-Wall -Werror -Wextra -Wunreachable-code -flto -Ofast -march=native -g #-fsanitize=address +FC =-Wall -Werror -Wextra -Wunreachable-code -flto -Ofast -march=native -g# -fsanitize=address HEAD =-I ./include -I $(MLX)/include RM =rm -rf LIB =libft/libft.a getnextline/get_next_line.a mlx/build/libmlx42.a -ldl -lglfw -pthread -lm SRC =src/main/main.c\ - src/main/pickup.c\ src/main/init.c\ + src/main/reset.c\ + src/main/raycast.c\ src/main/error.c\ src/main/cleanup.c\ - src/parse/parse.c\ + src/action/fire.c\ + src/action/enemy.c\ + src/action/pickup.c\ + src/action/interact.c\ + src/parse/file.c\ + src/parse/line.c\ src/parse/map.c\ + src/parse/elements.c\ + src/parse/player.c\ src/parse/sprite.c\ - src/draw/raycast.c\ + src/parse/flood.c\ src/draw/world.c\ src/draw/texture.c\ + src/draw/sprite1.c\ + src/draw/sprite2.c\ + src/draw/minimap.c\ src/draw/weapon.c\ src/draw/stats.c\ + src/draw/flash.c\ + src/draw/menu.c\ src/input/game.c\ src/input/move.c\ src/input/turn.c\ - src/input/rest.c\ - src/sprite/check.c\ - src/sprite/draw.c + src/input/acro.c\ + src/input/guns.c OBJ =$(SRC:src/%.c=obj/%.o) all: libft getnextline mlx/build/mlx42.a $(NAME) diff --git a/Readme.md b/Readme.md index 6214fc1..6c5b1d4 100644 --- a/Readme.md +++ b/Readme.md @@ -3,25 +3,8 @@ Cub3D is a simple raycasting game using the mlx library --- ## Todo -### Parsing -- Flood fill the map starting from the player to check if it is a closed map -- Check if all needed elements are present in the closed part of the map ### Bonus - Doors -- Minimap -### Extra -- Help screen -- End level screen -- Zoom with right mouse button -- Shooting Enemies -- Moving Enemies -- HP system -- Score system -- Levels -- Start Menu // breaks mandatory subject -- Skybox // Breaks mandatory subject -- Sounds // need forbidden functions -- Music // need forbidden functions --- ## Features @@ -38,33 +21,43 @@ Cub3D is a simple raycasting game using the mlx library - Wall Collision - Rotate with the mouse - Animated Sprites +- Minimap ### Extra -- FPS counter -- Timer +- Map sizes up to 1 Megabyte (1000x1000) +- Fullscreen - Player can walk in 8 directions - Player can Run - Player can Jump - Player can Crouch -- Map sizes up to 1 Megabyte (1000x1000) -- Player can collect Treasure - Vertical Aiming -- Fullscreen -- Barrels -- Lights +- FPS counter +- Timer +- Decoration - Weapon pickups - Weapon Animations -- Ammo system +- Stabs and bullets kill Enemies +- Ammo Pickups +- Ammo System +- Shooting Enemies +- Animated Enemies +- Destructable Sprites +- Heath Pickups +- HP system +- Treasure Pickups +- Score system +- Level end elevator +- End level screen +- You died screen --- ## Bugs -- Player can get too close to walls -- Player walks twice as fast when holding W and A or W and D +- none? --- ## Usage 1. Simply clone or download the repository 2. Run `make` in the cloned directory -3. Start the game with `./cub3d` +3. Start the game with `./cub3d maps/level.cub` --- [This project is part of the studies at 42](https://42.fr/en/homepage/) diff --git a/assets/decoration/rubble.png b/assets/decoration/rubble.png new file mode 100644 index 0000000000000000000000000000000000000000..e16506ac0b31a1969a771ac2b63aad3c104e1c12 GIT binary patch literal 1408 zcmb_b{WsGK9R6;zjgXg%cAcduD&^(6iE-1`=rV6x-tDHzqL^t&7R}4JB@V8Wm(Hw3 z2VF0XyhNlX$xF3KMT~Ey}d>K_1XEYf~^7$Mgf_fpRJzTX{lD;lj=(-3(2tCgn8ula3bTMiT6YQ^s8^fCBJnRUlBjo5Z`#nS=tFS3ep-A2K zAq0(QKbqV>ru6~AucgIL0OPgH3SvwRD61M zDB)VD^||KJ-o`Vrk6%7E2zqHn9qepO1ZNvd8yb^Isz(ui)Ub~(&yQI&=URH|S5@X2 z4mTUr1nuc3459nr}Oh3ulDWi%bl&(H#{ z^x}>`{G=MoI9N!kgjxq{y-__rNqMh{nnKtLB-|F{@kPLmbSZAwcZd`)D9e%`_*QGJ z-v$3RHU&~Puxw!TRnRH|i`96dUDC6-vd9;KD%Y3uOUM&miF_y7;IKLtM5MQeJFpBK z1FZPnPD5%%i|HAb1OT?XeiFi}!JSu&$a6&Bqez*y)-Pz(ZpS@p55^|C9|>elE=X+7 zNwNCEm5e1DYy^f(j?iz$3o9{rOr=m5(F@6b1cM+=OpG+FL&?l#ypY3zL9*a*2n3E$ z0}6*gA#f-ZxeA&wYYHmPQ{$IlQ-!%}aUNrv(SO!|nv=_Jl=PZ5{v9gH_reEAr%sWi=apb`Uxs`aKRnTt zAUY}LW^AoYM<2kcN($}ZIwL$Va&doS`>C)pjvUO;vKGfk%Jf`j8i?G1G;!n|Jl&Ts z3#G?!ce6dL`k7cCxg98yZ*vLK8m36DZ}eyE5(XYCv&` z+xgltGds$?0W*P!c@-Z%ZbhTeOZ?RbNCZAlTQn;7Zn-bV%1}y6x+I)R8JKu4Hyeq( zQz@XE`dtr6 z(>$l-dy93z6`USgs1y>{54YnR_tA7j&fMCGhUyg-Z_J<;w-(CAW0$471FnUC~8_MysOZn>0IDvged~~v2hF9V%Xs6W57R%=)xQZ4kNUX_2oaqB0PTHpmjD0& literal 0 HcmV?d00001 diff --git a/assets/nazi/guard/fire1.png b/assets/nazi/guard/fire1.png index f8015c9dd4e77cc41a7a17c4dbe1654e8eee49b9..6f6d7f65792859f088221ca0e15b611b38f78cf7 100644 GIT binary patch delta 1620 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 diff --git a/assets/nazi/guard/fire2.png b/assets/nazi/guard/fire2.png index 8300ac64aa5a5e2efe473e2347d0bcb225f28fea..f8015c9dd4e77cc41a7a17c4dbe1654e8eee49b9 100644 GIT binary patch delta 2059 zcmV+m2=w=l5ZV*4=K+5Wh)+8E000NpNklYUKp0Qe)0!socC@x%roNfNRwBZ?xD zB%wZ7o_+?rcfQ;0k|YUH6rq$tDaDSrKm7nCNkSNg=(;}Hr|UYd>wcCH_|p=LTUT|l zcKLvZ4{(XOJ+r}^q78Vu&c>DG(rfKqQ?gt(m-J4DgSX^ABUa#X?IgX)IG{!6# zWeSxkBB@Pp2qc?|;c$o$g1Yar(~W4ZE>p5CcDfOD-$e)kz$1Hi`T*G8-X@A7noBM< zugIv=rZ*UnW;vryo0?aox#UhS19o`?K$vETRDnt;6-|F?UJ+D+NEKn40k9#~r&9wq z#5xC7i=mJtS)ZLj2*7t`iOkfMJO5b5>Ac73n^LAXqX1{51z*7haCwRoKJMk5-H20NXYVIrwG7WKV8jYfkY z2mr{xeL8>n+-L@@?Muir&gJh?RJ|*!byDq5Xp>ew|4Uw zu(mHzSxT5>kY{W-8J_21h%UbGQ>)e3TK1^=7F)|6zVEY0NX4B2dNB1J0{uyhS9gTYN< zz`*5LXB z@N?&fiKG)tk}RhmOFCh~Zp}hUNo6l0OfrT^c9sb$F3m+BktsUixGWZ_LaH1~*DfU# ze%F85;QYOi?#tIaiv-8{2|xV%XzWy)3w5zmthksb5=b&6{(VBcOqpD&=z7wBjm?!@=69{{U6A;r6Q@&8gpn|sIigICnU zCjQY^0KB|A;P~W(+qX0pw0Ty2i_QHmg+hOUo`eN682KE4_83%1Ko|t_UMRu(ga3g273)Sy}Q z0Far&&^6*Tqty=?3P~@PxRya!+q-@M90cQ-U8(pi`wnX*hqm|lf=!x_olj2d{vdxz z$KU6GSZZ|{$aE4q-ALk?I_njWs$*T>G??W%Doa^=(wpoXgemoNWw0%6wq$~3S%Aj= zew)MPh(VH2E=!bBr^Sy#h;epkh)oWx7Tet+j%nZ(&Fcw(w!gxf*r8r>sW=vT(IH)q zXddpevr=J|Z)tS{I`NsK?RI;d3Wt9~q?D6$y>E}1Cy_eXx z7x?QvpPi?NtUZ0jEz70%;yDZR^L$fsunnEywcwv$e@XK4C;svMQ(8+l_pN!p@hu({ zZ;{WRPpDJ+?c+g=0&$MbXePb&axRl4SXX{|7Rq6DQcFalO03w_o`j%su19o0NaO zl<2z7+fswC(>_T44_N&I0+#h+cHW-`qRgJ)Ho(%}+QUjVR2$<4B$0$ufKG z2mIYO(C6mafAI=8DPQlofOCI1mc9+((ZMcW+#&!PwxAhU3`KPM)PGsf4DDifxU#v! zTFIegTPzP6H>)48A=cRr?QyzGnK*74Izy5Ec6u$h*j=emvMmN%<=_4OuB;=}_8#My zI!TsOG{#RjPSwX#tIBDJ&FSa~ZZDM(GDFuiRGv?Yp*U64epcYbr~iKqRX!a}QD>t^ zsc2I5TvV3Q2@{G2sL_ZxRjAR3X4OZkoFGZDO@nTnOh-=;p!Boq&9w}4O`|VT>S2@q zIW6!{Z5N&5bO7LNj7wwPFfa59B6;Stp%>^x37%t5_8mrIdKdtJT|%UagCHi7DV50Pka8_iK>Gc#e&0nUf{3de{V@=2(<$i&V-93rtO$tQOr^ z0QADC#-=gtgAPyo0V@?B&os~qXZqWTC69XnrsINX^KG?6&9m`}1}%Gg3eup;SSdNQ zx&e!ipNu<5!C6ID51Sm6Ta(pdsTA22q`*sOfNL2S#Lu-%sy-ci delta 1596 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 M07*qoM6N<$g56*2ng9R* diff --git a/assets/nazi/guard/fire4.png b/assets/nazi/guard/fire4.png new file mode 100644 index 0000000000000000000000000000000000000000..46479dbb750fe2dc30379a2ba10200a65b9c9f75 GIT binary patch literal 2029 zcmVEX>4Tx04R}tkv&MmP!xqvQ$^8=gB?U1GF0hc7Zq`=RVYG*P%E_RVDi#GXws0R zxHt-~1qXi?s}3&Cx;nTDg5VE`tBaGOiz@3Dp}fAb%yn9$NMaF7kRU=q4P{hdBSyPUiiI?tCw%-Pu3sXTLas6x zITlcb2HEw4|H1FsT7{`eFDaA&x?ddUV+`oo1)6oo`95}><_Qpd2CnqBzuEw1KS{5* zwa5`LxD8xfw>4!CxZDATpA6ZQT`5RQC=`JAGy0|+Fmwy_t$A~6o#XTY$k41(H^9Lm zFkYnWb)R?lcFyhJp4R++0ENPGuIJm;^Z)<=24YJ`L;&yrQ2;5PyEn-I000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>d{0Wum3oWDE(00rquL_t(|+U=SzY};5I$3M4= zChKHiO$Gr54+Iz(1Ox;W1QY~JQ$RsMKtVykKtMr2!N5R4LBN56f`Wj8fr5d6=wuL` z3=9Gc3<4f7FnHi;GBAjA2kfTp+DY5#lF30l&ZH z@WWQ0cxB*EOw`dG8!!@88)=9s+y32QK|b`m_D8lWU$yd+LFQfYjtXe?5$`hD=`h1Ekz*XT2t zOz0g!W*0mlP8E)2(h_xo5AA9JU=5}m9W(*Rw8AuMgr_&OCPOYi`z&u4^o}0xzx%}6 zJ66{xPrmDB9#gkWlJQ}6n4oPL55&hP9@Cl(xtRr=9rqy6Oq~YZmdEsN%<-tpF(6aT z$;9WZQ-G)P98tH(^Hl|@uq{wgfWJ&}>lP|cS)^ss8=rtb2V2nX4e_I=v^Y-n`aI1t z5}nbgS`KK8e3Z_~S1VSl6)MjGh*FJLx7POw%i_Z{EEJa+0R4`jZa#R?Tq;hYvub(3 zP4LvJD$mi`iZnBsOO1gdmKoi49Z@g(g3Df;C{_3}C6o%Q1Yr}(ZybOFzhHA|Z^G?D z0#LV1TF#0vsgYwNgbkLAwG?7xSL3n?+B+W9SRI^ms#;w0~Dm*yw=r$b8 zS`m4^EGojFZ6T#ZO3CPUQ82^O6Lw}IbQv3Dp+aj&(;86Y{rmU4?L!a*2=P$%CcfP5 zk=VTiLGaTjLR$mi%*}D@HlIRGtJ`D}#*jyZiKgXP2+v?H6)nd?3qdFqY{3z>k^`FO zbKH{nbX;eh6alQoLz8nL>>~RcHALOy#=G3T5Xip4>Akv*E}7yzW88^(z+>xwEz8d? z0P-sWWE;lr0Pt9(Dilq0hQCaT`Y&dz<}ISKNy=AGJ!C9CRyza&nc^>#HNy*&qTKn5 z6jvlzra>%b+l4vuAT+Ziv@lVaNcb(jU=H|YwO?3P@Xf3Q@Wnuba9{dRa!qo+hvnIZL6)z+Nt-Ld1C~l-7&R!T;L}K!EHHm&{l^j}>e+cHRrLTE zPC|qb&*`vCIsVojdCowNn2WFXWL$0NALETOK`Hy?*&HDX5BMHMq`UwEU~&IRRm-6F zNQobj8PEnc{|?cH0cZowAKG!n1wzcq)t?2I5P|`tDmFvG6A$>_*ItTI`8^1g?FCLB z*r1T>`Tvi5K?5m8wE+0jn*fJp4rn5!_d{-cA+C^eQ10&lLtwa(FnF~I<)i4lbpLB$ z{vWD`1Vp*l2gbl+Be~#z&jDGMA;joKrM|b8Uva^J;}?0v|1JLl&fb;0QOl^A00000 LNkvXXu0mjf`l7Qp literal 0 HcmV?d00001 diff --git a/assets/wall/door.png b/assets/wall/door.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b87d840ae39b81ae880600a62046ba76bf06c4 GIT binary patch literal 2295 zcmVEX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~5(?_ssdWGV2J}fpK~#9!<(naUqe>Kpzs-Y) zKp+r^2t)+}Q4xWth=_=|qM|=wMMcFGD^{$iT)97B#flXbD=I2hL?9|EA|fgf5i1Y~ z1OkDG$n)$KFk~2Jm>Hny_AVv~6A16jneUu4XYwuxg5UUy4+8);%O!9){B`ib<73$Y z?tG3oP0O=I0i-E#IKW*j5dZqszLIWF)AAZoyX^YcXa|5SJ6Zq$xQ*RPCtEW_FxnNQS|?s@bh^&`ed4C*--=7!}Wc{`+eDy z`~BO8C;BGx0&$uGS%&rXHEuQ=-1 zX~MHC#FQ}hJzQdT^)I%K&NEHyibD9>n%`uq^5!;uj($%uVmhr)PwJbRW~0HU-uDH6 zRd}8-GK@zH@O}PhjWOaJa2a%Oc*eywAIv?9Af*Y$DZ$5rcTKa|2`qetFMxxWCsM?c8e@R}j~L^lTLD|B275Wu%aO4Z+Yr0yaspXkC5 zfmVgrR{gHIuVMkRIN(*`MXFDaC=Z?)aS>x@9PmfO%T%Aeu5TRhCg6E^&<+t@QvI-1{_z=XvFq$r3g7n&&xSns}e*T=>DkPM7&JognIHqjw&k z=ZK;RVHm=!I*`0tmIc!^VObU&#~B9C8&Miw(E?(@dcmYC=pnHGW(z!>{ez$LMGYTs zw|IDX003+@8w5dsqPjWxoacFYZU}sr>UY8Oth%ZPv^$_9rCqPrxcdQozdv>g`|!T+ zBMigpHwt*3hx_~cx=$%=3$jHCBuA-1#~1@%F=b@FL-3EuhQ%4~No2 zF$L8|9I%?r;7_Lry=K9%Q*SCGQ1WO+K~-?c=~D~}U! z0A-1Kw^L3gc=Mc{4!z)2&7X8a7d$yQ<#dBCgL$^iU6)gt^J!XogGwoe`FmY>nfcS} z1fmTR1b)WcgciLt1z?MR!}lUM4zPZd_S!Jj*EN4xWyrJb7P#&a?fmMs{7kY=5)QvQ z{B#ObtK2c`26tJ8o9$M*Fq-CSoiUruhK;;T^>ulc22=`{xSY1pDoee9aZ?3uz)HKxc>gVA%=A>;Lhh|l*fj~Sq2ye9+#i- zu=>fjj4CT6@SDx1&Jqh=MduXoqV)h?9B@@ddrQ|v!V6IWxaa3WFW@*1l4>hTp63XH z06W%|j_LAL%%8_$+vO{}9&qjZh>M~PU(H3AuEP*t!Vn*-x&FcPnx3E|G(HKuXw_F{0qnUrR<8@x z^}9a-Uf1vQ&g<3%{OME~Ubws^GuJ-wvNc3T1|JoE?76Sv;xtoYLj_y}Uw6W(;QI=oss;3dA3Mt%3g2s= zpr9_m*3~-AUk6?{-7*@R@w$WLSej&r=1fU#8AD!>@R$cA2^ZZltySrs2b;`A`#oaI0?y8W zD$G~fCwQ~jC<$X{=-XA8WajvqOb>eLx<++jm{>((OZ@uhvTo@2;+{{_4Na{|CB-ggav} RMfCsx002ovPDHLkV1fqoQ2PJ? literal 0 HcmV?d00001 diff --git a/assets/wall/doorside.png b/assets/wall/doorside.png new file mode 100644 index 0000000000000000000000000000000000000000..8a45e12f09875219e9dec20d505179e995056dc3 GIT binary patch literal 2411 zcmV-x36%DUP)EX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~5jy8B${GLw2WUw|K~#9!IeuJ z1PB-e2owky6ciX37zpGC1QZlL@L)kee?mY(e?VYhV1a=_KtMo%L4ZJkfPjI3!2$!H z^B$1aUX5mEXJx;Vx5OXEUhSQ|bLV5F5A*r_ANU`S*uHt4&jFI;&t3Wcp8o#ZH~l&e z2mkvxreCoE001CO0VWfGrh&VnfFCa}mjUa}xn2VpGA!0x7bx#0@QVH&g%75 zXSnSas>eqFZXFh^HH@_LyIuRb*+2yVkmrN}>?Df?y-NgW0Dyclftf?wcf3>XoN>&~ zGZ>#f^*1L;`Yf>ET_#wg91iX8T}I$J3^VZ1L_p6F$R;O{I0rKw0i|G_9V~+lwrzw<8(*s{pqDg?S zd?65nmEu1Ip7MRX`_>3eLmMDx#47LTFM`KAJqA1#^DQVWYE;~h)x;hezy*&LzU+ih z1kYSN2t3Cmocu^}pW1zw{;UW(z;jpdB;bOt4}ganf}%OcG>-n94gf$zfiJSGM|V6% zfj8y^p7U*mhJ@z&1JIMnX&qD)D6$Od?g!_9XLme=0oo*o0?&n7hyJ7s)W-CHdudP6 z5ns&yZw&n!Gz}J`L~{E-LU+T6+$7DKo@{ z6chSn7r>=!D0pm$Q1DW;v7lT%7)$@|KN0IwmjXYg)6CIc@_kHyEXK@;Lh0X|kTQs` zq}}iR*Wkdr#^iS18Xb$V>;KODkq@h?nBjDQ0v}raahu{A$r{FGoG16ludZYRRL0QY z@x&St4Albcg1$ZgRrVUAYMVttwL9hWmj+@1?PrLJ+Cb)*h;Fa}9M1p&JgH=(4`8);Eg5U1}e*bQdqnHp& z?r2@NevET{pYIbJmrW*6buIFrpFax*sB3`D25#=}d7sz%xCOu8xBdBFzrt9s-2%M5 z(X{vZK3ZqB-2&7#RO>a|*fS0`4_GXQv6Sek2l@DH)<0Cy(0?{NDY>fwKHukrxtpUZ z%VXbDJ{#oxKh(#^h#-~uQS)K?6HO0{?IzEKS^#%(xKx(|k3Zx5UE}{!y+4_puE7;N zRQ1cG^rY1iUXTrqXQZu#;r~3V;4ED5?Ee@Isa8{a=#w6B(-H^_0H0 z?f=7JRCF=$l%FfwY3d}%-R%JSQ{&EAM-IW+Jj4qG4{W>-KFUK9L=nJiy*177_(8{m1A4+WkCDM~A*~dBEY&zmOKZJ<$na$|V@! zc7BtDeDKS?4=N67O4#bk8p$=5Yk=$P_JoPMy;UQKLhOE+&wHP*8CQ5}n%BJ2>zbY?}64Sawe8DGqLz%d&mO&soPp`=|^6td`5xVDIlogH-D^tiFGT zzq=#1n9Q-aTY%?hfR7(raQ5C|t?Ii^XW8H2Ienu$qpSehLsbCCA0Juaqapy#0IRY* zo_l6RK^VX;%=!&}991iPl>2zpnEd}@(Vzbe@W=3n=8RRoH%9fjqb=?5olypc+R}<9 zDyHJA?q(s8;#@U2rU_zvKHT2k{_)4>jWMvZ&+?*ib#(=k dGg8~o@h|5ao*MrBgy#SN002ovPDHLkV1kpOn<4-J literal 0 HcmV?d00001 diff --git a/assets/wall/elevator.png b/assets/wall/elevator.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6886719a3328ce04326cd1366122d4abe5800a GIT binary patch literal 2636 zcmV-S3bXZzP)EX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~4IfHgLjV8(2uVpqK~#9!XnI9m&>r@74X4Klr}?6Mt!AjKS)3IygQ)mJYCO z8;min-sGj?d|6A=6rE0|(APcJw1r`a0~u&t@cek4#l0tZT8HoZa9y`_t!f9hZNs*0 z%yv7>#$zq8ZE#!!PavCuXN-X{hB%JV>2ylh)aFTodAFP2JIEKaUITY`dx>}395(^4 zz0M>7*6Vz{MI5~u4)cdaQ6!z)>2#F3qN+KL)0()ez=vUoZns;QA4L%k4-X6LJU==r zFvAibMh|dZ7oO)C0~UXKczDnPZ7S}nZS~{F59yrUZdcN61qq-&P1C}Dl7XvRC`n4M z*ZXDQecwkEML5bh97Pd4&x38-xh{~+JE#-2<#L(#j4|BZ-Q_(1Y0rb1K1s2X8W z5iOU1$##p$Xw=xFk~tZ4pTLuHC267GPqO#Y|6jj;#mmc!wiQu<=6jld%NTAs#=LET z%nVjJMs+>EQ1UKiVt#gZmS6WrBOnM0L^wV^MjXejfG;sANnZa%0xUj#!lK(PJ<#|4 zM!mTA=^no@Z#;$@1h4;aM4+)v!B+`KI`+X{?(7jGs_0we8c z@RjQTfDb_s{3O%WmbfQLg5hvjvLd`f1> zpCyVSwJY3|<4KZWya44e0o)j<2VN{n@dMD%?h>-9S4avaC`wW!=n`2Zcx^X{!Es$=!(x0Qgl z+ie~c>5Qf1icA9dU@Hv6!nMjmSf+bjW!Gh5>^Kg(68BmJ_38u$dFWj=PB%2x$#NHB zfh)!^`}C<6yk$+WTCK2JtzcOb>~=Gya?{x^B(7D@&`H(nT8mr8Fz+IUWm+2CN0Wg`KV==$Y z=Z((-OLK0t=s1q?@OXji>j2B;Fw+sh z!{bHa`r#4i^?=Lk3pkFGMVD7f381y|lBTj!j4_-a9To6cb#b()IAq|r3E=eWC7>!% zDr=uVe^xp@WL*dd?{lc$Et4EeSA0nO?sjGH&zqB+09AQ<;*w6hp$f$byyH0N^?F#X zRsewEa9DDQ>*^Io1bCzN4c;6_A5Q;``;>aBlYlz6wQ4RACQVbMX_`AdDu08QXqf^v zB7ljhX#(7Y5n^_UQs1K6%dbUNNwRn|h~r~iD5^qLY4bN_r6v*|Z;07oaSrdfd7g(L z2(ZY4CjR%~aG0ACc|GvA@k86x1iNf#O~y3~&2 zwBlZ%elf zRTnm!&Nhck2}fN&N(LEE-59Sm?GBn+Fr zye@lNmv=NJeBIvX-#;A;FzxlqCq>_r^VIWP?T*Lj0^p zow^D&j$_OLYytEsvy}av?& z2Tj47a9(Eb9mgpUfxw$4U|W#@nR#fF^CFnpY*r$|Xt6LpBBM)ue!cS~!BxLs&Ij;j zux-wZI);wO5D`XP#@FPCj4l%jEyGFoKb)ML{M7aHb<=06MbOESx-=J`M{FeoR*Vb7 zP`@x@0#?=gzTaxnq{&xp#@`Dx-SaX9)ON^z|M~S4%^+8PQi1rLoNuE2MG2s&w=4nK_jG?U=i86~(cI?*5Tm3vIRCr$zADos uM!mI_p?x|3r|f-|0tA2$fAi<_0Pr8@?zX(zJl1Cb0000EX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~6&koNFV+A626ah9K~#9!oH2w8_)4#KSP1E!rT=2L802qehBEhGWekcG(*L9bxfKm#Km|+-Tnx@6p;MWn{Fbpt`BMifE0@?$f z3izwRmr@q2)d;zrRLzO_+0o4oD#Y{iGvu62@U0_+0A1I?e!mylR7#my>0*Fo z$gI6xTk(_<+}+*5%gc)!oJUb11Q^G0-j4hkWTs?rMFpG#v}WB?N^pC7JKKvI-O-?0 z3bMd^R)66IYA(#X;?_#yy)~xQz~kQ5wv|V=g#x@QE`8R(BMXLMnD_1$@YJnoth21Y z$^bsDpPp8&xHPd>3109iB@v_tJYv{c+ClJtKRuZ%o>H3Kj5RUR6_wBmK7_CeyyT|w z|2qqO0Du4h1pq!gJgCCm+}yzNcog>|T57uDNZnTO$WRU*T`gq?ReBQxLI^)roC~2S z0fp=P9*)PO7*$Fuj@MeiOTms5=Tk##8SjMxLJ08T;Q_RrV=)1NP&bFGg-YNnPL<#V zulf5JBjlW2hL0*~5ea_%{Mi+xNE40Y2r)*8F~T^GkaLDG)>DGE+Z2>u8uN6^WzqHNhT|X;ht>4fNR6pmG__H;b7JU5TMu3W8_Ew=LvRN z!Atiq81PNm0v_-v0EVdO89dgW+5>N}(-QHy8GuSaCKRFo4|p2OQ~z7D_S_!S{JpfI zwbhrDb*0_>^>CO2p;quz2u%r;@^}w^qVgzs9tX67*V6T!b>p|g!3ADRr24*}!QghF z@c|VY=S(TV+uPe><)uuN9Pi=#gY zb=4T4jlS^yBBiquh*s)L zrMzk+SW1~g-$J6nTGiMCzLWxe-_J=CXMk49uGJk{y@1L93L;??`2OQzfJX>SacQcn zxjQaA23Y4}fLaxf_xDiVm5>1-K0dmTf*bLYr*62+5qk{n;1a*c&IIUE`T$jCOqc% zT9>x9`h;#&Gm88=&{vPMyjKOP~ zJ&=kk9tP}M8Q=wvE|2E>wdZginkjk{A5;Ri;j9YMY6i4|_hxxi`I6ymjrj0cD+p?4 zz#8yge@`vF7B_fVfY0-ze482260Wv_r~6*pyIv*GEc3T8fY#_dog6E@l_<{{tAZbqL$yU&6k1hsy%S^4oj%4wz_Lh`7OZU+J0zXw! ztqRlFo_1$E4B+5v!4AFd^%e-w>OS%KgSXmT44|hvyom}1J60`UqJE33)Qlo3hR=me zXl8)5>XJ)&eSKXO?6iWn?14AA){>;2|pa`2g+(XqYRVzpoWH(6dNowynqK5u9YO z`4>Oj44@BE&C%}_Y3K4ah2ne9vGRP-7Q5tz-Q8i$ui`^gF&=;K$r-i`tD8i#LXG~a z5yYIDx34tsAo=?>h0Zmj)%x>!cWVsaR$EX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~4k9@lT+#pl1p7%uK~#9!)myK3;y@7o$U`7j ztcXA$5GN276^IB#MFpZVqN1Xrq7s3utgJwuKvY!n2b@5hsE9aG5m8ZbB4Pz1Vg=&f z;{+sxu$yc)yMeCBBiRg@`DVWP5or0ozd?hGbB;KUh1V#hAcQpeIB0XuaeaL)yhsQE z=ltMUNAbM8?26+Ul+wauRr%Q?W9;aB5Cm{UN}EzXQ8KS|Uik$5yt4UY(aJx!==<|} z0f0jY0U-p_^%~RLTd4(YAf7*FjgT0nijhUi=J(AQ!@S>5KeyA1VF z%GpLfAI@NG`?=fQdO&jVWjMr7*R7?rio2f*`Q-Y;j~|$HyXko+Z%G>jcWUHCoR%!d zL|Ri(zG>u(JTtq`F{QkW-EAXZ_Wfo198<9_TegvxWvQZlLJxRct?+nrV=UHX`MpWx zMf>NRW0u*s_kdj*v>oeJkynjnWlv!&O@#o^@_m0JD}{9sFDq|Na!%d-!ctgQ`BNaT z8~deMKsVM+#=HuPtFV6AeU47!@|}lx%@N6Xmidnb6tT4e0%_JZ`P5ogJ4zG7a1Fj0b!WRY5Bgt@jTDyOA1@vor(Li z##%0ydk;`W{2Y+48~Z{IP*J*0%vD&1$Rm0;NGZkB zXoQ!X@}`ilTj}X?hsb!scZ0TK-Ujkj2b>yt6LPAI#*aL} zCi16@eVOsnEbz=Z;CXlo0*vC{)eCd7Kd$(Crwzo%5;=VRZ~J6x6dz?PvyYH=D)%*_ zShU-K=V20tdjn8Pf%o_AiN8y%+9A4%;rgZ5$87DfhSfzn8JoLTxbMYSeEb8JOJJ7< zTfXma27|%Djep@ zV!rU@Lg^9=n<@E~%KiKrYm=^M^?N}oJNVI*@&FaZyN|g+tM9w+liaaCf@^p-;y0^k6VR%*VL9T>$Ngk?fJ| z>-Bo6Y`%Ut>H_mi$N@SNnL3jl8}d}ZIQV_Q^Vb)i`+e)(oeg=izF(C8XN+OC3yZ@L zU~HQnEcf*`L<_-;_}g(_p95 z80**ZtU5+5PJ>}+J>Q$~tg?ou5HwjgIJvy6)!o_d9;EX>4Tx04R}tkv&MmKp2MK{z!{f1nnT=kfA!+MMWHI6^c+H)C#RSm|Xe?O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krKa43N2zhxVwk;4@5O2K4+PasY(-LQx^h-Wq} zo%23%l$9lg_?&pcpbHW|a$R=$jdRIiKhKOB*~~m~lvpTrvE0S1Y^cQ3#4$zHDBquR zS>e3JS*_Mt`=0!Tk%G3e%ypWhNMR965FtQD9TikzAx^tSiir%JCq4Wlj$b5~Os)zT zITlcZ3d!+<|H1Fxn#HL}Hz|??dR}b%V+;uG0jVfq16NwdUuy!hpQJZB zTI>iI*aj}HJDR))TD+r9>D>_X;f1H000McNliru=L-k~5D7u%noR%z2c1boK~#9!`@#zbl?N%01OC63>zGK_CZ863`6h~jWJ}cy#Q~Fq4W9d z{L1-!rmpL<)xPihM|0$W=Q#Slr>d$RjaLOwRh5%|C_?za!>MA9E#S2|a&6ui<9-kD z*mG0>zEkI*ec-Wq8Ch~29-m{2!;@ws!3Uk-9`OGaZ?A!u`@FpdccY;On}k zVHmCoUjF7LHbD+}NVg~om%Wwv!At8ip9^id3-v?e3 zSO|Pn1GJN`s*1*Oq+uA6)Laun2t3m85O@xRgGV0X1Fx-p6U*&2wZ~+`FnGaNRpmfS zA%wtVEC+&=SgY%ym3`lPbAxOR2!U^!hN`NfWm#xlS9PIfSssDLdkIdiX|28Zex7Gq z*YzT*Nbr2_9Pp|Jq&PgB$TUrKKA#^g)c3us!rs1pd$9pdaB!1@>Pvyl^X%s0r_3uo zK0XJ0G!qOxUDr9g!+Wm&vJ{54z%;ONYpoNe=D}r2%Qa=1CifY%AP0Of6OGnmUcGwd=qDng!{I=mK7G0fVb7jD zqr>4qKYsk6bzSN8>(})2=TG|j^()QuOy9nJqn9sVMw69?hX?xp{d=&+PXS*P1wA}G z(3dY?=0oiQu@5mVQ$R6SFG{=ck#2$P;M$^_%op7T$DCE=#LB7Q_hga7% zm1XJFukZT{@Y6KWIF2raF3aMCt*wJ`RaLopLt#$)ETjQ9vW|yZ;%}c+H4WgbGT2-Q zfv>^A@$X{bQ>w}sc&T-2D!i`i1-Y4`0UE7d*Y!mPD82nSju+m33;0l?lS1U)XbBKD znW_Q4!Umf^9*<{DgaHQDe9&<8I-s3JI?pDBg#Jp!pF= zxJC&PPGW|7bEL=j5ud&&gKQ7QPK?(>@6xg?j^vOk&cS0|6nIe$z@@~84Y^`-_4#C177-Kdybq4PRV&Gw4+E{)sz)zQ7 zeroxF^auR65Q^L%XPCG2JKt^r&(+me1j%bGc;(aS9I=yx!`eCE=$-gUOLpb_}evrr=~gJL)F_B@KAZVk5us44H7sl-k7u%ylhU$b-28# zL6W8^kJguzBmmyz^#1+(Z19*vD`IjqK+chps7V}Igb0^>=zoS%uBkW~5o=Tm**>2m zR|B#M5l$rfQqdIf)>_w`u*dOnqGOBW%O*rpot0#Nw&vkEbN`ODh=^`^(ef0Z+pS^h e|L_z=LH_{OMMjac#0@6^0000 +#+ */ /* +#+ */ /* Created: 2023/10/26 10:46:35 by houtworm #+# #+# */ -/* Updated: 2023/11/06 01:16:25 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 10:40:12 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -21,32 +21,34 @@ # include "mlx/include/MLX42/MLX42.h" # include -typedef struct s_sprite +typedef struct s_sprite { double distance; double x; double y; + double anitime; int type; int number; + int status; } t_sprite; -typedef struct s_draw +typedef struct s_draw { - double transformx; - double transformy; - int spritescreen; - int vmovescreen; - int spriteheight; - int spritewidth; + double tfx; + double tfy; + int sprs; + int vmov; + int sprh; + int sprw; int drawstarty; int drawstartx; int drawendy; int drawendx; - int texx; - int texy; + int x; + int y; } t_draw; -typedef struct s_varlist +typedef struct s_varlist { mlx_t *mlx; mlx_image_t *img; @@ -56,21 +58,29 @@ typedef struct s_varlist mlx_image_t *kstat; mlx_image_t *astat; mlx_image_t *hstat; + mlx_image_t **mstat; mlx_image_t *wimg; - mlx_texture_t *temptext; - mlx_texture_t **walltext; - mlx_texture_t **decotext; - mlx_texture_t **picktext; - mlx_texture_t **nazitext; - mlx_texture_t **gun0text; - mlx_texture_t **gun1text; - mlx_texture_t **gun2text; - mlx_texture_t **gun3text; + mlx_image_t *mimg; + mlx_image_t *oimg; + mlx_image_t *fimg; + mlx_texture_t *temptxt; + mlx_texture_t **walltxt; + mlx_texture_t **elevtxt; + mlx_texture_t **decotxt; + mlx_texture_t **picktxt; + mlx_texture_t **gfiretxt; + mlx_texture_t **gdeadtxt; + mlx_texture_t **gun0txt; + mlx_texture_t **gun1txt; + mlx_texture_t **gun2txt; + mlx_texture_t **gun3txt; t_sprite *sprite; int spritecount; int w; int h; char **map; + int mapsizey; + int mapsizex; double frametime; double posx; double posy; @@ -78,6 +88,8 @@ typedef struct s_varlist double diry; double planex; double planey; + int mapx; + int mapy; int vaim; int jump; double run; @@ -87,8 +99,8 @@ typedef struct s_varlist double sidedisty; double deltadistx; double deltadisty; - double walldist; - int lineheight; + double wdist; + int lineh; int side; double oldmouseposx; double oldmouseposy; @@ -97,8 +109,7 @@ typedef struct s_varlist int *distance; int treasure; int tottreasure; - int tottime; - double anitime; + double tottime; double firetime; int enemies; int kills; @@ -107,7 +118,14 @@ typedef struct s_varlist int ammo; int weapon; int reload; + double reloadtime; int hp; + int minimap; + int stats; + int menu; + char *cubfile; + int flash; + int flashcolor; } t_varlist; // MAIN @@ -115,17 +133,28 @@ t_varlist initgame(void); int ft_errorexit(char *reason, char *function, int code); void ft_printstats(t_varlist *vl); void ft_cleanup(t_varlist *vl); +void ft_resetvars(t_varlist *vl); +void ft_restartgame(t_varlist *vl); +void ft_raycast(t_varlist *vl, int x); +int ft_prepcast(t_varlist *vl, int x); +int ft_getstepx(t_varlist *vl, int mapx); +int ft_getstepy(t_varlist *vl, int mapy); // PARSE t_varlist ft_parseconfigfile(t_varlist vl, char *filename); +void ft_checkline(t_varlist *vl, char *line); char **ft_getmap(t_varlist *vl, int fd); +char ft_checkmapelement(t_varlist *vl, char element, int x, int y); +char ft_initplayer(t_varlist *vl, char dir, int x, int y); char ft_addwalktroughdecor(t_varlist *vl, int x, int y, int number); char ft_addsoliddecor(t_varlist *vl, int x, int y, int number); char ft_addpickup(t_varlist *vl, int x, int y, int number); char ft_addenemy(t_varlist *vl, int x, int y, int number); +int ft_floodfill(t_varlist vl); +int ft_flood(t_varlist vl, char **fillmap, int x, int y); // INPUT void ft_processinput(t_varlist *vl); void ft_processturn(t_varlist *vl, double rotspeed); -void ft_processmove(t_varlist *vl, double movespeed); +void ft_processmove(t_varlist *vl, double mvs, double mvy, double mvx); void ft_processacro(t_varlist *vl, double movespeed); void ft_processguns(t_varlist *vl); void keyhook(mlx_key_data_t kd, void *param); @@ -133,15 +162,21 @@ void scrollhook(double xdelta, double ydelta, void *param); void resizehook(int x, int y, void *param); void cursorhook(double x, double y, void *param); // DRAW -void ft_raycast(t_varlist *vl, int x, int mapx, int mapy); void ft_drawmap(t_varlist *vl); void ft_drawweapon(t_varlist *vl); +void ft_drawsprite(t_varlist *vl, t_draw *draw, int x, int i); +void ft_drawsprites(t_varlist *vl); int ft_gettextx(t_varlist *vl); uint32_t ft_gettextcolor(mlx_texture_t *texture, int texty, int textx); -// SPRITE -void ft_drawsprite(t_varlist *vl, t_draw *draw, int x); -t_draw *ft_initdrawsprite(t_varlist *vl, int i); -void ft_getdrawstartend(t_varlist *vl, t_draw *draw); -void ft_drawsprites(t_varlist *vl); +void ft_flashscreen(t_varlist *vl, int x, int y, uint32_t color); +void ft_drawminimap(t_varlist *vl); +void ft_finish(t_varlist *vl); +void ft_youdied(t_varlist *vl); +// ACTION void ft_checkpickup(t_varlist *vl); +void ft_firebullet(t_varlist *vl); +void ft_enemyaction(t_varlist *vl); +void ft_fireweapon(t_varlist *vl); +void ft_interact(t_varlist *vl); +void ft_checkhealth(t_varlist *vl); #endif diff --git a/maps/bigmap.cub b/maps/level.cub similarity index 82% rename from maps/bigmap.cub rename to maps/level.cub index 0583062..daa61ec 100644 --- a/maps/bigmap.cub +++ b/maps/level.cub @@ -7,12 +7,12 @@ SO ./assets/wall/redbrick.png WE ./assets/wall/wood.png 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -1L B1 p 1 1 1 1 1 -1 Kl l l l l l D KC K 1 &TC D D KCK 1 -1 1V A A 1 1 ] 1 1 1 +1L B1 p 1 1111 1 1 1 +1 Kl l l l l l D KC K 1X C D D KCK& 1 +1 1V A A 1 1111 1 1 6 1 1 11111111111 11111111111 111111111111111111111 1 1111111111 1111111111 -1 1B f $ f B1 1 1 1 17 1 D KC K 1 1 -1 14Kl T lK 1 1s K l K D 1 9&9 1 K l K D l 1 91 K K K K K K K K 1 +1 1B f $ f B1 1 2 2 1 1 222 17 1 D KC K 1 1 +1 1 Kl T lK 1 1s K l K D 1 9&9 1 K l K D l 1 91 K K K K K K K K 1 1 13 8 8 21 1 1 1 C 17 1 1111111111 K K K K K K 1 1 11111 11111 11111111111 D K T K 11111111111 1 1 K K K K 1 1 A A 1 1 1 K K 1 1 D Kl K 1 K K 1 @@ -23,10 +23,10 @@ WE ./assets/wall/wood.png 1B 1s K l K D 1 1 K l K D l 1 1 1 1BB9 1 1 11111111111 1 1111111111 1 111111111 11111111111 1 11111111111 1 1 1 -1B1 1 1 1 D K l K 1 1 D l$ 1 1 +1B1 1 1 1 D K l K 1 222 1 D l$ 1 1 1 K K K 1 1 K K 1 1 1 KCK D l 1 1 1 1 1 l 1 l 1 K T K D 11111111111 K T K 1 1111111111 1 -1 1 # 1P N 1 KCK 1 1 1 KCK 1 1 1 +1 122#221P N 1 KCK 1 1 1 KCK 1 1 1 1 1111111 1 * 1 D K l$K 1 * 1Bl l l b1 -1 b1[ 1BBB1 14 9 1BB B1 bb1 +1 b15 1BBB1 14 9 1BB B1 bb1 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 diff --git a/maps/maplegend b/maps/maplegend new file mode 100644 index 0000000..1c81d18 --- /dev/null +++ b/maps/maplegend @@ -0,0 +1,36 @@ +The map has to include the player, and he should not be able to walk off the map. + +N Player facing North +E Player facing East +S Player facing South +W Player facing West +Space Walkable space +0 Walkable space +1 Wall +2 Ammo (Ammo Pickup) +3 Machine Gun (Weapon Pickup) +4 Gatling Gun (Weapon Pickup) +5 Golden Key (Pickup without function) +6 Blue Key (Pickup without function) +7 Dog food (Health Pickup) +8 Meal (Health Pickup) +9 HP Kit (Health Pickup) +$ Cross (Treasure Pickup) +# Cup (Treasure Pickup) +* Chest (Treasure Pickup) +& Crown (Treasure Pickup) +D Door +X Elevator (Level end) +K Nazi Guard (Killable) +B Wooden Barrel +b Poison Barrel +A Knight Armor +P Pillar +p Plant +V Vase +f Faucet +T Table +s Skeleton +L Standing Lamp +l Ceiling Lamp +C Chandelier diff --git a/maps/postestne.cub b/maps/postestne.cub deleted file mode 100644 index a080ebb..0000000 --- a/maps/postestne.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -1111111 -1 N1 -1 1 -1 1 -1 1 -1 1 -1111111 diff --git a/maps/postestnw.cub b/maps/postestnw.cub deleted file mode 100644 index 6833b4e..0000000 --- a/maps/postestnw.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -1111111 -1N 1 -1 1 -1 1 -1 1 -1 1 -1111111 diff --git a/maps/postestse.cub b/maps/postestse.cub deleted file mode 100644 index 291dc6d..0000000 --- a/maps/postestse.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -1111111 -1 1 -1 1 -1 1 -1 1 -1 N1 -1111111 diff --git a/maps/postestsw.cub b/maps/postestsw.cub deleted file mode 100644 index a94ad7b..0000000 --- a/maps/postestsw.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -1111111 -1 1 -1 1 -1 1 -1 1 -1N 1 -1111111 diff --git a/maps/smallmap.cub b/maps/smallmap.cub deleted file mode 100644 index 5d983e4..0000000 --- a/maps/smallmap.cub +++ /dev/null @@ -1,32 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -111111111111111111111111 -1 B1 -1 K 1 -1 1 -1 11111111111 1 -1 1B C B1 1 -1 1 K K 1 1 -1 1 1 1 -1 11111 11111 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1B 1 -1BB 1 -111111111 1 -1B1 1 1 -1 K K K 1 1 -1 1 C 1 1 -1 1 1 N 1 -1 1111111 1 -1 1 -111111111111111111111111 diff --git a/maps/spritetest.cub b/maps/spritetest.cub deleted file mode 100644 index 611d22e..0000000 --- a/maps/spritetest.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -11111111111111 -1BbLAPpVfTslC1 -1$#*&987[]3421 -1 1 -1 N 1 -1 1 -11111111111111 diff --git a/maps/treasuretest.cub b/maps/treasuretest.cub deleted file mode 100644 index a385bb3..0000000 --- a/maps/treasuretest.cub +++ /dev/null @@ -1,15 +0,0 @@ -C 0,100,255 -F 100,100,100 - -NO ./assets/wall/bluestone.png -EA ./assets/wall/colorstone.png -SO ./assets/wall/redbrick.png -WE ./assets/wall/wood.png - -1111111 -1CCCCC1 -1 1 -1 1 -1 N 1 -1 1 -1111111 diff --git a/src/action/enemy.c b/src/action/enemy.c new file mode 100644 index 0000000..dfd1b0a --- /dev/null +++ b/src/action/enemy.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* enemy.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/10 07:09:43 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_checkhealth(t_varlist *vl) +{ + if (vl->hp <= 0) + ft_youdied(vl); +} + +void ft_dieanimation(t_varlist *vl, int i) +{ + if (vl->tottime - vl->sprite[i].anitime > 0.2 && vl->sprite[i].number < 4) + { + vl->sprite[i].anitime = vl->tottime; + vl->sprite[i].number++; + } +} + +void ft_fireanimation(t_varlist *vl, int i) +{ + if (vl->tottime - vl->sprite[i].anitime > 0.8) + { + vl->sprite[i].anitime = vl->tottime; + vl->sprite[i].number++; + if (vl->sprite[i].number == 4) + vl->sprite[i].number = 2; + else if (vl->sprite[i].number == 3) + { + vl->hp = vl->hp - 10; + vl->flash = 6; + vl->flashcolor = 1; + } + } +} + +void ft_enemyaction(t_varlist *vl) +{ + int i; + + i = 0; + while (vl->spritecount > i) + { + if (vl->sprite[i].status && vl->sprite[i].type == 3) + { + if (vl->sprite[i].status == 1) + ft_fireanimation(vl, i); + if (vl->sprite[i].status == 2) + ft_dieanimation(vl, i); + } + i++; + } +} diff --git a/src/action/fire.c b/src/action/fire.c new file mode 100644 index 0000000..96dbc1f --- /dev/null +++ b/src/action/fire.c @@ -0,0 +1,111 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* fire.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/10 06:01:44 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_killnazi(t_varlist *vl, int mapx, int mapy) +{ + int i; + + i = 0; + while (vl->spritecount > i) + { + if (mapy == (int)vl->sprite[i].y && mapx == (int)vl->sprite[i].x) + { + if (vl->map[mapx][mapy] == '3') + { + vl->sprite[i].status = 2; + vl->sprite[i].anitime = vl->tottime; + vl->kills++; + } + if (vl->map[mapx][mapy] == '2') + vl->sprite[i].status = 1; + vl->map[mapx][mapy] = '0'; + return ; + } + i++; + } +} + +int ft_checkifhit(t_varlist *vl, int mapx, int mapy) +{ + if (vl->map[mapx][mapy] == '3' || vl->map[mapx][mapy] == '2') + { + ft_killnazi(vl, mapx, mapy); + return (1); + } + if (vl->map[mapx][mapy] == '1' || vl->map[mapx][mapy] == '4') + return (1); + if (vl->weapon == 0) + return (1); + return (0); +} + +int ft_travelstep(t_varlist *vl, int map, int step, int xy) +{ + if (xy == 1) + { + vl->sidedistx += vl->deltadistx; + map += step; + vl->side = 0; + } + else + { + vl->sidedisty += vl->deltadisty; + map += step; + vl->side = 1; + } + return (map); +} + +void ft_firebullet(t_varlist *vl) +{ + int hit; + int stepx; + int stepy; + int mapx; + int mapy; + + mapx = (int)vl->posx; + mapy = (int)vl->posy; + hit = ft_prepcast(vl, vl->w / 2); + stepx = ft_getstepx(vl, mapx); + stepy = ft_getstepy(vl, mapy); + while (!hit) + { + if (vl->sidedistx < vl->sidedisty) + mapx = ft_travelstep(vl, mapx, stepx, 1); + else + mapy = ft_travelstep(vl, mapy, stepy, 2); + hit = ft_checkifhit(vl, mapx, mapy); + } +} + +void ft_fireweapon(t_varlist *vl) +{ + if (vl->reload) + { + if (vl->tottime - vl->firetime > vl->reloadtime) + { + vl->firetime = vl->tottime; + vl->reload++; + if (vl->reload == 2) + { + if (vl->weapon) + vl->ammo--; + ft_firebullet(vl); + } + if (vl->reload > 4) + vl->reload = 0; + } + } +} diff --git a/src/action/interact.c b/src/action/interact.c new file mode 100644 index 0000000..186930d --- /dev/null +++ b/src/action/interact.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* interact.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:50:23 by houtworm #+# #+# */ +/* Updated: 2023/11/10 05:30:51 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_interact(t_varlist *vl) +{ + int stepx; + int stepy; + int mapx; + int mapy; + + mapx = (int)vl->posx; + mapy = (int)vl->posy; + ft_prepcast(vl, vl->w / 2); + stepx = ft_getstepx(vl, mapx); + stepy = ft_getstepy(vl, mapy); + if (vl->sidedistx < vl->sidedisty) + { + vl->sidedistx += vl->deltadistx; + mapx += stepx; + vl->side = 0; + } + else + { + vl->sidedisty += vl->deltadisty; + mapy += stepy; + vl->side = 1; + } + if (vl->map[mapx][mapy] == '4') + ft_finish(vl); +} diff --git a/src/main/pickup.c b/src/action/pickup.c similarity index 64% rename from src/main/pickup.c rename to src/action/pickup.c index 2215796..be89ce7 100644 --- a/src/main/pickup.c +++ b/src/action/pickup.c @@ -6,28 +6,65 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ -/* Updated: 2023/11/05 11:50:21 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 06:52:19 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_pickup(t_varlist *vl, int i) +void ft_pickuptreasure(t_varlist *vl, int i) { + vl->flash = 6; + vl->flashcolor = 4; if (vl->sprite[i].number < 4) vl->treasure++; - else if (vl->sprite[i].number < 7) - ft_putendl("Yummy\n"); else if (vl->sprite[i].number == 7) ft_putendl("Found gold key\n"); else if (vl->sprite[i].number == 8) ft_putendl("Found blue key\n"); - else if (vl->sprite[i].number == 9) +} + +void ft_pickuphealth(t_varlist *vl, int i) +{ + vl->flash = 6; + vl->flashcolor = 2; + if (vl->sprite[i].number == 4) + vl->hp = vl->hp + 30; + else if (vl->sprite[i].number == 5) + vl->hp = vl->hp + 20; + else if (vl->sprite[i].number == 6) + vl->hp = vl->hp + 10; +} + +void ft_pickupweapon(t_varlist *vl, int i) +{ + vl->flash = 6; + vl->flashcolor = 3; + vl->ammo += 10; + if (vl->sprite[i].number == 9) + { vl->mgun = 1; + vl->weapon = 2; + vl->reloadtime = 0.05; + } else if (vl->sprite[i].number == 10) + { vl->ggun = 1; - else if (vl->sprite[i].number == 11) - vl->ammo += 10; + vl->weapon = 3; + vl->reloadtime = 0.02; + } +} + +void ft_pickup(t_varlist *vl, int i) +{ + if (vl->sprite[i].number < 4) + ft_pickuptreasure(vl, i); + else if (vl->sprite[i].number < 7) + ft_pickuphealth(vl, i); + else if (vl->sprite[i].number < 9) + ft_pickuptreasure(vl, i); + else if (vl->sprite[i].number < 12) + ft_pickupweapon(vl, i); while (vl->sprite[i].x) { vl->sprite[i] = vl->sprite[i + 1]; diff --git a/src/draw/flash.c b/src/draw/flash.c new file mode 100644 index 0000000..7389147 --- /dev/null +++ b/src/draw/flash.c @@ -0,0 +1,118 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* flash.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/09 22:26:43 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +uint32_t ft_flashred(t_varlist *vl) +{ + uint32_t color; + + if (vl->flash == 6) + color = 0xFF000066; + else if (vl->flash == 5) + color = 0xFF000055; + else if (vl->flash == 4) + color = 0xFF000044; + else if (vl->flash == 3) + color = 0xFF000033; + else if (vl->flash == 2) + color = 0xFF000022; + else + color = 0xFF000011; + return (color); +} + +uint32_t ft_flashgreen(t_varlist *vl) +{ + uint32_t color; + + if (vl->flash == 6) + color = 0x00FF0066; + else if (vl->flash == 5) + color = 0x00FF0055; + else if (vl->flash == 4) + color = 0x00FF0044; + else if (vl->flash == 3) + color = 0x00FF0033; + else if (vl->flash == 2) + color = 0x00FF0022; + else + color = 0x00FF0011; + return (color); +} + +uint32_t ft_flashblue(t_varlist *vl) +{ + uint32_t color; + + if (vl->flash == 6) + color = 0x0000FF66; + else if (vl->flash == 5) + color = 0x0000FF55; + else if (vl->flash == 4) + color = 0x0000FF44; + else if (vl->flash == 3) + color = 0x0000FF33; + else if (vl->flash == 2) + color = 0x0000FF22; + else + color = 0x0000FF11; + return (color); +} + +uint32_t ft_flashyellow(t_varlist *vl) +{ + uint32_t color; + + if (vl->flash == 6) + color = 0xFFFF0066; + else if (vl->flash == 5) + color = 0xFFFF0055; + else if (vl->flash == 4) + color = 0xFFFF0044; + else if (vl->flash == 3) + color = 0xFFFF0033; + else if (vl->flash == 2) + color = 0xFFFF0022; + else + color = 0xFFFF0011; + return (color); +} + +void ft_flashscreen(t_varlist *vl, int x, int y, uint32_t color) +{ + if (vl->flash) + { + vl->fimg = mlx_new_image(vl->mlx, vl->w, vl->h); + if (vl->flashcolor == 1) + color = ft_flashred(vl); + else if (vl->flashcolor == 2) + color = ft_flashgreen(vl); + else if (vl->flashcolor == 3) + color = ft_flashblue(vl); + else + color = ft_flashyellow(vl); + while (y < vl->h) + { + x = 0; + while (x < vl->w) + { + mlx_put_pixel(vl->fimg, x, y, color); + x++; + } + y++; + } + mlx_image_to_window(vl->mlx, vl->fimg, 0, 0); + mlx_set_instance_depth(vl->fimg->instances, 15); + vl->flash--; + } +} diff --git a/src/draw/menu.c b/src/draw/menu.c new file mode 100644 index 0000000..03ebc93 --- /dev/null +++ b/src/draw/menu.c @@ -0,0 +1,146 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* menu.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/10 08:12:48 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_printstats1(t_varlist *vl) +{ + char *total; + char *current; + char *temp; + + current = ft_itoa(vl->tottime); + temp = ft_vastrjoin(3, "Time: ", current, " Seconds"); + vl->mstat[1] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 100, 180); + mlx_resize_image(vl->mstat[1], 200, 50); + ft_vafree(2, current, temp); + total = ft_itoa(vl->enemies); + current = ft_itoa(vl->kills); + temp = ft_vastrjoin(4, "Nazis Killed: ", current, "/", total); + vl->mstat[2] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 100, 230); + mlx_resize_image(vl->mstat[2], 200, 50); + ft_vafree(3, temp, total, current); + total = ft_itoa(vl->tottreasure); + current = ft_itoa(vl->treasure); + temp = ft_vastrjoin(4, "Treasure found: ", current, "/", total); + vl->mstat[3] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 100, 280); + mlx_resize_image(vl->mstat[3], 200, 50); + ft_vafree(3, temp, total, current); +} + +void ft_printstats2(t_varlist *vl, int score) +{ + char *current; + char *temp; + + current = ft_itoa(vl->ammo); + temp = ft_vastrjoin(2, "Ammo left: ", current); + vl->mstat[4] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 100, 330); + mlx_resize_image(vl->mstat[4], 200, 50); + ft_vafree(2, temp, current); + current = ft_itoa(vl->hp); + temp = ft_vastrjoin(2, "HP left: ", current); + vl->mstat[5] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 100, 380); + mlx_resize_image(vl->mstat[5], 200, 50); + ft_vafree(2, temp, current); + current = ft_itoa(score); + temp = ft_strjoin("Total Score ", current); + vl->mstat[6] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 150, 430); + mlx_resize_image(vl->mstat[6], 300, 50); + ft_vafree(2, current, temp); + temp = ft_strdup("Press Jump to restart"); + vl->mstat[7] = mlx_put_string(vl->mlx, temp, vl->w / 2 - 200, 480); + mlx_resize_image(vl->mstat[7], 400, 50); + free(temp); +} + +int ft_getscore(t_varlist *vl) +{ + int score; + + score = (vl->treasure * 10000) + (vl->kills * 1000); + score = score + (vl->ammo * 100) + (vl->hp * 100); + score = score - (vl->tottime * 10); + if (vl->enemies == vl->kills) + score = score + 50000; + if (vl->treasure == vl->tottreasure) + score = score + 50000; + if (vl->hp >= 100) + score = score + 10000; + if (vl->hp <= 0) + score = score - 100000; + if (vl->ammo >= 100) + score = score + 10000; + if (vl->tottime < 180) + score = score + 50000; + if (vl->minimap) + score = score - 50000; + if (vl->stats) + score = score - 50000; + return (score); +} + +void ft_finish(t_varlist *vl) +{ + int x; + int y; + + x = 0; + y = 0; + vl->oimg = mlx_new_image(vl->mlx, vl->w, vl->h); + while (y < vl->h) + { + while (x < vl->w) + { + mlx_put_pixel(vl->oimg, x, y, 0x0000FF66); + x++; + } + x = 0; + y++; + } + mlx_image_to_window(vl->mlx, vl->oimg, 0, 0); + mlx_set_instance_depth(vl->oimg->instances, 15); + vl->mstat = ft_calloc(4096, 8); + vl->mstat[0] = mlx_put_string(vl->mlx, "YOU ROCK!", vl->w / 2 - 250, 30); + mlx_resize_image(vl->mstat[0], 500, 150); + ft_printstats1(vl); + ft_printstats2(vl, ft_getscore(vl)); + vl->menu = 1; +} + +void ft_youdied(t_varlist *vl) +{ + int x; + int y; + + x = 0; + y = 0; + vl->oimg = mlx_new_image(vl->mlx, vl->w, vl->h); + while (y < vl->h) + { + while (x < vl->w) + { + mlx_put_pixel(vl->oimg, x, y, 0xFF000066); + x++; + } + x = 0; + y++; + } + mlx_image_to_window(vl->mlx, vl->oimg, 0, 0); + mlx_set_instance_depth(vl->oimg->instances, 15); + vl->mstat = ft_calloc(4096, 8); + vl->mstat[0] = mlx_put_string(vl->mlx, "YOU DIED!", vl->w / 2 - 250, 30); + mlx_resize_image(vl->mstat[0], 500, 150); + ft_printstats1(vl); + ft_printstats2(vl, ft_getscore(vl)); + vl->menu = 1; +} diff --git a/src/draw/minimap.c b/src/draw/minimap.c new file mode 100644 index 0000000..e25e278 --- /dev/null +++ b/src/draw/minimap.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* minimap.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/10 11:09:51 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_drawvertlinemap(t_varlist *vl, int y, int mapy) +{ + int mapx; + int x; + + x = 0; + mapx = (int)vl->posy - 10; + while (x <= 21) + { + if (x == 10 && y == 10) + mlx_put_pixel(vl->mimg, x, y, 0xFFFF00FF); + else if (mapy < 0 || mapx < 0) + mlx_put_pixel(vl->mimg, x, y, 0xFFFFFF00); + else if (vl->mapsizey < mapy || vl->mapsizex < mapx) + mlx_put_pixel(vl->mimg, x, y, 0xFFFFFF00); + else if (vl->map[mapy][mapx] == '0') + mlx_put_pixel(vl->mimg, x, y, 0x646464FF); + else if (vl->map[mapy][mapx] == '1') + mlx_put_pixel(vl->mimg, x, y, 0x0000FFFF); + else if (vl->map[mapy][mapx] == '2') + mlx_put_pixel(vl->mimg, x, y, 0x00FF00FF); + else if (vl->map[mapy][mapx] == '3') + mlx_put_pixel(vl->mimg, x, y, 0xFF0000FF); + mapx++; + x++; + } +} + +void ft_drawminimap(t_varlist *vl) +{ + int mapy; + int y; + + if (vl->minimap % 2) + { + mapy = (int)vl->posx - 10; + y = 0; + while (y <= 21) + { + ft_drawvertlinemap(vl, y, mapy); + mapy++; + y++; + } + mlx_resize_image(vl->mimg, 168, 168); + mlx_image_to_window(vl->mlx, vl->mimg, vl->w - 178, 10); + mlx_set_instance_depth(vl->mimg->instances, 11); + } +} diff --git a/src/draw/sprite1.c b/src/draw/sprite1.c new file mode 100644 index 0000000..87b9382 --- /dev/null +++ b/src/draw/sprite1.c @@ -0,0 +1,106 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* sprite1.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ +/* Updated: 2023/11/10 09:11:46 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_sortsprites(t_varlist *vl) +{ + int i; + t_sprite temp; + + i = 0; + while (vl->spritecount > i) + { + vl->sprite[i].distance = pow((vl->posx - vl->sprite[i].x), 2) + \ + pow((vl->posy - vl->sprite[i].y), 2); + i++; + } + while (i) + { + if (vl->sprite[i].distance > vl->sprite[i - 1].distance) + { + temp = vl->sprite[i]; + vl->sprite[i] = vl->sprite[i - 1]; + vl->sprite[i - 1] = temp; + } + i--; + } +} + +mlx_texture_t *ft_getsprite(t_varlist *vl, int i) +{ + if (vl->sprite[i].type == 1 && vl->sprite[i].status == 0) + return (vl->decotxt[vl->sprite[i].number]); + if (vl->sprite[i].type == 1 && vl->sprite[i].status == 1) + return (vl->decotxt[12]); + if (vl->sprite[i].type == 2 && vl->sprite[i].status == 0) + return (vl->picktxt[vl->sprite[i].number]); + if (vl->sprite[i].type == 3 && vl->sprite[i].status < 2) + return (vl->gfiretxt[vl->sprite[i].number]); + return (vl->gdeadtxt[vl->sprite[i].number]); +} + +t_draw *ft_initdrawsprite(t_varlist *vl, int i) +{ + double spritex; + double spritey; + double invdet; + t_draw *d; + + d = ft_calloc(12, 8); + spritex = vl->sprite[i].x - vl->posx; + spritey = vl->sprite[i].y - vl->posy; + invdet = 1.0 / (vl->planex * vl->diry - vl->dirx * vl->planey); + d->tfx = invdet * (vl->diry * spritex - vl->dirx * spritey); + d->tfy = invdet * (-vl->planey * spritex + vl->planex * spritey); + d->sprs = (vl->w / 2) * (1 + d->tfx / d->tfy); + d->vmov = vl->vaim + vl->jump / d->tfy; + d->sprh = fabs((vl->h / d->tfy)); + return (d); +} + +void ft_getdrawstartend(t_varlist *vl, t_draw *draw) +{ + draw->drawstarty = -draw->sprh / 2 + vl->h / 2 + draw->vmov; + if (draw->drawstarty < 0) + draw->drawstarty = 0; + draw->drawendy = draw->sprh / 2 + vl->h / 2 + draw->vmov; + if (draw->drawendy >= vl->h) + draw->drawendy = vl->h - 1; + draw->sprw = abs((int)(vl->h / draw->tfy)); + draw->drawstartx = -draw->sprw / 2 + draw->sprs; + if (draw->drawstartx < 0) + draw->drawstartx = 0; + draw->drawendx = draw->sprw / 2 + draw->sprs; + if (draw->drawendx >= vl->w) + draw->drawendx = vl->w - 1; +} + +void ft_drawsprites(t_varlist *vl) +{ + int i; + int x; + t_draw *draw; + + ft_sortsprites(vl); + i = 0; + while (vl->spritecount > i) + { + draw = ft_initdrawsprite(vl, i); + ft_getdrawstartend(vl, draw); + x = draw->drawstartx; + vl->temptxt = ft_getsprite(vl, i); + ft_drawsprite(vl, draw, x, i); + free(draw); + i++; + } +} diff --git a/src/draw/sprite2.c b/src/draw/sprite2.c new file mode 100644 index 0000000..ad9c6ec --- /dev/null +++ b/src/draw/sprite2.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* sprite2.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ +/* Updated: 2023/11/10 09:11:54 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_drawspriteline(t_varlist *vl, t_draw *d, int y, int x) +{ + int t; + uint8_t *texel; + uint32_t color; + + t = (y - d->vmov) * 256 - vl->h * 128 + d->sprh * 128; + d->y = (t * 64) / d->sprh / 256; + if (d->y < 0) + d->y = 0; + if (d->y > 64) + d->y = 64; + if (d->x < 0) + d->x = 0; + if (d->x > 64) + d->x = 64; + texel = &vl->temptxt->pixels[(vl->temptxt->width * d->y + d->x) * 4]; + color = texel[0] << 24 | texel[1] << 16 | texel[2] << 8 | texel[3]; + if (color != 0x980088FF) + mlx_put_pixel(vl->img, x, y, color); +} + +void ft_drawsprite(t_varlist *vl, t_draw *d, int x, int i) +{ + int y; + + while (x < d->drawendx) + { + d->x = (int)(256 * (x - (-d->sprw / 2 + d->sprs)) * 64 / d->sprw) / 256; + if (d->tfy > 0 && x > 0 && x < vl->w && d->tfy < vl->distance[x] + 0.7) + { + if (vl->sprite[i].type == 3 && vl->sprite[i].status == 0) + vl->sprite[i].status = 1; + y = d->drawstarty; + while (y < d->drawendy) + { + ft_drawspriteline(vl, d, y, x); + y++; + } + } + else if (vl->sprite[i].type == 3 && vl->sprite[i].status < 2) + { + vl->sprite[i].status = 0; + vl->sprite[i].number = 0; + } + x++; + } +} diff --git a/src/draw/stats.c b/src/draw/stats.c index 2e7c3a3..6dc0253 100644 --- a/src/draw/stats.c +++ b/src/draw/stats.c @@ -6,15 +6,14 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ -/* Updated: 2023/11/06 01:17:31 by houtworm ######## odam.nl */ +/* Updated: 2023/11/09 01:28:43 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_printgamestats(t_varlist *vl) +void ft_printtimestats(t_varlist *vl) { - char *total; char *current; char *temp; @@ -22,6 +21,20 @@ void ft_printgamestats(t_varlist *vl) temp = ft_strjoin(current, " FPS"); vl->fstat = mlx_put_string(vl->mlx, temp, 10, 10); ft_vafree(2, temp, current); + current = ft_itoa(vl->tottime); + temp = ft_vastrjoin(3, "Time: ", current, " Seconds"); + vl->tstat = mlx_put_string(vl->mlx, temp, 10, 70); + ft_vafree(2, current, temp); + mlx_set_instance_depth(vl->fstat->instances, 2); + mlx_set_instance_depth(vl->tstat->instances, 3); +} + +void ft_printgamestats(t_varlist *vl) +{ + char *total; + char *current; + char *temp; + total = ft_itoa(vl->enemies); current = ft_itoa(vl->kills); temp = ft_vastrjoin(4, "Kills: ", current, "/", total); @@ -32,9 +45,8 @@ void ft_printgamestats(t_varlist *vl) temp = ft_vastrjoin(4, "Treasure: ", current, "/", total); vl->kstat = mlx_put_string(vl->mlx, temp, 10, 50); ft_vafree(3, temp, total, current); - mlx_set_instance_depth(vl->fstat->instances, 2); - mlx_set_instance_depth(vl->cstat->instances, 3); - mlx_set_instance_depth(vl->kstat->instances, 4); + mlx_set_instance_depth(vl->cstat->instances, 4); + mlx_set_instance_depth(vl->kstat->instances, 5); } void ft_printplayerstats(t_varlist *vl) @@ -42,20 +54,26 @@ void ft_printplayerstats(t_varlist *vl) char *current; char *temp; - current = ft_itoa(vl->ammo); - temp = ft_vastrjoin(2, "Ammo: ", current); - vl->astat = mlx_put_string(vl->mlx, temp, 10, vl->h - 30); - ft_vafree(2, temp, current); current = ft_itoa(vl->hp); temp = ft_vastrjoin(2, "HP: ", current); - vl->hstat = mlx_put_string(vl->mlx, temp, 10, vl->h - 50); + vl->hstat = mlx_put_string(vl->mlx, temp, 10, vl->h - 40); ft_vafree(2, temp, current); - mlx_set_instance_depth(vl->astat->instances, 6); + mlx_resize_image(vl->hstat, 120, 30); mlx_set_instance_depth(vl->hstat->instances, 7); + current = ft_itoa(vl->ammo); + temp = ft_vastrjoin(2, "Ammo: ", current); + vl->astat = mlx_put_string(vl->mlx, temp, vl->w - 160, vl->h - 40); + ft_vafree(2, temp, current); + mlx_resize_image(vl->astat, 150, 30); + mlx_set_instance_depth(vl->astat->instances, 6); } void ft_printstats(t_varlist *vl) { - ft_printgamestats(vl); + if (vl->stats % 2) + { + ft_printgamestats(vl); + ft_printtimestats(vl); + } ft_printplayerstats(vl); } diff --git a/src/draw/texture.c b/src/draw/texture.c index 5bad97f..dde683a 100644 --- a/src/draw/texture.c +++ b/src/draw/texture.c @@ -6,7 +6,7 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ -/* Updated: 2023/11/05 23:26:38 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 10:41:37 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,19 +14,21 @@ void ft_selecttexture(t_varlist *vl) { - if (vl->side == 0) + if (vl->map[vl->mapx][vl->mapy] == '4') + vl->temptxt = vl->elevtxt[0]; + else if (vl->side == 0) { if (vl->raydirx > 0) - vl->temptext = vl->walltext[0]; + vl->temptxt = vl->walltxt[0]; else - vl->temptext = vl->walltext[2]; + vl->temptxt = vl->walltxt[2]; } else { if (vl->raydiry > 0) - vl->temptext = vl->walltext[3]; + vl->temptxt = vl->walltxt[3]; else - vl->temptext = vl->walltext[1]; + vl->temptxt = vl->walltxt[1]; } } @@ -36,9 +38,9 @@ int ft_gettextx(t_varlist *vl) int textx; if (vl->side == 0) - wallx = vl->posy + vl->walldist * vl->raydiry; + wallx = vl->posy + vl->wdist * vl->raydiry; else - wallx = vl->posx + vl->walldist * vl->raydirx; + wallx = vl->posx + vl->wdist * vl->raydirx; ft_selecttexture(vl); wallx -= floor(wallx); textx = wallx * 64.0; diff --git a/src/draw/weapon.c b/src/draw/weapon.c index 63583dc..fe88976 100644 --- a/src/draw/weapon.c +++ b/src/draw/weapon.c @@ -6,17 +6,17 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ -/* Updated: 2023/11/05 23:44:25 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 09:12:33 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_drawknife(t_varlist *vl) +void ft_drawweapontexture(t_varlist *vl, mlx_texture_t **text) { - int x; - int y; - int i; + int x; + int y; + int i; uint32_t color; x = 0; @@ -24,82 +24,7 @@ void ft_drawknife(t_varlist *vl) i = 1; while (i < 4096) { - color = ft_gettextcolor(vl->gun0text[vl->reload], y, x); - if (color != 0x980088FF) - mlx_put_pixel(vl->wimg, x, y, color); - x++; - if (i % 64 == 0) - { - x = 0; - y++; - } - i++; - } -} - -void ft_drawpistol(t_varlist *vl) -{ - int x; - int y; - int i; - uint32_t color; - - x = 0; - y = 0; - i = 1; - while (i < 4096) - { - color = ft_gettextcolor(vl->gun1text[vl->reload], y, x); - if (color != 0x980088FF) - mlx_put_pixel(vl->wimg, x, y, color); - x++; - if (i % 64 == 0) - { - x = 0; - y++; - } - i++; - } -} - -void ft_drawmgun(t_varlist *vl) -{ - int x; - int y; - int i; - uint32_t color; - - x = 0; - y = 0; - i = 1; - while (i < 4096) - { - color = ft_gettextcolor(vl->gun2text[vl->reload], y, x); - if (color != 0x980088FF) - mlx_put_pixel(vl->wimg, x, y, color); - x++; - if (i % 64 == 0) - { - x = 0; - y++; - } - i++; - } -} - -void ft_drawggun(t_varlist *vl) -{ - int x; - int y; - int i; - uint32_t color; - - x = 0; - y = 0; - i = 1; - while (i < 4096) - { - color = ft_gettextcolor(vl->gun3text[vl->reload], y, x); + color = ft_gettextcolor(text[vl->reload], y, x); if (color != 0x980088FF) mlx_put_pixel(vl->wimg, x, y, color); x++; @@ -117,13 +42,13 @@ void ft_drawweapon(t_varlist *vl) int size; if (vl->weapon == 0) - ft_drawknife(vl); + ft_drawweapontexture(vl, vl->gun0txt); if (vl->weapon == 1) - ft_drawpistol(vl); + ft_drawweapontexture(vl, vl->gun1txt); if (vl->weapon == 2) - ft_drawmgun(vl); + ft_drawweapontexture(vl, vl->gun2txt); if (vl->weapon == 3) - ft_drawggun(vl); + ft_drawweapontexture(vl, vl->gun3txt); size = vl->h * 0.8; mlx_resize_image(vl->wimg, size, size); mlx_image_to_window(vl->mlx, vl->wimg, vl->w / 2 - size / 2, vl->h - size); diff --git a/src/draw/world.c b/src/draw/world.c index 4435bad..fcf36a3 100644 --- a/src/draw/world.c +++ b/src/draw/world.c @@ -6,7 +6,7 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ -/* Updated: 2023/11/05 23:27:55 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 10:41:13 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ int ft_drawceiling(int x, t_varlist *vl, int drawstart) return (y); } -int ft_drawwall(int x, t_varlist *vl, int drawstart, int drawend, int y) +int ft_drawwall(t_varlist *vl, int x, int y, t_draw *draw) { int textx; double step; @@ -34,13 +34,14 @@ int ft_drawwall(int x, t_varlist *vl, int drawstart, int drawend, int y) uint32_t color; textx = ft_gettextx(vl); - step = 64.0 / vl->lineheight; - textpos = (drawstart - vl->vaim - (vl->jump / vl->walldist) - vl->h / 2 + vl->lineheight / 2) * step; - while (y < drawend) + step = 64.0 / vl->lineh; + textpos = (draw->drawstarty - vl->vaim - (vl->jump / vl->wdist) - \ + vl->h / 2 + vl->lineh / 2) * step; + while (y < draw->drawendy) { texty = (int)textpos & (64 - 1); textpos += step; - color = ft_gettextcolor(vl->temptext, texty, textx); + color = ft_gettextcolor(vl->temptxt, texty, textx); mlx_put_pixel(vl->img, x, y, color); y++; } @@ -62,13 +63,13 @@ int ft_getwallheight(t_varlist *vl, int mode) if (mode == 1) { - ret = -vl->lineheight / 2 + vl->h / 2 + vl->vaim + (vl->jump / vl->walldist); + ret = -vl->lineh / 2 + vl->h / 2 + vl->vaim + (vl->jump / vl->wdist); if (ret < 0) ret = 0; } if (mode == 2) { - ret = vl->lineheight / 2 + vl->h / 2 + vl->vaim + (vl->jump / vl->walldist); + ret = vl->lineh / 2 + vl->h / 2 + vl->vaim + (vl->jump / vl->wdist); if (ret >= vl->h) ret = vl->h - 1; } @@ -77,26 +78,29 @@ int ft_getwallheight(t_varlist *vl, int mode) void ft_drawmap(t_varlist *vl) { - int x; - int y; - int mapx; - int mapy; + int x; + int y; + t_draw *draw; - mapx = (int)vl->posx; - mapy = (int)vl->posy; x = 0; + draw = ft_calloc(12, 8); while (x <= vl->w) { - ft_raycast(vl, x, mapx, mapy); + vl->mapx = (int)vl->posx; + vl->mapy = (int)vl->posy; + ft_raycast(vl, x); y = ft_drawceiling(x, vl, ft_getwallheight(vl, 1)); - y = ft_drawwall(x, vl, ft_getwallheight(vl, 1), ft_getwallheight(vl, 2), y); + draw->drawstarty = ft_getwallheight(vl, 1); + draw->drawendy = ft_getwallheight(vl, 2); + y = ft_drawwall(vl, x, y, draw); ft_drawfloor(x, vl, y); if (vl->side == 0) - vl->walldist = (vl->sidedistx - vl->deltadistx); + vl->wdist = (vl->sidedistx - vl->deltadistx); else - vl->walldist = (vl->sidedisty - vl->deltadisty); - vl->lineheight = vl->h / vl->walldist; - vl->distance[x] = vl->walldist; + vl->wdist = (vl->sidedisty - vl->deltadisty); + vl->lineh = vl->h / vl->wdist; + vl->distance[x] = vl->wdist; x++; } + free(draw); } diff --git a/src/input/acro.c b/src/input/acro.c new file mode 100644 index 0000000..b0838b5 --- /dev/null +++ b/src/input/acro.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* acro.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:50:23 by houtworm #+# #+# */ +/* Updated: 2023/11/10 05:16:39 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_processacro(t_varlist *vl, double movespeed) +{ + if (mlx_is_key_down(vl->mlx, MLX_KEY_SPACE)) + { + if (vl->menu) + vl->menu = 3; + if (vl->jump < 10) + vl->jump = 200; + } + else if (vl->jump > 0) + vl->jump = vl->jump - 150 * movespeed; + if (mlx_is_key_down(vl->mlx, MLX_KEY_LEFT_CONTROL)) + vl->jump = -200; + else if (vl->jump < 0) + vl->jump = vl->jump + 150 * movespeed; + if (mlx_is_key_down(vl->mlx, MLX_KEY_LEFT_SHIFT)) + vl->run = 2; + else + vl->run = 1; +} diff --git a/src/input/game.c b/src/input/game.c index a52a1d2..204f06a 100644 --- a/src/input/game.c +++ b/src/input/game.c @@ -6,7 +6,7 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:50:23 by houtworm #+# #+# */ -/* Updated: 2023/11/05 20:16:38 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 11:09:42 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -17,15 +17,21 @@ void keyhook(mlx_key_data_t kd, void *param) t_varlist *vl; vl = param; - vl->w = vl->w; if (mlx_is_key_down(vl->mlx, MLX_KEY_ESCAPE)) { ft_putendl("escape is pressed"); mlx_close_window(vl->mlx); return ; } - if ((kd.key == MLX_KEY_H || kd.key == MLX_KEY_F1) && kd.action == MLX_PRESS) - ft_putendl("H is pressed"); + if (vl->menu == 0) + { + if (kd.key == MLX_KEY_M && kd.action == MLX_PRESS) + vl->minimap++; + if (kd.key == MLX_KEY_N && kd.action == MLX_PRESS) + vl->stats++; + if (kd.key == MLX_KEY_F && kd.action == MLX_PRESS) + ft_interact(vl); + } } void resizehook(int x, int y, void *param) @@ -47,7 +53,10 @@ void ft_processinput(t_varlist *vl) movespeed = vl->frametime * 3.0; rotspeed = vl->frametime * 3.0; ft_processacro(vl, movespeed); - ft_processmove(vl, rotspeed); - ft_processturn(vl, rotspeed); - ft_processguns(vl); + if (vl->menu == 0) + { + ft_processmove(vl, rotspeed, 0, 0); + ft_processturn(vl, rotspeed); + ft_processguns(vl); + } } diff --git a/src/input/rest.c b/src/input/guns.c similarity index 73% rename from src/input/rest.c rename to src/input/guns.c index 186c1c9..05f59d5 100644 --- a/src/input/rest.c +++ b/src/input/guns.c @@ -1,45 +1,29 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* rest.c :+: :+: */ +/* mouse.c :+: :+: */ /* +:+ */ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:50:23 by houtworm #+# #+# */ -/* Updated: 2023/11/06 01:05:43 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 05:16:15 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_processacro(t_varlist *vl, double movespeed) -{ - if (mlx_is_key_down(vl->mlx, MLX_KEY_SPACE) && vl->jump < 10) - vl->jump = 200; - else if (vl->jump > 0) - vl->jump = vl->jump - 150 * movespeed; - if (mlx_is_key_down(vl->mlx, MLX_KEY_LEFT_CONTROL)) - vl->jump = -200; - else if (vl->jump < 0) - vl->jump = vl->jump + 150 * movespeed; - if (mlx_is_key_down(vl->mlx, MLX_KEY_LEFT_SHIFT)) - vl->run = 2; - else - vl->run = 1; -} - void ft_processguns(t_varlist *vl) { if (mlx_is_mouse_down(vl->mlx, MLX_MOUSE_BUTTON_LEFT) && vl->reload == 0) { if (vl->ammo || !vl->weapon) - { - vl->anitime = vl->frametime; vl->reload = 1; + if (!vl->ammo && vl->weapon) + { + vl->weapon = 0; + vl->reloadtime = 0.05; } } - if (mlx_is_mouse_down(vl->mlx, MLX_MOUSE_BUTTON_RIGHT)) - ft_putendl("zoom"); } void ft_nextweapon(t_varlist *vl) @@ -101,4 +85,12 @@ void scrollhook(double xdelta, double ydelta, void *param) ft_prevweapon(vl); if (ydelta < 0) ft_nextweapon(vl); + if (vl->weapon == 0) + vl->reloadtime = 0.05; + else if (vl->weapon == 1) + vl->reloadtime = 0.1; + else if (vl->weapon == 2) + vl->reloadtime = 0.05; + else if (vl->weapon == 3) + vl->reloadtime = 0.02; } diff --git a/src/input/move.c b/src/input/move.c index 8b2a33d..ea033af 100644 --- a/src/input/move.c +++ b/src/input/move.c @@ -6,52 +6,53 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:50:23 by houtworm #+# #+# */ -/* Updated: 2023/11/05 20:42:52 by houtworm ######## odam.nl */ +/* Updated: 2023/11/09 01:04:20 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_moveforward(t_varlist *vl, double movespeed) +void ft_checkmove(t_varlist *vl, double movy, double movx, double movespeed) { - if (vl->map[(int)(vl->posx + vl->dirx * movespeed)][(int)vl->posy] == '0') - vl->posx += vl->dirx * movespeed; - if (vl->map[(int)vl->posx][(int)(vl->posy + vl->diry * movespeed)] == '0') - vl->posy += vl->diry * movespeed; + double length; + double newx; + double newy; + + length = sqrt(movx * movx + movy * movy); + if (length != 0) + { + movx /= length; + movy /= length; + } + newx = vl->posx + movx * movespeed * vl->run; + newy = vl->posy + movy * movespeed * vl->run; + if (vl->map[(int)newx][(int)vl->posy] == '0') + vl->posx = newx; + if (vl->map[(int)vl->posx][(int)newy] == '0') + vl->posy = newy; } -void ft_movebackward(t_varlist *vl, double movespeed) -{ - if (vl->map[(int)(vl->posx - vl->dirx * movespeed)][(int)vl->posy] == '0') - vl->posx -= vl->dirx * movespeed; - if (vl->map[(int)vl->posx][(int)(vl->posy - vl->diry * movespeed)] == '0') - vl->posy -= vl->diry * movespeed; -} - -void ft_moveleft(t_varlist *vl, double movespeed) -{ - if (vl->map[(int)(vl->posx - vl->dirx * movespeed)][(int)vl->posy] == '0') - vl->posx -= vl->diry * movespeed; - if (vl->map[(int)vl->posx][(int)(vl->posy + vl->diry * movespeed)] == '0') - vl->posy += vl->dirx * movespeed; -} - -void ft_moveright(t_varlist *vl, double movespeed) -{ - if (vl->map[(int)(vl->posx + vl->dirx * movespeed)][(int)vl->posy] == '0') - vl->posx += vl->diry * movespeed; - if (vl->map[(int)vl->posx][(int)(vl->posy - vl->diry * movespeed)] == '0') - vl->posy -= vl->dirx * movespeed; -} - -void ft_processmove(t_varlist *vl, double movespeed) +void ft_processmove(t_varlist *vl, double movspd, double movx, double movy) { if (mlx_is_key_down(vl->mlx, MLX_KEY_W)) - ft_moveforward(vl, movespeed * vl->run); + { + movx += vl->dirx; + movy += vl->diry; + } if (mlx_is_key_down(vl->mlx, MLX_KEY_A)) - ft_moveleft(vl, movespeed * vl->run); + { + movx -= vl->diry; + movy += vl->dirx; + } if (mlx_is_key_down(vl->mlx, MLX_KEY_S)) - ft_movebackward(vl, movespeed * vl->run); + { + movx -= vl->dirx; + movy -= vl->diry; + } if (mlx_is_key_down(vl->mlx, MLX_KEY_D)) - ft_moveright(vl, movespeed * vl->run); + { + movx += vl->diry; + movy -= vl->dirx; + } + ft_checkmove(vl, movy, movx, movspd); } diff --git a/src/main/cleanup.c b/src/main/cleanup.c index a7636c3..69fc891 100644 --- a/src/main/cleanup.c +++ b/src/main/cleanup.c @@ -6,41 +6,77 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ -/* Updated: 2023/11/05 08:40:06 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 09:13:02 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" +void ft_deleteimages(t_varlist *vl) +{ + int i; + + i = 0; + if (vl->menu) + { + while (i < 8) + { + mlx_delete_image(vl->mlx, vl->mstat[i]); + i++; + } + free(vl->mstat); + } + mlx_delete_image(vl->mlx, vl->img); + mlx_delete_image(vl->mlx, vl->oimg); + mlx_delete_image(vl->mlx, vl->wimg); + mlx_delete_image(vl->mlx, vl->mimg); +} + +void ft_deletedecor(t_varlist *vl) +{ + mlx_delete_texture(vl->decotxt[0]); + mlx_delete_texture(vl->decotxt[1]); + mlx_delete_texture(vl->decotxt[2]); + mlx_delete_texture(vl->decotxt[3]); + mlx_delete_texture(vl->decotxt[4]); + mlx_delete_texture(vl->decotxt[5]); + mlx_delete_texture(vl->decotxt[6]); + mlx_delete_texture(vl->decotxt[7]); + mlx_delete_texture(vl->decotxt[8]); + mlx_delete_texture(vl->decotxt[9]); + mlx_delete_texture(vl->decotxt[10]); + mlx_delete_texture(vl->decotxt[11]); +} + +void ft_deletewalls(t_varlist *vl) +{ + mlx_delete_texture(vl->walltxt[0]); + mlx_delete_texture(vl->walltxt[1]); + mlx_delete_texture(vl->walltxt[2]); + mlx_delete_texture(vl->walltxt[3]); + mlx_delete_texture(vl->elevtxt[0]); +} + +void ft_deletepickup(t_varlist *vl) +{ + mlx_delete_texture(vl->picktxt[0]); + mlx_delete_texture(vl->picktxt[1]); + mlx_delete_texture(vl->picktxt[2]); + mlx_delete_texture(vl->picktxt[3]); + mlx_delete_texture(vl->picktxt[4]); + mlx_delete_texture(vl->picktxt[5]); + mlx_delete_texture(vl->picktxt[6]); + mlx_delete_texture(vl->picktxt[7]); + mlx_delete_texture(vl->picktxt[8]); + mlx_delete_texture(vl->picktxt[9]); + mlx_delete_texture(vl->picktxt[10]); + mlx_delete_texture(vl->picktxt[11]); +} + void ft_cleanup(t_varlist *vl) { - mlx_delete_texture(vl->walltext[0]); - mlx_delete_texture(vl->walltext[1]); - mlx_delete_texture(vl->walltext[2]); - mlx_delete_texture(vl->walltext[3]); - mlx_delete_texture(vl->decotext[0]); - mlx_delete_texture(vl->decotext[1]); - mlx_delete_texture(vl->decotext[2]); - mlx_delete_texture(vl->decotext[3]); - mlx_delete_texture(vl->decotext[4]); - mlx_delete_texture(vl->decotext[5]); - mlx_delete_texture(vl->decotext[6]); - mlx_delete_texture(vl->decotext[7]); - mlx_delete_texture(vl->decotext[8]); - mlx_delete_texture(vl->decotext[9]); - mlx_delete_texture(vl->decotext[10]); - mlx_delete_texture(vl->decotext[11]); - mlx_delete_texture(vl->picktext[0]); - mlx_delete_texture(vl->picktext[1]); - mlx_delete_texture(vl->picktext[2]); - mlx_delete_texture(vl->picktext[3]); - mlx_delete_texture(vl->picktext[4]); - mlx_delete_texture(vl->picktext[5]); - mlx_delete_texture(vl->picktext[6]); - mlx_delete_texture(vl->picktext[7]); - mlx_delete_texture(vl->picktext[8]); - mlx_delete_texture(vl->picktext[9]); - mlx_delete_texture(vl->picktext[10]); - mlx_delete_texture(vl->picktext[11]); - mlx_delete_image(vl->mlx, vl->img); + ft_deleteimages(vl); + ft_deletedecor(vl); + ft_deletewalls(vl); + ft_deletepickup(vl); } diff --git a/src/main/init.c b/src/main/init.c index d5887f4..e817ca2 100644 --- a/src/main/init.c +++ b/src/main/init.c @@ -6,7 +6,7 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */ -/* Updated: 2023/11/06 01:18:00 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 09:13:39 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -14,105 +14,87 @@ void ft_initsprites(t_varlist *vl) { - vl->decotext = ft_calloc(4096, 8); - vl->decotext[0] = mlx_load_png("./assets/decoration/barrel.png"); - vl->decotext[1] = mlx_load_png("./assets/decoration/gbarrel.png"); - vl->decotext[2] = mlx_load_png("./assets/decoration/slamp.png"); - vl->decotext[3] = mlx_load_png("./assets/decoration/armor.png"); - vl->decotext[4] = mlx_load_png("./assets/decoration/pillar.png"); - vl->decotext[5] = mlx_load_png("./assets/decoration/plant.png"); - vl->decotext[6] = mlx_load_png("./assets/decoration/vase.png"); - vl->decotext[7] = mlx_load_png("./assets/decoration/faucet.png"); - vl->decotext[8] = mlx_load_png("./assets/decoration/table.png"); - vl->decotext[9] = mlx_load_png("./assets/decoration/hskel.png"); - vl->decotext[10] = mlx_load_png("./assets/decoration/hlamp.png"); - vl->decotext[11] = mlx_load_png("./assets/decoration/chandel.png"); + vl->decotxt = ft_calloc(4096, 8); + vl->decotxt[0] = mlx_load_png("./assets/decoration/barrel.png"); + vl->decotxt[1] = mlx_load_png("./assets/decoration/gbarrel.png"); + vl->decotxt[2] = mlx_load_png("./assets/decoration/slamp.png"); + vl->decotxt[3] = mlx_load_png("./assets/decoration/armor.png"); + vl->decotxt[4] = mlx_load_png("./assets/decoration/pillar.png"); + vl->decotxt[5] = mlx_load_png("./assets/decoration/plant.png"); + vl->decotxt[6] = mlx_load_png("./assets/decoration/vase.png"); + vl->decotxt[7] = mlx_load_png("./assets/decoration/faucet.png"); + vl->decotxt[8] = mlx_load_png("./assets/decoration/table.png"); + vl->decotxt[9] = mlx_load_png("./assets/decoration/hskel.png"); + vl->decotxt[10] = mlx_load_png("./assets/decoration/hlamp.png"); + vl->decotxt[11] = mlx_load_png("./assets/decoration/chandel.png"); + vl->decotxt[12] = mlx_load_png("./assets/decoration/rubble.png"); } void ft_initpickups(t_varlist *vl) { - vl->picktext = ft_calloc(4096, 8); - vl->picktext[0] = mlx_load_png("./assets/pickup/treasure1.png"); - vl->picktext[1] = mlx_load_png("./assets/pickup/treasure2.png"); - vl->picktext[2] = mlx_load_png("./assets/pickup/treasure3.png"); - vl->picktext[3] = mlx_load_png("./assets/pickup/treasure4.png"); - vl->picktext[4] = mlx_load_png("./assets/pickup/hpkit.png"); - vl->picktext[5] = mlx_load_png("./assets/pickup/food.png"); - vl->picktext[6] = mlx_load_png("./assets/pickup/biscuits.png"); - vl->picktext[7] = mlx_load_png("./assets/pickup/gkey.png"); - vl->picktext[8] = mlx_load_png("./assets/pickup/bkey.png"); - vl->picktext[9] = mlx_load_png("./assets/pickup/mgun.png"); - vl->picktext[10] = mlx_load_png("./assets/pickup/ggun.png"); - vl->picktext[11] = mlx_load_png("./assets/pickup/ammo.png"); + vl->picktxt = ft_calloc(4096, 8); + vl->picktxt[0] = mlx_load_png("./assets/pickup/treasure1.png"); + vl->picktxt[1] = mlx_load_png("./assets/pickup/treasure2.png"); + vl->picktxt[2] = mlx_load_png("./assets/pickup/treasure3.png"); + vl->picktxt[3] = mlx_load_png("./assets/pickup/treasure4.png"); + vl->picktxt[4] = mlx_load_png("./assets/pickup/hpkit.png"); + vl->picktxt[5] = mlx_load_png("./assets/pickup/food.png"); + vl->picktxt[6] = mlx_load_png("./assets/pickup/biscuits.png"); + vl->picktxt[7] = mlx_load_png("./assets/pickup/gkey.png"); + vl->picktxt[8] = mlx_load_png("./assets/pickup/bkey.png"); + vl->picktxt[9] = mlx_load_png("./assets/pickup/mgun.png"); + vl->picktxt[10] = mlx_load_png("./assets/pickup/ggun.png"); + vl->picktxt[11] = mlx_load_png("./assets/pickup/ammo.png"); } void ft_initenemies(t_varlist *vl) { - vl->nazitext = ft_calloc(4096, 8); - vl->nazitext[0] = mlx_load_png("./assets/nazi/guard/guard1.png"); + vl->gfiretxt = ft_calloc(4096, 8); + vl->gfiretxt[0] = mlx_load_png("./assets/nazi/guard/fire1.png"); + vl->gfiretxt[1] = mlx_load_png("./assets/nazi/guard/fire2.png"); + vl->gfiretxt[2] = mlx_load_png("./assets/nazi/guard/fire3.png"); + vl->gfiretxt[3] = mlx_load_png("./assets/nazi/guard/fire4.png"); + vl->gdeadtxt = ft_calloc(4096, 8); + vl->gdeadtxt[0] = mlx_load_png("./assets/nazi/guard/die1.png"); + vl->gdeadtxt[1] = mlx_load_png("./assets/nazi/guard/die2.png"); + vl->gdeadtxt[2] = mlx_load_png("./assets/nazi/guard/die3.png"); + vl->gdeadtxt[3] = mlx_load_png("./assets/nazi/guard/die4.png"); + vl->gdeadtxt[4] = mlx_load_png("./assets/nazi/guard/die5.png"); } void ft_initweapons(t_varlist *vl) { - vl->gun0text = ft_calloc(4096, 8); - vl->gun0text[0] = mlx_load_png("./assets/weapon/knife/1.png"); - vl->gun0text[1] = mlx_load_png("./assets/weapon/knife/2.png"); - vl->gun0text[2] = mlx_load_png("./assets/weapon/knife/3.png"); - vl->gun0text[3] = mlx_load_png("./assets/weapon/knife/4.png"); - vl->gun0text[4] = mlx_load_png("./assets/weapon/knife/5.png"); - vl->gun1text = ft_calloc(4096, 8); - vl->gun1text[0] = mlx_load_png("./assets/weapon/pistol/1.png"); - vl->gun1text[1] = mlx_load_png("./assets/weapon/pistol/2.png"); - vl->gun1text[2] = mlx_load_png("./assets/weapon/pistol/3.png"); - vl->gun1text[3] = mlx_load_png("./assets/weapon/pistol/4.png"); - vl->gun1text[4] = mlx_load_png("./assets/weapon/pistol/5.png"); - vl->gun2text = ft_calloc(4096, 8); - vl->gun2text[0] = mlx_load_png("./assets/weapon/mgun/1.png"); - vl->gun2text[1] = mlx_load_png("./assets/weapon/mgun/2.png"); - vl->gun2text[2] = mlx_load_png("./assets/weapon/mgun/3.png"); - vl->gun2text[3] = mlx_load_png("./assets/weapon/mgun/4.png"); - vl->gun2text[4] = mlx_load_png("./assets/weapon/mgun/5.png"); - vl->gun3text = ft_calloc(4096, 8); - vl->gun3text[0] = mlx_load_png("./assets/weapon/ggun/1.png"); - vl->gun3text[1] = mlx_load_png("./assets/weapon/ggun/2.png"); - vl->gun3text[2] = mlx_load_png("./assets/weapon/ggun/3.png"); - vl->gun3text[3] = mlx_load_png("./assets/weapon/ggun/4.png"); - vl->gun3text[4] = mlx_load_png("./assets/weapon/ggun/5.png"); -} - -void ft_initmainstuff(t_varlist *vl) -{ - vl->w = 800; - vl->h = 600; - vl->sprite = ft_calloc(4096, 8); - vl->spritecount = 0; - vl->distance = ft_calloc(4096, 8); - vl->walltext = ft_calloc(4096, 8); - vl->vaim = 0; - vl->jump = 0; - vl->treasure = 0; - vl->tottreasure = 0; - vl->enemies = 0; - vl->kills = 0; - vl->mgun = 0; - vl->ggun = 0; - vl->ammo = 10; - vl->hp = 100; - vl->weapon = 0; - vl->reload = 0; - vl->ccolor = 0; - vl->fcolor = 0; - vl->walltext[0] = NULL; - vl->walltext[1] = NULL; - vl->walltext[2] = NULL; - vl->walltext[3] = NULL; + vl->gun0txt = ft_calloc(4096, 8); + vl->gun0txt[0] = mlx_load_png("./assets/weapon/knife/1.png"); + vl->gun0txt[1] = mlx_load_png("./assets/weapon/knife/2.png"); + vl->gun0txt[2] = mlx_load_png("./assets/weapon/knife/3.png"); + vl->gun0txt[3] = mlx_load_png("./assets/weapon/knife/4.png"); + vl->gun0txt[4] = mlx_load_png("./assets/weapon/knife/5.png"); + vl->gun1txt = ft_calloc(4096, 8); + vl->gun1txt[0] = mlx_load_png("./assets/weapon/pistol/1.png"); + vl->gun1txt[1] = mlx_load_png("./assets/weapon/pistol/2.png"); + vl->gun1txt[2] = mlx_load_png("./assets/weapon/pistol/3.png"); + vl->gun1txt[3] = mlx_load_png("./assets/weapon/pistol/4.png"); + vl->gun1txt[4] = mlx_load_png("./assets/weapon/pistol/5.png"); + vl->gun2txt = ft_calloc(4096, 8); + vl->gun2txt[0] = mlx_load_png("./assets/weapon/mgun/1.png"); + vl->gun2txt[1] = mlx_load_png("./assets/weapon/mgun/2.png"); + vl->gun2txt[2] = mlx_load_png("./assets/weapon/mgun/3.png"); + vl->gun2txt[3] = mlx_load_png("./assets/weapon/mgun/4.png"); + vl->gun2txt[4] = mlx_load_png("./assets/weapon/mgun/5.png"); + vl->gun3txt = ft_calloc(4096, 8); + vl->gun3txt[0] = mlx_load_png("./assets/weapon/ggun/1.png"); + vl->gun3txt[1] = mlx_load_png("./assets/weapon/ggun/2.png"); + vl->gun3txt[2] = mlx_load_png("./assets/weapon/ggun/3.png"); + vl->gun3txt[3] = mlx_load_png("./assets/weapon/ggun/4.png"); + vl->gun3txt[4] = mlx_load_png("./assets/weapon/ggun/5.png"); } t_varlist initgame(void) { t_varlist vl; - ft_initmainstuff(&vl); + ft_resetvars(&vl); ft_initsprites(&vl); ft_initpickups(&vl); ft_initenemies(&vl); @@ -120,6 +102,5 @@ t_varlist initgame(void) vl.mlx = mlx_init(vl.w, vl.h, "Cub3D", true); if (!vl.mlx) ft_errorexit("MLX failed to init", "initvarlist", 1); - vl.img = mlx_new_image(vl.mlx, vl.w, vl.h); return (vl); } diff --git a/src/main/main.c b/src/main/main.c index 8e25a42..4fe9a35 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -6,13 +6,13 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ -/* Updated: 2023/11/06 01:15:49 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 07:49:05 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -void ft_replaceimage(t_varlist *vl) +void ft_newframe(t_varlist *vl) { mlx_delete_image(vl->mlx, vl->img); mlx_delete_image(vl->mlx, vl->fstat); @@ -22,74 +22,20 @@ void ft_replaceimage(t_varlist *vl) mlx_delete_image(vl->mlx, vl->astat); mlx_delete_image(vl->mlx, vl->hstat); mlx_delete_image(vl->mlx, vl->wimg); + mlx_delete_image(vl->mlx, vl->fimg); + mlx_delete_image(vl->mlx, vl->mimg); vl->img = mlx_new_image(vl->mlx, vl->w, vl->h); vl->wimg = mlx_new_image(vl->mlx, 64, 64); -} - -void ft_printmap(t_varlist *vl) -{ - int i; - - i = 0; - while (vl->map[i]) - { - ft_putendl(vl->map[i]); - i++; - } - double movespeed; - movespeed = vl->frametime * 3.0; - printf("side: %d\n", vl->side); - printf("raydirx: %lf\n", vl->raydirx); - printf("raydiry: %lf\n", vl->raydiry); - printf("forward: x: %c, y: %c\n", vl->map[(int)(vl->posx + vl->dirx * movespeed)][(int)vl->posy], vl->map[(int)vl->posx][(int)(vl->posy + vl->diry * movespeed)]); - printf("backward: x: %c, y: %c\n", vl->map[(int)(vl->posx - vl->dirx * movespeed)][(int)vl->posy], vl->map[(int)vl->posx][(int)(vl->posy - vl->diry * movespeed)]); - printf("left: x: %c, y: %c\n", vl->map[(int)(vl->posx - vl->dirx * movespeed)][(int)vl->posy], vl->map[(int)vl->posx][(int)(vl->posy + vl->diry * movespeed)]); - printf("right: x: %c, y: %c\n", vl->map[(int)(vl->posx + vl->dirx * movespeed)][(int)vl->posy], vl->map[(int)vl->posx][(int)(vl->posy - vl->diry * movespeed)]); -} - -void ft_timers(t_varlist *vl) -{ - char *time; - char *temp; - + vl->mimg = mlx_new_image(vl->mlx, 22, 22); vl->frametime = vl->mlx->delta_time; - vl->anitime = vl->anitime + vl->frametime; - vl->tottime = (int)mlx_get_time(); - time = ft_itoa(vl->tottime); - temp = ft_vastrjoin(3, "Time: ", time, " Seconds"); - vl->tstat = mlx_put_string(vl->mlx, temp, 10, 70); - mlx_set_instance_depth(vl->tstat->instances, 5); - ft_vafree(2, time, temp); + vl->tottime = vl->tottime + vl->frametime; } -void ft_fireweapon(t_varlist *vl) +void ft_imagetowindow(t_varlist *vl) { - double reloadtime; - - if (vl->weapon == 0) - reloadtime = 0.05; - if (vl->weapon == 1) - reloadtime = 0.1; - if (vl->weapon == 2) - reloadtime = 0.05; - if (vl->weapon == 3) - reloadtime = 0.03; - if (vl->reload) - { - if (vl->anitime - vl->firetime > reloadtime) - { - vl->anitime = 0; - vl->firetime = vl->anitime; - vl->reload++; - if (vl->reload > 4) - { - if (vl->weapon) - vl->ammo--; - vl->reload = 0; - } - } - } - + if (!vl->img || (mlx_image_to_window(vl->mlx, vl->img, 0, 0) < 0)) + ft_errorexit("image to window failed ", "mainloop", 1); + mlx_set_instance_depth(vl->img->instances, 1); } void mainloop(void *param) @@ -97,21 +43,24 @@ void mainloop(void *param) t_varlist *vl; vl = param; - ft_replaceimage(vl); - ft_drawmap(vl); - ft_checkpickup(vl); - /*ft_enemyaction(vl);*/ - ft_drawsprites(vl); - ft_drawweapon(vl); - ft_fireweapon(vl); - /*ft_drawminimap(vl);*/ - ft_timers(vl); - ft_printstats(vl); ft_processinput(vl); - /*ft_printmap(vl);*/ - if (!vl->img || (mlx_image_to_window(vl->mlx, vl->img, 0, 0) < 0)) - ft_errorexit("image to window failed ", "mainloop", 1); - mlx_set_instance_depth(vl->img->instances, 1); + if (!vl->menu) + { + ft_newframe(vl); + ft_drawmap(vl); + ft_enemyaction(vl); + ft_checkpickup(vl); + ft_drawsprites(vl); + ft_drawweapon(vl); + ft_fireweapon(vl); + ft_drawminimap(vl); + ft_checkhealth(vl); + ft_printstats(vl); + ft_flashscreen(vl, 0, 0, 0); + ft_imagetowindow(vl); + } + else if (vl->menu == 3) + ft_restartgame(vl); } int main(int argc, char **argv) @@ -125,8 +74,9 @@ int main(int argc, char **argv) vl = ft_parseconfigfile(vl, argv[1]); else ft_errorexit("Please include a .cub file ", "", 2); - if (!vl.img || (mlx_image_to_window(vl.mlx, vl.img, 0, 0) < 0)) - ft_errorexit("image to window failed ", "main", 1); + vl.cubfile = ft_strdup(argv[1]); + if (ft_floodfill(vl)) + ft_errorexit("map is invalid", "floodfill", 1); mlx_key_hook(vl.mlx, &keyhook, &vl); mlx_resize_hook(vl.mlx, &resizehook, &vl); mlx_scroll_hook(vl.mlx, &scrollhook, &vl); diff --git a/src/draw/raycast.c b/src/main/raycast.c similarity index 86% rename from src/draw/raycast.c rename to src/main/raycast.c index 23c238e..fdc5ba3 100644 --- a/src/draw/raycast.c +++ b/src/main/raycast.c @@ -6,7 +6,7 @@ /* By: djonker +#+ */ /* +#+ */ /* Created: 2023/10/27 14:36:42 by djonker #+# #+# */ -/* Updated: 2023/11/05 19:05:24 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 02:32:10 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -58,30 +58,31 @@ int ft_prepcast(t_varlist *vl, int x) return (0); } -void ft_raycast(t_varlist *vl, int x, int mapx, int mapy) +void ft_raycast(t_varlist *vl, int x) { int hit; int stepx; int stepy; hit = ft_prepcast(vl, x); - stepx = ft_getstepx(vl, mapx); - stepy = ft_getstepy(vl, mapy); + stepx = ft_getstepx(vl, vl->mapx); + stepy = ft_getstepy(vl, vl->mapy); while (hit == 0) { if (vl->sidedistx < vl->sidedisty) { vl->sidedistx += vl->deltadistx; - mapx += stepx; + vl->mapx += stepx; vl->side = 0; } else { vl->sidedisty += vl->deltadisty; - mapy += stepy; + vl->mapy += stepy; vl->side = 1; } - if (vl->map[mapx][mapy] == '1') + if (vl->map[vl->mapx][vl->mapy] == '1' || \ + vl->map[vl->mapx][vl->mapy] == '4') hit = 1; } } diff --git a/src/main/reset.c b/src/main/reset.c new file mode 100644 index 0000000..0ba9ffb --- /dev/null +++ b/src/main/reset.c @@ -0,0 +1,91 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* reset.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:49:12 by houtworm #+# #+# */ +/* Updated: 2023/11/10 09:14:03 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_resetgame(t_varlist *vl) +{ + vl->w = 800; + vl->h = 600; + vl->sprite = ft_calloc(4096, 8); + vl->spritecount = 0; + vl->distance = ft_calloc(4096, 8); + vl->ccolor = 0; + vl->fcolor = 0; + vl->minimap = 0; + vl->stats = 0; + vl->menu = 0; + vl->flash = 0; + vl->tottime = 0; + vl->reloadtime = 0.1; + vl->firetime = 0; + vl->reload = 0; +} + +void ft_resettextures(t_varlist *vl) +{ + vl->elevtxt = ft_calloc(4096, 8); + vl->elevtxt[0] = mlx_load_png("./assets/wall/elevator.png"); + vl->walltxt = ft_calloc(4096, 8); + vl->walltxt[0] = NULL; + vl->walltxt[1] = NULL; + vl->walltxt[2] = NULL; + vl->walltxt[3] = NULL; +} + +void ft_resetplayer(t_varlist *vl) +{ + vl->vaim = 0; + vl->jump = 0; + vl->treasure = 0; + vl->tottreasure = 0; + vl->enemies = 0; + vl->kills = 0; + vl->mgun = 0; + vl->ggun = 0; + vl->ammo = 10; + vl->hp = 100; + vl->weapon = 1; +} + +void ft_resetvars(t_varlist *vl) +{ + ft_resettextures(vl); + ft_resetplayer(vl); + ft_resetgame(vl); +} + +void ft_restartgame(t_varlist *vl) +{ + int i; + + i = 0; + while (i < 8) + { + mlx_delete_image(vl->mlx, vl->mstat[i]); + i++; + } + mlx_delete_image(vl->mlx, vl->oimg); + mlx_delete_texture(vl->walltxt[0]); + mlx_delete_texture(vl->walltxt[1]); + mlx_delete_texture(vl->walltxt[2]); + mlx_delete_texture(vl->walltxt[3]); + mlx_delete_texture(vl->elevtxt[0]); + free(vl->distance); + free(vl->sprite); + free(vl->walltxt); + free(vl->elevtxt); + free(vl->mstat); + ft_frearr(vl->map); + ft_resetvars(vl); + *vl = ft_parseconfigfile(*vl, vl->cubfile); +} diff --git a/src/parse/elements.c b/src/parse/elements.c new file mode 100644 index 0000000..f639943 --- /dev/null +++ b/src/parse/elements.c @@ -0,0 +1,111 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* elements.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */ +/* Updated: 2023/11/10 08:45:58 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +char ft_checkforbasics(t_varlist *vl, char element, int x, int y) +{ + if (ft_strchr(" 0", element)) + return ('0'); + else if (element == '1') + return ('1'); + else if (ft_strchr("NESW", element)) + return (ft_initplayer(vl, element, y, x)); + else if (element == 'D') + return ('0'); + else if (element == 'X') + return ('4'); + return ('\0'); +} + +char ft_checkfordecor(t_varlist *vl, char element, int x, int y) +{ + if (element == 'B') + return (ft_addsoliddecor(vl, y, x, 0)); + else if (element == 'b') + return (ft_addsoliddecor(vl, y, x, 1)); + else if (element == 'L') + return (ft_addsoliddecor(vl, y, x, 2)); + else if (element == 'A') + return (ft_addsoliddecor(vl, y, x, 3)); + else if (element == 'P') + return (ft_addsoliddecor(vl, y, x, 4)); + else if (element == 'p') + return (ft_addsoliddecor(vl, y, x, 5)); + else if (element == 'V') + return (ft_addsoliddecor(vl, y, x, 6)); + else if (element == 'f') + return (ft_addsoliddecor(vl, y, x, 7)); + else if (element == 'T') + return (ft_addsoliddecor(vl, y, x, 8)); + else if (element == 's') + return (ft_addsoliddecor(vl, y, x, 9)); + else if (element == 'l') + return (ft_addwalktroughdecor(vl, y, x, 10)); + else if (element == 'C') + return (ft_addwalktroughdecor(vl, y, x, 11)); + return ('\0'); +} + +char ft_checkforpickup(t_varlist *vl, char element, int x, int y) +{ + if (element == '$') + return (ft_addpickup(vl, y, x, 0)); + else if (element == '#') + return (ft_addpickup(vl, y, x, 1)); + else if (element == '*') + return (ft_addpickup(vl, y, x, 2)); + else if (element == '&') + return (ft_addpickup(vl, y, x, 3)); + else if (element == '9') + return (ft_addpickup(vl, y, x, 4)); + else if (element == '8') + return (ft_addpickup(vl, y, x, 5)); + else if (element == '7') + return (ft_addpickup(vl, y, x, 6)); + else if (element == '5') + return (ft_addpickup(vl, y, x, 7)); + else if (element == '6') + return (ft_addpickup(vl, y, x, 8)); + else if (element == '3') + return (ft_addpickup(vl, y, x, 9)); + else if (element == '4') + return (ft_addpickup(vl, y, x, 10)); + else if (element == '2') + return (ft_addpickup(vl, y, x, 11)); + return ('\0'); +} + +char ft_checkforenemy(t_varlist *vl, char element, int x, int y) +{ + if (element == 'K') + return (ft_addenemy(vl, y, x, 0)); + return ('\0'); +} + +char ft_checkmapelement(t_varlist *vl, char element, int x, int y) +{ + char ret; + + ret = ft_checkforbasics(vl, element, x, y); + if (!ret) + ret = ft_checkforenemy(vl, element, x, y); + if (!ret) + ret = ft_checkfordecor(vl, element, x, y); + if (!ret) + ret = ft_checkforpickup(vl, element, x, y); + if (ret) + return (ret); + ft_putchar(element); + ft_putendl(" character found on map which makes it invalid"); + exit (1); +} diff --git a/src/parse/file.c b/src/parse/file.c new file mode 100644 index 0000000..3e193e9 --- /dev/null +++ b/src/parse/file.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* file.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 16:48:55 by houtworm #+# #+# */ +/* Updated: 2023/11/10 09:31:08 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +t_varlist ft_parseconfigfile(t_varlist vl, char *filename) +{ + int fd; + char *line; + + fd = open(filename, O_RDONLY); + if (fd == -1) + ft_errorexit("file does not exist", "parseconfigfile", 1); + while (get_next_line(fd, &line)) + { + ft_checkline(&vl, line); + if (vl.walltxt[0] && vl.walltxt[1] && vl.walltxt[2] && vl.walltxt[3]) + { + if (vl.ccolor && vl.fcolor) + { + vl.map = ft_getmap(&vl, fd); + break ; + } + } + free(line); + } + close(fd); + free(line); + return (vl); +} diff --git a/src/parse/flood.c b/src/parse/flood.c new file mode 100644 index 0000000..4e643ce --- /dev/null +++ b/src/parse/flood.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* flood.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 14:13:07 by houtworm #+# #+# */ +/* Updated: 2023/11/10 10:51:00 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +int ft_floodvertical(t_varlist vl, char **fillmap, int x, int y) +{ + if (fillmap[y][x - 1] != '1') + { + fillmap[y][x - 1] = '1'; + if (ft_flood(vl, fillmap, x - 1, y)) + return (1); + } + if (x >= vl.mapsizex) + return (1); + if (fillmap[y][x + 1] != '1') + { + fillmap[y][x + 1] = '1'; + if (ft_flood(vl, fillmap, x + 1, y)) + return (1); + } + return (0); +} + +int ft_floodhorizontal(t_varlist vl, char **fillmap, int x, int y) +{ + if (y == 0) + return (1); + if (fillmap[y - 1][x] != '1') + { + fillmap[y - 1][x] = '1'; + if (ft_flood(vl, fillmap, x, y - 1)) + return (1); + } + if (y >= vl.mapsizey) + return (1); + if (fillmap[y + 1][x] != '1') + { + fillmap[y + 1][x] = '1'; + if (ft_flood(vl, fillmap, x, y + 1)) + return (1); + } + if (x == 0) + return (1); + return (0); +} + +int ft_flood(t_varlist vl, char **fillmap, int x, int y) +{ + if (ft_floodhorizontal(vl, fillmap, x, y)) + return (1); + if (ft_floodvertical(vl, fillmap, x, y)) + return (1); + return (0); +} + +int ft_floodfill(t_varlist vl) +{ + int y; + int x; + char **fillmap; + + fillmap = ft_calloc(1024, 8); + y = 0; + while (vl.map[y]) + { + fillmap[y] = ft_strdup(vl.map[y]); + y++; + } + y = (int)vl.posy; + x = (int)vl.posx; + fillmap[y][x] = '1'; + x = ft_flood(vl, fillmap, x, y); + ft_frearr(fillmap); + return (x); +} diff --git a/src/parse/parse.c b/src/parse/line.c similarity index 66% rename from src/parse/parse.c rename to src/parse/line.c index bf25a7d..270c00f 100644 --- a/src/parse/parse.c +++ b/src/parse/line.c @@ -1,12 +1,12 @@ /* ************************************************************************** */ /* */ /* :::::::: */ -/* parse.c :+: :+: */ +/* line.c :+: :+: */ /* +:+ */ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 16:48:55 by houtworm #+# #+# */ -/* Updated: 2023/11/05 08:19:52 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 09:14:29 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -20,13 +20,13 @@ int ft_settexture(t_varlist *vl, char *line, int direction) while (line[i] != '.') i++; if (direction == 1) - vl->walltext[0] = mlx_load_png(&line[i]); + vl->walltxt[0] = mlx_load_png(&line[i]); if (direction == 2) - vl->walltext[1] = mlx_load_png(&line[i]); + vl->walltxt[1] = mlx_load_png(&line[i]); if (direction == 3) - vl->walltext[2] = mlx_load_png(&line[i]); + vl->walltxt[2] = mlx_load_png(&line[i]); if (direction == 4) - vl->walltext[3] = mlx_load_png(&line[i]); + vl->walltxt[3] = mlx_load_png(&line[i]); return (0); } @@ -58,7 +58,7 @@ int ft_setcolor(t_varlist *vl, char *line, int dest) return (0); } -char *ft_checkline(t_varlist *vl, char *line) +char *ft_checklinecfn(t_varlist *vl, char *line) { if (line[0] == 'C' && line[1] == ' ') { @@ -76,7 +76,7 @@ char *ft_checkline(t_varlist *vl, char *line) } else if (!ft_strncmp(line, "NO ", 3)) { - if (!vl->walltext[0]) + if (!vl->walltxt[0]) ft_settexture(vl, line, 1); else return (" north texture"); @@ -84,25 +84,25 @@ char *ft_checkline(t_varlist *vl, char *line) return (NULL); } -char *ft_checkline2(t_varlist *vl, char *line) +char *ft_checklineesw(t_varlist *vl, char *line) { if (!ft_strncmp(line, "EA ", 3)) { - if (!vl->walltext[1]) + if (!vl->walltxt[1]) ft_settexture(vl, line, 2); else return (" east texture"); } else if (!ft_strncmp(line, "SO ", 3)) { - if (!vl->walltext[2]) + if (!vl->walltxt[2]) ft_settexture(vl, line, 3); else return (" south texture"); } else if (!ft_strncmp(line, "WE ", 3)) { - if (!vl->walltext[3]) + if (!vl->walltxt[3]) ft_settexture(vl, line, 4); else return (" west texture"); @@ -110,32 +110,13 @@ char *ft_checkline2(t_varlist *vl, char *line) return (NULL); } -t_varlist ft_parseconfigfile(t_varlist vl, char *filename) +void ft_checkline(t_varlist *vl, char *line) { - int fd; - char *line; char *error; - fd = open(filename, O_RDONLY); - if (fd == -1) - ft_errorexit("file does not exist", "parseconfigfile", 1); - while (get_next_line(fd, &line)) - { - error = ft_checkline(&vl, line); - if (!error) - error = ft_checkline2(&vl, line); - if (error) - ft_errorexit("Double config declaration in .cub file", error, 1); - if (vl.ccolor && vl.fcolor && vl.walltext[0] && vl.walltext[1] && vl.walltext[2] && vl.walltext[3]) - { - vl.map = ft_getmap(&vl, fd); - break ; - } - free(line); - } - close(fd); - free(line); - if (!vl.map) - ft_errorexit("The map is too big, 500x500 max\n", "", 1); - return (vl); + error = ft_checklinecfn(vl, line); + if (!error) + error = ft_checklineesw(vl, line); + if (error) + ft_errorexit(error, "Double config declaration in .cub file", 1); } diff --git a/src/parse/map.c b/src/parse/map.c index 429c456..90d48da 100644 --- a/src/parse/map.c +++ b/src/parse/map.c @@ -6,54 +6,46 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */ -/* Updated: 2023/11/05 19:05:34 by houtworm ######## odam.nl */ +/* Updated: 2023/11/10 11:08:41 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ #include "../../cub3d.h" -char ft_setplayerpos(t_varlist *vl, char dir, int x, int y) +int ft_getmapx(t_varlist *vl, char **map, int y, int fd) { - vl->posx = x + 0.5; - vl->posy = y + 0.5; - if (dir == 'N') + int ret; + int x; + char *line; + + ret = 1; + while (ret > 0) { - vl->dirx = -1; - vl->diry = 0; - vl->planex = 0; - vl->planey = 0.66; + ret = get_next_line(fd, &line); + if (line[0]) + break ; + free(line); } - else if (dir == 'E') + x = 0; + while (ret && x <= 1024 && line[x]) { - vl->dirx = 0; - vl->diry = 1; - vl->planex = 0.66; - vl->planey = 0; + if (x > 1000) + ft_errorexit("The map is too big, 1000x1000 max\n", "", 1); + map[y][x] = ft_checkmapelement(vl, line[x], x, y); + if (x > vl->mapsizex) + vl->mapsizex = x; + x++; } - else if (dir == 'S') - { - vl->dirx = 1; - vl->diry = 0; - vl->planex = 0; - vl->planey = -0.66; - } - else if (dir == 'W') - { - vl->dirx = 0; - vl->diry = -1; - vl->planex = -0.66; - vl->planey = 0; - } - return ('0'); + if (ret) + free(line); + return (ret); } char **ft_getmap(t_varlist *vl, int fd) { int y; - int x; int ret; char **map; - char *line; map = ft_calloc(1024, 8); y = 0; @@ -61,93 +53,12 @@ char **ft_getmap(t_varlist *vl, int fd) while (y <= 1024 && ret > 0) { if (y > 1000) - return (NULL); + ft_errorexit("The map is too big, 1000x1000 max\n", "", 1); map[y] = ft_calloc(1024, 8); - while (ret > 0) - { - ret = get_next_line(fd, &line); - if (line[0]) - break ; - free(line); - } + ret = ft_getmapx(vl, map, y, fd); if (ret == 0) - { - free(map[y]); return (map); - } - x = 0; - while (x <= 1024 && line[x]) - { - if (x > 1000) - return (NULL); - if (ft_strchr(" 0", line[x])) - map[y][x] = '0'; - else if (line[x] == '1') - map[y][x] = '1'; - else if (ft_strchr("NESW", line[x])) - map[y][x] = ft_setplayerpos(vl, line[x], y, x); - else if (line[x] == 'D') - map[y][x] = 'D'; - else if (line[x] == 'B') - map[y][x] = ft_addsoliddecor(vl, y, x, 0); - else if (line[x] == 'b') - map[y][x] = ft_addsoliddecor(vl, y, x, 1); - else if (line[x] == 'L') - map[y][x] = ft_addsoliddecor(vl, y, x, 2); - else if (line[x] == 'A') - map[y][x] = ft_addsoliddecor(vl, y, x, 3); - else if (line[x] == 'P') - map[y][x] = ft_addsoliddecor(vl, y, x, 4); - else if (line[x] == 'p') - map[y][x] = ft_addsoliddecor(vl, y, x, 5); - else if (line[x] == 'V') - map[y][x] = ft_addsoliddecor(vl, y, x, 6); - else if (line[x] == 'f') - map[y][x] = ft_addsoliddecor(vl, y, x, 7); - else if (line[x] == 'T') - map[y][x] = ft_addsoliddecor(vl, y, x, 8); - else if (line[x] == 's') - map[y][x] = ft_addsoliddecor(vl, y, x, 9); - else if (line[x] == 'l') - map[y][x] = ft_addwalktroughdecor(vl, y, x, 10); - else if (line[x] == 'C') - map[y][x] = ft_addwalktroughdecor(vl, y, x, 11); - else if (line[x] == '$') - map[y][x] = ft_addpickup(vl, y, x, 0); - else if (line[x] == '#') - map[y][x] = ft_addpickup(vl, y, x, 1); - else if (line[x] == '*') - map[y][x] = ft_addpickup(vl, y, x, 2); - else if (line[x] == '&') - map[y][x] = ft_addpickup(vl, y, x, 3); - else if (line[x] == '9') - map[y][x] = ft_addpickup(vl, y, x, 4); - else if (line[x] == '8') - map[y][x] = ft_addpickup(vl, y, x, 5); - else if (line[x] == '7') - map[y][x] = ft_addpickup(vl, y, x, 6); - else if (line[x] == '[') - map[y][x] = ft_addpickup(vl, y, x, 7); - else if (line[x] == ']') - map[y][x] = ft_addpickup(vl, y, x, 8); - else if (line[x] == '3') - map[y][x] = ft_addpickup(vl, y, x, 9); - else if (line[x] == '4') - map[y][x] = ft_addpickup(vl, y, x, 10); - else if (line[x] == '2') - map[y][x] = ft_addpickup(vl, y, x, 11); - else if (line[x] == 'K') - map[y][x] = ft_addenemy(vl, y, x, 0); - else - { - ft_putstr("Invalid character on the map\n Valid options are\n"); - ft_putstr("NESW Player\n' ' or 0 empty space\n1 wall\n"); - ft_putstr("D Door\nC Collectible\nB Barrel\nX Level end\n"); - ft_errorexit("K Enemy\nG groundlamp\nH Hanglamp", "", 1); - } - x++; - } - free(line); + vl->mapsizey = y; y++; } ft_errorexit("Something went wrong", "ft_getmap", 1); diff --git a/src/parse/player.c b/src/parse/player.c new file mode 100644 index 0000000..4d12e81 --- /dev/null +++ b/src/parse/player.c @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* :::::::: */ +/* player.c :+: :+: */ +/* +:+ */ +/* By: houtworm +#+ */ +/* +#+ */ +/* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */ +/* Updated: 2023/11/10 08:54:40 by houtworm ######## odam.nl */ +/* */ +/* ************************************************************************** */ + +#include "../../cub3d.h" + +void ft_northeast(t_varlist *vl, char dir) +{ + if (dir == 'N') + { + vl->dirx = -1; + vl->diry = 0; + vl->planex = 0; + vl->planey = 0.66; + } + else if (dir == 'E') + { + vl->dirx = 0; + vl->diry = 1; + vl->planex = 0.66; + vl->planey = 0; + } +} + +void ft_southwest(t_varlist *vl, char dir) +{ + if (dir == 'S') + { + vl->dirx = 1; + vl->diry = 0; + vl->planex = 0; + vl->planey = -0.66; + } + else if (dir == 'W') + { + vl->dirx = 0; + vl->diry = -1; + vl->planex = -0.66; + vl->planey = 0; + } +} + +char ft_initplayer(t_varlist *vl, char dir, int x, int y) +{ + vl->posx = x + 0.5; + vl->posy = y + 0.5; + if (dir == 'N' || dir == 'E') + ft_northeast(vl, dir); + if (dir == 'S' || dir == 'W') + ft_southwest(vl, dir); + return ('0'); +} diff --git a/src/parse/sprite.c b/src/parse/sprite.c index a0c6fb0..8eaa716 100644 --- a/src/parse/sprite.c +++ b/src/parse/sprite.c @@ -6,7 +6,7 @@ /* By: houtworm +#+ */ /* +#+ */ /* Created: 2023/10/26 17:33:50 by houtworm #+# #+# */ -/* Updated: 2023/11/05 18:50:53 by houtworm ######## odam.nl */ +/* Updated: 2023/11/07 05:54:19 by houtworm ######## odam.nl */ /* */ /* ************************************************************************** */ @@ -18,6 +18,7 @@ char ft_addwalktroughdecor(t_varlist *vl, int x, int y, int number) vl->sprite[vl->spritecount].y = y + 0.5; vl->sprite[vl->spritecount].number = number; vl->sprite[vl->spritecount].type = 1; + vl->sprite[vl->spritecount].status = 0; vl->spritecount++; return ('0'); } @@ -28,6 +29,7 @@ char ft_addsoliddecor(t_varlist *vl, int x, int y, int number) vl->sprite[vl->spritecount].y = y + 0.5; vl->sprite[vl->spritecount].number = number; vl->sprite[vl->spritecount].type = 1; + vl->sprite[vl->spritecount].status = 0; vl->spritecount++; return ('2'); } @@ -38,6 +40,7 @@ char ft_addpickup(t_varlist *vl, int x, int y, int number) vl->sprite[vl->spritecount].y = y + 0.5; vl->sprite[vl->spritecount].number = number; vl->sprite[vl->spritecount].type = 2; + vl->sprite[vl->spritecount].status = 0; if (number < 4) vl->tottreasure++; vl->spritecount++; @@ -50,7 +53,8 @@ char ft_addenemy(t_varlist *vl, int x, int y, int number) vl->sprite[vl->spritecount].y = y + 0.5; vl->sprite[vl->spritecount].number = number; vl->sprite[vl->spritecount].type = 3; + vl->sprite[vl->spritecount].status = 0; vl->enemies++; vl->spritecount++; - return ('2'); + return ('3'); } diff --git a/src/sprite/check.c b/src/sprite/check.c deleted file mode 100644 index c715419..0000000 --- a/src/sprite/check.c +++ /dev/null @@ -1,65 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* check.c :+: :+: */ -/* +:+ */ -/* By: houtworm +#+ */ -/* +#+ */ -/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ -/* Updated: 2023/11/05 21:27:51 by houtworm ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "../../cub3d.h" - -void ft_sortsprites(t_varlist *vl) -{ - int i; - t_sprite temp; - - i = 0; - while (vl->spritecount > i) - { - vl->sprite[i].distance = pow((vl->posx - vl->sprite[i].x), 2) + pow((vl->posy - vl->sprite[i].y), 2); - i++; - } - while (i) - { - if (vl->sprite[i].distance > vl->sprite[i - 1].distance) - { - temp = vl->sprite[i]; - vl->sprite[i] = vl->sprite[i - 1]; - vl->sprite[i - 1] = temp; - } - i--; - } -} - -mlx_texture_t *ft_getsprite(t_varlist *vl, int i) -{ - if (vl->sprite[i].type == 1) - return (vl->decotext[vl->sprite[i].number]); - if (vl->sprite[i].type == 2) - return (vl->picktext[vl->sprite[i].number]); - return (vl->nazitext[vl->sprite[i].number]); -} - -void ft_drawsprites(t_varlist *vl) -{ - int i; - int x; - t_draw *draw; - - ft_sortsprites(vl); - i = 0; - while (vl->spritecount > i) - { - draw = ft_initdrawsprite(vl, i); - ft_getdrawstartend(vl, draw); - x = draw->drawstartx; - vl->temptext = ft_getsprite(vl, i); - ft_drawsprite(vl, draw, x); - free(draw); - i++; - } -} diff --git a/src/sprite/draw.c b/src/sprite/draw.c deleted file mode 100644 index 9edc4ed..0000000 --- a/src/sprite/draw.c +++ /dev/null @@ -1,91 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* :::::::: */ -/* draw.c :+: :+: */ -/* +:+ */ -/* By: houtworm +#+ */ -/* +#+ */ -/* Created: 2023/10/26 16:54:20 by houtworm #+# #+# */ -/* Updated: 2023/11/05 11:04:09 by houtworm ######## odam.nl */ -/* */ -/* ************************************************************************** */ - -#include "../../cub3d.h" - -void ft_drawspriteline(t_varlist *vl, t_draw *draw, int y, int x) -{ - int d; - uint8_t *texel; - uint32_t color; - - d = (y - draw->vmovescreen) * 256 - vl->h * 128 + draw->spriteheight * 128; - draw->texy = (d * 64) / draw->spriteheight / 256; - if (draw->texy < 0) - draw->texy = 0; - if (draw->texy > 64) - draw->texy = 64; - if (draw->texx < 0) - draw->texx = 0; - if (draw->texx > 64) - draw->texx = 64; - texel = &vl->temptext->pixels[(vl->temptext->width * draw->texy + draw->texx) * 4]; - color = texel[0] << 24 | texel[1] << 16 | texel[2] << 8 | texel[3]; - if (color != 0x980088FF) - mlx_put_pixel(vl->img, x, y, color); -} - -void ft_drawsprite(t_varlist *vl, t_draw *draw, int x) -{ - int y; - - while (x < draw->drawendx) - { - draw->texx = (int)(256 * (x - (-draw->spritewidth / 2 + draw->spritescreen)) * 64 / draw->spritewidth) / 256; - if (draw->transformy > 0 && x > 0 && x < vl->w && draw->transformy < vl->distance[x] + 0.7) - { - y = draw->drawstarty; - while (y < draw->drawendy) - { - ft_drawspriteline(vl, draw, y, x); - y++; - } - } - x++; - } -} - -t_draw *ft_initdrawsprite(t_varlist *vl, int i) -{ - double spritex; - double spritey; - double invdet; - t_draw *draw; - - draw = ft_calloc(12, 8); - spritex = vl->sprite[i].x - vl->posx; - spritey = vl->sprite[i].y - vl->posy; - invdet = 1.0 / (vl->planex * vl->diry - vl->dirx * vl->planey); - draw->transformx = invdet * (vl->diry * spritex - vl->dirx * spritey); - draw->transformy = invdet * (-vl->planey * spritex + vl->planex * spritey); - draw->spritescreen = (vl->w / 2) * (1 + draw->transformx / draw->transformy); - draw->vmovescreen = vl->vaim + vl->jump / draw->transformy; - draw->spriteheight = fabs((vl->h / draw->transformy)); - return (draw); -} - -void ft_getdrawstartend(t_varlist *vl, t_draw *draw) -{ - draw->drawstarty = -draw->spriteheight / 2 + vl->h / 2 + draw->vmovescreen; - if (draw->drawstarty < 0) - draw->drawstarty = 0; - draw->drawendy = draw->spriteheight / 2 + vl->h / 2 + draw->vmovescreen; - if (draw->drawendy >= vl->h) - draw->drawendy = vl->h - 1; - draw->spritewidth = abs((int)(vl->h / draw->transformy)); - draw->drawstartx = -draw->spritewidth / 2 + draw->spritescreen; - if (draw->drawstartx < 0) - draw->drawstartx = 0; - draw->drawendx = draw->spritewidth / 2 + draw->spritescreen; - if (draw->drawendx >= vl->w) - draw->drawendx = vl->w - 1; -}