From c69cdeee40e900b10485a63f93cd11a346f242c4 Mon Sep 17 00:00:00 2001 From: Montagna Marco Date: Sun, 12 Jan 2020 08:02:48 +0100 Subject: [PATCH] Fixed AiPickupCollision; Fixed setup flags of many objects; Fixed item savegames; Refactored inventory; Added InitialseShootSwitch; --- Build/savegame.0 | Bin 30690 -> 18722 bytes Build/savegame.1 | Bin 23396 -> 24176 bytes Build/savegame.2 | Bin 17959 -> 27057 bytes Build/savegame.3 | Bin 23500 -> 20136 bytes Build/savegame.4 | Bin 23150 -> 26647 bytes Build/savegame.5 | Bin 23501 -> 31022 bytes TR5Main/Game/collide.cpp | 2 +- TR5Main/Game/collide.h | 2 +- TR5Main/Game/control.cpp | 2 + TR5Main/Game/inventory.cpp | 22 +-- TR5Main/Game/laramisc.cpp | 87 ++------- TR5Main/Game/pickup.cpp | 4 +- TR5Main/Game/savegame.cpp | 283 ++++++++++++++++++++++++---- TR5Main/Game/savegame.h | 15 ++ TR5Main/Game/switch.cpp | 7 + TR5Main/Game/switch.h | 1 + TR5Main/Global/constants.h | 5 - TR5Main/Global/objectslist.h | 6 + TR5Main/Global/types.h | 4 +- TR5Main/Renderer/Render11Helper.cpp | 32 ++-- TR5Main/Renderer/Renderer11Draw.cpp | 1 + TR5Main/Specific/setup.cpp | 114 ++++++++++- TR5Main/Specific/setup.h | 14 +- 23 files changed, 445 insertions(+), 156 deletions(-) diff --git a/Build/savegame.0 b/Build/savegame.0 index fab24a00010b6d2cf44392b7dab2fb1231a2f219..83ede7dc509af6b2d918f7f1ff3d47cfefbc400c 100644 GIT binary patch literal 18722 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 delta 3215 zcmdmZnQ?g!V|_@FsV@Tq0|PGu14Bqgs)BQVPJVH5YH2P51CuOsn=&&uNJVgZa7kiG z@uY?ZhEB$#j2)*1L3%)#g@Hi;qQX5fHx;C+w0Qo*1_p-udWLTd3|tVo;1ai-=7t6a z1_nk{kr)OBMl>M?1||#ZOeMKH9fVpyhzp-T-zml~!n=6dunGsiH<9K#@M3^lfx zA{e@CF|4;`W~@hzdj?yKNVH`|ccLvDh6p>dNJ~Ql!y(jU1rj=pDRh(pHT*%!E@CRX zi79j&n-GeZL1x{-RCNb6ao2;CJ;hY^44V*!`EM{)eZ?k(q46s$Lm7jzv0Dzv6<--p zvJ^xJB|1Pt-x(MtH;UFX9b}lyBo?jP)X>1d%D@B3(r!7GNtJG(OwD!>RScwzondmH zn1U-vn)4zbiWZQ;Tn$Z(7=qmBf*{>I7kMUs6jN{l>Edf>K-C4Zi67N+kU9Zu>I5fi zif<6K$27*x_37*1p{F!baxFz^&JFl;DeV325IVCd<9=r!qOU|7-5 zz+l44zz{G6A_gJP|A){Jvf(o$0|Ub?5CIWjz!U+M^9&3Oleas`bNv7R|G&7v-}jUA zox~X#CpS9Durf0+GB8iR?<8T=@Q-2tKL!SdhJOqUypTZiNi0eXOU+=chZXCdC8@b{ zz{Pq)15?-JgR!b?j0_D27%V3*bWz}GZ3Kl&Ljx0oQO#s~cX|Jgh6V;n$>R*C8Fp|& zs};|Zfc)bAh6aYaOPD{D&b!6LaQ;6d!y|+R9s!`Bp1}kyIy_6PG*2${P-SIfV0g(ed7+C6D?6OU z0cUZ-SzK@yH=M--W3liuFua4A&B_NBKIo>-1T|RzEC8}Y5Y7^Uu~>u|7-oW;!Xm=J z@OARRFpvY;8TW#P#26SBPA>G&nCz6P1adc{#N_@s6%dO>l7V3z*vbiREG$wC4Avk| zut+m7G=W7yo|Iu=I07~hq(qj1!E*9MPxZ-y?%)t%l%IUoTMZO8j0%&_dTTK%PUd%q z7_9_zNP`zUOgXy>Ch-4vW4?iSnL=WcEQ}kXb&=;XHR1T!vO}6 z8cTu6g>J%=1KmaH`&d3RAm@d?h6aZB2bddduHIr|XlSTou!X05kATL81_li{-z{fK zLj%LZKMahF3=Bw_o`Hc6l3zVbJo8FYb8?n|vgm7d28K6G&~kx+f#Jp$Q0|_*)?Jc& zZbJjZL9oN-fbuZwAqG&`9E??EI?OQnf1=7{g+Lb8BMb}-cP1-Fsj?o0NwXefU|?7Q z)^eNy6flhes;noVEX~PG-bx^ylP?6Yz}SqZCtnQEWI6*kmgy|Rk|eBhE8x4JY`^DI0|AhJ_E}g)X8jphO7(=31(A diff --git a/Build/savegame.3 b/Build/savegame.3 index f6eef81ac6796b6e2018a8b3861414064c7cf829..c8b91b5128b7540615f2594a51d2140f9dc6b87e 100644 GIT binary patch delta 3802 zcmX@JopHrnMvIUjQ(p!K1_l8J28NKL#H_?T^rfl41r11`ehsCPr?MqTux4 zlEjkY{)Pqy2Il`96CGq^mOX7?V5qNW_{YG&1ykad)7;R&z{oK1fKojxBO{u)00V{y zh8iIZHKLdz7`ntU)QC@(XHlLU!lI%k&4g~N5{7Ce#>t0Rlwu4qBup_x>@YQDHndxkNefrbXg$%jOY4M7}XbSHoWMX(8q9y~EwNmRWa#S)Ok5?I1b65RxlH>5DVA&n^{ zgDM2FK^Dn|dQjAWOp`-Z2NIIU6jHzxQbZL3S)ha#b|Ax)QI&y&R2VozCVPwaGBRww zDLRpvkzsST?o(c`G;JxBJb(e1_osY76_c2;h@MkZL*`I z3=9*T85ly`85pj3GcZ*6Gcec$GcfE4XJAN(W?(px#lT>b%fK*)pMl{? zAp=812?N8PG6n{QN>Eh;#|Pjn1_p+A_RI_n4EGojVwfU)5Xs4Qjw;Oi|GuB>=qNKe zz>yaTvrk^{$X?HUkC}mig+UnNIiJL$MAwRvqD0TUwESLh?F2HXzMg@BnUNWqD8f?{ z3-a?i!1)v;%K!^QgajiaLp?|eLkAN`lmVfm9&Q%MOCU)UEnN)_3@nTcFW6tOBWZ%` zVFhWxCc%bF0%QzG4rU9&eh!c@HnTW!NpRtk;Kn7v1C@Za0X$2%QgdfP0&>peMpso9 zMh1rElRrACvM@0)e3-m3RCMwJ7XcP#28PXGQ5Fb8gAuHVk!`YKxXR=MPAn|!3=EIK z25>Mi>;fre= z0#L?eCRZKCR=mP7J1)JigF`3y@jZq$~PXVS+aWbQ)2BQ*4H*0fa1B3G9hmQJ& z6L_F?gJ(%VesNzz1H-GstPM;JXP6io8tNI0pv@@H5|02-K7GMH+0n_6MFnazqw3`M zo*FD_uwYSVVE73N78Oh-df#C}{=s$P}Pj+%vW7UR9vFgBBjJmL(XVe2bQ-5+| zFvODv3=A8<+CedA2(^gC2+CkJW?(o7wvo|fvV*$@izx%cc5qOb!5HQ+h6Rja31e8n z7}hX`4V1xZ%fRp!Y%Yr(1H*c_1MC?XmQ4QWq&Rs(BnvC36hZI~G9b$xLg5`o;T=Kd zF&>?)5U$B~i~*dYF8XRtHi=ecI|1XWu$_c6Sx+%Q(gfIgrqc|Q<6SgZ&oD4B=uW=q ztHOA8a$~3}$Yo6D7$!4%s(_e`=O-rwYqDNoU|`q+clbpV-X#VGhKrLMT_L7kMrgeP zav9^*$s0m6S+6lLFf@UKp&(R%={m#Y!U&DY`vX`fC%J(2vEF20U|0k*h4mKLi;b?T zthX5$80;qtx~Q<;fwS&{Sr>g(Snn|~Fnom>%X*)If#DmB$M%4Mf#DYe$Y-n%85kHg z!JYqzfq`KSocEZ4fngn-_k@9gVIIr~)~5^%40B*Swr3Cn1%ovh5n=HHB`jWojfRE= z<11Kzvc86fyejJ(1_lOOu%q508_xQUfq|hBW){l7 z3PJ_gejy}&Bb&|k2PzS!!8i%#64rmnhBEz!rv}yrMo_3j4P|X)L`sTmO^jf>1zi+) z<~B4iG&3?ZG%$SyO$7-v9%p3X2B`^74=zb8DW1{Lz|hdp zps=j5LE-=Z|KB-5ilA5kqRu@rHx;C|wD`mS1_p-udWP2w3|tVo;1ai-=7t6a1_nlS z5k_D&!Z3#m!yGP5b67A;WL3@uw4+tWI+s*1u;w(#4uS9(_{>P39_O4RFEA*gabo_6GMax zLxdYcga<=}7ej;(LxdkgL;yoX5JN-=Lqr%|L>MESg)zce7$cm8F~V64!yGXTbHp&r z5yLP?0>c~$409wg)JS5ek;YIXjiE*sLyat^8VonfW9U-E5K+buQO6L`z!br-T?4~* z4U7=ez)0a57%5x>BZX^W*sg_PyEcXza|{tHOc4xotTEJBW2(XMsWpaAtucIRi(#@Y zipebv4GafR3wn^yL2N=88V@p{xCx>W#ZeF;6jwonP$B>#gc1WFp<|eiIL3hCh+~+J zIL3hCh+_;GjyT4E;fM>EHeSHA@dBoe7cgzSfNA3eY&K$e`vL<>*$N7Y3k)cQD?|vT zbcG0^6t55=l=2lKgi^plgiuOYh!9E<3lTyoVP4y#tWD>UdB{)9h(qF zJl?`obr+iuhQ_;?0eu(Kk9RTsco)-;cQFgTyO;&vT}F&n+I>u?-p34_`kLlEh zm}Wi1H0vRzSr0MIdV*=zD{Mj-q52wA)oV;gyunoU7Ml=;@ozC*|DKV7kq0s`<(5;K zR2kd^9-6`sVr0M&V!{++#uQ?~6keGH#D^)w zk17NTI{_?)38E?k8771&B#bHq3MY|+J*eRX(khCo4kRRoDJ0Io2}wxKDd2!)K;tu_ z@tM&0%xHWTG(IaDpAC)Aj>hM(Lv;@)nmiX8pBs(OgU07YzH2#ur87i=pw+!(ReTUJ{Kjg~pdg}`<=mNLV1@52=+(j3-hc0j*UEl$_z(aI_N9Y2N(FLBM3p_;^c!n@1G>ORbb(Lk0-w) z;0L&1zOMrTG0jC&;{BN z0*SexrVheg5I!R#tX%=&GokSj?HGtWq8$U_Bib<#KB651;Un5H5IzUIT!ruv?HC9j z(T;)e5$zZVAJLA1@OfeGb<2Ua_M!fP^5Oo6^5N|?C?D=WC?D=WC?D=WC?D=WC?D=W zC?D=WC?D=WC?D=WC?D=WC?D=WC?DQVgYx0+G${+G$V$L^};CfM};d1rY5tr~sm!1{FZG z)1U%~b{bRw(N2R3AlhkA0Yp0uDu8IGK?M-)G^hZgody*^w9}vhh;|xO0MSl^3Lx5P zPys|c4Jv?Wr$Ge}?KG$WqMZg6K(y1K0*H1RQ~=RVg9;$pX;1+~I}Iv;Xs1C15bZRm z0HU1+6+pDppaO_?8dLz$PJ;>{+G$V$L^};CfM};d1rY5tr~sm!1{FZG)1U%~b{bRw z(N2R3AlhkA0Yp0uDu8IGK?M-)G^hZgody*^w9}vhh;|xO0MSl^3Lx5PPys|c4Jv?W zr$Ge}?KG$WqMZg6K(y1K0v*T=7f`|0i7wEEF3^oG(1R|}i!RWIF3^uIFacd)BD%mN zbb-m}0#nchrlJc>Ll>BiE-(XKU?#f2EOdd{=mK-l1?Hj)%tIHLk1ntPU0@-)z#?>k z#pnV{&;^#F3oJtySdK2R0$pGwy1*)Qfz{{&YtRMOq6@4;7g&!jumN3QBf7vQbb-z2 z0$b1pwxSDcLl@YNF0cb#U?;l3E_8w2=mLAt1@@u~>_ZpWk1lWkUEm z&;^d73miiiIF2rG0$t!Fy1*%Pfz#*$XV3-Cq6?fu7dVeDZ~0! zLl^jtF7N|g;3vAkFLZ(5=mLMx1^%K7{6iA(MH!B9%K`Jz<&lOf!174L6<|Kna0Qr; zG+Y7ZBMn!8`AEYRU_R1t1(=UCTmj}I4Of8qNW&FiKGJXnn2$7E0p=qOSAh9Q!xdmY z(r^Wsk2G8X<|7SPfcZ$n6<|Kna0Qr;G+Y7ZBMn!8`AEYRU_R1t1(=UCTmj}I4Of8q zNW&FiKGJXnn2$7E0p=qOSAh9Q!xdmY(r^Wsk2G8X<|7SPfcZ$n6<|Kna0Qr;G+Y7Z zBMn!8`AEYRU_R1t1(=UCTmj}I4Of8qNW&FiKGJXnn2$7E0p=qOSAh9Q!xdmY(r^Ws zk2G8X<|7SPfcZ$n6<|Kna0Qr;G+Y7ZBMn!8`AEYRU_R1t1(=UCTmj}I4Of8qNW&Fi zKGJXnn2$7E0p=qOSAh9Q!xg@uRz31?1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW$io$20p#HdumJLK1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW$io$20p#HdumJLK1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW$io$20p#HdumJLK1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW$io$20p#HdumJLK1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW$io$20p#HdumJLK1y}%ixB@JIJX`@5Kpw6D3m^|yfCZ3;E5HKC z!xdlw(-@^A%M z0C~6qEPy;*0Tw_Wt^f-l4_AN%kcTV40?5M^U;*Ue3a|k3a0OTZdAI^BfIM6Q7C;`Z z01F@wSAYeOhbzDW{}|yL{e2RP5242XrV^Da9rDibJ!%kZ8EJ@96 zZUjX@Ljx1&dZf+$bZ1J~eiDO=FaeG4p0}~U&bB5bI(BmFFO9JwX`x+V; zKI~?0sGGNsiJ_sPp1~S=Y=dWsM*wI*Y7rA$z%6GIc=moPIh z@MAa#+36sKObiU$h*HSRz;KU=7!z3-7#0y_A}g^9*@#uhPOL%>28NkLxsj7tgz%HtcgMl43~*=qcE|)7GYqx zLzIc4#AXFC28MY=`C6QTVHQyeB^Vgy5#>fn28Jer3THMnFi0^lXcCiKr5PC77>Q9R zLu>+pu^D6z=S>F!fQge zoGA?r3=2TJ#6j&NP<2_yz`zJ<5Wv->=7LPqrJ8A=V9_HsGwU-jbP*LJ1`G^)2nGwt zYC~dj3MjoA5m`JKGcc?n%4QQ{6`C?IEF#L&W(*8Vh*D@yjHf}NV?nG!OJXC&ir9#; zW?1H&hRWz%fPfipy^JjlSnFo!5J4>1r^n1F0Q z%)r2~ilB!;DvuDY@+i?Nj}fi%I0FO23W5n3}+;p@T9C>s3=9mjiSp4^qE%jFU|{$~l#i|xt?~xZp>&ghfng0%KDtG; z%G(SK4BbSTc?V=BQKbzi&WTG)_dtFp%FO#jr}+mA#MCdK6!MVhIC{iDOjQIj^D)u+ z=n2tz^C>8lh>D|UMBDzH=y-p@Kulv9UtL(DqF z+`#m1ClkZPuZ;D`(-4gf4Gco?Q4=g9E1=O81_lN`*o1>;UP)?B&La3^1!&X-q=va? p-V7KU#0Sk(pts5=gVGvNwaOHtqkAeN1H)~iqI()6&e1B6g8|4WzS#f( diff --git a/Build/savegame.4 b/Build/savegame.4 index 80b557920463b2e34eaa299981a0fc17f79b4f51..d2b551b852b7768c7868a09e412c5cfde598c0c9 100644 GIT binary patch literal 26647 zcmWFuGWBI(U|`^5U|c* z!4Tm^7vaY6J2!^kxiS3Cjp28048L<@_?;WW@7x%E=f?0mH-_K2G5pSr;dgEfzjI^y zoew=UcrikQA5#P)eE2cKhaV$+_%XtVA0vGDF~Wx*BYgNV!iOIteE2cKhaV$+gfRRi ziYbEOQ&9|`iecyy#}JXk6u~fA62oLkj4+hM2t!GXFqFgyLrIJdM@7;cuwaI-w7n=#^D9wXl6G4h2xM!t~8$QSbb=s87R z07FC&LqrHeL>NOv1Vcm=LqrTiL>xmz0z*U+LqrNgL>gU02_xQ>FydVaBi@xT;#~FydVaBi@xT;#~FydVaBi@xT z;#~vxS6^f%kW}U#)cmh-72?i`0QM>~&3nermLMX)p zLoPY?S6ci94l#&7> zgi=&Mgiy)~h!9F)0TDteEg(WD#RWtNrM!R$p%fSpA(RpWB7{;^K!i~03WyL&WdRYA zL9Ra_Lb8}ba+pH$m_iDeLW-C|N|-{*m_jO;LaOLOCoxm>Nz4>|5;H}gWWY$#CmAqO z^hpMc6n&BbBSoKNz(~<288A}xNd}A*eG1d{r!Zar08`ZiY^pGF?L$nBPq7JM6dg}7 z!|N$#cs;{3>lvoIo?)8x4AZPvm}b4k6#9%!2*dTCF>U;gsqs6eQ@>-=h>=XbVD21X1U+c3>)!!)Z6)2udZW?>}qHb#s@-o}WL$lDk(68U6I zcTL80*JMn0O~!QBWJU~kO~!QBG)x<(VcIwi)5d9-HcrE|aT=zL(=lzFj%nizOjR>5 zRV~6)wFsLkj5M(rQ{!Sxjf*k8y%^Kmiy2wq!(gd}!R1ZhVKCUh7)*qb0bPU%LxdSa zgat!{m4OE`ZswL#nN;Zp8aZRQ$bljTasVT$GLR4xrVulx5DTghsPS7Obn>Ap0}1h?3W0PApm_|W zOb}HWNJt1%NElN{1XD;9Q%DR`NE}rN6uJ_PEp;d%337%csydL66sC|grjQJ#kSwN< z9Hx*wrjP=rkRqm#5~h$crjQDzkSeB-8m5psst_nDHP8|PC=@l(lO8C@v{3begtRe* zbTEZS0O7`l!l4<{MxN8KMe-3^T%Fm@%p{kYOgMLLi-{2Qdo(GgM_Do#qUj zkfOsm#SO$~K;tu_@tM&0%xHWTG(IaDpAC)Aj>hLe<8z|%xzPCBXnYmc3jW3SImq6o7qVc8B_|j;688p5u8ea~LFOSAoK;tW- z@s-f{%4mEQG`=btUk#0~j>gwO<7=Yvwb1z5XnY+szAhSH4~?&n#y3FY8=~=z(D=q^ zd=oUjDH`7ljgOxHEYRdF(fC$qd}}nm4I1ATjc

