From 2d9857483035bdb1674daba913a2b3bff78b742d Mon Sep 17 00:00:00 2001 From: Masashi Date: Fri, 19 Dec 2025 11:20:00 +0530 Subject: [PATCH] world border --- game/client | Bin 34416 -> 34456 bytes game/client.c | 6 ++++ game/server | Bin 39600 -> 39600 bytes game/server.c | 85 +++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 73 insertions(+), 18 deletions(-) diff --git a/game/client b/game/client index 7c659dd49e959d31351148287697be205b322694..673d436fc8da0fddcf31bc3c5d26e67f38e74558 100755 GIT binary patch delta 8460 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 AqW}N^ delta 8356 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 F{u`TMhIjw~ diff --git a/game/client.c b/game/client.c index 162e224..eb6df46 100644 --- a/game/client.c +++ b/game/client.c @@ -179,6 +179,8 @@ float get_terrain_height(float x, float z) { #define TERRAIN_SIZE 256 #define TERRAIN_SCALE 1.0f +#define TERRAIN_MIN (-TERRAIN_SIZE * TERRAIN_SCALE / 2.0f) +#define TERRAIN_MAX (TERRAIN_SIZE * TERRAIN_SCALE / 2.0f) static Mesh generate_terrain_mesh(void) { int size = TERRAIN_SIZE; @@ -1005,6 +1007,10 @@ int main(void) { (Color){80, 140, 70, 255}; DrawModel(terrainModel, (Vector3){0, 0, 0}, 1.0f, WHITE); + // Draw border + float borderSize = TERRAIN_MAX - TERRAIN_MIN; + DrawCube((Vector3){0, 0, 0}, borderSize, 1000, borderSize, (Color){255, 0, 0, 100}); + // Items with basic lighting (no shader for now to keep it simple) for (int i = 0; i < MAX_ITEMS; i++) { if (!wi[i].present) diff --git a/game/server b/game/server index d390cbec1325a2f0a673e5fd25e4fd151d79b39b..30f4f0bd7c755907ab1a81cc8987e49afb6c5f66 100755 GIT binary patch delta 13111 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 delta 12160 zcmZu%4Oo;__J3z&6cKy}0Yel)_a#A%z(7SM86E7Uu&}i78$ScT!a}pwb*Oo#oCeIi zROY&^yY=7Ptu0I2^@DW$NW`qrwxVp6%IqCKQOu~6`Tx$ncffrfd7k0k^Ks9;_uO;N zJ@?FPdEdI_ee2qIYss`15-vo%t1JBPU7hu?q<6J<5ulwFSbpx&yj(yXExX@3BYJIx zK)1JSuk~c?-UX|^NO`;U`p0wk_g``7miO+l>^!w~Tc-ov5{jk^{>{~*4Hu1~Oy9ar zeIfSF35AMc{^xoy=sjtE91I3^pP@D0q9}9qL18JWU|yD@KXt$aX1fK@)aj0Cj_HmW zj+y)Q>f9(cOG_F+#JRd}6ld4HwS0VL(5xY;b>;_Xbf0YrdqW$am3p6|=)T++mMO}7 zHFclvwJk^2oCTiCs@)bX$d3|k@il?7vD6gZlFXK-sv1zydHGSxKMZqj_pJ2~B z6l_QLWk2^AU&$eJmY6Q8mteB>VuJ^?Si{p;ztrK@n9*!%>WdaTyOi4BGM~k!jdB&y z_-aEd=|Mtg*v?@=^VN&>y4TRwLsLYXM>Jg>Sf$ym#8tePsJa~a4cbEAZ7~=~=*@Ca zBas1blJGeRmr@I%CWl>^St3qJhGGe~O1M(OS0ubb!p#ycmv9)?##b$2MZ#+(d`k#Mtw8{`gGbQAO@2`iBTZkF(B3G*X^2JBIa z;-VGXLlXi)aI%DxyDLhaQ`0b>+F02pQ+rvBc53m&ohP|BgPY*(63$Qs+z4(`_;v}K z63(*&Py26`h(m+`94-YEMGH7y!i^G6mGG&qg1%agUlh`hgs*Vesio5FE4gx<+HeBG zxF(#MuDbwLNvN1ev0MjEt(1U`5?DciCik~iihnD#UkPXN{W-M^Vy=}y9sy3iF{f5U zz!3?Q5HL~adva>!1brhnSScmGEDa!oHtgHR{QJEc8`rMZk~uHtk#iKDKUf zaoX&=gnM}Ws&TrrqPSZvs_`#S-K|#D2!lS{t({ckh2AXYw#?{o$vt1a9Y?9Ud$LKl zWwN~6!d&~tNjLMwYP$C=&5s3Tp4Yvf%`Z?_9XzYLKeXsi?I*pvuiGnD_&Ry~6=y+P za`3V`ZEQRQ+Wrg?%fCc$8#Go?ycaV4=J?ALz;;z)l)D- zl$p1cQ^u~~Xz$4#(2J7k$E+>-n;jD`Tdn&lwD3L90tSm!I=#P{pSQ5+?Ecno^V#C` zg!mtMOq?9`Q$F^jtAl?r*_B{0(7^tj-q%vXcBl7uv0jRTcuoF=jdY(svPvUcQVm;g zP9R4M5y+@iYrmgmI!)^n0vAep9Wyo^zxkfVkcNM@=U34%aA86uFq zs>U0FK+YK=xX5x~Q?n|MLoGR`Es`2aZ6eX`RXi+^=!(e1>vFe)psZ*=X z!d);{^_=)E7<9PXf~x1C{=nzHIZIJs;&njhdxEOb0-JEcMd(bSPSqGQKq!&UGN1h8 z3J|_pIzg90Bbo``#*fW&RW()-SjCTuhCfMQ4L=>vG1XX3pg0kd^{4>FF{s880Se`- z#sUEfm8-@&0SY~<#+m^*e zL3K=>k=2Bj9Lr2$*D@0=!&t(QB$p11?)_B9NIz(o`G{63x&40|q$0d;{^bOG2&uKHe!O9BC>d0AGLr!v*9rIDX*`nI3wD~+mjW)u_;(@W97y&E1 zeedIa3HS>Dv~jPnN3wf%TL9jWpck@pTuVA&-It}Qv3u1RXXh*$_>dS_r9BFsc5!J^ zTtD9K+iOuLHmH;Kst@ifDEpGur~b>(mSY4Gb|bbA&T+G~qFa7uz0+G2n@V6iQr2cmMK6h_R6@Poh%ExQ>VC2xh~cW|)nv5xictk+Kd)x1hmLa5WjwwtNORup zs~uGgZu5gcFc<>x6o^`uOM0>w+3`;?lg>iR-m5Uk_jAbp%yh5^7DCQ^HOYV+;hSWf z6t|3peF#ydB||h1)>DAkLB5=MZ2KfyHC=xql=~}U;TxO52`A0pyMw4|{!y4X*)p!; z7zoOME#nRihZXH4G2~9-st#7fQE1)H)((qxg|29zYP39gDf2-v7``HLQ`gfVLp#Jd z{6Z{}DvB0790V~bT#O>aRY67WMYjjJ3D$wpc+H`Y@Gj_GNWKe$$b0DO1j|OPgagL~ zOE_ObjYdvIw<9>JG?N2zXHXwk4EY+aG%TW4D@Q*x3G_h`jE5PamsX<6(RA-|#mIYy zCfKG`@=HkW0{aEWMj45Y6Gx2}&V$e~u}JKR>xse(mPa1U5Af9lv9z@ufg7?K2%H8b zHV8ZMuvnWKJ>3XfOIhR};H0y^m`Ke3GJqPk0)=g}VXesb3aO{hwj<()aN=KZKOHDl89k z;^I20K06i@p%+CCzPxMZRqwVi9mMtl7wZueYQnfv5`PT%ecQqYgU44BmVss<-9Hx* zBvCBTyqEQAXO}{_(V8=tD0qEJj_OXe;0BH?X0MD$9J&5SzK41pCv*rzdP;0Uds&^L zhqtK3QLb$M=Dv!J9>e5DB!v^Y!8fxDBl@|v@k`mXou+6ha|YFp+XucElEt|p6T@HE z=ta)u#6u3^6D){hqF>ki=$N~HAW68K1)m_3q!J)VQn4W5MTAZlF4J#e&yO5r{k_I& zN8UPmb|Rl4@u4iKe} zQ2DSYo@R?i6d!TIe2lMV6s0l3 zRJMsHJvOq5J(`==b>|RT<+Q{Z?DgE7s1+QV{5>$Xcy=bYwCnf%c=WV&VpH!-S4l-e zY0#&6CtH7KVq%Lr#o(ua31A;n-jW)fLKHFY-AJT^h2Egq`YizRBm({j zAk)7CAr-mX8B*_XzK857Q!&w-V9~3ip1~3dQFB_0xMr3?7LEK1T6n8M(M&bsSkdSN z7g?9X9ke51J_qV>rQ%0DXKf|0%TDCyw5i5dKo=khEo&gw0`I{NkJ}BB&xqBaD7V=Q ziSwGbdf{;>Fo8{=;(l;Kiz92ap$Ju~$J$IIwBZ193@yuwn5B9yAi>#=EhvuNkfa34 zz(hkHM6gjk!^Mzd0AdJm8gOz14=BUrh;fK^s;2?+Fo_PJeMD`?925luHjIF8XS*U` zReE*YXE^xGt8OQ1C5QwSsD$`(e@46lMgt}q81wliQF;54r?$CGAe;AmN2Z^9fcinu zMb3P&{%jnMJg;20kG(p6^S1JP+3uY6*Y}e6AH{R*6RjqWB#Iih=-TzMTjZg*m9)^BL|f zfIN!;_?iGIWgu!ffv8`G9vP3(!Q;J$`H8#^Amtr&{nNA3^EO9plkZHda)3NK=^F=HKt-#mim}?zULtInpL-s1bE;2p1I@rr^y-Sv$>!0oA-9IVrs$YV zI^s~h2(K{#@)L*RJp$w>4seo+JPX{EY|^=;2r^}s1pW&t6djYO`{0<4aRiEeXvx() z7dT?0Ocn9Ajer5rG0DtO^`vnG(q4$B^vk1jgsA1@dt8`iE-;vdzcDdMC4r)FLsN`| ztK*pEBhm8^fug!V>G{XFt_!h)O6VmMh4~BKla3uwow5_(SSaR8jY#hQ4jx~5k-IHX zeLjxfo_aABvL*uEovdYSPuE2}%P2@+g^8=40Z2(8u@yjj$c+I`25AaJff7o+Fk%&z z)jW1Fq7p#+h-=75zH)`uHJ_mdd=>k2w0#O)(tcGG56(9nsXT;9lrgeJm z5hAwSxXfW4%j`-LJ_1~bE21Q`UN{1Lg8Kr#{9E}s7TxYj#^3RE7_nN)S#)tsmkFQ- zR$pTgMTrY;BhL1CZ7hMS5NC!EnOR@xJ-zcm*foS&!FppXH}03rc{gGH{6ECp5$BDe z?9znZuFV|X5$%lxDWl{jGJemQJ8lA_4em>;E58Zzy_~t@mN35K%%OmReIQ`4K1JP9 z`-1a^>*JaIU_@%lBd_;jex^Tk_3j#%YgdQTHagl3<01NmK-&5PXh8 zlp$_ezv`(KU?}ER2{06LrwK3=at8~LKix6*8Uh0;R|H%H$HN@a{x(-VFH+t~4`C5; z5rRuNOO1@USWh}fRLR>GA(+1Hqr5=8t})GFATSHnz34XHK%lJ4Ap$QTP^gds_%MLD z)nZ|7N+1ShDjNmhwJf@*XTj)Wu%Sg)#d)l_$$9i8hEbBC^d=0~kAflcDqB;O(B&KI zfAbSNIw9fSUDSW;Cn0(GO$KfthLw^b^(G8Y5JMpt%-~V>*2J`4Phc55190rdmXNFS zWx+I9Q*qA)am4uOfs|^>J1E^5ktOYCDA+C+> zo}AF-1?qo)oxOm5IrZPY&K5lw&yptFx)c(;@;WPeh{LI=1mA`4j%aD^TE0PW7h;IJ z&fYFg=yLi~^uNEx&O-2q)ZcoI4W61%^g8w3G6b|M^aderVt7C@v@7%mhS|jMJI-Ke zTS#eL?j%(6Z|tk$#K;8de}JsV-1I5C_5J~_D__u?qE<_VwhQsi9aUP)*|4L)H2(5H z?L|_kG-K*S$&{3ENudglnNF0>lG2K!BWY9}GGmEy9FIzx$CMPRESbN?Aj}5dlcYvT zqLP%^6a$J^QYe6vI1@qEJV=xhNy(EGs)U(u5oMU9Buh#oV!OGHDBUH+E-6%hbD1lM z^aFoc;pHkxRJk)}5T#a9n&slC>SsEM!X%|hQnn*MFb5K4fuuA@3RM?PJ5feU$`(1# z=DQG{%&X9OAeNIxX|zu&IGIg^J%5ta7OFDkdw({2;RFlj9Hhbly;Wo$$_C#SAJ@B| zC^I3s5H)95Vlo>&@pf0;5ghxKMg&v8)oc6josirQ+Tg{|os?B%`U8LYJ{UwOFCT*dZ)csak(3y(@wVF^1tb}?WD9ZPrug7A&aor(bug;EvpgP-m)Qo9v_piZ< z%0MYrJwK;LI|1WUJ*{{G?1WM&CQ{;tF9w^4;M~Vo>QtSV1OEXJIcG85tO=fv#1$FJ zqm6Xb&4^se$;F)9kyRT#BzXmqV+L_@M~-b=y@W`R81vg4K8(&^R#7Ko=`WOzDZx^D^)vtdUBetY}(_%Yn+OULBjE`<{%a9~8vtp=$2SSZk<~ zyMr=Le9h?nvgOUd0$8784^MOlLX=|<&tQ{ym*?2Ayvy^)uDna518uNs#~z*&w(u^Z ziE>ZC zO_`A~rjr0|Z{XWJ)KmTV95maY5t@Svz({wfB$FoO6_kBKHt5?HIb2FV$d1fN3nLcx zNq#arJF{!VLN04slp4p{X7*wF%wE$63zV$^*N~h>T4H}b7Yfuj&c&s7%rz=B7pC4$ z$3j6DAJ_qEOBS|kW=_OQT=KN25wVywd-6j9wEc#N|34FYWnp|APLB%Xv~t=bq^50) zq?zzVHsWSytQc|g|9B2>rX>i*I9{!;(%0^-7!gb=l){| zy1Ms=iYSyHzsSPlGj2Ul<{V6a&~`41O_()0aV;(hoV!y)`7XLpi^O)t4+6u?r}ndd z&PtA$iA|9C-PePCIm_Gk2!b-0&JwDY_oua>E=Q%x#BI@R)$AeG$QbtC>@4dSvCN#E zXRYbM2F}TfnE{=;zrznUe!!|w#LNBA&X&%}u=ei3UYnCS!i1{vb>>`9vL_ z2U1?0c^5=uCMuhb;w`k8jcO_U>_Fj>f6Ewv7HMay!)GL!Xt*` zM$j#1)qmR(2J$nStA%0Fg<80C^}^0LtwyZuS-4zvk;UnqL*EqInh`m0W^*Fvd*e=} zu_=oZt@C!UCl;k<{s#SE>+!qkPBN>v3n=rdIYf40`uO$b3GqYXK;*8i#}=h`daq|* z*t+rsY)Sch7KJ4)b#HB2dd+(O+Bbv2^^mjnonTPIMw`$!BUm+{3RDSv1L|gev|G*w zgQw7DoC^lYp8fbe1wAB^kuwyd%|k{~fwt)~OJ6pymyY4Lf=zLDfiEhGh7XKKX=Y28 z4X}orY{RntJrA4-2A2{Qe}nOG`Av&2BE;_RN$sk@~+-K@k( zdHn$-4jb5n_95bYfJLugDPa*Bc)T zlHpBk>C?9i$txk8qJ(ymhQ3vaQv4-^Mc9|4DBcpjXb#)?^ti4K^Eg%6z`D8zSj!(~ zL)>dvquU<+8SoaRm!hu|4B_ls_h`#n*3Wp{x@GRx4Mv;AitTK8<}@wv>1X>|@LTt- ze_h?yDe2Ki9$EZA#jJ{X6U*i-be1ho&rs%geom, p->body); dGeomSetCategoryBits(p->geom, CAT_PLAYER); dGeomSetCollideBits(p->geom, CAT_WORLD | CAT_PLAYER); + + p->borderDamageTimer = 0.0f; } static void player_ode_destroy(Player *p) { @@ -988,27 +993,71 @@ int main(void) { } } - for (int i = 0; i < MAX_PLAYERS; i++) { - Player *p = &players[i]; - if (!p->inUse || !p->alive) - continue; + for (int i = 0; i < MAX_PLAYERS; i++) { + Player *p = &players[i]; + if (!p->inUse || !p->alive) + continue; - const dReal *lvel = dBodyGetLinearVel(p->body); - const dReal *avel = dBodyGetAngularVel(p->body); + const dReal *lvel = dBodyGetLinearVel(p->body); + const dReal *avel = dBodyGetAngularVel(p->body); - float dx = p->moveX, dz = p->moveZ; - float len = sqrtf(dx * dx + dz * dz); - if (len > 1e-6f) { - dx /= len; - dz /= len; - } + float dx = p->moveX, dz = p->moveZ; + float len = sqrtf(dx * dx + dz * dz); + if (len > 1e-6f) { + dx /= len; + dz /= len; + } - float speed = 10.0f; - float fx = sinf(p->yaw) * dz - cosf(p->yaw) * dx; - float fz = cosf(p->yaw) * dz + sinf(p->yaw) * dx; - dBodySetLinearVel(p->body, fx * speed, lvel[1], fz * speed); - dBodySetAngularVel(p->body, avel[0], 0, avel[2]); - } + float speed = 10.0f; + float fx = sinf(p->yaw) * dz - cosf(p->yaw) * dx; + float fz = cosf(p->yaw) * dz + sinf(p->yaw) * dx; + dBodySetLinearVel(p->body, fx * speed, lvel[1], fz * speed); + dBodySetAngularVel(p->body, avel[0], 0, avel[2]); + } + + // Border damage + for (int i = 0; i < MAX_PLAYERS; i++) { + Player *p = &players[i]; + if (!p->inUse || !p->alive) + continue; + const dReal *pos = dBodyGetPosition(p->body); + float px = (float)pos[0], pz = (float)pos[2]; + if (px < TERRAIN_MIN || px > TERRAIN_MAX || pz < TERRAIN_MIN || pz > TERRAIN_MAX) { + p->borderDamageTimer += DT; + if (p->borderDamageTimer >= 0.5f) { + p->borderDamageTimer -= 0.5f; + p->hp -= 1; + if (p->hp <= 0) { + p->hp = 0; + p->alive = 0; + // Drop loot as in shooting death + const dReal *pos2 = dBodyGetPosition(p->body); + float x = (float)pos2[0], z = (float)pos2[2]; + if (p->pistolAmmo > 0) { + int qty = p->pistolAmmo; + if (qty > 12) qty = 12; + item_spawn(ITEM_AMMO_PISTOL, qty, x + frand_signed(&p->rng) * 2.0f, z + frand_signed(&p->rng) * 2.0f); + p->pistolAmmo -= qty; + } + if (p->rifleAmmo > 0) { + int qty = p->rifleAmmo; + if (qty > 30) qty = 30; + item_spawn(ITEM_AMMO_RIFLE, qty, x + frand_signed(&p->rng) * 2.0f, z + frand_signed(&p->rng) * 2.0f); + p->rifleAmmo -= qty; + } + if (p->medkits > 0) { + int qty = p->medkits; + if (qty > 2) qty = 2; + item_spawn(ITEM_MEDKIT, qty, x + frand_signed(&p->rng) * 2.0f, z + frand_signed(&p->rng) * 2.0f); + p->medkits -= qty; + } + printf("Player %d died from border damage and dropped loot\n", i); + } + } + } else { + p->borderDamageTimer = 0.0f; + } + } MsgSnapshot snap = {0}; snap.type = MSG_SNAPSHOT;