From 7b7f0881164aeecd7f579fda99ab81d692e76c46 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 6 Oct 2025 19:27:45 +0100 Subject: [PATCH] fix: save/load --- code/first.c | 1 + code/game/impl/world.c | 23 ++++++++++++++++++----- code/world.sgdat | Bin 120960 -> 120960 bytes 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/code/first.c b/code/first.c index 43ed6ab..2e17524 100644 --- a/code/first.c +++ b/code/first.c @@ -284,6 +284,7 @@ int main(int argc, char **argv) Abs(game->editor.cursor.y-game->editor.dragStart.y) ); game->world->hitboxCount++; + GenerateNavMesh(game->arena, game->world); } } diff --git a/code/game/impl/world.c b/code/game/impl/world.c index 0415c80..28a522a 100644 --- a/code/game/impl/world.c +++ b/code/game/impl/world.c @@ -106,9 +106,6 @@ void SaveWorld(M_Arena *arena, World *world) { offset += sizeof(F32); } - FS_FileWrite(file, world->propTypes, sizeof(World_PropType)*WORLD_PROP_TYPE_MAX, offset); - offset += sizeof(World_PropType)*WORLD_PROP_TYPE_MAX; - FS_FileWrite(file, &world->propCount, sizeof(U32), offset); offset += sizeof(U32); @@ -159,14 +156,14 @@ void LoadWorld(M_Arena *arena, World *world) { world->props = M_ArenaPush(arena, World_Prop, .count=WORLD_PROP_MAX); FS_FileRead(file, world->props, sizeof(World_Prop)*WORLD_PROP_MAX, offset); - offset += sizeof(World_Prop)*world->propCount; + offset += sizeof(World_Prop)*WORLD_PROP_MAX; FS_FileRead(file, &world->hitboxCount, sizeof(U32), offset); offset += sizeof(U32); world->hitboxes = M_ArenaPush(arena, AABB, .count=WORLD_HITBOX_MAX); FS_FileRead(file, world->hitboxes, sizeof(AABB)*WORLD_HITBOX_MAX, offset); - offset += sizeof(AABB)*world->hitboxCount; + offset += sizeof(AABB)*WORLD_HITBOX_MAX; world->map = M_ArenaPush(arena, U32, .count=WORLD_MAP_MAX); FS_FileRead(file, world->map, sizeof(U32)*WORLD_MAP_MAX, offset); @@ -182,6 +179,14 @@ void GenerateNavMesh(M_Arena *arena, World *world) { for(int i = 0; i < WORLD_MAP_MAX; i++) { U32 x = (i % 96); U32 y = (i / 96); + bool skip = false; + for(int hi = 0; hi < world->hitboxCount; hi++) { + if(AABB_Point(world->hitboxes[hi], V2F(x, y))) { + skip = true; + break; + } + } + if(skip) {continue;} world->navMesh->nodes[world->navMesh->nodeCount].pos.x = x; world->navMesh->nodes[world->navMesh->nodeCount].pos.y = y; U32 cost = 20; @@ -198,6 +203,14 @@ void GenerateNavMesh(M_Arena *arena, World *world) { if(y+ny < 0 || y+ny > 49) { continue; } + // It's quad for loop time :D + for(int hi = 0; hi < world->hitboxCount; hi++) { + if(AABB_Point(world->hitboxes[hi], V2F(x+nx, y+ny))) { + skip = true; + break; + } + } + if(skip) {continue;} U32 index = x+nx + (y+ny)*96; U32 nCount = world->navMesh->nodeCount; world->navMesh->nodes[nCount].connections[world->navMesh->nodes[nCount].connectionCount].NodeIndex = index; diff --git a/code/world.sgdat b/code/world.sgdat index ec99a1f27b01e3a82ce4be280e2a2ac9293d8615..b02130a630b497ef065c279f72151fa4db8f7565 100644 GIT binary patch delta 29 lcmZqJ$lkD#eM1F%^8(K83pg1q8n25_6ae7B{$*LArQ!*;g94VHHr_H1kOFBX%bQq<6%$8}BO%d*j)IPgmY$w& zk*KzzqT7fk;0dUhvFCadujksA_3T`cFOn7IoHKXM`8;=IPabT|ekOxqzk4tkPr9F! zfd^Iiv^P2Gemyui81~D^2d{^_{e#13?&ZT5J9Wpse7M`G&%JnF)5el;d6uQ&-QSjm z7uMb%jZgaHa=L5Pv+!$c&%@Un4B_2QSmc%Jre@UJXoo&!(HXbGNE^)*Fxe(~?_NWWRS(9uW$PKd1Zu)uQ{u(f)B+vRxf9 z936H~i(5z;d#{R}3=WSbXOrUKtI^ZZXxN?i5NgkQ!_nxZ+y7>=wRPE9hz?GQ=+h@* zqNCCIS#hGv&i(2{(?EAxb=i5p3eL7(f6^Na%UjyT&a%W*YFXlO-4UPFB|fi9d{LM9 zvP@Ln`gOwu!gf9W=&QZGy>j^3wGiT`3-NIApV!2{oyWI20!`-OO@ z|6w5>&ims+JZ$`*7UE&+{#+CPWgegP8R~zX$1kV-hxqUF_|qrlT%n&o=J8p5xEK7n z5D%OCuX%jt5aNH=#Q&*@Z-0FK{R-=RSQCF#6MwuAFK6>ZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zV3oj~qTrq4b!%0jd?Nz<8)030QT}UFHB!jG5!SUA<-aynBZd4MVO@Js{%cb;Qpmp% z*0mRXoBr<>U3pzMxLcUKt?ysAi*u#C?pM8){r%rxIez~QdviPSeM@SdKI1+}lR*i$!vtG3Va+Z%Uxubyi(tWxlO@)2iOumD|kO!;JTe<(7Rm zFF&6y%WdZD@l`@^ZN2~T?lzMRGp2sV+sxVHtAyTef`5)P@{eDiO=tNxEgWB;f83|( zEdQp39-?VUieg1KurnCH;7LKpaKkn0XmVeX2@%8!7{y)&xvx%GJzw8-j z`8?F~&-fmF(`>lLJpX)C$^UkI@NerL6YDzX-eP^H5dP|uz*V-_n=RfVdL&4wkpLYG*y2r$(4%bGGy~X-Y$>ls_&b_4=$7*w) gG3VZ5rYX6cXUw^`6ysQJ&NJrRTg)^ix9J)G1(Ub{cK`qY