w@2cGij4!v1pr9kAiBUIbb-U@ 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 VMJ2&t2Ng7zzy%GCp;FN55CF7IIHdpp literal 23150 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 Gi4FkebZ5c< diff --git a/Build/savegame.5 b/Build/savegame.5 index 2153bd6a02c6a2c562f6415631a19b8b9ac93ccc..f11efcb2b5cb5a6d4c4f62c230c21df1717ebeb1 100644 GIT binary patch literal 31022 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 E0KjuMsQ>@~ literal 23501 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 Lj5vp@KyC&AKC{8> diff --git a/TR5Main/Game/collide.cpp b/TR5Main/Game/collide.cpp index 1cd8d15db..6128cd017 100644 --- a/TR5Main/Game/collide.cpp +++ b/TR5Main/Game/collide.cpp @@ -661,7 +661,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha return TRUE; } -void AIPickupCollision(short itemNumber) +void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c) { ITEM_INFO* item = &Items[itemNumber]; if (item->objectNumber == ID_SHOOT_SWITCH1 && !(item->meshBits & 1)) diff --git a/TR5Main/Game/collide.h b/TR5Main/Game/collide.h index 8dffa9872..c5e4103ce 100644 --- a/TR5Main/Game/collide.h +++ b/TR5Main/Game/collide.h @@ -20,7 +20,7 @@ short GetTiltType(FLOOR_INFO* floor, int x, int y, int z); int FindGridShift(int x, int z); int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius); int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO* coll); -void AIPickupCollision(short itemNumber); +void AIPickupCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c); void ObjectCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* c); void AlignLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l); void TriggerLaraBlood(); diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index e05c066ff..96a6727b6 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -568,6 +568,8 @@ GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame) Camera.target.y = LaraItem->pos.yPos; Camera.target.z = LaraItem->pos.zPos; + int x = Lara.weaponItem; + RequiredStartPos = false; InitialiseGame = false; g_GameFlow->SelectedSaveGame = 0; diff --git a/TR5Main/Game/inventory.cpp b/TR5Main/Game/inventory.cpp index 5749f736c..3b84842b0 100644 --- a/TR5Main/Game/inventory.cpp +++ b/TR5Main/Game/inventory.cpp @@ -269,7 +269,7 @@ void Inventory::LoadObjects(bool isReload) } } - g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true; + /*g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true; g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000; g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1; g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = true; @@ -296,8 +296,8 @@ void Inventory::LoadObjects(bool isReload) g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1; g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present = true; - g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000;*/ - } + g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000; + }*/ // Now fill the rings if (g_GameFlow->GetLevel(CurrentLevel)->LaraType != LARA_YOUNG) @@ -422,49 +422,49 @@ void Inventory::LoadObjects(bool isReload) InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROWBAR); int i; - for (i = 0; i < 8; i++) + for (i = 0; i < NUM_PUZZLES; i++) { if (g_LaraExtra.Puzzles[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1); } - for (i = 0; i < 16; i++) + for (i = 0; i < NUM_PUZZLES * 2; i++) { if (g_LaraExtra.PuzzlesCombo[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1_COMBO1); } - for (i = 0; i < 8; i++) + for (i = 0; i < NUM_KEYS; i++) { if (g_LaraExtra.Keys[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1); } - for (i = 0; i < 16; i++) + for (i = 0; i < NUM_KEYS * 2; i++) { if (g_LaraExtra.KeysCombo[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1_COMBO1); } - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_PICKUPS; i++) { if (g_LaraExtra.Pickups[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1); } - for (i = 0; i < 8; i++) + for (i = 0; i < NUM_PICKUPS * 2; i++) { if (g_LaraExtra.PickupsCombo[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1_COMBO1); } - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_EXAMINES; i++) { if (g_LaraExtra.Examines[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1); } - for (i = 0; i < 6; i++) + for (i = 0; i < NUM_EXAMINES * 2; i++) { if (g_LaraExtra.ExaminesCombo[i]) InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1_COMBO1); diff --git a/TR5Main/Game/laramisc.cpp b/TR5Main/Game/laramisc.cpp index bef33fecd..23c878db5 100644 --- a/TR5Main/Game/laramisc.cpp +++ b/TR5Main/Game/laramisc.cpp @@ -657,12 +657,13 @@ void InitialiseLara(int restore) else { memset(&Lara, 0, sizeof(LARA_INFO)); + ZeroMemory(&g_LaraExtra, sizeof(LaraExtraInfo)); + g_LaraExtra.ExtraAnim = -1; g_LaraExtra.Vehicle = NO_ITEM; - g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = Objects[ID_PISTOLS_ITEM].loaded; } - Lara.look = TRUE; + Lara.look = true; Lara.itemNumber = itemNumber; Lara.hitDirection = -1; Lara.air = 1800; @@ -676,43 +677,32 @@ void InitialiseLara(int restore) Lara.highestLocation = -1; Lara.ropePtr = -1; LaraItem->hitPoints = 1000; - - /* - TODO: scripting - for (i = 0; i < gfNumPickups; i++) - { - DEL_picked_up_object(convert_invobto_obj(gfPickups[i])); - } - - gfNumPickups = 0;*/ - Lara.gunStatus = LG_NO_ARMS; + Lara.skelebob = 0; short gun = WEAPON_NONE; - - if (LaraDrawType != LARA_YOUNG && Objects[ID_PISTOLS_ITEM].loaded) - gun = WEAPON_PISTOLS; - - //if ((gfLevelFlags & GF_LVOP_TRAIN) && Objects[HK_ITEM].loaded && (Lara.hk_type_carried & WTYPE_PRESENT)) - // gun = WEAPON_HK; + if (LaraDrawType != LARA_YOUNG) + { + if (Objects[ID_PISTOLS_ITEM].loaded) + gun = WEAPON_PISTOLS; + else if (Objects[ID_HK_ITEM].loaded) + gun = WEAPON_HK; + } Lara.lastGunType = Lara.gunType = Lara.requestGunType = gun; LaraInitialiseMeshes(); - Lara.skelebob = 0; - - if (Objects[ID_PISTOLS_ITEM].loaded) + if (gun == WEAPON_PISTOLS) { g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true; g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1; } - - // DEBUG LINES - //g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true; - //g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1; - //g_LaraExtra.Weapons[WEAPON_UZI].Present = true; - //g_LaraExtra.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] = -1; + else if (gun == WEAPON_HK) + { + g_LaraExtra.Weapons[WEAPON_HK].Present = true; + g_LaraExtra.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = 100; + } g_LaraExtra.Binoculars = true; @@ -729,51 +719,8 @@ void InitialiseLara(int restore) DashTimer = 120; - /*for (i = 0; i < gfNumTakeaways; i++) - { - NailInvItem(convert_invobto_obj(gfTakeaways[i])); - } - - gfNumTakeaways = 0;*/ - //weapons[WEAPON_REVOLVER].damage = gfCurrentLevel >= LVL5_BASE ? 15 : 6; - /*switch (gfCurrentLevel) - { - case 6u: - Lara.pickupitems &= 0xFFF7u; - - Lara.puzzleitems[0] = 10; - return; - case 5u: - Lara.pickupitems = 0; - Lara.pickupitemscombo = 0; - Lara.keyitems = 0; - Lara.keyitemscombo = 0; - Lara.puzzleitemscombo = 0; - - memset(Lara.puzzleitems, 0, 12); - return; - case 7u: - Lara.pickupitems = 0; - - Lara.puzzleitems[0] = 0; - return; - case 0xCu: - Lara.pickupitems &= 0xFFFEu; - - Lara.puzzleitems[2] = 0; - Lara.puzzleitems[3] = 0; - break; - case 0xEu: - Lara.pickupitems &= 0xFFFDu; - break; - default: - if (gfCurrentLevel < LVL5_THIRTEENTH_FLOOR || gfCurrentLevel > LVL5_RED_ALERT) - Lara.pickupitems &= 0xFFF7u; - return; - }*/ - Lara.bottle = 0; Lara.wetcloth = CLOTH_MISSING; } diff --git a/TR5Main/Game/pickup.cpp b/TR5Main/Game/pickup.cpp index 7b179d049..b592fff98 100644 --- a/TR5Main/Game/pickup.cpp +++ b/TR5Main/Game/pickup.cpp @@ -625,7 +625,7 @@ void PuzzleHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) } } - RemoveObjectFromInventory(item->objectNumber - 70, 1); + RemoveObjectFromInventory(item->objectNumber - (ID_PUZZLE_HOLE1 - ID_PUZZLE_ITEM1), 1); if (flag == 1) { @@ -722,7 +722,7 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) l->animNumber = ANIMATION_LARA_USE_KEYCARD; else { - RemoveObjectFromInventory(item->objectNumber - 62, 1); + RemoveObjectFromInventory(item->objectNumber - (ID_KEY_HOLE1 - ID_KEY_ITEM1), 1); l->animNumber = ANIMATION_LARA_USE_KEY; } l->currentAnimState = STATE_LARA_INSERT_KEY; diff --git a/TR5Main/Game/savegame.cpp b/TR5Main/Game/savegame.cpp index 487835065..5a3f13ac7 100644 --- a/TR5Main/Game/savegame.cpp +++ b/TR5Main/Game/savegame.cpp @@ -48,6 +48,17 @@ ChunkId* SaveGame::m_chunkItemQuadInfo; ChunkId* SaveGame::m_chunkBats; ChunkId* SaveGame::m_chunkRats; ChunkId* SaveGame::m_chunkSpiders; +ChunkId* SaveGame::m_chunkLaraExtraInfo; +ChunkId* SaveGame::m_chunkWeaponInfo; +ChunkId* SaveGame::m_chunkPuzzle; +ChunkId* SaveGame::m_chunkKey; +ChunkId* SaveGame::m_chunkPickup; +ChunkId* SaveGame::m_chunkExamine; +ChunkId* SaveGame::m_chunkPuzzleCombo; +ChunkId* SaveGame::m_chunkKeyCombo; +ChunkId* SaveGame::m_chunkPickupCombo; +ChunkId* SaveGame::m_chunkExamineCombo; +ChunkId* SaveGame::m_chunkWeaponItem; extern vector g_AudioTracks; extern byte SequenceUsed[6]; @@ -127,8 +138,6 @@ void SaveGame::saveItem(int itemNumber, int runtimeItem) } LEB128::Write(m_stream, item->objectNumber); - LEB128::Write(m_stream, item->speed); - LEB128::Write(m_stream, item->fallspeed); if (hasData) { @@ -146,8 +155,8 @@ void SaveGame::saveItem(int itemNumber, int runtimeItem) if (obj->saveFlags) m_writer->WriteChunkWithChildren(m_chunkItemFlags, &saveItemFlags, itemNumber, 0); - /*if (obj->saveMesh) - m_writer->WriteChunk(m_chunkItemMeshes, &saveItemMesh, itemNumber, 0);*/ + if (obj->saveMesh) + m_writer->WriteChunk(m_chunkItemMeshes, &saveItemMesh, itemNumber, 0); if (obj->intelligent && item->data != NULL) m_writer->WriteChunk(m_chunkItemIntelligentData, &saveItemIntelligentData, itemNumber, 0); @@ -203,24 +212,122 @@ void SaveGame::saveLara(int arg1, int arg2) for (int i = 0; i < 15; i++) lara.meshPtrs[i] = (short*)((char*)lara.meshPtrs[i] - (ptrdiff_t)MeshBase); - lara.leftArm.frameBase = (short*)((char *)lara.leftArm.frameBase - (ptrdiff_t)Objects[ID_PISTOLS_ANIM].frameBase); - lara.rightArm.frameBase = (short*)((char *)lara.rightArm.frameBase - (ptrdiff_t)Objects[ID_PISTOLS_ANIM].frameBase); + lara.leftArm.frameBase = (short*)((char *)lara.leftArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase); + lara.rightArm.frameBase = (short*)((char *)lara.rightArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase); lara.generalPtr = (char *)lara.generalPtr - (ptrdiff_t)MallocBuffer; m_stream->Write(reinterpret_cast(&lara), sizeof(Lara)); // Lara weapon data - ITEM_INFO* weaponItem = &Items[Lara.weaponItem]; + if (Lara.weaponItem != NO_ITEM) + m_writer->WriteChunk(m_chunkWeaponItem, &saveWeaponItem, Lara.weaponItem, 0); + + // Save Lara extra info + m_writer->WriteChunk(m_chunkLaraExtraInfo, &saveLaraExtraInfo, 0, 0); + + // Save carried weapons + for (int i = 0; i < NUM_WEAPONS; i++) + { + m_writer->WriteChunk(m_chunkWeaponInfo, &saveWeaponInfo, i, 0); + } + // Save carried puzzles, keys, pickups and examines + for (int i = 0; i < NUM_PUZZLES; i++) + { + if (g_LaraExtra.Puzzles[i] > 0) + m_writer->WriteChunk(m_chunkPuzzle, &savePuzzle, i, g_LaraExtra.Puzzles[i]); + } + + for (int i = 0; i < NUM_PUZZLES * 2; i++) + { + if (g_LaraExtra.PuzzlesCombo[i] > 0) + m_writer->WriteChunk(m_chunkPuzzleCombo, &savePuzzle, i, g_LaraExtra.PuzzlesCombo[i]); + } + + for (int i = 0; i < NUM_KEYS; i++) + { + if (g_LaraExtra.Keys[i] > 0) + m_writer->WriteChunk(m_chunkKey, &savePuzzle, i, g_LaraExtra.Keys[i]); + } + + for (int i = 0; i < NUM_KEYS * 2; i++) + { + if (g_LaraExtra.KeysCombo[i] > 0) + m_writer->WriteChunk(m_chunkKeyCombo, &savePuzzle, i, g_LaraExtra.KeysCombo[i]); + } + + for (int i = 0; i < NUM_PICKUPS; i++) + { + if (g_LaraExtra.Pickups[i] > 0) + m_writer->WriteChunk(m_chunkPickup, &savePuzzle, i, g_LaraExtra.Pickups[i]); + } + + for (int i = 0; i < NUM_PICKUPS * 2; i++) + { + if (g_LaraExtra.PickupsCombo[i] > 0) + m_writer->WriteChunk(m_chunkPickupCombo, &savePuzzle, i, g_LaraExtra.PickupsCombo[i]); + } + + for (int i = 0; i < NUM_EXAMINES; i++) + { + if (g_LaraExtra.Examines[i] > 0) + m_writer->WriteChunk(m_chunkExamine, &savePuzzle, i, g_LaraExtra.Examines[i]); + } + + for (int i = 0; i < NUM_EXAMINES * 2; i++) + { + if (g_LaraExtra.ExaminesCombo[i] > 0) + m_writer->WriteChunk(m_chunkExamineCombo, &savePuzzle, i, g_LaraExtra.ExaminesCombo[i]); + } +} + +void SaveGame::saveWeaponItem(int arg1, int arg2) +{ + ITEM_INFO* weaponItem = &Items[arg1]; + LEB128::Write(m_stream, weaponItem->objectNumber); LEB128::Write(m_stream, weaponItem->animNumber); LEB128::Write(m_stream, weaponItem->frameNumber); LEB128::Write(m_stream, weaponItem->currentAnimState); LEB128::Write(m_stream, weaponItem->goalAnimState); LEB128::Write(m_stream, weaponItem->requiredAnimState); +} - // Lara extra data - m_writer->WriteChunkInt(m_chunkVehicle, g_LaraExtra.Vehicle); +void SaveGame::saveLaraExtraInfo(int arg1, int arg2) +{ + LEB128::Write(m_stream, (g_LaraExtra.Binoculars ? 1 : 0)); + LEB128::Write(m_stream, (g_LaraExtra.Lasersight ? 1 : 0)); + LEB128::Write(m_stream, (g_LaraExtra.Crowbar ? 1 : 0)); + LEB128::Write(m_stream, (g_LaraExtra.Silencer ? 1 : 0)); + LEB128::Write(m_stream, (g_LaraExtra.Torch ? 1 : 0)); + LEB128::Write(m_stream, g_LaraExtra.Secrets); + LEB128::Write(m_stream, g_LaraExtra.ExtraAnim); + LEB128::Write(m_stream, g_LaraExtra.Vehicle); + LEB128::Write(m_stream, g_LaraExtra.mineL); + LEB128::Write(m_stream, g_LaraExtra.mineR); + LEB128::Write(m_stream, g_LaraExtra.NumFlares); + LEB128::Write(m_stream, g_LaraExtra.NumLargeMedipacks); + LEB128::Write(m_stream, g_LaraExtra.NumSmallMedipacks); +} + +void SaveGame::savePuzzle(int arg1, int arg2) +{ + LEB128::Write(m_stream, arg1); // ID + LEB128::Write(m_stream, arg2); // Quantity +} + +void SaveGame::saveWeaponInfo(int arg1, int arg2) +{ + CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[arg1]; + + LEB128::Write(m_stream, arg1); + LEB128::Write(m_stream, weapon->Present); + LEB128::Write(m_stream, weapon->SelectedAmmo); + LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO1]); + LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO2]); + LEB128::Write(m_stream, weapon->Ammo[WEAPON_AMMO3]); + LEB128::Write(m_stream, weapon->HasSilencer); + LEB128::Write(m_stream, weapon->HasLasersight); } void SaveGame::saveVariables() @@ -281,6 +388,17 @@ void SaveGame::Start() m_chunkBats = ChunkId::FromString("TR5MSgBats"); m_chunkRats = ChunkId::FromString("TR5MSgRats"); m_chunkSpiders = ChunkId::FromString("TR5MSgSpiders"); + m_chunkLaraExtraInfo = ChunkId::FromString("TR5MSgLaraExtraInfo"); + m_chunkWeaponInfo = ChunkId::FromString("TR5MSgWeapon"); + m_chunkPuzzle = ChunkId::FromString("TR5MSgPuzzle"); + m_chunkPuzzleCombo = ChunkId::FromString("TR5MSgPuzzleC"); + m_chunkKey = ChunkId::FromString("TR5MSgKey"); + m_chunkKeyCombo = ChunkId::FromString("TR5MSgKeyC"); + m_chunkPickup = ChunkId::FromString("TR5MSgPickup"); + m_chunkPickupCombo = ChunkId::FromString("TR5MSgPickupC"); + m_chunkExamine = ChunkId::FromString("TR5MSgExamine"); + m_chunkExamineCombo = ChunkId::FromString("TR5MSgExamineC"); + m_chunkWeaponItem = ChunkId::FromString("TR5MSgWeaponItem"); LastSaveGame = 0; } @@ -317,6 +435,8 @@ void SaveGame::End() delete m_chunkBats; delete m_chunkRats; delete m_chunkSpiders; + delete m_chunkLaraExtraInfo; + delete m_chunkWeaponInfo; } bool SaveGame::Save(char* fileName) @@ -380,15 +500,16 @@ bool SaveGame::readLara() for (int i = 0; i < 15; i++) { Lara.meshPtrs[i] = ADD_PTR(Lara.meshPtrs[i], short, MeshBase); - printf("MeshPtr: %d\n", Lara.meshPtrs[i]); + //printf("MeshPtr: %d\n", Lara.meshPtrs[i]); } - Lara.leftArm.frameBase = ADD_PTR(Lara.leftArm.frameBase, short, Objects[ID_PISTOLS_ANIM].frameBase); - Lara.rightArm.frameBase = ADD_PTR(Lara.rightArm.frameBase, short, Objects[ID_PISTOLS_ANIM].frameBase); + Lara.leftArm.frameBase = ADD_PTR(Lara.leftArm.frameBase, short, Objects[ID_LARA].frameBase); + Lara.rightArm.frameBase = ADD_PTR(Lara.rightArm.frameBase, short, Objects[ID_LARA].frameBase); Lara.target = NULL; Lara.spazEffect = NULL; Lara.generalPtr = ADD_PTR(Lara.generalPtr, char, MallocBuffer); + Lara.weaponItem = NO_ITEM; // Is Lara burning? if (Lara.burn) @@ -405,23 +526,6 @@ bool SaveGame::readLara() if (smokeFlag) Lara.burnSmoke = true; } - - // Lara weapon data - if (Lara.weaponItem) - { - short weaponItemNum = CreateItem(); - Lara.weaponItem = weaponItemNum; - - ITEM_INFO* weaponItem = &Items[Lara.weaponItem]; - - weaponItem->objectNumber = LEB128::ReadInt16(m_stream); - weaponItem->animNumber = LEB128::ReadInt16(m_stream); - weaponItem->frameNumber = LEB128::ReadInt16(m_stream); - weaponItem->currentAnimState = LEB128::ReadInt16(m_stream); - weaponItem->goalAnimState = LEB128::ReadInt16(m_stream); - weaponItem->requiredAnimState = LEB128::ReadInt16(m_stream); - weaponItem->roomNumber = 255; - } m_reader->ReadChunks(&readLaraChunks, 0); @@ -451,9 +555,6 @@ bool SaveGame::readItem() AddActiveItem(itemNumber); } - item->speed = LEB128::ReadInt16(m_stream); - item->fallspeed = LEB128::ReadInt16(m_stream); - if (itemKind == 0x2000) { KillItem(itemNumber); @@ -631,11 +732,102 @@ void SaveGame::saveStaticFlag(int arg1, int arg2) bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg) { - if (chunkId->EqualsTo(m_chunkVehicle)) + if (chunkId->EqualsTo(m_chunkLaraExtraInfo)) { - g_LaraExtra.Vehicle = m_reader->ReadChunkInt16(maxSize); + g_LaraExtra.Binoculars = LEB128::ReadByte(m_stream); + g_LaraExtra.Lasersight = LEB128::ReadByte(m_stream); + g_LaraExtra.Crowbar = LEB128::ReadByte(m_stream); + g_LaraExtra.Silencer = LEB128::ReadByte(m_stream); + g_LaraExtra.Torch = LEB128::ReadByte(m_stream); + g_LaraExtra.Secrets = LEB128::ReadInt32(m_stream); + g_LaraExtra.ExtraAnim = LEB128::ReadInt16(m_stream); + g_LaraExtra.Vehicle = LEB128::ReadInt16(m_stream); + g_LaraExtra.mineL = LEB128::ReadByte(m_stream); + g_LaraExtra.mineR = LEB128::ReadByte(m_stream); + g_LaraExtra.NumFlares = LEB128::ReadInt32(m_stream); + g_LaraExtra.NumLargeMedipacks = LEB128::ReadInt32(m_stream); + g_LaraExtra.NumSmallMedipacks = LEB128::ReadInt32(m_stream); + return true; } + else if (chunkId->EqualsTo(m_chunkWeaponInfo)) + { + int id = LEB128::ReadInt32(m_stream); + + CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[id]; + + weapon->Present = LEB128::ReadByte(m_stream); + weapon->SelectedAmmo = LEB128::ReadByte(m_stream); + weapon->Ammo[WEAPON_AMMO1] = LEB128::ReadInt16(m_stream); + weapon->Ammo[WEAPON_AMMO2] = LEB128::ReadInt16(m_stream); + weapon->Ammo[WEAPON_AMMO3] = LEB128::ReadInt16(m_stream); + weapon->HasSilencer = LEB128::ReadByte(m_stream); + weapon->HasLasersight = LEB128::ReadByte(m_stream); + } + else if (chunkId->EqualsTo(m_chunkPuzzle)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.Puzzles[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkPuzzleCombo)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.PuzzlesCombo[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkKey)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.Keys[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkKeyCombo)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.KeysCombo[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkPickup)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.Pickups[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkPickupCombo)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.PickupsCombo[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkExamine)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.Examines[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkExamineCombo)) + { + int id = LEB128::ReadInt32(m_stream); + int quantity = LEB128::ReadInt32(m_stream); + g_LaraExtra.ExaminesCombo[id] = quantity; + } + else if (chunkId->EqualsTo(m_chunkWeaponItem)) + { + short weaponItemNum = CreateItem(); + Lara.weaponItem = weaponItemNum; + + ITEM_INFO* weaponItem = &Items[Lara.weaponItem]; + + weaponItem->objectNumber = LEB128::ReadInt16(m_stream); + weaponItem->animNumber = LEB128::ReadInt16(m_stream); + weaponItem->frameNumber = LEB128::ReadInt16(m_stream); + weaponItem->currentAnimState = LEB128::ReadInt16(m_stream); + weaponItem->goalAnimState = LEB128::ReadInt16(m_stream); + weaponItem->requiredAnimState = LEB128::ReadInt16(m_stream); + weaponItem->roomNumber = 255; + } + return false; } @@ -777,6 +969,9 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) if (item->roomNumber != roomNumber) ItemNewRoom(itemNumber, roomNumber); + item->speed = LEB128::ReadInt16(m_stream); + item->fallspeed = LEB128::ReadInt16(m_stream); + return true; } else if (chunkId->EqualsTo(m_chunkItemHitPoints)) @@ -864,6 +1059,13 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber) return true; } + else if (chunkId->EqualsTo(m_chunkItemMeshes)) + { + item->meshBits = LEB128::ReadInt32(m_stream); + item->swapMeshFlags = LEB128::ReadInt32(m_stream); + + return true; + } return false; } @@ -993,12 +1195,16 @@ void SaveGame::saveItemPosition(int arg1, int arg2) LEB128::Write(m_stream, item->pos.yRot); LEB128::Write(m_stream, item->pos.zRot); LEB128::Write(m_stream, item->roomNumber); + LEB128::Write(m_stream, item->speed); + LEB128::Write(m_stream, item->fallspeed); } void SaveGame::saveItemMesh(int arg1, int arg2) { ITEM_INFO* item = &Items[arg1]; + LEB128::Write(m_stream, item->meshBits); + LEB128::Write(m_stream, item->swapMeshFlags); } void SaveGame::saveItemAnims(int arg1, int arg2) @@ -1327,8 +1533,7 @@ bool SaveGame::readBats() char* buffer = (char*)malloc(sizeof(BAT_STRUCT)); m_stream->Read(buffer, sizeof(BAT_STRUCT)); - BAT_STRUCT* b = reinterpret_cast(buffer); - memcpy(&bats, b, sizeof(BAT_STRUCT)); + memcpy(bats, buffer, sizeof(BAT_STRUCT)); free(buffer); return true; @@ -1342,8 +1547,7 @@ bool SaveGame::readRats() char* buffer = (char*)malloc(sizeof(RAT_STRUCT)); m_stream->Read(buffer, sizeof(RAT_STRUCT)); - RAT_STRUCT* r = reinterpret_cast(buffer); - memcpy(&rats, r, sizeof(RAT_STRUCT)); + memcpy(rats, buffer, sizeof(RAT_STRUCT)); free(buffer); return true; @@ -1357,8 +1561,7 @@ bool SaveGame::readSpiders() char* buffer = (char*)malloc(sizeof(SPIDER_STRUCT)); m_stream->Read(buffer, sizeof(SPIDER_STRUCT)); - SPIDER_STRUCT* s = reinterpret_cast(buffer); - memcpy(&spiders, s, sizeof(SPIDER_STRUCT)); + memcpy(spiders, buffer, sizeof(SPIDER_STRUCT)); free(buffer); return true; diff --git a/TR5Main/Game/savegame.h b/TR5Main/Game/savegame.h index f6da927f4..5449eb630 100644 --- a/TR5Main/Game/savegame.h +++ b/TR5Main/Game/savegame.h @@ -69,6 +69,17 @@ private: static ChunkId* m_chunkRats; static ChunkId* m_chunkSpiders; static ChunkId* m_chunkBats; + static ChunkId* m_chunkLaraExtraInfo; + static ChunkId* m_chunkWeaponInfo; + static ChunkId* m_chunkPuzzle; + static ChunkId* m_chunkKey; + static ChunkId* m_chunkPickup; + static ChunkId* m_chunkExamine; + static ChunkId* m_chunkPuzzleCombo; + static ChunkId* m_chunkKeyCombo; + static ChunkId* m_chunkPickupCombo; + static ChunkId* m_chunkExamineCombo; + static ChunkId* m_chunkWeaponItem; static void saveGameStatus(int arg1, int arg2); static void saveLara(int arg1, int arg2); @@ -99,6 +110,10 @@ private: static void saveRats(int arg1, int arg2); static void saveBats(int arg1, int arg2); static void saveSpiders(int arg1, int arg2); + static void saveLaraExtraInfo(int arg1, int arg2); + static void savePuzzle(int arg1, int arg2); + static void saveWeaponInfo(int arg1, int arg2); + static void saveWeaponItem(int arg1, int arg2); static bool readGameStatus(); static bool readLara(); diff --git a/TR5Main/Game/switch.cpp b/TR5Main/Game/switch.cpp index 5d1663b63..40f139f84 100644 --- a/TR5Main/Game/switch.cpp +++ b/TR5Main/Game/switch.cpp @@ -1375,6 +1375,13 @@ void InitialiseSwitch(short itemNumber) } } +void InitialiseShootSwitch(short itemNumber) +{ + ITEM_INFO* item = &Items[itemNumber]; + if (item->triggerFlags == 444) + item->meshBits &= ~(1 << (Objects[item->objectNumber].nmeshes - 2)); +} + void InitialisePulleySwitch(short itemNumber) { ITEM_INFO* item = &Items[itemNumber]; diff --git a/TR5Main/Game/switch.h b/TR5Main/Game/switch.h index f866a164d..64a52efe7 100644 --- a/TR5Main/Game/switch.h +++ b/TR5Main/Game/switch.h @@ -31,6 +31,7 @@ void InitialiseSwitch(short itemNum); void InitialisePulleySwitch(short itemNumber); void InitialiseCrowDoveSwitch(short itemNumber); void ProcessExplodingSwitchType8(ITEM_INFO* item); +void InitialiseShootSwitch(short itemNumber); extern int PulleyItemNumber; diff --git a/TR5Main/Global/constants.h b/TR5Main/Global/constants.h index e441cc49e..9c8359f22 100644 --- a/TR5Main/Global/constants.h +++ b/TR5Main/Global/constants.h @@ -187,8 +187,3 @@ constexpr auto MAX_SPLASH = 8; #define BAD_JUMP_CEILING ((STEP_SIZE*3)/4) #define LARA_RAD 100 #define LARA_VELOCITY 12 - -#define NUM_PUZZLES 8 -#define NUM_KEYS 8 -#define NUM_PICKUPS 4 -#define NUM_EXAMINES 3 diff --git a/TR5Main/Global/objectslist.h b/TR5Main/Global/objectslist.h index 0f15fecb2..0528ee823 100644 --- a/TR5Main/Global/objectslist.h +++ b/TR5Main/Global/objectslist.h @@ -601,6 +601,12 @@ typedef enum GAME_OBJECT_ID ID_NUMBER_OBJECTS }; + +#define NUM_PUZZLES (ID_PUZZLE_ITEM8 - ID_PUZZLE_ITEM1 + 1) +#define NUM_KEYS (ID_KEY_ITEM8 - ID_KEY_ITEM1 + 1) +#define NUM_PICKUPS (ID_PICKUP_ITEM4 - ID_PICKUP_ITEM1 + 1) +#define NUM_EXAMINES (ID_EXAMINE3 - ID_EXAMINE1 + 1) + #else typedef enum GAME_OBJECT_ID { diff --git a/TR5Main/Global/types.h b/TR5Main/Global/types.h index 35a8474ec..a7fb2954f 100644 --- a/TR5Main/Global/types.h +++ b/TR5Main/Global/types.h @@ -241,9 +241,9 @@ typedef struct item_info_t { unsigned int aiBits : 5; // offset=133.1 unsigned int reallyActive : 1; // offset=133.6 unsigned int InDrawRoom : 1; // offset=133.7 - int swapMeshFlags; + int swapMeshFlags;// OFF=5614 short drawRoom; - short TOSSPAD; // OFF=5614 + short TOSSPAD; } ITEM_INFO; typedef struct creature_info_t diff --git a/TR5Main/Renderer/Render11Helper.cpp b/TR5Main/Renderer/Render11Helper.cpp index 7b0b784a7..b92f474d6 100644 --- a/TR5Main/Renderer/Render11Helper.cpp +++ b/TR5Main/Renderer/Render11Helper.cpp @@ -856,24 +856,28 @@ void Renderer11::getVisibleRooms(int from, int to, Vector4* viewPort, bool water collectEffects(node->To); Vector4 clipPort; - short numDoors = *(room->door); - if (numDoors) + + if (room->door != NULL) { - short* door = room->door + 1; - for (int i = 0; i < numDoors; i++) { - short adjoiningRoom = *(door); + short numDoors = *(room->door); + if (numDoors) + { + short* door = room->door + 1; + for (int i = 0; i < numDoors; i++) { + short adjoiningRoom = *(door); - if (node->From != adjoiningRoom && checkPortal(node->To, door, viewPort, &node->ClipPort)) - { - RendererRoomNode* childNode = &nodes[nextNode++]; - childNode->From = node->To; - childNode->To = adjoiningRoom; + if (node->From != adjoiningRoom && checkPortal(node->To, door, viewPort, &node->ClipPort)) + { + RendererRoomNode* childNode = &nodes[nextNode++]; + childNode->From = node->To; + childNode->To = adjoiningRoom; - // Push - stack[stackDepth++] = childNode; + // Push + stack[stackDepth++] = childNode; + } + + door += 16; } - - door += 16; } } } diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index ff1aa5806..3341abfbc 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -2055,6 +2055,7 @@ bool Renderer11::drawScene(bool dump) printDebugMessage("Lara.currentAnimState: %d", LaraItem->currentAnimState); printDebugMessage("Lara.requiredAnimState: %d", LaraItem->requiredAnimState); printDebugMessage("Lara.goalAnimState: %d", LaraItem->goalAnimState); + printDebugMessage("Lara.weaponItem: %d", Lara.weaponItem); printDebugMessage("Room: %d %d %d %d", r->x, r->z, r->x + r->xSize * WALL_SIZE, r->z + r->ySize * WALL_SIZE); printDebugMessage("Camera.pos: %d %d %d", Camera.pos.x, Camera.pos.y, Camera.pos.z); printDebugMessage("Camera.target: %d %d %d", Camera.target.x, Camera.target.y, Camera.target.z); diff --git a/TR5Main/Specific/setup.cpp b/TR5Main/Specific/setup.cpp index f7e7c7dd6..bd8df0adb 100644 --- a/TR5Main/Specific/setup.cpp +++ b/TR5Main/Specific/setup.cpp @@ -2182,6 +2182,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE2]; if (obj->loaded) @@ -2189,6 +2192,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE3]; if (obj->loaded) @@ -2196,6 +2202,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE4]; if (obj->loaded) @@ -2203,6 +2212,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE5]; if (obj->loaded) @@ -2210,6 +2222,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE6]; if (obj->loaded) @@ -2217,6 +2232,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE7]; if (obj->loaded) @@ -2224,6 +2242,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_DOOR_TYPE8]; if (obj->loaded) @@ -2231,6 +2252,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR1]; if (obj->loaded) @@ -2238,6 +2262,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR1]; if (obj->loaded) @@ -2245,6 +2272,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR2]; if (obj->loaded) @@ -2252,6 +2282,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR3]; if (obj->loaded) @@ -2259,6 +2292,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR4]; if (obj->loaded) @@ -2266,6 +2302,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR5]; if (obj->loaded) @@ -2273,6 +2312,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } obj = &Objects[ID_CLOSED_DOOR6]; if (obj->loaded) @@ -2280,6 +2322,9 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->collision = DoorCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } } @@ -2289,6 +2334,7 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->drawRoutine = Legacy_DrawLiftDoor; + obj->saveFlags = true; } obj = &Objects[ID_LIFT_DOORS2]; @@ -2297,6 +2343,7 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->control = DoorControl; obj->drawRoutine = Legacy_DrawLiftDoor; + obj->saveFlags = true; } obj = &Objects[ID_SEQUENCE_DOOR1]; @@ -2305,6 +2352,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = DoorCollision; obj->control = SequenceDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_DOUBLE_DOORS]; @@ -2313,6 +2362,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = DoubleDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_UNDERWATER_DOOR]; @@ -2321,6 +2372,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = UnderwaterDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } { @@ -2330,6 +2383,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = PushPullKickDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_PUSHPULL_DOOR2]; if (obj->loaded) @@ -2337,6 +2392,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = PushPullKickDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_KICK_DOOR1]; if (obj->loaded) @@ -2344,6 +2401,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = PushPullKickDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_KICK_DOOR2]; if (obj->loaded) @@ -2351,6 +2410,8 @@ void ObjectObjects() obj->initialise = InitialiseDoor; obj->collision = PushPullKickDoorCollision; obj->control = PushPullKickDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } } @@ -2361,6 +2422,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = FloorTrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_FLOOR_TRAPDOOR2]; if (obj->loaded) @@ -2368,6 +2431,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = FloorTrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_CEILING_TRAPDOOR1]; if (obj->loaded) @@ -2375,6 +2440,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = CeilingTrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_CEILING_TRAPDOOR2]; if (obj->loaded) @@ -2382,6 +2449,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = CeilingTrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_TRAPDOOR1]; if (obj->loaded) @@ -2389,6 +2458,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_TRAPDOOR2]; if (obj->loaded) @@ -2396,6 +2467,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } obj = &Objects[ID_TRAPDOOR3]; if (obj->loaded) @@ -2403,6 +2476,8 @@ void ObjectObjects() obj->initialise = InitialiseTrapDoor; obj->collision = TrapDoorCollision; obj->control = TrapDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; } } @@ -2600,6 +2675,7 @@ void ObjectObjects() obj->initialise = InitialiseTightRope; obj->collision = TightRopeCollision; obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_PARALLEL_BARS]; @@ -2614,6 +2690,10 @@ void ObjectObjects() obj->initialise = InitialiseSteelDoor; obj->collision = SteelDoorCollision; obj->control = Legacy_SteelDoorControl; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; + obj->savePosition = true; } /* @@ -2634,6 +2714,7 @@ void ObjectObjects() obj->initialise = InitialiseXRayMachine; obj->control = ControlXRayMachine; obj->drawRoutine = NULL; + obj->saveFlags = true; } // by default loaded, explosion time :D @@ -2645,6 +2726,7 @@ void ObjectObjects() if (obj->loaded) { obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_HIGH_OBJECT2]; @@ -2659,7 +2741,7 @@ void ObjectObjects() { obj->initialise = InitialiseRaisingBlock; obj->control = ControlRaisingBlock; - //obj->drawRoutine = DrawScaledSpike; + obj->saveFlags = true; } obj = &Objects[ID_RAISING_BLOCK2]; @@ -2667,7 +2749,7 @@ void ObjectObjects() { obj->initialise = InitialiseRaisingBlock; obj->control = ControlRaisingBlock; - //obj->drawRoutine = DrawScaledSpike; + obj->saveFlags = true; } obj = &Objects[ID_SMOKE_EMITTER_BLACK]; @@ -2676,6 +2758,7 @@ void ObjectObjects() obj->initialise = InitialiseSmokeEmitter; obj->control = SmokeEmitterControl; obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_SMOKE_EMITTER_WHITE]; @@ -2684,6 +2767,7 @@ void ObjectObjects() obj->initialise = InitialiseSmokeEmitter; obj->control = SmokeEmitterControl; obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_SMOKE_EMITTER]; @@ -2692,12 +2776,14 @@ void ObjectObjects() obj->initialise = InitialiseSmokeEmitter; obj->control = SmokeEmitterControl; obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_LENS_FLARE]; if (obj->loaded) { obj->drawRoutine = DrawLensFlare; + obj->saveFlags = true; } obj = &Objects[ID_BUBBLES]; @@ -2713,48 +2799,64 @@ void ObjectObjects() { obj->control = ControlWaterfallMist; obj->drawRoutine = NULL; + obj->saveFlags = true; } obj = &Objects[ID_WATERFALL1]; if (obj->loaded) { obj->control = ControlWaterfall; + obj->saveFlags = true; } obj = &Objects[ID_WATERFALL2]; if (obj->loaded) { obj->control = ControlWaterfall; + obj->saveFlags = true; } obj = &Objects[ID_WATERFALL3]; if (obj->loaded) { obj->control = ControlWaterfall; + obj->saveFlags = true; } obj = &Objects[ID_WATERFALLSS1]; if (obj->loaded) { obj->control = ControlWaterfall; + obj->saveFlags = true; } obj = &Objects[ID_WATERFALLSS2]; if (obj->loaded) { obj->control = ControlWaterfall; + obj->saveFlags = true; } - obj = &Objects[ID_SHOOT_SWITCH1]; /* @FIXME This setup can be wrong */ + obj = &Objects[ID_SHOOT_SWITCH1]; if (obj->loaded) { - obj->collision = ObjectCollision; + obj->initialise = InitialiseShootSwitch; + obj->control = AnimatingControl; + obj->collision = AIPickupCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } - obj = &Objects[ID_SHOOT_SWITCH2]; /* @FIXME This setup can be wrong */ + obj = &Objects[ID_SHOOT_SWITCH2]; if (obj->loaded) { - obj->collision = ObjectCollision; + obj->initialise = InitialiseShootSwitch; + obj->control = AnimatingControl; + obj->collision = AIPickupCollision; + obj->saveAnim = true; + obj->saveFlags = true; + obj->saveMesh = true; } } diff --git a/TR5Main/Specific/setup.h b/TR5Main/Specific/setup.h index b6e18f3b4..8dd2fb56b 100644 --- a/TR5Main/Specific/setup.h +++ b/TR5Main/Specific/setup.h @@ -27,6 +27,7 @@ obj = &Objects[obid]; \ if (obj->loaded) \ { \ obj->collision = KeyHoleCollision; \ + obj->saveFlags = true; \ } #define INIT_PUZZLEHOLE(obid) \ @@ -35,6 +36,8 @@ if (obj->loaded) \ { \ obj->collision = PuzzleHoleCollision; \ obj->control = AnimatingControl; \ + obj->saveFlags = true; \ + obj->saveAnim = true; \ } #define INIT_PUZZLEDONE(obid) \ @@ -43,12 +46,10 @@ if (obj->loaded) \ { \ obj->collision = PuzzleDoneCollision; \ obj->control = AnimatingControl; \ + obj->saveFlags = true; \ + obj->saveAnim = true; \ } -// normally INIT_ANIMATING have: -//Bones[obj->boneIndex] |= ROT_Y; -//Bones[obj->boneIndex + 4] |= ROT_X; - #define INIT_ANIMATING(obid) \ obj = &Objects[obid]; \ if (obj->loaded) \ @@ -56,4 +57,9 @@ if (obj->loaded) \ obj->initialise = InitialiseAnimating; \ obj->control = AnimatingControl; \ obj->collision = ObjectCollision; \ + obj->saveFlags = true; \ + obj->saveAnim = true; \ + obj->saveMesh = true; \ + Bones[obj->boneIndex] |= ROT_Y; \ + Bones[obj->boneIndex + 4] |= ROT_X; \ } \ No newline at end of file