Fixed level saving and loading
This commit is contained in:
12
code/first.c
12
code/first.c
@@ -260,8 +260,8 @@ int main(int argc, char **argv)
|
|||||||
if(e.type==SDL_EVENT_MOUSE_BUTTON_DOWN && e.button.button == SDL_BUTTON_LEFT) {
|
if(e.type==SDL_EVENT_MOUSE_BUTTON_DOWN && e.button.button == SDL_BUTTON_LEFT) {
|
||||||
switch(game->editor.mode){
|
switch(game->editor.mode){
|
||||||
case G_EDITOR_MODE_TILE: {
|
case G_EDITOR_MODE_TILE: {
|
||||||
F32 tilex = (S32)(game->editor.cursor.x+TILE_SIZE/2);
|
F32 tilex = (F32) (S32)(game->editor.cursor.x+TILE_SIZE/2);
|
||||||
F32 tiley = (S32)(game->editor.cursor.y+TILE_SIZE/2);
|
F32 tiley = (F32) (S32)(game->editor.cursor.y+TILE_SIZE/2);
|
||||||
game->world->map[(S32)tilex + (S32)tiley * 96] = game->editor.currentAsset;
|
game->world->map[(S32)tilex + (S32)tiley * 96] = game->editor.currentAsset;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -395,8 +395,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if(game->editor.enabled) {
|
if(game->editor.enabled) {
|
||||||
G_Editor editor = game->editor;
|
G_Editor editor = game->editor;
|
||||||
F32 tilex = floor(editor.cursor.x+TILE_SIZE/2);
|
F32 tilex = (F32) floor(editor.cursor.x+TILE_SIZE/2);
|
||||||
F32 tiley = floor(editor.cursor.y+TILE_SIZE/2);
|
F32 tiley = (F32) floor(editor.cursor.y+TILE_SIZE/2);
|
||||||
switch(game->editor.mode) {
|
switch(game->editor.mode) {
|
||||||
case G_EDITOR_MODE_TILE: {
|
case G_EDITOR_MODE_TILE: {
|
||||||
World_Tile asset = game->world->tileTypes[editor.currentAsset];
|
World_Tile asset = game->world->tileTypes[editor.currentAsset];
|
||||||
@@ -409,7 +409,7 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case G_EDITOR_MODE_HITBOX: {
|
case G_EDITOR_MODE_HITBOX: {
|
||||||
for(int i = 0; i < game->world->hitboxCount; i++) {
|
for(U32 i = 0; i < game->world->hitboxCount; i++) {
|
||||||
V2f centre = AABB_Centre(game->world->hitboxes[i]);
|
V2f centre = AABB_Centre(game->world->hitboxes[i]);
|
||||||
D_Rect(
|
D_Rect(
|
||||||
&game->draw,
|
&game->draw,
|
||||||
@@ -418,7 +418,7 @@ int main(int argc, char **argv)
|
|||||||
.texture=0,
|
.texture=0,
|
||||||
.dim=game->world->hitboxes[i].size,
|
.dim=game->world->hitboxes[i].size,
|
||||||
.flags=D_RECT_IGNORE_ASPECT,
|
.flags=D_RECT_IGNORE_ASPECT,
|
||||||
.c=V4F(100,0,0,0.7),
|
.c=V4F(100,0,0,0.7f),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ void ProcessEvents(SDL_Event *event, World *world)
|
|||||||
{
|
{
|
||||||
PlayerInput(event, &world->player);
|
PlayerInput(event, &world->player);
|
||||||
if(event->type == SDL_EVENT_KEY_DOWN && event->key.key == SDLK_F5){
|
if(event->type == SDL_EVENT_KEY_DOWN && event->key.key == SDLK_F5){
|
||||||
SaveWorld(world->arena, world);
|
SaveWorld(world);
|
||||||
}
|
}
|
||||||
if(event->type == SDL_EVENT_KEY_DOWN && event->key.key == SDLK_F6){
|
if(event->type == SDL_EVENT_KEY_DOWN && event->key.key == SDLK_F6){
|
||||||
LoadWorld(world->arena, world);
|
LoadWorld(world->arena, world);
|
||||||
@@ -50,7 +50,7 @@ void RenderWorld(World *world, D_Context *draw) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (int i = 0; i < world->propCount; i++) {
|
for (U32 i = 0; i < world->propCount; i++) {
|
||||||
if(world->props[i].area == world->player.currentArea) {
|
if(world->props[i].area == world->player.currentArea) {
|
||||||
D_Rect(
|
D_Rect(
|
||||||
draw,
|
draw,
|
||||||
@@ -75,93 +75,142 @@ void RenderWorld(World *world, D_Context *draw) {
|
|||||||
D_Rect(draw, world->player.pos.x, world->player.pos.y, .texture = 1);
|
D_Rect(draw, world->player.pos.x, world->player.pos.y, .texture = 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveWorld(M_Arena *arena, World *world) {
|
#define WRITE(v) FS_FileWrite(file, &(v), sizeof(v), offset); offset += sizeof(v)
|
||||||
printf("Saving world\n");
|
#define WRITEN(v, n) FS_FileWrite(file, v, (n) * sizeof(*(v)), offset); offset += ((n) * sizeof(*(v)))
|
||||||
|
|
||||||
|
void SaveWorld(World *world) {
|
||||||
|
printf("--- Saving World ---\n");
|
||||||
|
printf(" - %d props\n", world->propCount);
|
||||||
|
printf(" - %d hitboxes\n", world->hitboxCount);
|
||||||
|
|
||||||
OS_Handle file = FS_FileOpen(S("world.sgdat"), FS_ACCESS_WRITE);
|
OS_Handle file = FS_FileOpen(S("world.sgdat"), FS_ACCESS_WRITE);
|
||||||
U32 offset = 0;
|
U64 offset = 0;
|
||||||
for(int i = 0; i < WORLD_TILE_TYPE_MAX; i++) {
|
|
||||||
FS_FileWrite(file, &world->tileTypes[i].tag.count, sizeof(S64), offset);
|
for (U32 i = 0; i < WORLD_TILE_TYPE_MAX; i++) {
|
||||||
offset += sizeof(S64);
|
World_Tile *tile = &world->tileTypes[i];
|
||||||
FS_FileWrite(file, world->tileTypes[i].tag.data, world->tileTypes[i].tag.count, offset);
|
|
||||||
offset += sizeof(U8) * world->tileTypes[i].tag.count;
|
WRITE(tile->tag.count);
|
||||||
FS_FileWrite(file, &world->tileTypes[i].rotation, sizeof(F32), offset);
|
WRITEN(tile->tag.data, tile->tag.count);
|
||||||
offset += sizeof(F32);
|
WRITE(tile->rotation);
|
||||||
}
|
|
||||||
for(int i = 0; i < WORLD_PROP_TYPE_MAX; i++) {
|
|
||||||
FS_FileWrite(file, &world->propTypes[i].tag.count, sizeof(S64), offset);
|
|
||||||
offset += sizeof(S64);
|
|
||||||
FS_FileWrite(file, world->propTypes[i].tag.data, world->propTypes[i].tag.count, offset);
|
|
||||||
offset += sizeof(U8) * world->propTypes[i].tag.count;
|
|
||||||
FS_FileWrite(file, &world->propTypes[i].scale, sizeof(F32), offset);
|
|
||||||
offset += sizeof(F32);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FS_FileWrite(file, world->propTypes, sizeof(World_PropType)*WORLD_PROP_TYPE_MAX, offset);
|
for (U32 i = 0; i < WORLD_PROP_TYPE_MAX; i++) {
|
||||||
offset += sizeof(World_PropType)*WORLD_PROP_TYPE_MAX;
|
World_PropType *type = &world->propTypes[i];
|
||||||
|
|
||||||
FS_FileWrite(file, &world->propCount, sizeof(U32), offset);
|
WRITE(type->tag.count);
|
||||||
offset += sizeof(U32);
|
WRITEN(type->tag.data, type->tag.count);
|
||||||
|
WRITE(type->scale);
|
||||||
|
}
|
||||||
|
|
||||||
FS_FileWrite(file, world->props, sizeof(World_Prop)*WORLD_PROP_MAX, offset);
|
WRITE(world->propCount);
|
||||||
offset += sizeof(World_Prop)*WORLD_PROP_MAX;
|
WRITEN(world->props, WORLD_PROP_MAX);
|
||||||
|
|
||||||
FS_FileWrite(file, &world->hitboxCount, sizeof(U32), offset);
|
WRITE(world->hitboxCount);
|
||||||
offset += sizeof(U32);
|
WRITEN(world->hitboxes, WORLD_HITBOX_MAX);
|
||||||
|
|
||||||
FS_FileWrite(file, world->hitboxes, sizeof(AABB)*WORLD_HITBOX_MAX, offset);
|
WRITEN(world->map, WORLD_MAP_MAX);
|
||||||
offset += sizeof(AABB)*WORLD_HITBOX_MAX;
|
|
||||||
|
|
||||||
FS_FileWrite(file, world->map, sizeof(U32)*WORLD_MAP_MAX, offset);
|
|
||||||
offset += sizeof(U32)*WORLD_MAP_MAX;
|
|
||||||
|
|
||||||
FS_FileClose(file);
|
FS_FileClose(file);
|
||||||
printf("Saved world :)\n");
|
|
||||||
|
printf("--- World Saved ---\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadWorld(M_Arena *arena, World *world) {
|
void LoadWorld(M_Arena *arena, World *world) {
|
||||||
printf("loading world\n");
|
printf("--- Loading World ---\n");
|
||||||
OS_Handle file = FS_FileOpen(S("world.sgdat"), FS_ACCESS_READ);
|
|
||||||
U32 offset = 0;
|
|
||||||
|
|
||||||
world->tileTypes = M_ArenaPush(arena, World_Tile, .count=WORLD_TILE_TYPE_MAX);
|
M_TempScope(0, 0) {
|
||||||
for(int i = 0; i < WORLD_TILE_TYPE_MAX; i++) {
|
Str8 data = FS_ReadEntireFile(temp.arena, S("world.sgdat"));
|
||||||
FS_FileRead(file, &world->tileTypes[i].tag.count, sizeof(S64), offset);
|
|
||||||
offset += sizeof(S64);
|
U8 *base = data.data;
|
||||||
world->tileTypes[i].tag.data = M_ArenaPush(arena, U8, .count=world->tileTypes[i].tag.count);
|
|
||||||
FS_FileRead(file, world->tileTypes[i].tag.data, world->tileTypes[i].tag.count, offset);
|
// Load tile types
|
||||||
offset += sizeof(U8) * world->tileTypes[i].tag.count;
|
//
|
||||||
FS_FileRead(file, &world->tileTypes[i].rotation, sizeof(F32), offset);
|
world->tileTypes = M_ArenaPush(arena, World_Tile, .count = WORLD_TILE_TYPE_MAX);
|
||||||
offset += sizeof(F32);
|
for (U32 it = 0; it < WORLD_TILE_TYPE_MAX; ++it) {
|
||||||
}
|
World_Tile *type = &world->tileTypes[it];
|
||||||
world->propTypes = M_ArenaPush(arena, World_PropType, .count=WORLD_PROP_TYPE_MAX);
|
|
||||||
for(int i = 0; i < WORLD_PROP_TYPE_MAX; i++) {
|
Str8 name;
|
||||||
FS_FileRead(file, &world->propTypes[i].tag.count, sizeof(S64), offset);
|
name.count = *(S64 *) base;
|
||||||
offset += sizeof(S64);
|
name.data = base + 8;
|
||||||
world->propTypes[i].tag.data = M_ArenaPush(arena, U8, .count=world->propTypes[i].tag.count);
|
|
||||||
FS_FileRead(file, world->propTypes[i].tag.data, world->propTypes[i].tag.count, offset);
|
base += 8;
|
||||||
offset += sizeof(U8) * world->propTypes[i].tag.count;
|
base += name.count;
|
||||||
FS_FileRead(file, &world->propTypes[i].scale, sizeof(F32), offset);
|
|
||||||
offset += sizeof(F32);
|
if (name.count != 0) {
|
||||||
|
// Means we likely got a vaild tag
|
||||||
|
type->tag = Str8_Copy(arena, name);
|
||||||
|
type->rotation = *(F32 *) base;
|
||||||
}
|
}
|
||||||
|
|
||||||
FS_FileRead(file, &world->propCount, sizeof(U32), offset);
|
base += 4;
|
||||||
offset += sizeof(U32);
|
}
|
||||||
|
|
||||||
world->props = M_ArenaPush(arena, World_Prop, .count=WORLD_PROP_MAX);
|
// Load prop types
|
||||||
FS_FileRead(file, world->props, sizeof(World_Prop)*WORLD_PROP_MAX, offset);
|
//
|
||||||
offset += sizeof(World_Prop)*world->propCount;
|
world->propTypes = M_ArenaPush(arena, World_PropType, .count = WORLD_PROP_TYPE_MAX);
|
||||||
|
for (U32 it = 0; it < WORLD_PROP_TYPE_MAX; ++it) {
|
||||||
|
World_PropType *type = &world->propTypes[it];
|
||||||
|
|
||||||
FS_FileRead(file, &world->hitboxCount, sizeof(U32), offset);
|
Str8 name;
|
||||||
offset += sizeof(U32);
|
name.count = *(S64 *) base;
|
||||||
|
name.data = base + 8;
|
||||||
|
|
||||||
world->hitboxes = M_ArenaPush(arena, AABB, .count=WORLD_HITBOX_MAX);
|
base += 8;
|
||||||
FS_FileRead(file, world->hitboxes, sizeof(AABB)*WORLD_HITBOX_MAX, offset);
|
base += name.count;
|
||||||
offset += sizeof(AABB)*world->hitboxCount;
|
|
||||||
|
|
||||||
world->map = M_ArenaPush(arena, U32, .count=WORLD_MAP_MAX);
|
if (name.count != 0) {
|
||||||
FS_FileRead(file, world->map, sizeof(U32)*WORLD_MAP_MAX, offset);
|
type->tag = Str8_Copy(arena, name);
|
||||||
offset += sizeof(U32)*WORLD_MAP_MAX;
|
type->scale = *(F32 *) base;
|
||||||
|
}
|
||||||
|
|
||||||
FS_FileClose(file);
|
base += 4;
|
||||||
printf("loaded world\n");
|
}
|
||||||
|
|
||||||
|
// Prop locations
|
||||||
|
{
|
||||||
|
U32 n_props = *(U32 *) base; base += 4;
|
||||||
|
World_Prop *props = (World_Prop *) base;
|
||||||
|
|
||||||
|
world->propCount = n_props;
|
||||||
|
world->props = M_ArenaPush(arena, World_Prop, .count = WORLD_PROP_MAX);
|
||||||
|
|
||||||
|
M_CopySize(world->props, props, n_props * sizeof(World_Prop));
|
||||||
|
|
||||||
|
base += (WORLD_PROP_MAX * sizeof(World_Prop));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hitboxes
|
||||||
|
//
|
||||||
|
{
|
||||||
|
U32 n_hitbox = *(U32 *) base; base += 4;
|
||||||
|
AABB *boxes = (AABB *) base;
|
||||||
|
|
||||||
|
world->hitboxCount = n_hitbox;
|
||||||
|
world->hitboxes = M_ArenaPush(arena, AABB, .count = WORLD_HITBOX_MAX);
|
||||||
|
|
||||||
|
M_CopySize(world->hitboxes, boxes, n_hitbox * sizeof(AABB));
|
||||||
|
|
||||||
|
base += (WORLD_HITBOX_MAX * sizeof(AABB));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map
|
||||||
|
//
|
||||||
|
{
|
||||||
|
U32 *__map = (U32 *) base;
|
||||||
|
|
||||||
|
world->map = M_ArenaPush(arena, U32, .count = WORLD_MAP_MAX);
|
||||||
|
M_CopySize(world->map, __map, WORLD_MAP_MAX * sizeof(U32));
|
||||||
|
|
||||||
|
base += (WORLD_MAP_MAX * sizeof(U32));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (base != (data.data + data.count)) {
|
||||||
|
printf("--- OFFSET MISMATCH ---\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" - %d props\n", world->propCount);
|
||||||
|
printf(" - %d hitboxes\n", world->hitboxCount);
|
||||||
|
|
||||||
|
printf("--- Loaded World ---\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,6 @@ function void UpdateNPC(F32 delta, NPC *npc, World *world);
|
|||||||
function void UpdateBandit(F32 delta, Bandit *bandit, World *world);
|
function void UpdateBandit(F32 delta, Bandit *bandit, World *world);
|
||||||
|
|
||||||
function void LoadWorld(M_Arena *arena, World *world);
|
function void LoadWorld(M_Arena *arena, World *world);
|
||||||
function void SaveWorld(M_Arena *arena, World *world);
|
function void SaveWorld(World *world);
|
||||||
|
|
||||||
#endif // LD_GAME_WORLD_H_
|
#endif // LD_GAME_WORLD_H_
|
||||||
|
|||||||
Reference in New Issue
Block a user