From 94b063789a6b29b9eb84aab92f0e53883661323b Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 13 Mar 2025 13:25:57 +0000 Subject: [PATCH] Fix route boards, change region api --- content_skaterift/maps/dev_tutorial/main.mdl | Bin 4762520 -> 4762656 bytes content_skaterift/maps/mp_line1/main.mdl | Bin 5986048 -> 5991136 bytes content_skaterift/maps/mp_mtzero/main.mdl | Bin 15963632 -> 15963768 bytes content_skaterift/maps/mp_spawn/main.mdl | Bin 14415400 -> 14390472 bytes skaterift_blender/sr_main.py | 26 ++-- skaterift_blender/sr_mdl.py | 13 +- src/ent_challenge.c | 42 +++++ src/ent_challenge.h | 1 + src/ent_region.c | 155 ++++++++++--------- src/ent_region.h | 6 + src/ent_route.c | 41 ++--- src/entity.h | 22 ++- src/world.c | 2 + src/world_entity.c | 140 ----------------- src/world_map.c | 99 +++++------- src/world_volumes.c | 27 ++-- 16 files changed, 244 insertions(+), 330 deletions(-) diff --git a/content_skaterift/maps/dev_tutorial/main.mdl b/content_skaterift/maps/dev_tutorial/main.mdl index 38bef2a30b34f0993261817b7013b1d62d177c1d..1cdda7858a9b23aaf49ae08be7e90057b42beb9f 100644 GIT binary patch delta 1269 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 delta 4301 zcmb7{du$X{6o=33E~UG)(()`_I?!Ff1youTp+LLK(+XRu^l1%!q+Ovv3%13S0B(`U zqYp#5v;%($7K}=GS+zB$v?f(cj8P;AYJ!*;MH3=uAT^QT@6PP(ZfB;&PV(*DGxywk z&bjB@)9sBbw@h_sZkbXmh-fO92quH_$}(RqM)lchB04gfNWhEgnyT{3_0{SWMK-6} zO?@ky3*u95=Ms&=L>#Cn+gwypQsb*CFWJm>`}2q*FvbMtYJ9ad+p2tgit?LJ+lBqj z7wrk}6cU;7<{I!-))cMB4qSsjNlXyzrgQt5D8vgfEJd&}ivrmb7b zD{F`{*~@}mh-6KI-CEqJ=y}CTH5vIOREg5{+F*Kc3VqT*d6<vLAYFhY?IC)L-Cygp<;0t*7~7rwn$5~` zSU;RVcI5>}RZ;S7N3M%}Idz+ccu=4&$wlK$G%iE!Nd(p;T%5hjTcADjM z6tU(Ur*#*k*Rkz()`gWOzge!tU!&L`SQ!s7^If8QQEWo4!@ALhR9T6t*pghQbz`!H zrpzFk#ws8k$g>b!qTTE$q~8lHB*MEU_8Fv+NHRjE4Xtw~)>kwu^aV1fiBC z=dTy)+K=Y9CC7H1IPTs%C(6S|=+u4BGU_+6q~Zu0uM(mMc-s2v1;NWMHgpKZYonb_usU{ar4~Lf`g*VuSz@;*}1?+ zco8eF>bf!34X!Wta6Ml1e1z)%(C_toRxB$^3oLN+RjPr#d-pz2-YcKp7H*)|v+jD+ z1?5fM0R8^{evN+Gkowu#+0ZXgw&I`O7G=R;4yC83YYY^^zzsK#*p>fkx7ctq725;@ zkUE>i$$q05XlZr|SvJzwTMmV0q_2bqD@0P(Au(ZyB#S+22=Lr3F9{1lUld$l&4FHD zp95K6O|pK0agvoY<<3N%E>B(F;_p_ALhn!^92#8TVzC$}S*;?ifv}_F_E8k!5$he2 zHZXB&Otj*rTXj=9g13I{TfOtj-fF>V_4S97hG2VxH%6p zhxE;fpNf)1bWyjqe;f6VpaG)=dWYl)CQLA}Oz7L6w25}VzOsx~xn zG;0m$vrrfoz(51?&mdQuL9d1(&5c*A4%Vyn)vJUxn7$@2(id%Ftp3l)&9?BK9d{yJ zN*^HALVCzm4Zr^gZ^#bLoe$-ZYY(k2AMtQHIA1Uvhr;y@J0`L>nVx-X6Mnd$^4u{+R4*I4goFU@Axi4&VgSz;rMJJPKT3CYS|ggU7(*;0Z7X zB!Ofw7d#1`0`tJrU_Mv?Qous62rLGvAPu;I2P^?g!7{KMtN<&)Gawy23s!;E9Svu_ zf<@}7%{&+#jS!~+K1NBOu3Yw0>|A`E2UZ2f)zba%ymslv=iU#b+gH6Yt?p%!`#haq hkO7_pYd|J=9;^jfARFX>T#yIy!3!Op&Vpm_{|EJ{uH66t diff --git a/content_skaterift/maps/mp_mtzero/main.mdl b/content_skaterift/maps/mp_mtzero/main.mdl index b6b8ed8a1451e515b694d2c257db752764c5a0a9..8e5b2a96d52e89dbad9bb87f44b2e7a036a0e633 100644 GIT binary patch delta 2085 zcmYk*dt8%M7{KxO3=~XDysr%sNkc^e6@;O*SHPkq(c9Oi9(mtYR@Tb2`R_R67`z+rn2!mLurIiIug*r zX3o#BnOqj9)s!!D)&4?hMIYpgxh%!5BBw=$l+v;-dQnq$SZ}yYmWG*ru-IL!;LNi) zWezJu3MGub7BZH@>T+JTdUuG>i+Z;~=nbJ}q0D2aavhoHFu8Iwd?$*|5lRQjIxRWY0(*0!Qs*A6(QDKjZo5X85Z&Z` zxj(T<)_h9_*;dyy3MMJ3#N?4=OfHgdEo9T)Hmb?JP?p~m&EYg(imAwKE%2pe{>`l{ z^;4pGmfvQI#rc2vdG|SuPSm+?v6T|{&aQqV2Y0*KC0QL~wM-37vzW{lXI6p9X;wCF zoSSW^$To=C1LZyx&&52E<{d@nw~VIW9o5_&b+(DL9W$h1I(40Eho`+= zOztg{y_e!m9%7%9eAO>qt-Q0Ly23SF4cGQmk5sl+J=O#Vuyzk!$ue!O(NjJ^WHwj(-BUd-s3iHkdFQYM$FY4A z7Thu37|~soy{xLOi`^?%@#`Jqt#00_|2@^qE}h<=8XuO_p=9E)xqHIYk`|$wUBM2SP z5uMN(UC05s4^7V*mzX5MmIE z!H7dV3`oEb3`HUyg%K)-AqmMy!Eii=$B~LB@FYec4NqYtp2jGQ#xqFAvv>|;@I1z1 z9LD1Xyod>yhzw-Hge+vk3=1Y92f47~CFCI=HrP=B2PVUbLbyP)MAilyO)Zj3V;A?z?Z*dgIa2zM_9ZupDzQ<{tK`nm3kN62^@iWfhJnHZZF5p*O f#3lTO-*FjN@CUBq8m{9{{DpcnRIF`k99jM!fAEHH delta 1887 zcmZwGdsI|K9Ki9J%ethPg7%WrnGxX5zN2xUnynMc1<2G?gBv zc&&?-1!-xim1$umiP{6L5Q}szLwi`7R)Em)^oRDnx}LM1)132}*`42Selv5=y=OPo z$2M=Qj~(R}LL{Rndcf%^bOaeMwLvjL`KFX||I8#2=WU=;_ zq8oukxC>ncZd<_NciLQfZgZLx9T?*yv4A5ODD^w^kg%3-Hp^i7UbCfQfD{TdX>fP~ zRPYx&{CW-*i1lU+Lyr|vU7y!mrJ5wovQo83v!%f<#bQpX*U|HQw!o}{$c>K8lp=w7 zV#qk^5=M6rS8bC4a=qI$h`i* z^nL6$x5IDa53ON^dQO^@h8ESNn39@XF5W7ah@R@KHIhz)IOlVVcB?drdjtZUjN)((mj1~TJ(>4J1AsWrCT#?||*{Z7u`Q?srrdr5j{ zt3FaXbokh?os2?B$;j4P2Ft=e^1_}%oTr^Tl9zkHvnIznecmD*g7oUPXWV^n9H zH}FpBsUtlL$DE3pVBLOx{bieI$@66(Rf#HEvY;&|y>@s`ZDRIinffvMYn#2Yn9_!f zn5ZRF;zMJO7H%D#<=ek2>Ky-ngT98Sm8*^)+?_X~cTPfR`snDDTG%IjT5_s1cG4g5 z#XD3_o-Na2wTW|OsM;`3X3R^<$mG4jGz3tFO6)+RHmOw(jXTXxy>%5vO>LEyI0GM& z-ns~5^`TZdMQZtNvQj2$Ep4)w%vhSxE}26TWCvA6;q(Ft+rj4ROvT@jB2bVGMs zg{yH5u0$oZbE;gVE_gq9fL3!LogKjeTE?u z!!ZIDWML$3#wgr^Y*;ZGIT(Xn+=|<9JMwS`?!;Xfi@Pxn_aGnRaW5udA|~NJ+>gna zf~j}_)9@gsqX08t!$Yv65Dv^l5oW=Ohfxd{-0;8)A7;ak5(H3+Ihcze=HU@Miurg9 zk7EHscmfNt2v1@$mS8E$@D!fLGk6xu@En$71g|AVM{b;}ee1mV%i0^O^hY-eLe2*V+1V5q)M{x{4;b;7U gUvV72;dh+CN&JCRIE_E?7yd>wTB;M;TZ^jx16HH|YybcN diff --git a/content_skaterift/maps/mp_spawn/main.mdl b/content_skaterift/maps/mp_spawn/main.mdl index 6ab54b58fb0e4dfaf106e468673d2060682be7d2..97614c1e2399b662a7293fef515a9178e6a6afc7 100644 GIT binary patch delta 20331 zcma)E30zdw7rq0-z&u1z5D;8&a3K`~#ubre5JW}Na?b@66buj%O*9=ab4^o^Ic8S4 zreuX;nr4bi{>{?N)Z9`tvotl^6wT%T-S_4(Z{7^%`}Mt<@7#0FJ@?!lunjkU*B#n; zOBbKZ7z+kMfQCSJUPk6*e9BLyD`N+I7}G#7p|Bu3Z_EU_h|Te5tZH$*zuShsjCEQ( z%)e3cY{u%LJOIee$QhBFUYJ>sou0!@sunK}(j+hbFi4ZN_{*S18|E_R0&xnEnO8U> zePTxTIIf2$jx?Ge%`s|(cNTTl1U33}Ib$7B!Y#OVetKcn2y3jNG#+|!v_KQ&R`nKR zjp##-e^mGfj0HlwkJVz_$g!ED3bQ9=a#;mq0zP?zxwld2xtRs&Ab7I2(j!e^RQXoM z+(5O!=J+7WFnoA45{G$CtTKKSXsDbFR)?N_cs3tar8ZsQxTE7YnyYU0Su+;pyr zEdL`_A~$hVR(eiOX5JXy#6frHf=i&woI7;iC9q4tLwLw^W#K5{{W2-DpgQ8^f3IOZ za^1z&@G@jIdlYwpr*h+7dd{_h3tLh#*7bs}Vvx|s(_DY|ncoIvXTBVqlbN28Suk>3 zdO-#&D=S+wVK7S?#L8CcUVSur@|c`)FSD|CJ}t6e;Oz@8%*qU&P?%mgF_Y__tn6K! z0Q&+_UXY%h!^(af`O62-XJ=#vkDFM?b>=5eUeO&RE<>`-9+St)imx0pU+6h8H(#I2iwk>x!qDAWiZ%)d|&JWJcD;y_^bH?##SXaxRFBE2vdMVf~n{)cCerFowH`%4Etm3HO zYG2yaI$TppKeRULd3W$}dW;&h>7uzr{o5FY=fQb5-qz8QHj%;$R$8T_qirJf{Xj9# zm@jQWB2#_a`FHYt-|Z$=NYV2jhzYulW+a^Q=+evyn%2+nvrn8>uhA zS6&69`r$@BUn97xH}wUZf^XbSFf9O^YAp+=FTtjPal1Hji!kb6#Wy~$`cORB94kws zX5$WXn-Dqchpkw*PWD=Vd3uvJ!8P8%bQn)S3Q(uZ!tMh@>7 zH8mRbSPI1OF3~WfQP>2=1G?=&D~yr)E!ILtC!s1cZ>rnQ#)3)H-iOlK1y`4c)7*AO z%@!(Y=T9fvHLI5Qfu_wajk^9McUsHJ zDZ7JFvy;+0_)vL=Q2j2*rB3@1TAy3l6>8McD9B}1dK%I(vbwMqz1h*G8cg3RSUd9S zWUO|YOg$8AD7~g&`LtKTX3|3iTTY!j+iKWE6T##LRMKWJIkaPRv$K)0d$3) zi84}flvc<4PouN z;x0x?>Efa3M@PCC^~bF~GDsh7)Sm+5IV+?@uwTbsx_11 z~xm6^}`!u+dUelg-ALhACJx zddtLZ7MpzNlF3$2H>#Upv*|~@6)c11CUBdQ1Rpw<5K1@VJTx;&)6J;=&DyY~)K$UO zQc*Xf<~JJO&4((xg;r}Fpg$B^Cnzk@=HUuuCvuzgM9iT?n~j!!RA~89qa>S6Ga8)4 zZTcqpP-&9QrW<{$(CSBC-EB4*)T2AMiSO=1i@MuvX3}1T)>3+?U~8#!GPj9H_Mzfr zo6P~*oNV)af^I4prcDoS)3k>V<@d1JV8-;Y*~FCXgD%VvX_)5~UqnWJEsIbb)@cYMZerS>T{hS>vl3vxa~FnhrMz&E}p zVD_XKg**7hmx2d%s73Ec{R1oYrS#s$YSxC{0ds+W?xq`^>21`w(YL)Zhf+iJZdQ2) z^-VQavqD+`=3ye$Hn} zpHO`Ri18m{j_6|)0<8}I_NKf(k@`kf8!c_@W7IbVlV<$SeT=?xS!i8YTc3*XzJuH% zd1QldLfZgo%A3P0d0|>`y-IwK8|%L>ZcWoaV>}@nwVAPbyx9@7bAUmAb1P#@+_Bow z&jUjAW~{Q!P?ke=2Zrd^fbp%cn7V=mVXH_6`ORxsDT-YvezP*L2Yn+^`qH#fSltO&;DQ18JZ z!h#GJcDgYx6FxL$utA^ssziUKbx`fP+JyzwXKXip3)TMHU09V5R3qupV1v;6D~W15 zQ>!5ced0wIb|2ZlL;Z(@=wmOtu$5@@LMj0}2gbX13w;Q7<0luk1MCK!84@C_`&qK< z9#6U#4f^+fbzu`>c#$Gr4AJ{ua}kH=LmKvCh!6;dR56W-=DlbTT38F+O|%WP4Jbcl zd79`l=yK3{pe;>Qd#FJu1LXldYoaL7r0Xs$6pBVP2G8$7`Lpc0%>kDc!(!QW8VQwwFKgKyRMYLThTceT>e+j$WYPz>H=e%mky?Sv zI$`qkVRRKHug#EDQeAB-T=tWJu~b)z8EFu*)@j8ImwD4z&}Q#znHCd2sV*%84c($; z{G52FKJ6Q6@Vp4hpTT~jzuK5yjLW(qPlNp^aFjs^`CQAs@?xw`14;tDby&-y&_{Vq zr~owdh?Z5>VQghEy$ky5c`XY?>B5$D7}WcsmVJ#Dt`4O;pyw}ZSxes~j5N6PqZy!Mhq$p|H2usV z`UrI1a5q*PG<*o11zkSUOy*mthL5l{y&X&Ouf_#!*(8trfT}U!jxN(sg)_xZ}q7Q8<4s z`DGbA?}GB@l)|%G#yzWL`C}bryf&^kQ}joF!u`~{lKa4Qw!qag?p`h9?$t8xp36GG zec(Denr-mhY<1s3;a)A{?$t8xUM=J9xy%Ij9oA9VScB(ZR`-Jx?$t8xUM=J9)iUm$ z%eebNlKb{mQgWs!+^c2Wy;{cIt7Y6hmvQ$~B=;{{-LF)*SIfA2wT!!0%i!KYRyx&D z#>3#Ye`6Y~Tt~}t4f>bhfb^>nO#TgDoE zMuu?)VQ`#I+%{rPP%7xZple}Uc7mpWzGu=goPb#RNm>v3LV}JJfbKm>$3edUeE@pz zBs~J%+fBz(L06rkR`~{@PNGiSCQqKC0iZ@uzBArDMKeIhf%2`|^LzRTv;=e(>h=Gg z&Vssk*Re$?^*>Fz@dhso=+~hAPrI-bN+0h-$>VDYqmp$j4boMoY4~`9uphJ*&bIqc z(>%~`Qgv)5P7XuP(>Bl-UevMMP;PXQE`ufvm1y^iRJ#Dd4bzEh<@k#f1=`t4Ctjq{ zps}D+;koD{Edkv*3KhYX$7R}GVDLN$${+8`QWx+MqL%RyqLyKF30%fqd0(cy2?pUf zXcKg3z-3wi`bU2p;@5ww(3|VVt(C?wt)8hOrkCVT>usK>DU}77u6==WrMKf zurwCGt4AF`7k(v;wy8ce67(=AKRK=Op@pDpj_MfyvETz=+6j6Wl>e9_xISG4{pK5K z;7+Me^(LeFp!_5~r#{7iCS29A;s*Gko`J@K?thH-q6wWMX&LA_7k6>h-)f|Npd(z} z#W}#*(JjzdL32=1KsyR7G6=te^0AZFj*^NDUjKmd<5@;KSNt^QkI6x_s7NdLXx&*q z-gE8fUD%8f+!_DjOJpZH4BFY#ot;2JaSFHt7hYcOV!Cg2c4fF~7Wq^36c1rOq@AE- zilWph2)VX9JC9^+h@vT=@6~l@Stu>-Ecn=0%gU!Y%D88)$Ir`$yOQn|gYZLu zJ4=D*CNUKGib4NOkmNa-N~VU`u_gqM0x$mvu?EM|HmHAZRZoL@6XNc}csOuAskmBNJ$DsJl4f(-J8UvK(%PohD4eK`a>&s@yxR`iB^L)Z!Nhx zokT}L`-6@|KB|)FzS-cpy^WNBUEQSw@cmCM;|bt0evsPLou(HXgvX%GK+krkvSNc* zNSHfo1$w=^E2~E(#X%TujP-_;ujmiDlS>KW0_8JsXfm}0jc6;`Oi!jEB?hk-L3xW8 zCG(jOQ6jmR4=H!CHkr1-Cg@prmV}mSd(Z{Y^av@l$9ssG%?0I|J=;Uf>;zDr*$X|C znSBjXeuKZ>gBH#(2oFK|78THwcFr((b&hlwPZ8lgU0EP4o*_js6;d8W&z@B8RfFJZ zl!jDUPl^FeXeZHsd(v3YsqNjxl{BRnEdwRcgRmXiivnk2@9iMb3%%$TN}F_)=!g`t z^k-0>)*n+S3Cen0b2z=1LIt220;@g*>+E*R8TKa?zwj=O#zJn<*R>YDy;|YVO5?eDfhRQPEDmpD9yFn&QGOQ zvkbyw(3P-VlS%_X!@5YWen_PmvkV;)LHYc=nd-{2@ELhx$o|xRqfNJaosDmGeVr-p z#2u6I_?iUXQGY=x|4IZ;r@FX50%-t#np2r2e)8`u z7Qfgk%dbm&#{_sBGI7Zqka+-*D7OfKBN5uC%@!fnrm-oec7fqYr zy6!Ic<^K4vJb~{wDt65OSE~u3PZoWT_kzXzow)?>imv3Tb9qpgdcL(Vw9V>|_fD=q z&6NJwBVqKT;JDx4*2T?=`8SqFvur47qNHLc;d0Szw~v{_t~1yLJY zRa-&B=!bI2`;yI^J+s+bSBgj{%5=F%_kvF5p00qlC9f@3DG`s zr$K!qkMAqLKF73+y-H0QH=?y$tchE+HB=KxJGO>sZ*Z&gphj~0#2RksCp_G~pM=!W z;)iSp|E=0rv3;H?cnEPPns(JuS5$rypyAV9eu^o$alQsLwisgLpsV6=(tg4I4Qc0=2DoeA08r*vpqrZpvE)w4x#rGNUt-sGp zJB#mZ@%@(g{!)D36W`DL%XJ2e@44c8hxooGz8gFc{fqA+@x4)epAp~shoXP+oh`oK z65n5n?|b6=nMb03@jX|3?-1YD@ZL%d9*h3@`_-byvx^>U02ja&&;o9N4sZuNwii9t zzvt~y_TW*>#|xLoEUPd0Svq(N_3R{pSYz-bXDMUFd+=E-8(41F5ds39RO;Jsb^SkM zv;97fftfh@?d&gk3z9}yty-wTiAH5TX!!1)6}R%YBdEIujTEj?Q!TS*&3Y_FFTJH7 zq+g2Vakt)8Z_k}C`trzZttzc6G&DOaftH;o-G;uEa{HX=CnqO6)#t5srr)n$KUv?> zrJm5Jx*vF={Q{+sohHGq91Hb#wPPPo=(k7iDD-SVvfNMVLakOS*D5ARZk5z0j?OIM zyia($Yt$(B5rVzn*S3u<+Sesk4#INDsT866rpQ_30jTZN{U^sK^|zzGCEr&FwM(6$ zHuqa>i-f1ka@E&WrNo4#VYiZ)!|wp1}DRbbN>Cyx0^8Z|{A4|ORt z+dx(?Fme-X(#KS?{Nydv6@z$!l0zD7>#LldnuD-Uo2_5ujz`+e4i(rI07nCLE9E>( z4S0He>lT8+VisFbz2d7o^6JCJ;!u}HB4hgI(Xn+_gjKH}^XJdEYk)j8YSOn3bvboR zXSR+MxeL@4s9VhYRoMkkFNtPDu0FE>CPkliSAW}qHr zJf*e;n2%O*SEwE}>OmmuOAD~0zF9rWc#C-jYJ-|uEbGhjN*$0oqw<)L^oz|r{bE>h zik!7Tv8Orcs~ce7V#htxUf+yg0NSP0(csAeG3FIKJ|^slZ40rlK-x2H4Y28p88z3i zD=WJ|uArtakQ*R(nXE5ow5EV~7oh#}W7{pB+-HvZ&N5^_NV$#8zd}D$^yWB->i7#|lz1S+%#mC7-AWrt?Oy6O_+0a+i=PhuiZ(VOJEgJ}a zK2GYl^l2b8^nLu;?3f*~OQieHf0gr`e2e=JE41Bz#Qckw4EZdl)^M`=SGV1%$I`&+ zbGEbk0)^l>^+g7L9&=yvg9W`hUtFfvw}c1TjT$E!X+h2|T6}<7)(0sEAVdL{(?Npm zwr{x|q`V983|l%hRN6Sq10G~?^>LXe)pjZ6W&BZ;^Ezw1MOiL2d{U|19CKVZEehXG zO7j~jn^tPa#D-pNq;4n{E9*_jVe~n<3B}nKU0d}vt)W+^t~Rv$+pyTQ#bDz)AoX4_`Om8AOk#^X}oWt`2IC*5pnS}WxF zsP+&2VUMd5f-maHB9+no4UYJF*PJyC-%$!6QdM2^N*r~23}$0#+*HZbIV zbCv{K(wyqspJDAAJeP z;)s$buY8dS!Nuo*{lzEDVJ6r{4gQ^;)j%F)mb3uH-HX?u)=*DgIb?MRvPX5&)yaAHF_3l;ElFVCde~J_*NA*$4StmV7 zUp)-PajQIM^CK#H!hX#c`(Jv=0mmOv=*4A2T_4YUEmfVRN1 zKsXQqL;^;j9nc==0CWU80iA&;pbHQUbOmC7SRf9F2TVW$&<#igl7Q|&GSCC)3G@O| zwi_GwemG$Er8B*ORNy(F56~BQ9(V!h2lNNH-audwFc=sDya)^hh5^HY5kMM{4vYjw z0U1ChFd7&GWC7X0Sl}ff2gn8TfN?-RFdirXCIE%NL|_u|GB6n^0;T{{fmeWOz;wV2 z6ayu|4B%B@Ch!_C3z!Ye0ppJzjOm!BNGZxVKGiBZ z!nL^Jj3d*mh7Tb!oBo<>%A9w{6t}W&!b{Qdv1k6LYd`;b%RQ%zzjU2CeR8b&V9x&> zV^+ycQ+`F$r`Erku*9kU^}BP;(dr745YT~?x19!b^zK{-{Y9Tw#S5GNG}ZdfJ0bbT z#%Mk%fBnN;V*`{8PQGFOZv$mO>I$3%REmJcPOvx)=zr=4U=76|&;Jm=c+G9oU*DG| zta@qG9^QgR^?!@0sS9qe&59qWzipb`Z0S?$Z~JPgQ+@O5D#w)afNp2L=`^5`PV|+7 zFTc_B*nhs>(XOms)#o)eVAK6K_MKgK+BApunoUn*umJ{z$EI)t2mMNQN|8MtkUaF& z{&(2v^ZeuK)40|C<2TNk!qzWI$nER*IhURL&K%2I@QRaJ!2dvL<6q}Y?e{Kr(04X# zxW31>Vn=;5Dsa{XJfQH8i=77KOuzJ6*!~M&{A>!I^oA+#U+HA9*b=|1rY>kZDr~>- z@==qS|B2Pp8XPZ>{v=DSzs)YCJa_oVW(X)|4*q1tNkCg|`quozVE9`lrk`5}`|1{y?b$gOgFs12WxQ<}@Ik6a8cF z4B4O4>%6Jn+Gz=QExFCH-g41bUL{u1J6xn333n|=WRX0WBtvsnu;2cYCg)AdiyNC( z_B@7P?&4o`p3AOrQR}zr;l4kco-=iFPkw6s(nDsa`k&sNo9eL2@_;V>SnM>Q?Y8dZ zaf**Jpe>f0Ev%c5ylW{$@_w|%(z_+JxS<@GBr?lml@HbWH+~nBVQM+D#$+gy_q6(Q z+tm7Ko12&nOXaZX+Un8DLy~8M+Qivx*z_QJf4ih>rqTglo91U_?%_GIbpB~~P1933 zofZ1#CmP7pO<^GFE2f*&Ie7Dc$YY_?fVMd4&x2vT_V@k8{Eg}ShFhlK?ulXx+*^dy z*a_Sq?S*Wo`nQ}^aB28p@lQTqpXQOE_TNgLZOPT~bBIWKDJoLHIN4+pQF?jINOsw-mcg;;pA=8GYIIo-A(9V+d6pwwiyQtJf&b$K{vh%+&(Pm%99YV_pH^S4Qmt=tHkEil@^-H_aJJhk?=?Oj3=oeWCyPAA z6QHxvraZ3rd|-Y$1Nk_iuE5!Gf(ImDoYeZbIN9&ed}Av8wJLr_lUt_Sp&kiGADd%i zt~71Wv`xCyG`E!(r>D_Z-fPtQ&pTXf5KuV+I9Q#=GgWZo3_8@vnRTy zd?@qxH2TWsDfO+*Yhm9*XrD6hYJ=HdM3w@pfYrbnU@fq2`xlYx$DFam6@9L?d|GF3 zEz6bW9~XOh!HognpS89xKDmCJ#%mD1zX+u9PfN*z^&KsXB6qg4#D#tw;KhaMz$E^; z{l}YIT52r8|7;1clozZEn0>?ReP9Ey5hw#b05$<10v`b%1LeSGV9WL!UKORyXZMS* z0JZ|30Na4=z^A|tU?=byunYJc*bVFfDuKPgK43p^0Qdqp2>cH?1bhh`2EGEm295wn jfp36gz_-A0;5*<1a1uBLd=H!k&H!h(_lrMwV(b3_**SKK delta 31092 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, challenge_index ); + + ui_px w = 340; + ui_rect description_box = { vg.window_x - (w + 8), 8, w, 32 }; + ctx->font = &vgf_default_large; + + if( _world.challenge_state != k_challenge_state_running ) + description_box[1] += 48; + + u32 next = challenge->first_objective_id; + while( mdl_entity_id_type(next) == k_ent_objective ) + { + u32 index = mdl_entity_id_id( next ); + ent_objective *objective = af_arritm( &world->ent_objective, index ); + next = objective->id_next; + + if( objective->pstr_description_ui ) + { + bool passed = (objective->flags & k_ent_objective_passed)? 1: 0; + u32 colour = passed? ui_colour(ctx,k_ui_yellow): 0xffcccccc; + + ui_fill( ctx, description_box, ui_opacity( GUI_COL_DARK, 0.36f ) ); + ui_outline( ctx, description_box, 1, colour, 0 ); + + const char *description = af_str( &world->meta.af, objective->pstr_description_ui ); + ui_text( ctx, description_box, description, 1, k_ui_align_middle_center, colour ); + + description_box[1] += description_box[3] + 4; + } + } + + ctx->font = &vgf_default_small; +} diff --git a/src/ent_challenge.h b/src/ent_challenge.h index 73641bd..4751c11 100644 --- a/src/ent_challenge.h +++ b/src/ent_challenge.h @@ -2,3 +2,4 @@ #include "entity.h" entity_call_result ent_challenge_call( world_instance *world, ent_call *call ); +void _ent_challenge_ui( ui_context *ctx ); diff --git a/src/ent_region.c b/src/ent_region.c index 197e84e..425b101 100644 --- a/src/ent_region.c +++ b/src/ent_region.c @@ -17,45 +17,45 @@ u32 region_spark_colour( u32 flags ) entity_call_result ent_region_call( world_instance *world, ent_call *call ) { - ent_region *region = - af_arritm( &world->ent_region, mdl_entity_id_id(call->id) ); + ent_region *region = af_arritm( &world->ent_region, mdl_entity_id_id(call->id) ); + ent_list *challenge_list = NULL; - if( !region->zone_volume ) - return k_entity_call_result_invalid; - - ent_volume *volume = - af_arritm( &world->ent_volume, mdl_entity_id_id(region->zone_volume) ); + if( region->v109.id_list != 0 ) + challenge_list = af_arritm( &world->ent_list, mdl_entity_id_id( region->v109.id_list ) ); if( call->function == 0 ) /* enter */ { - for( u32 i=0; ient_route); i ++ ) - { - ent_route *route = af_arritm( &world->ent_route, i ); - - v3f local; - m4x3_mulv( volume->to_local, route->board_transform[3], local ); - if( (fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f) ) - { - route->flags &= ~k_ent_route_flag_out_of_zone; - } - else - { - route->flags |= k_ent_route_flag_out_of_zone; - } - } - - gui_location_print_ccmd( 1, (const char *[]){ - af_str( &world->meta.af, region->pstr_title)} ); - + gui_location_print_ccmd( 1, (const char *[]){af_str( &world->meta.af, region->pstr_title)} ); vg_strncpy( af_str( &world->meta.af, region->pstr_title ), global_ent_region.location, NETWORK_REGION_MAX, k_strncpy_always_add_null ); global_ent_region.flags = region->flags; network_send_region(); - localplayer.effect_data.spark.colour = region_spark_colour(region->flags); + + for( u32 i=0; ient_route ); i ++ ) + { + ent_route *route = af_arritm( &world->ent_route, i ); + route->flags |= k_ent_route_flag_out_of_zone; + } + + if( challenge_list ) + { + for( u32 i=0; ientity_ref_count; i ++ ) + { + file_entity_ref *ref = af_arritm( &world->file_entity_ref, challenge_list->entity_ref_start + i ); + + u32 type = mdl_entity_id_type( ref->entity_id ), + index = mdl_entity_id_id( ref->entity_id ); + + if( type == k_ent_route ) + { + ent_route *route = af_arritm( &world->ent_route, index ); + route->flags &= ~k_ent_route_flag_out_of_zone; + } + } + } + return k_entity_call_result_OK; } else if( call->function == 1 ) /* leave */ @@ -79,71 +79,70 @@ void ent_region_re_eval( world_instance *world ) { u32 world_total = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver; - for( u32 i=0; ient_region); i ++ ) + for( u32 j=0; jent_region ); j ++ ) { - ent_region *region = af_arritm(&world->ent_region, i); - - if( !region->zone_volume ) - continue; - - ent_volume *volume = af_arritm(&world->ent_volume,mdl_entity_id_id(region->zone_volume)); + ent_region *region = af_arritm( &world->ent_region, j ); u32 combined = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver; - for( u32 j=0; jent_route); j ++ ) + if( region->v109.id_list != 0 ) { - ent_route *route = af_arritm(&world->ent_route, j ); + ent_list *list = af_arritm( &world->ent_list, mdl_entity_id_id( region->v109.id_list ) ); - v3f local; - m4x3_mulv( volume->to_local, route->board_transform[3], local ); - if( !((fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f)) ) + for( u32 i=0; ientity_ref_count; i ++ ) { - continue; - } - - combined &= route->flags; - } + file_entity_ref *ref = af_arritm( &world->file_entity_ref, list->entity_ref_start + i ); + + u32 type = mdl_entity_id_type( ref->entity_id ), + index = mdl_entity_id_id( ref->entity_id ); - for( u32 j=0; jent_challenge); j ++ ) - { - ent_challenge *challenge = af_arritm( &world->ent_challenge, j ); + if( type == k_ent_route ) + { + ent_route *route = af_arritm( &world->ent_route, index ); + combined &= route->flags; + } + else if( type == k_ent_challenge ) + { + ent_challenge *challenge = af_arritm( &world->ent_challenge, index ); - if( challenge->flags & k_ent_challenge_is_story ) - continue; + if( challenge->flags & k_ent_challenge_is_story ) + continue; - v3f local; - m4x3_mulv( volume->to_local, challenge->transform.co, local ); - if( !((fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f)) ) - { - continue; - } + u32 flags = 0x00; + if( challenge->status ) + { + flags |= k_ent_route_flag_achieve_gold; + flags |= k_ent_route_flag_achieve_silver; + } - u32 flags = 0x00; - if( challenge->status ) - { - flags |= k_ent_route_flag_achieve_gold; - flags |= k_ent_route_flag_achieve_silver; + combined &= flags; + } } - combined &= flags; + region->flags = combined; + world_total &= combined; } + } - region->flags = combined; - world_total &= combined; - - /* run unlock triggers. v105+ */ - if( world->meta.version >= 105 ) + /* run unlock triggers. v105+ */ + if( world->meta.version >= 105 ) + { + for( u32 j=0; jent_region ); j ++ ) { + ent_region *region = af_arritm( &world->ent_region, j ); if( region->flags & (k_ent_route_flag_achieve_gold|k_ent_route_flag_achieve_silver) ) { if( region->target0[0] ) { vg_info( "Trigger region unlock -> %u\n", region->target0[0] ); + + struct ent_region_unlock_data data = + { + .world_total = world_total, + .region_total = region->flags + }; + ent_call call; - call.data = NULL; + call.data = &data; call.id = region->target0[0]; call.function = region->target0[1]; entity_call( world, &call ); @@ -166,10 +165,12 @@ void ent_region_re_eval( world_instance *world ) steam_store_achievements(); } } - - if( _world.main.addon->flags & ADDON_REG_CITY ) + else if( _world.main.addon->flags & ADDON_REG_CITY ) { - steam_set_achievement( "CITY_COMPLETE" ); - steam_store_achievements(); + if( world_total & k_ent_route_flag_achieve_silver ) + { + steam_set_achievement( "CITY_COMPLETE" ); + steam_store_achievements(); + } } } diff --git a/src/ent_region.h b/src/ent_region.h index 6a86a32..886858b 100644 --- a/src/ent_region.h +++ b/src/ent_region.h @@ -9,6 +9,12 @@ struct global_ent_region } extern global_ent_region; +struct ent_region_unlock_data +{ + u32 world_total; + u32 region_total; +}; + u32 region_spark_colour( u32 flags ); void ent_region_re_eval( world_instance *world ); entity_call_result ent_region_call( world_instance *world, ent_call *call ); diff --git a/src/ent_route.c b/src/ent_route.c index 7c409f1..8412d61 100644 --- a/src/ent_route.c +++ b/src/ent_route.c @@ -11,26 +11,22 @@ entity_call_result ent_route_call( world_instance *world, ent_call *call ) if( call->function == 0 ) { - if( localplayer.subsystem == k_player_subsystem_walk ) /* view */ + if( world_set_event( k_world_event_route_leaderboard ) ) { -#if 0 - world_entity_set_focus( call->id ); - world_entity_focus_modal(); - - gui_helper_clear(); + gui_helper_reset( k_gui_helper_mode_clear ); vg_str text; - if( (_ent_route.helper_weekly = - gui_new_helper( input_button_list[k_srbind_mleft], &text ))) + if( (_ent_route.helper_weekly = gui_new_helper( input_button_list[k_srbind_mleft], &text ))) vg_strcat( &text, "Weekly" ); - if( (_ent_route.helper_alltime = - gui_new_helper( input_button_list[k_srbind_mright], &text ))) + if( (_ent_route.helper_alltime = gui_new_helper( input_button_list[k_srbind_mright], &text ))) vg_strcat( &text, "All time" ); if( gui_new_helper( input_button_list[k_srbind_mback], &text ) ) vg_strcat( &text, "Exit" ); -#endif + + _ent_route.looking_at_board = route; + localplayer.immobile = 1; } return k_entity_call_result_OK; @@ -48,11 +44,15 @@ void ent_route_preupdate(void) ent_route *route = _ent_route.looking_at_board; u32 cam_id = 0; - if( __builtin_expect( world->meta.version >= 103, 1 ) ) cam_id = route->id_camera; - //world_entity_focus_camera( world, cam_id ); + if( cam_id ) + { + vg_camera temp; + ent_camera_unpack( af_arritm( &world->ent_camera, mdl_entity_id_id(cam_id) ), &temp ); + world_set_entity_driven_camera( &temp ); + } if( button_down( k_srbind_mleft ) ) { @@ -66,14 +66,17 @@ void ent_route_preupdate(void) world_sfd_compile_active_scores(); } - _ent_route.helper_alltime->greyed =!world_sfd.view_weekly; - _ent_route.helper_weekly->greyed = world_sfd.view_weekly; + _ent_route.helper_alltime->greyed = !world_sfd.view_weekly; + _ent_route.helper_weekly->greyed = world_sfd.view_weekly; if( button_down( k_srbind_mback ) ) { - //world_entity_exit_modal(); - //world_entity_clear_focus(); - gui_helper_reset( k_gui_helper_mode_clear ); - return; + if( world_clear_event( k_world_event_route_leaderboard ) ) + { + srinput.state = k_input_state_resume; + localplayer.immobile = 0; + gui_helper_reset( k_gui_helper_mode_clear ); + return; + } } } diff --git a/src/entity.h b/src/entity.h index 50a1ae7..e1aceef 100644 --- a/src/entity.h +++ b/src/entity.h @@ -617,12 +617,14 @@ enum ent_objective_filter{ k_ent_objective_filter_passthrough = 0x00000100 }; -enum ent_objective_flag { +enum ent_objective_flag +{ k_ent_objective_hidden = 0x1, k_ent_objective_passed = 0x2 }; -struct ent_objective{ +struct ent_objective +{ mdl_transform transform; u32 submesh_start, submesh_count, @@ -632,6 +634,7 @@ struct ent_objective{ id_win; i32 win_event; f32 time_limit; + u32 pstr_description_ui; }; enum ent_challenge_flag @@ -689,12 +692,19 @@ struct ent_prop { u32 submesh_start, submesh_count, flags, pstr_alias; }; -struct ent_region { +struct ent_region +{ mdl_transform transform; - u32 submesh_start, submesh_count, pstr_title, flags, zone_volume, + u32 submesh_start, submesh_count, pstr_title, flags; + + union + { + struct{ u32 zone_volume; } v105; + struct{ u32 id_list; } v109; + }; - /* 105+ */ - target0[2]; + /* 105+ */ + u32 target0[2]; }; struct ent_glider { diff --git a/src/world.c b/src/world.c index b06d202..2cd84c1 100644 --- a/src/world.c +++ b/src/world.c @@ -39,6 +39,7 @@ void skaterift_world_get_save_path( addon_reg *world_reg, char buf[128] ) void world_update( world_instance *world, v3f pos ) { ent_script_update( world ); + ent_route_preupdate(); world_routes_update_timer_texts( world ); world_routes_update( world ); ent_traffic_update( world, pos ); @@ -52,6 +53,7 @@ void world_update( world_instance *world, v3f pos ) void world_gui( ui_context *ctx, world_instance *world ) { ent_skateshop_gui( ctx ); + _ent_challenge_ui( ctx ); } bool world_set_event( enum world_event event ) diff --git a/src/world_entity.c b/src/world_entity.c index cca108d..0fa08f5 100644 --- a/src/world_entity.c +++ b/src/world_entity.c @@ -27,146 +27,6 @@ bh_system bh_system_entity_list = .cast_ray = NULL }; -#if 0 -void world_entity_set_focus( u32 entity_id ) -{ - if( _world.focused_entity ) - { - vg_warn( "Entity %u#%u tried to take focus from %u#%u\n", - mdl_entity_id_type( entity_id ), - mdl_entity_id_id( entity_id ), - mdl_entity_id_type( _world.focused_entity ), - mdl_entity_id_id( _world.focused_entity ) ); - return; - } - - _world.focused_entity = entity_id; -} - -void world_entity_focus_modal(void) -{ - localplayer.immobile = 1; - menu.disable_open = 1; - srinput.state = k_input_state_resume; - - v3_zero( localplayer.rb.v ); - v3_zero( localplayer.rb.w ); - player_walk.move_speed = 0.0f; - skaterift.activity = k_skaterift_ent_focus; -} - -void world_entity_exit_modal(void) -{ - if( skaterift.activity != k_skaterift_ent_focus ) - { - vg_warn( "Entity %u#%u tried to exit modal when we weren't in one\n", - mdl_entity_id_type( _world.focused_entity ), - mdl_entity_id_id( _world.focused_entity ) ); - return; - } - - localplayer.immobile = 0; - menu.disable_open = 0; - srinput.state = k_input_state_resume; - skaterift.activity = k_skaterift_default; -} - -void world_entity_clear_focus(void) -{ - if( skaterift.activity == k_skaterift_ent_focus ) - { - vg_warn( "Entity %u#%u tried to clear focus before exiting modal\n", - mdl_entity_id_type( _world.focused_entity ), - mdl_entity_id_id( _world.focused_entity ) ); - return; - } - - _world.focused_entity = 0; -} - -void world_entity_focus_camera( world_instance *world, u32 uid ) -{ - if( mdl_entity_id_type( uid ) == k_ent_camera ) - { - u32 index = mdl_entity_id_id( uid ); - ent_camera *cam = af_arritm( &world->ent_camera, index ); - ent_camera_unpack( cam, &_world.focus_cam ); - } - else - { - vg_camera_copy( &localplayer.cam, &_world.focus_cam ); - - /* TODO ? */ - _world.focus_cam.nearz = localplayer.cam.nearz; - _world.focus_cam.farz = localplayer.cam.farz; - } -} - -/* logic preupdate */ -void world_entity_focus_preupdate(void) -{ - f32 rate = vg_minf( 1.0f, vg.time_frame_delta * 2.0f ); - int active = 0; - if( skaterift.activity == k_skaterift_ent_focus ) - active = 1; - - vg_slewf( &_world.focus_strength, active, - vg.time_frame_delta * (1.0f/0.5f) ); - - if( _world.focused_entity == 0 ) - return; - - u32 type = mdl_entity_id_type( _world.focused_entity ), - index = mdl_entity_id_id( _world.focused_entity ); - - world_instance *world = world_current_instance(); - - static void (*table[])( ent_focus_context *ctx ) = - { - [ k_ent_skateshop ] = ent_skateshop_preupdate, - [ k_ent_challenge ] = ent_challenge_preupdate, - [ k_ent_route ] = ent_route_preupdate, - [ k_ent_npc ] = ent_npc_preupdate, - }; - - if( (type > VG_ARRAY_LEN(table)) || (table[type] == NULL) ) - { - vg_fatal_error( "No pre-update method set for entity (%u#%u)\n", - type, index ); - } - - table[type]( &(ent_focus_context){ - .world = world, - .index = index, - .active = active } ); -} - -/* additional renderings like text etc.. */ -void world_entity_focus_render(void) -{ - world_instance *world = world_current_instance(); - if( skaterift.activity != k_skaterift_ent_focus ){ - skateshop_render_nonfocused( world, &g_render.cam ); - return; - } - - u32 type = mdl_entity_id_type( _world.focused_entity ), - index = mdl_entity_id_id( _world.focused_entity ); - - if( type == k_ent_skateshop ){ - ent_skateshop *skateshop = af_arritm( &world->ent_skateshop, index ); - skateshop_render( skateshop ); - } - else if( type == k_ent_challenge ){} - else if( type == k_ent_route ){} - else if( type == k_ent_miniworld ){} - else if( type == k_ent_npc ){} - else { - vg_fatal_error( "Programming error\n" ); - } -} -#endif - void world_gen_entities_init( world_instance *world ) { /* lights */ diff --git a/src/world_map.c b/src/world_map.c index 5884fbf..c316fad 100644 --- a/src/world_map.c +++ b/src/world_map.c @@ -583,7 +583,7 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al /* Draw world completion list * ------------------------------------------------------------------------------------------------------- */ - if( af_arrcount( &world->ent_region ) ) + if( (world->meta.version >= 109) && af_arrcount( &world->ent_region ) ) { ui_rect stat_panel = { main_area[0]+main_area[2]-(256+8), main_area[1]+8, 256, main_area[3]-16 }; u32 c0 = ui_opacity( GUI_COL_DARK, 0.36f ); @@ -595,8 +595,10 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al { ent_region *region = af_arritm( &world->ent_region, i ); - if( !region->zone_volume ) + u32 list_id = region->v109.id_list; + if( list_id == 0 ) continue; + ent_list *list = af_arritm( &world->ent_list, mdl_entity_id_id( list_id ) ); const char *title = af_str( &world->meta.af, region->pstr_title ); ctx->font = &vgf_default_large; @@ -608,76 +610,61 @@ void world_map_gui( ui_context *ctx, ui_rect main_area, i32 mh, i32 mv, bool *al stat_panel[2] -= 16; ctx->font = &vgf_default_small; - ent_volume *volume = af_arritm(&world->ent_volume, - mdl_entity_id_id(region->zone_volume)); - - u32 combined = k_ent_route_flag_achieve_gold | - k_ent_route_flag_achieve_silver; + u32 combined = k_ent_route_flag_achieve_gold | k_ent_route_flag_achieve_silver; char buf[128]; vg_str str; - for( u32 j=0; jent_route); j ++ ) + for( u32 j=0; jentity_ref_count; j ++ ) { - ent_route *route = af_arritm(&world->ent_route, j ); - - v3f local; - m4x3_mulv( volume->to_local, route->board_transform[3], local ); - if( !((fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f)) ) - { + file_entity_ref *ref = af_arritm( &world->file_entity_ref, list->entity_ref_start + j ); + if( ref->entity_id == 0 ) continue; - } - - combined &= route->flags; - vg_strnull( &str, buf, sizeof(buf) ); - vg_strcat( &str, "(Race) " ); - vg_strcat( &str, af_str( &world->meta.af, route->pstr_name )); + u32 type = mdl_entity_id_type( ref->entity_id ), + index = mdl_entity_id_id( ref->entity_id ); - if( route->flags & k_ent_route_flag_achieve_silver ) - vg_strcat( &str, " \xb3"); - if( route->flags & k_ent_route_flag_achieve_gold ) - vg_strcat( &str, "\xb3"); + if( type == k_ent_route ) + { + ent_route *route = af_arritm( &world->ent_route, index ); + combined &= route->flags; - ui_rect r; - ui_standard_widget( ctx, stat_panel, r, 1 ); - ui_text( ctx, r, buf, 1, k_ui_align_middle_left, - medal_colour( ctx, route->flags ) ); - } + vg_strnull( &str, buf, sizeof(buf) ); + vg_strcat( &str, "(Race) " ); + vg_strcat( &str, af_str( &world->meta.af, route->pstr_name )); - for( u32 j=0; jent_challenge); j ++ ) - { - ent_challenge *challenge = af_arritm( &world->ent_challenge, j ); - if( challenge->flags & k_ent_challenge_is_story ) - continue; + if( route->flags & k_ent_route_flag_achieve_silver ) + vg_strcat( &str, " \xb3"); + if( route->flags & k_ent_route_flag_achieve_gold ) + vg_strcat( &str, "\xb3"); - v3f local; - m4x3_mulv( volume->to_local, challenge->transform.co, local ); - if( !((fabsf(local[0]) <= 1.0f) && - (fabsf(local[1]) <= 1.0f) && - (fabsf(local[2]) <= 1.0f)) ) - { - continue; + ui_rect r; + ui_standard_widget( ctx, stat_panel, r, 1 ); + ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, route->flags ) ); } + else if( type == k_ent_challenge ) + { + ent_challenge *challenge = af_arritm( &world->ent_challenge, index ); + if( challenge->flags & k_ent_challenge_is_story ) + continue; - vg_strnull( &str, buf, sizeof(buf) ); - vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias)); + vg_strnull( &str, buf, sizeof(buf) ); + vg_strcat( &str, af_str( &world->meta.af,challenge->pstr_alias)); - u32 flags = 0x00; - if( challenge->status ) - { - flags |= k_ent_route_flag_achieve_gold; - flags |= k_ent_route_flag_achieve_silver; - vg_strcat( &str, " \xb3\xb3" ); - } + u32 flags = 0x00; + if( challenge->status ) + { + flags |= k_ent_route_flag_achieve_gold; + flags |= k_ent_route_flag_achieve_silver; + vg_strcat( &str, " \xb3\xb3" ); + } - combined &= flags; + combined &= flags; - ui_rect r; - ui_standard_widget( ctx, stat_panel, r, 1 ); - ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, flags ) ); + ui_rect r; + ui_standard_widget( ctx, stat_panel, r, 1 ); + ui_text( ctx, r, buf, 1, k_ui_align_middle_left, medal_colour( ctx, flags ) ); + } } stat_panel[0] -= 16; diff --git a/src/world_volumes.c b/src/world_volumes.c index f92ebc1..d111264 100644 --- a/src/world_volumes.c +++ b/src/world_volumes.c @@ -120,13 +120,16 @@ void world_volumes_update( world_instance *world, v3f pos ) { if( volume->flags & k_ent_volume_flag_interact ) { - if( world_set_event( k_world_event_interact ) ) + if( localplayer.subsystem == k_player_subsystem_walk ) { - gui_helper_reset( k_gui_helper_mode_black_bars ); - vg_str text; - if( gui_new_helper( input_button_list[k_srbind_maccept], &text )) - vg_strcat( &text, af_str( &world->meta.af, volume->interact.pstr_text ) ); - _world_volumes.active_volume_interact = volume; + if( world_set_event( k_world_event_interact ) ) + { + gui_helper_reset( k_gui_helper_mode_black_bars ); + vg_str text; + if( gui_new_helper( input_button_list[k_srbind_maccept], &text )) + vg_strcat( &text, af_str( &world->meta.af, volume->interact.pstr_text ) ); + _world_volumes.active_volume_interact = volume; + } } } else @@ -154,17 +157,17 @@ next_volume:; { srinput.state = k_input_state_resume; - ent_call call; - call.data = NULL; - call.function = volume->interact.activate_event; - call.id = volume->target; - entity_call( &_world.main, &call ); - if( world_clear_event( k_world_event_interact ) ) { _world_volumes.active_volume_interact = NULL; gui_helper_reset( k_gui_helper_mode_clear ); } + + ent_call call; + call.data = NULL; + call.function = volume->interact.activate_event; + call.id = volume->target; + entity_call( &_world.main, &call ); } } } -- 2.25.1