From aad739532432ba92bcc3b3863f528811ff90d169 Mon Sep 17 00:00:00 2001 From: hazelnot Date: Sun, 18 Oct 2020 19:47:09 +0300 Subject: [PATCH 01/46] Added icons --- src/skel/glfw/re3_logo.png | Bin 0 -> 27059 bytes src/skel/glfw/re3_logo.svg | 94 +++++++++++++++++++++++++++++++++ src/skel/glfw/re3_logo_red.png | Bin 0 -> 25459 bytes src/skel/glfw/re3_logo_red.svg | 93 ++++++++++++++++++++++++++++++++ src/skel/win/gta3.ico | Bin 2238 -> 174425 bytes 5 files changed, 187 insertions(+) create mode 100644 src/skel/glfw/re3_logo.png create mode 100644 src/skel/glfw/re3_logo.svg create mode 100644 src/skel/glfw/re3_logo_red.png create mode 100644 src/skel/glfw/re3_logo_red.svg diff --git a/src/skel/glfw/re3_logo.png b/src/skel/glfw/re3_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fb82cd9d59bc8c399144897948fe9f44b5cb569b GIT binary patch literal 27059 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 + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/skel/glfw/re3_logo_red.png b/src/skel/glfw/re3_logo_red.png new file mode 100644 index 0000000000000000000000000000000000000000..3d24fe7d5cb4ae28cf249eb1f90bcb30a5f2398b GIT binary patch literal 25459 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 adS@B3R3@iiiy&daFk&P9U*#Ku5B&$>v4Ii* literal 0 HcmV?d00001 diff --git a/src/skel/glfw/re3_logo_red.svg b/src/skel/glfw/re3_logo_red.svg new file mode 100644 index 00000000..02c8463f --- /dev/null +++ b/src/skel/glfw/re3_logo_red.svg @@ -0,0 +1,93 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/skel/win/gta3.ico b/src/skel/win/gta3.ico index 2017c8116bb76bf612babe81eb013c2c0250dbc2..dae70c373fb2d565608677d74f60ea9d19f00281 100644 GIT binary patch literal 174425 zcmeHQ2V73wAAed(%P2}TWF(R(Bx#UMAtY&1S(QDL;uq%JC6Ttr6`QFmpLXoW~5($`PD z9$!=>(pC|POiWU*SJ88Gv_+ySRnnd}5Q!X&MItM!wBIYy`}IU3C#TfwDh)*e8i)$ji$s9UdMYqKXwOW*22e0|SEwwQJYzZEI^A zA`ZG2R=RX)Vw5P7aE%)`7DYux;chuPUcYkX3cG&&I)`i5u5rh6=gzT?9XqaKjEQ^} zY!h|;XP>CHN1&*Px`v4SZQGX|)QMiUY}p5ThV9+Em#tm9mc_=#vYk73vQ?{A zvD$TQ&*_=h{L9$dej=c6W;sYjwWx`+v-7<8_;_~UzyY>q%^JMUCQh8laPP^JC+yj? zXYAV5E38e|Ud;3F^^C$NY-MgybD3V{>SLNWZ$9Vo zHe<#N_V(>t_VD3D4qxbA=kB4bLC_H9+$)^h*L4J^#<3>Qb?pQvovvXu8sF64r);_B+^Atoj!3#eURlm()xzD*|oOUWCCp`oFO z-swAb>{#~SfB&)b=g-Ro+U_=O+B_k@D`e%rqM{-yqdGwYM+##x{1ta-Tfcw*o&jIK zeq~*|cD+yUR3@mUy$?SCweocw>A*Rc3Kc5scXV_-Y;SLWsA|=!k9q%JzI@60_U+3C z4jjnFj~|}_g9i_0#NFGXC3Lr!sZ!%0wYi50hj1)ap~_zR28ELE2-j=Om@(g9y?Vu- zK7GnULqoZ52;zVD?p<)ezy-c1_#MFcrHdC?gN81w$$;_9chL^!yKs9ty3F0gsy1$$ zM1E7RMC3Vh=FHDLAA<%B;{3yPVqzle*RLM~7jQU&C*F1MH;{EEzj|&s&AP8S#=89* z$AanDWBo~1-@or?^1HLR|KNGRfB~8O$F~Iz-_=p0MzO71x3Y~JH?StH+?btzKi0VK zU(C)gjM;kiWWlSCvL5SBNcA6n;Jb+L4&03!H#oj{|L@(q$N9Z|`*!Z=(yRrm+O$2h z>DY}~yZf^y{l{|tcVBy)*>>smiQ?WtJpP=gV*l`c^7Hd!U%q@1yZhrbuy+{iFl{Br z4dTrsXyqYh(X9Pj^1F$+|KMlo(xvS7?c1CuH*el#VPRp6kN;8n-p9qoalauSy7>At z<2p{v+{KMmc5Keem1k98**cn46P>ihNi0>24fR9C)Vx^yX1Tk!Yaf2UYmTPLBsT)1!{{db(BELmCG zysPKehqa%$G#wo#En{u|n$IfKYxI!(u0yD+qoXsQ>Trg(tbFgtY_ zZ0AaqDm8(AYpkNC-e0R!nT6VV28+@Vtx-bvZv_Q~7WBIkL1sH#sS*tm$hBzEBGWVO z?(STtR$H&EXoo~w?hrIsq*Nq_A9gMz;a`3;K;=3;?~+80qC`R*AumqcPxQk~2u=iy z135%WU_cHA6zLiC+q4Lp@`BoMlKAA=St~0m$Iv(Ah@PI_al$cqKz;1v z6msi4hOSHBsbf>7Okt-_pXT~q7)NIZ$S6ELJ!$kP>XygwYdJYNz4`Eg6Q4-y0?53F zelvv~AaD58&&LPRj9`%lb2@e=InX=t@X?n-zx?_0=jr`rzTeCr@q2J^Fv9OiFii80 z_m@ASX)ZzFT_p_-jq@avdTD28_q=}n`p>IWsq&h_Px<)qV|qFvLn2uOYu2n83kV2c z-MV$dID-SuagX`~jLJ)jf}+y(5{BgyNgniE5;R75s-{&8Wu$3Z1k7vHsPO=OM#y}U zlam?xxvg8bX5#5zy?QklKIA_bQ%D2GFLmqGVP*|mGmI7dV|HZ%WHl~fQLLzT@naOe z4#Aw{E%(7I??_gYDSXJxkk0H}81+k?L!)Rcaf%yLU|hlV59!FCV_c(SQVC-;ANA^#=Qf04$DkS#7=yqH5wObnxP%XCbuu!?pr=qq!; z7{deO8T8XBAAA?3r(Y`n;(X#9m{G5#7yveMOLy?b{iUjJ9DSiu4V1NmUM0OL}}UL#Uv3sl}w z=DIH1#{yRzN-YmaKNo(+^rP+0%AuT-JU6RHxZlwJ*Y7qcE&SARDe4_p_9-qHuR>m5 z($MrS&-Ea*P*qi3O>-PaCHf@C zaZgQ6Z5=(+4$so~c4yIIC67tqIDLB#QU7Q*Jp=ieh`zt_^s!Wxl(-==Ucrf`3~&N; z@*mIPyDs@0`f-ry2~J=@V1O8q)}Vb7DX=6l-UnG(>qLfTL``u%I_kR>A@90VzwD&8w)XuJB}zQX4T=^m`i%UE zCZu-;^C_C`NpIsL#?zQ9gUkzKu$%z>@18w-LiV$<0OGfpbXcT)K67+$+_-UwANu|I z&EIOwzvk76#gC$xV~4&!WLl8@`H2D7r=-OX^WexgjHj~8YsfZx_38!wwi9d#m}B&l zfi864i6E|7hjGU~nlEIeqr_;=p99JJSg~ToxcO^I{xFs&*&w6&K1MoatW~R4Qqi<& zQ$}M*M&mEU?+uNyUeTC8MZbzAlLnFprD*7seoxPCCKwaoxcEU=3*&x_zX8ZWNGFSp z963@ldYnAO%*>3dGra5&@a$iOW^g)V7?*clwpRlCSisUftmEY6 zqz`6|^o-+Tmli+BxWpY~Ly*-;iy!1gIjJ`hBSx?a^&6+oyOW$Cc(n}BZ#_xAXh(Cz z6gP~G)d(Daki&^P$TG5uALLr{y0K&aVwIg*rpgh;^a3E$f_y<-&IS2bgKh&6zkO+O z%eVOL-@l*JW0Z{dIMTnV?A$6%?g^R42~MY@?U)6uDe030tvZq($DG6uvd|HfH4OmF)^0_y&8Gl_;F*Ik+nT1(}z5p2lPL?{K- zCbj&@3LD>Gl6P@BP_mwpyg%lzznDo~XR5!Dvr*X-Lx%c6^%wf0Wi7b&Wd_9!PHOxh zgM{8MbYaCE@||>(rItU;B|ryP(v2N6hUuHvm?Z+C$E%N{)P=3CbeDUzQ2k}jAV8{P`o5lDXPvYkUSsyM|>N@)!)GE z+ZXVJIYE?nNe6kVwD>`n4DxSD2mZ>?Hvu}ou2FM1U|xfC(pW|NCYj?WNBf8Ty+e9U z(5;qqvf_t%ALxWhI+Q79-rn*&&OH+r8p7o-^Z~&SFEh`4 z#CPQsv+2+k^Eqs!{gp`Kes$V+Pk=CO2F8Zcig-KT}T_B;`s`MlKjKMQD8t|Kw#kinE~zt zNd)Bdm_qZQ_(;-+h&z&Uy42(Ez%4#dIZZ$RJm#3J2!4e0d8UfOJQL9&IDr9y0f7O5 z0fB+viGd;%S?JHY5L)B|TBiAhv1vg&6AEA{;R(qDKGE3zOI|^9KVQi|$PF-lE=UJi zV>Ws6WCmU3I0d1kUn?mgg zb8v8AWOss*O%V<_C)*WFQ&W>ki$7%Gm`5g$7|AFZ*)ZYO6JSk&ERa16tU2M{q4&O# zT=9dpemU3z;pT72rU&eLNWhx=y|{r9Q&dt)ruY7mNW(;06T+>t!Mqi(=Z(44_3PI& zve6+k{+KHVuwDl9&iuQwj+h67&IiInx-DCIvMzHra`Rc;mLFiUfcY-WAz9P>p`x<# zJ9@Vocol`f3+G6z*rC4WL7Y*6DxGZ1RIp$}vMxnTY zG14BvN1l#c{4w`0>9UJIxW`;(PTk_g(Of*B8;|)2S#i#ApPuuN+0D(BQk*9hbo?=w z1xRy?X?*~Alp24U*W=b7h|TYD>Bt!Wi3J&d%yVI$1M}$8(hx)Ke`@@b3$a3 zfy$D{)D^5E=|y0!LvkKfjDNY}zh%o7M)MWi9E>E7Xn$mtAJ{D*yE=?)>2Pf&)>&XZ z5`eivM@L6Sa~+&LgQ`v1a&v;17p&H#9W$}9M?1sWD#}nda>4(eJ$qQSYSlP>p`64Y z{9_Fd<~t<;J0F-UqqdW&X&1-ZBr%la&b3OH;q+#>HC!}jC#C$zRsP?f3SsQvSZYM|`6-O8#g+Ih`8l)rcWO+e3MPI*m1UN=1sm<^<;Icqg;{locP8 zZ`k{y@c_5>PS$g>?sM_iDb2iQujh1=P|hWhsa>V^sAc$cn(Hq?Vq#GcA9*^;j6ZC1 zAS`M64VV`3vzwqW@5p#4Gpt=%z@(`&)}sW`}X1(&uAX`uQG9Te!x zP@E^o6MuZapl>Iw{{!1%<;$0s8h_+Zr%s(XJv_-Ze@H_Nt;?c54D|(6n34(s$Fy^@ z>y_I6kS&zFwm*nJ+CW+Hm&HHg4?Pj|<0N%~5P#$;^gbGeMp8R7leG$;!J#$Th$EXY zjOL6vTP}HxKgtODaN_H25k4IFmlc1spO~YE?iA7@=@u`JW@Jx=TXziIfFEW5B)1k5 zHhR40ZO+)Y$VK}v8Ls$sR^>U?zg;+{#h=!qO0B=pKh255x^3vo`uO-r?c-$S7uJm` zs;F}9A#^)a*KDThFv>c|bFd4fUVFQzz6QG$F`(5BHl9YzV~&f)f}J7!Vi`7!Vi`82E(@r1lZh^o*!Cmg{RugCo6< zfpu0#E~!etFv0l|H1(Ep%@g;`% zn!w2BCuc7PHe(6`H1|W&4-o+S1uBGJ=}-no5jg!K*ouLkCUgX0cQwC(dC1wbXLGt7 z6y`Rkvjy~GJ_7bG(f-nBZ1o!E35Jk+h?%NMte_i5VzCD z+iT12$iEL=4t!%N+zW)Igc}5Wdl4UL@szxW=Ux!-{&<2BLDFIU(=*zKinB2W{a8t~ zYuAp~E6FzfJ$m#&d^sTQv?m>>mkRr3@&NXvXfFvS_U%vi54u@ptJ^S>+77I|95AtI zK)NY4IGwb#I31*;2|?T;{ZEl6(6#6Fv&E0dZ%#K)j{Hxv@5g8#M20mP*pmWvLfpTs z&haevEk)m=a^=cg+G%Y7tI^t%)62(N0@zTJ2hc5reLU7PS4m;Ad(5N{9U zNVb!J2(54^#pVaiX z%QF3_7tmGBs*Io=C@ks6w|)2S-CP;Ts?Eum{}TGFeEyUEC)zjc)9E#PgG>$zQ~I&5 zHP+DK8*%mORZf>$vcJUle>64Jss6X2HDqzzdNQmT69?>^(SDv>+tjdkL`L0ko+COI zru5^R2-})e0U6e~p}!*utUI)_vSOq|%B`t@9oNij0I?>}nvoq^&M#-$vn7LWc_B?d z)(hf0;_B+k^@*g}AICJVD1N58c%r)86e@pO(_8%%DypyZ_&nnIQZ>Yn_OL@}I zzmwIGZ~w}3_DECvF+bKM$gwsjt^DKrfHghE$`~U3(9<^H6Hmu{Nk7Uo`h1WBs?ge% z{P_O!-#_$S#qHM0Tnivp-_xI=?*sOctL)H>uRH%xnjx#^UB09ry&Eun9_pv4l*Gv{d5mw27DW^{)Q60pTOy;rx74m`Y|rST3%^u{=~~L89!B{IQ3xO+A_eV?5d%pY=XXyW8A2UkxBZBz)e!0?*{S2|b8~a&i z<+{>-irJ+fw#{Lm7PkJe@1rb-^lOv+qlktkxBptH3g&c_j?#3$`H;!nniI+N<2tY3 z|1{eaEF>gER&=@h@}wW%f2?hx{l3_(TeoET$E812{>#_hERW7T!wc;D&!;~-Tk!dv zetiGXZ*S6X47W!-)}V=_>40&}(8`wMr6ALfc@FH$C~2EsGV|m~KjbV}d)>KnXQ^vI zc|ZC3U#US;u3Ss~_R;z&2eM&a&a!se+GgqFguIr2tQSO|9Q~H8oIL5r`)E($Usi1( zpMKb-7PspyS-&9*!Z-l-(j|Z6uk)JztkNw0o4n~4e@E82yy@rDnAP$3O}{#4HzBM1 z&nn&gZ>i}|@BiYP$2+;cf3osO{66Xi_L3!!8QROdy4cuQrb4n$!y0v2;J?zp?R@&O zIzldj{Yq)SOvEjbU`*g0mwt>trLAesNg6N*OnX{#>BoL2($*)->mT~luzOCCWNMnl zSc{=kIQgg4Hc-ks{U6Vrq&DFga||9rYs!njzwHFfrSOhRfA#9sxjmb)HaaJB+4wGO z+_;gmy@hqZ8!5H7ltqb?&kD5u+@;Sb&VGlgCO41#mi%%fh&!bJC2T(AR);}sjE=ZQ5~>rn5k3=Gks?Lp z_8ZUQ9l}?_Awoj}Y&kt8kbMs&E+3JX@&NWg@E#$N5KNHNBf*^7JiUPjMOB6J|=65udi!`j;Zg!u%7DUW~4>ABg2o&+<3EC<~V zgpnKIU3r|me#_&Zyz!OCFL~lFJR>k5Fd#4>Fd#4>Fd#4>Fd#4>Fd#7STQeZ9EGE~_ z(S|v+Qx0Q^X~(#n9qDN}emwoBkLCFEQF@DrM1G=Tx#nHY7oh~uj4+*$ZYQFxU?+m; z5S+k(z<|Jjz<|Jjz<|Jjz<|Jjz<|Jjz<|Jjz<|JjGzOsGph19*kP<%;2#=SM(P^P` zdK9B>1n8_BCY&Y2|0MiJ;XvQN0--QE*cCWNfQegf-yP^b6*RE69AQ95jlz9NupksR zXGjq`Ltxm?ZSdg1Y}Kk&oGu-73cw2C!!!)`8_0?%cVLtd9F zSB?YD_4W00g)(KzaDL!@tW%}9z9Z}+JS1SoTCTWDc@FlGE)x0>Fb1BH8N>REjvYHP4-XHyfM>CG+rq+v zTffZv#~*1gDQ=Hg*dD5A=R#|834S5SmO-7|NZx0ZjU|q31IKd zX0$IM*64C}iD*yApd0{e*SzLzV6{C0nTlFb_=z%!sd;gi&d-Jo8?yW)q0Z!nAJ}xv zF9+L2D2vKPRB6xHi46M*a_hEbtkKSD{Stn|8h&tErD1E1b0P+7HpE>zKiC^FE0@*KoYP&c>45drbqqfVg^R6(~Q;Jx80BS*_H%s za$pZoYDBp8wfJ4uckXxK2mNED#njZ4>kFdqBn`05i2gg)U}9adj!7k^V=M)9U#m1H zC*pqpS^V&QzU<^1Ica|$J$l62w{Oqc>OvpBe*OAVf!|=e6nzG8DKEg|&)^4knr6Kbc6#;s(a+HGko}PZX8SdAm@Mo2mH`}>u8_BNmgmk?l;)if*r*&sWvjf5$rvS zyL{ybbp`#wI(6!B`BB*Uf&C2ouKih>9RZBt{lv+k^L*upFGvRu9%RLe7320K&-eaw z8GWi>B~$Acjh(WpSNv~TmLuvz)^hjf>(>h6M0{RWZhjyW#P|neMA*T|%Hf+-p+W_@ z+8@X_(C0z_CObPm-1v*?mnzxbfL*PQQzT3PPWWSGj-ZCq4VGCsC>w-Upe8Yao^E={|CBo zx$6JqBq6Y&jJZV2m0=Hu{BqEd0_T{oa*LWn?K14FN$$IlvupTKr&BQBPgqO*NbNso zC)1HPjpzsX`1tVQao?sJH*U!Ly3FTLXJOkM{R^N%y@t$Z;kHcQF3E3MR@WGRv>O-A zikIbV%)#GY1aZgppE2h)V#EkezL{GcIoPwCJb5yM4SM)TfjlByBXF{M_`hb&njGok z!3G}Y<;IK|!)n*A&2y7Pe!j(gm0o2F2Kh4PXIc!KDnH0BV586|+8?HKx}1^x#N3Xg zt^)Ys^b;Vrh?_(Z2r+%mDBk=y-AiuEZm>1y|?=NTn zPFaO1$q7YzE=|u9{$kvIkN{h9k`8l)F@*Dkyy)kGgA)Yk-@$I51%Y?v=mh0e#!({4!`9z4TuB2Q_yc0oWOvv}yCF z@$W<2bNfBP{$^oze<=Uhzk@4N3l}ad%=G`MBA>@jG*!_du)Sm%__4)H>=H}+c#g*cW{(p4>oDRW~ z;7n*i$O#AH&$gs@8xhbaglt1z8!rg^3E?XNa)X>8eUGJ_wEyqky<>w04PqECbm-9G zrvPDmJ`i$}c4^OI-zfNfg|L|5LdeR75B)5vK|p!nQ%bU)Vzk9%lA=kurE@s(wc+!AZMCHz!EB1E}ehaUJeZnWqtbe$rgS4_D#3< zO&+tH@?W!N%}i<6)6?VjM+*oDU}0fl*~URuJn?Q|U?8_|n6YuXjk!$WA>Oc=UDm>e zRdH^`syFYzs<-gSB|0+mMy|}r%9d&B>Pv<-g~F0$BP*SMj1SRP%ImN{3eu2Q{$W3^ zM~@!dJ_gwHAio^ieC*AFy|`evk&i2m*lVL&lXk2F+1lp!L4aM#ydZe>F^2ueJZG+9 z*6jmW5p_*I%w!6)89|y$=O5oEj1%Q`*bjg_%rpNzd-lxMMy|YZlJ(rANt5_J0=f8B zYwFGd|2;@{;!ot+)}^Ga%+&o0jxk%Wp1gffg!vCaNlFI%QvOSpEXmHEJu8d0e7g@j z$k@veGSrib7DLF zPb~k~O9p+(2@@u;!-o(5$kc4ka$EkvH}>eU?b3_YrT(N_)Lgm0+kYbeix)5Ezh~T@ zciGUM;b(sS7vJB2C3`qK_vrs;1?)-U-1Emc2YcJ4_V2T|hyN$?4><>QAUHtJ0{b)^ zI&>&o95`@*+iMZ;7As@O?L&pV23#YvMw`*|XfHwU^e}6+^%eL};~%!`v2TOC;BC?? zC}1ydHHLlQ=y?eqnrYJls0PAh~po7))g&Qf@ze{W$HNq_NT-* zxUjVU*drQyoM8W-?DiHE&m5G0^gB@oe^&n!I$`|xS53P(YdL&6$tl-z`wU{QL3zRL znI`9WE%p0r&(}GOe=*l3>2f{(73VZ3=ZT4l%*4dxr}8h}|5T@aXu&u3=s{V|31sbe z$d7sXBgPB?OZRYl!4Tm{>s>;5N%HCXr}7W^eq>}MzZcF=EB~4JpT1J=c7*3NCr6Zh z$L>S9?>lh}{x=cCO+3;i=YAUh*fS9GW@>6`e4YIB_@{D@HVXS6scLGar<0ftPUBnh z@YDGJ^5qM=a^;G+9_F9NKYbg5Rvuzrb2hT-Ej`5NUltJY(sUwz8vpz^0{ggO-i6}x z3;ADFpzRO7DcGYD`W9I~LoGXBb~{zG2)7ni@~WX*wi z`Ohim;?EZ*`OojlKlTZ)OWsLentB;c<|s{ zwLe;=%5ZyV_gH@_eO`;7-;zA`+IWUJiOc^BQTu~ESh44=zrTNu_Djx7`vZAD!b7+S zUtTBP{%Dob&vu`4zK?^p9&=u1PAyqw$L8FgvhvPB7WDU5-n2_Tmlyse{gU@OxBT<@ zkej2x|Bu`e`2WF$Q2yzw`NQRU{Ply;oSlLH+>XC;7SfNWGnW4{a<~7vX?OT{3TyiV zUD%2hD{_4&3kwVO{Q2`AL>15(WPdGNw&cRp&?(J2&sxjrn)6&0#1Z<{Mm6j4eZ=Qf z}e~G!of_9jzt5Kr{$AyZTI@hN`U$Y>1ho6{#@m;io>HLtt z-6Y1bXS<~P>HLe!EhsW<^ytwAO+SPE4e|MRi)QUv(5fSH>r&+?pE!NFldNILNLuHS zt~-JGmm-qn({(!kSpQOx4)ea#rcGnTiWTGQBzM%&(P6V^&t^$UN%8LPm*K<2+D0!a+~Za{|FF-3a5VrjWU5XgWP>PJ3DS&B%a56xs3;OR4^WgoV0P{ z#!N#)gXaOqJA}^&6M7K3<;}Qxk_O!dutuSg%q1);S7;O(#mzTbyZf_pmbJy_9TDa_ zf)+uVOXt6!>?Kj4;_1gZ(m#cOwYPs0u$D8!GkLYyBrFF+iS$D^ zD|b-H;Fp-+2-Ach%YpwSf~@!R>ptwHye8}?pf0Kr;M57ego6b9&e>C;V}6B;wQpw# z{Rkxqa9E4zPS{DnyvTP#euW2r_%Qp@IUgpSN_AM11bcL&2?b#*FOvL)oq{d|8-lEQ zi2HR2-UK`!Nyu${qUhZrgaASVf(}8NL*8S(x+h@(A(BwgVNwu+6BrN}5Eu{`5Eu{` z5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`5Eu{`$PWhc zUD2%2dzi@4=E%h}PV78V?3_Clr9PAY=cyra{u+y&tBRc~$v9UKyDyxJIQP5oAS+L~ ze0LIYHW7@uV)=jcuL@;hB(hNfed2d9Q+y4*poiB?*{{P5-eCJn7=6&(v#hJamJqrp7Vo_01Z0gjhZ2I)+ zza3`Hn#BSF0vPsF5=*0y|3C7-8=d0&&hdji>ae%+(W6IMa&qz?VUc6grcF#)Sy{;c zA9>E7m7tSjeBOhj$jC_c>C>k_BH#H$V4rX$B_$#M`CR{Tbf(jHeEwsvzPE4R^0fUi zM(`IeZ{zAS5J&HE-UW zDJUqUr0tNG_CQ>L(yBS&&`y>;r;VVatn>1oTV%oS1BWcp^7%-qF|*>vp2>iL8+ zJHI~p2j4Je+ocz?a_hoOZJk-MGDb`x<6Jc2`I_KL$j)WR|8Cv7&Ry4(V|yi2QHZupzsB`*x|)4^g3fPQ{`XjSk~Qf+mMIs>&}ZI2`LB{i8Tf7Lf77N-*~gC`e|7eA;SU-# zC`10+(Ki`&P*&djjQc2ie$lZ^x4fBn+-^|bLp~tO{Wkd@78X`0@*a^`x^!v!_+N?o zqAiC_`{ntMG8VM*Fso3np?Lnkpp4IIZNhJp|HFq5FEsftKL4kpR+Q`Wp|AHd>Unly zm^rr;&wt2=Y-Ck_y8qkce|UI!;m!Y1bGg2Lc6swNey`%(N;3bE$FiJ||G6ktnd-lg z|E!?Le?tA2Z!9U)|6Ek)9KIsd|ICC5^*{IhKaAaYs^L^;km4|IC^A?%g|9 zzkdDnezBgO9!p3_$o!z3ck(U&Y0TL6uLT)ocIE3ha^v{ijunLb&zy%a1|{(t%Mg{@h$ zhC!zXb|>-z=tuec`^(e=k<8DWUjMHBKj`92oH&uwk#Tc#W1Ty9&Ql*dKl4Ag{XALk zN!owVF|NpvZzi=J@&sdRd(!Rd{acRzz!hXbU%!4$M@mYHEDE!|Uzqb>eEf&{Z6DB& z8?OhhIK=V_%;DyC?1%TvoPN#xU$z;V!v{8Q+?c_}N?!W^ISe}6$1~-B*8$x4FE9C) zAMXaPILM5xf50ivW9Z;%iAL z0Zhn$8Tp^K#(?|&k6-*-fB*UX$8pJ$CFwHu-y{D|=4srPAALX>{eP@Qm*w)c{^#fT zf7`ZgOuQdZsO!Hl{^!=><){2_`}XbmmjCEi?Ao=9)7xLRY#Cd(Ze5=2Qc8~h1^Hj9 z>@Pp%|M{8!nE!QjbWHCXVg5hA^gpO!P4_oH&VN_=KidBMT>qKh`7f^jVPIfTX!HMf zp8xw@^1m?Gee*ZVF z{~t0kSL45&e%s}F{!h{Wg^f?~JvMvy?k%mD{E~ao(b4JSbTg*amEzC3laAfLfnW1ofF zCG`NWQ2g{|Wj@_6l=%<2k)@?&29AprE5`Qj-TTY4|IVE|tV)$C8RDj`SC(~}zUr6S z0E7L>MkI$+5?f15`HOu4vf3M>(B;1@8@rSa&W6MF>(_r-8Gy{t*Vi{g-XmT>#rlnz z@1pIg{Q#mH!hl$C|6!QZrBe1dxd1>GUR_=?SJPbW0I1RxcZH? zgW}(PihTNB(sa(*n1}t%M~@!;6#L(hYrlH+ip9ppGT5L+e-H7HhO*UdShK+sIXkSu ztB-K)K|$L8##%G4*&CRB*Z!=SemTiFVK0d6_5;a~|9P?hpOr0rS-)W&F7}6p-EoAi zrKKgAh7Xj6@q}CAd}Ci}b8~a%;o-sA@+m0${}B-p%+Jq{!R9>HGmFQ8&c71k3D}1v z{WsWOh7I1zj?J01yFaVv9YVJM!}8buzgJIY}deI_WX0d;&_w7456WX{o)lxT5r@Yf@-pqw;swmK@f=I0h9lG>e6(kasZr9w! zx&4qEFK>;QuKO_R_?xhgdtaQ}a(aK_+jAR=w^15Z(nZr{ir%g&728(rxUAxlMYkWe zvV5>%)gq6||EhQlT;0M_;m#V@S>1;|`ddSx#FU8!Giy&YYPMckVYc4T87hOWd(XKQ z?H?Sp@@vYI4ijFyJ7c-^V)EOs?YEbHciR5q0Jh@m)0Hu*Ezk88o zjgofFj_b6b8xkypM6s8jUQdLH}}zgQ99Av z&-y>nizi>d9yHMCqR>U@jN-ZD^`5ren{uekOwsPX+Rwb>*2YzftFP(cq7*kK?sDAh zxB-5eZJeLow==$G>*%mP&L@#YIx0-DJ-DD$-NcHs)|)>aQ1Y6Z#ld<#RPO~OI!4C! zbyePYpk9DW#kP51&=J#?h>sqDb$F1?FqU!ezEx*??*s^usMNW&36>lrjj2Jd`YmJMc z2Uq|1W_RyhcAjys9X8)-qA=}l`%}Zb_jidNbgzqZ;3CDun=6h-wz;!^(Ij_`R|Dt2 z^&e*RxK0mcSCb*$i^Jz>CwB4HZnoyQXM7X4K_am#*T0Ugr;4)R`7}q4gC1(mW%295z7rVKdmb3b#$9~gy?plAv2anRKQ^(kMz=InbBWjJk*lqJ`#~mSHwvD^0me-xf53hdc`@+Rz&6G~I zQ$BY5_v3_Dx*|)9(*enk&aUgUc~t9#b+mexrQPZ*ym$Xy|JBaXo4Xz#_I>si)6$dP zygglGYrs+U+u_M)okP0z`>qzcr$_0SXwRmrY$5}%s|>ByQ#AJJUkAUAb9=i`D{S-A z_ut=D?h@AcW8${i*J65pUA@7q#-ScXhg{h>H~#VcM+?J(PW^4}^SVO3{#fS`BO3UA zyQkM9G&Jb=R70iCBQLFLdvhfFj#%71JZ|{+fm@C}PVRe9MX%4x?N_&qWDy@;T(@5G zKG@rSs`1Fz$>BlII)$%@>JVv`GT-6bunKEV?+ibt9PTj7d-%dz&(xYE+J_9QetAd# zU9E@S*00@D_rRy4HFl?6~)P|5gURtq*NUess@4$KrJ5_6B|@r&xQwi#0d?KC;x~5o#Xlk(#U5uMhnE z_Tl6*)|J;k4BPdv^c)M%djmH&@bLAGfBW$C>J1xQclBOn6L)9Cz|uNjT~h+OCDf^; zV0`D>sYkK3dSL z)6PErryd4Ts;gN>w@I4&ZFQ#|twUPZtJ~#kkMN)iYmXQ2(_u}Bxv16&E6vcoZ+K#hBFCX67edhC!6qiNn2bb%L%5-#hKm6e2tXb!3n4A0G*j9e{;0j?=%GJA2 z+qP-6$2odjR}`%FsdZ)7J|mR&714jXBT~`i@VAHq&ue%N9a^tK)2Zd+N>6Iky!nJ) zDm@1Vj=xayfF+CXrayUInMWUV&0ScSM}&)lm2%apGY>2?)GT6Nty=Q#@%4_|w7&Yi zV@HE0z2a*GSJhCt^erWHIUdKTWp=oi(_6b^fF& z@ix~|&ee?gu-0)_vup1@-n;d2e_xfWzO^gW*kgV=L8LbBuubjS@9W3gv_5oq)78dj znummh*wn52vHt7BQEeV*jy?Evv2FE`yURzEaB)5U#V$GifT+re7I6VD1M3=wer@u# zdQqjDw_VOXzSVKMf{E$VlL=lTbIY-JZ{7&p<5oPThu@=Qw{UfJ(MgS$D_xW44xSqL zy9@t{dbiuhPin?-e3N6 zwKdARnK-XfYtHPwrqyRO8{%z$a?7Z2^(Ala&s=C7tW8G6=RNWbJ`j@7-owM))3e@* z>Mb2kC5YzLA8c98W5bKVi{l@6eRO8Nk6ul)TM=Jh-W-$=^8K8(=KXbkCraIKQtWZH zk;y$2Q_59~@wd9atme=JSCcR$zhjfjoS9ei@biEN(OnuGbT3nT*`kd#7P+pfIKBV+ zw-%?*C9FNSS1Ym$eIA|-ur#f5FUF0rm;ak_f(khu4LXX0Z{;Kn*QO{&hd!?+s%245JNfqT*F(KE%@yYa_D?*~JT^tmP4W269ZN+gHhJ$E zMD42f#!2N>&RJ>RsBdcX%I?{YYd*T7>pGK;4tcV4T=!nRl6O~Wr|c6RQsb-kE~8#r zk-hE=p;|fNXu!?kulKF<*>~glvStd_Ux&F|e|Ib*CHU~5*yGd8A|JblxVb5uYil~g zk3L}bpAtvgr+m6k+q@0&u4ryG*5A*-^?-8IsWJCHk8QAScwfEfTN{qwnB;V7cw3b? zlTLGv9vrPYl$zLUJNs53o1^9G4|;L4uEpD;J3=nrym9v2zO%h=_5JHubn9{a{Pq88SiZ?*{ew@=|8qIKRoC-_GZV`$|*)_D{kyiG*PPDYF-?*r@L4ReNi@i*lpX+uXjRa|LdK&M(EQc zt-1Xk58e>qGW+>|gOj6LwhQr6m|lLY|E6vyOU|+Mem1b}^2qBul5Zcpywz;WgJUh< zRC;ap-QLf6%}Z)EUnJZ~*>UX3tn$H1SI;dx^WaN~&`I7}n*F_;6sG%=iS;uJ>&8D1 zXco0KWFf^g$hGYA9oKaICMPIT##pzWwc35!TvT?^ZfPCEUvk@xlYfwTRfIfLA~lb zGCJ_|9IoOYn`XRGbiz6`wsq^{^*?Vkiyh*9B;wZRVji`2MJP}BOVPwkf9#C8Jr-%r zX!cikn`Z-So(s?)>$Ci=lXH>Cii2P8`?w|amR+#`bLA?Zm@gv5B>82H1?(t*H{(tc1H^WcU#)%~PjN+3#sRzR5pF0yalH zRvGP}Xk?>UtIzIx6OXC)-=wD!8NPh??ggqwLn52cs=RBeseSv7>pLI4vAtLPm*Iya zz4i|%n(W{n^SyCNL)H5{ z3f&rQru+W>ng&CA&Mc}PX=*+6ZMT7)?L<4YW|yjTWX3$vf^=h<=1 zhY1^07b=>ZzV~KllenkjLK6Nue79oql9f(hAJq4tPHODO;w2-WTeVS-w9puLc-!{v zL%k<2qE@GSXsD~*ftTGXhWYL+(;~#MMC{ssj1vD&_(Bg(axvZe@%C^Zy$X-F#m4qe zN<6qcxtQTg6QhqC_H60$ce76AdOz#q^+5N(d-NHPQ(9Oz?8CO#`?_rF|Je2FW`&Q2 zJs-LZ*LN>9Ceq#i#`){?nQ+@#eUN_lfmE*&qsERcLY=w$18eph8E z``DJ=i?6@iutBj;#CNxW?~~pc57KEF;iaqU(|mh%mB^+>Lm!m5veEbTz?$|~FI+e@ zu~aqNK`%O;3LN}0XyB|%*^1p&7^9|tuC4v#di97$aV3x zO$|CEjMs8ezp1Ux9sI>v4VLPQ$}}Tqif2s(8`HN^5knsnPfLvxw+%9m6VJ&>8IYP|0My z;lkJvilt9g@@v^r!|}`cY1cOSE5+U(RxSB){K^d*Uabq=qv71Nsp^y|Q|ODa;QjNf z#dbGv3EOy7W903_9|ljWIr4V54T~GhNIvf2URvGu_?VEc3C151=eoVO7~vdbdptHI z;hoFy&xzN}eG&#u*Ymw~dg(ugPkTRU>lbXNq5Y-G*G&&Q(l9Kx?w)sNJiIx%tv%%SOF@+waur z)8^HyAAOws@ZIHUfu2Y1_dRsiiefZi;J^~vV}=TI?%RZ2J~yU8+yTW{k(cV88Ha{n`CDn!L6cIY zN~uRFOr(bRe)E{Hrcu5M(?q^1`-_}W9y`?gm4%(wi$l9EF~d!)OWk=@MQ3d0%y66M zI5MJbY*N{EUtjH+Ht>0uu&%8Wt0ak%$|hRJJ&vjur{Yw-_%f>vy+ao1>^FSua!37J z(IK;R!#-)bteN#yZBvn?8D4X}>sS?;*HSyB>(wh)+Ie|BA6WCP>%>`XmR+Rdht}o& zblViWq|mkRAwSzTWBV`qx;G`l(!ykH|JfI#`d=`9x={PR{gvlN6N|Z)5+y_)^?4l~ zQ87}*wv@5+MvV&d`)ZG zFFoT$TM_?F%5+lgn&`wsS8JDkjU7}Ydnpy0vbVy_&JL7QwNSZ{_Q(- zXzS_O+@yHY?ic;WPAOY=3-uAYZB2+e9(iW6MOCMW0dwX}O^&=AxBaOF2^dbFnQuLx zdfYTzq~>GljT@cmW3HyGSkF-uT)vj(==!hs&KhSNVSC+lc;DS3$7cgQHJX<C?^pZRX|N&DPEQ&V$YvIJ{iEZopc^ODHvNaONFM79-9SSqBbTzfgt-=$xN^7chq ztx#S0Z(@Jj_ll+B)STi|-p(>o(vE64OnrI_tv+S?Xr1f6CFao3@J=o6`V=iSQz`E8 zf9{c!tF92)UbOPFv055tFs}c=HWPHzoYlWRt8ypY*5XrxxaJ!*+?!3TExP&OboVVs ko6X*B`g5Ji1E#QKq)XL)PHhj9kXh8cv8&65hJK^|2f$lW$N&HU literal 2238 zcmb7_F=!)46o!A3fEKP$AP^PT7@U*V-j%ezD-^gQ0o%xMg^LZixI)DhA}HX(g$jqr zphATT1zc>Q!Uh!zIfM$C7~+6TRLCHRw73w73@Qv!p~8l>w1tbwzpJ&debR-@=-Zi{ ze`nsC_hwhX0_)-;-14&oe8HYf7Rfhc0UTu6|I}?JmxTv?>{I0Z{{E!lm0g^jow0QU z;r<|m(<7|T5HAhhw@Hr-h(+9I0s)9<6hhY_Qb~wR1|pw_Fbs%N38GqsI6Z}EHX+)i z*Mk@gAS?^w&W57sh{Y0ETT5YUD~;{#4BoxVV`s-eCR0W}UxQ)PQ7*SptMyQ?572C0 zqusWlD+&^^7*cC%NN;T+`}Qpg$s~%qyC~C-8vUr#j~4yt(vK_pF>Ew&cX5HJ9>wd# zYs6D==xH5^Yyzo53h81R*>Vp+5#?4HwQdddt2$cOEp+d?$k8{0zLg6ns1+M% zyuU#Eq>o->h`h0bgVG)jt2w+sJ-|ux5UpMf-9a5!RtwK|itz81@OiF^0OvpF`~dg% zoO@g1-jtSwSeJ3P$dL5O1!tf?hxqr0mg`d1{gEcs$c?uq5&8MFfl+n4I~mkJPy2i#WP|P z=2bAif_WCqx!@TP8KUF*8o0Uwx?P~v0`tgaYXDON;{eEKfxSH-nF5$b#NPl*OLR$C z^p*P)+@EOE-&2%C2|1BNQX~-*F+3CAfu!r84Tge72yK8i7!Kf&&<=7WL+CzsNRlLo zPPi4s2<_U8|B&(T_ZcU~ztIq=RvD|J;F%QMzCbc5pzDHXS0EY{2n2+;$TnMN;a%bw z%M*i?2xAGxl-YXvM*V2HYRe{geigUicH zoS&cL`1lw{M@Rqp{z7_O0L2~P7sPAn&chOPzAQj!*$ImGVR3q1Ss(k{o}wvEJNfW< zn$s*tO!rPUU5S^9|6#cen_8Fy;g0I(gCFRAD`ILRzhCV{X6yd3)`?nv)r^j2&i8Ak z`O+RmO>KOyzi=IRVNLuPYpb1zt(lrV(II*Md99+EFIR({AM$kX0qMTg%#MoSs#ck! zM@*HwR-*HC*^QjNGL7EE@O1qRH}dh7ijzCqxVL-XR^(tPWI$b~fmu2XwbL;plCzAX zSDviDKH5}GQ`)pA^F7(`m)rnZD{-I1vmr~<_<8a1!e@_d`}VdtvYmtQVg7u+TS*#+ zM?Pt`J{pgu6)mDkl9yjRTHbF-KFLtbNYHn$)6Byng{2BqIp~hL`+umS5?0~{WMiI= z=yC;NRo!?rYkIR0T$b#Rrm3On(4)@A#tKv;sK|44N%mnJGz>$2G;Mk#Id+2~S^k)= vQs)_(SzNzWWqGE^!6*CLpZDCH@iX8P@_)+0 Date: Sun, 25 Oct 2020 18:11:18 +0200 Subject: [PATCH 02/46] Updated logo --- src/skel/glfw/re3.png | Bin 0 -> 26360 bytes src/skel/glfw/re3.svg | 88 ++++++++++++++++++++++++++++++ src/skel/glfw/re3_logo.png | Bin 27059 -> 0 bytes src/skel/glfw/re3_logo.svg | 94 --------------------------------- src/skel/glfw/re3_logo_red.png | Bin 25459 -> 0 bytes src/skel/glfw/re3_logo_red.svg | 93 -------------------------------- src/skel/win/gta3.ico | Bin 174425 -> 176959 bytes 7 files changed, 88 insertions(+), 187 deletions(-) create mode 100644 src/skel/glfw/re3.png create mode 100644 src/skel/glfw/re3.svg delete mode 100644 src/skel/glfw/re3_logo.png delete mode 100644 src/skel/glfw/re3_logo.svg delete mode 100644 src/skel/glfw/re3_logo_red.png delete mode 100644 src/skel/glfw/re3_logo_red.svg diff --git a/src/skel/glfw/re3.png b/src/skel/glfw/re3.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca7d5fa1d821a520b47de3b966689574664a3d3 GIT binary patch literal 26360 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 literal 0 HcmV?d00001 diff --git a/src/skel/glfw/re3.svg b/src/skel/glfw/re3.svg new file mode 100644 index 00000000..045624cb --- /dev/null +++ b/src/skel/glfw/re3.svg @@ -0,0 +1,88 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/skel/glfw/re3_logo.png b/src/skel/glfw/re3_logo.png deleted file mode 100644 index fb82cd9d59bc8c399144897948fe9f44b5cb569b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27059 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 - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/src/skel/glfw/re3_logo_red.png b/src/skel/glfw/re3_logo_red.png deleted file mode 100644 index 3d24fe7d5cb4ae28cf249eb1f90bcb30a5f2398b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25459 zcmeFZcT|(<*ESktgc%k2ITi*H7>58NZKO)a!eD4o5Rk6Yq$@4-=s4<(C`dvNO?pSE zQiEfG&_eGJl>niaP^2Z_ew_K%S?7;)&iej%zjM}EuWKIS$n)IKUG}~AwXc2M`Rl5Y zF3*9J2T&*!59Z2cV-)H;`0ID5@44UuFDUsCK7P1+#li=LI{Xf~IGVh29pE4NeRXd5 zns_<+;%<36qHs8zjEkq6kNvH?jxt`}&ZI^4lPJ{BD9q&x*8`H~#{%P%9d9Wu@3a}n z5jAf8Nch=8`|lt9zr%b_N-I5fXFtca@UTZGE`QfDZEW?QtFyYtkN@YXcDR7z$=F}M zzpV40?@t$AwBX_RR7_rRC{+M_)JwZsl?5CDpS*I zA9U}(|NQq1{Pzs}zcd4#CNZkPjr^2s%wycf8|`y?lrPztqL_T*{vu2@w!6};^cBP1 zSGY=CQIT>VooDE3jt(Veo}IBu?ma<@(Cdwr@-R#!WMWJ21a>E)gGEdDNY54>EalRY zdeN9Ahr1@m`FeVNluzkp*DQt!+5HYKglOVqR^~a(Hd^1`FfrV)X}fo3f8!dx7Sk{~ zG_lX7pMYi(+pM;5mk5uI<;Y2Oi5ptXVZsoR5T}Q!ZY(V1?jdSsIk;QN<)7s@GkPqR zCo6tQpYp0)OE@tzY%+CRXX?@Boxs3J>sWdWnrG4>EH5;IWao-!dArHwVC9-P{5Q>v z^l+jg`NY>*4gq=gICZh4i1R;?b9T)m*nMq>vM;Id|TSluD0@@fq5UVcJ}> zl5^IU3vP;W+-DQH55+JtLnkCV_)Bd0s098(F_ESm4X)zb?|URtyq*tj6-)3SxZCJ` zj3c%apZ#TebJ?i~V|%uW>LE{5?>k3ch*CG#8$Qs{q_-(5l1T8#Cl<9XFo(@BAESq- zl?tM6X2m>ev?HjS7^M{IrMP2KER)pz?(VFd+AmRvVrY0fR5q-9><|)ST$T<$AzDJvPOYnC~7S50GV*Vps-RTUK1*Jt`x zHa`mFI4ys=&g*ISgH?X9(R$;CY`b24a88XKc_VV5FDoCL%Cju{uxg+t;9iTgG=>oS z=peDOGSk|q_4oafw9drX{RfAqE4G+DrQ4@AXA9Un4Sr<`ly_P5w`kr9FoWWiKW(P__Jq47c>L2q2zuPs_xN|jsc9wwd+uOo1HZ4Fu>k&S4g1L~#|OI7QJ-yu+leWF4+&gxp6fh@OwxsP<@6YpA}i zx4`I{DO>N)8w+9fM(`7BUfcHsx5f8**0{LN&K)OSkB)`8-))h!IOp6UFjes}LB4F4 ziZ`13^1*HU>r*tZ!(@^f(SYz+*p#L4M^Fs0; zf6%NuI5{Mtv=&R~mPw<8ddpQvC)Aj)UJ-9v=sJedjx_f4XkX1qY56kKQ}(q(t&9QJ zm#t~qVv#;^^tw^8jHvQLl++SE*JixjVZhkiL1N2cxP*p(nBNd8fAjA@4vhvc9UAnZ zuF?DkuJfL}u5Fxq$WXRET6A+PP6sy{^`R%*5oWC1HE@xnepRoySg&|oBe1y4$KSC^ z{NWsdEF-Qfwsm9NiP%+hZ$j=aRYU&nQhg8p%lkEcWtqJE+1*#2?dO8BgYJR#IvB-YQL)896{7V z-NW*PL2}}NSGDMKdFO_)5ur1pL=rL8eAX#XS-j#Q0UJ%API(w@2lEKTUJzynJU-=n zm20ueE-3Ppg~8R_yOXi8QhPnArJt(E?Z4-llsSBSRy8ku)o2P`U6W*8?YtUr4pXbV zA9eLwOMAOT$mUq!!eaqB_H03q0&YTDQp7avEAO;cIH$OtEUpJd|i}AdSM`W<};U{om{@C ziYSF9Zc*V+?ybc=J{59zHd6KMrNb)dK2EM;bt>%y4r30jVN zw&azM<%$ir1adxP(VL_xkAg+1Ct_aLUPYlYLznLBRMAob`&-8>dkQec8Y)nR%@s{^;X_2rjzwe(uuN{Uz+;>09n z<*ky%Hz6B~4z0S2s!4N-8A&Pq{OUrCmF4O-k23v(@b0Jf zf_;gET{K0xc0}+yA#9MWJFSXdh$i{g+13s@@dvg@41Hzq3X_Nzc`Mi6ax=U4^JU&@ ziH;^Enz6gaFf7MNdc^PPeijE%_i>$-zAm;~6znQ;6Zl=zlDJ_nUFP$@C_EpstZ+R9 zj{<_1*w$sUj-5VEZl{Tfh}LEkBh13!>qk?Zsx-pR5>+2|9++YKtYpebqP3Y(gN8(4 zR%3wMx^{Pggvx2kK-utL?E60)m0MlwDeLmpnfa%aPR`fB zu=FRhv+H&w6eFy9)XP+sZ`0f9 zWn=I5HHVfl%E#p7nU&1VG0G4|sJVs6X4NjlE@T_F#+qcG-{S7aK;)!ULKL}2{;Crc zd9rV1^%_QqEWTynJe`m-KN>x1Zq#9DY}J>8RnlO#&8z!3J>FZOslubV*$tZZvTuGK zq2cjdixuWgts^mn;B0YPLdu$ioZXQ^6e=L~#F(FXipt^}1TuWOJ7WU=rksOdySIqoE&4=u0$$akNm{^6Bw}Olbtxm(gUyV5FWNKB zr8;*UtWT;h+t6)wd5khH;5y1rSvDNOEwY>lwguj!fjLC{r_emD)#mxNuM&szzDQQEcJa8yw>$wj#ed6hKTlp|$6d&wc0$!8VIt7)-FEk=DK@6WTLT zb6t(08pD#d+0kJ{+;@ztlk21!XX)PlO-d~^)Nix zr;!V-!aoPizfnzfe8MekKo-P>kjW=+79ru&f43(US@DRt!|r;EHRAj`w)p7<%$Np+ zO0<5FnLqI75q|a#&3S%5pKsesl)z0-)sY)g}*+HFY=samrb3<%IND0~7QDkoiEn;%kv3JPXIXrb2ZMwHzRMLxb>kID9 zb>D#o-}8|NSGqSQ>EpG;zm_&|V+n@}3_T^qQw<3XYV$7^oZFhy_BQQOqd3N|nRO4z0$K+hB84j5GHYh8r6iD%F1dvJqpnAQ0hctrv#JmC|Zh5iS%lMT&4) z>G@o(FMqmgh1Q6&wNF15@-g_xUc}8Py5HyyYx94*w$Xki_!xLpu72DT!P55LygYvO z^Ozv<>Y(4`!fdqg!QEuVEkA;xv1tr1>uXb<)@&}%alV_$&(-(V-2L{}1!;-vlA_93 zEX&Cwl@$A|*i~ywI2A4Yb$Fn3vd`SA>$_vFjVZxSJHbmfdl4eeMpzjcaSbP;=zf&8 zIHRh^XlVAafbr~@8iuP}bihELt8l?*GV?mgIsqIee=uu{e`AR1`KcT==h=Mvi35q` zwK!;4t3)Zu7EcYx*`&p|H+YNm+{4Ii+p!fhsA^QPZ0)$K5PpX?BGkHJOsclqU!DnF z-**OuQl&K3Z?rh^*$%GwlJe<mfGHo-)-WF|Iep-{x?ev{P+dXt__Z{xShMDWO^yOpXl3;m zYtpI%wT@g|XRfR_J{a27)tU`Ztx?+Q*Pu8PP9>sAAq#FZRm_e@lbiwMk74W`{E)#-PK?f%{7UXO z@+Fr?7PW-$UAC=VtURUVvidd9Kr(cwfS)$i_nG4=Sd0(skYhdE&9#SZlG8IG005Xxn& zVppFY*ZG)r(UkXOw6UqFu}$*q15P5^)XxubKZ=*0WDj({oKXx3aD9B((2vd9pCf&> zIw?U{FlKAOnuwMV)x{cQA4_sgHg(|W%)zEAC@GzgQ+nmJzP`?{84^%Acsu-=fU?ZQ z$LCh-0lm4`Bw|!Uhlf8U+J&j`MhcT>wSUbr{zwaQ<65Y)d;M1Fg{Xe4Lw}(~;Py<8 zyc>Y;NM~wF^5e&kO~to6iHCmr^=Faao;44?wlDi|!m938#7GFUy{8tplrFLwR$k%w zAxXt0NwHv$+Jnsj=q`odo>3sL>H&B2)ad&;Q&SroWEen?mfyC;pA*>}^}z}Se0tE9tX9Ri(V2DK z+w5EZ7Xnv=E;#CW+=S+nZ-m7jUmDDy=E6 zq=Xu_vk-?oiDxR~i4QbF0zEzt50|cC@hxu3 zZIOr@e&(5r*`uRLx;UDKK6@<(ZE-cmUE_3uxo@!|WDXkrjIIoy-Ib>4uM?5f<|vWy zh@K4C?UOZg#jTF8(rQa}@*W-@I=a6O}3 zX%7##E1_vWK(zDt9ev;TvBeSTc7y_*FemUvpuVN_*IRu#6#ZmKWD&d?`f{ROz$Z)1tK~y zfaKA=_9Yy%%6RXPW85vu8=wF5Fsd^Fa)G~21=6F2LN~{JMm%gPlNRKr+7gIIjn1D| zTPQavCbNRX*_}Glb`9!$b|LqG2jQJcWzD3P-hBIex`>|*k_@l+1v-p)$nOZVyC_<| zI^ZjTv0@K-RJEzk=7KR<_@*o716!EUuwE3AGeYZmB+Ci0`uGeB(sZ~|AM$FRkJMrz zV@evZ4VKPH_P0bPxmA{|UbIm4hNI?9mVVq6jkQ3N^BjG%`-xlYE?AlESuUhF~F9drh#%1#|8K(d5|w zx@ju!(qT$zlaQq9VMr`VB>AP%*41WsX9b(Jls-{cWbEhn+uj`6UtLfht&-QQzI2%b zb-iwCY6@B4Av}9ezBa8MQ}g?ygM3qrjK~gfK(Tzb0WTTn8-wn$_cp-+`coe9*~WW6 z^7PysF2N^1sTxx%0a{2$mt#C<%G|C!l~+r>Oq0D;E@OSeH>qlnQNmW`6f@L=qE3k+ zcKg_=8R=svl;qgGCcz=NnBjK2>5MbUix0Sknmg2%k|a#Bj|uL-L5-EQOX)FElNR1% z=rWD>+br37dUnj4VB1r*R{kn)OSSVobyFi~Jx8lu1ZD@QPgCFMs=>83c{QQKSa0_S z*T!S_p>8UMpO9{G)?_9m1; zbbRO*xKN=U_~}95OnUfeKW|X(ajI6TIADEQJ8w+aweg$F9NdLr)4!LDr}Q36m~Mx$ zcuk~-%e3TZ?ae4CDy(+7t8~BhnWW7L;SGh$0u&i7w339LTwo(lW=*~Q&m zO0|V+WxWKiVaMJckld)bnR^}H(rU+Ex0_CME0$1g3916NzQaCvA?9OFstmmTFWavh zRm@R}I4h|D;UbGK|pNW(eUVi;%57os6^XI(Pqf z#I>2EZeK61-xyBMC{&hA!TaILZ2zYgKoc9bJK>TDq3et`hiwC$puU+Udt6Wivm?my zTgc~wg4oT(sAsZr)LED%w|nn^j{D=N(HYf`K|XKy^U+6rsM4xjS6}t__lIl%uouLQ zUh|FKED9X2Q-4hhvsl?>f>j+@TZIgJQJHMv`wUHaMGch!^noE%(w7cKls$zd76bw^ zMuol043Ai8*xLX$IgY$LnQo7=xomH5e^_gGxh+w#fN^HYqPki|K2lTlIaS@n_gLD& zc-UgVU{*7J%F8RE{`RD#W|uu!?5(ej5Leqd`0bq0pt&NQrU0rF#GQ-?)w4xKMbM*~ z7l|+L5X;hOy5StDxqYW$vwrEgASZ*%NPXqKl=YiejGyM{)j()Mtxl&2Rr4wizm_4@ zu(NnkzE`+@Hk@74Pk;4G85*H(=+QuH0ay)>cx^W6ts+KGe z=_Kf0-<&cnX`r~anDLXg`9OcHGkN(@^ubYfF1xrk+cR96fX<>HeYF4Ec!ktqnYTXk z;&1pqtEibubn~WaY#xK|{U%cl*4Oh0*DG69Iki<1RspRkzn<^XWzJ&5jPE=?{X}SZ zV5{SVP=LCKi9=u-86HlQ?>L`<+}_jM8(l`#tc69${hVJ=I=|9{%%zA=ho+jx z^XHGAYe8KByo+U&ft1u0WV(jtO2{etvi0Tg2m=s$M_YnC^2jBkIJTqEqU>qJ3XI(L zYZYEnb$@5OLVGgF9KTWa_ebG3RL#8E0a?I3hpk&jl+S>D?A+~w82teNcT<4XbSgfq z>&Si2{E7-iEeLJU(utD2?Ewo|KV;rt@=>+4T-+ob=JSV#4-Gq~M&t;~qA%;l{=&`8 zScD>3)+k_KXepdqIOJDesGPxm_MAt+Lh0{IFZZ07GUPhO_u9&RfM+cNb{1fCcgcII zLW>I0{8z6ZM*6dcI29e;fbfFintbHmDlpg4fQjc|99dg2=A}>ykp(M#u6Qh51pmmhzQ{{-Kr0TxThr3{GXH+kq@PBYfoBC>b zW5mSML)u{;*do~5gUOWUU;cUSxTKlyUpAYm!Hd=3usrnCd%y;FT<~;wwjt8erE(d| zXh7|j&4Zy;w6MO3S%)3PI=_ctjD_MhpMS2FbU+2g1~R86XTWPKyt}<0^-4%uh7piQ zRT_Z;N6*T24pe8d;oLs%T$|IJoy=nvGD=`i$Ds~^g zmX?-&B-^t;2uPcd(pRtJp!#~to>Rl5M_)F}@$K&yKNbtBDPfF3Smuj|t!I79UJG_4 zlJ>fXq)i7+B{&}tsD0h|`az1@hcfC3InS|{eLqte-W<~t$ZHrwzq8~qPc^i;gDTDK zLXqHn)?q&VaQB0hqFnFS8~B6whieI+lQkN^uWOtwMV;|>Pn(u>ePohR%`=F4nrIc| zQMZ!cq)6%P5VC_M7CIjIgLV}3(C&z+JyazT5rdI1A7jhxnC~di7v$M{Bw#CoNoqJx zod}+_5TB{GnYDAIHn&Eu?(2<7v30LeXGGWC0_M10qEI&?W2G#Nk>+UKS^8?BZD!1q zuO1vzB!g)Ly>M)eHKh+~Q_bI>>T$B=RC=>U!MX+9q#)bSMBUlfw}S9e#4xm zQvZH*P%YFt&D*_{B9>QBFxPvIPwEB&1&U0XzB_xV{nOjLp*tByf@MW{5{5q0{-FcEnrNtCAl{SM|*%94SQEtW6**#4juC6U#S0Q8zhH{(4hebNK-;68v6Pj(WFV{J1by zi&LV7FfV@O3Mw8ad0IA8@PuBE3e(dQ7oDM=s;z8#Hs)yrY+aH6FIfc4GzxXUO8yRe zuWT|}LZ>N>*n5cI*!Mfe3Pb^vFQ$Uz5j)(jB&o`!9r^jk|Nofuw}Fq7rc;7ts>Xxd zPTNycwa72-aopbo3IsLQOQ#U!16Sz)WKm;(AZzXhZdMiKux?k8@VU?TfFvsSdwJ&$ zDTjo403Pz-+rU0hK~E8J2}H%G5f^y-E8Q(lBH{a|PKjfv>wnMjB)sZVr)OPe>_mxFCyHb8uxj>X(n;!VATB=F7181qFZzQH>`LZ8LO<#(6zW(#p!tLr`Xe zxl!+(;Yf$(ybi0-U!;qmP_Ir12nO9bJs|_)q;f?iF{l-A>No%;QOKQTEP-D)$D8^d zf+&#&6*w+o->awXWviDOBA!gTLYZcB{dHuhREBP(j4J58-LA4J*leJ(5AX-ST?!jm zS*DB;xBhMHTh4F<-W-0!Zuj=-iC8Pk(&fq#)f86ci~k__*b69GpFJ&M}EnopFHJo{uH>XQb{RO@kb>nLN6&8YpT zn`3Jym83{EA@^=gAY)YMNQ?nKnRxKvkFbQn8_7!{;v-(<(5`bZiifBUplN-_-duKy*+^p5JOZs1Z`n_ zBOXDm74?v0K_ZWp-s46w{zl3S?%U73jwODsm@B~o3KGRw5>xq3iowuujG_AER%C=IY!&%MEPC=(%orp zu7nDOMPNM86n(ATTgEct82b`>OF9#cG3??%)sz-NJy?si5-ET0%lm)(209}p@|UM; z;||313^WGe*h^S+am=vSUX@$-Rrhp%GnlUDVSC$?g=HNrB9ZD}=)$P9@O&V{t&9=~ zMP4;|tx3D$lLb~Z(+ETMm{-`=_Y_R$Z$SAn zAC!cMUeaPFL#M8PgSg!2Tl>(S~!aVTMTcgvO-}uXiTs%M- z0<&UlYDId>Eu8c`QcdR4Va@Y1=~WJ4D{3?hh!HWy#d-}UzA1eYKvGr!k2Cq{A#caI zrc=aZ|KU8wc^C}FlpKasbR3#*J;`DbQw>1sRGfzY~<9ttFzU*o0c@dA+ zSW%2V0S|PF6%eLEF7N+5qO#U`N#3P9)4ih4YzQbOc__xD+rxqyLtU9`vDS-A_^$T0 zdzs<3dxfd1@<<`$#?lZlclz(B`0;-OVlBwa@s1SvPW zbZ{;ghRq6_OLc_}-_a?7i_s>l4A0uhhPMxyy>@%1Q#L^^iBoM7s$W#|Ko~1xq**;N z6V*fHG zdrQtU-B~(K2=k}ESX)wmXwZSE&cxy4Cb53it#d@Q;-$xQPP-k;rk>Co(ct6%FnE%C zld^aU=%3ii_DvD(zzxo=0w|Hm_SjmjTb&S|{_IiJ-j)&3vMQc(Mzz}t5m5EG4ZcES zO!;b$LcsiFc=F^)Z%BWfAU$oPhHaFkPk=*k`ky3plc4-guSrkMooiixnIVb4NW)rI zL=HQ(UX8b`ta#}oTT`BhX%;$qV(6XNV-2a(4>EP${c?8SNy{@=jy#X8?Eavnt|$CD zhI_44>wT8qk)l1*te0p1oF927X7wWU$dCJO@i^FtjkG0AM>^cT{$r&>gZy+@eeqmF zM`&ubcq;CVj8R8mYOu=eq63={*q;SEHWFC#b2%wNt`Qm=gGkPb?AS1DeZ7V(enKGd zE~r=-{Z{%-7IR~%d+wG{7$f+KIUkQG16uVHkM+F|$A`Sgd)~mK#768xHO}4G`ukwu z?%ophAbXdJ;eGSUhxy|4(Ct-val8GJQKfW3PB=18puU}E0;?n&XB*@)13SMiB1l&^ zh5dz(Ns0_pNN$abiy#(toENE>nnJtG7-*WRV!?d|^q3V}Cur@IX|>`Sn91F+F>XX6 z%0+S5uD&N4%1l5#+}xQFxj3ApE-o{vLvU`f}ygKS9JA*%)>! znJn)y(yzCbMcn^-{MG3YOB@7o##_}`DM}l8 zyWlo+XQ>{iB%pW}V~l03@%Ym+5t5{HT8q6^c;j{YxA1EJ)^EV^?fSsCCRu2Vu|A6t z>u@sEpu%D2$Mqa;kFy!CHg4*@h&uZ=LGY^sS(!WH@G$ywo@@@Nbw)jKv<2a`qdW6ECdd6NCNHEJUVsyQvcYg-Z3TsX#oo$ z)V?*WJzeUkGu6MnhAFC01gqfk-$dZ;ZD_ip~ShA&A`3(b0VbM*iaWr2*IW_5$I9Awn=v$Qk!TL-52tBo#wl z<@h&o+>iXF=mOd(OG`~>|Kid%71eW>en5F>g~HC7TGbrNwZVsQc%c2M*M$k z1OLwIf89|3PZo!~EhukeV?(cl>*RG^T}9_h%B~WE;4y>4R>JM*%aC2Xy7jKcZxQlg zAAsk6a|UTE6&fp-r*;{-L++bnwSJyE={gBa8hflr{w44;s5N7(=9U9eCIY{x^mMx= zCUBch)Ni`~c9Hgs7 zB)gt|Q!g*OpKz!IgH@+N*-w0&(7b}bV)cn&RKw?7|;5NooO8};4<$2LOlYh9bn@70US5Q)H z;|0EV*&osxL&tFG%H~gRAJ*dTn3!1N244m{?~A#XkGiokU*=}ci?N+q+(PE=_1?xv z4k*o_#K#eH_NQbnl>6Dx+O6Ddnby=mF^CN*1)|B{f=lPmP=hPmS*(qV;7~}@*c>fu z9%ThDm^#RG4q8@?$Vgv$aw4Jr_EZ}hBb{Jz8yWwDXTn+yuz(zf@xQ)o9({|9>SnX> z-nG|5Ho7RNv^1)j&KjzA4(gpiLHPfr?7>IH+)g)32u~I(Bl|une+%I!|AfUG{4L^C z!a^0Tp?Mx+S`u{A_u;{MJ6E7Pdeu}3=w!;Je{OCzgF|o-9*ST@529sG=+|H4K53F# zRN3P6Xk4;FV|Urh2hHnsbHES;O`SIpDl|F*rSJl(wE2wPmyf17pF1+H>55iZMh)o; zTkd4B584x||7p8TA}0x8N$1a8yh2I#5h~e8c~Cf|A4jge!V;P!u zoeNT*hlntuEY8R2!Shd0zrMm|?S(t#R+Kxu$A}+qM=3n+hqUq2MI4G@U8A5cd}FVg z96NdqeHq*b&kUW2l@a8)gVLD%Grb*ex5_AWB5nY4__&mOUD?y;SYYHD6^n^OLrhS;29QU3}L<6|P7|fM6gQa|yyqYUTKn9X&s+*$lEC0n;O1Zr z4HI(tfyg8$kJ75X-2eQibHC)Ih6T<1M7D>4Wi3UhLEKm~9tmSHKR8uUNpYf3OG3{W z6ic2!%DayhT{DL5El{X`z89c3*C0_L4_1p$6=*Lc-R(XXrdxzfb>AVganO5Ng*8s$ z=Cn(^(n|QZ6$9Dh9rmqo>MxmV9p(Y!;vmp&^wvPX>OHRm?e5!=tgrCQ~**yMV zgM5+ajomyu4%=<%bsd7k0yS=a{ii7zqGf8;{`uZL~@%h1|~VBK%`dbIXTkW3$Hf(Mg)yD?jx zPc*Nqe&pgw`SrAwQHnM4?+8M3XX9B|1qPnZ#7zqK4hu-fk2r zNGZ~O{P>KY2x_=07{(Ja)}eW4 z++5+(baz$)8#pfy+n|fx*S_UFxzDJfi#{qdnM6RSL1`tS3vPjSpOss@`tI*-Qk$1T za^MZzCxhrw8efV}`+!^-8UZ)EN>m=K2MPmqHr=dXGMKhw3q3Lc15deGrAHF20%Yp2>>K&f*Ty--zgS<=^sR$F^fNt9^e=OAAw5h`y#g z7TsS|B_k+`S#9xZ?GtUM;A7fKWuRO8J%E*|2Ah)y%~tod`}>SkCZi3KRV!{S9!9K8 zhP{ZFK6S@PjU`dfLutO1l81S zc+1RrQd>W8`hiP|1DRQIquu`rAc2jwM@tOtwMh2J`QDjPaPyP0jvu1!c@9iXJ`szI zX=Cmnoi;D%`$pLHz1EF6*3#Z zEA>8CcG_W5m+tBA)`fh2gXH0iOlKJ@#VSwN-(2!$>B86|qmS_o=#arz7eO^?E zUp^phm;`we1z@VVs!`P}2y}-Q@GS9K!{pgJs5{3hEGv`LRd&>O?;#O=|vq*w^p!X%=RrYU> zv5C>4!hvWJBUK5P)qcL90#@)+vW91aiW;1XN#s5(B{=O@znmqT6*^vr&Kn@g#&$4+ z>JIE%=02?X^%I=ht*`zJ64q~a%UQP{$xk3y5>r`gIYSLktdG=|BgeFDK>aem(=5WT z>0)gB`Qmp$qz1Lc_+*)yGr=ID;ooh-TdQ^i6~(LgEL5{A=wx2ZqU5O=KM-}@DEaHC zxYKaC%T`xpShNjptOE3GoRE{e7y)BLw3Q+O{q|+oGD=5!^M>XYYvtGe6wzzqP)b`m ztmZHcXYRtVTFKJl*u{I(+w6wv4pqryNi#I1rGq}-9oP@YvKzU8JD$uW8nqCynh64) zZ%%`f)-^u($t5r4JDq7Dj!;3?9%12DCYs_RdL<93Gt%ldYvxLqj$$215+>FnP)y3s zK9q3&9IR8~UP_p%Rmhj4dF#K|9+Q5<+HOl$Me@!DzbkSXcQeQ2W1_q@=W9% zzFf}X*5)XJQ>Px;1{4Oryc`@pkqZIlCWsQpliV8XIK}Vm>(MZ(yfsY-9KS*>F+nlz zRSvrr7$nGvn!q!NpbANLsv(p10ej3UD=YI=zjGc04*c>?2AZJjm=+PLU+_j zJri03vWAG+n8KlYghye?;u8=CC_+?Uuj%3A@}b;ofdfypk|3dSS{7#CEBTtuURTF= zs90#)uk*3i=_R~ZPMnA+zfjL4%b_$r3L%aIC<>%Ik|lKnP|=)4*pfxqZFLZ&vL-H+ zT!&4VvRNk%)t1&SkmHI(oc{$OzXc0^+;*>aRAPT^D%)z(O6jPqlmhaqjXaw#)xhj1 zhm0nj{zp~T`q)xO<2ie|wPq3d`G>*=Zk(fuzLav8z^&g8)+m*zptoEo>Rylc0k7j! z0N@F&s4#2QRfl!Gi>%74c0t2zWwfzU#yJV=Id|vKqHgz|F&|jI?L` z@?yx}A45%6)ofA`NP}BIu_G6H=0@FleJ~*cv;%;NLfBbs)zcB*eE{)I?&cZ;v8O|) zLw0Z9U2TvZTp%Cpl#QUCdkUp6<`OAKKxZ1#tby zRTNqb%!3rtL>#|-X~@TC<VpWP$H@H=j#ajmlYhRy!WnSnC|v+e%XLk;5&H zLdH3b>z`W>f@)Cd?RL@(XlTzKJc9_hIJw|RA96YY^n(aQ_zm9v`P~y|s1xv?yL}lc z+QUJOH+L7nP)_fJ8ZcS&S;pq;;>6Vzh63dtl z#ets~cii-CEVMBdmX`g|Q5F6D3PpjTbMm(@Lk-4mXHf3;Wf!dDU6M_-Cw1r3sRdJO@;btjU@@e{htKggcQ!eJZ3F5M`dN81m2d4r!+r< zldwn@v1FiWbH3Zkm;#A7WLHliuUVy^Ys!R~Mq6}68>pfa>{JJ=x~{7tzh84$-`G%B zbTN*_rjD=o+C>;HN+irI-2GN(F2vTSAi`X!e?aNhz-x-=Ba?b*C=mn8vL3J~%sO3S zTe`tyDN@Bv^gtaAmI59|)fUeEtag)GZUa*qk_5oxs(MaA|Nb)AR(+`s*^@S;NVLlK zD+f&V<)x%=o$X)QRhf3^pVp#PsML$9+_si0amarDRtE*d$j_MBb@iPpJSk4L?$um^ zcp^dMu%4|1zneXvQ{cSBfdP;WeO;`rO-bpGdIm0Lz|vSYp+pVo31cM|InkoRNK=;&^fqf)Ge(}gy2NNM z05mBy=uuS{Fdm3lFIwM?LaTpqN?kKB*Z1RMHawhWo{RH!*!aLV{lEs-URXvoYD#}x zdx`H=6yo>P)q{MULS{`Y)>|YItQu}vIz34L{U{;g?<3&|{nu$Vnvj`MRwRu~<|56r zwoP@eu$)RVSLN%xgm_PNIVXdZ-OeZ78_Vx7gyC7QZE+z&h=cp8d)NI(-+F)Cm7A8R0jToHUQ}-GcD`u>fOh(4K+zMBF^X=EkF00#5kgi!Ijp^* zXa9aA_z*IE^&ekS>?a8Ju9TOUVoblpzDk-V7EW}Y7$025t?nZf1}#+dv6p};NYR|h z^picNS`eG``sX1>Yj2G7J%K1iOFeGX9fgI31z;T%>RuOMxzBGGJNRmBT_o7g2?`nl z|1F1HoEu}xBmk?}3*PR)KczCH4>x z*=&D$Xt53FX{K2#!t(Qs4EZnbkA90eJ@+}XL^!?P5nOuYHcMOOrpc_iP3&f#c=b#9 z>g5-7OWKB4JQUgoqk3Z{ZyjM@BND1cv7@25Db~Dm!e&{jBj^oTESWMl z3cioH^jtqh>OZf|5d}!+uN#g;qapdM+! zwXa5!_587`EXCGan8*F*MV5OP=n-oDEZez$E9b_Boosf)juU)3HHPhE(K^(`D=hya zbFEnxI8i%R`Q^KzW^A$D$mtUN>48+}*U!F{74?e%UGlQ&!x8kFYu{8%vg`OY*x$p+_P003|uaw2=Z}|7b3VLw| zeIu66j=y-KN>~{Ras_8Z+|-JAXgI5IQE2>eb?~V;_7A zNtkt6eS_EPz(h5gx6mSNEM-*wbfAX_JLX2@?fs1{adsW=;A<#c)sOowKRupTQ3)&x zYVD@mqTu-YXNMxiD*n-`hMH4@c@je}Q|4bd)S^RcHs;*jTA@r-db_`Hk>{{R>pZ%L z*v1Gd6qTQ)^h^)}9WzWxAmM|;YhiW!CwWX*yiiCimBu0v;-0!5*>2&Vjow=R4naMwF_Uzej&z|$0-{a$~Zy0ZDlbvbR z^kjI*;U2K2A~mn@Kf$E@7rpS8!Qg+Q&*qh-M@N@ETI*md88wBBF!$?ykcI#+pLec{ zpT>UVUEX`IJj)Fsjdx&0@yXES9`&MmMVE2(mtop-zu3aGgg65DU?b^YqZxeT_`I5nVMlzL#L%RI4g zahvVNA!wwOrs3@J@73;oMwOW{!C+T!xWM(Y3eBY`=v3 zYb$Vzs&dWXhot}mA7`Fjxno0W9kd?^H&gGY$igp*0t7D@>$l;}ppsShX!tyqHxPr* zk14ZC96pEcA32E=-$D73-&;&BZmP?hHuD7Zme+rlzQh?+>9e)tv4^kO-UqTF+`Q3FynaNykLZ;?A~o*YXW+1$T`#Q zORiu(Y4{vacKYxDY_vqX6m_Gkq0tkE`5TFGHxlOOK%3hcAT>eTi(Q~6$n%3vwRI6y zgTe#qwvRjpn+SOSWDB$A!;F7Qlk0ks>cM{iS%zS`e+Et$u!Mrjoh|xp5IE0dIKBpt zvy}cqSj(tR=9z^TFPdjS+JeTUjSh_Qc@VAQ^!GTC-pkpZ?xga(zXD-)%C?9kvAPFK zpa<=j20QRELNNkP9((sF0DNDZSk-O@3IJ?ZBs9R^VhM;1`Pgt&ue z|LiBEUEpdLVR@Gt_;?A}u#^B#cld(2gUp?IFEemTN3+6G6kO9?wSxeH~{IAC-5Ailx=ph3;DcdAk@Hi zt%M$xEUm+(=kd6SdZljhRGEgB_Tcg5<+rF#Q_|nsg3(xYld5F1%V)2gWI54#@=vAn zBwlPb+Y-ptgz27sdSlWD0B``W=0X%l-99$rx4#p~3c;)to$VBP(||PymQzk3#QCX_ z2eu_F85f1BE@A@ZbCcq+$`)PfJD2=#PqyZ8`UD78QRC$h^5H^=Xb>wZh^&U3C^RR= zOKvYJDJ)duAd;|71*mOANZgaR7=jX)Y--izm8*Mts_}h@ejmssHjiEgA;(Zr)}B^i zW{`jV3=bZ}8&HF6u39(cN_vx}j=Fhbapd`VYeCkwZ?vptXfY&~$kp7j7XlgNtbq}F zwDbr3g9J(GEP9dlDyb&A!0tt}$;U`!Z+FYGwE#;L9p*FICYWI2!S7UBX+1TGH_}Pp znbCtGFH)@Z>2HR{8fQKtXh?ya&7<3A;*rL!BNeV;3_K6pFkQmIb2oSNRqomlL_u<6r3$Y5`gw%y-5a9a`zU#aLJK^ic`Wiqa zXwDMGh3=^xI9d-V(G~ehOBI(R{mSG07g=NZU2VsIM zh>gsQMvYJn2V{)P2D36jBJ&PFDuGwg?TT4iFk1^e=8=TZ{Z4(pPCSz;Lb1C1KsioR_{WebyRhM>dv9q zQK!J<9x@5zy#jR6Ac(whCIqTg>1;ab3R0ft7E?QY-mH7fN zIY5t9Ehbh*b6`a8-U@)EVdkAnloqOQH*6(^>&9y(Rz6!C^kF6QFT%KXD{bqsNwr<1D@!p5RMj9N?B}aAz?k! zx_s3KNvGF#3LMH?yaj8@@}xOTmo}I^-3D{kCZ|?}WyI86g&`iVF&nF&t%H~N@fVQ2 zLR|FmsZQKTzKOd`@!|*{-qdi|xAdLYBC9o|I%GgDt^^e(BkA>FxldI=q%{mKl?U+7 z6^yFrZ=&4D+kEB#%o~*x&&AK`WV%$iLTsWg7MsPRdzEfBrA*E6nexN)hf=lX-$9zH z?70w^`R4Gp+ph>S$;$SlwbMK5MlL^6{5y5iP#4Y8+z6J;ryMi*#U+ZWQd)O;uoh2Q z>s_kGV;Jt4XWmXJX)SP_&F2xq7p_Pt8hna35@g+s(kU*sKT$kf-J|XZ#NpeRNX4&Q z<_w;JOCi@({5sv2AuDntfTlgt2{*e9p25lRT&BEskWcU!)-`?iQ!^Ugb*+=gguam< zRE5vsM~e!9m1YJglts*b+}l*DUQwK251}B)l44ZwLh}IxhH8pi*JiklMazdFxRCmX?4# z@k)2?VCr6JYK~NgzmA0DS-j#(^lKu<=9-Gx(cip4LFQC(Y5yU3N{ ze*SnJ%h<@tQ4IQTG-|smVD1n>JdN|xAGA<1PSI{spgc|s;Z-DFmGY`~>0Kby1l4V} zaiNOA74`BWP$bTw!ulMaE9?7)r zDRtWnTBvlufsGB3B#@?OlGW>D|G6_jMqJ}^;e&BPPaY6BE5Sy34}e4olsR0tW5ZEn zC};^^TYshLr`VDoU|0TpE9Pva@aec>7I%;pl|b%fOMmL`F9tAyb+2}>LG@ab@H zGU(2J>B+DaQJUBC2QGKr9#S!5lQ{C8YjPNA9MGdQ_1LZsOX67DLtX2#5>f*mnk}2? zjfb~xOb!`ap$p7df7{PH-_;iK7HW-i;os`{6F adS@B3R3@iiiy&daFk&P9U*#Ku5B&$>v4Ii* diff --git a/src/skel/glfw/re3_logo_red.svg b/src/skel/glfw/re3_logo_red.svg deleted file mode 100644 index 02c8463f..00000000 --- a/src/skel/glfw/re3_logo_red.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/src/skel/win/gta3.ico b/src/skel/win/gta3.ico index dae70c373fb2d565608677d74f60ea9d19f00281..6cc872f45d572d9948b4cf8b27e38a539be281fa 100644 GIT binary patch literal 176959 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 wcEvNQ((F9;8OySo|YlJO4B~#KR4TxKmY&$ literal 174425 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 From 1644b073a4902c1dcffa8823926420ef9c0d8f9c Mon Sep 17 00:00:00 2001 From: hazelnot Date: Mon, 26 Oct 2020 10:23:10 +0200 Subject: [PATCH 03/46] Replaced logo with red version and moved it to root directory --- logo.png | Bin 0 -> 24957 bytes src/skel/glfw/re3.svg => logo.svg | 18 +++++++++--------- src/skel/glfw/re3.png | Bin 26360 -> 0 bytes src/skel/win/gta3.ico | Bin 176959 -> 2238 bytes 4 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 logo.png rename src/skel/glfw/re3.svg => logo.svg (94%) delete mode 100644 src/skel/glfw/re3.png diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c64fb1de752251c489d642ca635013d5fa4c5b31 GIT binary patch literal 24957 zcmeFZcTiMm_b$4XQAS0X`3#7N=txoolqev@NRlkE zQ50x$&OxPtCPUNYhQ4d#_tm{s=bjt>ICajc`cc)@RPXeL^{(}-XFczJaa&#K@WE3D z5d=Amx%HPOg8Tyi{(}6vAHMLM0*~SAz(2S2oe|_n4f@$rhfOz!AK6_L@49GVEnVF2 zJ6Ry^?(Ra?4z|u__y4gF!a7++&tE%*AZHQGU)QxgVrGXu-x^!omtS0n72JyZ&FvQV z>nDPjc%L8#Uta&^mx}}YrUw$bi~DSf1~k)qvRyyf*jFF_>(Cp`>&5k~{N_yO{&*tG zz5n6sK!qNXx#j#q@QXqrc9D=sZ_5dsTx&?(fd%h{t(9OYsWtCbPmR6Mxc~b5uMzmK z5%}M11ZLlBw(lt$d_-O#_@q)!D?~g{&3CP9HFT%TVkG#imGiS>va&HfVIf5r-G~rZ z;*Pg%zJquEG?|>TH-8y_N%>hgK{h(%P6{WU5O9$%sgd-S6VDZEevdG~eZ#$?P>A%J zQ@)pv-Dqi%cC#5HF~9EVO;D4;IVcYdWv{wP7%86iYw#f z5@SMf;Q{uW@^y($B4xbnotwnE)OML2Z(jn=T1JQm!{BCeqhGsMH~LPNu{LC(La>*? z?W}mJYVEA8FV8qfiuXIRyoXzI+gfpF3dF_8-PnU@Ck0|~k>rSRazqMw%87bc%9H+t z9QmkVg?*W@Jwv!*K){HTY#T@)xtV9zMYFznw6P10lQ*~pYzU^syaI%4cht|QP`?~t z7>cw#zD5ws(%=mxU@*MlxaGTrc*3(knf|O34gpLLUZF!rId5W z5G2>Zo8YfPs^}rlbFXPHkGrq&csppQr(@JF@$vCWT~p7wZ)I|c=T!qqHiaDbj?{X@ zzPu@7SXK_2&r5W|@e!!%yvMd_nq?+~QVHxM%~#3O%!kKyV=HEMt8 z)*BQuE6>lD#wT^op2KvHG1h`$NT74uKdtW3i!{|~z%)N9Hfu9fAw_q(amlx>gmags zgwoePn%~c`ch=rKyAM(5^*&3|!Qi^08~nBi+fgCTAu$o;b?r~Y-`i^J)Tj(X6MLwU zyZKO45VVa{IlN$2_0?72*kmy*| zX7@q9z0#SkgT;jo*5w^lMR`}U4F{|EZHM!D#_b0?@;#lSdUKjr#cc<6+=t7=a*d;V zYCo?o*s3`x5wKX5oP`%02j)LkFzm<4mDXF~*{|_zHk&Id!|8W&=^0$I(ynH;$qtmZ z~eQDQ`G%F!E=p&_=7q!RU8CyuixYfkXxVyJPN)E4foV_`{d zi{FaP+9~b!b&2gsTJkp9Hv3s_W#AcIEDyY?rp-y`gLGq+>cr@~+eRt3}Q5fTvU0 z#!#Wdm**^3$**Y~@>Q^s$24k2yos6$JDWFTX~(hy19N@y+G#`1)&_Zh47$;+jjFC0 za^bHD3KNIst`LSyl&i$WHn7o=t0o7LeTa6Yle2TNplO_7uv}DjuxxnqD>kcTCe~!f z{``3ZCmf+MPHksq4x{2ONF4-QP9%fV5e})ylj)(z<9zmW`nv3XRO4bEhVZ40essLh z?Rg9F)oN@Mwwf6WwrWfYwrnKu^wX=E`svH@M5nLU*#^VO15sq>I-X#+y1ijeco8o{ z>WC(lZR#0z%XV|6vATv8D|1FIlCX1>&+=O`CS%mOHOJ(j*OS!A_|~4fGmSlUT&)w# zTul>SUlojh_tzS!s+0*g)KT9_651%K(pA=F+UK_y>3cD;GE?BW^usPjUY=vVl#hc= zXm+}B5!_^01Ysd|#O?1v+vikIj>!PoTky*c2uM3HM^(?g_5Kt z>EoeSDN8dMcRCdz)SMc>oi(@axHjBRtv`<`ZFESoS98+3u+c#y=j3>GD!+|5tr_BT zl@!m*-lnrKh-GYx(vm|&$X||%dQ5k*T%)yxPS2E2&%M*TC@F5ySi@>HR=H+5R^i$I z&)TrHSB^>v??4Q>98=}wlV2z>`gT4Exs4#@=|e*?&8*j6M=X3iFFfp|A|Yh-7G_Sb zVx<7H<7y~UF0giBT~XwLGqsAFOCx{K)H`f?M%27EfF)i^v}R=S8H@BZ|LAOukc~-+ z5XWR|tBUjFM2aC+ZLCwnz1vXumebObeKhmx-8J4ZgMlE$1vSm`@&!FfFPCS;DK&Q7 zfHk{U2WHB>dQUmmzus3Dk2e;4$M5h754#zfM9D}t3s?0W#|}o3%c963bv$xLEB~O@ z)rM&nt_+R95@l!b)Q~LV_h(|cro?h=X<`iBnMf|LE89ym8#W{hYD*7C(SZ5m>mH@O&BId&%TnhyPQ+co=S8V8&LZ??Y|A&ZU^N??GG1=&3?~&8iD7qBld_G83Xkm- zd%cTuadYEjZ;YIMO?8~go&*FbQz*^2AiPaW)0ebT?_sRhl^1z?NO_8oOj~a`On;kE zJ`{3@;3HAK)R$G(o+LUA524y)8$W2NFA2)K6wGDnO@5upX)Kd+&i_7N?q0&Oj!~ob zD&h~7oMqQn7rMZ+pwTg9yTp9P@vob)?j|>h+jCR+#ZSg>e_OXV09nPPi=e9d8f=WZR(sflR!N%NgzPCjbxX71u6 z@;bLEhB~00t*sSuKP`rkS72#DHXM!8ym2FKWPhKmnt+~VbC{mxiX<_zHYK(yrT7BL zLY$NqtWstn`8l>!B4aq$zV(d;4|{jyS~`c^wWN`q)c{|{mMA4XsqE^x4+6z+e z_hHxAVba!9O{#kx&!_;8aWT{PmL?7Li#&{Q^7EDoTpx+gYW69c<(Gb|v{X}~kUF!= z&6%ET^g?}cZ#RjS=-&PkeIs=_vGe+UVf~cTsB1{~>#-lqpC7PYrn6PO7E}p$nGn?F zE?rzF7n?HtpOR!6No<`ju>JcvUA0#?7yU&ySs88W{cSb&`0r1%qGV+Rh@0Il4t=iP z_9C_bf-(zuNQveTRH&t#5nJw*p?q!A_%~MZv6YMotcb@z;rw%Emp7HaaFcf-bZ&~Z+U(|75E zmPT_Gp0S3m#8`a}{@abUf%@Co*zpZvpK~y?ZnW{}MiO6;MpaK(#1Elc>M9~Kq#aIA zT^(Jh_q0fBR=H6db*k@;$_lE$HK8|)KJCGCS(N5*Y_jJY^bwpf1=kU5o z)%NPOWs-(vr|+8Umcb46tLL`1JLN54yxq496xLApwc<{Uwh}H)7FDdK50D=XSDw0O zB9a{HQxsZ}c|KP_T+BS!y;5My#0hh1b->pB4`kmUgj8MJl#0G*zXhk@-Udw0gIjVw zcKIpMKk|;o#qYiS`aagj>G(%6NCq z%&NKJj)rX5w)|Fq*Ab4MHxaE5Fu1DAp59iyrf*Lhhg@rW!^%i0D+}1JW_F@c$Jyn* zi(w9#yB6}4RvAN+BI7Uk^6R!nA~fyia;geL&2_b$7>~${4gvKGfb;nKo{P3Nyf)ZM6@V7jaHCf>qUFuMeOcVO~=WZ7&q%zJGimh z@z>y<$TIWw)#s&G?jZ?m>|z$mM=ED>PSfKVk+`h|YVld729o3nZs!S}8)c$g_A%^x zX=mXX7IY%R`$)8;FcYuFe4DNRX}nL+-HNMQ#$MJo`wvg2K2gvRhj{4>vqVl1$WhTypz!c-=D2J(|L*7dY0De5QY0>-3V1h}(uXWRWpns(y1jE>a05GiQSwZk{xz;PI2@ad|1 z*K1qjVh27wmig^8MFr>U;6xdAx2pbPEbYTh`aOj_vO%KFH|fqn#v-eoQ6;zKGixSA zuiA3k{Dh-m_$oW{%ZIqui=I`kHk|7#oR9>XPMH%MOK z!_)j0b&lILclFVx>}q{-G`3}jL2u2NDp46^LUfWXtNl(d<}#v4^4n86a(j~Tgau($ zxuNFv_XJ3r*wVqcm~rC*QtJb@qKnVZJ5h|?Ek^P5x}YILX6+0d^Xb<&7Rm&?eb;Ns zHxCbaV&p=Km0XK#*P9}xsNelXeI}ZQ0}s#~QMhq>r<#d<^_k>s15HzEqvJFA=x}W2 z06&6wy}2_P8*v`LbSQY0NjkZ!?KKmTmZC~u3f7Xb>zgOuS5sSM(9%Sw!VNWvb!W;M zI0c;teYUx(aWax%`Ab5_3FG8=Hg1OY!v{K$HzT)sZpL_82CetEO6OnbT}TH6=Wpb0 zyt+Z=b6s26|yZ-l!1YOc-ivdf8B%Qksh6D85~y3c)=bSJw}+Ef8g0lZAti!Rf% zcN%WS5S7W(D(Eu{!;n!1?q&?mYf!cnHM;qh!)+Ee{zsa>L^~)GnON=IO{An8?o!7a zlBZ?RE4VSrhYw46w8WftTN}>xq8@HDhR`7p;!r6LX;Xa9CiNS*Xg6^=@p5V z-xRoZ9)3Oy36bh1Nkg-fh%X05pm&1DUz=YyHw{ig66)Bm*&EcF;x;nXIPQiRx#BfV zU#M2bqRcROmZp7d=CfO)44Y1q!BDy{50&PI(%*W z(l!=&Z88RRQEro=1dS#Q6Rmf*DuZ@gVRCt^K`=UfYL5!729x8YvTe%{MsNUw@e_Pu5>S_F54 zI-)#2CHS*x7gxOJBYlM{3x}n~$plZ*>w}8Z$A2D@_QowfX7^bCKBv~7B(c#57ajih z5iqz}Mr3QDOj?W&ZO8oX(?3=`TosuU%)$i?!&hc{**KXFwiEFTmXnvyVnodAUw3tP zr&LwRJ!WPVy2?Im4`|HV&Q6t}7xZwj1lyXb7X30nQTUFYUc|W@133ui)qn17uFOPe zW`us98Hb#lt=DW=eWEq!BWa{O%3>4WGcrH&QCUr1(_w-ab&91M+=b6=6E>y0yJORJb zcAeSc^OFO)q0BV&5}QJL7FZq}`3lw+_|i|WlHtrppKR=C+4l-LVM zU-VT~W9(#b$V#sORe%eYHQ6W~-NT&Bcya(u7N+DKjFb;c6plu2%deGQ^BHo)lvWg6 zz`I&e$3sHiW2XVW<@WaVy|s$>m1vdQnpL0d>h0a_ndWdbJYHPmH42Xd7#)!0xj10;H?Tqm7@GRgcGIg_U+(+WTgdVfX zUDZleB^6qCiui8Q0yrdd{=6`CWDrIq)qA127Cxz4^D1Ln8Ww}1t=!q!ib_cbizFmc zr~0iryIMR|Gm49|f4jQ=jRiMnD+>6SMQZ+ISKuj~Psy^q-=JMTnnVkBo^iNISlBVh z!An}`|DJ93~nLt+%~H;zmn{V_S2(tamy_-t;dlzMH?F%5l<>vHC|3O zE!NGzvLz<+`s4k_IWt@PDmv7>$D=t@#3)%H$IvxN(3xktPSRhKO|gnxxlhH-*%mm2hC`TlaBym6^&RNpi>p6mx@FK~y}f-9w5ZArLBJ@zSC(eB6v{>n_@YR{YL#f0?Uo z`Jmg8Gtol;pDi>z|=8g;wTDp_Yp!Dmbvn=$`JG-@rynkld|z}`j5pL$die0bvXk6^e=MgCrrw1 z^t8UWZ0ie z53hnc&R=7E6`q({tCAd_8+;YCS0@SV&w|b5tp<=I<=@_>GYyC1&)m)bXaSZx9_ZQgH^oRfQ{S=rrc+Kn zHFR$l*Iz2Z8@jNhtB*T{`%-RrE)jP!Dct4uG_K+;9)=$`pANrr@H+&d>_=lVyH(5^ znEPX#77^FhhMc9gX`RcOT)w=QX}qKBwUX3vVSFjv7$sQsH(T6!bDsG9C@h}HSZ-~t zHK}52dtT6@3;_vdI7d4??$13)n;LGlAb#9;!P~U`iiwVynVGu$HjNIe=%Vz&4>d}# z7>8Us)fDT}KiW4&Oui^+RnO!LR`_mE;?R5)SfA9%I00$pv~F-ypE^^)6E-PZOkDs^ zFii26r{AAwiqvuma5MH<`szt}=MTVy&Xt{=?YUMy8Y^zw1LopnU|2wtUBE1Ft|;>D zaq9z&5MH%4j43s8303FVnQ$YLxrqFcx4~2%!c0bQZ^Sb^gNIq~!J^yfh^W$bVfnUp zx4=>jwfsag?WTrYUqO!fvP{a!YOLo*ntb#0f=?RdWURywL9DfVMNCD`pLe`|0mGIw zEO)ctp$aqdDJO|$fZRNLftLdSkeGzXEIsC;pY1ip`?g;xGal6qu z(*Cxn~-bh-L2CO8*<$aKvLG(uxXeF_&`E*a2w$ ztyM0sH${;BK+!-@`lkP3=^xKgqG}{G>0(&Q16Umgqh#D2pt59oBI^6*Ozzs8Jnhd> z`h?`Gptf;c{Bm^V=F;D{?HdFIE0DD(JBCX8tH75*Uj|m2MEft}aqU;6?b_bV;c7>1arsIq`NuHO z^ZUWT0H5)qy!*3f=Q}I@?Zm{ypFR8CM!WS)W1YB4&2e*UL{pbv5< zY6Om@+=d?S9rBvVewyXI+$_nKFVrR;hufUGw$i1gSl8z}?qmWfXrdMpTUf;wr@;~< zb^&s%)zs748J85HyT=lq*X=1TEF_P3FJ!NmDfE_Y&6mFl`Y>30NuMymW_n3_e;Y=v zRW90oAJ%5*PRg@qG?{OHu|W|bOUDDWPJ(IgnP`rV=sAc@K!eZ3c!X&VB}$ZIcT&aV@ZY)V5(fJb6NR5EZTi{i8$XgkS@H;(f^{utk64iXkYcsy7QD3 ziPg_$cZhBW{XXtR{N@WEv?spInWW+=9O1&IaXOVgYjm|BrM4OStVK^%J&JtJu<(ZQ z9zaM^QvYQ=B9Ga4UXl706L)HGnqhP%ovREpQ~Gv7?t23TW1f*wi-#tp*a zG4l=T_;EwqnrDagOB{^9_Ar&{VTF)W-i~hHBv*<@CpX)Z203$82IAY8A#NYkBpqEJ z@hQE$SbkCetXq+N;|*cQ^_kNH zU>tKOzsB~EJ$~`6U7d^FOR{mk>onMH zOc5=AbW+pT*XGo~@FZ3N%uNx@EkQZ zY3?dX{9Od6huw*F(7E+zd^^XX$|&6S0LO@@Oq&wgDe^%iLDUP1ysrwFh#8VQauEX; z5M@mHoPucraJ_9k*@go7>fq-Ud-lMC80safKW3}3HrZ`3aW+_1zkEXoHV}3jd{>pw#P%z$5&!{WD3{g6eL`NpD7@+q4MW!2TMfnCDx z?#;kc-PyJ%(1z61u3_A%B!`J+f)W!051Gnc10m%v@NJHAFlM@qD3r)-%@#nROHao< z8%&#b^_g9?;G!eDP1nV{kXSjcTlT46zyI^^tJ@7n9i_!D9(c_p{? znfLtEPEo?k(tXJ0YsazL` zS}6IVa2)ct{~2HD0@Co@ZnIWaU;gtg(h#?26Ce6>nSftC1n~<=fBQWxR@dbhzxU%O z&=&shV}M{D2!iVc63A(5u0+o~TZzlJ@Q)b;`3g>6fwj=CKR?E6Is?D~viVyHqQI4Z zzvfxuc?5A$E?7QEamzvc9Nb!=#4v}&dza*P0?je#P@X;5yT@-h&;IMntaXagtDx(w zo%z;UCUG()l#^|f7XTt<--UXYZWh25g!U_lA!1yeC&1MvTm-9tzxRNM|8Kt%6kJ_b z|K5jqWef}?9(B1}nqrY=mSR5n*!Kw_F9jy%BbTK2A_{3;M^0(GJUJpDDKYPoCEmYr zj|=cAf1BSPrk6nwcQ1%nF1`wYqNAI%uCkk4->zE{`}@oDpIsZSf1{{G`2c>%T{;y= zzd@E$V*E)r11~~z71C&fct+xRms>Lv&2uLZj7b)t7}TxhkK(q#n306eQ>()zlwUdX zfwXX|GYkscCRE@%H{e#M0=}xO@k-rkEtg*qKXsIK7Mrbf zhhT3$`11H%kR;riBBYh3F1Xt`pDzT78hPZ-;o=@;|8#c0)B=5 zoo~6C1TEE_cU5G>RqZE-6mCfWptc zYB^R>2~G+99qXwwz1EjRImubP@y;K{NWo32QO=S{Nq$80turWQu`IifV1w$`-<#vjPk>|AcD%Ds@fWe?r@N4 zi+};X_^tkYa8pDTEhW(mZ2KLTbWu_=gQO6(4;FIY=QvoFGL!Cy86@^Mp5#uxUDYG77I1R`AF(Drs z_k(sx7RZr+?E-m~xwdz311I5OALsI5hDyi$_#WRkU{*}ZDVnLOk%W?palwrc`Hc|O zn5%h|TR`sEeY@{(u^v4d(+=qhy9=!yuGh8AsmQPV9^ONK_V3JZ?!kix^`RHEL|mu4 zRAZ&Zu|8uQ_Or|g?V$Mfro}hl8y0O%qd#e-S@vB>OTItq`zlE1cT`m~KhD5RG~d#N zf`A6t;=16CXDp;S0QJ$v-o<(w^T{0|FAYo0Tq zFEG?WG9tq%%+srLSshKA*9AEw9h!o1v?Mx3NnSZayWyPwX~I-zniUY@QUJ&c7&}{R zoWCRA)@)3Oa<;iu(8gH%ll5hbsW?Fx%zR=UKrNnrtxgQTasQ!A#QRNVqc5ad)E zQwMspVEG*nSl0{Om>^(RVjOGPfg@ZNweCoMbaXE=`kVDVqvjeI*5rNDlfBc<4ZUNHC$v5O}e_plYLAvQtiA)Ghf>oAwTW&eB z)tpKuMP4zx3F~jcVrz9yv2HK&z_c_*4LEI6V;{#8#0havTBsJP_z3CgNepp)b!9Ss zbYyWcg3zn?lS}A3eCWib`tp&LoYO9C*EcqMi8;SQ4ana~N*HQtaXxi2)MZRa{zUoc zoU>vzMSf>2SsPsmQfZGIcT;D!-4qa541WJJUJo29S9*RLH!5A~a3{*Ja(dfI2;IHy z5+l?JN)=bg>2|sBuxU2soMphX{MZ8Z^aF z4>9=R{*9KaV*y!r^We7NmC-PDO~To-IM>7&B{bY@%1x@fWD6Z7V|{|Pw`WmBm`?xViDaqfe-o=N0xu>g|( zD3O%mr84sKgNheI(U6I94X;o*>_8c~Cs4>n?8x$dam=M&V9?7^D^BKnSU>g7+Lx<9o-Eh|flr&0nLAO8b3E^9C z$>Q}?+n00<3c0smb6_j-C}7gD`H*1O(YWMsX=dXnka-R*I}36tz4qTBR9Mt7=o;<6 zOJ{+WbMElM7E~7hoxGtiz8+Ax-fpV~^UW~^l2{?=K%x6S1;Rie=?u*HF_`g(XFR?= z+=U$gmw2MNa33L{Ys$OXm5*hU-ojV}z!Mc3BZP%_5r*B2#pIP0vjK*WDN0eq;#M+E zcVUfIlvlr}Dqy1v-97VQgaJ7)*=VN=oyHq}0w*o3OmId9ra9sIT=U7>8T`8`FPdfk z1Qb0c9%q&rgXPPYWo9-V=nJBv{d`X@*%9vTeIt00|IMXee*5&t3HRh;g(baQUe*&U zdBOHs#V;Mh>5So6pUC2~&L;Q!f|N6tlc_zR%{q zdU2$4Yvk5SSFMc#zlL?;b|YI? zK>G8UDL_iYJBGFwyHPie(9Wfy?NRt2*Z%*P(YlOeLjiZDHy2xPE4xWaI_$}ru;C)N zqa|1Y{LPN=iy7+$t<7S(}-0ad)>Gs}0=VJf*N~;64^u z>Q18+f+6STYJp$uZfU{!9!49$)U!G_Sl}>R2AGyd5B3;z3mSqyrtSHk-24AEOzgjz zqR{Hs=WalDNP7qAO5*w1H_9Os`%UyktI}*`Wh+}QViszyLp9>|-t$U9kYu*`4-5_h zn~d%Y z$a}~a_df<{#4+GaZouI)kavQ6-MnoG!m4SLlAL)(#E`IZI6&)HaQ+8Q12>EwZoBW# zsq6AYR>ZC$6r8p11CJ2js=l4ihg>Ja%v~QR?nb4(%x66Ab)FGnsW2)C_o|65{D_$7 z7gVN|%FMzd3raEuxMRU#8L7SZ zJUZGF_@6?K5&8v`4d|kKV=24$UOnh0iViGr9H|)kKnl^awiS@Bb?7g)(WzXTm?DMW z{F%#gr)tEb(T*mtk2c1tMD%dghGu-p?C-)g^>WYw%}L1{xTyk8HhurI$W z9pf}x)6SeSsHzw_2+rp*TK>A@^2g!@*agc-#yk@_Yuzw zvG46q3_-ktndUlk`8l|H<=x`uk*nYQU;xUkM=CslB++6v`R983?|#GD*0zm1T${Js zueh0JhpVw(Yn%B<=(1|S#0DB zsy!(u^Y%M_CO-5ruGVNMFD07MGVh1*Sy4ynYS1+4BbC$d3j?`K!QS(Ma><`7orEz6 z*_>o%5dqu%m&}jn=c!+Xad|Mo0#~Qglbn{mvaxX{om*u*maku5tAv6V9Jn`9ky>?c zvW&waT?VV-fV~~M=Q_A9C$5cpC2EU%RRNrpYmLRWLd7cN_wzTQ$az22XC;$;by^Sf zW9#DQO}7RrHXBWaq-#z3F?&AP-K74Nl+S{uH-t>>iy)e)3OTBN^&N#@fdDiJxeR2? zd39$DT|%Fo$_Mgfv&T@>oUskHX>N9D$G?LBk{1@2uyI-h+nZKOLzSO6LYUzQvq%6W z@fsRHMk}$9xu!$WKSSqYn2~F@4q7>W6{Pw6yH?sn{YdOdkE@VM%;;0-|ahNG|3AzNtKbv=7ix;i=tKpI^_iH7z&2fK0f zC8-|+ww*urrrdsB>^SB`J}hbe_co+ghlS)&Y9JG7yK*b`@G|#C1hfhZBB+>#JLL z6^IMW&fu4Mmc7~8eX51q5uhXCHNZQ3hFrfxdPU|SvJ^GV{Q(6qw`sI{OzehESqoA>K8n8|S z(ciIW8nICr*zzI?n>LRSR|f*TTfO&>zia*=Fi;!R{Djr#tkQ^wS&;W?|7novuuFJ4 zwdbAsySb=0)tN-_QrRK)lN!KWo}-Ys`rBpOo~))QaRF4Zc0$-B1{Lk0<*0d(8);{D zCyrewo`fBdBh>H`GAi;znIvGxQz^GnblF9?$6BQY&`;6)yq&?v%QJAbEq?K_oiBX} zy_6jyCcF1UB>Ps7yE#a}cBB4zag*%uFc26F^MsKz4=an_gLI4H4As*{RCx)8W!LxN z9IHJ2pLuYHLofrV0w5nmH;LyzJJ{OVHh%Z#iW>`(5dwvu5s)?^k`><%=aA(UbOr`Q zyjo%c;zarUjhryW*#=?FuTEHWCMx!O^cwejtPN*4^lQ4P_St98&9QqnU9py*{}|w9 z%`xl0y701yv6XdU{x7$*)=BrNtqLH$RWS9g+X>Jiw#bcIe6t!B4$fiSh8tgJ;ts9ucy(8nvn6^nnG zfTMMBaWMy3+!TdUkLEO>A#`zd<-q_av(UBIP2bzw`xy&6fg8=637owj`ar8C3Nb+S z?d5Yvc~$GdxpwwUjNM_^hJmKK<~G*%R?d&t7zhsA_LzGsDFM>RhaxAZyo@w~Tb4tD zTUIthCv!@lSoMiyZJE6_AFZ51C@e~GrBSpE3_2w4|M@I{i#Rs<t5OB%J z(Bv_4Udq(J;iB_DFB+(oS!jB%B0Sum&(*A+WB*s2WeVDWd({Iw^kvTyV~*Up z4Rv^$%+Dh&%b?Kg25G5`VR07E#)I=zmi@aUu|Kp(e*Jpf=6aobaaJaQKGI}< ze;*83fv^f~1Q0JW-Fj{2_YK!)-;YQa}nrB%u*ZIaICnaATf z*hD7XB%jIxHVH@(vu+!Gs8AF~DS7L#~eanH#n^7os6aWtJqsUw9NZ5f$@Syskn zVfwQCLIb=EU?DbSsJ%5$84xBMzu^Mg*Xu^ts_byEkygJdFRH>;-N_I?dGXLL@6fi; zW8`grMsEJ2@$iPJ9%jU5l8D`%Sc;@9hoohHg(v##&Ps>joNMN;8cq#afIf0wd$Oc{IMh zEZSip*55vzXIcGLRi|m`y6~>Ktlo83QqrZ5n@()NHa{>>W1JC>eqU^i^WXW6lfQm& zH(~;^3s*8V;@w$btp%`NuB+0`K5o0oidy~7f1;GQRSqp%z&JTtIVHw2YSHZ|Z40Q# z%<~?VoV7kQ*-?P=ZFlsmY%6dy(>3w3K67pML)ORjA2hq6k20*L25Rb&u|5-_$>l^5 zY6H5+#Qs`~68Bt9e6{<8NDaL7ASwX5Rqa6W0#(;GAD*Cily4$Z11B;pTm|=7$l;FQ z_1umj2jO1UtE0yJAblRTPk@uIXM%)eidp_`;32jXoCng)YCw?wqM)VWu|H?Hj_Hn* zmxNv4aN1pMl@T$44f3qHE#BO`_v5c;5#(vQ{a`p-PL;HV($%0CcZMZ@XMdO^{j>iB~y!ix8mfwSGh+|M)`Po zb+r5c-jCMRk^KP%8X7&r9%krgpf<1(#gBPbagn|n^0M}3btgDk_s338H0!%}s_8oq zyLv9AMz5|qa26?3w+Di5Y)7o>+}uRB1i{-ZyyphcmIv)Sq-ky6TyGZK{1MdMX06vm zlSbBSQK0yTSPB?r{!Wi!!Td9h{2kacH#a*pn3ly;n#WW6z%oCb^^Xn>bh=nPz-;VH z3i+ei1RDwf6y1l4U%T^!Ijt$uI$m5LDM*Sp3}vGZFliJ;3Bpe0u~>J@8rT3>Ggo2- zB_7|^Sq!c(#Ap5sdD3?!nZ|{>IJLByNUILlX7QEw16;uZhr@gm+NP9Mwn$eH^}OGhdm?ID)B?lbu@DeYk_VhlB^hyw++W zWy0}=#lGI??soW48ZE<$i&><;`LRTcUAS>X`hn7gf2#MOu{V2bcA3L)P;M*Pb<|hO z+8Q(S_KGk2oBa2>o!gn%ac{4V%KJCKTvE~5%hg|wmoIU5q1Q4-i=8aW;(R5F><3Rp zx~UKrbV9H(ujyI&V?OvO?TkZyFp*A-kB%ry|DJ^-eClVNh5xZ)62aYGeMAoG3JhLcBU!>yviyEp~)xXx3^*BK+Nie%YU#Ovn5=6Oa7#spH3KB>1Y=Z z-Ceq=D;=Hz*;5og-r(_v(tugOnvMbad*F!GWO)q_xHLpty5 z<}=7jL<2{4f{2WMBnr!&24KVQ$;cjF<0Z6N}pRl!I%msM;4Pareu0P3$fGoDF|-dv8dzNZ$b*-#@}}N z6-i*gTcs@Pq*`TU7dBeVT~zWlEb69y+2Uq5Rx`LrdTW}U!BZnZdcLF5bWc;oCXD=* zJ7e}^^GL2kHh}P@(TUaRpzZLYf}d;w{?7{}`DQ}wX6#3X&G%JbXXYfU!}-+$=rhBT!;_OrHdeb`S${kE z&&4ohP;O{K(Gt0bXd((!AM9iB5H|M$svKb-*a;9&At(KgA+N7>4<W^xG?DXayQ! zxqJ{w*Fw6=$~%kf^v@T}7WMS#rojP3I0;Fhy@v#IxtUeAE1lnWBCDX~;%>L9`Qffo zBvDMysst7uw+*{ob~%6ahG!2VeeZfJ>CLQief6h(6Duoa7jSDJf&TZwTbh}Ah}iev z5scH$2JFs)pHC_rLq6Qd_1+ka$IBTvMo5aN#9sw@2U_C;(hW{H3*Al@*Vo2YeIMP) zzH?_&HARzT1@BY<{05^BRRu!Rtuxs?oR!VddB`mSx-A5l>!UxPiX4Qw#em%gjZ8Ef zAlxLBBL$%hI@AgG4kGKqko362?n(PrxxxBNz7w#csRdR1{~zsL`BzhS7JuR)o@wha zJ+?yu0b3Iypdy-6F)RfHN?3yJv@;cf_Ju`I2v#IUmdKVgD1?fN zK_F5DOe3HegUBKz2n0hi_u-lOBYMg?`Gvgid*AQ7-{s!V{d{gV?yh?n>GH8idoK?k z3OS{MbH7b#*0|aOUfYuoV*IH*9dqO>O}QA`vx@KyP)8Vr{rZ~4@L<%=oc&OzyJT@{ZZ;w#DHfm(Rp75)3a^OEn@oBuJ@b&^LckQ@} zE&>)|gSLsN?2te~fttMM;%MuxZi^m41 z+>Hs$VdFOAjLpZSU{L^$2M9if7fwZCsRx%8fj9TZ6$;P~db4 z0NAv?@nmA2@O1)pW?FRJDu;9S2V4~mx}q zz(AVEoZ8KKCo+x`=e?J?_y^4M*;g|mNpS1gVvlXSLUs>F`z#^?LX_-GOjAsN(3S(P z3TTRd8yx&;xGsc!<;qTgnM5G0K3DkO!;hB7GA8Q7`He3>xfvtT)t8lpEYV}fD6vGg zy^WrmK^uf?xb|)6@CsfV;N!C9t^A#rkSQNx4bc9+`_!4%T5G_Ewu9K!0cusvG=lip zr@g&BsBTy>nQvuA=7H-B41CgOW^O~Luw0N1;s+G2o7HGGr&L{pcaMx4Uxa*kbrHj9 zZir3#T=LWg*5CQxh4T7Cihip8qtjR%bLtpix_M(T>mpWE z_>QWY&S%Tg7J$u-KG_2H95qLx^!xpTM^GV$AFKLKzZL`mo*pne9>>5Yw^fSzpz3CR z=BTYW`tDtQ(!LL24mSoOU5TF)B*ikTnTE`Ht(t{}dpH8t${t$zxic-9yXV1b^8?NA z?>*GOW}oGNJzl{slUPv|&&8X12hAn)WBTM?tL)4F|I*|_$&+w$CpD@6oS5Na^jg3U z{0VCZOUvYyznndwyNNb77D}HN0D0nFGitdGvi$G|Q9It0%dbt9H18HJ+}`NQOQfaI>=fVL{4ETaUBq~kIENUZV{blMoAXH{_bMH zp=K&6&E}zxoCg@7J(?QickCJNzi9OF`+%*3m~gGnoSd=8!IC`oTup+?VLd>1e8fwj z1=zsdb&(~GMD%-=tb_b2_pT6vh~_0d%??hmQ8Db}y8z2rYTCwRg`j!_&T#l>Q`8rw zm$DK85+Us}fE_sYJ>=z<7L>ukGn!h`j3+edCXClvhv#PF5AKFz;LbdtLqU4P@B0bck+{HQE zB=;8<6T3w<+~PWZI8>xPq_`RpDvVj2bh0_&Sq0M8n&6qKGhlj*a zv9f`io-XG=?SXuX1EG@QG^pLQ2^cQ`XzP|&s!tFc>_t`?G3(z06;@p2yx-EQ!ww>} zTz^;~A3%wRT@UMJjrbmdfDtkh0+@;|OC6nSomwl^g$aKX()qdfLcG%Upz4bOOE4F_rSC=5>Z=(=vkYLi^h*NYze6gecNp+9~=T!qx)Y) z*jqbLws($I4JHBrIL|EEyLtLwGI2QC%~a>0W10gDX>Z8}{Isyp-LhK4RH$E+orM48 zn8MQf=dF0|Oh>~&Ncqdo2T)RCcZHp~@Pe~rU8nj*{Cbi0EBIp0TXyt#MG*f>WY zsOr0pTz!eSP5fe8E_<3%pt?_E!F3-JjGIhgXlK?wSZI}3S1>}44bIQb=*`|2-)N6VezG&-t!;(NQ zBgeDj*;a$h*(L+&SYGsW33NVu$U{&?*@-!;CSEUSi4I$%S)uQ{2SyOV~)@ zqcmcS?@y2S1aA$?vs?x^;kZ?TJJHWuy1Ez#%=$gu-@iEu8%Pw%K^O6U+9-QmD${ac znHoeMDTI7hYk?8}%HIGlcc)t5!n}(7WA6Xh+R7)A!=ShaWL_OLD>shE88|dwyAM>3 zNNU>Ak%<(aq!SRd+rhN*j!w2Y;jUR(*^jf2%?Qa8uJ0V~E)z$>w69{pN1AkvP~wPg4reZw zl=1M-Pm6NN_l}~A!)2O!^!zn^LR<8bPmysD`S(cr^~+>W` diff --git a/src/skel/glfw/re3.png b/src/skel/glfw/re3.png deleted file mode 100644 index 7ca7d5fa1d821a520b47de3b966689574664a3d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26360 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 diff --git a/src/skel/win/gta3.ico b/src/skel/win/gta3.ico index 6cc872f45d572d9948b4cf8b27e38a539be281fa..2017c8116bb76bf612babe81eb013c2c0250dbc2 100644 GIT binary patch literal 2238 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 wcEvNQ((F9;8OySo|YlJO4B~#KR4TxKmY&$ From 984b8efccc844588d8d7ddfd94713dee5ac90fc7 Mon Sep 17 00:00:00 2001 From: erorcun Date: Tue, 15 Dec 2020 05:51:53 +0300 Subject: [PATCH 04/46] Radio scroll to prev. station & radio off text --- src/audio/MusicManager.cpp | 92 ++++++++++++++++++++++++++++++++--- src/core/ControllerConfig.cpp | 46 ++++++++++++++++++ src/core/ControllerConfig.h | 4 ++ src/core/config.h | 2 + 4 files changed, 136 insertions(+), 8 deletions(-) diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 5519d899..5f94093e 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -83,12 +83,41 @@ cMusicManager::DisplayRadioStationName() if(m_bPlayerInCar && !m_bPreviousPlayerInCar) pCurrentStation = nil; +#ifdef RADIO_SCROLL_TO_PREV_STATION + if(gNumRetunePresses < 0) { + gStreamedSound = m_nCurrentStreamedSound; + + if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || + gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { + gStreamedSound = RADIO_OFF; + } else { + + if(gStreamedSound > + STREAMED_SOUND_RADIO_MP3_PLAYER) + return; + } + + gRetuneCounter = gNumRetunePresses; + pRetune = gStreamedSound; + + while(gRetuneCounter < 0) { + if(pRetune == HEAD_RADIO) { + pRetune = RADIO_OFF; + } else if(pRetune == RADIO_OFF || pRetune == POLICE_RADIO) { + pRetune = SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1; + } else + pRetune--; + + ++gRetuneCounter; + } + } else +#endif if(SampleManager.IsMP3RadioChannelAvailable()) { gStreamedSound = m_nCurrentStreamedSound; if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { - gStreamedSound = STREAMED_SOUND_RADIO_POLICE; + gStreamedSound = RADIO_OFF; } else { if(gStreamedSound > @@ -140,10 +169,17 @@ cMusicManager::DisplayRadioStationName() case FLASHBACK: string = TheText.Get("FEA_FM7"); break; case CHATTERBOX: string = TheText.Get("FEA_FM8"); break; case USERTRACK: string = TheText.Get("FEA_FM9"); break; +#ifdef RADIO_OFF_TEXT + case RADIO_OFF: string = TheText.Get("FEM_OFF"); break; +#endif default: return; }; +#ifdef RADIO_OFF_TEXT + if(pRetune == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable()) { return; } +#else if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; } +#endif if(string && pCurrentStation != string || m_nCurrentStreamedSound == STREAMED_SOUND_RADIO_MP3_PLAYER && @@ -442,17 +478,31 @@ cMusicManager::ServiceGameMode() if (m_bPlayerInCar) { if (FindPlayerPed() != nil && !FindPlayerPed()->DyingOrDead() - && CPad::GetPad(0)->ChangeStationJustDown() && !CReplay::IsPlayingBack() && FindPlayerVehicle() != nil && !UsesPoliceRadio(FindPlayerVehicle())) { - gRetuneCounter = 30; - gNumRetunePresses++; - AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f); - if (SampleManager.IsMP3RadioChannelAvailable()) { - if (gNumRetunePresses > RADIO_OFF) - gNumRetunePresses -= RADIO_OFF; + + if (CPad::GetPad(0)->ChangeStationJustDown()) { + gRetuneCounter = 30; + gNumRetunePresses++; + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f); + if (SampleManager.IsMP3RadioChannelAvailable()) { + if (gNumRetunePresses > RADIO_OFF) + gNumRetunePresses -= RADIO_OFF; + } } +#ifdef RADIO_SCROLL_TO_PREV_STATION + else if(CPad::GetPad(0)->GetMouseWheelDownJustDown() || CPad::GetPad(0)->GetMouseWheelUpJustDown()) { + int scrollNext = ControlsManager.GetControllerKeyAssociatedWithAction(VEHICLE_CHANGE_RADIO_STATION, MOUSE); + int scrollPrev = scrollNext == rsMOUSEWHEELUPBUTTON ? rsMOUSEWHEELDOWNBUTTON : scrollNext == rsMOUSEWHEELDOWNBUTTON ? rsMOUSEWHEELUPBUTTON : -1; + + if (scrollPrev != -1 && !ControlsManager.IsAnyVehicleActionAssignedToMouseKey(scrollPrev)) { + gRetuneCounter = 30; + gNumRetunePresses--; + AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f); + } + } +#endif } } else { nFramesSinceCutsceneEnded = -1; @@ -494,10 +544,22 @@ cMusicManager::ServiceGameMode() gNumRetunePresses = 0; m_bSetNextStation = false; } + // Because when you switch radio back and forth, gNumRetunePresses will be 0 but gRetuneCounter won't. +#ifdef RADIO_SCROLL_TO_PREV_STATION + if (gRetuneCounter != 0) { + if (gRetuneCounter > 1) gRetuneCounter--; + else if (gRetuneCounter == 1) gRetuneCounter = -1; + else if (gRetuneCounter == -1) { + m_bSetNextStation = true; + gRetuneCounter = 0; + } + } +#else if (gNumRetunePresses) { if (gRetuneCounter != 0) gRetuneCounter--; else m_bSetNextStation = true; } +#endif if (gRetuneCounter) AudioManager.DoPoliceRadioCrackle(); if (m_bSetNextStation) { @@ -863,6 +925,20 @@ cMusicManager::GetNextCarTuning() if (veh == nil) return RADIO_OFF; if (UsesPoliceRadio(veh)) return POLICE_RADIO; if (gNumRetunePresses != 0) { +#ifdef RADIO_SCROLL_TO_PREV_STATION + if (gNumRetunePresses < 0) { + while (gNumRetunePresses < 0) { + if(veh->m_nRadioStation == HEAD_RADIO) { + veh->m_nRadioStation = RADIO_OFF; + } else if(veh->m_nRadioStation == RADIO_OFF || veh->m_nRadioStation == POLICE_RADIO) { + veh->m_nRadioStation = SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1; + } else + veh->m_nRadioStation--; + + ++gNumRetunePresses; + } + } else +#endif if (SampleManager.IsMP3RadioChannelAvailable()) { if (veh->m_nRadioStation == RADIO_OFF) veh->m_nRadioStation = POLICE_RADIO; diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp index cadba7f2..b56a19f0 100644 --- a/src/core/ControllerConfig.cpp +++ b/src/core/ControllerConfig.cpp @@ -1718,6 +1718,52 @@ void CControllerConfigManager::DeleteMatching1rstPersonControls(e_ControllerActi #undef CLEAR_ACTION_IF_NEEDED +#ifdef RADIO_SCROLL_TO_PREV_STATION +#define CHECK_ACTION(action) \ +if (key == GetControllerKeyAssociatedWithAction(action, type))\ + return true; + +bool CControllerConfigManager::IsAnyVehicleActionAssignedToMouseKey(int32 key) +{ + const eControllerType type = MOUSE; + if (!GetIsKeyBlank(key, type)) + { +#ifdef BIND_VEHICLE_FIREWEAPON + CHECK_ACTION(VEHICLE_FIREWEAPON); +#endif + CHECK_ACTION(VEHICLE_LOOKBEHIND); + CHECK_ACTION(VEHICLE_LOOKLEFT); + CHECK_ACTION(VEHICLE_LOOKRIGHT); + CHECK_ACTION(VEHICLE_LOOKBEHIND); // note: duplicate + CHECK_ACTION(VEHICLE_HORN); + CHECK_ACTION(VEHICLE_HANDBRAKE); + CHECK_ACTION(VEHICLE_ACCELERATE); + CHECK_ACTION(VEHICLE_BRAKE); + CHECK_ACTION(VEHICLE_CHANGE_RADIO_STATION); + CHECK_ACTION(TOGGLE_SUBMISSIONS); + CHECK_ACTION(VEHICLE_TURRETLEFT); + CHECK_ACTION(VEHICLE_TURRETRIGHT); + CHECK_ACTION(VEHICLE_TURRETUP); + CHECK_ACTION(VEHICLE_TURRETDOWN); + CHECK_ACTION(VEHICLE_ENTER_EXIT); + CHECK_ACTION(CAMERA_CHANGE_VIEW_ALL_SITUATIONS); +#ifndef BIND_VEHICLE_FIREWEAPON + CHECK_ACTION(PED_FIREWEAPON); +#endif + CHECK_ACTION(GO_LEFT); + CHECK_ACTION(GO_RIGHT); + CHECK_ACTION(NETWORK_TALK); + CHECK_ACTION(SWITCH_DEBUG_CAM_ON); + CHECK_ACTION(TOGGLE_DPAD); + CHECK_ACTION(TAKE_SCREEN_SHOT); + CHECK_ACTION(SHOW_MOUSE_POINTER_TOGGLE); + } + return false; +} + +#undef CHECK_ACTION +#endif + void CControllerConfigManager::DeleteMatchingActionInitiators(e_ControllerAction action, int32 key, eControllerType type) { if (!GetIsKeyBlank(key, type)) diff --git a/src/core/ControllerConfig.h b/src/core/ControllerConfig.h index 92017a93..d3c2293d 100644 --- a/src/core/ControllerConfig.h +++ b/src/core/ControllerConfig.h @@ -188,6 +188,10 @@ public: void DeleteMatching1rstPersonControls (e_ControllerAction action, int32 key, eControllerType type); void DeleteMatchingActionInitiators (e_ControllerAction action, int32 key, eControllerType type); +#ifdef RADIO_SCROLL_TO_PREV_STATION + bool IsAnyVehicleActionAssignedToMouseKey(int32 key); +#endif + bool GetIsKeyBlank(int32 key, eControllerType type); e_ControllerActionType GetActionType(e_ControllerAction action); diff --git a/src/core/config.h b/src/core/config.h index ad0df2da..54d53253 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -284,6 +284,7 @@ enum Config { // #define BETA_SLIDING_TEXT #define TRIANGULAR_BLIPS // height indicating triangular radar blips, as in VC // #define XBOX_SUBTITLES // the infamous outlines +#define RADIO_OFF_TEXT #define PC_MENU #ifndef PC_MENU @@ -348,6 +349,7 @@ enum Config { #define FREE_CAM // Rotating cam // Audio +#define RADIO_SCROLL_TO_PREV_STATION #ifndef AUDIO_OAL // is not working yet for openal #define AUDIO_CACHE // cache sound lengths to speed up the cold boot #endif From b834d9258535b2cb89bd7bde3db111a74c59e746 Mon Sep 17 00:00:00 2001 From: erorcun Date: Tue, 15 Dec 2020 18:37:21 +0300 Subject: [PATCH 05/46] radio scroll fix --- src/audio/MusicManager.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 5f94093e..26f6d15c 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -89,7 +89,7 @@ cMusicManager::DisplayRadioStationName() if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { - gStreamedSound = RADIO_OFF; + gStreamedSound = POLICE_RADIO; // which means OFF } else { if(gStreamedSound > @@ -117,7 +117,7 @@ cMusicManager::DisplayRadioStationName() if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { - gStreamedSound = RADIO_OFF; + gStreamedSound = POLICE_RADIO; // which means OFF } else { if(gStreamedSound > @@ -170,13 +170,13 @@ cMusicManager::DisplayRadioStationName() case CHATTERBOX: string = TheText.Get("FEA_FM8"); break; case USERTRACK: string = TheText.Get("FEA_FM9"); break; #ifdef RADIO_OFF_TEXT - case RADIO_OFF: string = TheText.Get("FEM_OFF"); break; + case RADIO_OFF: case POLICE_RADIO: string = TheText.Get("FEM_OFF"); break; #endif default: return; }; #ifdef RADIO_OFF_TEXT - if(pRetune == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable()) { return; } + if(pRetune == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable()) { string = TheText.Get("FEM_OFF"); } #else if(pRetune > CHATTERBOX && !SampleManager.IsMP3RadioChannelAvailable()) { return; } #endif From 4c46d2498315475aafd517db81ef8beeb6e0c322 Mon Sep 17 00:00:00 2001 From: erorcun Date: Sat, 19 Dec 2020 20:39:42 +0300 Subject: [PATCH 06/46] style change --- src/audio/MusicManager.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 26f6d15c..cde1c8f5 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -90,12 +90,9 @@ cMusicManager::DisplayRadioStationName() if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { gStreamedSound = POLICE_RADIO; // which means OFF - } else { - - if(gStreamedSound > - STREAMED_SOUND_RADIO_MP3_PLAYER) - return; - } + + } else if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER) + return; gRetuneCounter = gNumRetunePresses; pRetune = gStreamedSound; @@ -118,12 +115,8 @@ cMusicManager::DisplayRadioStationName() if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT || gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { gStreamedSound = POLICE_RADIO; // which means OFF - } else { - - if(gStreamedSound > - STREAMED_SOUND_RADIO_MP3_PLAYER) - return; - } + } else if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER) + return; pRetune = gNumRetunePresses + gStreamedSound; From fc72ff24d0ca7c8dd011977930b90f7f4afed51f Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 20 Dec 2020 17:07:58 +0300 Subject: [PATCH 07/46] implemented collectives in script --- src/control/Script.cpp | 6 +- src/control/Script.h | 38 ++- src/control/Script3.cpp | 288 +++++++++++++++++- src/control/Script4.cpp | 14 +- src/control/Script5.cpp | 647 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 980 insertions(+), 13 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 67d2e618..6aa48d81 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -58,7 +58,7 @@ int32 CTheScripts::StoreVehicleIndex; bool CTheScripts::StoreVehicleWasRandom; CRunningScript *CTheScripts::pIdleScripts; CRunningScript *CTheScripts::pActiveScripts; -uint32 CTheScripts::NextFreeCollectiveIndex; +int32 CTheScripts::NextFreeCollectiveIndex; int32 CTheScripts::LastRandomPedId; uint16 CTheScripts::NumberOfUsedObjects; bool CTheScripts::bAlreadyRunningAMissionScript; @@ -1810,8 +1810,8 @@ void CTheScripts::Init() OnAMissionForContactFlag[i] = 0; } for (int i = 0; i < MAX_NUM_COLLECTIVES; i++){ - CollectiveArray[i].index = -1; - CollectiveArray[i].unk_data = 0; + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; } NextFreeCollectiveIndex = 0; LastRandomPedId = -1; diff --git a/src/control/Script.h b/src/control/Script.h index 7fc18727..91eef6d2 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -10,6 +10,7 @@ class CVehicle; class CPed; class CObject; class CPlayerInfo; +enum eObjective; class CRunningScript; @@ -38,6 +39,10 @@ void FlushLog(); #define KEY_LENGTH_IN_SCRIPT 8 +#if GTA_VERSION <= GTA_PS2_160 +#define GTA_SCRIPT_COLLECTIVE +#endif + struct intro_script_rectangle { bool m_bIsUsed; @@ -213,8 +218,8 @@ enum { struct tCollectiveData { - int32 index; - uint32 unk_data; + int32 colIndex; + int32 pedIndex; }; enum { @@ -286,7 +291,7 @@ class CTheScripts static bool StoreVehicleWasRandom; static CRunningScript *pIdleScripts; static CRunningScript *pActiveScripts; - static uint32 NextFreeCollectiveIndex; + static int32 NextFreeCollectiveIndex; static int32 LastRandomPedId; static uint16 NumberOfUsedObjects; static bool bAlreadyRunningAMissionScript; @@ -393,6 +398,25 @@ private: static int32 GetNewUniqueScriptSphereIndex(int32 index); static void RemoveScriptSphere(int32 index); +#ifdef GTA_SCRIPT_COLLECTIVE + static void AdvanceCollectiveIndex() + { + if (NextFreeCollectiveIndex == INT32_MAX) + NextFreeCollectiveIndex = 0; + else + NextFreeCollectiveIndex++; + } + + static int AddPedsInVehicleToCollective(int); + static int AddPedsInAreaToCollective(float, float, float, float); + static int FindFreeSlotInCollectiveArray(); + static void SetObjectiveForAllPedsInCollective(int, eObjective, int16, int16); + static void SetObjectiveForAllPedsInCollective(int, eObjective, CVector, float); + static void SetObjectiveForAllPedsInCollective(int, eObjective, CVector); + static void SetObjectiveForAllPedsInCollective(int, eObjective, void*); + static void SetObjectiveForAllPedsInCollective(int, eObjective); +#endif + friend class CRunningScript; friend class CHud; friend void CMissionCleanup::Process(); @@ -511,6 +535,14 @@ private: void CharInAreaCheckCommand(int32, uint32*); void CarInAreaCheckCommand(int32, uint32*); +#ifdef GTA_SCRIPT_COLLECTIVE + void LocateCollectiveCommand(int32, uint32*); + void LocateCollectiveCharCommand(int32, uint32*); + void LocateCollectiveCarCommand(int32, uint32*); + void LocateCollectivePlayerCommand(int32, uint32*); + void CollectiveInAreaCheckCommand(int32, uint32*); +#endif + #ifdef MISSION_REPLAY bool CanAllowMissionReplay(); #endif diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 1f1ed537..9a37cb6c 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -853,7 +853,12 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_PLAYING); return 0; } - //case COMMAND_SET_COLL_OBJ_NO_OBJ: +#ifdef GTA_SCRIPT_COLLECTIVE + case COMMAND_SET_COLL_OBJ_NO_OBJ: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_NONE); + return 0; +#endif default: script_assert(0); } @@ -863,65 +868,314 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) int8 CRunningScript::ProcessCommands600To699(int32 command) { switch (command){ - /* Collective commands are not implemented until LCS. +#ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_WAIT_ON_FOOT: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_ON_FOOT); + return 0; case COMMAND_SET_COLL_OBJ_FLEE_ON_FOOT_TILL_SAFE: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); + return 0; case COMMAND_SET_COLL_OBJ_GUARD_SPOT: + { + CollectParameters(&m_nIp, 4); + CVector pos = *(CVector*)&ScriptParams[1]; + if (pos.z <= MAP_Z_LOW_LIMIT) + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos); + return 0; + } case COMMAND_SET_COLL_OBJ_GUARD_AREA: + { + CollectParameters(&m_nIp, 5); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; + if (infX > supX) { + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; + } + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; + if (infY > supY) { + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; + } + CVector pos; + pos.x = (infX + supX) / 2; + pos.y = (infY + supY) / 2; + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + float radius = Max(pos.x - infX, pos.y - infY); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos, radius); + return 0; + } case COMMAND_SET_COLL_OBJ_WAIT_IN_CAR: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_IN_CAR); + return 0; case COMMAND_SET_COLL_OBJ_KILL_CHAR_ON_FOOT: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ON_FOOT: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_KILL_CHAR_ANY_MEANS: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ANY_MEANS: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_GOTO_CHAR_ON_FOOT: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_GOTO_PLAYER_ON_FOOT: + { + CollectParameters(&m_nIp, 2); + CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + return 0; + } case COMMAND_SET_COLL_OBJ_LEAVE_CAR: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_LEAVE_CAR); + return 0; case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_PASSENGER: + { + CollectParameters(&m_nIp, 2); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); + return 0; + } case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_DRIVER: + { + CollectParameters(&m_nIp, 2); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); + return 0; + } + /* case COMMAND_SET_COLL_OBJ_FOLLOW_CAR_IN_CAR: case COMMAND_SET_COLL_OBJ_FIRE_AT_OBJECT_FROM_VEHICLE: case COMMAND_SET_COLL_OBJ_DESTROY_OBJECT: + */ case COMMAND_SET_COLL_OBJ_DESTROY_CAR: + { + CollectParameters(&m_nIp, 2); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_DESTROY_CAR, pVehicle); + return 0; + } case COMMAND_SET_COLL_OBJ_GOTO_AREA_ON_FOOT: + { + CollectParameters(&m_nIp, 5); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; + if (infX > supX) { + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; + } + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; + if (infY > supY) { + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; + } + CVector pos; + pos.x = (infX + supX) / 2; + pos.y = (infY + supY) / 2; + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + float radius = Max(pos.x - infX, pos.y - infY); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); + return 0; + } + /* case COMMAND_SET_COLL_OBJ_GOTO_AREA_IN_CAR: case COMMAND_SET_COLL_OBJ_FOLLOW_CAR_ON_FOOT_WITH_OFFSET: case COMMAND_SET_COLL_OBJ_GUARD_ATTACK: + */ case COMMAND_SET_COLL_OBJ_FOLLOW_ROUTE: + CollectParameters(&m_nIp, 3); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FOLLOW_ROUTE, ScriptParams[1], ScriptParams[2]); + return 0; case COMMAND_SET_COLL_OBJ_GOTO_COORD_ON_FOOT: - case COMMAND_SET_COLL_OBJ_GOTO_COORD_IN_CAR: + { + CollectParameters(&m_nIp, 3); + CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos); + return 0; + } + //case COMMAND_SET_COLL_OBJ_GOTO_COORD_IN_CAR: case COMMAND_SET_COLL_OBJ_RUN_TO_AREA: + { + CollectParameters(&m_nIp, 5); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; + if (infX > supX) { + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; + } + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; + if (infY > supY) { + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; + } + CVector pos; + pos.x = (infX + supX) / 2; + pos.y = (infY + supY) / 2; + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + float radius = Max(pos.x - infX, pos.y - infY); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos, radius); + return 0; + } case COMMAND_SET_COLL_OBJ_RUN_TO_COORD: + { + CollectParameters(&m_nIp, 3); + CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos); + return 0; + } case COMMAND_ADD_PEDS_IN_AREA_TO_COLL: + { + CollectParameters(&m_nIp, 3); + float X = *(float*)&ScriptParams[0]; + float Y = *(float*)&ScriptParams[1]; + float Z = CWorld::FindGroundZForCoord(X, Y); + float radius = *(float*)&ScriptParams[2]; + ScriptParams[0] = CTheScripts::AddPedsInAreaToCollective(X, Y, Z, radius); + StoreParameters(&m_nIp, 1); + return 0; + } case COMMAND_ADD_PEDS_IN_VEHICLE_TO_COLL: + CollectParameters(&m_nIp, 1); + ScriptParams[0] = CTheScripts::AddPedsInVehicleToCollective(ScriptParams[0]); + StoreParameters(&m_nIp, 1); + return 0; case COMMAND_CLEAR_COLL: + CollectParameters(&m_nIp, 1); + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CTheScripts::CollectiveArray[i].colIndex == ScriptParams[0]) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + } + } + return 0; case COMMAND_IS_COLL_IN_CARS: + { + CollectParameters(&m_nIp, 1); + bool result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + } + else { + result = false; + break; + } + } + UpdateCompareFlag(result); + return 0; + } case COMMAND_LOCATE_COLL_ANY_MEANS_2D: case COMMAND_LOCATE_COLL_ON_FOOT_2D: case COMMAND_LOCATE_COLL_IN_CAR_2D: case COMMAND_LOCATE_STOPPED_COLL_ANY_MEANS_2D: case COMMAND_LOCATE_STOPPED_COLL_ON_FOOT_2D: case COMMAND_LOCATE_STOPPED_COLL_IN_CAR_2D: + LocateCollectiveCommand(command, &m_nIp); + return 0; case COMMAND_LOCATE_COLL_ANY_MEANS_CHAR_2D: case COMMAND_LOCATE_COLL_ON_FOOT_CHAR_2D: case COMMAND_LOCATE_COLL_IN_CAR_CHAR_2D: + LocateCollectiveCharCommand(command, &m_nIp); + return 0; case COMMAND_LOCATE_COLL_ANY_MEANS_CAR_2D: case COMMAND_LOCATE_COLL_ON_FOOT_CAR_2D: case COMMAND_LOCATE_COLL_IN_CAR_CAR_2D: + LocateCollectiveCarCommand(command, &m_nIp); + return 0; case COMMAND_LOCATE_COLL_ANY_MEANS_PLAYER_2D: case COMMAND_LOCATE_COLL_ON_FOOT_PLAYER_2D: case COMMAND_LOCATE_COLL_IN_CAR_PLAYER_2D: + LocateCollectivePlayerCommand(command, &m_nIp); + return 0; case COMMAND_IS_COLL_IN_AREA_2D: case COMMAND_IS_COLL_IN_AREA_ON_FOOT_2D: case COMMAND_IS_COLL_IN_AREA_IN_CAR_2D: case COMMAND_IS_COLL_STOPPED_IN_AREA_2D: case COMMAND_IS_COLL_STOPPED_IN_AREA_ON_FOOT_2D: case COMMAND_IS_COLL_STOPPED_IN_AREA_IN_CAR_2D: + CollectiveInAreaCheckCommand(command, &m_nIp); + return 0; case COMMAND_GET_NUMBER_OF_PEDS_IN_COLL: - */ + { + CollectParameters(&m_nIp, 1); + int total = 0; + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + } + else { + total++; + } + } + ScriptParams[0] = total; + StoreParameters(&m_nIp, 1); + return 0; + } +#endif case COMMAND_SET_CHAR_HEED_THREATS: { CollectParameters(&m_nIp, 2); @@ -1046,7 +1300,31 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) pPed->SetObjective(OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); return 0; } - //case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS: +#ifdef GTA_SCRIPT_COLLECTIVE + case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS: + { + CollectParameters(&m_nIp, 5); + float infX = *(float*)&ScriptParams[1]; + float supX = *(float*)&ScriptParams[3]; + if (infX > supX) { + infX = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[1]; + } + float infY = *(float*)&ScriptParams[2]; + float supY = *(float*)&ScriptParams[4]; + if (infY > supY) { + infY = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[2]; + } + CVector pos; + pos.x = (infX + supX) / 2; + pos.y = (infY + supY) / 2; + pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); + float radius = Max(pos.x - infX, pos.y - infY); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); + return 0; + } +#endif case COMMAND_IS_PLAYER_STOPPED: { CollectParameters(&m_nIp, 1); diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index afd6eba4..986e82f8 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -244,7 +244,12 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) pPed->SetObjective(OBJECTIVE_CATCH_TRAIN); return 0; } - //case COMMAND_SET_COLL_OBJ_CATCH_TRAIN: +#ifdef GTA_SCRIPT_COLLECTIVE + case COMMAND_SET_COLL_OBJ_CATCH_TRAIN: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_CATCH_TRAIN); + return 0; +#endif case COMMAND_SET_PLAYER_NEVER_GETS_TIRED: { CollectParameters(&m_nIp, 2); @@ -1090,7 +1095,12 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) case COMMAND_GIVE_PLAYER_DETONATOR: CGarages::GivePlayerDetonator(); return 0; - //case COMMAND_SET_COLL_OBJ_STEAL_ANY_CAR: +#ifdef GTA_SCRIPT_COLLECTIVE + case COMMAND_SET_COLL_OBJ_STEAL_ANY_CAR: + CollectParameters(&m_nIp, 1); + CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_STEAL_ANY_CAR); + return 0; +#endif case COMMAND_SET_OBJECT_VELOCITY: { CollectParameters(&m_nIp, 4); diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index 153f2393..c7e190ac 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -1304,6 +1304,487 @@ int16 CRunningScript::GetPadState(uint16 pad, uint16 button) return 0; } +#ifdef GTA_SCRIPT_COLLECTIVE +void CRunningScript::LocateCollectiveCommand(int32 command, uint32* pIp) +{ + bool b3D, result, debug, decided = false; + float X, Y, Z, dX, dY, dZ; + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_2D: + case COMMAND_LOCATE_COLL_ON_FOOT_2D: + case COMMAND_LOCATE_COLL_IN_CAR_2D: + case COMMAND_LOCATE_STOPPED_COLL_ANY_MEANS_2D: + case COMMAND_LOCATE_STOPPED_COLL_ON_FOOT_2D: + case COMMAND_LOCATE_STOPPED_COLL_IN_CAR_2D: + b3D = false; + break; + default: + b3D = true; + break; + } + CollectParameters(pIp, b3D ? 8 : 6); + X = *(float*)&ScriptParams[1]; + Y = *(float*)&ScriptParams[2]; + if (b3D) { + Z = *(float*)&ScriptParams[3]; + dX = *(float*)&ScriptParams[4]; + dY = *(float*)&ScriptParams[5]; + dZ = *(float*)&ScriptParams[6]; + debug = ScriptParams[7]; + } + else { + dX = *(float*)&ScriptParams[3]; + dY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; + } + result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) + continue; + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + continue; + } + CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); + switch (command) { + case COMMAND_LOCATE_STOPPED_COLL_ANY_MEANS_2D: + case COMMAND_LOCATE_STOPPED_COLL_ON_FOOT_2D: + case COMMAND_LOCATE_STOPPED_COLL_IN_CAR_2D: + if (!CTheScripts::IsPedStopped(pPed)) { + result = false; + decided = true; + } + break; + default: + break; + } + if (!decided) { + bool in_area; + if (b3D) { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y && + Z - dZ <= pos.z && + Z + dZ >= pos.z; + } + else { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y; + } + result = false; + if (in_area) { + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_2D: + case COMMAND_LOCATE_STOPPED_COLL_ANY_MEANS_2D: + result = true; + break; + case COMMAND_LOCATE_COLL_ON_FOOT_2D: + case COMMAND_LOCATE_STOPPED_COLL_ON_FOOT_2D: + result = !pPed->bInVehicle; + break; + case COMMAND_LOCATE_COLL_IN_CAR_2D: + case COMMAND_LOCATE_STOPPED_COLL_IN_CAR_2D: + result = pPed->bInVehicle; + break; + default: + script_assert(false); + break; + } + } + } + } + UpdateCompareFlag(result); + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); + if (CTheScripts::DbgFlag) { + if (b3D) + CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); + else + CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); + } +} + +void CRunningScript::LocateCollectiveCharCommand(int32 command, uint32* pIp) +{ + bool b3D, result, debug; + float X, Y, Z, dX, dY, dZ; + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_CHAR_2D: + case COMMAND_LOCATE_COLL_ON_FOOT_CHAR_2D: + case COMMAND_LOCATE_COLL_IN_CAR_CHAR_2D: + b3D = false; + break; + default: + b3D = true; + break; + } + CollectParameters(pIp, b3D ? 6 : 5); + CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + script_assert(pTarget); + if (pTarget->bInVehicle) { + X = pTarget->m_pMyVehicle->GetPosition().x; + Y = pTarget->m_pMyVehicle->GetPosition().y; + Z = pTarget->m_pMyVehicle->GetPosition().z; + } + else { + X = pTarget->GetPosition().x; + Y = pTarget->GetPosition().y; + Z = pTarget->GetPosition().z; + } + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; + if (b3D) { + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; + } + else { + debug = ScriptParams[4]; + } + result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) + continue; + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + continue; + } + CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); + bool in_area; + if (b3D) { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y && + Z - dZ <= pos.z && + Z + dZ >= pos.z; + } + else { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y; + } + result = false; + if (in_area) { + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_CHAR_2D: + result = true; + break; + case COMMAND_LOCATE_COLL_ON_FOOT_CHAR_2D: + result = !pPed->bInVehicle; + break; + case COMMAND_LOCATE_COLL_IN_CAR_CHAR_2D: + result = pPed->bInVehicle; + break; + default: + script_assert(false); + break; + } + } + } + UpdateCompareFlag(result); + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); + if (CTheScripts::DbgFlag) { + if (b3D) + CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); + else + CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); + } +} + +void CRunningScript::LocateCollectiveCarCommand(int32 command, uint32* pIp) +{ + bool b3D, result, debug; + float X, Y, Z, dX, dY, dZ; + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_CAR_2D: + case COMMAND_LOCATE_COLL_ON_FOOT_CAR_2D: + case COMMAND_LOCATE_COLL_IN_CAR_CAR_2D: + b3D = false; + break; + default: + b3D = true; + break; + } + CollectParameters(pIp, b3D ? 6 : 5); + CVehicle* pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + script_assert(pTarget); + X = pTarget->GetPosition().x; + Y = pTarget->GetPosition().y; + Z = pTarget->GetPosition().z; + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; + if (b3D) { + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; + } + else { + debug = ScriptParams[4]; + } + result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) + continue; + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + continue; + } + CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); + bool in_area; + if (b3D) { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y && + Z - dZ <= pos.z && + Z + dZ >= pos.z; + } + else { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y; + } + result = false; + if (in_area) { + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_CAR_2D: + result = true; + break; + case COMMAND_LOCATE_COLL_ON_FOOT_CAR_2D: + result = !pPed->bInVehicle; + break; + case COMMAND_LOCATE_COLL_IN_CAR_CAR_2D: + result = pPed->bInVehicle; + break; + default: + script_assert(false); + break; + } + } + } + UpdateCompareFlag(result); + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); + if (CTheScripts::DbgFlag) { + if (b3D) + CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); + else + CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); + } +} + +void CRunningScript::LocateCollectivePlayerCommand(int32 command, uint32* pIp) +{ + bool b3D, result, debug; + float X, Y, Z, dX, dY, dZ; + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_PLAYER_2D: + case COMMAND_LOCATE_COLL_ON_FOOT_PLAYER_2D: + case COMMAND_LOCATE_COLL_IN_CAR_PLAYER_2D: + b3D = false; + break; + default: + b3D = true; + break; + } + CollectParameters(pIp, b3D ? 6 : 5); + CVector pos = CWorld::Players[ScriptParams[1]].GetPos(); + X = pos.x; + Y = pos.y; + Z = pos.z; + dX = *(float*)&ScriptParams[2]; + dY = *(float*)&ScriptParams[3]; + if (b3D) { + dZ = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; + } + else { + debug = ScriptParams[4]; + } + result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) + continue; + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + continue; + } + CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); + bool in_area; + if (b3D) { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y && + Z - dZ <= pos.z && + Z + dZ >= pos.z; + } + else { + in_area = X - dX <= pos.x && + X + dX >= pos.x && + Y - dY <= pos.y && + Y + dY >= pos.y; + } + result = false; + if (in_area) { + switch (command) { + case COMMAND_LOCATE_COLL_ANY_MEANS_PLAYER_2D: + result = true; + break; + case COMMAND_LOCATE_COLL_ON_FOOT_PLAYER_2D: + result = !pPed->bInVehicle; + break; + case COMMAND_LOCATE_COLL_IN_CAR_PLAYER_2D: + result = pPed->bInVehicle; + break; + default: + script_assert(false); + break; + } + } + } + UpdateCompareFlag(result); + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, X - dX, Y - dY, X + dX, Y + dY, b3D ? Z : MAP_Z_LOW_LIMIT); + if (CTheScripts::DbgFlag) { + if (b3D) + CTheScripts::DrawDebugCube(X - dX, Y - dY, Z - dZ, X + dX, Y + dY, Z + dZ); + else + CTheScripts::DrawDebugSquare(X - dX, Y - dY, X + dX, Y + dY); + } +} + +void CRunningScript::CollectiveInAreaCheckCommand(int32 command, uint32* pIp) +{ + bool b3D, result, debug, decided = false; + float infX, infY, infZ, supX, supY, supZ; + switch (command) { + case COMMAND_IS_COLL_IN_AREA_2D: + case COMMAND_IS_COLL_IN_AREA_ON_FOOT_2D: + case COMMAND_IS_COLL_IN_AREA_IN_CAR_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_ON_FOOT_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_IN_CAR_2D: + b3D = false; + break; + default: + b3D = true; + break; + } + CollectParameters(pIp, b3D ? 8 : 6); + infX = *(float*)&ScriptParams[1]; + infY = *(float*)&ScriptParams[2]; + if (b3D) { + infZ = *(float*)&ScriptParams[3]; + supX = *(float*)&ScriptParams[4]; + supY = *(float*)&ScriptParams[5]; + supZ = *(float*)&ScriptParams[6]; + if (infZ > supZ) { + infZ = *(float*)&ScriptParams[6]; + supZ = *(float*)&ScriptParams[3]; + } + debug = ScriptParams[7]; + } + else { + supX = *(float*)&ScriptParams[3]; + supY = *(float*)&ScriptParams[4]; + debug = ScriptParams[5]; + } + if (infX > supX) { + float tmp = infX; + infX = supX; + supX = tmp; + } + if (infY > supY) { + float tmp = infY; + infY = supY; + supY = tmp; + } + result = true; + for (int i = 0; i < MAX_NUM_COLLECTIVES && result; i++) { + if (ScriptParams[0] != CTheScripts::CollectiveArray[i].colIndex) + continue; + CPed* pPed = CPools::GetPedPool()->GetAt(CTheScripts::CollectiveArray[i].pedIndex); + if (!pPed) { + CTheScripts::CollectiveArray[i].colIndex = -1; + CTheScripts::CollectiveArray[i].pedIndex = 0; + continue; + } + CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); + switch (command) { + case COMMAND_IS_COLL_STOPPED_IN_AREA_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_ON_FOOT_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_IN_CAR_2D: + if (!CTheScripts::IsPedStopped(pPed)) { + result = false; + decided = true; + } + break; + default: + break; + } + if (!decided) { + bool in_area; + if (b3D) { + in_area = infX <= pos.x && + supX >= pos.x && + infY <= pos.y && + supY >= pos.y && + infZ <= pos.z && + supZ >= pos.z; + } + else { + in_area = infX <= pos.x && + supX >= pos.x && + infY <= pos.y && + supY >= pos.y; + } + result = false; + if (in_area) { + switch (command) { + case COMMAND_IS_COLL_IN_AREA_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_2D: + result = true; + break; + case COMMAND_IS_COLL_IN_AREA_ON_FOOT_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_ON_FOOT_2D: + result = !pPed->bInVehicle; + break; + case COMMAND_IS_COLL_IN_AREA_IN_CAR_2D: + case COMMAND_IS_COLL_STOPPED_IN_AREA_IN_CAR_2D: + result = pPed->bInVehicle; + break; + default: + script_assert(false); + break; + } + } + } + } + UpdateCompareFlag(result); + if (debug) + CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, infX, infY, supX, supY, b3D ? (infZ + supZ) / 2 : MAP_Z_LOW_LIMIT); + if (CTheScripts::DbgFlag) { + if (b3D) + CTheScripts::DrawDebugCube(infX, infY, infZ, supX, supY, supZ); + else + CTheScripts::DrawDebugSquare(infX, infY, supX, supY); + } +} +#endif void CTheScripts::PrintListSizes() { @@ -1717,6 +2198,172 @@ void CTheScripts::HighlightImportantAngledArea(uint32 id, float x1, float y1, fl CShadows::RenderIndicatorShadow(id, 2, gpGoalTex, ¢er, supX - center.x, 0.0f, 0.0f, center.y - supY, 0); } +#ifdef GTA_SCRIPT_COLLECTIVE +int CTheScripts::AddPedsInVehicleToCollective(int index) +{ + int colIndex = NextFreeCollectiveIndex; + AdvanceCollectiveIndex(); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(index); + script_assert(pVehicle); + CPed* pDriver = pVehicle->pDriver; + if (pDriver && !pDriver->IsPlayer() && pDriver->CharCreatedBy != MISSION_CHAR && pDriver->m_nPedType != PEDTYPE_COP) { + int index = FindFreeSlotInCollectiveArray(); + if (index > -1) { + CollectiveArray[index].colIndex = colIndex; + CollectiveArray[index].pedIndex = CPools::GetPedPool()->GetIndex(pDriver); + } + } + for (int i = 0; i < pVehicle->m_nNumMaxPassengers; i++) { + CPed* pPassenger = pVehicle->pPassengers[i]; + if (pPassenger && !pPassenger->IsPlayer() && pPassenger->CharCreatedBy != MISSION_CHAR && pPassenger->m_nPedType != PEDTYPE_COP) { + int index = FindFreeSlotInCollectiveArray(); + if (index > -1) { + CollectiveArray[index].colIndex = colIndex; + CollectiveArray[index].pedIndex = CPools::GetPedPool()->GetIndex(pPassenger); + } + } + } + return colIndex; +} + +int CTheScripts::AddPedsInAreaToCollective(float x, float y, float z, float radius) +{ + int16 numFound; + CEntity* pEntities[64]; + int colIndex = NextFreeCollectiveIndex; + AdvanceCollectiveIndex(); + CWorld::FindObjectsInRange(CVector(x, y, z), radius, true, &numFound, 64, pEntities, false, true, true, false, false); + for (int16 i = 0; i < numFound; i++) { + if (pEntities[i]->GetType() == ENTITY_TYPE_PED) { + CPed* pPed = (CPed*)pEntities[i]; + if (pPed && !pPed->IsPlayer() && pPed->CharCreatedBy != MISSION_CHAR && pPed->m_nPedType != PEDTYPE_COP) { + int index = FindFreeSlotInCollectiveArray(); + if (index > -1) { + CollectiveArray[index].colIndex = colIndex; + CollectiveArray[index].pedIndex = CPools::GetPedPool()->GetIndex(pPed); + } + } + } + else if (pEntities[i]->GetType() == ENTITY_TYPE_VEHICLE) { + CVehicle* pVehicle = (CVehicle*)pEntities[i]; + CPed* pDriver = pVehicle->pDriver; + if (pDriver && !pDriver->IsPlayer() && pDriver->CharCreatedBy != MISSION_CHAR && pDriver->m_nPedType != PEDTYPE_COP) { + int index = FindFreeSlotInCollectiveArray(); + if (index > -1) { + CollectiveArray[index].colIndex = colIndex; + CollectiveArray[index].pedIndex = CPools::GetPedPool()->GetIndex(pDriver); + } + } + for (int i = 0; i < pVehicle->m_nNumMaxPassengers; i++) { + CPed* pPassenger = pVehicle->pPassengers[i]; + if (pPassenger && !pPassenger->IsPlayer() && pPassenger->CharCreatedBy != MISSION_CHAR && pPassenger->m_nPedType != PEDTYPE_COP) { + int index = FindFreeSlotInCollectiveArray(); + if (index > -1) { + CollectiveArray[index].colIndex = colIndex; + CollectiveArray[index].pedIndex = CPools::GetPedPool()->GetIndex(pPassenger); + } + } + } + } + } + return colIndex; +} + +int CTheScripts::FindFreeSlotInCollectiveArray() +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex == -1) + return i; + } + return -1; +} + +void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, int16 p1, int16 p2) +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex = colIndex) { + CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); + if (pPed == nil) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + else { + pPed->bScriptObjectiveCompleted = false; + pPed->SetObjective(objective, p1, p2); + } + } + } +} + +void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1, float p2) +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex = colIndex) { + CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); + if (pPed == nil) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + else { + pPed->bScriptObjectiveCompleted = false; + pPed->SetObjective(objective, p1, p2); + } + } + } +} + +void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1) +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex = colIndex) { + CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); + if (pPed == nil) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + else { + pPed->bScriptObjectiveCompleted = false; + pPed->SetObjective(objective, p1); + } + } + } +} + +void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, void* p1) +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex = colIndex) { + CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); + if (pPed == nil) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + else { + pPed->bScriptObjectiveCompleted = false; + pPed->SetObjective(objective, p1); + } + } + } +} + +void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective) +{ + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + if (CollectiveArray[i].colIndex = colIndex) { + CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); + if (pPed == nil) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + else { + pPed->bScriptObjectiveCompleted = false; + pPed->SetObjective(objective); + } + } + } +} +#endif //GTA_SCRIPT_COLLECTIVE + bool CTheScripts::IsPedStopped(CPed* pPed) { if (pPed->bInVehicle) From dcb28bfd53bf3512ee59c1124c8ac57e619193cb Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 20 Dec 2020 17:12:34 +0300 Subject: [PATCH 08/46] fix --- src/control/Script.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.h b/src/control/Script.h index 91eef6d2..1c4663ce 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -1,5 +1,6 @@ #pragma once #include "common.h" +#include "Ped.h" #include "PedType.h" #include "Text.h" #include "Sprite2d.h" @@ -10,7 +11,6 @@ class CVehicle; class CPed; class CObject; class CPlayerInfo; -enum eObjective; class CRunningScript; From cede32cb9e4675e25905f071ded47edda6d4f04e Mon Sep 17 00:00:00 2001 From: hazelnot Date: Wed, 23 Dec 2020 19:00:15 +0200 Subject: [PATCH 09/46] Changed outline to black --- logo.png | Bin 24957 -> 24295 bytes logo.svg | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/logo.png b/logo.png index c64fb1de752251c489d642ca635013d5fa4c5b31..50ae869051b2b808a05f999863c722cfff527a9c 100644 GIT binary patch literal 24295 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 N^`5SNF6*2UngBw-Pj3JK literal 24957 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 Date: Thu, 24 Dec 2020 09:41:35 +0100 Subject: [PATCH 10/46] make screen droplets not crash without neo.txd --- src/extras/screendroplets.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/extras/screendroplets.cpp b/src/extras/screendroplets.cpp index 3f91a754..54866bea 100644 --- a/src/extras/screendroplets.cpp +++ b/src/extras/screendroplets.cpp @@ -79,8 +79,10 @@ ScreenDroplets::Initialise(void) void ScreenDroplets::InitDraw(void) { - if(CustomPipes::neoTxd) - ms_maskTex = CustomPipes::neoTxd->find("dropmask"); + if(CustomPipes::neoTxd == nil) + return; + + ms_maskTex = CustomPipes::neoTxd->find("dropmask"); ms_screenTex = RwTextureCreate(nil); RwTextureSetFilterMode(ms_screenTex, rwFILTERLINEAR); @@ -136,6 +138,10 @@ ScreenDroplets::Shutdown(void) void ScreenDroplets::Process(void) { + // no need to do anything if we can't render + if(CustomPipes::neoTxd == nil) + return; + ProcessCameraMovement(); SprayDrops(); ProcessMoving(); @@ -173,6 +179,9 @@ ScreenDroplets::Render(void) { ScreenDrop *drop; + if(CustomPipes::neoTxd == nil) + return; + DefinedState(); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(ms_maskTex)); RwRenderStateSet(rwRENDERSTATEFOGENABLE, FALSE); From 8cc3f867a6446c2275d985599b639bb9c665f16b Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 24 Dec 2020 17:44:59 +0300 Subject: [PATCH 11/46] fixed double explosion --- src/peds/Ped.cpp | 2 ++ src/vehicles/Vehicle.cpp | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index ec56861e..b5ab2f21 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -4246,7 +4246,9 @@ CPed::PedSetOutCarCB(CAnimBlendAssociation *animAssoc, void *arg) veh->m_nGettingOutFlags &= ~GetCarDoorFlag(ped->m_vehEnterType); if (veh->pDriver == ped) { veh->RemoveDriver(); +#ifndef FIX_BUGS // RemoveDriver does it anyway veh->SetStatus(STATUS_ABANDONED); +#endif if (veh->m_nDoorLock == CARLOCK_LOCKED_INITIALLY) veh->m_nDoorLock = CARLOCK_UNLOCKED; if (ped->m_nPedType == PEDTYPE_COP && veh->IsLawEnforcementVehicle()) diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index 9adcf148..ba9348f0 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -1171,7 +1171,10 @@ CVehicle::AddPassenger(CPed *passenger, uint8 n) void CVehicle::RemoveDriver(void) { - SetStatus(STATUS_ABANDONED); +#ifdef FIX_BUGS + if (GetStatus() != STATUS_WRECKED) +#endif + SetStatus(STATUS_ABANDONED); pDriver = nil; } From de31bdc89fe2b2d191bee7a0c224b35bc0c9612e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 08:59:32 +0200 Subject: [PATCH 12/46] Small type use fixes --- src/audio/AudioLogic.cpp | 18 +++++++++--------- src/audio/AudioManager.cpp | 4 ++-- src/audio/AudioManager.h | 2 +- src/audio/PoliceRadio.cpp | 2 +- src/control/Garages.cpp | 2 +- src/peds/Ped.cpp | 2 +- src/render/Weather.cpp | 2 +- src/vehicles/Cranes.cpp | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index ca395136..b41c63fe 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -128,31 +128,31 @@ cAudioManager::PostInitialiseGameSpecificSetup() { m_nFireAudioEntity = CreateEntity(AUDIOTYPE_FIRE, &gFireManager); if (m_nFireAudioEntity >= 0) - SetEntityStatus(m_nFireAudioEntity, 1); + SetEntityStatus(m_nFireAudioEntity, true); m_nCollisionEntity = CreateEntity(AUDIOTYPE_COLLISION, (void *)1); if (m_nCollisionEntity >= 0) - SetEntityStatus(m_nCollisionEntity, 1); + SetEntityStatus(m_nCollisionEntity, true); m_nFrontEndEntity = CreateEntity(AUDIOTYPE_FRONTEND, (void *)1); if (m_nFrontEndEntity >= 0) - SetEntityStatus(m_nFrontEndEntity, 1); + SetEntityStatus(m_nFrontEndEntity, true); m_nProjectileEntity = CreateEntity(AUDIOTYPE_PROJECTILE, (void *)1); if (m_nProjectileEntity >= 0) - SetEntityStatus(m_nProjectileEntity, 1); + SetEntityStatus(m_nProjectileEntity, true); m_nWaterCannonEntity = CreateEntity(AUDIOTYPE_WATERCANNON, (void *)1); if (m_nWaterCannonEntity >= 0) - SetEntityStatus(m_nWaterCannonEntity, 1); + SetEntityStatus(m_nWaterCannonEntity, true); m_nPoliceChannelEntity = CreateEntity(AUDIOTYPE_POLICERADIO, (void *)1); if (m_nPoliceChannelEntity >= 0) - SetEntityStatus(m_nPoliceChannelEntity, 1); + SetEntityStatus(m_nPoliceChannelEntity, true); m_nBridgeEntity = CreateEntity(AUDIOTYPE_BRIDGE, (void *)1); if (m_nBridgeEntity >= 0) - SetEntityStatus(m_nBridgeEntity, 1); + SetEntityStatus(m_nBridgeEntity, true); m_sMissionAudio.m_nSampleIndex = NO_SAMPLE; m_sMissionAudio.m_nLoadingStatus = LOADING_STATUS_NOT_LOADED; @@ -240,7 +240,7 @@ cAudioManager::ProcessReverb() const ; i++) { if (m_asActiveSamples[i].m_bReverbFlag) - SampleManager.SetChannelReverbFlag(i, 1); + SampleManager.SetChannelReverbFlag(i, true); } } } @@ -287,7 +287,7 @@ cAudioManager::ProcessSpecial() void cAudioManager::ProcessEntity(int32 id) { - if (m_asAudioEntities[id].m_nStatus) { + if (m_asAudioEntities[id].m_bStatus) { m_sQueueSample.m_nEntityIndex = id; switch (m_asAudioEntities[id].m_nType) { case AUDIOTYPE_PHYSICAL: diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 947bda40..868f1b65 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -128,7 +128,7 @@ cAudioManager::CreateEntity(eAudioType type, void *entity) for (uint32 i = 0; i < ARRAY_SIZE(m_asAudioEntities); i++) { if (!m_asAudioEntities[i].m_bIsUsed) { m_asAudioEntities[i].m_bIsUsed = true; - m_asAudioEntities[i].m_nStatus = 0; + m_asAudioEntities[i].m_bStatus = false; m_asAudioEntities[i].m_nType = type; m_asAudioEntities[i].m_pEntity = entity; m_asAudioEntities[i].m_awAudioEvent[0] = SOUND_NO_SOUND; @@ -163,7 +163,7 @@ void cAudioManager::SetEntityStatus(int32 id, uint8 status) { if (m_bIsInitialised && id >= 0 && id < NUM_AUDIOENTITIES && m_asAudioEntities[id].m_bIsUsed) - m_asAudioEntities[id].m_nStatus = status; + m_asAudioEntities[id].m_bStatus = status; } void diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index d781ad71..fbabde05 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -46,7 +46,7 @@ public: eAudioType m_nType; void *m_pEntity; bool m_bIsUsed; - uint8 m_nStatus; + uint8 m_bStatus; int16 m_awAudioEvent[NUM_AUDIOENTITY_EVENTS]; float m_afVolume[NUM_AUDIOENTITY_EVENTS]; uint8 m_AudioEvents; diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp index 665494a3..37421904 100644 --- a/src/audio/PoliceRadio.cpp +++ b/src/audio/PoliceRadio.cpp @@ -93,7 +93,7 @@ cAudioManager::InitialisePoliceRadio() for (int32 i = 0; i < ARRAY_SIZE(m_sPoliceRadioQueue.crimes); i++) m_sPoliceRadioQueue.crimes[i].type = CRIME_NONE; - SampleManager.SetChannelReverbFlag(policeChannel, 0); + SampleManager.SetChannelReverbFlag(policeChannel, false); gSpecialSuspectLastSeenReport = false; for (int32 i = 0; i < ARRAY_SIZE(gMinTimeToNextReport); i++) gMinTimeToNextReport[i] = m_FrameCounter; diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 418195c7..2b79b338 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -158,7 +158,7 @@ void CGarages::Init(void) aCarsInSafeHouse3[i].Init(); hGarages = DMAudio.CreateEntity(AUDIOTYPE_GARAGE, (void*)1); if (hGarages >= 0) - DMAudio.SetEntityStatus(hGarages, 1); + DMAudio.SetEntityStatus(hGarages, true); AddOne( CVector(CRUSHER_GARAGE_X1, CRUSHER_GARAGE_Y1, CRUSHER_GARAGE_Z1), CVector(CRUSHER_GARAGE_X2, CRUSHER_GARAGE_Y2, CRUSHER_GARAGE_Z2), diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index b5ab2f21..b8b3e92c 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -243,7 +243,7 @@ CPed::CPed(uint32 pedType) : m_pedIK(this) bHasACamera = true; m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, this); - DMAudio.SetEntityStatus(m_audioEntityId, 1); + DMAudio.SetEntityStatus(m_audioEntityId, true); m_fearFlags = CPedType::GetThreats(m_nPedType); m_threatEntity = nil; m_eventOrThreat = CVector2D(0.0f, 0.0f); diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index e765f306..bf3e51b4 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -114,7 +114,7 @@ void CWeather::Init(void) ForcedWeatherType = WEATHER_RANDOM; SoundHandle = DMAudio.CreateEntity(AUDIOTYPE_WEATHER, (void*)1); if (SoundHandle >= 0) - DMAudio.SetEntityStatus(SoundHandle, 1); + DMAudio.SetEntityStatus(SoundHandle, true); } void CWeather::Update(void) diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index 564f493d..1191465a 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -85,7 +85,7 @@ void CCranes::AddThisOneCrane(CEntity* pEntity) pCrane->m_bWasMilitaryCrane = false; pCrane->m_nAudioEntity = DMAudio.CreateEntity(AUDIOTYPE_CRANE, &aCranes[NumCranes]); if (pCrane->m_nAudioEntity >= 0) - DMAudio.SetEntityStatus(pCrane->m_nAudioEntity, 1); + DMAudio.SetEntityStatus(pCrane->m_nAudioEntity, true); pCrane->m_bIsTop = (MODELID_CRANE_1 != pEntity->GetModelIndex()); // Is this used to avoid military crane? if (pCrane->m_bIsTop || pEntity->GetPosition().y > 0.0f) { @@ -669,7 +669,7 @@ void CCranes::Load(uint8* buf, uint32 size) for (int i = 0; i < NUM_CRANES; i++) { aCranes[i].m_nAudioEntity = DMAudio.CreateEntity(AUDIOTYPE_CRANE, &aCranes[i]); if (aCranes[i].m_nAudioEntity != 0) - DMAudio.SetEntityStatus(aCranes[i].m_nAudioEntity, 1); + DMAudio.SetEntityStatus(aCranes[i].m_nAudioEntity, true); } VALIDATESAVEBUF(size); From 6d75374c414e266503a980c664038357cc3ed574 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 09:06:49 +0200 Subject: [PATCH 13/46] Fix cAudioManager::ProcessSpecial --- src/audio/AudioLogic.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index b41c63fe..81ff1276 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -277,8 +277,7 @@ cAudioManager::ProcessSpecial() } CPlayerPed *playerPed = FindPlayerPed(); if (playerPed) { - const PedState &state = playerPed->m_nPedState; - if (state != PED_ENTER_CAR && state != PED_STEAL_CAR && !playerPed->bInVehicle) + if(playerPed->EnteringCar() && !playerPed->bInVehicle) SampleManager.StopChannel(m_nActiveSamples); } } From 687ff4bdbb422bfb6364b25df91203b98481e6fa Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 10:57:19 +0200 Subject: [PATCH 14/46] Fix debug menu memory leak --- src/extras/debugmenu.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extras/debugmenu.h b/src/extras/debugmenu.h index eb56c8f9..c2198aca 100644 --- a/src/extras/debugmenu.h +++ b/src/extras/debugmenu.h @@ -15,7 +15,7 @@ struct MenuEntry Menu *menu; MenuEntry(const char *name); - virtual ~MenuEntry(void) {} + virtual ~MenuEntry(void) { free((void*)name); } }; typedef MenuEntry DebugMenuEntry; From b12eef1d56575206538abed426a296fefe22e90e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 15:18:13 +0200 Subject: [PATCH 15/46] Fix use of strncmp --- src/animation/AnimManager.cpp | 10 +-- src/control/Script4.cpp | 8 +-- src/core/FileLoader.cpp | 100 ++++++++++++++++------------- src/core/Frontend.cpp | 14 ++-- src/core/General.h | 9 +++ src/modelinfo/ClumpModelInfo.cpp | 4 +- src/modelinfo/PedModelInfo.cpp | 6 +- src/modelinfo/TimeModelInfo.cpp | 3 +- src/modelinfo/VehicleModelInfo.cpp | 12 ++-- src/peds/PedFight.cpp | 2 +- src/peds/PedType.cpp | 4 +- src/vehicles/HandlingMgr.cpp | 2 +- src/weapons/WeaponInfo.cpp | 2 +- 13 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/animation/AnimManager.cpp b/src/animation/AnimManager.cpp index 8d442b72..557bd842 100644 --- a/src/animation/AnimManager.cpp +++ b/src/animation/AnimManager.cpp @@ -810,11 +810,11 @@ CAnimManager::LoadAnimFile(int fd, bool compress) float *fbuf = (float*)buf; CFileMgr::Read(fd, (char*)&anpk, sizeof(IfpHeader)); - if(strncmp(anpk.ident, "ANLF", 4) == 0){ + if(!CGeneral::faststrncmp(anpk.ident, "ANLF", 4)) { ROUNDSIZE(anpk.size); CFileMgr::Read(fd, buf, anpk.size); numANPK = *(int*)buf; - }else if(strncmp(anpk.ident, "ANPK", 4) == 0){ + } else if(!CGeneral::faststrncmp(anpk.ident, "ANPK", 4)) { CFileMgr::Seek(fd, -8, 1); numANPK = 1; } @@ -870,13 +870,13 @@ CAnimManager::LoadAnimFile(int fd, bool compress) bool hasScale = false; bool hasTranslation = false; CFileMgr::Read(fd, (char*)&info, sizeof(info)); - if(strncmp(info.ident, "KRTS", 4) == 0){ + if(!CGeneral::faststrncmp(info.ident, "KRTS", 4)) { hasScale = true; seq->SetNumFrames(numFrames, true); - }else if(strncmp(info.ident, "KRT0", 4) == 0){ + }else if(!CGeneral::faststrncmp(info.ident, "KRT0", 4)) { hasTranslation = true; seq->SetNumFrames(numFrames, true); - }else if(strncmp(info.ident, "KR00", 4) == 0){ + }else if(!CGeneral::faststrncmp(info.ident, "KR00", 4)){ seq->SetNumFrames(numFrames, false); } diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index 986e82f8..3c794859 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -2012,10 +2012,10 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_PRINT_HELP: { if (CCamera::m_bUseMouse3rdPerson && ( - strncmp((char*)&CTheScripts::ScriptSpace[m_nIp], "HELP15", 7) == 0 || - strncmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_2A", 7) == 0 || - strncmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_3A", 7) == 0 || - strncmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_4A", 7) == 0)) { + strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "HELP15") == 0 || + strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_2A") == 0 || + strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_3A") == 0 || + strcmp((char*)&CTheScripts::ScriptSpace[m_nIp], "GUN_4A") == 0)) { m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } diff --git a/src/core/FileLoader.cpp b/src/core/FileLoader.cpp index ac488dc9..926512b9 100644 --- a/src/core/FileLoader.cpp +++ b/src/core/FileLoader.cpp @@ -72,7 +72,11 @@ CFileLoader::LoadLevel(const char *filename) if(*line == '#') continue; - if(strncmp(line, "EXIT", 9) == 0) // BUG: 9? +#ifdef FIX_BUGS + if(strncmp(line, "EXIT", 4) == 0) +#else + if(strncmp(line, "EXIT", 9) == 0) +#endif break; if(strncmp(line, "IMAGEPATH", 9) == 0){ @@ -191,7 +195,7 @@ CFileLoader::LoadTexDictionary(const char *filename) struct ColHeader { - char ident[4]; + uint32 ident; uint32 size; }; @@ -209,7 +213,7 @@ CFileLoader::LoadCollisionFile(const char *filename) fd = CFileMgr::OpenFile(filename, "rb"); while(CFileMgr::Read(fd, (char*)&header, sizeof(header))){ - assert(strncmp(header.ident, "COLL", 4) == 0); + assert(header.ident == 'LLOC'); CFileMgr::Read(fd, (char*)work_buff, header.size); memcpy(modelname, work_buff, 24); @@ -863,6 +867,9 @@ CFileLoader::AddTexDictionaries(RwTexDictionary *dst, RwTexDictionary *src) RwTexDictionaryForAllTextures(src, MoveTexturesCB, dst); } +#define isLine3(l, a, b, c) ((l[0] == a) && (l[1] == b) && (l[2] == c)) +#define isLine4(l, a, b, c, d) ((l[0] == a) && (l[1] == b) && (l[2] == c) && (l[3] == d)) + void CFileLoader::LoadObjectTypes(const char *filename) { @@ -896,18 +903,18 @@ CFileLoader::LoadObjectTypes(const char *filename) continue; if(section == NONE){ - if(strncmp(line, "objs", 4) == 0) section = OBJS; - else if(strncmp(line, "tobj", 4) == 0) section = TOBJ; - else if(strncmp(line, "hier", 4) == 0) section = HIER; - else if(strncmp(line, "cars", 4) == 0) section = CARS; - else if(strncmp(line, "peds", 4) == 0) section = PEDS; - else if(strncmp(line, "path", 4) == 0) section = PATH; - else if(strncmp(line, "2dfx", 4) == 0) section = TWODFX; - }else if(strncmp(line, "end", 3) == 0){ + if(isLine4(line, 'o','b','j','s')) section = OBJS; + else if(isLine4(line, 't','o','b','j')) section = TOBJ; + else if(isLine4(line, 'h','i','e','r')) section = HIER; + else if(isLine4(line, 'c','a','r','s')) section = CARS; + else if(isLine4(line, 'p','e','d','s')) section = PEDS; + else if(isLine4(line, 'p','a','t','h')) section = PATH; + else if(isLine4(line, '2','d','f','x')) section = TWODFX; + }else if(isLine3(line, 'e','n','d')){ section = section == MLO ? OBJS : NONE; }else switch(section){ case OBJS: - if(strncmp(line, "sta", 3) == 0) + if(isLine3(line, 's','t','a')) mlo = LoadMLO(line); else LoadObject(line); @@ -930,9 +937,9 @@ CFileLoader::LoadObjectTypes(const char *filename) case PATH: if(pathIndex == -1){ id = LoadPathHeader(line, pathTypeStr); - if(strncmp(pathTypeStr, "ped", 4) == 0) + if(strcmp(pathTypeStr, "ped") == 0) pathType = 1; - else if(strncmp(pathTypeStr, "car", 4) == 0) + else if(strcmp(pathTypeStr, "car") == 0) pathType = 0; pathIndex = 0; }else{ @@ -1173,21 +1180,21 @@ CFileLoader::LoadVehicleObject(const char *line) mi->m_level = level; mi->m_compRules = comprules; - if(strncmp(type, "car", 4) == 0){ + if(strcmp(type, "car") == 0){ mi->m_wheelId = misc; mi->m_wheelScale = wheelScale; mi->m_vehicleType = VEHICLE_TYPE_CAR; - }else if(strncmp(type, "boat", 5) == 0){ + }else if(strcmp(type, "boat") == 0){ mi->m_vehicleType = VEHICLE_TYPE_BOAT; - }else if(strncmp(type, "train", 6) == 0){ + }else if(strcmp(type, "train") == 0){ mi->m_vehicleType = VEHICLE_TYPE_TRAIN; - }else if(strncmp(type, "heli", 5) == 0){ + }else if(strcmp(type, "heli") == 0){ mi->m_vehicleType = VEHICLE_TYPE_HELI; - }else if(strncmp(type, "plane", 6) == 0){ + }else if(strcmp(type, "plane") == 0){ mi->m_planeLodId = misc; mi->m_wheelScale = 1.0f; mi->m_vehicleType = VEHICLE_TYPE_PLANE; - }else if(strncmp(type, "bike", 5) == 0){ + }else if(strcmp(type, "bike") == 0){ mi->m_bikeSteerAngle = misc; mi->m_wheelScale = wheelScale; mi->m_vehicleType = VEHICLE_TYPE_BIKE; @@ -1197,31 +1204,31 @@ CFileLoader::LoadVehicleObject(const char *line) mi->m_handlingId = mod_HandlingManager.GetHandlingId(handlingId); // Well this is kinda dumb.... - if(strncmp(vehclass, "poorfamily", 11) == 0){ + if(strcmp(vehclass, "poorfamily") == 0){ mi->m_vehicleClass = CCarCtrl::POOR; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::POOR); - }else if(strncmp(vehclass, "richfamily", 11) == 0){ + }else if(strcmp(vehclass, "richfamily") == 0){ mi->m_vehicleClass = CCarCtrl::RICH; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::RICH); - }else if(strncmp(vehclass, "executive", 10) == 0){ + }else if(strcmp(vehclass, "executive") == 0){ mi->m_vehicleClass = CCarCtrl::EXEC; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::EXEC); - }else if(strncmp(vehclass, "worker", 7) == 0){ + }else if(strcmp(vehclass, "worker") == 0){ mi->m_vehicleClass = CCarCtrl::WORKER; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::WORKER); - }else if(strncmp(vehclass, "special", 8) == 0){ + }else if(strcmp(vehclass, "special") == 0){ mi->m_vehicleClass = CCarCtrl::SPECIAL; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::SPECIAL); - }else if(strncmp(vehclass, "big", 4) == 0){ + }else if(strcmp(vehclass, "big") == 0){ mi->m_vehicleClass = CCarCtrl::BIG; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::BIG); - }else if(strncmp(vehclass, "taxi", 5) == 0){ + }else if(strcmp(vehclass, "taxi") == 0){ mi->m_vehicleClass = CCarCtrl::TAXI; while(frequency-- > 0) CCarCtrl::AddToCarArray(id, CCarCtrl::TAXI); @@ -1402,12 +1409,12 @@ CFileLoader::LoadScene(const char *filename) continue; if(section == NONE){ - if(strncmp(line, "inst", 4) == 0) section = INST; - else if(strncmp(line, "zone", 4) == 0) section = ZONE; - else if(strncmp(line, "cull", 4) == 0) section = CULL; - else if(strncmp(line, "pick", 4) == 0) section = PICK; - else if(strncmp(line, "path", 4) == 0) section = PATH; - }else if(strncmp(line, "end", 3) == 0){ + if(isLine4(line, 'i','n','s','t')) section = INST; + else if(isLine4(line, 'z','o','n','e')) section = ZONE; + else if(isLine4(line, 'c','u','l','l')) section = CULL; + else if(isLine4(line, 'p','i','c','k')) section = PICK; + else if(isLine4(line, 'p','a','t','h')) section = PATH; + }else if(isLine3(line, 'e','n','d')){ section = NONE; }else switch(section){ case INST: @@ -1427,6 +1434,7 @@ CFileLoader::LoadScene(const char *filename) // unfinished in the game if(pathIndex == -1){ LoadPathHeader(line, pathTypeStr); + strcmp(pathTypeStr, "ped"); // type not set pathIndex = 0; }else{ @@ -1564,8 +1572,8 @@ CFileLoader::LoadMapZones(const char *filename) continue; if(section == NONE){ - if(strncmp(line, "zone", 4) == 0) section = ZONE; - }else if(strncmp(line, "end", 3) == 0){ + if(isLine4(line, 'z','o','n','e')) section = ZONE; + }else if(isLine3(line, 'e','n','d')){ section = NONE; }else switch(section){ case ZONE: { @@ -1607,20 +1615,20 @@ CFileLoader::ReloadPaths(const char *filename) continue; if (section == NONE) { - if (strncmp(line, "path", 4) == 0) { + if (isLine4(line, 'p','a','t','h')) { section = PATH; ThePaths.AllocatePathFindInfoMem(4500); } - } else if (strncmp(line, "end", 3) == 0) { + } else if (isLine3(line, 'e','n','d')) { section = NONE; } else { switch (section) { case PATH: if (pathIndex == -1) { id = LoadPathHeader(line, pathTypeStr); - if (strncmp(pathTypeStr, "ped", 4) == 0) + if (strcmp(pathTypeStr, "ped") == 0) pathType = 1; - else if (strncmp(pathTypeStr, "car", 4) == 0) + else if (strcmp(pathTypeStr, "car") == 0) pathType = 0; pathIndex = 0; } else { @@ -1663,10 +1671,10 @@ CFileLoader::ReloadObjectTypes(const char *filename) continue; if (section == NONE) { - if (strncmp(line, "objs", 4) == 0) section = OBJS; - else if (strncmp(line, "tobj", 4) == 0) section = TOBJ; - else if (strncmp(line, "2dfx", 4) == 0) section = TWODFX; - } else if (strncmp(line, "end", 3) == 0) { + if (isLine4(line, 'o','b','j','s')) section = OBJS; + else if (isLine4(line, 't','o','b','j')) section = TOBJ; + else if (isLine4(line, '2','d','f','x')) section = TWODFX; + } else if (isLine3(line, 'e','n','d')) { section = NONE; } else { switch (section) { @@ -1738,7 +1746,11 @@ CFileLoader::ReLoadScene(const char *filename) if (*line == '#') continue; - if (strncmp(line, "EXIT", 9) == 0) // BUG: 9? +#ifdef FIX_BUGS + if (strncmp(line, "EXIT", 4) == 0) +#else + if (strncmp(line, "EXIT", 9) == 0) +#endif break; if (strncmp(line, "IDE", 3) == 0) { diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 9c33c397..89edc04b 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -1314,7 +1314,7 @@ CMenuManager::Draw() #endif // Hide back button #ifdef PS2_LIKE_MENU - if ((i == NUM_MENUROWS - 1 || aScreens[m_nCurrScreen].m_aEntries[i+1].m_EntryName[0] == '\0') && strncmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FEDS_TB", 8) == 0) + if ((i == NUM_MENUROWS - 1 || aScreens[m_nCurrScreen].m_aEntries[i+1].m_EntryName[0] == '\0') && strcmp(aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName, "FEDS_TB") == 0) break; #endif if (aScreens[m_nCurrScreen].m_aEntries[i].m_Action != MENUACTION_LABEL && aScreens[m_nCurrScreen].m_aEntries[i].m_EntryName[0] != '\0') { @@ -1611,7 +1611,7 @@ CMenuManager::Draw() // Hide back button #ifdef PS2_LIKE_MENU if ((rowToCheck == NUM_MENUROWS - 1 || aScreens[m_nCurrScreen].m_aEntries[rowToCheck+1].m_EntryName[0] == '\0') && - strncmp(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_EntryName, "FEDS_TB", 8) == 0) + strcmp(aScreens[m_nCurrScreen].m_aEntries[rowToCheck].m_EntryName, "FEDS_TB") == 0) break; #endif @@ -3061,7 +3061,7 @@ CMenuManager::DrawPlayerSetupScreen() SYSTEMTIME SystemTime; HANDLE handle = FindFirstFile("skins\\*.bmp", &FindFileData); for (int i = 1; handle != INVALID_HANDLE_VALUE && i; i = FindNextFile(handle, &FindFileData)) { - if (strncmp(FindFileData.cFileName, DEFAULT_SKIN_NAME, 5) != 0) { + if (strcmp(FindFileData.cFileName, DEFAULT_SKIN_NAME) != 0) { m_pSelectedSkin->nextSkin = new tSkinInfo; m_pSelectedSkin = m_pSelectedSkin->nextSkin; m_pSelectedSkin->skinId = nextSkinId; @@ -4645,15 +4645,15 @@ CMenuManager::ProcessButtonPresses(void) // Hide back button #ifdef PS2_LIKE_MENU - if ((goUp || goDown) && m_nCurrScreen != MENUPAGE_MULTIPLAYER_FIND_GAME && strncmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB", 8) == 0) + if ((goUp || goDown) && m_nCurrScreen != MENUPAGE_MULTIPLAYER_FIND_GAME && strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB") == 0) m_nCurrOption = goUp ? m_nCurrOption - 1 : (aScreens[m_nCurrScreen].m_aEntries[0].m_Action == MENUACTION_LABEL); #endif if (optionSelected) { int option = aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action; if ((option == MENUACTION_CHANGEMENU) || (option == MENUACTION_POPULATESLOTS_CHANGEMENU)) { - if (strncmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB", 8) != 0 && - strncmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FESZ_CA", 8) != 0) { + if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB") != 0 && + strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FESZ_CA") != 0) { if (m_nCurrScreen == MENUPAGE_CHOOSE_DELETE_SLOT) { if (Slots[aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_SaveSlot - 1] == SLOT_EMPTY) @@ -4810,7 +4810,7 @@ CMenuManager::ProcessButtonPresses(void) } } if (changeMenu) { - if (strncmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB", 8) == 0) { + if (strcmp(aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_EntryName, "FEDS_TB") == 0) { #ifndef TIDY_UP_PBP ResetHelperText(); ChangeScreen(!m_bGameNotLoaded ? aScreens[m_nCurrScreen].m_PreviousPage[1] : aScreens[m_nCurrScreen].m_PreviousPage[0], diff --git a/src/core/General.h b/src/core/General.h index dde43c0f..de803558 100644 --- a/src/core/General.h +++ b/src/core/General.h @@ -121,6 +121,15 @@ public: return *str2 != '\0'; } + static bool faststrncmp(const char *str1, const char *str2, uint32 count) + { + for(uint32 i = 0; *str1 && i < count; str1++, str2++, i++) { + if (*str1 != *str2) + return true; + } + return false; + } + static bool faststricmp(const char *str1, const char *str2) { for (; *str1; str1++, str2++) { diff --git a/src/modelinfo/ClumpModelInfo.cpp b/src/modelinfo/ClumpModelInfo.cpp index 1ae936a7..64bb5ed5 100644 --- a/src/modelinfo/ClumpModelInfo.cpp +++ b/src/modelinfo/ClumpModelInfo.cpp @@ -112,7 +112,7 @@ CClumpModelInfo::SetClump(RpClump *clump) } RpHAnimHierarchySetFlags(hier, (RpHAnimHierarchyFlag)(rpHANIMHIERARCHYUPDATEMODELLINGMATRICES|rpHANIMHIERARCHYUPDATELTMS)); } - if(strncmp(GetName(), "playerh", 8) == 0){ + if(strcmp(GetName(), "playerh") == 0){ // playerh is incompatible with the xbox player skin // so check if player model is skinned and only apply skin to head if it isn't CPedModelInfo *body = (CPedModelInfo*)CModelInfo::GetModelInfo(MI_PLAYER); @@ -120,7 +120,7 @@ CClumpModelInfo::SetClump(RpClump *clump) RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); } #else - if(strncmp(GetName(), "playerh", 8) == 0){ + if(strcmp(GetName(), "playerh") == 0){ RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); #endif } diff --git a/src/modelinfo/PedModelInfo.cpp b/src/modelinfo/PedModelInfo.cpp index b77cccda..38ce6d38 100644 --- a/src/modelinfo/PedModelInfo.cpp +++ b/src/modelinfo/PedModelInfo.cpp @@ -97,7 +97,7 @@ CPedModelInfo::SetClump(RpClump *clump) #endif #ifdef PED_SKIN // CB has to be set here before atomics are detached from clump - if(strncmp(GetName(), "player", 7) == 0) + if(strcmp(GetName(), "player") == 0) RpClumpForAllAtomics(clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); if(IsClumpSkinned(clump)){ LimbCBarg limbs = { this, clump, { 0, 0, 0 } }; @@ -108,7 +108,7 @@ CPedModelInfo::SetClump(RpClump *clump) if(m_hitColModel == nil && !IsClumpSkinned(clump)) CreateHitColModel(); // And again because CClumpModelInfo resets it - if(strncmp(GetName(), "player", 7) == 0) + if(strcmp(GetName(), "player") == 0) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); else if(IsClumpSkinned(clump)) // skinned peds have no low detail version, so they don't have the right render Cb @@ -118,7 +118,7 @@ CPedModelInfo::SetClump(RpClump *clump) SetFrameIds(m_pPedIds); if(m_hitColModel == nil) CreateHitColModel(); - if(strncmp(GetName(), "player", 7) == 0) + if(strcmp(GetName(), "player") == 0) RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); #endif } diff --git a/src/modelinfo/TimeModelInfo.cpp b/src/modelinfo/TimeModelInfo.cpp index d4f92293..c1c18dac 100644 --- a/src/modelinfo/TimeModelInfo.cpp +++ b/src/modelinfo/TimeModelInfo.cpp @@ -2,6 +2,7 @@ #include "Camera.h" #include "ModelInfo.h" +#include "General.h" CTimeModelInfo* CTimeModelInfo::FindOtherTimeModel(void) @@ -23,7 +24,7 @@ CTimeModelInfo::FindOtherTimeModel(void) for(i = 0; i < MODELINFOSIZE; i++){ CBaseModelInfo *mi = CModelInfo::GetModelInfo(i); if (mi && mi->GetModelType() == MITYPE_TIME && - strncmp(name, mi->GetName(), 24) == 0){ + !CGeneral::faststrncmp(name, mi->GetName(), MAX_MODEL_NAME)){ m_otherTimeModelID = i; return (CTimeModelInfo*)mi; } diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp index cc2a7e34..c0daaead 100644 --- a/src/modelinfo/VehicleModelInfo.cpp +++ b/src/modelinfo/VehicleModelInfo.cpp @@ -293,7 +293,7 @@ CVehicleModelInfo::SetAtomicRendererCB(RpAtomic *atomic, void *data) name = GetFrameNodeName(RpAtomicGetFrame(atomic)); alpha = false; RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha); - if(strstr(name, "_hi") || strncmp(name, "extra", 5) == 0){ + if(strstr(name, "_hi") || !CGeneral::faststrncmp(name, "extra", 5)) { if(alpha || strncmp(name, "windscreen", 10) == 0) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB); else @@ -319,7 +319,7 @@ CVehicleModelInfo::SetAtomicRendererCB_BigVehicle(RpAtomic *atomic, void *data) name = GetFrameNodeName(RpAtomicGetFrame(atomic)); alpha = false; RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha); - if(strstr(name, "_hi") || strncmp(name, "extra", 5) == 0){ + if(strstr(name, "_hi") || !CGeneral::faststrncmp(name, "extra", 5)) { if(alpha) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB_BigVehicle); else @@ -367,7 +367,7 @@ CVehicleModelInfo::SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data) clump = (RpClump*)data; name = GetFrameNodeName(RpAtomicGetFrame(atomic)); - if(strcmp(name, "boat_hi") == 0 || strncmp(name, "extra", 5) == 0) + if(strcmp(name, "boat_hi") == 0 || !CGeneral::faststrncmp(name, "extra", 5)) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB_Boat); else if(strstr(name, "_hi")) CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB); @@ -914,11 +914,11 @@ CVehicleModelInfo::LoadVehicleColours(void) continue; if(section == NONE){ - if(strncmp(&line[start], "col", 3) == 0) + if(line[start] == 'c' && line[start + 1] == 'o' && line[start + 2] == 'l') section = COLOURS; - else if(strncmp(&line[start], "car", 3) == 0) + else if(line[start] == 'c' && line[start + 1] == 'a' && line[start + 2] == 'r') section = CARS; - }else if(strncmp(&line[start], "end", 3) == 0){ + }else if(line[start] == 'e' && line[start + 1] == 'n' && line[start + 2] == 'd'){ section = NONE; }else if(section == COLOURS){ sscanf(&line[start], // BUG: games doesn't add start diff --git a/src/peds/PedFight.cpp b/src/peds/PedFight.cpp index b57364d8..6188f019 100644 --- a/src/peds/PedFight.cpp +++ b/src/peds/PedFight.cpp @@ -1778,7 +1778,7 @@ CPed::LoadFightData(void) break; } - if (strncmp(animName, "null", 4) != 0) { + if (strcmp(animName, "null") != 0) { animAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, animName); tFightMoves[moveId].animId = (AnimationId)animAssoc->animId; } else { diff --git a/src/peds/PedType.cpp b/src/peds/PedType.cpp index 6e745bd7..598c379d 100644 --- a/src/peds/PedType.cpp +++ b/src/peds/PedType.cpp @@ -79,7 +79,7 @@ CPedType::LoadPedData(void) // Game uses just "line" here since sscanf already trims whitespace, but this is safer sscanf(&line[lp], "%s", word); - if(strncmp(word, "Threat", 7) == 0){ + if(strcmp(word, "Threat") == 0){ flags = 0; lp += 7; while(sscanf(&line[lp], "%s", word) == 1 && lp <= linelen){ @@ -92,7 +92,7 @@ CPedType::LoadPedData(void) lp++; } ms_apPedType[type]->m_threats = flags; - }else if(strncmp(word, "Avoid", 6) == 0){ + }else if(strcmp(word, "Avoid") == 0){ flags = 0; lp += 6; while(sscanf(&line[lp], "%s", word) == 1 && lp <= linelen){ diff --git a/src/vehicles/HandlingMgr.cpp b/src/vehicles/HandlingMgr.cpp index 18a2481e..7b74b590 100644 --- a/src/vehicles/HandlingMgr.cpp +++ b/src/vehicles/HandlingMgr.cpp @@ -115,7 +115,7 @@ cHandlingDataMgr::LoadHandlingData(void) end = start+1; // yeah, this is kinda crappy - if(strncmp(line, ";the end", 9) == 0) + if(strcmp(line, ";the end") == 0) keepGoing = 0; else if(line[0] != ';'){ field = 0; diff --git a/src/weapons/WeaponInfo.cpp b/src/weapons/WeaponInfo.cpp index 284a0c20..69d2faed 100644 --- a/src/weapons/WeaponInfo.cpp +++ b/src/weapons/WeaponInfo.cpp @@ -136,7 +136,7 @@ CWeaponInfo::LoadWeaponData(void) animAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, animToPlay); animId = static_cast(animAssoc->animId); - if (strncmp(anim2ToPlay, "null", 4) != 0) { + if (strcmp(anim2ToPlay, "null") != 0) { animAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, anim2ToPlay); ms_apWeaponInfos[weaponType].m_Anim2ToPlay = (AnimationId) animAssoc->animId; } From b8bf3cb790a4c57d2f103e7f26131fc2455fcb13 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 17:39:49 +0200 Subject: [PATCH 16/46] cPedParams fixes --- src/audio/AudioLogic.cpp | 75 ++++++++++++++-------------------------- src/audio/AudioManager.h | 7 ++++ 2 files changed, 33 insertions(+), 49 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 81ff1276..349da2b4 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -1903,7 +1903,6 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) float vol; bool noReflections; float maxDist; - cPedParams pedParams; static uint8 WaveIndex = 41; static uint8 GunIndex = 53; @@ -2242,21 +2241,21 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) break; } case SOUND_PED_HELI_PLAYER_FOUND: - pedParams.m_pPed = nil; - pedParams.m_bDistanceCalculated = false; - pedParams.m_fDistance = 0.0f; + { + cPedParams pedParams; pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated; pedParams.m_fDistance = params.m_fDistance; SetupPedComments(pedParams, SOUND_PED_HELI_PLAYER_FOUND); continue; + } case SOUND_PED_BODYCAST_HIT: - pedParams.m_pPed = nil; - pedParams.m_bDistanceCalculated = false; - pedParams.m_fDistance = 0.0f; + { + cPedParams pedParams; pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated; pedParams.m_fDistance = params.m_fDistance; SetupPedComments(pedParams, SOUND_PED_BODYCAST_HIT); continue; + } case SOUND_WATER_FALL: { const float SOUND_INTENSITY = 40.0f; m_sQueueSample.m_nSampleIndex = SFX_SPLASH_1; @@ -2954,13 +2953,9 @@ cAudioManager::ProcessPed(CPhysical *ped) { cPedParams params; - params.m_pPed = nil; - params.m_bDistanceCalculated = false; - params.m_fDistance = 0.0f; - m_sQueueSample.m_vecPos = ped->GetPosition(); - // params.m_bDistanceCalculated = false; + params.m_bDistanceCalculated = false; params.m_pPed = (CPed *)ped; params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); if (ped->GetModelIndex() == MI_FATMALE02) @@ -6362,26 +6357,25 @@ cAudioManager::ProcessOneShotScriptObject(uint8 sound) uint8 emittingVolume; float distSquared; - cPedParams male; - cPedParams female; - static uint8 iSound = 0; switch (sound) { case SCRIPT_SOUND_INJURED_PED_MALE_OUCH_S: case SCRIPT_SOUND_INJURED_PED_MALE_OUCH_L: - male.m_pPed = nil; - male.m_bDistanceCalculated = false; - male.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); - SetupPedComments(male, SOUND_INJURED_PED_MALE_OUCH); + { + cPedParams pedParams; + pedParams.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); + SetupPedComments(pedParams, SOUND_INJURED_PED_MALE_OUCH); return; + } case SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_S: case SCRIPT_SOUND_INJURED_PED_FEMALE_OUCH_L: - female.m_pPed = nil; - female.m_bDistanceCalculated = false; - female.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); - SetupPedComments(female, SOUND_INJURED_PED_FEMALE); + { + cPedParams pedParams; + pedParams.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); + SetupPedComments(pedParams, SOUND_INJURED_PED_FEMALE); return; + } case SCRIPT_SOUND_GATE_START_CLUNK: case SCRIPT_SOUND_GATE_STOP_CLUNK: m_sQueueSample.m_fSoundIntensity = 40.0f; @@ -6536,36 +6530,20 @@ cAudioManager::ProcessOneShotScriptObject(uint8 sound) m_sQueueSample.m_nSampleIndex = SFX_BULLET_SHELL_HIT_GROUND_2; m_sQueueSample.m_nFrequency = RandomDisplacement(500) + 11000; m_sQueueSample.m_nReleasingVolumeModificator = 18; - m_sQueueSample.m_fSoundIntensity = 20.0f; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_bIs2D = false; - emittingVolume = m_anRandomTable[2] % 20 + 30; - distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); - if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) { - m_sQueueSample.m_fDistance = Sqrt(distSquared); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = iSound++; - m_sQueueSample.m_nLoopCount = 1; - m_sQueueSample.m_bReleasingSoundFlag = true; - m_sQueueSample.m_nEmittingVolume = emittingVolume; - m_sQueueSample.m_nLoopStart = 0; - m_sQueueSample.m_nLoopEnd = -1; - m_sQueueSample.m_bReverbFlag = true; - AddSampleToRequestedQueue(); - } - } - return; + break; case SURFACE_WATER: return; default: + m_sQueueSample.m_nSampleIndex = SFX_BULLET_SHELL_HIT_GROUND_1; + m_sQueueSample.m_nFrequency = RandomDisplacement(750) + 18000; + m_sQueueSample.m_nReleasingVolumeModificator = 15; break; } + } else { + m_sQueueSample.m_nSampleIndex = SFX_BULLET_SHELL_HIT_GROUND_1; + m_sQueueSample.m_nFrequency = RandomDisplacement(750) + 18000; + m_sQueueSample.m_nReleasingVolumeModificator = 15; } - m_sQueueSample.m_nSampleIndex = SFX_BULLET_SHELL_HIT_GROUND_1; - m_sQueueSample.m_nFrequency = RandomDisplacement(750) + 18000; - m_sQueueSample.m_nReleasingVolumeModificator = 15; m_sQueueSample.m_fSoundIntensity = 20.0f; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_fSpeedMultiplier = 0.0f; @@ -7714,7 +7692,6 @@ cAudioManager::ProcessPoliceCellBeatingScriptObject(uint8 sound) int32 sampleIndex; uint8 emittingVol; float distSquared; - cPedParams params; static uint8 iSound = 0; @@ -7755,9 +7732,9 @@ cAudioManager::ProcessPoliceCellBeatingScriptObject(uint8 sound) m_sQueueSample.m_bReverbFlag = true; m_sQueueSample.m_bRequireReflection = false; AddSampleToRequestedQueue(); + cPedParams params; params.m_bDistanceCalculated = true; params.m_fDistance = distSquared; - params.m_pPed = nil; SetupPedComments(params, SOUND_INJURED_PED_MALE_PRISON); } gCellNextTime = time + 500 + m_anRandomTable[3] % 1500; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index fbabde05..7fdfecc2 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -132,6 +132,13 @@ public: bool m_bDistanceCalculated; float m_fDistance; CPed *m_pPed; + + cPedParams() + { + m_pPed = nil; + m_bDistanceCalculated = false; + m_fDistance = 0.0f; + } }; class cVehicleParams From 03c3eeb937ca69d337b333d6dbd36f5251753e0e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 19:57:09 +0200 Subject: [PATCH 17/46] cAudioManager::ProcessBoatEngine fixes --- src/audio/AudioLogic.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 349da2b4..54466813 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2400,7 +2400,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) CBoat *boat; float padRelativeAccerate; float gasPedal; - int32 padAccelerate; + float padAccelerate; uint8 emittingVol; float oneShotVol; @@ -2436,10 +2436,10 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) } if (FindPlayerVehicle() == params.m_pVehicle) { padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake()); - padRelativeAccerate = padAccelerate / 255; + padRelativeAccerate = padAccelerate / 255.0f; emittingVol = (100.f * padRelativeAccerate) + 15; m_sQueueSample.m_nFrequency = (3000.f * padRelativeAccerate) + 6000; - if (!boat->m_bIsAnchored) + if (!boat->bPropellerInWater) m_sQueueSample.m_nFrequency = 11 * m_sQueueSample.m_nFrequency / 10; } else { gasPedal = Abs(boat->m_fGasPedal); @@ -2449,7 +2449,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) } else { emittingVol = (100.f * gasPedal) + 15; m_sQueueSample.m_nFrequency = (3000.f * gasPedal) + 6000; - if (!boat->m_bIsAnchored) + if (!boat->bPropellerInWater) m_sQueueSample.m_nFrequency = 11 * m_sQueueSample.m_nFrequency / 10; } } From 7a7061ea92b63f17eb9f9c5d2551b8957c9fb7ed Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 20:00:12 +0200 Subject: [PATCH 18/46] Use intensity in ProcessBoatEngine --- src/audio/AudioLogic.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 54466813..78174f33 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -2407,13 +2407,13 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) static uint16 LastAccel = 0; static uint8 LastVol = 0; - static const int intensity = 50; + static const float intensity = 50.0f; if (params.m_fDistance < SQR(intensity)) { boat = (CBoat *)params.m_pVehicle; if (params.m_nIndex == REEFER) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(80, 50.f, m_sQueueSample.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(80, intensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 39; m_sQueueSample.m_nSampleIndex = SFX_FISHING_BOAT_IDLE; @@ -2453,7 +2453,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) m_sQueueSample.m_nFrequency = 11 * m_sQueueSample.m_nFrequency / 10; } } - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 50.f, m_sQueueSample.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, intensity, m_sQueueSample.m_fDistance); if (!m_sQueueSample.m_nVolume) return true; m_sQueueSample.m_nCounter = 40; @@ -2511,7 +2511,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams& params) } } CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 50.f, m_sQueueSample.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, intensity, m_sQueueSample.m_fDistance); if (!m_sQueueSample.m_nVolume) return true; m_sQueueSample.m_nFrequency += (m_sQueueSample.m_nEntityIndex * 65536) % 1000; From 2b96be0418ba60fd2a17d3e03b2cb8b1c906ed24 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Fri, 25 Dec 2020 20:22:43 +0200 Subject: [PATCH 19/46] cVehicleParams ctor --- src/audio/AudioLogic.cpp | 7 +++---- src/audio/AudioManager.h | 10 ++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 78174f33..94ca67de 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -579,14 +579,13 @@ cAudioManager::ProcessVehicle(CVehicle *veh) m_sQueueSample.m_vecPos = veh->GetPosition(); params.m_bDistanceCalculated = false; - params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); params.m_pVehicle = veh; - params.m_pTransmission = nil; - params.m_nIndex = 0; - params.m_fVelocityChange = 0.0f; + params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); if (handling != nil) params.m_pTransmission = &handling->Transmission; + else + params.m_pTransmission = nil; params.m_nIndex = veh->GetModelIndex() - MI_FIRST_VEHICLE; if (params.m_pVehicle->GetStatus() == STATUS_SIMPLE) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 7fdfecc2..e3d91876 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -150,6 +150,16 @@ public: cTransmission *m_pTransmission; int32 m_nIndex; float m_fVelocityChange; + + cVehicleParams() + { + m_bDistanceCalculated = false; + m_fDistance = 0.0f; + m_pVehicle = 0; + m_pTransmission = nil; + m_nIndex = 0; + m_fVelocityChange = 0.0f; + } }; VALIDATE_SIZE(cVehicleParams, 0x18); From 47b620396facf41ea9fe4dcb44765bc7adb27e9f Mon Sep 17 00:00:00 2001 From: erorcun Date: Sat, 26 Dec 2020 12:06:22 +0300 Subject: [PATCH 20/46] insert logo to README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 27b8d8e9..5dff7b91 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# re3 +re3 logo + [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FGTAmodding%2Fre3%2Fbadge%3Fref%3Dmaster&style=flat)](https://actions-badge.atrox.dev/GTAmodding/re3/goto?ref=master) From 612470cb3f88c0bf59be8684f9c251e7c93497ef Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Dec 2020 11:43:43 +0100 Subject: [PATCH 21/46] unfix particle bug --- src/render/Particle.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp index f175c264..844b6acd 100644 --- a/src/render/Particle.cpp +++ b/src/render/Particle.cpp @@ -388,9 +388,11 @@ void CParticle::Initialise() gpFlame5Tex = RwTextureRead("flame5", nil); -#ifdef FIX_BUGS +//#ifdef FIX_BUGS +#if 0 gpFlame5Raster = RwTextureGetRaster(gpFlame5Tex); #else + // this seems to have become more of a design choice gpFlame5Raster = RwTextureGetRaster(gpFlame1Tex); // copy-paste bug ? #endif From d459ef882082f41a94b9ae9c298d361b15374cfd Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 26 Dec 2020 14:21:45 +0200 Subject: [PATCH 22/46] Weapon flags changed from bit fields to bit mask (R* vision) --- src/audio/AudioManager.h | 4 ++-- src/peds/Ped.cpp | 2 +- src/peds/PedFight.cpp | 12 ++++++------ src/peds/PlayerPed.cpp | 24 ++++++++++++------------ src/weapons/ShotInfo.cpp | 6 +++--- src/weapons/WeaponInfo.cpp | 18 ++---------------- src/weapons/WeaponInfo.h | 30 +++++++++++++++++------------- 7 files changed, 43 insertions(+), 53 deletions(-) diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index e3d91876..9fe2f4ef 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -135,9 +135,9 @@ public: cPedParams() { - m_pPed = nil; m_bDistanceCalculated = false; m_fDistance = 0.0f; + m_pPed = nil; } }; @@ -155,7 +155,7 @@ public: { m_bDistanceCalculated = false; m_fDistance = 0.0f; - m_pVehicle = 0; + m_pVehicle = nil; m_pTransmission = nil; m_nIndex = 0; m_fVelocityChange = 0.0f; diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index b8b3e92c..3d2278bd 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -1046,7 +1046,7 @@ CPed::SetAimFlag(float angle) m_lookTimer = 0; m_pLookTarget = nil; m_pSeekTarget = nil; - if (CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bCanAimWithArm) + if (CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM; else m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM; diff --git a/src/peds/PedFight.cpp b/src/peds/PedFight.cpp index 6188f019..ca720479 100644 --- a/src/peds/PedFight.cpp +++ b/src/peds/PedFight.cpp @@ -201,7 +201,7 @@ CPed::PointGunAt(void) weaponAssoc->SetCurrentTime(weaponInfo->m_fAnimLoopStart); weaponAssoc->flags &= ~ASSOC_RUNNING; - if (weaponInfo->m_bCanAimWithArm) + if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM; else m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM; @@ -300,7 +300,7 @@ CPed::SetAttack(CEntity *victim) if (m_pSeekTarget) m_pSeekTarget->RegisterReference((CEntity **) &m_pSeekTarget); - if (curWeapon->m_bCanAim) { + if (curWeapon->IsFlagSet(WEAPONFLAG_CANAIM)) { CVector aimPos = GetRight() * 0.1f + GetForward() * 0.2f + GetPosition(); CEntity *obstacle = CWorld::TestSphereAgainstWorld(aimPos, 0.2f, nil, true, false, false, true, false, false); if (obstacle) @@ -342,7 +342,7 @@ CPed::SetAttack(CEntity *victim) if (pointBlankStatus == POINT_BLANK_FOR_WANTED_PED || !victimPed) StartFightAttack(200); } else { - if (!curWeapon->m_bCanAim) + if (!curWeapon->IsFlagSet(WEAPONFLAG_CANAIM)) m_pSeekTarget = nil; if (m_nPedState != PED_AIM_GUN) @@ -417,7 +417,7 @@ CPed::ClearAttackByRemovingAnim(void) if (!weaponAssoc) { weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), weapon->m_Anim2ToPlay); - if (!weaponAssoc && weapon->m_bThrow) + if (!weaponAssoc && weapon->IsFlagSet(WEAPONFLAG_THROW)) weaponAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_THROWU); if (!weaponAssoc) { @@ -569,7 +569,7 @@ CPed::Attack(void) delayBetweenAnimAndFire = ourWeapon->m_fAnim2FrameFire; // Long throw granade, molotov - if (!weaponAnimAssoc && ourWeapon->m_bThrow) { + if (!weaponAnimAssoc && ourWeapon->IsFlagSet(WEAPONFLAG_THROW)) { weaponAnimAssoc = RpAnimBlendClumpGetAssociation(GetClump(), ANIM_WEAPON_THROWU); delayBetweenAnimAndFire = 0.2f; } @@ -605,7 +605,7 @@ CPed::Attack(void) animStart = ourWeapon->m_fAnimLoopStart; weaponAnimTime = weaponAnimAssoc->currentTime; if (weaponAnimTime > animStart && weaponAnimTime - weaponAnimAssoc->timeStep <= animStart) { - if (ourWeapon->m_bCanAimWithArm) + if (ourWeapon->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) m_pedIK.m_flags |= CPedIK::AIMS_WITH_ARM; else m_pedIK.m_flags &= ~CPedIK::AIMS_WITH_ARM; diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index 330d209b..ef5815ed 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -192,7 +192,7 @@ CPlayerPed::MakeChangesForNewWeapon(int8 weapon) GetWeapon()->m_nAmmoInClip = Min(GetWeapon()->m_nAmmoTotal, CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_nAmountofAmmunition); - if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bCanAim)) + if (!CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_CANAIM)) ClearWeaponTarget(); CAnimBlendAssociation *weaponAnim = RpAnimBlendClumpGetAssociation(GetClump(), CWeaponInfo::GetWeaponInfo(WEAPONTYPE_SNIPERRIFLE)->m_AnimToPlay); @@ -685,7 +685,7 @@ CPlayerPed::PlayerControlFighter(CPad *padUsed) bIsAttacking = false; } - if (!CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy && padUsed->JumpJustDown()) { + if (!CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_HEAVY) && padUsed->JumpJustDown()) { if (m_nEvadeAmount != 0 && m_pEvadingFrom) { SetEvasiveDive((CPhysical*)m_pEvadingFrom, 1); m_nEvadeAmount = 0; @@ -723,13 +723,13 @@ CPlayerPed::PlayerControl1stPersonRunAround(CPad *padUsed) m_fMoveSpeed = 0.0f; } } - if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) && padUsed->GetSprint()) { + if (!CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_HEAVY) && padUsed->GetSprint()) { m_nMoveState = PEDMOVE_SPRINT; } if (m_nPedState != PED_FIGHT) SetRealMoveAnim(); - if (!bIsInTheAir && !(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) + if (!bIsInTheAir && !(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_HEAVY)) && padUsed->JumpJustDown() && m_nPedState != PED_JUMP) { ClearAttack(); ClearWeaponTarget(); @@ -1061,12 +1061,12 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) m_nSelectedWepSlot == m_currentWeapon && m_nMoveState != PEDMOVE_SPRINT) { // Weapons except throwable and melee ones - if (weaponInfo->m_bCanAim || weaponInfo->m_b1stPerson || weaponInfo->m_bExpands) { - if ((padUsed->GetTarget() && weaponInfo->m_bCanAimWithArm) || padUsed->GetWeapon()) { + if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM) || weaponInfo->IsFlagSet(WEAPONFLAG_1ST_PERSON) || weaponInfo->IsFlagSet(WEAPONFLAG_EXPANDS)) { + if ((padUsed->GetTarget() && weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) || padUsed->GetWeapon()) { float limitedCam = CGeneral::LimitRadianAngle(-TheCamera.Orientation); // On this one we can rotate arm. - if (weaponInfo->m_bCanAimWithArm) { + if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM)) { if (!padUsed->GetWeapon()) { // making this State != ATTACK still stops it after attack. Re-start it immediately! SetPointGunAt(nil); bIsPointingGunAt = false; // to not stop after attack @@ -1083,7 +1083,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) m_headingRate = 50.0f; // Anim. fix for shotgun, ak47 and m16 (we must finish rot. it quickly) - if (weaponInfo->m_bCanAim && padUsed->WeaponJustDown()) { + if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM) && padUsed->WeaponJustDown()) { m_fRotationCur = CGeneral::LimitRadianAngle(m_fRotationCur); float limitedRotDest = m_fRotationDest; @@ -1096,7 +1096,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) m_fRotationCur += (limitedRotDest - m_fRotationCur) / 2; } } - } else if (weaponInfo->m_bCanAimWithArm && m_nPedState != PED_ATTACK) + } else if (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM_WITHARM) && m_nPedState != PED_ATTACK) ClearPointGunAt(); } } @@ -1133,7 +1133,7 @@ CPlayerPed::ProcessPlayerWeapon(CPad *padUsed) TheCamera.UpdateAimingCoors(m_pPointGunAt->GetPosition()); } #ifdef FREE_CAM - else if ((CCamera::bFreeCam && weaponInfo->m_eWeaponFire == WEAPON_FIRE_MELEE) || (weaponInfo->m_bCanAim && !CCamera::m_bUseMouse3rdPerson)) { + else if ((CCamera::bFreeCam && weaponInfo->m_eWeaponFire == WEAPON_FIRE_MELEE) || (weaponInfo->IsFlagSet(WEAPONFLAG_CANAIM) && !CCamera::m_bUseMouse3rdPerson)) { #else else if (weaponInfo->m_bCanAim && !CCamera::m_bUseMouse3rdPerson) { #endif @@ -1215,13 +1215,13 @@ CPlayerPed::PlayerControlZelda(CPad *padUsed) } } - if (!(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) && padUsed->GetSprint()) { + if (!CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_HEAVY) && padUsed->GetSprint()) { m_nMoveState = PEDMOVE_SPRINT; } if (m_nPedState != PED_FIGHT) SetRealMoveAnim(); - if (!bIsInTheAir && !(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->m_bHeavy) + if (!bIsInTheAir && !(CWeaponInfo::GetWeaponInfo(GetWeapon()->m_eWeaponType)->IsFlagSet(WEAPONFLAG_HEAVY)) && padUsed->JumpJustDown() && m_nPedState != PED_JUMP) { ClearAttack(); ClearWeaponTarget(); diff --git a/src/weapons/ShotInfo.cpp b/src/weapons/ShotInfo.cpp index c0ab9ac1..e604093c 100644 --- a/src/weapons/ShotInfo.cpp +++ b/src/weapons/ShotInfo.cpp @@ -76,7 +76,7 @@ CShotInfo::AddShot(CEntity *sourceEntity, eWeaponType weapon, CVector startPos, gaShotInfo[slot].m_areaAffected.z += CShotInfo::ms_afRandTable[CGeneral::GetRandomNumber() % ARRAY_SIZE(ms_afRandTable)]; } gaShotInfo[slot].m_areaAffected.Normalise(); - if (weaponInfo->m_bRandSpeed) + if (weaponInfo->IsFlagSet(WEAPONFLAG_RAND_SPEED)) gaShotInfo[slot].m_areaAffected *= CShotInfo::ms_afRandTable[CGeneral::GetRandomNumber() % ARRAY_SIZE(ms_afRandTable)] + weaponInfo->m_fSpeed; else gaShotInfo[slot].m_areaAffected *= weaponInfo->m_fSpeed; @@ -117,10 +117,10 @@ CShotInfo::Update() shot.m_inUse = false; } - if (weaponInfo->m_bSlowsDown) + if (weaponInfo->IsFlagSet(WEAPONFLAG_SLOWS_DOWN)) shot.m_areaAffected *= pow(0.96, CTimer::GetTimeStep()); // FRAMERATE - if (weaponInfo->m_bExpands) + if (weaponInfo->IsFlagSet(WEAPONFLAG_EXPANDS)) shot.m_radius += 0.075f * CTimer::GetTimeStep(); shot.m_startPos += CTimer::GetTimeStep() * shot.m_areaAffected; diff --git a/src/weapons/WeaponInfo.cpp b/src/weapons/WeaponInfo.cpp index 69d2faed..546aa6ba 100644 --- a/src/weapons/WeaponInfo.cpp +++ b/src/weapons/WeaponInfo.cpp @@ -39,11 +39,7 @@ CWeaponInfo::Initialise(void) ms_apWeaponInfos[i].m_eWeaponFire = WEAPON_FIRE_INSTANT_HIT; ms_apWeaponInfos[i].m_AnimToPlay = ANIM_PUNCH_R; ms_apWeaponInfos[i].m_Anim2ToPlay = NUM_ANIMS; - ms_apWeaponInfos[i].m_bUseGravity = 1; - ms_apWeaponInfos[i].m_bSlowsDown = 1; - ms_apWeaponInfos[i].m_bRandSpeed = 1; - ms_apWeaponInfos[i].m_bExpands = 1; - ms_apWeaponInfos[i].m_bExplodes = 1; + ms_apWeaponInfos[i].m_Flags = WEAPONFLAG_USE_GRAVITY | WEAPONFLAG_SLOWS_DOWN | WEAPONFLAG_RAND_SPEED | WEAPONFLAG_EXPANDS | WEAPONFLAG_EXPLODES; } debug("Loading weapon data...\n"); LoadWeaponData(); @@ -160,17 +156,7 @@ CWeaponInfo::LoadWeaponData(void) ms_apWeaponInfos[weaponType].m_fAnimFrameFire = delayBetweenAnimAndFire / 30.0f; ms_apWeaponInfos[weaponType].m_fAnim2FrameFire = delayBetweenAnim2AndFire / 30.0f; ms_apWeaponInfos[weaponType].m_nModelId = modelId; - ms_apWeaponInfos[weaponType].m_bUseGravity = flags & 1; - ms_apWeaponInfos[weaponType].m_bSlowsDown = (flags >> 1) & 1; - ms_apWeaponInfos[weaponType].m_bDissipates = (flags >> 2) & 1; - ms_apWeaponInfos[weaponType].m_bRandSpeed = (flags >> 3) & 1; - ms_apWeaponInfos[weaponType].m_bExpands = (flags >> 4) & 1; - ms_apWeaponInfos[weaponType].m_bExplodes = (flags >> 5) & 1; - ms_apWeaponInfos[weaponType].m_bCanAim = (flags >> 6) & 1; - ms_apWeaponInfos[weaponType].m_bCanAimWithArm = (flags >> 7) & 1; - ms_apWeaponInfos[weaponType].m_b1stPerson = (flags >> 8) & 1; - ms_apWeaponInfos[weaponType].m_bHeavy = (flags >> 9) & 1; - ms_apWeaponInfos[weaponType].m_bThrow = (flags >> 10) & 1; + ms_apWeaponInfos[weaponType].m_Flags = flags; } } diff --git a/src/weapons/WeaponInfo.h b/src/weapons/WeaponInfo.h index c89dd482..69ad1f39 100644 --- a/src/weapons/WeaponInfo.h +++ b/src/weapons/WeaponInfo.h @@ -3,8 +3,22 @@ #include "AnimationId.h" #include "WeaponType.h" +enum +{ + WEAPONFLAG_USE_GRAVITY = 1, + WEAPONFLAG_SLOWS_DOWN = 1 << 1, + WEAPONFLAG_DISSIPATES = 1 << 2, + WEAPONFLAG_RAND_SPEED = 1 << 3, + WEAPONFLAG_EXPANDS = 1 << 4, + WEAPONFLAG_EXPLODES = 1 << 5, + WEAPONFLAG_CANAIM = 1 << 6, + WEAPONFLAG_CANAIM_WITHARM = 1 << 7, + WEAPONFLAG_1ST_PERSON = 1 << 8, + WEAPONFLAG_HEAVY = 1 << 9, + WEAPONFLAG_THROW = 1 << 10, +}; + class CWeaponInfo { -// static CWeaponInfo(&ms_apWeaponInfos)[14]; static CWeaponInfo ms_apWeaponInfos[WEAPONTYPE_LAST_WEAPONTYPE]; public: eWeaponFire m_eWeaponFire; @@ -25,18 +39,7 @@ public: float m_fAnimFrameFire; float m_fAnim2FrameFire; int32 m_nModelId; - // flags - uint8 m_bUseGravity : 1; - uint8 m_bSlowsDown : 1; - uint8 m_bDissipates : 1; - uint8 m_bRandSpeed : 1; - uint8 m_bExpands : 1; - uint8 m_bExplodes : 1; - uint8 m_bCanAim : 1; - uint8 m_bCanAimWithArm : 1; - uint8 m_b1stPerson : 1; - uint8 m_bHeavy : 1; - uint8 m_bThrow : 1; + uint32 m_Flags; static void Initialise(void); static void LoadWeaponData(void); @@ -44,6 +47,7 @@ public: static eWeaponFire FindWeaponFireType(char *name); static eWeaponType FindWeaponType(char *name); static void Shutdown(void); + bool IsFlagSet(uint32 flag) const { return (m_Flags & flag) != 0; } }; VALIDATE_SIZE(CWeaponInfo, 0x54); \ No newline at end of file From b21ca72c8b8ef02a9af8b60a9aaea67b08c0a5b1 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Dec 2020 14:48:47 +0100 Subject: [PATCH 23/46] make screendrops independent of neo.txd; enable new rendering by default --- src/core/config.h | 9 +++------ src/extras/screendroplets.cpp | 38 +++++++++++++++++++++++++---------- src/fakerw/fake.cpp | 12 +++++------ 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/core/config.h b/src/core/config.h index e5a97049..d3196f9b 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -249,17 +249,14 @@ enum Config { #define DISABLE_VSYNC_ON_TEXTURE_CONVERSION // make texture conversion work faster by disabling vsync //#define USE_TEXTURE_POOL #ifdef LIBRW -//#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) -//#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) -//#define SCREEN_DROPLETS // neo water droplets +#define EXTENDED_COLOURFILTER // more options for colour filter (replaces mblur) +#define EXTENDED_PIPELINES // custom render pipelines (includes Neo) +#define SCREEN_DROPLETS // neo water droplets #endif #ifndef EXTENDED_COLOURFILTER #undef SCREEN_DROPLETS // we need the backbuffer for this effect #endif -#ifndef EXTENDED_PIPELINES -#undef SCREEN_DROPLETS // we need neo.txd -#endif // Particle //#define PC_PARTICLE diff --git a/src/extras/screendroplets.cpp b/src/extras/screendroplets.cpp index 54866bea..59c597f7 100644 --- a/src/extras/screendroplets.cpp +++ b/src/extras/screendroplets.cpp @@ -76,13 +76,36 @@ ScreenDroplets::Initialise(void) ms_splashObject = nil; } +// Create white circle mask for rain drops +static RwTexture* +CreateDropMask(int32 size) +{ + RwImage *img = RwImageCreate(size, size, 32); + RwImageAllocatePixels(img); + + uint8 *pixels = RwImageGetPixels(img); + int32 stride = RwImageGetStride(img); + + for(int y = 0; y < size; y++){ + float yf = ((y + 0.5f)/size - 0.5f)*2.0f; + for(int x = 0; x < size; x++){ + float xf = ((x + 0.5f)/size - 0.5f)*2.0f; + memset(&pixels[y*stride + x*4], xf*xf + yf*yf < 1.0f ? 0xFF : 0x00, 4); + } + } + + int32 width, height, depth, format; + RwImageFindRasterFormat(img, rwRASTERTYPETEXTURE, &width, &height, &depth, &format); + RwRaster *ras = RwRasterCreate(width, height, depth, format); + RwRasterSetFromImage(ras, img); + RwImageDestroy(img); + return RwTextureCreate(ras); +} + void ScreenDroplets::InitDraw(void) { - if(CustomPipes::neoTxd == nil) - return; - - ms_maskTex = CustomPipes::neoTxd->find("dropmask"); + ms_maskTex = CreateDropMask(64); ms_screenTex = RwTextureCreate(nil); RwTextureSetFilterMode(ms_screenTex, rwFILTERLINEAR); @@ -138,10 +161,6 @@ ScreenDroplets::Shutdown(void) void ScreenDroplets::Process(void) { - // no need to do anything if we can't render - if(CustomPipes::neoTxd == nil) - return; - ProcessCameraMovement(); SprayDrops(); ProcessMoving(); @@ -179,9 +198,6 @@ ScreenDroplets::Render(void) { ScreenDrop *drop; - if(CustomPipes::neoTxd == nil) - return; - DefinedState(); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(ms_maskTex)); RwRenderStateSet(rwRENDERSTATEFOGENABLE, FALSE); diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp index 2e04aed2..a3b9258b 100644 --- a/src/fakerw/fake.cpp +++ b/src/fakerw/fake.cpp @@ -171,8 +171,8 @@ RwFrame *RwCameraGetFrame(const RwCamera *camera) { return camera->getFrame( RwImage *RwImageCreate(RwInt32 width, RwInt32 height, RwInt32 depth) { return Image::create(width, height, depth); } RwBool RwImageDestroy(RwImage * image) { image->destroy(); return true; } -RwImage *RwImageAllocatePixels(RwImage * image); -RwImage *RwImageFreePixels(RwImage * image); +RwImage *RwImageAllocatePixels(RwImage * image) { image->allocate(); return image; } +RwImage *RwImageFreePixels(RwImage * image) { image->free(); return image; } RwImage *RwImageCopy(RwImage * destImage, const RwImage * sourceImage); RwImage *RwImageResize(RwImage * image, RwInt32 width, RwInt32 height); RwImage *RwImageApplyMask(RwImage * image, const RwImage * mask); @@ -187,10 +187,10 @@ RwImage *RwImageSetPixels(RwImage * image, RwUInt8 * pixels) { image->pixels RwImage *RwImageSetPalette(RwImage * image, RwRGBA * palette) { image->palette = (uint8*)palette; return image; } RwInt32 RwImageGetWidth(const RwImage * image) { return image->width; } RwInt32 RwImageGetHeight(const RwImage * image) { return image->height; } -RwInt32 RwImageGetDepth(const RwImage * image); -RwInt32 RwImageGetStride(const RwImage * image); -RwUInt8 *RwImageGetPixels(const RwImage * image); -RwRGBA *RwImageGetPalette(const RwImage * image); +RwInt32 RwImageGetDepth(const RwImage * image) { return image->depth; } +RwInt32 RwImageGetStride(const RwImage * image) { return image->stride; } +RwUInt8 *RwImageGetPixels(const RwImage * image) { return image->pixels; } +RwRGBA *RwImageGetPalette(const RwImage * image) { return (RwRGBA*)image->palette; } RwUInt32 RwRGBAToPixel(RwRGBA * rgbIn, RwInt32 rasterFormat); RwRGBA *RwRGBASetFromPixel(RwRGBA * rgbOut, RwUInt32 pixelValue, RwInt32 rasterFormat); RwBool RwImageSetGamma(RwReal gammaValue); From 7cdec23ef23486542b4c164d0aab4a9e7afb116c Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Dec 2020 15:19:27 +0100 Subject: [PATCH 24/46] include case --- src/extras/screendroplets.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extras/screendroplets.cpp b/src/extras/screendroplets.cpp index 59c597f7..f2b978eb 100644 --- a/src/extras/screendroplets.cpp +++ b/src/extras/screendroplets.cpp @@ -10,7 +10,7 @@ #include "General.h" #include "Main.h" #include "RwHelper.h" -#include "Main.h" +#include "main.h" #include "Timer.h" #include "Camera.h" #include "ZoneCull.h" From 075650b9f3477b074ccef25258daa017b71e8873 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Dec 2020 15:22:23 +0100 Subject: [PATCH 25/46] ffs --- src/extras/screendroplets.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/extras/screendroplets.cpp b/src/extras/screendroplets.cpp index f2b978eb..9ac60d4f 100644 --- a/src/extras/screendroplets.cpp +++ b/src/extras/screendroplets.cpp @@ -8,9 +8,8 @@ #endif #include "General.h" -#include "Main.h" -#include "RwHelper.h" #include "main.h" +#include "RwHelper.h" #include "Timer.h" #include "Camera.h" #include "ZoneCull.h" From c5010d443c4e7a12a70927e33bb52c7fe50fdddc Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 26 Dec 2020 15:41:57 +0100 Subject: [PATCH 26/46] fix a struct init --- src/extras/custompipes.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index bb3ebd2e..e6dff12a 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -133,7 +133,11 @@ EnvMapRender(void) EnvMapCam->getFrame()->matrix.pos = camPos; EnvMapCam->getFrame()->transform(&EnvMapCam->getFrame()->matrix, rw::COMBINEREPLACE); - rw::RGBA skycol = { CTimeCycle::GetSkyBottomRed(), CTimeCycle::GetSkyBottomGreen(), CTimeCycle::GetSkyBottomBlue(), 255 }; + rw::RGBA skycol; + skycol.red = CTimeCycle::GetSkyBottomRed(); + skycol.green = CTimeCycle::GetSkyBottomGreen(); + skycol.blue = CTimeCycle::GetSkyBottomBlue(); + skycol.alpha = 255; EnvMapCam->clear(&skycol, rwCAMERACLEARZ|rwCAMERACLEARIMAGE); RwCameraBeginUpdate(EnvMapCam); bRenderingEnvMap = true; From 36e64dbd22a7e5ec6fc33a5087ed9788f1874f84 Mon Sep 17 00:00:00 2001 From: erorcun Date: Sun, 27 Dec 2020 05:23:37 +0300 Subject: [PATCH 27/46] signed/unsigned fixes, and some other fixes --- src/core/Camera.cpp | 4 ++-- src/core/EventList.cpp | 4 ++-- src/core/EventList.h | 2 +- src/core/FileMgr.cpp | 14 ++++++++------ src/core/FileMgr.h | 6 +++--- src/core/Fire.cpp | 9 ++++----- src/core/Streaming.h | 8 ++++---- src/core/common.h | 5 +++++ src/peds/PedType.cpp | 17 ++++++++--------- src/rw/VisibilityPlugins.cpp | 6 +++--- src/rw/VisibilityPlugins.h | 6 +++--- src/text/Text.cpp | 6 +++--- src/text/Text.h | 4 ++-- 13 files changed, 48 insertions(+), 43 deletions(-) diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index 1f498102..b46bd2da 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -2986,12 +2986,12 @@ CCamera::LoadTrainCamNodes(char const *name) char token[16] = { 0 }; char filename[16] = { 0 }; uint8 *buf; - size_t bufpos = 0; + ssize_t bufpos = 0; int field = 0; int tokpos = 0; char c; int i; - size_t len; + ssize_t len; strcpy(filename, name); len = (int)strlen(filename); diff --git a/src/core/EventList.cpp b/src/core/EventList.cpp index 8d69ba78..93f72d4e 100644 --- a/src/core/EventList.cpp +++ b/src/core/EventList.cpp @@ -120,7 +120,7 @@ CEventList::RegisterEvent(eEventType type, eEventEntity entityType, CEntity *ent } if(criminal == FindPlayerPed()) - ReportCrimeForEvent(type, (uintptr)ent, copsDontCare); + ReportCrimeForEvent(type, (intptr)ent, copsDontCare); } void @@ -198,7 +198,7 @@ CEventList::FindClosestEvent(eEventType type, CVector posn, int32 *event) } void -CEventList::ReportCrimeForEvent(eEventType type, int32 crimeId, bool copsDontCare) +CEventList::ReportCrimeForEvent(eEventType type, intptr crimeId, bool copsDontCare) { eCrimeType crime; switch(type){ diff --git a/src/core/EventList.h b/src/core/EventList.h index 8840afc4..4ced3a83 100644 --- a/src/core/EventList.h +++ b/src/core/EventList.h @@ -59,7 +59,7 @@ public: static bool GetEvent(eEventType type, int32 *event); static void ClearEvent(int32 event); static bool FindClosestEvent(eEventType type, CVector posn, int32 *event); - static void ReportCrimeForEvent(eEventType type, int32, bool); + static void ReportCrimeForEvent(eEventType type, intptr, bool); }; extern CEvent gaEvent[NUMEVENTS]; \ No newline at end of file diff --git a/src/core/FileMgr.cpp b/src/core/FileMgr.cpp index 6e6a8efc..99923ddf 100644 --- a/src/core/FileMgr.cpp +++ b/src/core/FileMgr.cpp @@ -240,20 +240,22 @@ CFileMgr::SetDirMyDocuments(void) mychdir(_psGetUserFilesFolder()); } -size_t +ssize_t CFileMgr::LoadFile(const char *file, uint8 *buf, int unused, const char *mode) { int fd; - size_t n, len; + ssize_t n, len; fd = myfopen(file, mode); if(fd == 0) - return 0; + return -1; len = 0; do{ n = myfread(buf + len, 1, 0x4000, fd); - if(n < 0) +#ifndef FIX_BUGS + if (n < 0) return -1; +#endif len += n; }while(n == 0x4000); buf[len] = 0; @@ -274,13 +276,13 @@ CFileMgr::OpenFileForWriting(const char *file) } size_t -CFileMgr::Read(int fd, const char *buf, int len) +CFileMgr::Read(int fd, const char *buf, ssize_t len) { return myfread((void*)buf, 1, len, fd); } size_t -CFileMgr::Write(int fd, const char *buf, int len) +CFileMgr::Write(int fd, const char *buf, ssize_t len) { return myfwrite((void*)buf, 1, len, fd); } diff --git a/src/core/FileMgr.h b/src/core/FileMgr.h index 4734720e..98a78360 100644 --- a/src/core/FileMgr.h +++ b/src/core/FileMgr.h @@ -9,12 +9,12 @@ public: static void ChangeDir(const char *dir); static void SetDir(const char *dir); static void SetDirMyDocuments(void); - static size_t LoadFile(const char *file, uint8 *buf, int unused, const char *mode); + static ssize_t LoadFile(const char *file, uint8 *buf, int unused, const char *mode); static int OpenFile(const char *file, const char *mode); static int OpenFile(const char *file) { return OpenFile(file, "rb"); } static int OpenFileForWriting(const char *file); - static size_t Read(int fd, const char *buf, int len); - static size_t Write(int fd, const char *buf, int len); + static size_t Read(int fd, const char *buf, ssize_t len); + static size_t Write(int fd, const char *buf, ssize_t len); static bool Seek(int fd, int offset, int whence); static bool ReadLine(int fd, char *buf, int len); static int CloseFile(int fd); diff --git a/src/core/Fire.cpp b/src/core/Fire.cpp index 2c57c066..984b21bb 100644 --- a/src/core/Fire.cpp +++ b/src/core/Fire.cpp @@ -43,7 +43,7 @@ CFire::ProcessFire(void) float fDamagePlayer; float fDamagePeds; float fDamageVehicle; - int8 nRandNumber; + int16 nRandNumber; float fGreen; float fRed; CVector lightpos; @@ -135,11 +135,10 @@ CFire::ProcessFire(void) CShadows::StoreStaticShadow((uintptr)this, SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &lightpos, 7.0f, 0.0f, 0.0f, -7.0f, 0, nRandNumber / 2, nRandNumber / 2, 0, 10.0f, 1.0f, 40.0f, 0, 0.0f); } - fGreen = nRandNumber / 128; - fRed = nRandNumber / 128; + fGreen = nRandNumber / 128.f; + fRed = nRandNumber / 128.f; - CPointLights::AddLight(0, m_vecPos, CVector(0.0f, 0.0f, 0.0f), - 12.0f, fRed, fGreen, 0, 0, 0); + CPointLights::AddLight(CPointLights::LIGHT_POINT, m_vecPos, CVector(0.0f, 0.0f, 0.0f), 12.0f, fRed, fGreen, 0, 0, 0); } else { Extinguish(); } diff --git a/src/core/Streaming.h b/src/core/Streaming.h index ee9183a5..0e2e89be 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -140,7 +140,7 @@ public: static bool RemoveLeastUsedModel(void); static void RemoveAllUnusedModels(void); static void RemoveUnusedModelsInLoadedList(void); - static bool RemoveReferencedTxds(size_t mem); + static bool RemoveReferencedTxds(size_t mem); // originally signed static int32 GetAvailableVehicleSlot(void); static bool IsTxdUsedByRequestedModels(int32 txdId); static bool AddToLoadedVehiclesList(int32 modelId); @@ -176,11 +176,11 @@ public: static void DeleteFarAwayRwObjects(const CVector &pos); static void DeleteAllRwObjects(void); static void DeleteRwObjectsAfterDeath(const CVector &pos); - static void DeleteRwObjectsBehindCamera(size_t mem); + static void DeleteRwObjectsBehindCamera(size_t mem); // originally signed static void DeleteRwObjectsInSectorList(CPtrList &list); static void DeleteRwObjectsInOverlapSectorList(CPtrList &list, int32 x, int32 y); - static bool DeleteRwObjectsBehindCameraInSectorList(CPtrList &list, size_t mem); - static bool DeleteRwObjectsNotInFrustumInSectorList(CPtrList &list, size_t mem); + static bool DeleteRwObjectsBehindCameraInSectorList(CPtrList &list, size_t mem); // originally signed + static bool DeleteRwObjectsNotInFrustumInSectorList(CPtrList &list, size_t mem); // originally signed static void LoadScene(const CVector &pos); diff --git a/src/core/common.h b/src/core/common.h index ffae30bf..50002ab5 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -73,11 +73,16 @@ typedef int16_t int16; typedef uint32_t uint32; typedef int32_t int32; typedef uintptr_t uintptr; +typedef intptr_t intptr; typedef uint64_t uint64; typedef int64_t int64; // hardcode ucs-2 typedef uint16_t wchar; +#if defined(_MSC_VER) +typedef ptrdiff_t ssize_t; +#endif + #ifndef nil #define nil NULL #endif diff --git a/src/peds/PedType.cpp b/src/peds/PedType.cpp index 598c379d..bacb1a78 100644 --- a/src/peds/PedType.cpp +++ b/src/peds/PedType.cpp @@ -45,7 +45,7 @@ CPedType::LoadPedData(void) char *buf; char line[256]; char word[32]; - size_t bp, buflen; + ssize_t bp, buflen; int lp, linelen; int type; uint32 flags; @@ -54,9 +54,9 @@ CPedType::LoadPedData(void) type = NUM_PEDTYPES; buf = new char[16 * 1024]; - CFileMgr::SetDir("DATA"); - buflen = CFileMgr::LoadFile("PED.DAT", (uint8*)buf, 16 * 1024, "r"); - CFileMgr::SetDir(""); + CFileMgr::SetDir("DATA"); + buflen = CFileMgr::LoadFile("PED.DAT", (uint8*)buf, 16 * 1024, "r"); + CFileMgr::SetDir(""); for(bp = 0; bp < buflen; ){ // read file line by line @@ -246,19 +246,18 @@ CPedStats::LoadPedStats(void) char *buf; char line[256]; char name[32]; - size_t bp, buflen; + ssize_t bp, buflen; int lp, linelen; int type; float fleeDist, headingChangeRate, attackStrength, defendWeakness; int fear, temper, lawfullness, sexiness, flags; - type = 0; buf = new char[16 * 1024]; - CFileMgr::SetDir("DATA"); - buflen = CFileMgr::LoadFile("PEDSTATS.DAT", (uint8*)buf, 16 * 1024, "r"); - CFileMgr::SetDir(""); + CFileMgr::SetDir("DATA"); + buflen = CFileMgr::LoadFile("PEDSTATS.DAT", (uint8*)buf, 16 * 1024, "r"); + CFileMgr::SetDir(""); for(bp = 0; bp < buflen; ){ // read file line by line diff --git a/src/rw/VisibilityPlugins.cpp b/src/rw/VisibilityPlugins.cpp index 21e00725..916696de 100644 --- a/src/rw/VisibilityPlugins.cpp +++ b/src/rw/VisibilityPlugins.cpp @@ -936,12 +936,12 @@ CVisibilityPlugins::FrameCopyConstructor(void *dst, const void *src, int32, int3 } void -CVisibilityPlugins::SetFrameHierarchyId(RwFrame *frame, uintptr id) +CVisibilityPlugins::SetFrameHierarchyId(RwFrame *frame, intptr id) { FRAMEEXT(frame)->id = id; } -uintptr +intptr CVisibilityPlugins::GetFrameHierarchyId(RwFrame *frame) { return FRAMEEXT(frame)->id; @@ -978,7 +978,7 @@ void CVisibilityPlugins::SetClumpModelInfo(RpClump *clump, CClumpModelInfo *modelInfo) { CVehicleModelInfo *vmi; - SetFrameHierarchyId(RpClumpGetFrame(clump), (uintptr)modelInfo); + SetFrameHierarchyId(RpClumpGetFrame(clump), (intptr)modelInfo); // Unused switch (modelInfo->GetModelType()) { diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h index dd02f2e1..0721dfcc 100644 --- a/src/rw/VisibilityPlugins.h +++ b/src/rw/VisibilityPlugins.h @@ -103,10 +103,10 @@ public: struct FrameExt { // BUG: this is abused to hold a pointer by SetClumpModelInfo - uintptr id; + intptr id; }; - static void SetFrameHierarchyId(RwFrame *frame, uintptr id); - static uintptr GetFrameHierarchyId(RwFrame *frame); + static void SetFrameHierarchyId(RwFrame *frame, intptr id); + static intptr GetFrameHierarchyId(RwFrame *frame); static void *FrameConstructor(void *object, int32 offset, int32 len); static void *FrameDestructor(void *object, int32 offset, int32 len); diff --git a/src/text/Text.cpp b/src/text/Text.cpp index f3324fd7..0c63ced7 100644 --- a/src/text/Text.cpp +++ b/src/text/Text.cpp @@ -23,7 +23,7 @@ CText::Load(void) { uint8 *filedata; char filename[32], type[4]; - intptr_t offset, length; + ssize_t offset, length; size_t sectlen; Unload(); @@ -176,7 +176,7 @@ CText::UpperCase(wchar *s) void -CKeyArray::Load(size_t length, uint8 *data, intptr_t *offset) +CKeyArray::Load(size_t length, uint8 *data, ssize_t *offset) { size_t i; uint8 *rawbytes; @@ -256,7 +256,7 @@ CKeyArray::Search(const char *key) void -CData::Load(size_t length, uint8 *data, intptr_t *offset) +CData::Load(size_t length, uint8 *data, ssize_t *offset) { size_t i; uint8 *rawbytes; diff --git a/src/text/Text.h b/src/text/Text.h index 52c17e27..ed978a8b 100644 --- a/src/text/Text.h +++ b/src/text/Text.h @@ -26,7 +26,7 @@ public: CKeyArray(void) : entries(nil), numEntries(0) {} ~CKeyArray(void) { Unload(); } - void Load(size_t length, uint8 *data, intptr_t *offset); + void Load(size_t length, uint8 *data, ssize_t *offset); void Unload(void); void Update(wchar *chars); CKeyEntry *BinarySearch(const char *key, CKeyEntry *entries, int16 low, int16 high); @@ -45,7 +45,7 @@ public: CData(void) : chars(nil), numChars(0) {} ~CData(void) { Unload(); } - void Load(size_t length, uint8 *data, intptr_t *offset); + void Load(size_t length, uint8 *data, ssize_t *offset); void Unload(void); }; From 0b59eeb2bf7e7079147e5e3e9063e556cd93e97b Mon Sep 17 00:00:00 2001 From: erorcun Date: Sun, 27 Dec 2020 05:59:51 +0300 Subject: [PATCH 28/46] Fix default mouse invert setting, vert. mouse sensitivity, set aspect ratio auto as default --- src/core/Frontend.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 89edc04b..9e2efd73 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -170,7 +170,12 @@ bool CMenuManager::m_PrefsAllowNastyGame = true; bool CMenuManager::m_bStartUpFrontEndRequested; bool CMenuManager::m_bShutDownFrontEndRequested; +#ifdef ASPECT_RATIO_SCALE +int8 CMenuManager::m_PrefsUseWideScreen = AR_AUTO; +#else int8 CMenuManager::m_PrefsUseWideScreen; +#endif + int8 CMenuManager::m_PrefsRadioStation; int32 CMenuManager::m_PrefsBrightness = 256; float CMenuManager::m_PrefsLOD = CRenderer::ms_lodDistScale; @@ -917,7 +922,11 @@ CMenuManager::CheckSliderMovement(int value) case MENUACTION_MOUSESENS: TheCamera.m_fMouseAccelHorzntl += value * 1.0f/200.0f/15.0f; // ??? TheCamera.m_fMouseAccelHorzntl = clamp(TheCamera.m_fMouseAccelHorzntl, 1.0f/3200.0f, 1.0f/200.0f); +#ifdef FIX_BUGS + TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl + 0.0005f; +#else TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl; +#endif break; default: return; @@ -4466,13 +4475,21 @@ CMenuManager::ProcessButtonPresses(void) case HOVEROPTION_INCREASE_MOUSESENS: TheCamera.m_fMouseAccelHorzntl += (1.0f / 3000); TheCamera.m_fMouseAccelHorzntl = clamp(TheCamera.m_fMouseAccelHorzntl, 1.0f / 3200, 1.0f / 200); +#ifdef FIX_BUGS + TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl + 0.0005f; +#else TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl; +#endif SaveSettings(); break; case HOVEROPTION_DECREASE_MOUSESENS: TheCamera.m_fMouseAccelHorzntl -= (1.0f / 3000); TheCamera.m_fMouseAccelHorzntl = clamp(TheCamera.m_fMouseAccelHorzntl, 1.0f / 3200, 1.0f / 200); +#ifdef FIX_BUGS + TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl + 0.0005f; +#else TheCamera.m_fMouseAccelVertical = TheCamera.m_fMouseAccelHorzntl; +#endif SaveSettings(); break; } @@ -4969,7 +4986,11 @@ CMenuManager::ProcessButtonPresses(void) m_PrefsLOD = 1.2f; m_PrefsVsync = true; CRenderer::ms_lodDistScale = 1.2f; +#ifdef ASPECT_RATIO_SCALE + m_PrefsUseWideScreen = AR_AUTO; +#else m_PrefsUseWideScreen = false; +#endif m_PrefsShowSubtitles = true; m_nDisplayVideoMode = m_nPrefsVideoMode; #if GTA_VERSION >= GTA3_PC_11 @@ -5010,7 +5031,12 @@ CMenuManager::ProcessButtonPresses(void) } #endif m_ControlMethod = CONTROL_STANDARD; +#ifdef FIX_BUGS + MousePointerStateHelper.bInvertVertically = true; + TheCamera.m_fMouseAccelVertical = 0.003f; +#else MousePointerStateHelper.bInvertVertically = false; +#endif TheCamera.m_fMouseAccelHorzntl = 0.0025f; CVehicle::m_bDisableMouseSteering = true; TheCamera.m_bHeadBob = false; From 22f12596fd4529582acb4e4a9116a4fad2402219 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 27 Dec 2020 07:38:52 +0200 Subject: [PATCH 29/46] Update readme --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5dff7b91..29f2529e 100644 --- a/README.md +++ b/README.md @@ -41,15 +41,16 @@ Please read the [Coding Style](https://github.com/GTAmodding/re3/blob/master/COD ### Unreversed / incomplete classes (at least the ones we know) The following classes have only unused or practically unused code left: ``` -CMemoryHeap - only on PS2 NameGrid.cpp - only on mobile (a player name grid, either a very early player name code ala GTA1 or a multiplayer leftover) PedDebug.cpp - only on mobile (debug code) HandlingMgr.cpp - debug functions from mobile +CFormationInfo - unused PedAI class that could be found on mobile CVehicle::ProcessBikeWheel - early bike code (only on mobile) CAutomobile::DebugCode - debug function from mobile CBoat::DebugCode - debug function from mobile CBoat::ModifyHandlingValue - debug function from mobile CBoat::DisplayHandlingData - debug function from mobile -TexturePools - only on PC (slight RW modification that we don't actually need) +CStreaming::PrintRequestList - debug function from mobile +d3d8raster.c - only on PC (slight RW modification that we don't actually need) ``` From 0b21fd02d388188e32d25980abab14ce26d47aed Mon Sep 17 00:00:00 2001 From: IlDucci Date: Sun, 27 Dec 2020 12:44:06 +0100 Subject: [PATCH 30/46] Minor changes on the Spanish translation - Replaced a few strings to unify them with reVC. - Fixed some translations on debug and re-exclusive strings. - Fixed the translation of "IMAGING" in the credits. --- gamefiles/TEXT/spanish.gxt | Bin 234866 -> 234854 bytes utils/gxt/spanish.txt | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/gamefiles/TEXT/spanish.gxt b/gamefiles/TEXT/spanish.gxt index 384c79a0c8a281463e150fe39eb2eb201cb3fad4..6b188fc606253a4f2edfb8c03e3d48c6101cee98 100644 GIT binary patch delta 23436 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 diff --git a/utils/gxt/spanish.txt b/utils/gxt/spanish.txt index 425899e4..e57ade67 100644 --- a/utils/gxt/spanish.txt +++ b/utils/gxt/spanish.txt @@ -2283,7 +2283,7 @@ Esta mano de pintura es gratuita. No nos interesa ese modelo. [GA_20] -Tenemos de esos más de los que necesitamos. Lo siento, tío, no hay trato. +De ese modelo tenemos más de los que podemos colocar. Lo siento, tío, no hay trato. [CR_1] La grúa no puede levantar este vehículo. @@ -2554,10 +2554,10 @@ CTheScripts::DbgFlag Cambiar luz blanca grande de depuración [FED_SPR] -Mostrar grupos de peatones en carretera +Mostrar rutas de aceras [FED_SCR] -Mostrar grupos de vehículos en carretera +Mostrar rutas de carreteras [FED_SCZ] Mostrar zonas de máscara selectiva @@ -3499,7 +3499,7 @@ Pulsa ~h~~k~~TOGGLE_SUBMISSIONS~~w~ para activar o desactivar las misiones de ju ~r~¡Tu falta de rapidez ha sido fatal para el paciente! [A_FAIL3] -~r~¡El paciente está muerto! +~r~¡Tu paciente ha muerto! [A_PASS] ¡Paciente a salvo! @@ -4009,7 +4009,7 @@ Distancia recorrida en coche (metros) ''Caos en el aparcamiento'' en segundos [FEST_LS] -Gente salvada con una ambulancia +Personas salvadas con una ambulancia [FEST_CC] Criminales asesinados en misiones de justiciero @@ -4033,7 +4033,7 @@ Misiones superadas ''Corre a por la pasta'': [FEST_H0] -Máximo de puntos de control +Puntos de control alcanzados [FEST_GC] Coches de bandas destruidos: @@ -5934,7 +5934,7 @@ ALLAN WALKER LAZLOW [CRED227] -GUIÓN DE LOCUTORES Y ANUNCIOS +GUIÓN DE LOCUTORES Y CUÑAS [CRED228] DAN HOUSER @@ -6060,7 +6060,7 @@ STEVE K. GREG LAU [CINCAM] -Vista cinematográfica +Cámara cinematográfica [KM1_13] ¡Mete el vehículo en el garaje! @@ -7333,7 +7333,7 @@ ELEGIR MAPA TIPO DE JUEGO [FET_CTL] -AJUSTES DEL MANDO +AJUSTES DE CONTROL [FET_OPT] OPCIONES @@ -7495,7 +7495,7 @@ Espacios de partida disponibles: ¿Guardar la partida actual? [FES_LCG] -¿Cargar partida y seguir jugando? +¿Cargar la partida y seguir jugando? [FEC_FIR] Disparar @@ -7819,7 +7819,7 @@ ESTELAS DISTANCIA DE DIBUJADO [FEM_VSC] -SINCRONÍA DE IMAGEN +SINCRONIZAR IMAGEN [FEM_FRM] LIMITADOR DE FOTOGRAMAS @@ -8046,7 +8046,7 @@ BORDES EN CINEMÁTICAS FORMATO DE IMAGEN [FEM_ISL] -USO DE MEMORIA +USO DE MEMORIA DEL MAPA [FEM_LOW] BAJO From 8b9e9a07a0fb56c3fb95e41f3cf3536a6e13df47 Mon Sep 17 00:00:00 2001 From: erorcun Date: Sun, 27 Dec 2020 17:05:37 +0300 Subject: [PATCH 31/46] Fix peds running to see dead peds in water --- src/peds/Ped.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/peds/Ped.cpp b/src/peds/Ped.cpp index 3d2278bd..4b55e5ce 100644 --- a/src/peds/Ped.cpp +++ b/src/peds/Ped.cpp @@ -707,14 +707,18 @@ CPed::ScanForThreats(void) } } - CPed *deadPed = nil; + CPed *deadPed; if (fearFlags & PED_FLAG_DEADPEDS && CharCreatedBy != MISSION_CHAR - && (deadPed = CheckForDeadPeds()) != nil && (deadPed->GetPosition() - ourPos).MagnitudeSqr() < sq(20.0f)) { + && (deadPed = CheckForDeadPeds()) != nil && (deadPed->GetPosition() - ourPos).MagnitudeSqr() < sq(20.0f) +#ifdef FIX_BUGS + && !deadPed->bIsInWater +#endif + ) { m_pEventEntity = deadPed; m_pEventEntity->RegisterReference((CEntity **) &m_pEventEntity); return PED_FLAG_DEADPEDS; } else { - uint32 flagsOfSomePed = 0; + uint32 flagsOfNearPed = 0; CPed *pedToFearFrom = nil; #ifndef VC_PED_PORTS @@ -724,9 +728,9 @@ CPed::ScanForThreats(void) // BUG: WTF Rockstar?! Putting this here will result in returning the flags of farthest ped to us, since m_nearPeds is sorted by distance. // Fixed at the bottom of the function. - flagsOfSomePed = CPedType::GetFlag(nearPed->m_nPedType); + flagsOfNearPed = CPedType::GetFlag(nearPed->m_nPedType); - if (CPedType::GetFlag(nearPed->m_nPedType) & fearFlags) { + if (flagsOfNearPed & fearFlags) { if (nearPed->m_fHealth > 0.0f && OurPedCanSeeThisOne(m_nearPeds[i])) { // FIX: Taken from VC #ifdef FIX_BUGS @@ -754,9 +758,9 @@ CPed::ScanForThreats(void) } // BUG: Explained at the same occurence of this bug above. Fixed at the bottom of the function. - flagsOfSomePed = CPedType::GetFlag(m_nearPeds[i]->m_nPedType); + flagsOfNearPed = CPedType::GetFlag(m_nearPeds[i]->m_nPedType); - if (flagsOfSomePed & fearFlags) { + if (flagsOfNearPed & fearFlags) { if (m_nearPeds[i]->m_fHealth > 0.0f) { // VC also has ability to include objects to line of sight check here (via last bit of flagsL) @@ -827,8 +831,8 @@ CPed::ScanForThreats(void) if (driver) { // BUG: Same bug as above. Fixed at the bottom of function. - flagsOfSomePed = CPedType::GetFlag(driver->m_nPedType); - if (CPedType::GetFlag(driver->m_nPedType) & fearFlags) { + flagsOfNearPed = CPedType::GetFlag(driver->m_nPedType); + if (flagsOfNearPed & fearFlags) { if (driver->m_fHealth > 0.0f && OurPedCanSeeThisOne(nearVeh->pDriver)) { // FIX: Taken from VC #ifdef FIX_BUGS @@ -850,12 +854,12 @@ CPed::ScanForThreats(void) #ifdef FIX_BUGS if (pedToFearFrom) - flagsOfSomePed = CPedType::GetFlag(((CPed*)m_threatEntity)->m_nPedType); + flagsOfNearPed = CPedType::GetFlag(((CPed*)m_threatEntity)->m_nPedType); else - flagsOfSomePed = 0; + flagsOfNearPed = 0; #endif - return flagsOfSomePed; + return flagsOfNearPed; } } From 4d095a7943ef8220bd28809a52e18dce5c92826d Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 27 Dec 2020 18:29:08 +0200 Subject: [PATCH 32/46] Add Toggle Waypoint text --- gamefiles/TEXT/american.gxt | Bin 220080 -> 220124 bytes utils/gxt/american.txt | 3 +++ 2 files changed, 3 insertions(+) diff --git a/gamefiles/TEXT/american.gxt b/gamefiles/TEXT/american.gxt index 1054ca126d8d797e0405afb6ecd0cb36126fdbbe..aba89f11b98c317a3648916fcd1d237a76807b23 100644 GIT binary patch delta 82 zcmdn6o%hamUbYZ#*GPuCjci?}+-vSKF}S(<#)pIlZ0!&%wb4nP+$mWNMxvFC;*COGUPFoFfcFx0C#^E+W-In delta 37 tcmcb!op-}_UbYZ#*T^rm8`-){H_tIG@L*ii%v;yaTgSMaw~lH3T>vOT4;cUe diff --git a/utils/gxt/american.txt b/utils/gxt/american.txt index cdee16f9..6410d0d9 100644 --- a/utils/gxt/american.txt +++ b/utils/gxt/american.txt @@ -8064,6 +8064,9 @@ XBOX [FEC_IVP] INVERT PAD VERTICALLY +[FEM_TWP] +Toggle Waypoint + { end of file } [DUMMY] From bea561d44d3f2a767b08c56899b026a369686caf Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 27 Dec 2020 18:15:13 +0100 Subject: [PATCH 33/46] add neo files --- gamefiles/neo/carTweakingTable.dat | 104 +++++++++++++++++++++ gamefiles/neo/neo.txd | Bin 0 -> 118696 bytes gamefiles/neo/rimTweakingTable.dat | 130 +++++++++++++++++++++++++++ gamefiles/neo/worldTweakingTable.dat | 26 ++++++ 4 files changed, 260 insertions(+) create mode 100644 gamefiles/neo/carTweakingTable.dat create mode 100644 gamefiles/neo/neo.txd create mode 100644 gamefiles/neo/rimTweakingTable.dat create mode 100644 gamefiles/neo/worldTweakingTable.dat diff --git a/gamefiles/neo/carTweakingTable.dat b/gamefiles/neo/carTweakingTable.dat new file mode 100644 index 00000000..5e707ae2 --- /dev/null +++ b/gamefiles/neo/carTweakingTable.dat @@ -0,0 +1,104 @@ +# Fresnal RO Table +# SUNNY CLOUDY RAINY, FOGGY +0.400000 0.400000 0.400000 0.150000 # Midnight +0.400000 0.400000 0.400000 0.150000 # 1am +0.400000 0.400000 0.400000 0.150000 # 2am +0.400000 0.400000 0.400000 0.150000 # 3am +0.400000 0.400000 0.400000 0.150000 # 4am +0.400000 0.400000 0.400000 0.150000 # 5am +0.400000 0.400000 0.400000 0.150000 # 6am +0.400000 0.400000 0.400000 0.150000 # 7am +0.400000 0.400000 0.400000 0.150000 # 8am +0.400000 0.400000 0.400000 0.150000 # 9am +0.400000 0.400000 0.400000 0.150000 # 10am +0.400000 0.400000 0.400000 0.150000 # 11am +0.400000 0.400000 0.400000 0.150000 # Midday +0.400000 0.400000 0.400000 0.150000 # 1pm +0.400000 0.400000 0.400000 0.150000 # 2pm +0.400000 0.400000 0.400000 0.150000 # 3pm +0.400000 0.400000 0.400000 0.150000 # 4pm +0.400000 0.400000 0.400000 0.150000 # 5pm +0.400000 0.400000 0.400000 0.150000 # 6pm +0.400000 0.400000 0.400000 0.150000 # 7pm +0.400000 0.400000 0.400000 0.150000 # 8pm +0.400000 0.400000 0.400000 0.150000 # 9pm +0.400000 0.400000 0.400000 0.150000 # 10pm +0.400000 0.400000 0.400000 0.150000 # 11pm +# Specular Power Table +# SUNNY CLOUDY RAINY, FOGGY +128.000000 80.000000 30.000000 128.000000 # Midnight +128.000000 80.000000 30.000000 128.000000 # 1am +128.000000 80.000000 30.000000 128.000000 # 2am +128.000000 80.000000 30.000000 128.000000 # 3am +128.000000 80.000000 30.000000 128.000000 # 4am +80.000000 60.000000 30.000000 128.000000 # 5am +80.000000 60.000000 30.000000 128.000000 # 6am +80.000000 60.000000 30.000000 128.000000 # 7am +80.000000 60.000000 30.000000 128.000000 # 8am +80.000000 60.000000 30.000000 128.000000 # 9am +80.000000 60.000000 30.000000 128.000000 # 10am +80.000000 60.000000 30.000000 128.000000 # 11am +80.000000 60.000000 30.000000 128.000000 # Midday +80.000000 60.000000 30.000000 128.000000 # 1pm +80.000000 60.000000 30.000000 128.000000 # 2pm +80.000000 60.000000 30.000000 128.000000 # 3pm +80.000000 60.000000 30.000000 128.000000 # 4pm +128.000000 80.000000 30.000000 128.000000 # 5pm +128.000000 80.000000 30.000000 128.000000 # 6pm +128.000000 80.000000 30.000000 128.000000 # 7pm +128.000000 80.000000 30.000000 128.000000 # 8pm +128.000000 80.000000 30.000000 128.000000 # 9pm +128.000000 80.000000 30.000000 128.000000 # 10pm +128.000000 80.000000 30.000000 128.000000 # 11pm +# Diffuse Colour Modifier Table (Red,Green,Blue,Amount) +# SUNNY CLOUDY RAINY, FOGGY +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midnight +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11am +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # Midday +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 1pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 2pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 3pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 4pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 5pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 6pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 7pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 8pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 9pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 10pm +0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 0, 0, 0, 0 # 11pm +# Specular Colour Table (Red,Green,Blue,Amount) +# SUNNY CLOUDY RAINY, FOGGY + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midnight + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1am + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2am + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3am + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11am +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # Midday +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 1pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 2pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 3pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 4pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 5pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 6pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 7pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 8pm +178, 178, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 9pm + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 10pm + 81, 150, 178, 100 178, 178, 178, 50 178, 178, 178, 75 178, 178, 178, 20 # 11pm diff --git a/gamefiles/neo/neo.txd b/gamefiles/neo/neo.txd new file mode 100644 index 0000000000000000000000000000000000000000..d20215e0b73c1f883288b629e31c1d76a460b6a3 GIT binary patch literal 118696 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 literal 0 HcmV?d00001 diff --git a/gamefiles/neo/rimTweakingTable.dat b/gamefiles/neo/rimTweakingTable.dat new file mode 100644 index 00000000..058d55eb --- /dev/null +++ b/gamefiles/neo/rimTweakingTable.dat @@ -0,0 +1,130 @@ +# Ramp Start Table +# SUNNY CLOUDY RAINY, FOGGY +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midnight +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11am +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # Midday +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 1pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 2pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 3pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 4pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 5pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 6pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 7pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 8pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 9pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 10pm +60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 60, 55, 53, 100 # 11pm +# Ramp End Table +# SUNNY CLOUDY RAINY, FOGGY +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # Midnight +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 1am +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 2am +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 3am +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 4am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 7am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 8am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 9am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 10am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 11am +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # Midday +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 1pm +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 2pm +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 3pm +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 4pm +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 5pm +255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 255, 230, 224, 100 # 6pm +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 7pm +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 8pm +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 9pm +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 10pm +190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 190, 171, 167, 100 # 11pm +# Offset Table +# SUNNY CLOUDY RAINY, FOGGY +0 0 0 0 # Midnight +0 0 0 0 # 1am +0 0 0 0 # 2am +0 0 0 0 # 3am +0 0 0 0 # 4am +0 0 0 0 # 5am +0 0 0 0 # 6am +0 0 0 0 # 7am +0 0 0 0 # 8am +0 0 0 0 # 9am +0 0 0 0 # 10am +0 0 0 0 # 11am +0 0 0 0 # Midday +0 0 0 0 # 1pm +0 0 0 0 # 2pm +0 0 0 0 # 3pm +0 0 0 0 # 4pm +0 0 0 0 # 5pm +0 0 0 0 # 6pm +0 0 0 0 # 7pm +0 0 0 0 # 8pm +0 0 0 0 # 9pm +0 0 0 0 # 10pm +0 0 0 0 # 11pm +# Scale Table +# SUNNY CLOUDY RAINY, FOGGY +1.5 1.5 1.0 1.0 # Midnight +1.5 1.5 1.0 1.0 # 1am +1.5 1.5 1.0 1.0 # 2am +1.5 1.5 1.5 1.5 # 3am +2.0 2.0 2.0 2.0 # 4am +2.0 2.0 2.0 2.0 # 5am +2.0 2.0 2.0 2.0 # 6am +2.5 2.5 2.0 2.0 # 7am +2.5 2.5 2.0 2.0 # 8am +2.5 2.5 2.0 2.0 # 9am +2.5 2.5 2.0 2.0 # 10am +2.5 2.5 2.0 2.0 # 11am +2.5 2.5 2.0 2.0 # Midday +2.5 2.5 2.0 2.0 # 1pm +2.5 2.5 2.0 2.0 # 2pm +2.5 2.5 2.0 2.0 # 3pm +2.5 2.5 2.0 2.0 # 4pm +2.0 2.0 2.0 2.0 # 5pm +2.0 2.0 2.0 2.0 # 6pm +2.0 2.0 2.0 2.0 # 7pm +1.5 1.5 1.5 1.5 # 8pm +1.5 1.5 1.0 1.0 # 9pm +1.5 1.5 1.0 1.0 # 10pm +1.5 1.5 1.0 1.0 # 11pm +# Scaling Table +# SUNNY CLOUDY RAINY, FOGGY +0.2 0.2 0.1 0.1 # Midnight +0.2 0.2 0.1 0.1 # 1am +0.7 0.7 0.2 0.2 # 6am +0.7 0.7 0.2 0.2 # 3am +0.7 0.7 0.2 0.2 # 4am +2.0 2.0 0.3 0.3 # 5am +3.0 3.0 0.3 0.3 # 6am +4.0 4.0 0.3 0.3 # 7am +5.0 5.0 0.3 0.3 # 8am +6.0 6.0 1.3 1.3 # 9am +6.0 6.0 2.0 2.0 # 10am +6.0 6.0 2.0 2.0 # 11am +6.0 6.0 2.0 2.0 # Midday +6.0 6.0 2.0 2.0 # 1pm +6.0 6.0 1.3 1.3 # 6pm +5.0 5.0 0.3 0.3 # 3pm +4.0 4.0 0.3 0.3 # 4pm +3.0 3.0 0.3 0.3 # 5pm +2.0 2.0 0.3 0.3 # 6pm +0.7 0.7 0.2 0.2 # 7pm +0.7 0.7 0.2 0.2 # 8pm +0.7 0.7 0.2 0.2 # 9pm +0.2 0.2 0.1 0.1 # 10pm +0.2 0.2 0.1 0.1 # 11pm diff --git a/gamefiles/neo/worldTweakingTable.dat b/gamefiles/neo/worldTweakingTable.dat new file mode 100644 index 00000000..b054fa38 --- /dev/null +++ b/gamefiles/neo/worldTweakingTable.dat @@ -0,0 +1,26 @@ +# LM blend Table +# SUNNY CLOUDY RAINY FOGGY +0.700000 0.700000 0.700000 0.550000 # Midnight +0.700000 0.700000 0.700000 0.550000 # 1am +0.700000 0.700000 0.700000 0.550000 # 2am +0.700000 0.700000 0.700000 0.550000 # 3am +0.700000 0.700000 0.700000 0.550000 # 4am +0.750000 0.750000 0.700000 0.600000 # 5am +0.800000 0.800000 0.750000 0.600000 # 6am +0.850000 0.850000 0.800000 0.650000 # 7am +0.900000 0.900000 0.800000 0.700000 # 8am +0.950000 0.900000 0.800000 0.700000 # 9am +1.000000 0.900000 0.800000 0.700000 # 10am +1.000000 0.900000 0.800000 0.700000 # 11am +1.000000 0.900000 0.800000 0.700000 # Midday +1.000000 0.900000 0.800000 0.700000 # 1pm +1.000000 0.900000 0.800000 0.700000 # 2pm +0.950000 0.900000 0.800000 0.700000 # 3pm +0.900000 0.900000 0.800000 0.700000 # 4pm +0.850000 0.850000 0.800000 0.650000 # 5pm +0.800000 0.800000 0.750000 0.600000 # 6pm +0.750000 0.750000 0.700000 0.600000 # 7pm +0.700000 0.700000 0.700000 0.550000 # 8pm +0.700000 0.700000 0.700000 0.550000 # 9pm +0.700000 0.700000 0.700000 0.550000 # 10pm +0.700000 0.700000 0.700000 0.550000 # 11pm From 4d2105bf55944ef80a9232bdeb94f77fc6fe94c2 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 27 Dec 2020 18:22:04 +0100 Subject: [PATCH 34/46] tiny rendering fix --- src/extras/custompipes_d3d9.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index b39efd47..27006c6a 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -245,6 +245,7 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) drawInst(header, inst); inst++; } + d3d::setTexture(1, nil); } void From ab80ff71323a057caf66b3d2595f9d5f8786cf3b Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 27 Dec 2020 20:34:12 +0100 Subject: [PATCH 35/46] handling unit conversion --- src/vehicles/HandlingMgr.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vehicles/HandlingMgr.cpp b/src/vehicles/HandlingMgr.cpp index 7b74b590..3ac6f057 100644 --- a/src/vehicles/HandlingMgr.cpp +++ b/src/vehicles/HandlingMgr.cpp @@ -2,6 +2,7 @@ #include "main.h" #include "FileMgr.h" +#include "Physical.h" #include "HandlingMgr.h" cHandlingDataMgr mod_HandlingManager; @@ -189,17 +190,17 @@ cHandlingDataMgr::FindExactWord(const char *word, const char *words, int wordLen void cHandlingDataMgr::ConvertDataToGameUnits(tHandlingData *handling) { - // TODO: figure out what exactly is being converted here + // acceleration is in ms^-2, but we need mf^-2 where f is one frame time (50fps) float velocity, a, b, specificVolume; - handling->Transmission.fEngineAcceleration /= 2500.0f; - handling->Transmission.fMaxVelocity /= 180.0f; - handling->fBrakeDeceleration /= 2500.0f; + handling->Transmission.fEngineAcceleration *= 1.0f/(50.0f*50.0f); + handling->Transmission.fMaxVelocity *= 1000.0f/(60.0f*60.0f * 50.0f); + handling->fBrakeDeceleration *= 1.0f/(50.0f*50.0f); handling->fTurnMass = (sq(handling->Dimension.x) + sq(handling->Dimension.y)) * handling->fMass / 12.0f; if(handling->fTurnMass < 10.0f) handling->fTurnMass *= 5.0f; handling->fInvMass = 1.0f/handling->fMass; - handling->fBuoyancy = 100.0f/handling->nPercentSubmerged * 0.008f*handling->fMass; + handling->fBuoyancy = 100.0f/handling->nPercentSubmerged * GRAVITY*handling->fMass; // What the hell is going on here? specificVolume = handling->Dimension.x*handling->Dimension.z*0.5f / handling->fMass; // ? From beb0ec673c6c84d0216f97890afdf4fdc3747b26 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 27 Dec 2020 20:38:05 +0100 Subject: [PATCH 36/46] rename unused field --- src/vehicles/HandlingMgr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vehicles/HandlingMgr.h b/src/vehicles/HandlingMgr.h index 23bd9681..05876201 100644 --- a/src/vehicles/HandlingMgr.h +++ b/src/vehicles/HandlingMgr.h @@ -108,7 +108,7 @@ struct tHandlingData float fSteeringLock; float fTractionLoss; float fTractionBias; - float fABS; // should be VC leftover + float fUnused; float fSuspensionForceLevel; float fSuspensionDampingLevel; float fSuspensionUpperLimit; From cd24936ca9d4558974858c682e22ec556d0d0228 Mon Sep 17 00:00:00 2001 From: erorcun Date: Sun, 27 Dec 2020 23:55:13 +0300 Subject: [PATCH 37/46] Dynamically add pipelines options, only if neo.txd exists --- src/core/Frontend.cpp | 7 +++++++ src/core/MenuScreensCustom.cpp | 19 ++++--------------- src/core/main.cpp | 8 -------- src/core/re3.cpp | 26 +++++++++++++++++++++++++- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 9e2efd73..72739f7b 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -3744,6 +3744,13 @@ CMenuManager::LoadSettings() strcpy(m_PrefsSkinFile, DEFAULT_SKIN_NAME); strcpy(m_aSkinName, DEFAULT_SKIN_NAME); } + +#ifdef CUSTOM_FRONTEND_OPTIONS + // Apparently this func. can be run multiple times at the start. + if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) { + CustomFrontendOptionsPopulate(); + } +#endif #ifdef LOAD_INI_SETTINGS LoadINISettings(); // needs frontend options to be loaded #endif diff --git a/src/core/MenuScreensCustom.cpp b/src/core/MenuScreensCustom.cpp index d9fc5065..9a763f8c 100644 --- a/src/core/MenuScreensCustom.cpp +++ b/src/core/MenuScreensCustom.cpp @@ -67,16 +67,6 @@ #define POSTFX_SELECTORS #endif -#ifdef EXTENDED_PIPELINES - #define PIPELINES_SELECTOR \ - MENUACTION_CFO_SELECT, "FED_VPL", { new CCFOSelect((int8*)&CustomPipes::VehiclePipeSwitch, "VehiclePipeline", vehPipelineNames, ARRAY_SIZE(vehPipelineNames), false, nil) }, \ - MENUACTION_CFO_SELECT, "FED_PRM", { new CCFOSelect((int8*)&CustomPipes::RimlightEnable, "NeoRimLight", off_on, 2, false, nil) }, \ - MENUACTION_CFO_SELECT, "FED_WLM", { new CCFOSelect((int8*)&CustomPipes::LightmapEnable, "NeoLightMaps", off_on, 2, false, nil) }, \ - MENUACTION_CFO_SELECT, "FED_RGL", { new CCFOSelect((int8*)&CustomPipes::GlossEnable, "NeoRoadGloss", off_on, 2, false, nil) }, -#else - #define PIPELINES_SELECTOR -#endif - #ifdef INVERT_LOOK_FOR_PAD #define INVERT_PAD_SELECTOR MENUACTION_CFO_SELECT, "FEC_IVP", { new CCFOSelect((int8*)&CPad::bInvertLook4Pad, "InvertPad", off_on, 2, false, nil) }, #else @@ -84,7 +74,6 @@ #endif const char *filterNames[] = { "FEM_NON", "FEM_SIM", "FEM_NRM", "FEM_MOB" }; -const char *vehPipelineNames[] = { "FED_MFX", "FED_NEO" }; const char *off_on[] = { "FEM_OFF", "FEM_ON" }; void RestoreDefGraphics(int8 action) { @@ -404,7 +393,7 @@ CMenuScreenCustom aScreens[MENUPAGES] = { CUTSCENE_BORDERS_TOGGLE FREE_CAM_TOGGLE POSTFX_SELECTORS - PIPELINES_SELECTOR + // re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined MENUACTION_RESTOREDEF, "FET_DEF", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, }, @@ -831,14 +820,14 @@ CMenuScreenCustom aScreens[MENUPAGES] = { MENUACTION_FRAMESYNC, "FEM_VSC", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, MENUACTION_FRAMELIMIT, "FEM_FRM", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, MULTISAMPLING_SELECTOR + ISLAND_LOADING_SELECTOR + DUALPASS_SELECTOR #ifdef EXTENDED_COLOURFILTER POSTFX_SELECTORS #else MENUACTION_TRAILS, "FED_TRA", { nil, SAVESLOT_NONE, MENUPAGE_DISPLAY_SETTINGS }, #endif - PIPELINES_SELECTOR - ISLAND_LOADING_SELECTOR - DUALPASS_SELECTOR + // re3.cpp inserts here pipeline selectors if neo/neo.txd exists and EXTENDED_PIPELINES defined MENUACTION_CFO_DYNAMIC, "FET_DEF", { new CCFODynamic(nil, nil, nil, RestoreDefGraphics) }, MENUACTION_CHANGEMENU, "FEDS_TB", { nil, SAVESLOT_NONE, MENUPAGE_NONE }, }, diff --git a/src/core/main.cpp b/src/core/main.cpp index 3a855e20..4b70a153 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -66,7 +66,6 @@ #include "postfx.h" #include "custompipes.h" #include "screendroplets.h" -#include "frontendoption.h" #include "MemoryHeap.h" GlobalScene Scene; @@ -481,13 +480,6 @@ Initialise3D(void *param) DebugMenuInit(); DebugMenuPopulate(); #endif // !DEBUGMENU -#ifdef CUSTOM_FRONTEND_OPTIONS - // Apparently this func. can be run multiple times at the start. - if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) { - // needs stored language and TheText to be loaded, and last TheText reload is at the start of here - CustomFrontendOptionsPopulate(); - } -#endif bool ret = CGame::InitialiseRenderWare(); #ifdef EXTENDED_PIPELINES CustomPipes::CustomPipeInit(); // need Scene.world for this diff --git a/src/core/re3.cpp b/src/core/re3.cpp index acb6caa2..87244e2a 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -30,9 +30,9 @@ #include "postfx.h" #include "custompipes.h" #include "MemoryHeap.h" +#include "FileMgr.h" #ifdef DONT_TRUST_RECOGNIZED_JOYSTICKS -#include "FileMgr.h" #include "ControllerConfig.h" #endif @@ -79,6 +79,30 @@ void CustomFrontendOptionsPopulate(void) { // Moved to an array in MenuScreensCustom.cpp, but APIs are still available. see frontendoption.h + + // These work only if we have neo folder, so they're dynamically added +#ifdef EXTENDED_PIPELINES + const char *vehPipelineNames[] = { "FED_MFX", "FED_NEO" }; + const char *off_on[] = { "FEM_OFF", "FEM_ON" }; + int fd = CFileMgr::OpenFile("neo/neo.txd","r"); + if (fd) { +#ifdef GRAPHICS_MENU_OPTIONS + FrontendOptionSetCursor(MENUPAGE_GRAPHICS_SETTINGS, -3, false); + FrontendOptionAddSelect("FED_VPL", vehPipelineNames, ARRAY_SIZE(vehPipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "VehiclePipeline"); + FrontendOptionAddSelect("FED_PRM", off_on, 2, (int8*)&CustomPipes::RimlightEnable, false, nil, "NeoRimLight"); + FrontendOptionAddSelect("FED_WLM", off_on, 2, (int8*)&CustomPipes::LightmapEnable, false, nil, "NeoLightMaps"); + FrontendOptionAddSelect("FED_RGL", off_on, 2, (int8*)&CustomPipes::GlossEnable, false, nil, "NeoRoadGloss"); +#else + FrontendOptionSetCursor(MENUPAGE_DISPLAY_SETTINGS, -3, false); + FrontendOptionAddSelect("FED_VPL", vehPipelineNames, ARRAY_SIZE(vehPipelineNames), (int8*)&CustomPipes::VehiclePipeSwitch, false, nil, "VehiclePipeline"); + FrontendOptionAddSelect("FED_PRM", off_on, 2, (int8*)&CustomPipes::RimlightEnable, false, nil, "NeoRimLight"); + FrontendOptionAddSelect("FED_WLM", off_on, 2, (int8*)&CustomPipes::LightmapEnable, false, nil, "NeoLightMaps"); + FrontendOptionAddSelect("FED_RGL", off_on, 2, (int8*)&CustomPipes::GlossEnable, false, nil, "NeoRoadGloss"); +#endif + CFileMgr::CloseFile(fd); + } +#endif + } #endif From 38a1fef5c1e22c58ae4dd316800a162b04e22aad Mon Sep 17 00:00:00 2001 From: erorcun Date: Sun, 27 Dec 2020 23:46:15 +0300 Subject: [PATCH 38/46] move cfo populate func. --- src/core/Frontend.cpp | 8 +------- src/core/Game.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 72739f7b..13fb1add 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -3744,13 +3744,7 @@ CMenuManager::LoadSettings() strcpy(m_PrefsSkinFile, DEFAULT_SKIN_NAME); strcpy(m_aSkinName, DEFAULT_SKIN_NAME); } - -#ifdef CUSTOM_FRONTEND_OPTIONS - // Apparently this func. can be run multiple times at the start. - if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) { - CustomFrontendOptionsPopulate(); - } -#endif + #ifdef LOAD_INI_SETTINGS LoadINISettings(); // needs frontend options to be loaded #endif diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 126f0341..ff87b95a 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -32,6 +32,7 @@ #include "Fluff.h" #include "Font.h" #include "Frontend.h" +#include "frontendoption.h" #include "GameLogic.h" #include "Garages.h" #include "GenericGameStorage.h" @@ -167,6 +168,11 @@ CGame::InitialiseOnceBeforeRW(void) ValidateVersion(); #ifdef EXTENDED_COLOURFILTER CPostFX::InitOnce(); +#endif +#ifdef CUSTOM_FRONTEND_OPTIONS + // Not needed here but may be needed in future + // if (numCustomFrontendOptions == 0 && numCustomFrontendScreens == 0) + CustomFrontendOptionsPopulate(); #endif return true; } From 498d3a49ac2d7701af0456b050702807b544188b Mon Sep 17 00:00:00 2001 From: erorcun Date: Mon, 28 Dec 2020 00:15:05 +0300 Subject: [PATCH 39/46] just toggle waypoint --- src/core/Frontend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 13fb1add..4c963a13 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -6099,7 +6099,7 @@ CMenuManager::PrintMap(void) CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEC_MOV")); nextX = MENU_X(30.0f); nextY -= 11.0f; TEXT_PIECE("FEC_MSR", 2.0f); TEXT_PIECE("FEC_IBT", 1.0f); - CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEC_TAR")); + CFont::PrintString(nextX, SCREEN_SCALE_FROM_BOTTOM(nextY), TheText.Get("FEM_TWP")); #undef TEXT_PIECE } From dc96a49dfdeaf0b83cdaf7b5c5e6565e986a8d41 Mon Sep 17 00:00:00 2001 From: erorcun Date: Mon, 28 Dec 2020 03:25:26 +0300 Subject: [PATCH 40/46] Ped: WeaponInfo: little fixes and renamings --- src/peds/PlayerPed.cpp | 6 +++--- src/weapons/WeaponInfo.cpp | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/peds/PlayerPed.cpp b/src/peds/PlayerPed.cpp index ef5815ed..1b5e007a 100644 --- a/src/peds/PlayerPed.cpp +++ b/src/peds/PlayerPed.cpp @@ -299,7 +299,7 @@ CPlayerPed::SetRealMoveAnim(void) RestoreHeadingRate(); if (!curIdleAssoc) { - if (m_fCurrentStamina < 0.0f && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.0f, + if (m_fCurrentStamina < 0.0f && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.5f, nil, true, false, false, false, false, false)) { curIdleAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_IDLE_TIRED, 8.0f); @@ -313,7 +313,7 @@ CPlayerPed::SetRealMoveAnim(void) } else if (m_fMoveSpeed == 0.0f && !curSprintAssoc) { if (!curIdleAssoc) { - if (m_fCurrentStamina < 0.0f && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.0f, + if (m_fCurrentStamina < 0.0f && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.5f, nil, true, false, false, false, false, false)) { curIdleAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_IDLE_TIRED, 4.0f); @@ -329,7 +329,7 @@ CPlayerPed::SetRealMoveAnim(void) } else if (m_nPedState != PED_FIGHT) { if (m_fCurrentStamina < 0.0f && curIdleAssoc->animId != ANIM_IDLE_TIRED - && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.0f, nil, true, false, false, false, false, false)) { + && !CWorld::TestSphereAgainstWorld(GetPosition(), 0.5f, nil, true, false, false, false, false, false)) { CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_IDLE_TIRED, 4.0f); } else if (curIdleAssoc->animId != ANIM_IDLE_STANCE) { diff --git a/src/weapons/WeaponInfo.cpp b/src/weapons/WeaponInfo.cpp index 546aa6ba..b40329c8 100644 --- a/src/weapons/WeaponInfo.cpp +++ b/src/weapons/WeaponInfo.cpp @@ -76,10 +76,9 @@ CWeaponInfo::LoadWeaponData(void) line[linelen] = '\0'; // skip white space - for (lp = 0; line[lp] <= ' '; lp++); + for (lp = 0; line[lp] <= ' ' && line[lp] != '\0'; lp++); - if (lp >= linelen || // FIX: game uses == here, but this is safer if we have empty lines - line[lp] == '#') + if (line[lp] == '\0' || line[lp] == '#') continue; spread = 0.0f; From b9747de5d6832542bbdd4b94f4e5e1f0b90b08bb Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 28 Dec 2020 08:36:21 +0200 Subject: [PATCH 41/46] Enable BIND_VEHICLE_FIREWEAPON with gta3.set size check --- src/core/ControllerConfig.cpp | 43 ++++++++++++++++++++++++++++++++++- src/core/config.h | 2 +- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/core/ControllerConfig.cpp b/src/core/ControllerConfig.cpp index b56a19f0..bf4893ea 100644 --- a/src/core/ControllerConfig.cpp +++ b/src/core/ControllerConfig.cpp @@ -132,6 +132,10 @@ void CControllerConfigManager::LoadSettings(int32 file) { bool bValid = true; +#ifdef BIND_VEHICLE_FIREWEAPON + bool skipVehicleFireWeapon = false; +#endif + if (file) { char buff[29]; @@ -139,18 +143,55 @@ void CControllerConfigManager::LoadSettings(int32 file) if (!strncmp(buff, TopLineEmptyFile, sizeof(TopLineEmptyFile)-1)) bValid = false; - else + else { CFileMgr::Seek(file, 0, 0); + +#ifdef BIND_VEHICLE_FIREWEAPON + // HACK! + // All of this is hacky as fuck. + // We are checking the file size to read the .set file correctly. + // But because .set file is opened in text mode we have to read + // the WHOLE file to get the size we should be working with. + // Joy, ain't it? + char tempBuf[0x1000]; + size_t fileSize = 0, blockSize; + do + { + blockSize = CFileMgr::Read(file, tempBuf, sizeof(tempBuf)); + fileSize += blockSize; + } while (blockSize == sizeof(tempBuf)); + + CFileMgr::Seek(file, 0, 0); + + if (fileSize == 0x671) + skipVehicleFireWeapon = true; +#endif + } } if (bValid) { ControlsManager.MakeControllerActionsBlank(); +#ifdef BIND_VEHICLE_FIREWEAPON + // Set the default settings of VEHICLE_FIREWEAPON + if (skipVehicleFireWeapon) { + SetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, rsPADINS, KEYBOARD); + SetControllerKeyAssociatedWithAction(VEHICLE_FIREWEAPON, rsLCTRL, OPTIONAL_EXTRA); + if (m_bMouseAssociated) + SetMouseButtonAssociatedWithAction(VEHICLE_FIREWEAPON, 1); + } +#endif + for (int32 i = 0; i < MAX_CONTROLLERTYPES; i++) { for (int32 j = 0; j < MAX_CONTROLLERACTIONS; j++) { +#ifdef BIND_VEHICLE_FIREWEAPON + // Skip file read + if (skipVehicleFireWeapon && j == VEHICLE_FIREWEAPON) + continue; +#endif CFileMgr::Read(file, (char *)&ControlsManager.m_aSettings[j][i], sizeof(tControllerConfigBind)); } } diff --git a/src/core/config.h b/src/core/config.h index d3196f9b..a9bb1a17 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -274,7 +274,7 @@ enum Config { #define ALLCARSHELI_CHEAT #define ALT_DODO_CHEAT #define REGISTER_START_BUTTON -//#define BIND_VEHICLE_FIREWEAPON // Adds ability to rebind fire key for 'in vehicle' controls +#define BIND_VEHICLE_FIREWEAPON // Adds ability to rebind fire key for 'in vehicle' controls #define BUTTON_ICONS // use textures to show controller buttons // Hud, frontend and radar From 7eb96d53735f0f60d610d60aefdbfa4d5589c87f Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 28 Dec 2020 13:44:20 +0200 Subject: [PATCH 42/46] Add bike leftovers --- src/entities/Physical.cpp | 7 ++++++- src/peds/Population.cpp | 7 ++++--- src/vehicles/Bike.h | 10 ++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/entities/Physical.cpp b/src/entities/Physical.cpp index 04cec96b..4fc53039 100644 --- a/src/entities/Physical.cpp +++ b/src/entities/Physical.cpp @@ -16,6 +16,7 @@ #include "DMAudio.h" #include "Automobile.h" #include "Physical.h" +#include "Bike.h" CPhysical::CPhysical(void) { @@ -1917,7 +1918,11 @@ CPhysical::ProcessCollision(void) car->m_aSuspensionSpringRatio[2] = 1.0f; car->m_aSuspensionSpringRatio[3] = 1.0f; }else if(veh->m_vehType == VEHICLE_TYPE_BIKE){ - assert(0 && "TODO - but unused"); + CBike* bike = (CBike*)this; + bike->m_aSuspensionSpringRatio[0] = 1.0f; + bike->m_aSuspensionSpringRatio[1] = 1.0f; + bike->m_aSuspensionSpringRatio[2] = 1.0f; + bike->m_aSuspensionSpringRatio[3] = 1.0f; } } } diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp index 5dbde649..35443cb8 100644 --- a/src/peds/Population.cpp +++ b/src/peds/Population.cpp @@ -22,6 +22,7 @@ #include "DummyObject.h" #include "Script.h" #include "Shadows.h" +#include "Bike.h" #define MIN_CREATION_DIST 40.0f // not for start of the game (look at the GeneratePedsAtStartOfGame) #define CREATION_RANGE 10.0f // added over the MIN_CREATION_DIST. @@ -833,11 +834,11 @@ CPopulation::AddPedInCar(CVehicle* car) newPed->SetCurrentWeapon(WEAPONTYPE_COLT45); newPed->RemoveWeaponModel(CWeaponInfo::GetWeaponInfo(newPed->GetWeapon()->m_eWeaponType)->m_nModelId); } - /* + // Miami leftover if (car->m_vehType == VEHICLE_TYPE_BIKE) { - newPed->m_pVehicleAnim = CAnimManager::BlendAnimation(newPed->GetClump(), ASSOCGRP_STD, *((CBike*)car + 308h), 100.0f); - } else */ + newPed->m_pVehicleAnim = CAnimManager::BlendAnimation(newPed->GetClump(), ASSOCGRP_STD, ((CBike*)car)->m_bikeSitAnimation, 100.0f); + } else // FIX: Make peds comfortable while driving car/boat #ifdef FIX_BUGS diff --git a/src/vehicles/Bike.h b/src/vehicles/Bike.h index 4e7e5a0e..38477e80 100644 --- a/src/vehicles/Bike.h +++ b/src/vehicles/Bike.h @@ -12,4 +12,14 @@ enum eBikeNodes { BIKE_MUDGUARD, BIKE_HANDLEBARS, BIKE_NUM_NODES +}; + +class CBike : public CVehicle +{ +public: + RwFrame *m_aBikeNodes[BIKE_NUM_NODES]; // assuming + uint8 unk1[96]; + AnimationId m_bikeSitAnimation; + uint8 unk2[180]; + float m_aSuspensionSpringRatio[4]; }; \ No newline at end of file From 9c2f1b0833ec28ea52162d55560fca8f89341335 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 28 Dec 2020 13:59:03 +0200 Subject: [PATCH 43/46] More bike leftovers --- src/control/Script6.cpp | 4 ++-- src/vehicles/Bike.h | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp index c2937e1d..77dae53a 100644 --- a/src/control/Script6.cpp +++ b/src/control/Script6.cpp @@ -3,6 +3,7 @@ #include "Script.h" #include "ScriptCommands.h" +#include "Bike.h" #include "CarCtrl.h" #include "Cranes.h" #include "Credits.h" @@ -415,8 +416,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) ((CAutomobile*)pVehicle)->m_fTraction = fTraction; else // this is certainly not a boat, trane, heli or plane field - //((CBike*)pVehicle)->m_fTraction = fTraction; - *(float*)(((char*)pVehicle) + 1088) = fTraction; + ((CBike*)pVehicle)->m_fTraction = fTraction; return 0; } case COMMAND_ARE_MEASUREMENTS_IN_METRES: diff --git a/src/vehicles/Bike.h b/src/vehicles/Bike.h index 38477e80..85ff211b 100644 --- a/src/vehicles/Bike.h +++ b/src/vehicles/Bike.h @@ -1,5 +1,7 @@ #pragma once +#include "Vehicle.h" + // some miami bike leftovers enum eBikeNodes { @@ -22,4 +24,22 @@ public: AnimationId m_bikeSitAnimation; uint8 unk2[180]; float m_aSuspensionSpringRatio[4]; + + /* copied from VC, one of the floats here is gone, assuming m_bike_unused1 */ + float m_aSuspensionSpringRatioPrev[4]; + float m_aWheelTimer[4]; + //float m_bike_unused1; + int m_aWheelSkidmarkType[2]; + bool m_aWheelSkidmarkBloody[2]; + bool m_aWheelSkidmarkUnk[2]; + float m_aWheelRotation[2]; + float m_aWheelSpeed[2]; + float m_aWheelPosition[2]; + float m_aWheelBasePosition[2]; + float m_aSuspensionSpringLength[4]; + float m_aSuspensionLineLength[4]; + float m_fHeightAboveRoad; + /**/ + + float m_fTraction; }; \ No newline at end of file From 8af298c668f825785ca83bc212d86160ceb86b83 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Mon, 28 Dec 2020 23:08:47 +0300 Subject: [PATCH 44/46] multiple instances sema fix --- src/core/CdStream.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/CdStream.cpp b/src/core/CdStream.cpp index f987dea5..4bb31ea4 100644 --- a/src/core/CdStream.cpp +++ b/src/core/CdStream.cpp @@ -73,7 +73,11 @@ CdStreamInitThread(void) gChannelRequestQ.size = gNumChannels + 1; ASSERT(gChannelRequestQ.items != nil ); +#ifdef FIX_BUGS + gCdStreamSema = CreateSemaphore(nil, 0, 5, nil); +#else gCdStreamSema = CreateSemaphore(nil, 0, 5, "CdStream"); +#endif if ( gCdStreamSema == nil ) { From f7e52d7a21ced8bd0fbb2a62f3231ed8386d7175 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 28 Dec 2020 21:58:16 +0100 Subject: [PATCH 45/46] fix neo screendroplet moving --- src/extras/screendroplets.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/extras/screendroplets.cpp b/src/extras/screendroplets.cpp index 9ac60d4f..6ea72f09 100644 --- a/src/extras/screendroplets.cpp +++ b/src/extras/screendroplets.cpp @@ -12,6 +12,7 @@ #include "RwHelper.h" #include "Timer.h" #include "Camera.h" +#include "World.h" #include "ZoneCull.h" #include "Weather.h" #include "ParticleObject.h" @@ -416,7 +417,8 @@ ScreenDroplets::ProcessCameraMovement(void) uint16 mode = TheCamera.Cams[TheCamera.ActiveCam].Mode; bool isTopDown = mode == CCam::MODE_TOPDOWN || mode == CCam::MODE_GTACLASSIC || mode == CCam::MODE_TOP_DOWN_PED; - bool isLookingInDirection = CPad::GetPad(0)->GetLookBehindForCar() || CPad::GetPad(0)->GetLookLeft() || CPad::GetPad(0)->GetLookRight(); + bool isLookingInDirection = FindPlayerVehicle() && mode == CCam::MODE_1STPERSON && + (CPad::GetPad(0)->GetLookBehindForCar() || CPad::GetPad(0)->GetLookLeft() || CPad::GetPad(0)->GetLookRight()); ms_enabled = !isTopDown && !isLookingInDirection; ms_movingEnabled = !isTopDown && !isLookingInDirection; From f75460fc1d83f82b088aaf69d6fba869fc1569f5 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 29 Dec 2020 13:55:15 +0200 Subject: [PATCH 46/46] Reorder CEntity functions into their original order --- src/core/References.cpp | 60 +++ src/core/World.cpp | 14 +- src/entities/Entity.cpp | 869 +++++++++++++++------------------------- src/entities/Entity.h | 18 +- src/render/Coronas.cpp | 192 +++++++++ src/render/Particle.cpp | 35 ++ src/render/Renderer.cpp | 13 + src/rw/RwHelper.cpp | 20 - 8 files changed, 634 insertions(+), 587 deletions(-) diff --git a/src/core/References.cpp b/src/core/References.cpp index 52abbc3e..6b0c868c 100644 --- a/src/core/References.cpp +++ b/src/core/References.cpp @@ -21,6 +21,66 @@ CReferences::Init(void) aRefs[NUMREFERENCES-1].next = nil; } +void +CEntity::RegisterReference(CEntity **pent) +{ + if(IsBuilding()) + return; + CReference *ref; + // check if already registered + for(ref = m_pFirstReference; ref; ref = ref->next) + if(ref->pentity == pent) + return; + // have to allocate new reference + ref = CReferences::pEmptyList; + if(ref){ + CReferences::pEmptyList = ref->next; + + ref->pentity = pent; + ref->next = m_pFirstReference; + m_pFirstReference = ref; + return; + } + return; +} + +// Clear all references to this entity +void +CEntity::ResolveReferences(void) +{ + CReference *ref; + // clear pointers to this entity + for(ref = m_pFirstReference; ref; ref = ref->next) + if(*ref->pentity == this) + *ref->pentity = nil; + // free list + if(m_pFirstReference){ + for(ref = m_pFirstReference; ref->next; ref = ref->next) + ; + ref->next = CReferences::pEmptyList; + CReferences::pEmptyList = m_pFirstReference; + m_pFirstReference = nil; + } +} + +// Free all references that no longer point to this entity +void +CEntity::PruneReferences(void) +{ + CReference *ref, *next, **lastnextp; + lastnextp = &m_pFirstReference; + for(ref = m_pFirstReference; ref; ref = next){ + next = ref->next; + if(*ref->pentity == this) + lastnextp = &ref->next; + else{ + *lastnextp = ref->next; + ref->next = CReferences::pEmptyList; + CReferences::pEmptyList = ref; + } + } +} + void CReferences::RemoveReferencesToPlayer(void) { diff --git a/src/core/World.cpp b/src/core/World.cpp index b2c1696c..dc99f015 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -1600,14 +1600,24 @@ CWorld::ExtinguishAllCarFiresInArea(CVector point, float range) } } +inline void +AddSteamsFromGround(CPtrList& list) +{ + CPtrNode *pNode = list.first; + while (pNode) { + ((CEntity*)pNode->item)->AddSteamsFromGround(nil); + pNode = pNode->next; + } +} + void CWorld::AddParticles(void) { for(int32 y = 0; y < NUMSECTORS_Y; y++) { for(int32 x = 0; x < NUMSECTORS_X; x++) { CSector *pSector = GetSector(x, y); - CEntity::AddSteamsFromGround(pSector->m_lists[ENTITYLIST_BUILDINGS]); - CEntity::AddSteamsFromGround(pSector->m_lists[ENTITYLIST_DUMMIES]); + AddSteamsFromGround(pSector->m_lists[ENTITYLIST_BUILDINGS]); + AddSteamsFromGround(pSector->m_lists[ENTITYLIST_DUMMIES]); } } } diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 476439fa..db004af3 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -4,31 +4,24 @@ #include "RwHelper.h" #include "ModelIndices.h" #include "Timer.h" -#include "Placeable.h" #include "Entity.h" #include "Object.h" -#include "ParticleObject.h" -#include "Lights.h" #include "World.h" #include "Camera.h" #include "Glass.h" -#include "Clock.h" #include "Weather.h" #include "Timecycle.h" -#include "Bridge.h" #include "TrafficLights.h" #include "Coronas.h" #include "PointLights.h" #include "Shadows.h" #include "Pickups.h" #include "SpecialFX.h" -#include "References.h" #include "TxdStore.h" #include "Zones.h" +#include "MemoryHeap.h" #include "Bones.h" #include "Debug.h" -#include "Renderer.h" -#include "MemoryHeap.h" int gBuildings; @@ -89,11 +82,304 @@ CEntity::~CEntity(void) ResolveReferences(); } +void +CEntity::SetModelIndex(uint32 id) +{ + m_modelIndex = id; + CreateRwObject(); +} + +void +CEntity::SetModelIndexNoCreate(uint32 id) +{ + m_modelIndex = id; +} + +void +CEntity::CreateRwObject(void) +{ + CBaseModelInfo *mi; + + mi = CModelInfo::GetModelInfo(m_modelIndex); + + PUSH_MEMID(MEMID_WORLD); + m_rwObject = mi->CreateInstance(); + POP_MEMID(); + + if(m_rwObject){ + if(IsBuilding()) + gBuildings++; + if(RwObjectGetType(m_rwObject) == rpATOMIC) + m_matrix.AttachRW(RwFrameGetMatrix(RpAtomicGetFrame((RpAtomic*)m_rwObject)), false); + else if(RwObjectGetType(m_rwObject) == rpCLUMP) + m_matrix.AttachRW(RwFrameGetMatrix(RpClumpGetFrame((RpClump*)m_rwObject)), false); + mi->AddRef(); + } +} + +void +CEntity::AttachToRwObject(RwObject *obj) +{ + m_rwObject = obj; + if(m_rwObject){ + if(RwObjectGetType(m_rwObject) == rpATOMIC) + m_matrix.Attach(RwFrameGetMatrix(RpAtomicGetFrame((RpAtomic*)m_rwObject)), false); + else if(RwObjectGetType(m_rwObject) == rpCLUMP) + m_matrix.Attach(RwFrameGetMatrix(RpClumpGetFrame((RpClump*)m_rwObject)), false); + CModelInfo::GetModelInfo(m_modelIndex)->AddRef(); + } +} + +void +CEntity::DetachFromRwObject(void) +{ + if(m_rwObject) + CModelInfo::GetModelInfo(m_modelIndex)->RemoveRef(); + m_rwObject = nil; + m_matrix.Detach(); +} + +RpAtomic* +AtomicRemoveAnimFromSkinCB(RpAtomic *atomic, void *data) +{ + if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic))){ + RpHAnimHierarchy *hier = RpSkinAtomicGetHAnimHierarchy(atomic); +#ifdef LIBRW + if(hier && hier->interpolator->currentAnim){ + RpHAnimAnimationDestroy(hier->interpolator->currentAnim); + hier->interpolator->currentAnim = nil; + } +#else + if(hier && hier->pCurrentAnim){ + RpHAnimAnimationDestroy(hier->pCurrentAnim); + hier->pCurrentAnim = nil; + } +#endif + } + return atomic; +} + +void +CEntity::DeleteRwObject(void) +{ + RwFrame *f; + + m_matrix.Detach(); + if(m_rwObject){ + if(RwObjectGetType(m_rwObject) == rpATOMIC){ + f = RpAtomicGetFrame((RpAtomic*)m_rwObject); + RpAtomicDestroy((RpAtomic*)m_rwObject); + RwFrameDestroy(f); + }else if(RwObjectGetType(m_rwObject) == rpCLUMP){ +#ifdef PED_SKIN + if(IsClumpSkinned((RpClump*)m_rwObject)) + RpClumpForAllAtomics((RpClump*)m_rwObject, AtomicRemoveAnimFromSkinCB, nil); +#endif + RpClumpDestroy((RpClump*)m_rwObject); + } + m_rwObject = nil; + CModelInfo::GetModelInfo(m_modelIndex)->RemoveRef(); + if(IsBuilding()) + gBuildings--; + } +} + +CRect +CEntity::GetBoundRect(void) +{ + CRect rect; + CVector v; + CColModel *col = CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); + + rect.ContainPoint(m_matrix * col->boundingBox.min); + rect.ContainPoint(m_matrix * col->boundingBox.max); + + v = col->boundingBox.min; + v.x = col->boundingBox.max.x; + rect.ContainPoint(m_matrix * v); + + v = col->boundingBox.max; + v.x = col->boundingBox.min.x; + rect.ContainPoint(m_matrix * v); + + return rect; +} + +CVector +CEntity::GetBoundCentre(void) +{ + CVector v; + GetBoundCentre(v); + return v; +} + void CEntity::GetBoundCentre(CVector &out) { out = m_matrix * CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.center; -}; +} + +float +CEntity::GetBoundRadius(void) +{ + return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; +} + +void +CEntity::UpdateRwFrame(void) +{ + if(m_rwObject){ + if(RwObjectGetType(m_rwObject) == rpATOMIC) + RwFrameUpdateObjects(RpAtomicGetFrame((RpAtomic*)m_rwObject)); + else if(RwObjectGetType(m_rwObject) == rpCLUMP) + RwFrameUpdateObjects(RpClumpGetFrame((RpClump*)m_rwObject)); + } +} + +#ifdef PED_SKIN +void +CEntity::UpdateRpHAnim(void) +{ + RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump()); + RpHAnimHierarchyUpdateMatrices(hier); + +#if 0 + int i; + char buf[256]; + if(this == (CEntity*)FindPlayerPed()) + for(i = 0; i < hier->numNodes; i++){ + RpHAnimStdInterpFrame *kf = (RpHAnimStdInterpFrame*)rpHANIMHIERARCHYGETINTERPFRAME(hier, i); + sprintf(buf, "%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %d %s", + kf->q.imag.x, kf->q.imag.y, kf->q.imag.z, kf->q.real, + kf->t.x, kf->t.y, kf->t.z, + HIERNODEID(hier, i), + ConvertBoneTag2BoneName(HIERNODEID(hier, i))); + CDebug::PrintAt(buf, 10, 1+i*3); + + RwMatrix *m = &RpHAnimHierarchyGetMatrixArray(hier)[i]; + sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", + m->right.x, m->up.x, m->at.x, m->pos.x); + CDebug::PrintAt(buf, 80, 1+i*3+0); + sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", + m->right.y, m->up.y, m->at.y, m->pos.y); + CDebug::PrintAt(buf, 80, 1+i*3+1); + sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", + m->right.z, m->up.z, m->at.z, m->pos.z); + CDebug::PrintAt(buf, 80, 1+i*3+2); + } + + void RenderSkeleton(RpHAnimHierarchy *hier); + RenderSkeleton(hier); +#endif +} +#endif + +void +CEntity::PreRender(void) +{ + switch(m_type){ + case ENTITY_TYPE_BUILDING: + if(GetModelIndex() == MI_RAILTRACKS){ + CShadows::StoreShadowForPole(this, 0.0f, -10.949f, 5.0f, 8.0f, 1.0f, 0); + CShadows::StoreShadowForPole(this, 0.0f, 10.949f, 5.0f, 8.0f, 1.0f, 1); + }else if(IsTreeModel(GetModelIndex())){ + CShadows::StoreShadowForTree(this); + ModifyMatrixForTreeInWind(); + }else if(IsBannerModel(GetModelIndex())){ + ModifyMatrixForBannerInWind(); + } + break; + case ENTITY_TYPE_OBJECT: + if(GetModelIndex() == MI_COLLECTABLE1){ + CPickups::DoCollectableEffects(this); + GetMatrix().UpdateRW(); + UpdateRwFrame(); + }else if(GetModelIndex() == MI_MONEY){ + CPickups::DoMoneyEffects(this); + GetMatrix().UpdateRW(); + UpdateRwFrame(); + }else if(GetModelIndex() == MI_NAUTICALMINE || + GetModelIndex() == MI_CARMINE || + GetModelIndex() == MI_BRIEFCASE){ + if(((CObject*)this)->bIsPickup){ + CPickups::DoMineEffects(this); + GetMatrix().UpdateRW(); + UpdateRwFrame(); + } + }else if(IsPickupModel(GetModelIndex())){ + if(((CObject*)this)->bIsPickup){ + CPickups::DoPickUpEffects(this); + GetMatrix().UpdateRW(); + UpdateRwFrame(); + }else if(GetModelIndex() == MI_GRENADE){ + CMotionBlurStreaks::RegisterStreak((uintptr)this, + 100, 100, 100, + GetPosition() - 0.07f*TheCamera.GetRight(), + GetPosition() + 0.07f*TheCamera.GetRight()); + }else if(GetModelIndex() == MI_MOLOTOV){ + CMotionBlurStreaks::RegisterStreak((uintptr)this, + 0, 100, 0, + GetPosition() - 0.07f*TheCamera.GetRight(), + GetPosition() + 0.07f*TheCamera.GetRight()); + } + }else if(GetModelIndex() == MI_MISSILE){ + CVector pos = GetPosition(); + float flicker = (CGeneral::GetRandomNumber() & 0xF)/(float)0x10; + CShadows::StoreShadowToBeRendered(SHADOWTYPE_ADDITIVE, + gpShadowExplosionTex, &pos, + 8.0f, 0.0f, 0.0f, -8.0f, + 255, 200.0f*flicker, 160.0f*flicker, 120.0f*flicker, + 20.0f, false, 1.0f); + CPointLights::AddLight(CPointLights::LIGHT_POINT, + pos, CVector(0.0f, 0.0f, 0.0f), + 8.0f, + 1.0f*flicker, + 0.8f*flicker, + 0.6f*flicker, + CPointLights::FOG_NONE, true); + CCoronas::RegisterCorona((uintptr)this, + 255.0f*flicker, 220.0f*flicker, 190.0f*flicker, 255, + pos, 6.0f*flicker, 80.0f, gpCoronaTexture[CCoronas::TYPE_STAR], + CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, + CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); + }else if(IsGlass(GetModelIndex())){ + PreRenderForGlassWindow(); + } + // fall through + case ENTITY_TYPE_DUMMY: + if(GetModelIndex() == MI_TRAFFICLIGHTS){ + CTrafficLights::DisplayActualLight(this); + CShadows::StoreShadowForPole(this, 2.957f, 0.147f, 0.0f, 16.0f, 0.4f, 0); + }else if(GetModelIndex() == MI_SINGLESTREETLIGHTS1) + CShadows::StoreShadowForPole(this, 0.744f, 0.0f, 0.0f, 16.0f, 0.4f, 0); + else if(GetModelIndex() == MI_SINGLESTREETLIGHTS2) + CShadows::StoreShadowForPole(this, 0.043f, 0.0f, 0.0f, 16.0f, 0.4f, 0); + else if(GetModelIndex() == MI_SINGLESTREETLIGHTS3) + CShadows::StoreShadowForPole(this, 1.143f, 0.145f, 0.0f, 16.0f, 0.4f, 0); + else if(GetModelIndex() == MI_DOUBLESTREETLIGHTS) + CShadows::StoreShadowForPole(this, 0.0f, -0.048f, 0.0f, 16.0f, 0.4f, 0); + else if(GetModelIndex() == MI_STREETLAMP1 || + GetModelIndex() == MI_STREETLAMP2) + CShadows::StoreShadowForPole(this, 0.0f, 0.0f, 0.0f, 16.0f, 0.4f, 0); + break; + } + + if (CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects() != 0) + ProcessLightsForEntity(); +} + +void +CEntity::Render(void) +{ + if(m_rwObject){ + bImBeingRendered = true; + if(RwObjectGetType(m_rwObject) == rpATOMIC) + RpAtomicRender((RpAtomic*)m_rwObject); + else + RpClumpRender((RpClump*)m_rwObject); + bImBeingRendered = false; + } +} bool CEntity::GetIsTouching(CVector const ¢er, float radius) @@ -101,6 +387,18 @@ CEntity::GetIsTouching(CVector const ¢er, float radius) return sq(GetBoundRadius()+radius) > (GetBoundCentre()-center).MagnitudeSqr(); } +bool +CEntity::IsVisible(void) +{ + return m_rwObject && bIsVisible && GetIsOnScreen(); +} + +bool +CEntity::IsVisibleComplex(void) +{ + return m_rwObject && bIsVisible && GetIsOnScreenComplex(); +} + bool CEntity::GetIsOnScreen(void) { @@ -269,62 +567,10 @@ CEntity::Remove(void) } } -void -CEntity::CreateRwObject(void) +float +CEntity::GetDistanceFromCentreOfMassToBaseOfModel(void) { - CBaseModelInfo *mi; - - mi = CModelInfo::GetModelInfo(m_modelIndex); - - PUSH_MEMID(MEMID_WORLD); - m_rwObject = mi->CreateInstance(); - POP_MEMID(); - - if(m_rwObject){ - if(IsBuilding()) - gBuildings++; - if(RwObjectGetType(m_rwObject) == rpATOMIC) - m_matrix.AttachRW(RwFrameGetMatrix(RpAtomicGetFrame((RpAtomic*)m_rwObject)), false); - else if(RwObjectGetType(m_rwObject) == rpCLUMP) - m_matrix.AttachRW(RwFrameGetMatrix(RpClumpGetFrame((RpClump*)m_rwObject)), false); - mi->AddRef(); - } -} - -void -CEntity::DeleteRwObject(void) -{ - RwFrame *f; - - m_matrix.Detach(); - if(m_rwObject){ - if(RwObjectGetType(m_rwObject) == rpATOMIC){ - f = RpAtomicGetFrame((RpAtomic*)m_rwObject); - RpAtomicDestroy((RpAtomic*)m_rwObject); - RwFrameDestroy(f); - }else if(RwObjectGetType(m_rwObject) == rpCLUMP){ -#ifdef PED_SKIN - if(IsClumpSkinned((RpClump*)m_rwObject)) - RpClumpForAllAtomics((RpClump*)m_rwObject, AtomicRemoveAnimFromSkinCB, nil); -#endif - RpClumpDestroy((RpClump*)m_rwObject); - } - m_rwObject = nil; - CModelInfo::GetModelInfo(m_modelIndex)->RemoveRef(); - if(IsBuilding()) - gBuildings--; - } -} - -void -CEntity::UpdateRwFrame(void) -{ - if(m_rwObject){ - if(RwObjectGetType(m_rwObject) == rpATOMIC) - RwFrameUpdateObjects(RpAtomicGetFrame((RpAtomic*)m_rwObject)); - else if(RwObjectGetType(m_rwObject) == rpCLUMP) - RwFrameUpdateObjects(RpClumpGetFrame((RpClump*)m_rwObject)); - } + return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; } void @@ -347,490 +593,6 @@ CEntity::SetupBigBuilding(void) m_level = LEVEL_GENERIC; } -CRect -CEntity::GetBoundRect(void) -{ - CRect rect; - CVector v; - CColModel *col = CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); - - rect.ContainPoint(m_matrix * col->boundingBox.min); - rect.ContainPoint(m_matrix * col->boundingBox.max); - - v = col->boundingBox.min; - v.x = col->boundingBox.max.x; - rect.ContainPoint(m_matrix * v); - - v = col->boundingBox.max; - v.x = col->boundingBox.min.x; - rect.ContainPoint(m_matrix * v); - - return rect; -} - -void -CEntity::PreRender(void) -{ - switch(m_type){ - case ENTITY_TYPE_BUILDING: - if(GetModelIndex() == MI_RAILTRACKS){ - CShadows::StoreShadowForPole(this, 0.0f, -10.949f, 5.0f, 8.0f, 1.0f, 0); - CShadows::StoreShadowForPole(this, 0.0f, 10.949f, 5.0f, 8.0f, 1.0f, 1); - }else if(IsTreeModel(GetModelIndex())){ - CShadows::StoreShadowForTree(this); - ModifyMatrixForTreeInWind(); - }else if(IsBannerModel(GetModelIndex())){ - ModifyMatrixForBannerInWind(); - } - break; - case ENTITY_TYPE_OBJECT: - if(GetModelIndex() == MI_COLLECTABLE1){ - CPickups::DoCollectableEffects(this); - GetMatrix().UpdateRW(); - UpdateRwFrame(); - }else if(GetModelIndex() == MI_MONEY){ - CPickups::DoMoneyEffects(this); - GetMatrix().UpdateRW(); - UpdateRwFrame(); - }else if(GetModelIndex() == MI_NAUTICALMINE || - GetModelIndex() == MI_CARMINE || - GetModelIndex() == MI_BRIEFCASE){ - if(((CObject*)this)->bIsPickup){ - CPickups::DoMineEffects(this); - GetMatrix().UpdateRW(); - UpdateRwFrame(); - } - }else if(IsPickupModel(GetModelIndex())){ - if(((CObject*)this)->bIsPickup){ - CPickups::DoPickUpEffects(this); - GetMatrix().UpdateRW(); - UpdateRwFrame(); - }else if(GetModelIndex() == MI_GRENADE){ - CMotionBlurStreaks::RegisterStreak((uintptr)this, - 100, 100, 100, - GetPosition() - 0.07f*TheCamera.GetRight(), - GetPosition() + 0.07f*TheCamera.GetRight()); - }else if(GetModelIndex() == MI_MOLOTOV){ - CMotionBlurStreaks::RegisterStreak((uintptr)this, - 0, 100, 0, - GetPosition() - 0.07f*TheCamera.GetRight(), - GetPosition() + 0.07f*TheCamera.GetRight()); - } - }else if(GetModelIndex() == MI_MISSILE){ - CVector pos = GetPosition(); - float flicker = (CGeneral::GetRandomNumber() & 0xF)/(float)0x10; - CShadows::StoreShadowToBeRendered(SHADOWTYPE_ADDITIVE, - gpShadowExplosionTex, &pos, - 8.0f, 0.0f, 0.0f, -8.0f, - 255, 200.0f*flicker, 160.0f*flicker, 120.0f*flicker, - 20.0f, false, 1.0f); - CPointLights::AddLight(CPointLights::LIGHT_POINT, - pos, CVector(0.0f, 0.0f, 0.0f), - 8.0f, - 1.0f*flicker, - 0.8f*flicker, - 0.6f*flicker, - CPointLights::FOG_NONE, true); - CCoronas::RegisterCorona((uintptr)this, - 255.0f*flicker, 220.0f*flicker, 190.0f*flicker, 255, - pos, 6.0f*flicker, 80.0f, gpCoronaTexture[CCoronas::TYPE_STAR], - CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, - CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); - }else if(IsGlass(GetModelIndex())){ - PreRenderForGlassWindow(); - } - // fall through - case ENTITY_TYPE_DUMMY: - if(GetModelIndex() == MI_TRAFFICLIGHTS){ - CTrafficLights::DisplayActualLight(this); - CShadows::StoreShadowForPole(this, 2.957f, 0.147f, 0.0f, 16.0f, 0.4f, 0); - }else if(GetModelIndex() == MI_SINGLESTREETLIGHTS1) - CShadows::StoreShadowForPole(this, 0.744f, 0.0f, 0.0f, 16.0f, 0.4f, 0); - else if(GetModelIndex() == MI_SINGLESTREETLIGHTS2) - CShadows::StoreShadowForPole(this, 0.043f, 0.0f, 0.0f, 16.0f, 0.4f, 0); - else if(GetModelIndex() == MI_SINGLESTREETLIGHTS3) - CShadows::StoreShadowForPole(this, 1.143f, 0.145f, 0.0f, 16.0f, 0.4f, 0); - else if(GetModelIndex() == MI_DOUBLESTREETLIGHTS) - CShadows::StoreShadowForPole(this, 0.0f, -0.048f, 0.0f, 16.0f, 0.4f, 0); - else if(GetModelIndex() == MI_STREETLAMP1 || - GetModelIndex() == MI_STREETLAMP2) - CShadows::StoreShadowForPole(this, 0.0f, 0.0f, 0.0f, 16.0f, 0.4f, 0); - break; - } - - if (CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects() != 0) - ProcessLightsForEntity(); -} - -void -CEntity::PreRenderForGlassWindow(void) -{ - CGlass::AskForObjectToBeRenderedInGlass(this); - bIsVisible = false; -} - -void -CEntity::Render(void) -{ - if(m_rwObject){ - bImBeingRendered = true; - if(RwObjectGetType(m_rwObject) == rpATOMIC) - RpAtomicRender((RpAtomic*)m_rwObject); - else - RpClumpRender((RpClump*)m_rwObject); - bImBeingRendered = false; - } -} - -bool -CEntity::SetupLighting(void) -{ - DeActivateDirectional(); - SetAmbientColours(); - return false; -} - -void -CEntity::AttachToRwObject(RwObject *obj) -{ - m_rwObject = obj; - if(m_rwObject){ - if(RwObjectGetType(m_rwObject) == rpATOMIC) - m_matrix.Attach(RwFrameGetMatrix(RpAtomicGetFrame((RpAtomic*)m_rwObject)), false); - else if(RwObjectGetType(m_rwObject) == rpCLUMP) - m_matrix.Attach(RwFrameGetMatrix(RpClumpGetFrame((RpClump*)m_rwObject)), false); - CModelInfo::GetModelInfo(m_modelIndex)->AddRef(); - } -} - -void -CEntity::DetachFromRwObject(void) -{ - if(m_rwObject) - CModelInfo::GetModelInfo(m_modelIndex)->RemoveRef(); - m_rwObject = nil; - m_matrix.Detach(); -} - -void -CEntity::RegisterReference(CEntity **pent) -{ - if(IsBuilding()) - return; - CReference *ref; - // check if already registered - for(ref = m_pFirstReference; ref; ref = ref->next) - if(ref->pentity == pent) - return; - // have to allocate new reference - ref = CReferences::pEmptyList; - if(ref){ - CReferences::pEmptyList = ref->next; - - ref->pentity = pent; - ref->next = m_pFirstReference; - m_pFirstReference = ref; - return; - } - return; -} - -// Clear all references to this entity -void -CEntity::ResolveReferences(void) -{ - CReference *ref; - // clear pointers to this entity - for(ref = m_pFirstReference; ref; ref = ref->next) - if(*ref->pentity == this) - *ref->pentity = nil; - // free list - if(m_pFirstReference){ - for(ref = m_pFirstReference; ref->next; ref = ref->next) - ; - ref->next = CReferences::pEmptyList; - CReferences::pEmptyList = m_pFirstReference; - m_pFirstReference = nil; - } -} - -// Free all references that no longer point to this entity -void -CEntity::PruneReferences(void) -{ - CReference *ref, *next, **lastnextp; - lastnextp = &m_pFirstReference; - for(ref = m_pFirstReference; ref; ref = next){ - next = ref->next; - if(*ref->pentity == this) - lastnextp = &ref->next; - else{ - *lastnextp = ref->next; - ref->next = CReferences::pEmptyList; - CReferences::pEmptyList = ref; - } - } -} - -#ifdef PED_SKIN -void -CEntity::UpdateRpHAnim(void) -{ - RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump()); - RpHAnimHierarchyUpdateMatrices(hier); - -#if 0 - int i; - char buf[256]; - if(this == (CEntity*)FindPlayerPed()) - for(i = 0; i < hier->numNodes; i++){ - RpHAnimStdInterpFrame *kf = (RpHAnimStdInterpFrame*)rpHANIMHIERARCHYGETINTERPFRAME(hier, i); - sprintf(buf, "%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %6.3f %d %s", - kf->q.imag.x, kf->q.imag.y, kf->q.imag.z, kf->q.real, - kf->t.x, kf->t.y, kf->t.z, - HIERNODEID(hier, i), - ConvertBoneTag2BoneName(HIERNODEID(hier, i))); - CDebug::PrintAt(buf, 10, 1+i*3); - - RwMatrix *m = &RpHAnimHierarchyGetMatrixArray(hier)[i]; - sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", - m->right.x, m->up.x, m->at.x, m->pos.x); - CDebug::PrintAt(buf, 80, 1+i*3+0); - sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", - m->right.y, m->up.y, m->at.y, m->pos.y); - CDebug::PrintAt(buf, 80, 1+i*3+1); - sprintf(buf, "%6.3f %6.3f %6.3f %6.3f", - m->right.z, m->up.z, m->at.z, m->pos.z); - CDebug::PrintAt(buf, 80, 1+i*3+2); - } - - void RenderSkeleton(RpHAnimHierarchy *hier); - RenderSkeleton(hier); -#endif -} -#endif - -void -CEntity::AddSteamsFromGround(CVector *unused) -{ - int i, n; - C2dEffect *effect; - CVector pos; - - n = CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects(); - for(i = 0; i < n; i++){ - effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i); - if(effect->type != EFFECT_PARTICLE) - continue; - - pos = GetMatrix() * effect->pos; - switch(effect->particle.particleType){ - case 0: - CParticleObject::AddObject(POBJECT_PAVEMENT_STEAM, pos, effect->particle.dir, effect->particle.scale, false); - break; - case 1: - CParticleObject::AddObject(POBJECT_WALL_STEAM, pos, effect->particle.dir, effect->particle.scale, false); - break; - case 2: - CParticleObject::AddObject(POBJECT_DRY_ICE, pos, effect->particle.scale, false); - break; - case 3: - CParticleObject::AddObject(POBJECT_SMALL_FIRE, pos, effect->particle.dir, effect->particle.scale, false); - break; - case 4: - CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false); - break; - } - } -} - -void -CEntity::ProcessLightsForEntity(void) -{ - int i, n; - C2dEffect *effect; - CVector pos; - bool lightOn, lightFlickering; - uint32 flashTimer1, flashTimer2, flashTimer3; - - if(bRenderDamaged || !bIsVisible || GetUp().z < 0.96f) - return; - - flashTimer1 = 0; - flashTimer2 = 0; - flashTimer3 = 0; - - n = CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects(); - for(i = 0; i < n; i++, flashTimer1 += 0x80, flashTimer2 += 0x100, flashTimer3 += 0x200){ - effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i); - - if(effect->type != EFFECT_LIGHT) - continue; - - pos = GetMatrix() * effect->pos; - - lightOn = false; - lightFlickering = false; - switch(effect->light.lightType){ - case LIGHT_ON: - lightOn = true; - break; - case LIGHT_ON_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7) - lightOn = true; - break; - case LIGHT_FLICKER: - if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) - lightOn = true; - else - lightFlickering = true; - if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3) - lightOn = true; - break; - case LIGHT_FLICKER_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7 || CWeather::WetRoads > 0.5f){ - if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) - lightOn = true; - else - lightFlickering = true; - if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3) - lightOn = true; - } - break; - case LIGHT_FLASH1: - if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) - lightOn = true; - break; - case LIGHT_FLASH1_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7) - if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) - lightOn = true; - break; - case LIGHT_FLASH2: - if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) - lightOn = true; - break; - case LIGHT_FLASH2_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7) - if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) - lightOn = true; - break; - case LIGHT_FLASH3: - if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) - lightOn = true; - break; - case LIGHT_FLASH3_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7) - if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) - lightOn = true; - break; - case LIGHT_RANDOM_FLICKER: - if(m_randomSeed > 16) - lightOn = true; - else{ - if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60) - lightOn = true; - else - lightFlickering = true; - if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3) - lightOn = true; - } - break; - case LIGHT_RANDOM_FLICKER_NIGHT: - if(CClock::GetHours() > 18 || CClock::GetHours() < 7){ - if(m_randomSeed > 16) - lightOn = true; - else{ - if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60) - lightOn = true; - else - lightFlickering = true; - if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3) - lightOn = true; - } - } - break; - case LIGHT_BRIDGE_FLASH1: - if(CBridge::ShouldLightsBeFlashing() && CTimer::GetTimeInMilliseconds() & 0x200) - lightOn = true; - break; - case LIGHT_BRIDGE_FLASH2: - if(CBridge::ShouldLightsBeFlashing() && (CTimer::GetTimeInMilliseconds() & 0x1FF) < 60) - lightOn = true; - break; - } - - // Corona - if(lightOn) - CCoronas::RegisterCorona((uintptr)this + i, - effect->col.r, effect->col.g, effect->col.b, 255, - pos, effect->light.size, effect->light.dist, - effect->light.corona, effect->light.flareType, effect->light.roadReflection, - effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); - else if(lightFlickering) - CCoronas::RegisterCorona((uintptr)this + i, - 0, 0, 0, 255, - pos, effect->light.size, effect->light.dist, - effect->light.corona, effect->light.flareType, effect->light.roadReflection, - effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); - - // Pointlight - if(effect->light.flags & LIGHTFLAG_FOG_ALWAYS){ - CPointLights::AddLight(CPointLights::LIGHT_FOGONLY_ALWAYS, - pos, CVector(0.0f, 0.0f, 0.0f), - effect->light.range, - effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f, - CPointLights::FOG_ALWAYS, true); - }else if(effect->light.flags & LIGHTFLAG_FOG_NORMAL && lightOn && effect->light.range == 0.0f){ - CPointLights::AddLight(CPointLights::LIGHT_FOGONLY, - pos, CVector(0.0f, 0.0f, 0.0f), - effect->light.range, - effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f, - CPointLights::FOG_NORMAL, true); - }else if(lightOn && effect->light.range != 0.0f){ - if(effect->col.r == 0 && effect->col.g == 0 && effect->col.b == 0){ - CPointLights::AddLight(CPointLights::LIGHT_POINT, - pos, CVector(0.0f, 0.0f, 0.0f), - effect->light.range, - 0.0f, 0.0f, 0.0f, - CPointLights::FOG_NONE, true); - }else{ - CPointLights::AddLight(CPointLights::LIGHT_POINT, - pos, CVector(0.0f, 0.0f, 0.0f), - effect->light.range, - effect->col.r*CTimeCycle::GetSpriteBrightness()/255.0f, - effect->col.g*CTimeCycle::GetSpriteBrightness()/255.0f, - effect->col.b*CTimeCycle::GetSpriteBrightness()/255.0f, - // half-useless because LIGHTFLAG_FOG_ALWAYS can't be on - (effect->light.flags & LIGHTFLAG_FOG) >> 1, - true); - } - } - - // Light shadow - if(effect->light.shadowSize != 0.0f){ - if(lightOn){ - CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE, - effect->light.shadow, &pos, - effect->light.shadowSize, 0.0f, - 0.0f, -effect->light.shadowSize, - 128, - effect->col.r*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, - effect->col.g*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, - effect->col.b*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, - 15.0f, 1.0f, 40.0f, false, 0.0f); - }else if(lightFlickering){ - CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE, - effect->light.shadow, &pos, - effect->light.shadowSize, 0.0f, - 0.0f, -effect->light.shadowSize, - 0, 0.0f, 0.0f, 0.0f, - 15.0f, 1.0f, 40.0f, false, 0.0f); - } - } - } -} - float WindTabel[] = { 1.0f, 0.5f, 0.2f, 0.7f, 0.4f, 1.0f, 0.5f, 0.3f, 0.2f, 0.1f, 0.7f, 0.6f, 0.3f, 1.0f, 0.5f, 0.2f, @@ -917,14 +679,11 @@ CEntity::ModifyMatrixForBannerInWind(void) UpdateRwFrame(); } -void -CEntity::AddSteamsFromGround(CPtrList& list) +void +CEntity::PreRenderForGlassWindow(void) { - CPtrNode *pNode = list.first; - while (pNode) { - ((CEntity*)pNode->item)->AddSteamsFromGround(nil); - pNode = pNode->next; - } + CGlass::AskForObjectToBeRenderedInGlass(this); + bIsVisible = false; } #ifdef COMPATIBLE_SAVES diff --git a/src/entities/Entity.h b/src/entities/Entity.h index 9372c85d..7ee638d7 100644 --- a/src/entities/Entity.h +++ b/src/entities/Entity.h @@ -111,8 +111,8 @@ public: virtual void Add(void); virtual void Remove(void); - virtual void SetModelIndex(uint32 id) { m_modelIndex = id; CreateRwObject(); } - virtual void SetModelIndexNoCreate(uint32 id) { m_modelIndex = id; } + virtual void SetModelIndex(uint32 id); + virtual void SetModelIndexNoCreate(uint32 id); virtual void CreateRwObject(void); virtual void DeleteRwObject(void); virtual CRect GetBoundRect(void); @@ -123,7 +123,7 @@ public: virtual void PreRender(void); virtual void Render(void); virtual bool SetupLighting(void); - virtual void RemoveLighting(bool) {} + virtual void RemoveLighting(bool); virtual void FlagToDestroyWhenNextProcessed(void) {} bool IsBuilding(void) { return m_type == ENTITY_TYPE_BUILDING; } @@ -142,14 +142,14 @@ public: } void GetBoundCentre(CVector &out); - CVector GetBoundCentre(void) { CVector v; GetBoundCentre(v); return v; } - float GetBoundRadius(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; } - float GetDistanceFromCentreOfMassToBaseOfModel(void) { return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; } + CVector GetBoundCentre(void); + float GetBoundRadius(void); + float GetDistanceFromCentreOfMassToBaseOfModel(void); bool GetIsTouching(CVector const ¢er, float r); bool GetIsOnScreen(void); bool GetIsOnScreenComplex(void); - bool IsVisible(void) { return m_rwObject && bIsVisible && GetIsOnScreen(); } - bool IsVisibleComplex(void) { return m_rwObject && bIsVisible && GetIsOnScreenComplex(); } + bool IsVisible(void); + bool IsVisibleComplex(void); int16 GetModelIndex(void) const { return m_modelIndex; } void UpdateRwFrame(void); void SetupBigBuilding(void); @@ -170,8 +170,6 @@ public: void ModifyMatrixForTreeInWind(void); void ModifyMatrixForBannerInWind(void); void ProcessLightsForEntity(void); - - static void AddSteamsFromGround(CPtrList& list); }; VALIDATE_SIZE(CEntity, 0x64); diff --git a/src/render/Coronas.cpp b/src/render/Coronas.cpp index 48f0f6b9..32957259 100644 --- a/src/render/Coronas.cpp +++ b/src/render/Coronas.cpp @@ -2,6 +2,7 @@ #include "main.h" #include "General.h" +#include "Entity.h" #include "TxdStore.h" #include "Camera.h" #include "Sprite.h" @@ -11,6 +12,10 @@ #include "Collision.h" #include "Timecycle.h" #include "Coronas.h" +#include "PointLights.h" +#include "Shadows.h" +#include "Clock.h" +#include "Bridge.h" struct FlareDef { @@ -577,3 +582,190 @@ CRegisteredCorona::Update(void) firstUpdate = false; registeredThisFrame = false; } + +void +CEntity::ProcessLightsForEntity(void) +{ + int i, n; + C2dEffect *effect; + CVector pos; + bool lightOn, lightFlickering; + uint32 flashTimer1, flashTimer2, flashTimer3; + + if(bRenderDamaged || !bIsVisible || GetUp().z < 0.96f) + return; + + flashTimer1 = 0; + flashTimer2 = 0; + flashTimer3 = 0; + + n = CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects(); + for(i = 0; i < n; i++, flashTimer1 += 0x80, flashTimer2 += 0x100, flashTimer3 += 0x200){ + effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i); + + if(effect->type != EFFECT_LIGHT) + continue; + + pos = GetMatrix() * effect->pos; + + lightOn = false; + lightFlickering = false; + switch(effect->light.lightType){ + case LIGHT_ON: + lightOn = true; + break; + case LIGHT_ON_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7) + lightOn = true; + break; + case LIGHT_FLICKER: + if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) + lightOn = true; + else + lightFlickering = true; + if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3) + lightOn = true; + break; + case LIGHT_FLICKER_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7 || CWeather::WetRoads > 0.5f){ + if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) + lightOn = true; + else + lightFlickering = true; + if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3) + lightOn = true; + } + break; + case LIGHT_FLASH1: + if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) + lightOn = true; + break; + case LIGHT_FLASH1_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7) + if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) + lightOn = true; + break; + case LIGHT_FLASH2: + if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) + lightOn = true; + break; + case LIGHT_FLASH2_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7) + if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) + lightOn = true; + break; + case LIGHT_FLASH3: + if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) + lightOn = true; + break; + case LIGHT_FLASH3_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7) + if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) + lightOn = true; + break; + case LIGHT_RANDOM_FLICKER: + if(m_randomSeed > 16) + lightOn = true; + else{ + if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60) + lightOn = true; + else + lightFlickering = true; + if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3) + lightOn = true; + } + break; + case LIGHT_RANDOM_FLICKER_NIGHT: + if(CClock::GetHours() > 18 || CClock::GetHours() < 7){ + if(m_randomSeed > 16) + lightOn = true; + else{ + if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60) + lightOn = true; + else + lightFlickering = true; + if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3) + lightOn = true; + } + } + break; + case LIGHT_BRIDGE_FLASH1: + if(CBridge::ShouldLightsBeFlashing() && CTimer::GetTimeInMilliseconds() & 0x200) + lightOn = true; + break; + case LIGHT_BRIDGE_FLASH2: + if(CBridge::ShouldLightsBeFlashing() && (CTimer::GetTimeInMilliseconds() & 0x1FF) < 60) + lightOn = true; + break; + } + + // Corona + if(lightOn) + CCoronas::RegisterCorona((uintptr)this + i, + effect->col.r, effect->col.g, effect->col.b, 255, + pos, effect->light.size, effect->light.dist, + effect->light.corona, effect->light.flareType, effect->light.roadReflection, + effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); + else if(lightFlickering) + CCoronas::RegisterCorona((uintptr)this + i, + 0, 0, 0, 255, + pos, effect->light.size, effect->light.dist, + effect->light.corona, effect->light.flareType, effect->light.roadReflection, + effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); + + // Pointlight + if(effect->light.flags & LIGHTFLAG_FOG_ALWAYS){ + CPointLights::AddLight(CPointLights::LIGHT_FOGONLY_ALWAYS, + pos, CVector(0.0f, 0.0f, 0.0f), + effect->light.range, + effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f, + CPointLights::FOG_ALWAYS, true); + }else if(effect->light.flags & LIGHTFLAG_FOG_NORMAL && lightOn && effect->light.range == 0.0f){ + CPointLights::AddLight(CPointLights::LIGHT_FOGONLY, + pos, CVector(0.0f, 0.0f, 0.0f), + effect->light.range, + effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f, + CPointLights::FOG_NORMAL, true); + }else if(lightOn && effect->light.range != 0.0f){ + if(effect->col.r == 0 && effect->col.g == 0 && effect->col.b == 0){ + CPointLights::AddLight(CPointLights::LIGHT_POINT, + pos, CVector(0.0f, 0.0f, 0.0f), + effect->light.range, + 0.0f, 0.0f, 0.0f, + CPointLights::FOG_NONE, true); + }else{ + CPointLights::AddLight(CPointLights::LIGHT_POINT, + pos, CVector(0.0f, 0.0f, 0.0f), + effect->light.range, + effect->col.r*CTimeCycle::GetSpriteBrightness()/255.0f, + effect->col.g*CTimeCycle::GetSpriteBrightness()/255.0f, + effect->col.b*CTimeCycle::GetSpriteBrightness()/255.0f, + // half-useless because LIGHTFLAG_FOG_ALWAYS can't be on + (effect->light.flags & LIGHTFLAG_FOG) >> 1, + true); + } + } + + // Light shadow + if(effect->light.shadowSize != 0.0f){ + if(lightOn){ + CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE, + effect->light.shadow, &pos, + effect->light.shadowSize, 0.0f, + 0.0f, -effect->light.shadowSize, + 128, + effect->col.r*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, + effect->col.g*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, + effect->col.b*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f, + 15.0f, 1.0f, 40.0f, false, 0.0f); + }else if(lightFlickering){ + CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE, + effect->light.shadow, &pos, + effect->light.shadowSize, 0.0f, + 0.0f, -effect->light.shadowSize, + 0, 0.0f, 0.0f, 0.0f, + 15.0f, 1.0f, 40.0f, false, 0.0f); + } + } + } +} diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp index 844b6acd..08137d0c 100644 --- a/src/render/Particle.cpp +++ b/src/render/Particle.cpp @@ -3,6 +3,7 @@ #include "General.h" #include "Timer.h" #include "TxdStore.h" +#include "Entity.h" #include "Sprite.h" #include "Camera.h" #include "Collision.h" @@ -585,6 +586,40 @@ void CParticle::Initialise() debug("CParticle ready"); } +void +CEntity::AddSteamsFromGround(CVector *unused) +{ + int i, n; + C2dEffect *effect; + CVector pos; + + n = CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects(); + for(i = 0; i < n; i++){ + effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i); + if(effect->type != EFFECT_PARTICLE) + continue; + + pos = GetMatrix() * effect->pos; + switch(effect->particle.particleType){ + case 0: + CParticleObject::AddObject(POBJECT_PAVEMENT_STEAM, pos, effect->particle.dir, effect->particle.scale, false); + break; + case 1: + CParticleObject::AddObject(POBJECT_WALL_STEAM, pos, effect->particle.dir, effect->particle.scale, false); + break; + case 2: + CParticleObject::AddObject(POBJECT_DRY_ICE, pos, effect->particle.scale, false); + break; + case 3: + CParticleObject::AddObject(POBJECT_SMALL_FIRE, pos, effect->particle.dir, effect->particle.scale, false); + break; + case 4: + CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false); + break; + } + } +} + void CParticle::Shutdown() { debug("Shutting down CParticle..."); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index d47cac31..2559b743 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -920,6 +920,19 @@ CRenderer::RequestObjectsInFrustum(void) } } +bool +CEntity::SetupLighting(void) +{ + DeActivateDirectional(); + SetAmbientColours(); + return false; +} + +void +CEntity::RemoveLighting(bool) +{ +} + bool CPed::SetupLighting(void) { diff --git a/src/rw/RwHelper.cpp b/src/rw/RwHelper.cpp index e0133985..4ee3a0b3 100644 --- a/src/rw/RwHelper.cpp +++ b/src/rw/RwHelper.cpp @@ -324,26 +324,6 @@ HAnimAnimationCreateForHierarchy(RpHAnimHierarchy *hier) return anim; } -RpAtomic* -AtomicRemoveAnimFromSkinCB(RpAtomic *atomic, void *data) -{ - if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic))){ - RpHAnimHierarchy *hier = RpSkinAtomicGetHAnimHierarchy(atomic); -#ifdef LIBRW - if(hier && hier->interpolator->currentAnim){ - RpHAnimAnimationDestroy(hier->interpolator->currentAnim); - hier->interpolator->currentAnim = nil; - } -#else - if(hier && hier->pCurrentAnim){ - RpHAnimAnimationDestroy(hier->pCurrentAnim); - hier->pCurrentAnim = nil; - } -#endif - } - return atomic; -} - void RenderSkeleton(RpHAnimHierarchy *hier) {