I removed exclib in favor of a errno style approach but now strncpy is segfaulting. I have no fucking idea.

This commit is contained in:
2024-12-23 23:25:53 -05:00
parent 1e0d22d4e1
commit a1a243b2b2
20 changed files with 1225 additions and 887 deletions

View File

@@ -4,7 +4,6 @@
#include <SDL3/SDL_properties.h>
#include <SDL3_image/SDL_image.h>
#include <SDL3_mixer/SDL_mixer.h>
#include <aklabs/exclib.h>
#include <box2d/box2d.h>
#include "tilemap.h"
@@ -13,22 +12,15 @@
#include "draw.h"
#include "assets.h"
#include "sprite.h"
#include "error.h"
#include "registry.h"
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
{
spritesheet *spritesheetptr = NULL;
sprite *spriteptr = NULL;
actor *actorptr = NULL;
character *characterptr = NULL;
PREPARE_ERROR(errctx);
SDL_AudioSpec spec;
exclib_init();
exclib_name_exception(EXC_SDL_INIT, "SDL Initialization Failure");
exclib_name_exception(EXC_SDL_MUSICMIXER, "SDL Music Mixer Failure");
exclib_name_exception(EXC_GAME_UNDEFINED, "Undefined method or value");
exclib_name_exception(EXC_ATTRIBUTEERROR, "Attribute Error");
exclib_name_exception(EXC_TYPEERROR, "Type Error");
exclib_name_exception(EXC_KEYERROR, "Key Error");
heap_init();
registry_init_actor();
@@ -48,6 +40,40 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
return SDL_APP_FAILURE;
}
ATTEMPT {
spritesheet *sheet;
sprite *spr;
character *basechar;
CATCH(errctx, heap_next_spritesheet(&sheet));
CATCH(errctx, spritesheet_initialize(sheet, 48, 48, "../assets/Actor1.png"));
CATCH(errctx, heap_next_sprite(&spr));
CATCH(errctx, sprite_initialize(spr, "tester", sheet));
spr->frameids[0] = 13;
spr->speed = 100;
spr->loop = false;
spr->loopReverse = false;
spr->width = 48;
spr->height = 48;
CATCH(errctx, heap_next_character(&basechar));
CATCH(errctx, character_initialize(basechar, "tester"));
CATCH(errctx, character_sprite_add(basechar, spr, (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT)));
CATCH(errctx, heap_next_actor(&actorptr));
CATCH(errctx, actor_initialize((actor *)actorptr, "player"));
actorptr->basechar = basechar;
actorptr->visible = true;
actorptr->x = 120;
actorptr->y = 120;
actorptr->layer = 0;
actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT);
} CLEANUP {
} PROCESS(errctx) {
} FINISH_NORETURN(errctx);
/*
GAME_init_physics();
spec.freq = MIX_DEFAULT_FREQUENCY;
@@ -64,28 +90,29 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
(spec.channels > 2) ? "surround" : (spec.channels > 1) ? "stereo" : "mono");
}
TRY {
sprite_load_json("../assets/sprites/little_guy_walking_left.json");
sprite_load_json("../assets/sprites/little_guy_facing_left.json");
character_load_json("../assets/characters/littleguy.json");
actorptr = heap_next_actor();
actor_initialize(actorptr, "player");
actorptr->basechar = SDL_GetPointerProperty(
REGISTRY_CHARACTER,
"little guy",
NULL);
actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT | ACTOR_STATE_MOVING_LEFT);
actorptr->x = 320;
actorptr->y = 240;
actorptr->visible = true;
} EXCEPT {
} CATCH(EXC_NULLPOINTER) {
SDL_Log("Attempting to load asset: %s (%s)", EXCLIB_EXCEPTION->description, SDL_GetError());
return SDL_APP_FAILURE;
} FINALLY {
} ETRY;
ATTEMPT {
CATCH(errctx, sprite_load_json("../assets/sprites/little_guy_walking_left.json"));
CATCH(errctx, sprite_load_json("../assets/sprites/little_guy_facing_left.json"));
CATCH(errctx, character_load_json("../assets/characters/littleguy.json"));
CATCH(errctx, heap_next_actor(&actorptr));
CATCH(errctx, actor_initialize((actor *)actorptr, "player"));
actorptr->basechar = SDL_GetPointerProperty(
REGISTRY_CHARACTER,
"little guy",
NULL);
FAIL_ZERO_BREAK(errctx, actorptr->basechar, ERR_REGISTRY, "Can't load character 'little guy' from the registry");
} CLEANUP {
} PROCESS(errctx) {
} HANDLE(errctx, ERR_NULLPOINTER) {
SDL_Log("Attempting to load asset: %s (%s)", errctx->message, SDL_GetError());
return SDL_APP_FAILURE;
} FINISH_NORETURN(errctx);
actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT | ACTOR_STATE_MOVING_LEFT);
actorptr->x = 320;
actorptr->y = 240;
actorptr->visible = true;
*/
/*
TRY {
//load_start_bgm("../assets/nutcracker.mid");
@@ -100,16 +127,17 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
} ETRY;
*/
TRY {
tilemap_load("../assets/tilemap.tmj", &gamemap);
} EXCEPT {
} DEFAULT {
SDL_Log("Exception while loading tilemap: %s (%s)", EXCLIB_EXCEPTION->description, SDL_GetError());
return SDL_APP_FAILURE;
} FINALLY {
} ETRY;
ATTEMPT {
CATCH(errctx, tilemap_load("../assets/tilemap.tmj", (tilemap *)&gamemap));
} CLEANUP {
} PROCESS(errctx) {
} HANDLE_DEFAULT(errctx) {
SDL_Log("Error while loading tilemap: %s (%s)", errctx->message, SDL_GetError());
return SDL_APP_FAILURE;
} FINISH_NORETURN(errctx);
camera.x = 0;
camera.y = 0;
camera.w = 640;
@@ -143,9 +171,9 @@ SDL_AppResult SDL_AppIterate(void *appstate)
BITMASK_ADD(opflags.flags, ITERATOR_OP_UPDATE);
BITMASK_ADD(opflags.flags, ITERATOR_OP_RENDER);
for ( i = 0; i < gamemap.numlayers; i++ ) {
for ( i = 0; i < TILEMAP_MAX_LAYERS; i++ ) {
opflags.layerid = i;
tilemap_draw(renderer, &gamemap, &camera, i);
tilemap_draw(renderer, (tilemap *)&gamemap, &camera, i);
SDL_EnumerateProperties(REGISTRY_ACTOR, &registry_iterate_actor, (void *)&opflags);
}
SDL_RenderPresent(renderer);