Unify the library on an akgl_ namespace
This commit is contained in:
134
src/actor.c
134
src/actor.c
@@ -11,27 +11,27 @@
|
||||
#include <sdl3game/staticstring.h>
|
||||
#include <sdl3game/iterator.h>
|
||||
|
||||
akerr_ErrorContext *actor_initialize(actor *obj, char *name)
|
||||
akerr_ErrorContext *akgl_actor_initialize(akgl_Actor *obj, char *name)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "actor_initialize received null actor pointer");
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "actor_initialize received null name string pointer");
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "akgl_actor_initialize received null actor pointer");
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "akgl_actor_initialize received null name string pointer");
|
||||
|
||||
memset(obj, 0x00, sizeof(actor));
|
||||
strncpy((char *)obj->name, name, ACTOR_MAX_NAME_LENGTH);
|
||||
memset(obj, 0x00, sizeof(akgl_Actor));
|
||||
strncpy((char *)obj->name, name, AKGL_ACTOR_MAX_NAME_LENGTH);
|
||||
obj->curSpriteReversing = false;
|
||||
obj->movement_controls_face = true;
|
||||
|
||||
obj->updatefunc = &actor_update;
|
||||
obj->renderfunc = &actor_render;
|
||||
obj->facefunc = &actor_automatic_face;
|
||||
obj->movementlogicfunc = &actor_logic_movement;
|
||||
obj->changeframefunc = &actor_logic_changeframe;
|
||||
obj->addchild = &actor_add_child;
|
||||
obj->updatefunc = &akgl_actor_update;
|
||||
obj->renderfunc = &akgl_actor_render;
|
||||
obj->facefunc = &akgl_actor_automatic_face;
|
||||
obj->movementlogicfunc = &akgl_actor_logic_movement;
|
||||
obj->changeframefunc = &akgl_actor_logic_changeframe;
|
||||
obj->addchild = &akgl_actor_add_child;
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_SetPointerProperty(REGISTRY_ACTOR, name, (void *)obj),
|
||||
SDL_SetPointerProperty(AKGL_REGISTRY_ACTOR, name, (void *)obj),
|
||||
AKERR_KEY,
|
||||
"Unable to add actor to registry"
|
||||
);
|
||||
@@ -40,34 +40,34 @@ akerr_ErrorContext *actor_initialize(actor *obj, char *name)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_set_character(actor *obj, char *basecharname)
|
||||
akerr_ErrorContext *akgl_actor_set_character(akgl_Actor *obj, char *basecharname)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Null actor reference");
|
||||
FAIL_ZERO_RETURN(errctx, basecharname, AKERR_NULLPOINTER, "Null character reference");
|
||||
|
||||
obj->basechar = SDL_GetPointerProperty(REGISTRY_CHARACTER, basecharname, NULL);
|
||||
obj->basechar = SDL_GetPointerProperty(AKGL_REGISTRY_CHARACTER, basecharname, NULL);
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Character not found in the registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_automatic_face(actor *obj)
|
||||
akerr_ErrorContext *akgl_actor_automatic_face(akgl_Actor *obj)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Null actor reference");
|
||||
ATTEMPT {
|
||||
if ( obj->movement_controls_face == true ) {
|
||||
// TODO : This doesn't really work properly
|
||||
BITMASK_DEL(obj->state, ACTOR_STATE_FACE_ALL);
|
||||
if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_LEFT) ) {
|
||||
BITMASK_ADD(obj->state, ACTOR_STATE_FACE_LEFT);
|
||||
} else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_RIGHT) ) {
|
||||
BITMASK_ADD(obj->state, ACTOR_STATE_FACE_RIGHT);
|
||||
} else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_UP) ) {
|
||||
BITMASK_ADD(obj->state, ACTOR_STATE_FACE_UP);
|
||||
} else if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_DOWN) ) {
|
||||
BITMASK_ADD(obj->state, ACTOR_STATE_FACE_DOWN);
|
||||
AKGL_BITMASK_DEL(obj->state, AKGL_ACTOR_STATE_FACE_ALL);
|
||||
if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_LEFT) ) {
|
||||
AKGL_BITMASK_ADD(obj->state, AKGL_ACTOR_STATE_FACE_LEFT);
|
||||
} else if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_RIGHT) ) {
|
||||
AKGL_BITMASK_ADD(obj->state, AKGL_ACTOR_STATE_FACE_RIGHT);
|
||||
} else if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_UP) ) {
|
||||
AKGL_BITMASK_ADD(obj->state, AKGL_ACTOR_STATE_FACE_UP);
|
||||
} else if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_DOWN) ) {
|
||||
AKGL_BITMASK_ADD(obj->state, AKGL_ACTOR_STATE_FACE_DOWN);
|
||||
}
|
||||
}
|
||||
} CLEANUP {
|
||||
@@ -76,7 +76,7 @@ akerr_ErrorContext *actor_automatic_face(actor *obj)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_logic_changeframe(actor *obj, sprite *curSprite, SDL_Time curtime)
|
||||
akerr_ErrorContext *akgl_actor_logic_changeframe(akgl_Actor *obj, akgl_Sprite *curSprite, SDL_Time curtime)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Null actor reference");
|
||||
@@ -111,7 +111,7 @@ akerr_ErrorContext *actor_logic_changeframe(actor *obj, sprite *curSprite, SDL_T
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_logic_movement(actor *obj, SDL_Time curtime)
|
||||
akerr_ErrorContext *akgl_actor_logic_movement(akgl_Actor *obj, SDL_Time curtime)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Null actor reference");
|
||||
@@ -119,27 +119,27 @@ akerr_ErrorContext *actor_logic_movement(actor *obj, SDL_Time curtime)
|
||||
// Children don't move independently of their parents, they just have an offset
|
||||
SUCCEED_RETURN(errctx);
|
||||
} else {
|
||||
if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_LEFT) ) {
|
||||
if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_LEFT) ) {
|
||||
obj->x -= obj->basechar->vx;
|
||||
}
|
||||
if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_RIGHT) ) {
|
||||
if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_RIGHT) ) {
|
||||
obj->x += obj->basechar->vx;
|
||||
}
|
||||
if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_UP) ) {
|
||||
if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_UP) ) {
|
||||
obj->y -= obj->basechar->vy;
|
||||
}
|
||||
if ( BITMASK_HAS(obj->state, ACTOR_STATE_MOVING_DOWN) ) {
|
||||
if ( AKGL_BITMASK_HAS(obj->state, AKGL_ACTOR_STATE_MOVING_DOWN) ) {
|
||||
obj->y += obj->basechar->vy;
|
||||
}
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_update(actor *obj)
|
||||
akerr_ErrorContext *akgl_actor_update(akgl_Actor *obj)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
SDL_Time curtime = 0;
|
||||
sprite *curSprite = NULL;
|
||||
akgl_Sprite *curSprite = NULL;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor reference");
|
||||
FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference");
|
||||
@@ -157,7 +157,7 @@ akerr_ErrorContext *actor_update(actor *obj)
|
||||
} FINISH(errctx, false);
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
CATCH(errctx, akgl_character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
// is it time to change frames?
|
||||
if ( ((curtime) - obj->curSpriteFrameTimer) >= curSprite->speed) {
|
||||
CATCH(errctx, obj->changeframefunc(obj, curSprite, curtime));
|
||||
@@ -172,17 +172,17 @@ akerr_ErrorContext *actor_update(actor *obj)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
static akerr_ErrorContext *actor_visible(actor *obj, SDL_FRect *camera, bool *visible)
|
||||
static akerr_ErrorContext *actor_visible(akgl_Actor *obj, SDL_FRect *camera, bool *visible)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
sprite *curSprite = NULL;
|
||||
akgl_Sprite *curSprite = NULL;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, renderer, AKERR_NULLPOINTER, "NULL renderer");
|
||||
FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
CATCH(errctx, akgl_character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} HANDLE(errctx, AKERR_KEY) {
|
||||
@@ -202,10 +202,10 @@ static akerr_ErrorContext *actor_visible(actor *obj, SDL_FRect *camera, bool *vi
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_render(actor *obj, SDL_Renderer *renderer)
|
||||
akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj, SDL_Renderer *renderer)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
sprite *curSprite = NULL;
|
||||
akgl_Sprite *curSprite = NULL;
|
||||
bool visible = false;
|
||||
SDL_FRect src;
|
||||
SDL_FRect dest;
|
||||
@@ -215,7 +215,7 @@ akerr_ErrorContext *actor_render(actor *obj, SDL_Renderer *renderer)
|
||||
FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
CATCH(errctx, akgl_character_sprite_get(obj->basechar, obj->state, &curSprite));
|
||||
CATCH(errctx, actor_visible(obj, &camera, &visible));
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
@@ -259,7 +259,7 @@ akerr_ErrorContext *actor_render(actor *obj, SDL_Renderer *renderer)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *actor_add_child(actor *obj, actor *child)
|
||||
akerr_ErrorContext *akgl_actor_add_child(akgl_Actor *obj, akgl_Actor *child)
|
||||
{
|
||||
int i = 0;
|
||||
PREPARE_ERROR(errctx);
|
||||
@@ -267,7 +267,7 @@ akerr_ErrorContext *actor_add_child(actor *obj, actor *child)
|
||||
FAIL_ZERO_RETURN(errctx, child, AKERR_NULLPOINTER, "NULL child pointer");
|
||||
|
||||
FAIL_NONZERO_RETURN(errctx, child->parent, AKERR_RELATIONSHIP, "Child object already has a parent");
|
||||
for ( i = 0; i < ACTOR_MAX_CHILDREN ; i++ ) {
|
||||
for ( i = 0; i < AKGL_ACTOR_MAX_CHILDREN ; i++ ) {
|
||||
if ( obj->children[i] == NULL ) {
|
||||
obj->children[i] = child;
|
||||
child->parent = obj;
|
||||
@@ -280,25 +280,25 @@ akerr_ErrorContext *actor_add_child(actor *obj, actor *child)
|
||||
|
||||
// SDL iterator so we can't return error information here, void only
|
||||
// this means we don't have anywhere to send exceptions up to, so if we hit an error, we log and exit(1) here
|
||||
void registry_iterate_actor(void *userdata, SDL_PropertiesID registry, const char *name)
|
||||
void akgl_registry_iterate_actor(void *userdata, SDL_PropertiesID registry, const char *name)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
iterator *opflags = (iterator *)userdata;
|
||||
akgl_Iterator *opflags = (akgl_Iterator *)userdata;
|
||||
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_BREAK(errctx, name, AKERR_NULLPOINTER, "registry_iterate_actor received NULL property name");
|
||||
FAIL_ZERO_BREAK(errctx, opflags, AKERR_NULLPOINTER, "received NULL iterator flags");
|
||||
actor *obj = (actor *)SDL_GetPointerProperty(registry, name, NULL);
|
||||
akgl_Actor *obj = (akgl_Actor *)SDL_GetPointerProperty(registry, name, NULL);
|
||||
FAIL_ZERO_BREAK(errctx, obj, AKERR_KEY, "registry_iterate_actor received property name that was not in the registry");
|
||||
if ( BITMASK_HAS(opflags->flags, ITERATOR_OP_LAYERMASK) ) {
|
||||
if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_LAYERMASK) ) {
|
||||
if ( obj->layer != opflags->layerid ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( BITMASK_HAS(opflags->flags, ITERATOR_OP_UPDATE) ) {
|
||||
if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_UPDATE) ) {
|
||||
CATCH(errctx, obj->updatefunc(obj));
|
||||
}
|
||||
if ( BITMASK_HAS(opflags->flags, ITERATOR_OP_RENDER) ) {
|
||||
if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_RENDER) ) {
|
||||
CATCH(errctx, obj->renderfunc(obj, renderer));
|
||||
}
|
||||
} CLEANUP {
|
||||
@@ -306,94 +306,94 @@ void registry_iterate_actor(void *userdata, SDL_PropertiesID registry, const cha
|
||||
} FINISH_NORETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_left_on(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_left_on(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) moves actor left", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, (ACTOR_STATE_FACE_ALL | ACTOR_STATE_MOVING_ALL));
|
||||
BITMASK_ADD(obj->state, (ACTOR_STATE_MOVING_LEFT | ACTOR_STATE_FACE_LEFT));
|
||||
AKGL_BITMASK_DEL(obj->state, (AKGL_ACTOR_STATE_FACE_ALL | AKGL_ACTOR_STATE_MOVING_ALL));
|
||||
AKGL_BITMASK_ADD(obj->state, (AKGL_ACTOR_STATE_MOVING_LEFT | AKGL_ACTOR_STATE_FACE_LEFT));
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_left_off(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_left_off(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) stops moving actor left", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, ACTOR_STATE_MOVING_LEFT);
|
||||
AKGL_BITMASK_DEL(obj->state, AKGL_ACTOR_STATE_MOVING_LEFT);
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_right_on(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_right_on(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) moves actor right", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, (ACTOR_STATE_FACE_ALL | ACTOR_STATE_MOVING_ALL));
|
||||
BITMASK_ADD(obj->state, (ACTOR_STATE_MOVING_RIGHT | ACTOR_STATE_FACE_RIGHT));
|
||||
AKGL_BITMASK_DEL(obj->state, (AKGL_ACTOR_STATE_FACE_ALL | AKGL_ACTOR_STATE_MOVING_ALL));
|
||||
AKGL_BITMASK_ADD(obj->state, (AKGL_ACTOR_STATE_MOVING_RIGHT | AKGL_ACTOR_STATE_FACE_RIGHT));
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_right_off(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_right_off(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) stops moving actor right", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, ACTOR_STATE_MOVING_RIGHT);
|
||||
AKGL_BITMASK_DEL(obj->state, AKGL_ACTOR_STATE_MOVING_RIGHT);
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_up_on(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_up_on(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) moves actor up", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, (ACTOR_STATE_FACE_ALL | ACTOR_STATE_MOVING_ALL));
|
||||
BITMASK_ADD(obj->state, (ACTOR_STATE_FACE_UP | ACTOR_STATE_MOVING_UP));
|
||||
AKGL_BITMASK_DEL(obj->state, (AKGL_ACTOR_STATE_FACE_ALL | AKGL_ACTOR_STATE_MOVING_ALL));
|
||||
AKGL_BITMASK_ADD(obj->state, (AKGL_ACTOR_STATE_FACE_UP | AKGL_ACTOR_STATE_MOVING_UP));
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_up_off(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_up_off(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) stops moving actor up", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, ACTOR_STATE_MOVING_UP);
|
||||
AKGL_BITMASK_DEL(obj->state, AKGL_ACTOR_STATE_MOVING_UP);
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_down_on(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_down_on(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) moves actor down", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, (ACTOR_STATE_FACE_ALL | ACTOR_STATE_MOVING_ALL));
|
||||
BITMASK_ADD(obj->state, (ACTOR_STATE_MOVING_DOWN | ACTOR_STATE_FACE_DOWN));
|
||||
AKGL_BITMASK_DEL(obj->state, (AKGL_ACTOR_STATE_FACE_ALL | AKGL_ACTOR_STATE_MOVING_ALL));
|
||||
AKGL_BITMASK_ADD(obj->state, (AKGL_ACTOR_STATE_MOVING_DOWN | AKGL_ACTOR_STATE_FACE_DOWN));
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3GActor_cmhf_down_off(actor *obj, SDL_Event *event)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_Actor_cmhf_down_off(akgl_Actor *obj, SDL_Event *event)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor");
|
||||
FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event");
|
||||
//SDL_Log("event %d (button %d / key %d) stops moving actor down", event->type, event->gbutton.which, event->key.key);
|
||||
BITMASK_DEL(obj->state, ACTOR_STATE_MOVING_DOWN);
|
||||
AKGL_BITMASK_DEL(obj->state, AKGL_ACTOR_STATE_MOVING_DOWN);
|
||||
//SDL_Log("new target actor state: %b", obj->state);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
char *ACTOR_STATE_STRING_NAMES[32] = {
|
||||
"ACTOR_STATE_FACE_DOWN",
|
||||
"ACTOR_STATE_FACE_LEFT",
|
||||
"ACTOR_STATE_FACE_RIGHT",
|
||||
"ACTOR_STATE_FACE_UP",
|
||||
"ACTOR_STATE_ALIVE",
|
||||
"ACTOR_STATE_DYING",
|
||||
"ACTOR_STATE_DEAD",
|
||||
"ACTOR_STATE_MOVING_LEFT",
|
||||
"ACTOR_STATE_MOVING_RIGHT",
|
||||
"ACTOR_STATE_MOVING_UP",
|
||||
"ACTOR_STATE_MOVING_DOWN",
|
||||
"ACTOR_STATE_UNDEFINED_11",
|
||||
"ACTOR_STATE_UNDEFINED_12",
|
||||
"ACTOR_STATE_UNDEFINED_13",
|
||||
"ACTOR_STATE_UNDEFINED_14",
|
||||
"ACTOR_STATE_UNDEFINED_15",
|
||||
"ACTOR_STATE_UNDEFINED_16",
|
||||
"ACTOR_STATE_UNDEFINED_17",
|
||||
"ACTOR_STATE_UNDEFINED_18",
|
||||
"ACTOR_STATE_UNDEFINED_19",
|
||||
"ACTOR_STATE_UNDEFINED_20",
|
||||
"ACTOR_STATE_UNDEFINED_21",
|
||||
"ACTOR_STATE_UNDEFINED_22",
|
||||
"ACTOR_STATE_UNDEFINED_23",
|
||||
"ACTOR_STATE_UNDEFINED_24",
|
||||
"ACTOR_STATE_UNDEFINED_25",
|
||||
"ACTOR_STATE_UNDEFINED_26",
|
||||
"ACTOR_STATE_UNDEFINED_27",
|
||||
"ACTOR_STATE_UNDEFINED_28",
|
||||
"ACTOR_STATE_UNDEFINED_29",
|
||||
"ACTOR_STATE_UNDEFINED_30",
|
||||
"ACTOR_STATE_UNDEFINED_31",
|
||||
char *AKGL_ACTOR_STATE_STRING_NAMES[32] = {
|
||||
"AKGL_ACTOR_STATE_FACE_DOWN",
|
||||
"AKGL_ACTOR_STATE_FACE_LEFT",
|
||||
"AKGL_ACTOR_STATE_FACE_RIGHT",
|
||||
"AKGL_ACTOR_STATE_FACE_UP",
|
||||
"AKGL_ACTOR_STATE_ALIVE",
|
||||
"AKGL_ACTOR_STATE_DYING",
|
||||
"AKGL_ACTOR_STATE_DEAD",
|
||||
"AKGL_ACTOR_STATE_MOVING_LEFT",
|
||||
"AKGL_ACTOR_STATE_MOVING_RIGHT",
|
||||
"AKGL_ACTOR_STATE_MOVING_UP",
|
||||
"AKGL_ACTOR_STATE_MOVING_DOWN",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_11",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_12",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_13",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_14",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_15",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_16",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_17",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_18",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_19",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_20",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_21",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_22",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_23",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_24",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_25",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_26",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_27",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_28",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_29",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_30",
|
||||
"AKGL_ACTOR_STATE_UNDEFINED_31",
|
||||
};
|
||||
|
||||
20
src/assets.c
20
src/assets.c
@@ -7,19 +7,19 @@
|
||||
#include <sdl3game/heap.h>
|
||||
#include <sdl3game/error.h>
|
||||
|
||||
akerr_ErrorContext *load_start_bgm(char *fname)
|
||||
akerr_ErrorContext *akgl_load_start_bgm(char *fname)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
//string *tmpstr = NULL;
|
||||
//akgl_String *tmpstr = NULL;
|
||||
MIX_Track *bgmtrack = NULL;
|
||||
SDL_PropertiesID bgmprops = 0;
|
||||
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_BREAK(errctx, fname, AKERR_NULLPOINTER, "load_start_bgm received NULL filename");
|
||||
//CATCH(errctx, heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
FAIL_ZERO_BREAK(errctx, fname, AKERR_NULLPOINTER, "akgl_load_start_bgm received NULL filename");
|
||||
//CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
|
||||
//SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname);
|
||||
//SDL_snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname);
|
||||
SDL_Log("Loading music asset from %s", fname);
|
||||
bgm = MIX_LoadAudio(game.mixer, fname, true);
|
||||
FAIL_ZERO_BREAK(errctx, bgm, AKERR_NULLPOINTER, "Failed to load music asset %s : %s", fname, SDL_GetError());
|
||||
@@ -27,22 +27,22 @@ akerr_ErrorContext *load_start_bgm(char *fname)
|
||||
bgmtrack = MIX_CreateTrack(game.mixer);
|
||||
FAIL_ZERO_BREAK(errctx, bgmtrack, AKERR_NULLPOINTER, "Failed to create audio track for background music: %s", SDL_GetError());
|
||||
|
||||
game.tracks[GAME_AUDIO_TRACK_BGM] = bgmtrack;
|
||||
game.tracks[AKGL_GAME_AUDIO_TRACK_BGM] = bgmtrack;
|
||||
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
MIX_SetTrackAudio(bgmtrack, bgm),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"%s",
|
||||
SDL_GetError());
|
||||
|
||||
SDL_SetNumberProperty(bgmprops, MIX_PROP_PLAY_LOOPS_NUMBER, -1);
|
||||
|
||||
if (!MIX_PlayTrack(bgmtrack, bgmprops)) {
|
||||
FAIL_BREAK(errctx, AKERR_SDL, "Failed to play music asset %s", fname);
|
||||
FAIL_BREAK(errctx, AKGL_ERR_SDL, "Failed to play music asset %s", fname);
|
||||
}
|
||||
} CLEANUP {
|
||||
//IGNORE(heap_release_string(tmpstr));
|
||||
//IGNORE(akgl_heap_release_string(tmpstr));
|
||||
if ( errctx != NULL ) {
|
||||
if ( errctx->status != 0 && bgm != NULL) {
|
||||
MIX_DestroyAudio(bgm);
|
||||
|
||||
110
src/character.c
110
src/character.c
@@ -13,29 +13,29 @@
|
||||
#include <sdl3game/iterator.h>
|
||||
#include <sdl3game/util.h>
|
||||
|
||||
akerr_ErrorContext *character_initialize(character *obj, char *name)
|
||||
akerr_ErrorContext *akgl_character_initialize(akgl_Character *obj, char *name)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL character reference");
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL akgl_Character reference");
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "NULL name string pointer");
|
||||
memset(obj, 0x00, sizeof(character));
|
||||
strncpy(obj->name, name, SPRITE_MAX_CHARACTER_NAME_LENGTH);
|
||||
memset(obj, 0x00, sizeof(akgl_Character));
|
||||
strncpy(obj->name, name, AKGL_SPRITE_MAX_CHARACTER_NAME_LENGTH);
|
||||
obj->state_sprites = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, obj->state_sprites, AKERR_NULLPOINTER, "Unable to initialize SDL_PropertiesID for character state map");
|
||||
|
||||
obj->sprite_add = &character_sprite_add;
|
||||
obj->sprite_get = &character_sprite_get;
|
||||
obj->sprite_add = &akgl_character_sprite_add;
|
||||
obj->sprite_get = &akgl_character_sprite_get;
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_SetPointerProperty(REGISTRY_CHARACTER, name, (void *)obj),
|
||||
SDL_SetPointerProperty(AKGL_REGISTRY_CHARACTER, name, (void *)obj),
|
||||
AKERR_KEY,
|
||||
"Unable to add character to registry");
|
||||
obj->refcount += 1;
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *character_sprite_add(character *basechar, sprite *ref, int state)
|
||||
akerr_ErrorContext *akgl_character_sprite_add(akgl_Character *basechar, akgl_Sprite *ref, int state)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
char stateval[32];
|
||||
@@ -49,16 +49,16 @@ akerr_ErrorContext *character_sprite_add(character *basechar, sprite *ref, int s
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *character_sprite_get(character *basechar, int state, sprite **dest)
|
||||
akerr_ErrorContext *akgl_character_sprite_get(akgl_Character *basechar, int state, akgl_Sprite **dest)
|
||||
{
|
||||
sprite *target = NULL;
|
||||
akgl_Sprite *target = NULL;
|
||||
PREPARE_ERROR(errctx);
|
||||
char stateval[32];
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL pointer to sprite pointer (**dest)");
|
||||
FAIL_ZERO_RETURN(errctx, basechar, AKERR_NULLPOINTER, "NULL character reference");
|
||||
memset(&stateval, 0x00, 32);
|
||||
SDL_itoa(state, (char *)&stateval, 10);
|
||||
*dest = (sprite *)SDL_GetPointerProperty(basechar->state_sprites, (char *)&stateval, NULL);
|
||||
*dest = (akgl_Sprite *)SDL_GetPointerProperty(basechar->state_sprites, (char *)&stateval, NULL);
|
||||
FAIL_ZERO_RETURN(errctx, *dest, AKERR_KEY, "Sprite for state %d (%b) not found in the character's registry", state, state);
|
||||
target = *dest;
|
||||
//SDL_Log("Sprite state %d (%s) has character %s", state, (char *)&stateval, target->name);
|
||||
@@ -67,79 +67,79 @@ akerr_ErrorContext *character_sprite_get(character *basechar, int state, sprite
|
||||
|
||||
// SDL iterator so we can't return error information here, void only
|
||||
// this means we don't have anywhere to send exceptions up to, so if we hit an error, we log and exit(1) here
|
||||
void character_state_sprites_iterate(void *userdata, SDL_PropertiesID registry, const char *name)
|
||||
void akgl_character_state_sprites_iterate(void *userdata, SDL_PropertiesID registry, const char *name)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
sprite *spriteptr;
|
||||
iterator *opflags = (iterator *)userdata;
|
||||
akgl_Sprite *spriteptr;
|
||||
akgl_Iterator *opflags = (akgl_Iterator *)userdata;
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_BREAK(errctx, opflags, AKERR_NULLPOINTER, "Character state sprite iterator received null iterator op pointer");
|
||||
FAIL_ZERO_BREAK(errctx, name, AKERR_NULLPOINTER, "Character state sprite iterator received null sprite name");
|
||||
spriteptr = (sprite *)SDL_GetPointerProperty(registry, name, NULL);
|
||||
spriteptr = (akgl_Sprite *)SDL_GetPointerProperty(registry, name, NULL);
|
||||
FAIL_ZERO_BREAK(errctx, spriteptr, AKERR_NULLPOINTER, "Character state sprite for %s not found", name);
|
||||
if ( BITMASK_HAS(opflags->flags, ITERATOR_OP_RELEASE) ) {
|
||||
CATCH(errctx, heap_release_sprite(spriteptr));
|
||||
if ( AKGL_BITMASK_HAS(opflags->flags, AKGL_ITERATOR_OP_RELEASE) ) {
|
||||
CATCH(errctx, akgl_heap_release_sprite(spriteptr));
|
||||
}
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH_NORETURN(errctx);
|
||||
}
|
||||
|
||||
static akerr_ErrorContext *character_load_json_state_int_from_strings(json_t *states, int *dest)
|
||||
static akerr_ErrorContext *akgl_character_load_json_state_int_from_strings(json_t *states, int *dest)
|
||||
{
|
||||
int i = 0;
|
||||
long newstate = 0;
|
||||
string *tmpstring = NULL;
|
||||
akgl_String *tmpstring = NULL;
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, states, AKERR_NULLPOINTER, "NULL states array");
|
||||
FAIL_ZERO_RETURN(errctx, states, AKERR_NULLPOINTER, "NULL destination integer");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_next_string(&tmpstring));
|
||||
CATCH(errctx, akgl_heap_next_string(&tmpstring));
|
||||
for ( i = 0; i < json_array_size((json_t *)states) ; i++ ) {
|
||||
CATCH(errctx, get_json_array_index_string(states, i, &tmpstring));
|
||||
newstate = (long)SDL_GetNumberProperty(REGISTRY_ACTOR_STATE_STRINGS, (char *)&tmpstring->data, 0);
|
||||
CATCH(errctx, akgl_get_json_array_index_string(states, i, &tmpstring));
|
||||
newstate = (long)SDL_GetNumberProperty(AKGL_AKGL_REGISTRY_ACTOR_STATE_STRINGS, (char *)&tmpstring->data, 0);
|
||||
FAIL_ZERO_BREAK(errctx, newstate, AKERR_KEY, "Unknown actor state %s", (char *)&tmpstring->data);
|
||||
*dest = (*dest | (int)(newstate));
|
||||
}
|
||||
} CLEANUP {
|
||||
IGNORE(heap_release_string(tmpstring));
|
||||
IGNORE(akgl_heap_release_string(tmpstring));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
static akerr_ErrorContext *character_load_json_inner(json_t *json, character *obj)
|
||||
static akerr_ErrorContext *akgl_character_load_json_inner(json_t *json, akgl_Character *obj)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *mappings = NULL;
|
||||
json_t *curmapping = NULL;
|
||||
json_t *statearray = NULL;
|
||||
sprite *spriteptr = NULL;
|
||||
akgl_Sprite *spriteptr = NULL;
|
||||
int i = 0;
|
||||
string *tmpstr = NULL;
|
||||
string *tmpstr2 = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
akgl_String *tmpstr2 = NULL;
|
||||
int stateval = 0;
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_string_value((json_t *)json, "name", &tmpstr));
|
||||
CATCH(errctx, character_initialize((character *)obj, tmpstr->data));
|
||||
CATCH(errctx, get_json_array_value((json_t *)json, "sprite_mappings", &mappings));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &tmpstr));
|
||||
CATCH(errctx, akgl_character_initialize((akgl_Character *)obj, tmpstr->data));
|
||||
CATCH(errctx, akgl_get_json_array_value((json_t *)json, "sprite_mappings", &mappings));
|
||||
for ( i = 0; i < json_array_size((json_t *)mappings) ; i++ ) {
|
||||
stateval = 0;
|
||||
CATCH(errctx, get_json_array_index_object((json_t *)mappings, i, &curmapping));
|
||||
CATCH(errctx, get_json_string_value((json_t *)curmapping, "sprite", &tmpstr));
|
||||
spriteptr = (sprite *)SDL_GetPointerProperty(
|
||||
REGISTRY_SPRITE,
|
||||
CATCH(errctx, akgl_get_json_array_index_object((json_t *)mappings, i, &curmapping));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)curmapping, "sprite", &tmpstr));
|
||||
spriteptr = (akgl_Sprite *)SDL_GetPointerProperty(
|
||||
AKGL_REGISTRY_SPRITE,
|
||||
tmpstr->data,
|
||||
NULL
|
||||
);
|
||||
CATCH(errctx, get_json_string_value((json_t *)json, "name", &tmpstr2));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &tmpstr2));
|
||||
|
||||
CATCH(errctx, get_json_array_value((json_t *)curmapping, "state", &statearray));
|
||||
CATCH(errctx, character_load_json_state_int_from_strings(statearray, &stateval));
|
||||
CATCH(errctx, akgl_get_json_array_value((json_t *)curmapping, "state", &statearray));
|
||||
CATCH(errctx, akgl_character_load_json_state_int_from_strings(statearray, &stateval));
|
||||
|
||||
CATCH(errctx, get_json_string_value((json_t *)curmapping, "sprite", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)curmapping, "sprite", &tmpstr));
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
spriteptr,
|
||||
@@ -149,34 +149,34 @@ static akerr_ErrorContext *character_load_json_inner(json_t *json, character *ob
|
||||
stateval,
|
||||
tmpstr->data
|
||||
);
|
||||
CATCH(errctx, character_sprite_add((character *)obj, (sprite *)spriteptr, stateval));
|
||||
CATCH(errctx, akgl_character_sprite_add((akgl_Character *)obj, (akgl_Sprite *)spriteptr, stateval));
|
||||
}
|
||||
} CLEANUP {
|
||||
if ( tmpstr != NULL ) {
|
||||
IGNORE(heap_release_string(tmpstr));
|
||||
IGNORE(akgl_heap_release_string(tmpstr));
|
||||
}
|
||||
if ( tmpstr2 != NULL ) {
|
||||
IGNORE(heap_release_string(tmpstr2));
|
||||
IGNORE(akgl_heap_release_string(tmpstr2));
|
||||
}
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *character_load_json(char *filename)
|
||||
akerr_ErrorContext *akgl_character_load_json(char *filename)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *json;
|
||||
json_error_t error;
|
||||
character *obj = NULL;
|
||||
//string *tmpstr = NULL;
|
||||
akgl_Character *obj = NULL;
|
||||
//akgl_String *tmpstr = NULL;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, filename, AKERR_NULLPOINTER, "Received null filename");
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_next_character(&obj));
|
||||
//CATCH(errctx, heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
//SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
CATCH(errctx, akgl_heap_next_character(&obj));
|
||||
//CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
//SDL_snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
json = (json_t *)json_load_file(filename, 0, &error);
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
@@ -184,16 +184,16 @@ akerr_ErrorContext *character_load_json(char *filename)
|
||||
AKERR_NULLPOINTER,
|
||||
"Error while loading character from %s on line %d: %s", filename, error.line, error.text
|
||||
);
|
||||
CATCH(errctx, character_load_json_inner(json, obj));
|
||||
CATCH(errctx, get_json_integer_value(json, "movementspeed", (int *)&obj->movementspeed));
|
||||
obj->movementspeed = obj->movementspeed * TIME_ONESEC_MS;
|
||||
CATCH(errctx, get_json_number_value(json, "velocity_x", &obj->vx));
|
||||
CATCH(errctx, get_json_number_value(json, "velocity_y", &obj->vy));
|
||||
CATCH(errctx, akgl_character_load_json_inner(json, obj));
|
||||
CATCH(errctx, akgl_get_json_integer_value(json, "movementspeed", (int *)&obj->movementspeed));
|
||||
obj->movementspeed = obj->movementspeed * AKGL_TIME_ONESEC_MS;
|
||||
CATCH(errctx, akgl_get_json_number_value(json, "velocity_x", &obj->vx));
|
||||
CATCH(errctx, akgl_get_json_number_value(json, "velocity_y", &obj->vy));
|
||||
} CLEANUP {
|
||||
//IGNORE(heap_release_string(tmpstr));
|
||||
//IGNORE(akgl_heap_release_string(tmpstr));
|
||||
if ( errctx != NULL ) {
|
||||
if ( errctx->status != 0 ) {
|
||||
IGNORE(heap_release_character(obj));
|
||||
IGNORE(akgl_heap_release_character(obj));
|
||||
}
|
||||
}
|
||||
} PROCESS(errctx) {
|
||||
|
||||
126
src/controller.c
126
src/controller.c
@@ -5,26 +5,26 @@
|
||||
#include <sdl3game/game.h>
|
||||
#include <sdl3game/controller.h>
|
||||
|
||||
SDL3GControlMap GAME_ControlMaps[MAX_CONTROL_MAPS];
|
||||
akgl_ControlMap GAME_ControlMaps[AKGL_MAX_CONTROL_MAPS];
|
||||
|
||||
akerr_ErrorContext *controller_handle_event(void *appstate, SDL_Event *event)
|
||||
akerr_ErrorContext *akgl_controller_handle_event(void *appstate, SDL_Event *event)
|
||||
{
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
int eventButtonComboMatch = 0;
|
||||
SDL3GControlMap *curmap = NULL;
|
||||
SDL3GControl *curcontrol = NULL;
|
||||
akgl_ControlMap *curmap = NULL;
|
||||
akgl_Control *curcontrol = NULL;
|
||||
PREPARE_ERROR(errctx);
|
||||
|
||||
ATTEMPT {
|
||||
for ( i = 0 ; i < MAX_CONTROL_MAPS; i++ ) {
|
||||
for ( i = 0 ; i < AKGL_MAX_CONTROL_MAPS; i++ ) {
|
||||
curmap = &GAME_ControlMaps[i];
|
||||
if ( curmap->target == NULL ) {
|
||||
continue;
|
||||
}
|
||||
//SDL_Log("Control map %d maps to actor %s", i, curmap->target->name);
|
||||
//SDL_Log("event from keyboard %d", event->key.which);
|
||||
for ( j = 0; j < MAX_CONTROLS; j++ ) {
|
||||
for ( j = 0; j < AKGL_MAX_CONTROLS; j++ ) {
|
||||
curcontrol = &curmap->controls[j];
|
||||
//SDL_Log("button/key is processed by controlmap %d control %d", i, j);
|
||||
//SDL_Log("event %d -> control on %d off %d", event->type, curcontrol->event_on, curcontrol->event_off);
|
||||
@@ -41,14 +41,14 @@ akerr_ErrorContext *controller_handle_event(void *appstate, SDL_Event *event)
|
||||
);
|
||||
if ( event->type == curcontrol->event_on && eventButtonComboMatch) {
|
||||
CATCH(errctx, curcontrol->handler_on(curmap->target, event));
|
||||
goto _controller_handle_event_success;
|
||||
goto _akgl_controller_handle_event_success;
|
||||
} else if ( event->type == curcontrol->event_off && eventButtonComboMatch ) {
|
||||
CATCH(errctx, curcontrol->handler_off(curmap->target, event));
|
||||
goto _controller_handle_event_success;
|
||||
goto _akgl_controller_handle_event_success;
|
||||
}
|
||||
}
|
||||
}
|
||||
_controller_handle_event_success:
|
||||
_akgl_controller_handle_event_success:
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
@@ -57,49 +57,49 @@ _controller_handle_event_success:
|
||||
|
||||
akerr_ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event)
|
||||
{
|
||||
actor *player = NULL;
|
||||
akgl_Actor *player = NULL;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate");
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL event");
|
||||
player = SDL_GetPointerProperty(REGISTRY_ACTOR, "player", NULL);
|
||||
player = SDL_GetPointerProperty(AKGL_REGISTRY_ACTOR, "player", NULL);
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "Player actor does not exist");
|
||||
|
||||
if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN ||
|
||||
event->key.key == SDLK_DOWN ) {
|
||||
SDL_Log("Processing dpad down : state %d", player->state);
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_MOVING_DOWN);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_DOWN);
|
||||
if ( !player->movement_controls_face ) {
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL);
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_FACE_DOWN);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_FACE_DOWN);
|
||||
}
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_UP ||
|
||||
event->key.key == SDLK_UP ) {
|
||||
SDL_Log("Processing dpad up");
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_MOVING_UP);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_UP);
|
||||
if ( !player->movement_controls_face ) {
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL);
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_FACE_UP);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_FACE_UP);
|
||||
}
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_LEFT ||
|
||||
event->key.key == SDLK_LEFT ) {
|
||||
SDL_Log("Processing dpad left");
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_MOVING_LEFT);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_LEFT);
|
||||
if ( !player->movement_controls_face ) {
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL);
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_FACE_LEFT);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_FACE_LEFT);
|
||||
}
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_RIGHT ||
|
||||
event->key.key == SDLK_RIGHT ) {
|
||||
SDL_Log("Processing dpad right");
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_MOVING_RIGHT);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_RIGHT);
|
||||
if ( !player->movement_controls_face ) {
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_FACE_ALL);
|
||||
BITMASK_ADD(player->state, ACTOR_STATE_FACE_RIGHT);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL);
|
||||
AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_FACE_RIGHT);
|
||||
}
|
||||
SDL_Log("New state : %d", player->state);
|
||||
}
|
||||
@@ -108,37 +108,37 @@ akerr_ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event)
|
||||
|
||||
akerr_ErrorContext *gamepad_handle_button_up(void *appstate, SDL_Event *event)
|
||||
{
|
||||
actor *player = NULL;
|
||||
akgl_Actor *player = NULL;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate");
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL event");
|
||||
player = SDL_GetPointerProperty(REGISTRY_ACTOR, "player", NULL);
|
||||
player = SDL_GetPointerProperty(AKGL_REGISTRY_ACTOR, "player", NULL);
|
||||
FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "Player actor does not exist");
|
||||
|
||||
if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN ||
|
||||
event->key.key == SDLK_DOWN ) {
|
||||
SDL_Log("processing down release");
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_MOVING_DOWN);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_MOVING_DOWN);
|
||||
player->curSpriteFrameId = 0;
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_UP ||
|
||||
event->key.key == SDLK_UP ) {
|
||||
SDL_Log("processing up release");
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_MOVING_UP);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_MOVING_UP);
|
||||
player->curSpriteFrameId = 0;
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_RIGHT ||
|
||||
event->key.key == SDLK_RIGHT) {
|
||||
SDL_Log("processing right release");
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_MOVING_RIGHT);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_MOVING_RIGHT);
|
||||
player->curSpriteFrameId = 0;
|
||||
SDL_Log("New state : %d", player->state);
|
||||
} else if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_LEFT ||
|
||||
event->key.key == SDLK_LEFT ) {
|
||||
SDL_Log("processing left release");
|
||||
BITMASK_DEL(player->state, ACTOR_STATE_MOVING_LEFT);
|
||||
AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_MOVING_LEFT);
|
||||
player->curSpriteFrameId = 0;
|
||||
SDL_Log("New state : %d", player->state);
|
||||
}
|
||||
@@ -194,16 +194,16 @@ akerr_ErrorContext *gamepad_handle_removed(void *appstate, SDL_Event *event)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3G_controller_pushmap(int controlmapid, SDL3GControl *control)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_pushmap(int controlmapid, akgl_Control *control)
|
||||
{
|
||||
int newmapid = 0;
|
||||
PREPARE_ERROR(errctx);
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_RETURN(errctx, control, AKERR_NULLPOINTER, "NULL Control");
|
||||
FAIL_NONZERO_RETURN(errctx, (controlmapid >= MAX_CONTROL_MAPS), AKERR_OUTOFBOUNDS, "ID %d exceeds maximum %d", controlmapid, MAX_CONTROL_MAPS);
|
||||
FAIL_NONZERO_RETURN(errctx, (controlmapid >= AKGL_MAX_CONTROL_MAPS), AKERR_OUTOFBOUNDS, "ID %d exceeds maximum %d", controlmapid, AKGL_MAX_CONTROL_MAPS);
|
||||
newmapid = GAME_ControlMaps[controlmapid].nextMap;
|
||||
FAIL_ZERO_RETURN(errctx, (MAX_CONTROLS - newmapid), AKERR_OUTOFBOUNDS, "Control map ID %d is full", controlmapid);
|
||||
memcpy((void *)&GAME_ControlMaps[controlmapid].controls[newmapid], control, sizeof(SDL3GControl));
|
||||
FAIL_ZERO_RETURN(errctx, (AKGL_MAX_CONTROLS - newmapid), AKERR_OUTOFBOUNDS, "Control map ID %d is full", controlmapid);
|
||||
memcpy((void *)&GAME_ControlMaps[controlmapid].controls[newmapid], control, sizeof(akgl_Control));
|
||||
GAME_ControlMaps[controlmapid].nextMap = newmapid + 1;
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
@@ -211,21 +211,21 @@ akerr_ErrorContext AKERR_NOIGNORE *SDL3G_controller_pushmap(int controlmapid, SD
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *SDL3G_controller_default(int controlmapid, char *actorname, int kbid, int jsid)
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, char *actorname, int kbid, int jsid)
|
||||
{
|
||||
SDL3GControlMap *controlmap;
|
||||
SDL3GControl control;
|
||||
akgl_ControlMap *controlmap;
|
||||
akgl_Control control;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
ATTEMPT {
|
||||
// set up the control map
|
||||
FAIL_NONZERO_RETURN(errctx, (controlmapid >= MAX_CONTROL_MAPS), AKERR_OUTOFBOUNDS, "ID %d exceeds maximum %d", controlmapid, MAX_CONTROL_MAPS);
|
||||
memset((void *)&control, 0x00, sizeof(SDL3GControl));
|
||||
FAIL_NONZERO_RETURN(errctx, (controlmapid >= AKGL_MAX_CONTROL_MAPS), AKERR_OUTOFBOUNDS, "ID %d exceeds maximum %d", controlmapid, AKGL_MAX_CONTROL_MAPS);
|
||||
memset((void *)&control, 0x00, sizeof(akgl_Control));
|
||||
controlmap = &GAME_ControlMaps[controlmapid];
|
||||
controlmap->kbid = kbid;
|
||||
controlmap->jsid = jsid;
|
||||
|
||||
controlmap->target = SDL_GetPointerProperty(REGISTRY_ACTOR, actorname, NULL);
|
||||
controlmap->target = SDL_GetPointerProperty(AKGL_REGISTRY_ACTOR, actorname, NULL);
|
||||
FAIL_ZERO_BREAK(errctx, controlmap->target, AKERR_REGISTRY, "Actor %s not found in registry", actorname);
|
||||
|
||||
// ---- KEYBOARD CONTROLS ----
|
||||
@@ -234,33 +234,33 @@ akerr_ErrorContext AKERR_NOIGNORE *SDL3G_controller_default(int controlmapid, ch
|
||||
control.key = SDLK_DOWN;
|
||||
control.event_on = SDL_EVENT_KEY_DOWN;
|
||||
control.event_off = SDL_EVENT_KEY_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_down_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_down_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_down_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_down_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move up
|
||||
control.key = SDLK_UP;
|
||||
control.event_on = SDL_EVENT_KEY_DOWN;
|
||||
control.event_off = SDL_EVENT_KEY_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_up_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_up_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_up_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_up_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move left
|
||||
control.key = SDLK_LEFT;
|
||||
control.event_on = SDL_EVENT_KEY_DOWN;
|
||||
control.event_off = SDL_EVENT_KEY_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_left_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_left_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_left_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_left_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move right
|
||||
control.key = SDLK_RIGHT;
|
||||
control.event_on = SDL_EVENT_KEY_DOWN;
|
||||
control.event_off = SDL_EVENT_KEY_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_right_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_right_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_right_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_right_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
control.key = 0;
|
||||
// ----- GAMEPAD CONTROLS
|
||||
@@ -268,33 +268,33 @@ akerr_ErrorContext AKERR_NOIGNORE *SDL3G_controller_default(int controlmapid, ch
|
||||
control.button = SDL_GAMEPAD_BUTTON_DPAD_DOWN;
|
||||
control.event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
|
||||
control.event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_down_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_down_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_down_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_down_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move up
|
||||
control.button = SDL_GAMEPAD_BUTTON_DPAD_UP;
|
||||
control.event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
|
||||
control.event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_up_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_up_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_up_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_up_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move left
|
||||
control.button = SDL_GAMEPAD_BUTTON_DPAD_LEFT;
|
||||
control.event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
|
||||
control.event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_left_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_left_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_left_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_left_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
// Move right
|
||||
control.button = SDL_GAMEPAD_BUTTON_DPAD_RIGHT;
|
||||
control.event_on = SDL_EVENT_GAMEPAD_BUTTON_DOWN;
|
||||
control.event_off = SDL_EVENT_GAMEPAD_BUTTON_UP;
|
||||
control.handler_on = &SDL3GActor_cmhf_right_on;
|
||||
control.handler_off = &SDL3GActor_cmhf_right_off;
|
||||
CATCH(errctx, SDL3G_controller_pushmap(controlmapid, &control));
|
||||
control.handler_on = &akgl_Actor_cmhf_right_on;
|
||||
control.handler_off = &akgl_Actor_cmhf_right_off;
|
||||
CATCH(errctx, akgl_controller_pushmap(controlmapid, &control));
|
||||
|
||||
SUCCEED_RETURN(errctx);
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <sdl3game/game.h>
|
||||
|
||||
/* Draw a Gimpish background pattern to show transparency in the image */
|
||||
void GAME_draw_background(int w, int h)
|
||||
void akgl_draw_background(int w, int h)
|
||||
{
|
||||
SDL_Color col[2] = {
|
||||
{ 0x66, 0x66, 0x66, 0xff },
|
||||
|
||||
52
src/game.c
52
src/game.c
@@ -17,18 +17,18 @@
|
||||
|
||||
SDL_Window *window = NULL;
|
||||
SDL_Renderer *renderer = NULL;
|
||||
GAME_frame ball;
|
||||
GAME_frame paddle1;
|
||||
GAME_frame paddle2;
|
||||
GAME_frame table;
|
||||
tilemap gamemap;
|
||||
akgl_Frame ball;
|
||||
akgl_Frame paddle1;
|
||||
akgl_Frame paddle2;
|
||||
akgl_Frame table;
|
||||
akgl_Tilemap gamemap;
|
||||
MIX_Audio *bgm = NULL;
|
||||
MIX_Mixer *GAME_mixer = NULL;
|
||||
MIX_Track *GAME_tracks[64];
|
||||
SDL_FRect camera;
|
||||
Game game;
|
||||
akgl_Game game;
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *GAME_init()
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init()
|
||||
{
|
||||
int i = 0;
|
||||
PREPARE_ERROR(errctx);
|
||||
@@ -39,64 +39,64 @@ akerr_ErrorContext AKERR_NOIGNORE *GAME_init()
|
||||
FAIL_ZERO_BREAK(errctx, strlen((char *)&game.name), AKERR_NULLPOINTER, "Must provide game name");
|
||||
FAIL_ZERO_BREAK(errctx, strlen((char *)&game.version), AKERR_NULLPOINTER, "Must provide game version");
|
||||
FAIL_ZERO_BREAK(errctx, strlen((char *)&game.uri), AKERR_NULLPOINTER, "Must provide game uri");
|
||||
CATCH(errctx, heap_init());
|
||||
CATCH(errctx, registry_init_actor());
|
||||
CATCH(errctx, registry_init_sprite());
|
||||
CATCH(errctx, registry_init_spritesheet());
|
||||
CATCH(errctx, registry_init_character());
|
||||
CATCH(errctx, registry_init_font());
|
||||
CATCH(errctx, registry_init_music());
|
||||
CATCH(errctx, registry_init_actor_state_strings());
|
||||
CATCH(errctx, akgl_heap_init());
|
||||
CATCH(errctx, akgl_registry_init_actor());
|
||||
CATCH(errctx, akgl_registry_init_sprite());
|
||||
CATCH(errctx, akgl_registry_init_spritesheet());
|
||||
CATCH(errctx, akgl_registry_init_character());
|
||||
CATCH(errctx, akgl_registry_init_font());
|
||||
CATCH(errctx, akgl_registry_init_music());
|
||||
CATCH(errctx, akgl_registry_init_actor_state_strings());
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true)
|
||||
|
||||
SDL_SetAppMetadata(game.name, game.version, game.uri);
|
||||
|
||||
for ( i = 0 ; i < MAX_CONTROL_MAPS; i++ ) {
|
||||
memset(&GAME_ControlMaps[i], 0x00, sizeof(SDL3GControlMap));
|
||||
for ( i = 0 ; i < AKGL_MAX_CONTROL_MAPS; i++ ) {
|
||||
memset(&GAME_ControlMaps[i], 0x00, sizeof(akgl_ControlMap));
|
||||
}
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD | SDL_INIT_AUDIO),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Couldn't initialize SDL: %s",
|
||||
SDL_GetError());
|
||||
|
||||
// Load the Game Controller DB
|
||||
|
||||
for ( i = 0; i < SDL_GAMECONTROLLER_DB_LEN ; i++ ) {
|
||||
for ( i = 0; i < AKGL_SDL_GAMECONTROLLER_DB_LEN ; i++ ) {
|
||||
if ( SDL_AddGamepadMapping(SDL_GAMECONTROLLER_DB[i]) == -1 ) {
|
||||
FAIL_ZERO_RETURN(errctx, 0, AKERR_SDL, "%s", SDL_GetError());
|
||||
FAIL_ZERO_RETURN(errctx, 0, AKGL_ERR_SDL, "%s", SDL_GetError());
|
||||
}
|
||||
}
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_CreateWindowAndRenderer(game.uri, game.screenwidth, game.screenheight, 0, &window, &renderer),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Couldn't create window/renderer: %s",
|
||||
SDL_GetError());
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
MIX_Init(),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Couldn't initialize audio: %s",
|
||||
SDL_GetError());
|
||||
game.mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, 0);
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
game.mixer,
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Unable to create mixer device: %s",
|
||||
SDL_GetError());
|
||||
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
TTF_Init(),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Couldn't initialize front engine: %s",
|
||||
SDL_GetError());
|
||||
|
||||
@@ -106,11 +106,11 @@ akerr_ErrorContext AKERR_NOIGNORE *GAME_init()
|
||||
camera.h = game.screenheight;
|
||||
}
|
||||
|
||||
void GAME_updateFPS()
|
||||
void akgl_game_updateFPS()
|
||||
{
|
||||
SDL_Time curTime;
|
||||
curTime = SDL_GetTicksNS();
|
||||
if ( (curTime - game.lastFPSTime) > TIME_ONESEC_NS ) {
|
||||
if ( (curTime - game.lastFPSTime) > AKGL_TIME_ONESEC_NS ) {
|
||||
game.fps = game.framesSinceUpdate;
|
||||
game.framesSinceUpdate = 0;
|
||||
game.lastFPSTime = curTime;
|
||||
|
||||
92
src/heap.c
92
src/heap.c
@@ -9,39 +9,39 @@
|
||||
#include <sdl3game/iterator.h>
|
||||
#include <sdl3game/error.h>
|
||||
|
||||
actor HEAP_ACTOR[MAX_HEAP_ACTOR];
|
||||
sprite HEAP_SPRITE[MAX_HEAP_SPRITE];
|
||||
spritesheet HEAP_SPRITESHEET[MAX_HEAP_SPRITESHEET];
|
||||
character HEAP_CHARACTER[MAX_HEAP_CHARACTER];
|
||||
string HEAP_STRING[MAX_HEAP_STRING];
|
||||
akgl_Actor HEAP_ACTOR[AKGL_MAX_HEAP_ACTOR];
|
||||
akgl_Sprite HEAP_SPRITE[AKGL_MAX_HEAP_SPRITE];
|
||||
akgl_SpriteSheet HEAP_SPRITESHEET[AKGL_MAX_HEAP_SPRITESHEET];
|
||||
akgl_Character HEAP_CHARACTER[AKGL_MAX_HEAP_CHARACTER];
|
||||
akgl_String HEAP_STRING[AKGL_MAX_HEAP_STRING];
|
||||
|
||||
akerr_ErrorContext *heap_init()
|
||||
akerr_ErrorContext *akgl_heap_init()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
int i = 0;
|
||||
akerr_name_for_status(AKERR_SDL, "SDL Error");
|
||||
for ( i = 0; i < MAX_HEAP_ACTOR; i++) {
|
||||
memset(&HEAP_ACTOR[i], 0x00, sizeof(actor));
|
||||
akerr_name_for_status(AKGL_ERR_SDL, "SDL Error");
|
||||
for ( i = 0; i < AKGL_MAX_HEAP_ACTOR; i++) {
|
||||
memset(&HEAP_ACTOR[i], 0x00, sizeof(akgl_Actor));
|
||||
}
|
||||
for ( i = 0; i < MAX_HEAP_SPRITE; i++) {
|
||||
memset(&HEAP_SPRITE[i], 0x00, sizeof(sprite));
|
||||
for ( i = 0; i < AKGL_MAX_HEAP_SPRITE; i++) {
|
||||
memset(&HEAP_SPRITE[i], 0x00, sizeof(akgl_Sprite));
|
||||
}
|
||||
for ( i = 0; i < MAX_HEAP_SPRITESHEET; i++) {
|
||||
memset(&HEAP_SPRITESHEET[i], 0x00, sizeof(spritesheet));
|
||||
for ( i = 0; i < AKGL_MAX_HEAP_SPRITESHEET; i++) {
|
||||
memset(&HEAP_SPRITESHEET[i], 0x00, sizeof(akgl_SpriteSheet));
|
||||
}
|
||||
for ( i = 0; i < MAX_HEAP_CHARACTER; i++) {
|
||||
memset(&HEAP_CHARACTER[i], 0x00, sizeof(character));
|
||||
for ( i = 0; i < AKGL_MAX_HEAP_CHARACTER; i++) {
|
||||
memset(&HEAP_CHARACTER[i], 0x00, sizeof(akgl_Character));
|
||||
}
|
||||
for ( i = 0; i < MAX_HEAP_STRING; i++) {
|
||||
memset(&HEAP_STRING[i], 0x00, sizeof(string));
|
||||
for ( i = 0; i < AKGL_MAX_HEAP_STRING; i++) {
|
||||
memset(&HEAP_STRING[i], 0x00, sizeof(akgl_String));
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_next_actor(actor **dest)
|
||||
akerr_ErrorContext *akgl_heap_next_actor(akgl_Actor **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
for (int i = 0; i < MAX_HEAP_ACTOR; i++ ) {
|
||||
for (int i = 0; i < AKGL_MAX_HEAP_ACTOR; i++ ) {
|
||||
if ( HEAP_ACTOR[i].refcount != 0 ) {
|
||||
continue;
|
||||
}
|
||||
@@ -51,10 +51,10 @@ akerr_ErrorContext *heap_next_actor(actor **dest)
|
||||
FAIL_RETURN(errctx, AKERR_HEAP, "Unable to find unused actor on the heap");
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_next_sprite(sprite **dest)
|
||||
akerr_ErrorContext *akgl_heap_next_sprite(akgl_Sprite **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
for (int i = 0; i < MAX_HEAP_SPRITE; i++ ) {
|
||||
for (int i = 0; i < AKGL_MAX_HEAP_SPRITE; i++ ) {
|
||||
if ( HEAP_SPRITE[i].refcount != 0 ) {
|
||||
continue;
|
||||
}
|
||||
@@ -64,10 +64,10 @@ akerr_ErrorContext *heap_next_sprite(sprite **dest)
|
||||
FAIL_RETURN(errctx, AKERR_HEAP, "Unable to find unused sprite on the heap");
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_next_spritesheet(spritesheet **dest)
|
||||
akerr_ErrorContext *akgl_heap_next_spritesheet(akgl_SpriteSheet **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
for (int i = 0; i < MAX_HEAP_SPRITESHEET; i++ ) {
|
||||
for (int i = 0; i < AKGL_MAX_HEAP_SPRITESHEET; i++ ) {
|
||||
if ( HEAP_SPRITESHEET[i].refcount != 0 ) {
|
||||
continue;
|
||||
}
|
||||
@@ -77,10 +77,10 @@ akerr_ErrorContext *heap_next_spritesheet(spritesheet **dest)
|
||||
FAIL_RETURN(errctx, AKERR_HEAP, "Unable to find unused spritesheet on the heap");
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_next_character(character **dest)
|
||||
akerr_ErrorContext *akgl_heap_next_character(akgl_Character **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
for (int i = 0; i < MAX_HEAP_CHARACTER; i++ ) {
|
||||
for (int i = 0; i < AKGL_MAX_HEAP_CHARACTER; i++ ) {
|
||||
if ( HEAP_CHARACTER[i].refcount != 0 ) {
|
||||
continue;
|
||||
}
|
||||
@@ -90,10 +90,10 @@ akerr_ErrorContext *heap_next_character(character **dest)
|
||||
FAIL_RETURN(errctx, AKERR_HEAP, "Unable to find unused character on the heap");
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_next_string(string **dest)
|
||||
akerr_ErrorContext *akgl_heap_next_string(akgl_String **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
for (int i = 0; i < MAX_HEAP_STRING; i++ ) {
|
||||
for (int i = 0; i < AKGL_MAX_HEAP_STRING; i++ ) {
|
||||
if ( HEAP_STRING[i].refcount != 0 ) {
|
||||
continue;
|
||||
}
|
||||
@@ -103,7 +103,7 @@ akerr_ErrorContext *heap_next_string(string **dest)
|
||||
FAIL_RETURN(errctx, AKERR_HEAP, "Unable to find unused string on the heap");
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_release_actor(actor *ptr)
|
||||
akerr_ErrorContext *akgl_heap_release_actor(akgl_Actor *ptr)
|
||||
{
|
||||
int i = 0;
|
||||
PREPARE_ERROR(errctx);
|
||||
@@ -112,39 +112,39 @@ akerr_ErrorContext *heap_release_actor(actor *ptr)
|
||||
ptr->refcount -= 1;
|
||||
}
|
||||
if ( ptr->refcount == 0 ) {
|
||||
for ( i = 0; i < ACTOR_MAX_CHILDREN; i++ ) {
|
||||
for ( i = 0; i < AKGL_ACTOR_MAX_CHILDREN; i++ ) {
|
||||
if ( ptr->children[i] != NULL ) {
|
||||
CATCH_AND_RETURN(errctx, heap_release_actor(ptr->children[i]));
|
||||
CATCH_AND_RETURN(errctx, akgl_heap_release_actor(ptr->children[i]));
|
||||
}
|
||||
}
|
||||
if ( ptr->basechar != NULL ) {
|
||||
CATCH_AND_RETURN(errctx, heap_release_character(ptr->basechar));
|
||||
CATCH_AND_RETURN(errctx, akgl_heap_release_character(ptr->basechar));
|
||||
}
|
||||
memset(ptr, 0x00, sizeof(actor));
|
||||
SDL_ClearProperty(REGISTRY_ACTOR, (char *)&ptr->name);
|
||||
memset(ptr, 0x00, sizeof(akgl_Actor));
|
||||
SDL_ClearProperty(AKGL_REGISTRY_ACTOR, (char *)&ptr->name);
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_release_character(character *basechar)
|
||||
akerr_ErrorContext *akgl_heap_release_character(akgl_Character *basechar)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
iterator opflags;
|
||||
akgl_Iterator opflags;
|
||||
FAIL_ZERO_RETURN(errctx, basechar, AKERR_NULLPOINTER, "NULL character reference");
|
||||
BITMASK_CLEAR(opflags.flags);
|
||||
BITMASK_ADD(opflags.flags, ITERATOR_OP_RELEASE);
|
||||
AKGL_BITMASK_CLEAR(opflags.flags);
|
||||
AKGL_BITMASK_ADD(opflags.flags, AKGL_ITERATOR_OP_RELEASE);
|
||||
|
||||
if ( basechar->refcount > 0 ) {
|
||||
basechar->refcount -= 1;
|
||||
}
|
||||
if ( basechar->refcount == 0 ) {
|
||||
SDL_EnumerateProperties(basechar->state_sprites, &character_state_sprites_iterate, (void *)&opflags);
|
||||
SDL_ClearProperty(REGISTRY_CHARACTER, (char *)&basechar->name);
|
||||
SDL_EnumerateProperties(basechar->state_sprites, &akgl_character_state_sprites_iterate, (void *)&opflags);
|
||||
SDL_ClearProperty(AKGL_REGISTRY_CHARACTER, (char *)&basechar->name);
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_release_sprite(sprite *ptr)
|
||||
akerr_ErrorContext *akgl_heap_release_sprite(akgl_Sprite *ptr)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, ptr, AKERR_NULLPOINTER, "Received NULL sprite reference");
|
||||
@@ -153,16 +153,16 @@ akerr_ErrorContext *heap_release_sprite(sprite *ptr)
|
||||
}
|
||||
if ( ptr->refcount == 0 ) {
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_release_spritesheet(ptr->sheet));
|
||||
CATCH(errctx, akgl_heap_release_spritesheet(ptr->sheet));
|
||||
} CLEANUP {
|
||||
SDL_ClearProperty(REGISTRY_SPRITE, (char *)&ptr->name);
|
||||
SDL_ClearProperty(AKGL_REGISTRY_SPRITE, (char *)&ptr->name);
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_release_spritesheet(spritesheet *ptr)
|
||||
akerr_ErrorContext *akgl_heap_release_spritesheet(akgl_SpriteSheet *ptr)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, ptr, AKERR_NULLPOINTER, "Received NULL spritesheet reference");
|
||||
@@ -171,7 +171,7 @@ akerr_ErrorContext *heap_release_spritesheet(spritesheet *ptr)
|
||||
}
|
||||
if ( ptr->refcount == 0 ) {
|
||||
// TODO : If we go threaded, make sure this is only happening on the main thread
|
||||
SDL_ClearProperty(REGISTRY_SPRITESHEET, (char *)&ptr->name);
|
||||
SDL_ClearProperty(AKGL_AKGL_REGISTRY_SPRITESHEET, (char *)&ptr->name);
|
||||
if ( ptr-> texture != NULL )
|
||||
SDL_DestroyTexture(ptr->texture);
|
||||
ptr->texture = NULL;
|
||||
@@ -179,7 +179,7 @@ akerr_ErrorContext *heap_release_spritesheet(spritesheet *ptr)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *heap_release_string(string *ptr)
|
||||
akerr_ErrorContext *akgl_heap_release_string(akgl_String *ptr)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, ptr, AKERR_NULLPOINTER, "Received NULL string reference");
|
||||
@@ -187,7 +187,7 @@ akerr_ErrorContext *heap_release_string(string *ptr)
|
||||
ptr->refcount -= 1;
|
||||
}
|
||||
if ( ptr->refcount == 0 ) {
|
||||
memset(&ptr->data, 0x00, MAX_STRING_LENGTH);
|
||||
memset(&ptr->data, 0x00, AKGL_MAX_STRING_LENGTH);
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <sdl3game/staticstring.h>
|
||||
#include <sdl3game/registry.h>
|
||||
|
||||
akerr_ErrorContext *get_json_object_value(json_t *obj, char *key, json_t **dest)
|
||||
akerr_ErrorContext *akgl_get_json_object_value(json_t *obj, char *key, json_t **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer");
|
||||
@@ -19,7 +19,7 @@ akerr_ErrorContext *get_json_object_value(json_t *obj, char *key, json_t **dest)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_boolean_value(json_t *obj, char *key, bool *dest)
|
||||
akerr_ErrorContext *akgl_get_json_boolean_value(json_t *obj, char *key, bool *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer");
|
||||
@@ -30,7 +30,7 @@ akerr_ErrorContext *get_json_boolean_value(json_t *obj, char *key, bool *dest)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_integer_value(json_t *obj, char *key, int *dest)
|
||||
akerr_ErrorContext *akgl_get_json_integer_value(json_t *obj, char *key, int *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer");
|
||||
@@ -41,7 +41,7 @@ akerr_ErrorContext *get_json_integer_value(json_t *obj, char *key, int *dest)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_number_value(json_t *obj, char *key, float *dest)
|
||||
akerr_ErrorContext *akgl_get_json_number_value(json_t *obj, char *key, float *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference");
|
||||
@@ -52,7 +52,7 @@ akerr_ErrorContext *get_json_number_value(json_t *obj, char *key, float *dest)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_string_value(json_t *obj, char *key, string **dest)
|
||||
akerr_ErrorContext *akgl_get_json_string_value(json_t *obj, char *key, akgl_String **dest)
|
||||
{
|
||||
json_t *value = NULL;
|
||||
PREPARE_ERROR(errctx);
|
||||
@@ -65,18 +65,18 @@ akerr_ErrorContext *get_json_string_value(json_t *obj, char *key, string **dest)
|
||||
FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Key %s in object has incorrect type", key);
|
||||
ATTEMPT {
|
||||
if ( *dest == NULL ) {
|
||||
CATCH(errctx, heap_next_string(dest));
|
||||
CATCH(errctx, string_initialize(*dest, NULL));
|
||||
CATCH(errctx, akgl_heap_next_string(dest));
|
||||
CATCH(errctx, akgl_string_initialize(*dest, NULL));
|
||||
}
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, false);
|
||||
|
||||
strncpy((char *)&(*dest)->data, json_string_value(value), MAX_STRING_LENGTH);
|
||||
strncpy((char *)&(*dest)->data, json_string_value(value), AKGL_MAX_STRING_LENGTH);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_array_value(json_t *obj, char *key, json_t **dest)
|
||||
akerr_ErrorContext *akgl_get_json_array_value(json_t *obj, char *key, json_t **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference");
|
||||
@@ -87,7 +87,7 @@ akerr_ErrorContext *get_json_array_value(json_t *obj, char *key, json_t **dest)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_array_index_object(json_t *array, int index, json_t **dest)
|
||||
akerr_ErrorContext *akgl_get_json_array_index_object(json_t *array, int index, json_t **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference");
|
||||
@@ -98,7 +98,7 @@ akerr_ErrorContext *get_json_array_index_object(json_t *array, int index, json_t
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_array_index_integer(json_t *array, int index, int *dest)
|
||||
akerr_ErrorContext *akgl_get_json_array_index_integer(json_t *array, int index, int *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference");
|
||||
@@ -109,7 +109,7 @@ akerr_ErrorContext *get_json_array_index_integer(json_t *array, int index, int *
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_array_index_string(json_t *array, int index, string **dest)
|
||||
akerr_ErrorContext *akgl_get_json_array_index_string(json_t *array, int index, akgl_String **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference");
|
||||
@@ -119,13 +119,13 @@ akerr_ErrorContext *get_json_array_index_string(json_t *array, int index, string
|
||||
FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Index %d in object has incorrect type", index);
|
||||
ATTEMPT {
|
||||
if ( *dest == NULL ) {
|
||||
CATCH(errctx, heap_next_string(dest));
|
||||
CATCH(errctx, string_initialize(*dest, NULL));
|
||||
CATCH(errctx, akgl_heap_next_string(dest));
|
||||
CATCH(errctx, akgl_string_initialize(*dest, NULL));
|
||||
}
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, false);
|
||||
|
||||
strncpy((char *)&(*dest)->data, json_string_value(value), MAX_STRING_LENGTH);
|
||||
strncpy((char *)&(*dest)->data, json_string_value(value), AKGL_MAX_STRING_LENGTH);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
@@ -6,92 +6,92 @@
|
||||
#include <sdl3game/iterator.h>
|
||||
#include <sdl3game/actor.h>
|
||||
|
||||
SDL_PropertiesID REGISTRY_ACTOR;
|
||||
SDL_PropertiesID REGISTRY_ACTOR_STATE_STRINGS;
|
||||
SDL_PropertiesID REGISTRY_SPRITE;
|
||||
SDL_PropertiesID REGISTRY_SPRITESHEET;
|
||||
SDL_PropertiesID REGISTRY_CHARACTER;
|
||||
SDL_PropertiesID REGISTRY_MUSIC;
|
||||
SDL_PropertiesID REGISTRY_FONT;
|
||||
SDL_PropertiesID AKGL_REGISTRY_ACTOR;
|
||||
SDL_PropertiesID AKGL_AKGL_REGISTRY_ACTOR_STATE_STRINGS;
|
||||
SDL_PropertiesID AKGL_REGISTRY_SPRITE;
|
||||
SDL_PropertiesID AKGL_AKGL_REGISTRY_SPRITESHEET;
|
||||
SDL_PropertiesID AKGL_REGISTRY_CHARACTER;
|
||||
SDL_PropertiesID AKGL_REGISTRY_MUSIC;
|
||||
SDL_PropertiesID AKGL_REGISTRY_FONT;
|
||||
|
||||
akerr_ErrorContext *registry_init()
|
||||
akerr_ErrorContext *akgl_registry_init()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
ATTEMPT {
|
||||
CATCH(errctx, registry_init_spritesheet());
|
||||
CATCH(errctx, registry_init_sprite());
|
||||
CATCH(errctx, registry_init_character());
|
||||
CATCH(errctx, registry_init_actor());
|
||||
CATCH(errctx, registry_init_actor_state_strings());
|
||||
CATCH(errctx, registry_init_font());
|
||||
CATCH(errctx, registry_init_music());
|
||||
CATCH(errctx, akgl_registry_init_spritesheet());
|
||||
CATCH(errctx, akgl_registry_init_sprite());
|
||||
CATCH(errctx, akgl_registry_init_character());
|
||||
CATCH(errctx, akgl_registry_init_actor());
|
||||
CATCH(errctx, akgl_registry_init_actor_state_strings());
|
||||
CATCH(errctx, akgl_registry_init_font());
|
||||
CATCH(errctx, akgl_registry_init_music());
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_actor()
|
||||
akerr_ErrorContext *akgl_registry_init_actor()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_ACTOR = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_ACTOR, AKERR_NULLPOINTER, "Error initializing actor registry");
|
||||
AKGL_REGISTRY_ACTOR = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_ACTOR, AKERR_NULLPOINTER, "Error initializing actor registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *registry_init_font()
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_registry_init_font()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_FONT = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_FONT, AKERR_NULLPOINTER, "Error initializing font registry");
|
||||
AKGL_REGISTRY_FONT = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_FONT, AKERR_NULLPOINTER, "Error initializing font registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_music()
|
||||
akerr_ErrorContext *akgl_registry_init_music()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_MUSIC = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_MUSIC, AKERR_NULLPOINTER, "Error initializing music registry");
|
||||
AKGL_REGISTRY_MUSIC = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_MUSIC, AKERR_NULLPOINTER, "Error initializing music registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_actor_state_strings()
|
||||
akerr_ErrorContext *akgl_registry_init_actor_state_strings()
|
||||
{
|
||||
int i = 0;
|
||||
int flag = 0;
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_ACTOR_STATE_STRINGS = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_ACTOR_STATE_STRINGS, AKERR_NULLPOINTER, "Error initializing actor state strings registry");
|
||||
for ( i = 0 ; i < ACTOR_MAX_STATES; i++ ) {
|
||||
AKGL_AKGL_REGISTRY_ACTOR_STATE_STRINGS = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_AKGL_REGISTRY_ACTOR_STATE_STRINGS, AKERR_NULLPOINTER, "Error initializing actor state strings registry");
|
||||
for ( i = 0 ; i < AKGL_ACTOR_MAX_STATES; i++ ) {
|
||||
flag = (1 << i);
|
||||
SDL_SetNumberProperty(
|
||||
REGISTRY_ACTOR_STATE_STRINGS,
|
||||
ACTOR_STATE_STRING_NAMES[i],
|
||||
AKGL_AKGL_REGISTRY_ACTOR_STATE_STRINGS,
|
||||
AKGL_ACTOR_STATE_STRING_NAMES[i],
|
||||
flag);
|
||||
}
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_sprite()
|
||||
akerr_ErrorContext *akgl_registry_init_sprite()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_SPRITE = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_SPRITE, AKERR_NULLPOINTER, "Error initializing sprite registry");
|
||||
AKGL_REGISTRY_SPRITE = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_SPRITE, AKERR_NULLPOINTER, "Error initializing sprite registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_spritesheet()
|
||||
akerr_ErrorContext *akgl_registry_init_spritesheet()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_SPRITESHEET = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_SPRITESHEET, AKERR_NULLPOINTER, "Error initializing spritesheet registry");
|
||||
AKGL_AKGL_REGISTRY_SPRITESHEET = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_AKGL_REGISTRY_SPRITESHEET, AKERR_NULLPOINTER, "Error initializing spritesheet registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *registry_init_character()
|
||||
akerr_ErrorContext *akgl_registry_init_character()
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
REGISTRY_CHARACTER = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, REGISTRY_CHARACTER, AKERR_NULLPOINTER, "Error initializing character registry");
|
||||
AKGL_REGISTRY_CHARACTER = SDL_CreateProperties();
|
||||
FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_CHARACTER, AKERR_NULLPOINTER, "Error initializing character registry");
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
116
src/sprite.c
116
src/sprite.c
@@ -13,72 +13,72 @@
|
||||
#include <sdl3game/staticstring.h>
|
||||
#include <sdl3game/iterator.h>
|
||||
|
||||
static akerr_ErrorContext *sprite_load_json_spritesheet(json_t *json, spritesheet **sheet, char *relative_path)
|
||||
static akerr_ErrorContext *akgl_sprite_load_json_spritesheet(json_t *json, akgl_SpriteSheet **sheet, char *relative_path)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *spritesheet_json = NULL;
|
||||
int ss_frame_width = 0;
|
||||
int ss_frame_height = 0;
|
||||
string *ss_filename = NULL;
|
||||
string *tmpstr = NULL;
|
||||
akgl_String *ss_filename = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_next_string(&tmpstr));
|
||||
CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
CATCH(errctx, get_json_object_value((json_t *)json, "spritesheet", &spritesheet_json));
|
||||
CATCH(errctx, get_json_string_value((json_t *)spritesheet_json, "filename", &ss_filename));
|
||||
CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
CATCH(errctx, akgl_get_json_object_value((json_t *)json, "spritesheet", &spritesheet_json));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)spritesheet_json, "filename", &ss_filename));
|
||||
if ( ss_filename->data[0] != '/' ) {
|
||||
SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s/%s", relative_path, ss_filename->data);
|
||||
SDL_snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s/%s", relative_path, ss_filename->data);
|
||||
} else {
|
||||
SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s", ss_filename->data);
|
||||
SDL_snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s", ss_filename->data);
|
||||
}
|
||||
*sheet = SDL_GetPointerProperty(
|
||||
REGISTRY_SPRITESHEET,
|
||||
AKGL_AKGL_REGISTRY_SPRITESHEET,
|
||||
(char *)&tmpstr->data,
|
||||
NULL
|
||||
);
|
||||
if ( *sheet == NULL ) {
|
||||
CATCH(errctx, heap_next_spritesheet(sheet));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)spritesheet_json, "frame_width", &ss_frame_width));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)spritesheet_json, "frame_height", &ss_frame_width));
|
||||
CATCH(errctx, akgl_heap_next_spritesheet(sheet));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)spritesheet_json, "frame_width", &ss_frame_width));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)spritesheet_json, "frame_height", &ss_frame_width));
|
||||
CATCH(errctx,
|
||||
spritesheet_initialize(
|
||||
(spritesheet *)*sheet,
|
||||
akgl_spritesheet_initialize(
|
||||
(akgl_SpriteSheet *)*sheet,
|
||||
ss_frame_width,
|
||||
ss_frame_height,
|
||||
(char *)&tmpstr->data)
|
||||
);
|
||||
}
|
||||
} CLEANUP {
|
||||
IGNORE(heap_release_string(ss_filename));
|
||||
IGNORE(heap_release_string(tmpstr));
|
||||
IGNORE(akgl_heap_release_string(ss_filename));
|
||||
IGNORE(akgl_heap_release_string(tmpstr));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *sprite_load_json(char *filename)
|
||||
akerr_ErrorContext *akgl_sprite_load_json(char *filename)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *json = NULL;
|
||||
json_t *frames = NULL;
|
||||
json_error_t error;
|
||||
sprite *obj = NULL;
|
||||
spritesheet *sheet = NULL;
|
||||
string *spritename = NULL;
|
||||
akgl_Sprite *obj = NULL;
|
||||
akgl_SpriteSheet *sheet = NULL;
|
||||
akgl_String *spritename = NULL;
|
||||
//string *tmpstr = NULL;
|
||||
int i = 0;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, filename, AKERR_NULLPOINTER, "Received null filename");
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_next_sprite(&obj));
|
||||
//CATCH(errctx, heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
CATCH(errctx, heap_next_string(&spritename));
|
||||
CATCH(errctx, string_initialize(spritename, NULL));
|
||||
CATCH(errctx, akgl_heap_next_sprite(&obj));
|
||||
//CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
CATCH(errctx, akgl_heap_next_string(&spritename));
|
||||
CATCH(errctx, akgl_string_initialize(spritename, NULL));
|
||||
|
||||
//SDL_snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
//SDL_snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
json = (json_t *)json_load_file(filename, 0, &error);
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
@@ -87,87 +87,87 @@ akerr_ErrorContext *sprite_load_json(char *filename)
|
||||
"Error while loading sprite from %s on line %d: %s", filename, error.line, error.text
|
||||
);
|
||||
|
||||
CATCH(errctx, sprite_load_json_spritesheet((json_t *)json, &sheet, dirname(filename)));
|
||||
CATCH(errctx, get_json_string_value((json_t *)json, "name", &spritename));
|
||||
CATCH(errctx, akgl_sprite_load_json_spritesheet((json_t *)json, &sheet, dirname(filename)));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &spritename));
|
||||
CATCH(errctx,
|
||||
sprite_initialize(
|
||||
(sprite *)obj,
|
||||
akgl_sprite_initialize(
|
||||
(akgl_Sprite *)obj,
|
||||
spritename->data,
|
||||
(spritesheet *)sheet)
|
||||
(akgl_SpriteSheet *)sheet)
|
||||
);
|
||||
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "width", &obj->width));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "height", &obj->height));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "speed", (int *)&obj->speed));
|
||||
obj->speed = obj->speed * TIME_ONESEC_MS;
|
||||
CATCH(errctx, get_json_boolean_value((json_t *)json, "loop", &obj->loop));
|
||||
CATCH(errctx, get_json_boolean_value((json_t *)json, "loopReverse", &obj->loopReverse));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "width", &obj->width));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "height", &obj->height));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "speed", (int *)&obj->speed));
|
||||
obj->speed = obj->speed * AKGL_TIME_ONESEC_MS;
|
||||
CATCH(errctx, akgl_get_json_boolean_value((json_t *)json, "loop", &obj->loop));
|
||||
CATCH(errctx, akgl_get_json_boolean_value((json_t *)json, "loopReverse", &obj->loopReverse));
|
||||
|
||||
CATCH(errctx, get_json_array_value((json_t *)json, "frames", &frames));
|
||||
CATCH(errctx, akgl_get_json_array_value((json_t *)json, "frames", &frames));
|
||||
obj->frames = json_array_size((json_t *)frames);
|
||||
for ( i = 0 ; i < obj->frames; i++ ) {
|
||||
CATCH(errctx, get_json_array_index_integer((json_t *)frames, i, &obj->frameids[i]));
|
||||
CATCH(errctx, akgl_get_json_array_index_integer((json_t *)frames, i, &obj->frameids[i]));
|
||||
}
|
||||
} CLEANUP {
|
||||
if ( errctx != NULL && errctx->status != 0 ) {
|
||||
IGNORE(heap_release_sprite(obj));
|
||||
IGNORE(heap_release_spritesheet(sheet));
|
||||
IGNORE(akgl_heap_release_sprite(obj));
|
||||
IGNORE(akgl_heap_release_spritesheet(sheet));
|
||||
}
|
||||
IGNORE(heap_release_string(spritename));
|
||||
//IGNORE(heap_release_string(tmpstr));
|
||||
IGNORE(akgl_heap_release_string(spritename));
|
||||
//IGNORE(akgl_heap_release_string(tmpstr));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *sprite_initialize(sprite *spr, char *name, spritesheet *sheet)
|
||||
akerr_ErrorContext *akgl_sprite_initialize(akgl_Sprite *spr, char *name, akgl_SpriteSheet *sheet)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, spr, AKERR_NULLPOINTER, "Null sprite reference");
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "Empty sprite name");
|
||||
FAIL_ZERO_RETURN(errctx, sheet, AKERR_NULLPOINTER, "Null spritesheet reference");
|
||||
|
||||
memset(spr, 0x00, sizeof(sprite));
|
||||
memcpy(spr->name, name, SPRITE_MAX_NAME_LENGTH);
|
||||
memset(spr, 0x00, sizeof(akgl_Sprite));
|
||||
memcpy(spr->name, name, AKGL_SPRITE_MAX_NAME_LENGTH);
|
||||
spr->sheet = sheet;
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_SetPointerProperty(REGISTRY_SPRITE, (char *)&spr->name, (void *)spr),
|
||||
SDL_SetPointerProperty(AKGL_REGISTRY_SPRITE, (char *)&spr->name, (void *)spr),
|
||||
AKERR_KEY,
|
||||
"Unable to add sprite to registry");
|
||||
spr->refcount += 1;
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *spritesheet_initialize(spritesheet *sheet, int sprite_w, int sprite_h, char *filename)
|
||||
akerr_ErrorContext *akgl_spritesheet_initialize(akgl_SpriteSheet *sheet, int sprite_w, int sprite_h, char *filename)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
//string *tmpstr = NULL;
|
||||
//akgl_String *tmpstr = NULL;
|
||||
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_BREAK(errctx, sheet, AKERR_NULLPOINTER, "Null spritesheet pointer");
|
||||
FAIL_ZERO_BREAK(errctx, filename, AKERR_NULLPOINTER, "Null filename pointer");
|
||||
|
||||
memset(sheet, 0x00, sizeof(spritesheet));
|
||||
memset(sheet, 0x00, sizeof(akgl_SpriteSheet));
|
||||
|
||||
//CATCH(errctx, heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
|
||||
//CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
strncpy((char *)&sheet->name, filename, SPRITE_SHEET_MAX_FILENAME_LENGTH);
|
||||
//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
strncpy((char *)&sheet->name, filename, AKGL_SPRITE_SHEET_MAX_FILENAME_LENGTH);
|
||||
|
||||
//snprintf((char *)&tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
//snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename);
|
||||
sheet->texture = IMG_LoadTexture(renderer, filename);
|
||||
FAIL_ZERO_BREAK(errctx, sheet->texture, AKERR_SDL, "Failed loading asset %s : %s", filename, SDL_GetError());
|
||||
FAIL_ZERO_BREAK(errctx, sheet->texture, AKGL_ERR_SDL, "Failed loading asset %s : %s", filename, SDL_GetError());
|
||||
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
SDL_SetPointerProperty(REGISTRY_SPRITESHEET, (char *)sheet->name, (void *)sheet),
|
||||
SDL_SetPointerProperty(AKGL_AKGL_REGISTRY_SPRITESHEET, (char *)sheet->name, (void *)sheet),
|
||||
AKERR_KEY,
|
||||
"Unable to add spritesheet to registry: %s",
|
||||
SDL_GetError());
|
||||
sheet->refcount += 1;
|
||||
} CLEANUP {
|
||||
//IGNORE(heap_release_string(tmpstr));
|
||||
//IGNORE(akgl_heap_release_string(tmpstr));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#include <akerror.h>
|
||||
#include <sdl3game/staticstring.h>
|
||||
|
||||
akerr_ErrorContext *string_initialize(string *obj, char *init)
|
||||
akerr_ErrorContext *akgl_string_initialize(akgl_String *obj, char *init)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Attempted to initialize NULL string reference");
|
||||
if ( init != NULL ) {
|
||||
strncpy((char *)&obj->data, init, MAX_STRING_LENGTH);
|
||||
strncpy((char *)&obj->data, init, AKGL_MAX_STRING_LENGTH);
|
||||
} else {
|
||||
memset(&obj->data, 0x00, sizeof(string));
|
||||
memset(&obj->data, 0x00, sizeof(akgl_String));
|
||||
}
|
||||
obj->refcount = 1;
|
||||
SUCCEED_RETURN(errctx);
|
||||
|
||||
60
src/text.c
Normal file
60
src/text.c
Normal file
@@ -0,0 +1,60 @@
|
||||
#include <akerror.h>
|
||||
#include <SDL3/SDL.h>
|
||||
#include <SDL3_ttf/SDL_ttf.h>
|
||||
#include <sdl3game/text.h>
|
||||
#include <sdl3game/registry.h>
|
||||
#include <sdl3game/game.h>
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_text_loadfont(char *name, char *filepath, int size)
|
||||
{
|
||||
TTF_Font *font = NULL;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "Null font name");
|
||||
FAIL_ZERO_RETURN(errctx, name, AKERR_NULLPOINTER, "Null filepath");
|
||||
font = TTF_OpenFont(filepath, size);
|
||||
FAIL_ZERO_RETURN(errctx, font, AKGL_ERR_SDL, "%s", SDL_GetError());
|
||||
FAIL_ZERO_RETURN(
|
||||
errctx,
|
||||
SDL_SetPointerProperty(AKGL_REGISTRY_FONT, name, (void *)font),
|
||||
AKERR_KEY,
|
||||
"Unable to add font %p to registry as %s : %s",
|
||||
(void *)font,
|
||||
name,
|
||||
SDL_GetError());
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext AKERR_NOIGNORE *akgl_text_rendertextat(TTF_Font *font, char *text, SDL_Color color, int wraplength, int x, int y)
|
||||
{
|
||||
SDL_Surface *textsurf = NULL;
|
||||
SDL_Texture *texture = NULL;
|
||||
SDL_FRect dest;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, font, AKERR_NULLPOINTER, "NULL font");
|
||||
FAIL_ZERO_RETURN(errctx, text, AKERR_NULLPOINTER, "NULL text string");
|
||||
if ( wraplength > 0 ) {
|
||||
textsurf = TTF_RenderText_Blended_Wrapped(
|
||||
font,
|
||||
text,
|
||||
0,
|
||||
color,
|
||||
wraplength);
|
||||
} else {
|
||||
textsurf = TTF_RenderText_Blended(
|
||||
font,
|
||||
text,
|
||||
0,
|
||||
color);
|
||||
}
|
||||
FAIL_ZERO_RETURN(errctx, textsurf, AKERR_NULLPOINTER, "%s", SDL_GetError());
|
||||
texture = SDL_CreateTextureFromSurface(renderer, textsurf);
|
||||
FAIL_ZERO_RETURN(errctx, texture, AKERR_NULLPOINTER, "%s", SDL_GetError());
|
||||
dest.x = x;
|
||||
dest.y = y;
|
||||
SDL_GetTextureSize(texture, &dest.w, &dest.h);
|
||||
FAIL_ZERO_RETURN(errctx, SDL_RenderTexture(renderer, texture, NULL, &dest), AKERR_NULLPOINTER, "%s", SDL_GetError());
|
||||
SDL_DestroyTexture(texture);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
218
src/tilemap.c
218
src/tilemap.c
@@ -13,27 +13,27 @@
|
||||
#include <sdl3game/staticstring.h>
|
||||
#include <sdl3game/game.h>
|
||||
|
||||
akerr_ErrorContext *get_json_tilemap_property(json_t *obj, char *key, char *type, json_t **dest)
|
||||
akerr_ErrorContext *akgl_get_json_tilemap_property(json_t *obj, char *key, char *type, json_t **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *properties = NULL;
|
||||
json_t *property = NULL;
|
||||
string *tmpstr = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
int i = 0;
|
||||
// This is not a generic JSON helper. It assumes we are receiving an object with a 'properties' key
|
||||
// inside of it. That key is an array of objects, and each object has a name, type, and value.
|
||||
FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL json obj reference");
|
||||
FAIL_ZERO_RETURN(errctx, key, AKERR_NULLPOINTER, "NULL key string");
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_array_value(obj, "properties", &properties));
|
||||
CATCH(errctx, akgl_get_json_array_value(obj, "properties", &properties));
|
||||
for (i = 0; i < json_array_size(properties); i++) {
|
||||
CATCH(errctx, get_json_array_index_object(properties, i, &property));
|
||||
CATCH(errctx, get_json_string_value(property, "name", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_array_index_object(properties, i, &property));
|
||||
CATCH(errctx, akgl_get_json_string_value(property, "name", &tmpstr));
|
||||
if ( strcmp(tmpstr->data, key) != 0 ) {
|
||||
CATCH(errctx, heap_release_string(tmpstr));
|
||||
CATCH(errctx, akgl_heap_release_string(tmpstr));
|
||||
continue;
|
||||
}
|
||||
CATCH(errctx, get_json_string_value(property, "type", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value(property, "type", &tmpstr));
|
||||
if ( strcmp(tmpstr->data, type) != 0 ) {
|
||||
FAIL_BREAK(errctx, AKERR_TYPE, "Character property is present but is incorrect type");
|
||||
}
|
||||
@@ -42,7 +42,7 @@ akerr_ErrorContext *get_json_tilemap_property(json_t *obj, char *key, char *type
|
||||
}
|
||||
} CLEANUP {
|
||||
if ( tmpstr != NULL ) {
|
||||
IGNORE(heap_release_string(tmpstr));
|
||||
IGNORE(akgl_heap_release_string(tmpstr));
|
||||
}
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
@@ -51,16 +51,16 @@ akerr_ErrorContext *get_json_tilemap_property(json_t *obj, char *key, char *type
|
||||
}
|
||||
|
||||
|
||||
akerr_ErrorContext *get_json_properties_string(json_t *obj, char *key, string **dest)
|
||||
akerr_ErrorContext *akgl_get_json_properties_string(json_t *obj, char *key, akgl_String **dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *property;
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_tilemap_property(obj, key, "string", &property));
|
||||
CATCH(errctx, heap_next_string(dest));
|
||||
CATCH(errctx, string_initialize(*dest, NULL));
|
||||
CATCH(errctx, get_json_string_value(property, "value", dest));
|
||||
CATCH(errctx, akgl_get_json_tilemap_property(obj, key, "string", &property));
|
||||
CATCH(errctx, akgl_heap_next_string(dest));
|
||||
CATCH(errctx, akgl_string_initialize(*dest, NULL));
|
||||
CATCH(errctx, akgl_get_json_string_value(property, "value", dest));
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
@@ -68,13 +68,13 @@ akerr_ErrorContext *get_json_properties_string(json_t *obj, char *key, string **
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *get_json_properties_integer(json_t *obj, char *key, int *dest)
|
||||
akerr_ErrorContext *akgl_get_json_properties_integer(json_t *obj, char *key, int *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *property = NULL;
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_tilemap_property(obj, key, "int", &property));
|
||||
CATCH(errctx, get_json_integer_value(property, "value", dest));
|
||||
CATCH(errctx, akgl_get_json_tilemap_property(obj, key, "int", &property));
|
||||
CATCH(errctx, akgl_get_json_integer_value(property, "value", dest));
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
@@ -82,31 +82,31 @@ akerr_ErrorContext *get_json_properties_integer(json_t *obj, char *key, int *des
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_tilesets_each(json_t *tileset, tilemap *dest, int tsidx)
|
||||
akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilemap *dest, int tsidx)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
string *tmpstr = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "columns", &dest->tilesets[tsidx].columns));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "firstgid", &dest->tilesets[tsidx].firstgid));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "imageheight", &dest->tilesets[tsidx].imageheight));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "imagewidth", &dest->tilesets[tsidx].imagewidth));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "margin", &dest->tilesets[tsidx].margin));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "spacing", &dest->tilesets[tsidx].spacing));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "tilecount", &dest->tilesets[tsidx].tilecount));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "tileheight", &dest->tilesets[tsidx].tileheight));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)tileset, "tilewidth", &dest->tilesets[tsidx].tilewidth));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "columns", &dest->tilesets[tsidx].columns));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "firstgid", &dest->tilesets[tsidx].firstgid));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "imageheight", &dest->tilesets[tsidx].imageheight));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "imagewidth", &dest->tilesets[tsidx].imagewidth));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "margin", &dest->tilesets[tsidx].margin));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "spacing", &dest->tilesets[tsidx].spacing));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "tilecount", &dest->tilesets[tsidx].tilecount));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "tileheight", &dest->tilesets[tsidx].tileheight));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)tileset, "tilewidth", &dest->tilesets[tsidx].tilewidth));
|
||||
|
||||
CATCH(errctx, get_json_string_value((json_t *)tileset, "name", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)tileset, "name", &tmpstr));
|
||||
strncpy((char *)&dest->tilesets[tsidx].name,
|
||||
(char *)&tmpstr->data,
|
||||
TILEMAP_MAX_TILESET_NAME_SIZE
|
||||
AKGL_TILEMAP_MAX_TILESET_NAME_SIZE
|
||||
);
|
||||
|
||||
CATCH(errctx, get_json_string_value((json_t *)tileset, "image", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)tileset, "image", &tmpstr));
|
||||
|
||||
snprintf((char *)&dest->tilesets[tsidx].imagefilename,
|
||||
TILEMAP_MAX_TILESET_FILENAME_SIZE,
|
||||
AKGL_TILEMAP_MAX_TILESET_FILENAME_SIZE,
|
||||
"%s%s",
|
||||
SDL_GetBasePath(),
|
||||
tmpstr->data
|
||||
@@ -121,7 +121,7 @@ akerr_ErrorContext *tilemap_load_tilesets_each(json_t *tileset, tilemap *dest, i
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_compute_tileset_offsets(tilemap *dest, int tilesetidx)
|
||||
akerr_ErrorContext *akgl_tilemap_compute_tileset_offsets(akgl_Tilemap *dest, int tilesetidx)
|
||||
{
|
||||
int x_offset = 0;
|
||||
int y_offset = 0;
|
||||
@@ -176,7 +176,7 @@ akerr_ErrorContext *tilemap_compute_tileset_offsets(tilemap *dest, int tilesetid
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_tilesets(tilemap *dest, json_t *root)
|
||||
akerr_ErrorContext *akgl_tilemap_load_tilesets(akgl_Tilemap *dest, json_t *root)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "Received NULL tilemap pointer");
|
||||
@@ -188,11 +188,11 @@ akerr_ErrorContext *tilemap_load_tilesets(tilemap *dest, json_t *root)
|
||||
|
||||
dest->numtilesets = 0;
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_array_value(root, "tilesets", &tilesets))
|
||||
CATCH(errctx, akgl_get_json_array_value(root, "tilesets", &tilesets))
|
||||
for (i = 0; i < json_array_size((json_t *)tilesets); i++) {
|
||||
CATCH(errctx, get_json_array_index_object((json_t *)tilesets, i, &jstileset));
|
||||
CATCH(errctx, tilemap_load_tilesets_each(jstileset, dest, i));
|
||||
CATCH(errctx, tilemap_compute_tileset_offsets(dest, i));
|
||||
CATCH(errctx, akgl_get_json_array_index_object((json_t *)tilesets, i, &jstileset));
|
||||
CATCH(errctx, akgl_tilemap_load_tilesets_each(jstileset, dest, i));
|
||||
CATCH(errctx, akgl_tilemap_compute_tileset_offsets(dest, i));
|
||||
dest->numtilesets += 1;
|
||||
}
|
||||
} CLEANUP {
|
||||
@@ -202,37 +202,37 @@ akerr_ErrorContext *tilemap_load_tilesets(tilemap *dest, json_t *root)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_layer_object_actor(tilemap_object *curobj, json_t *layerdatavalue, int layerid)
|
||||
akerr_ErrorContext *akgl_tilemap_load_layer_object_actor(akgl_TilemapObject *curobj, json_t *layerdatavalue, int layerid)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
string *tmpstr = NULL;
|
||||
actor *actorobj = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
akgl_Actor *actorobj = NULL;
|
||||
|
||||
curobj->type = TILEMAP_OBJECT_TYPE_ACTOR;
|
||||
curobj->type = AKGL_TILEMAP_OBJECT_TYPE_ACTOR;
|
||||
if ( strlen((char *)&curobj->name) == 0 ) {
|
||||
FAIL_RETURN(errctx, AKERR_KEY, "Actor in tile object layer cannot have empty name");
|
||||
}
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, heap_next_string(&tmpstr));
|
||||
actorobj = SDL_GetPointerProperty(REGISTRY_ACTOR, (char *)&curobj->name, NULL);
|
||||
CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
actorobj = SDL_GetPointerProperty(AKGL_REGISTRY_ACTOR, (char *)&curobj->name, NULL);
|
||||
if ( actorobj == NULL ) {
|
||||
CATCH(errctx, heap_next_actor(&actorobj));
|
||||
CATCH(errctx, actor_initialize((actor *)actorobj, (char *)&curobj->name));
|
||||
CATCH(errctx, get_json_properties_string((json_t *)layerdatavalue, "character", &tmpstr));
|
||||
CATCH(errctx, akgl_heap_next_actor(&actorobj));
|
||||
CATCH(errctx, akgl_actor_initialize((akgl_Actor *)actorobj, (char *)&curobj->name));
|
||||
CATCH(errctx, akgl_get_json_properties_string((json_t *)layerdatavalue, "character", &tmpstr));
|
||||
CATCH(errctx,
|
||||
actor_set_character(
|
||||
(actor *)actorobj,
|
||||
akgl_actor_set_character(
|
||||
(akgl_Actor *)actorobj,
|
||||
(char *)&tmpstr->data
|
||||
)
|
||||
);
|
||||
} else {
|
||||
actorobj->refcount += 1;
|
||||
}
|
||||
CATCH(errctx, get_json_properties_integer((json_t *)layerdatavalue, "state", &actorobj->state));
|
||||
CATCH(errctx, akgl_get_json_properties_integer((json_t *)layerdatavalue, "state", &actorobj->state));
|
||||
} CLEANUP {
|
||||
if ( tmpstr != NULL ) {
|
||||
IGNORE(heap_release_string(tmpstr));
|
||||
IGNORE(akgl_heap_release_string(tmpstr));
|
||||
}
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
@@ -241,42 +241,42 @@ akerr_ErrorContext *tilemap_load_layer_object_actor(tilemap_object *curobj, json
|
||||
actorobj->x = curobj->x;
|
||||
actorobj->y = curobj->y;
|
||||
actorobj->visible = curobj->visible;
|
||||
curobj->actorptr = (actor *)actorobj;
|
||||
curobj->actorptr = (akgl_Actor *)actorobj;
|
||||
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_layer_objects(tilemap *dest, json_t *root, int layerid)
|
||||
akerr_ErrorContext *akgl_tilemap_load_layer_objects(akgl_Tilemap *dest, json_t *root, int layerid)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *layerdata = NULL;
|
||||
json_t *layerdatavalue = NULL;
|
||||
int j;
|
||||
int len;
|
||||
tilemap_layer *curlayer = NULL;
|
||||
tilemap_object *curobj = NULL;
|
||||
string *tmpstr = NULL;
|
||||
akgl_TilemapLayer *curlayer = NULL;
|
||||
akgl_TilemapObject *curobj = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL destination tilemap reference");
|
||||
FAIL_ZERO_RETURN(errctx, root, AKERR_NULLPOINTER, "NULL tilemap root reference");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_array_value(root, "objects", &layerdata));
|
||||
CATCH(errctx, akgl_get_json_array_value(root, "objects", &layerdata));
|
||||
len = json_array_size((json_t *)layerdata);
|
||||
curlayer = &dest->layers[layerid];
|
||||
for ( j = 0; j < len; j++ ) {
|
||||
CATCH(errctx, get_json_array_index_object((json_t *)layerdata, j, &layerdatavalue));
|
||||
CATCH(errctx, akgl_get_json_array_index_object((json_t *)layerdata, j, &layerdatavalue));
|
||||
curobj = &curlayer->objects[j];
|
||||
CATCH(errctx, get_json_string_value((json_t *)layerdatavalue, "name", &tmpstr));
|
||||
strncpy((char *)curobj->name, tmpstr->data, ACTOR_MAX_NAME_LENGTH);
|
||||
CATCH(errctx, heap_release_string(tmpstr));
|
||||
CATCH(errctx, get_json_number_value((json_t *)layerdatavalue, "x", &curobj->x));
|
||||
CATCH(errctx, get_json_number_value((json_t *)layerdatavalue, "y", &curobj->y));
|
||||
CATCH(errctx, get_json_boolean_value((json_t *)layerdatavalue, "visible", &curobj->visible));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)layerdatavalue, "name", &tmpstr));
|
||||
strncpy((char *)curobj->name, tmpstr->data, AKGL_ACTOR_MAX_NAME_LENGTH);
|
||||
CATCH(errctx, akgl_heap_release_string(tmpstr));
|
||||
CATCH(errctx, akgl_get_json_number_value((json_t *)layerdatavalue, "x", &curobj->x));
|
||||
CATCH(errctx, akgl_get_json_number_value((json_t *)layerdatavalue, "y", &curobj->y));
|
||||
CATCH(errctx, akgl_get_json_boolean_value((json_t *)layerdatavalue, "visible", &curobj->visible));
|
||||
|
||||
CATCH(errctx, get_json_string_value((json_t *)layerdatavalue, "type", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)layerdatavalue, "type", &tmpstr));
|
||||
if ( strcmp(tmpstr->data, "actor") == 0 ) {
|
||||
CATCH(errctx, tilemap_load_layer_object_actor(curobj, layerdatavalue, layerid));
|
||||
CATCH(errctx, akgl_tilemap_load_layer_object_actor(curobj, layerdatavalue, layerid));
|
||||
}
|
||||
layerdatavalue = NULL;
|
||||
}
|
||||
@@ -287,7 +287,7 @@ akerr_ErrorContext *tilemap_load_layer_objects(tilemap *dest, json_t *root, int
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_layer_tile(tilemap *dest, json_t *root, int layerid)
|
||||
akerr_ErrorContext *akgl_tilemap_load_layer_tile(akgl_Tilemap *dest, json_t *root, int layerid)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *layerdata = NULL;
|
||||
@@ -298,15 +298,15 @@ akerr_ErrorContext *tilemap_load_layer_tile(tilemap *dest, json_t *root, int lay
|
||||
FAIL_ZERO_RETURN(errctx, root, AKERR_NULLPOINTER, "NULL tilemap root reference");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_integer_value(root, "height", &dest->layers[layerid].height));
|
||||
CATCH(errctx, get_json_integer_value(root, "width", &dest->layers[layerid].width));
|
||||
CATCH(errctx, get_json_array_value(root, "data", &layerdata));
|
||||
CATCH(errctx, akgl_get_json_integer_value(root, "height", &dest->layers[layerid].height));
|
||||
CATCH(errctx, akgl_get_json_integer_value(root, "width", &dest->layers[layerid].width));
|
||||
CATCH(errctx, akgl_get_json_array_value(root, "data", &layerdata));
|
||||
layerdatalen = (dest->layers[layerid].width * dest->layers[layerid].height);
|
||||
if ( layerdatalen >= (TILEMAP_MAX_WIDTH * TILEMAP_MAX_HEIGHT) ) {
|
||||
if ( layerdatalen >= (AKGL_TILEMAP_MAX_WIDTH * AKGL_TILEMAP_MAX_HEIGHT) ) {
|
||||
FAIL_BREAK(errctx, AKERR_OUTOFBOUNDS, "Map layer exceeds the maximum size");
|
||||
}
|
||||
for ( j = 0; j < layerdatalen; j++ ) {
|
||||
CATCH(errctx, get_json_array_index_integer(layerdata, j, &dest->layers[layerid].data[j]));
|
||||
CATCH(errctx, akgl_get_json_array_index_integer(layerdata, j, &dest->layers[layerid].data[j]));
|
||||
}
|
||||
} CLEANUP {
|
||||
} PROCESS(errctx) {
|
||||
@@ -315,45 +315,45 @@ akerr_ErrorContext *tilemap_load_layer_tile(tilemap *dest, json_t *root, int lay
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load_layers(tilemap *dest, json_t *root)
|
||||
akerr_ErrorContext *akgl_tilemap_load_layers(akgl_Tilemap *dest, json_t *root)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "tilemap_load_layers received NULL tilemap pointer");
|
||||
FAIL_ZERO_RETURN(errctx, root, AKERR_NULLPOINTER, "tilemap_load_layers received NULL json object pointer");
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "akgl_tilemap_load_layers received NULL tilemap pointer");
|
||||
FAIL_ZERO_RETURN(errctx, root, AKERR_NULLPOINTER, "akgl_tilemap_load_layers received NULL json object pointer");
|
||||
json_t *layers = NULL;
|
||||
json_t *layer = NULL;
|
||||
string *tmpstr = NULL;
|
||||
akgl_String *tmpstr = NULL;
|
||||
int i;
|
||||
int tmpint;
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, get_json_array_value(root, "layers", &layers));
|
||||
CATCH(errctx, akgl_get_json_array_value(root, "layers", &layers));
|
||||
dest->numlayers = json_array_size((json_t *)layers);
|
||||
for ( i = 0; i < dest->numlayers; i++) {
|
||||
if ( i >= TILEMAP_MAX_LAYERS ) {
|
||||
if ( i >= AKGL_TILEMAP_MAX_LAYERS ) {
|
||||
FAIL_BREAK(errctx, AKERR_OUTOFBOUNDS, "Map exceeds the maximum number of layers");
|
||||
}
|
||||
CATCH(errctx, get_json_array_index_object((json_t *)layers, i, &layer));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)layer, "id", &tmpint));
|
||||
CATCH(errctx, akgl_get_json_array_index_object((json_t *)layers, i, &layer));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)layer, "id", &tmpint));
|
||||
if ( (tmpint - 1) != i ) {
|
||||
// TileD's map layer IDs start at 1, not 0, and are sequential but not necessarily contiguous. We may have a gap in IDs.
|
||||
layer = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
CATCH(errctx, get_json_number_value((json_t *)layer, "opacity", &dest->layers[i].opacity));
|
||||
CATCH(errctx, get_json_boolean_value((json_t *)layer, "visible", &dest->layers[i].visible));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)layer, "id", &dest->layers[i].id));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)layer, "x", &dest->layers[i].x));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)layer, "y", &dest->layers[i].y));
|
||||
CATCH(errctx, akgl_get_json_number_value((json_t *)layer, "opacity", &dest->layers[i].opacity));
|
||||
CATCH(errctx, akgl_get_json_boolean_value((json_t *)layer, "visible", &dest->layers[i].visible));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)layer, "id", &dest->layers[i].id));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)layer, "x", &dest->layers[i].x));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)layer, "y", &dest->layers[i].y));
|
||||
|
||||
CATCH(errctx, get_json_string_value((json_t *)layer, "type", &tmpstr));
|
||||
CATCH(errctx, akgl_get_json_string_value((json_t *)layer, "type", &tmpstr));
|
||||
if ( strncmp((char *)tmpstr->data, "objectgroup", strlen((char *)tmpstr->data)) == 0 ) {
|
||||
dest->layers[i].type = TILEMAP_LAYER_TYPE_OBJECTS;
|
||||
CATCH(errctx, tilemap_load_layer_objects((tilemap *)dest, (json_t *)layer, i));
|
||||
dest->layers[i].type = AKGL_TILEMAP_LAYER_TYPE_OBJECTS;
|
||||
CATCH(errctx, akgl_tilemap_load_layer_objects((akgl_Tilemap *)dest, (json_t *)layer, i));
|
||||
} else if ( strncmp((char *)tmpstr->data, "tilelayer", strlen((char *)tmpstr->data)) == 0 ) {
|
||||
dest->layers[i].type = TILEMAP_LAYER_TYPE_TILES;
|
||||
CATCH(errctx, tilemap_load_layer_tile((tilemap *)dest, (json_t *)layer, i));
|
||||
dest->layers[i].type = AKGL_TILEMAP_LAYER_TYPE_TILES;
|
||||
CATCH(errctx, akgl_tilemap_load_layer_tile((akgl_Tilemap *)dest, (json_t *)layer, i));
|
||||
}
|
||||
layer = NULL;
|
||||
}
|
||||
@@ -363,23 +363,23 @@ akerr_ErrorContext *tilemap_load_layers(tilemap *dest, json_t *root)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_load(char *fname, tilemap *dest)
|
||||
akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
json_t *json = NULL;
|
||||
//string *tmpstr = NULL;
|
||||
//akgl_String *tmpstr = NULL;
|
||||
json_error_t error;
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, fname, AKERR_NULLPOINTER, "load_tilemap received null filename");
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "load_tilemap received null tilemap");
|
||||
|
||||
memset(dest, 0x00, sizeof(tilemap));
|
||||
memset(dest, 0x00, sizeof(akgl_Tilemap));
|
||||
|
||||
|
||||
ATTEMPT {
|
||||
//CATCH(errctx, heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, string_initialize(tmpstr, NULL));
|
||||
//SDL_snprintf(tmpstr->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname);
|
||||
//CATCH(errctx, akgl_heap_next_string(&tmpstr));
|
||||
//CATCH(errctx, akgl_string_initialize(tmpstr, NULL));
|
||||
//SDL_snprintf(tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname);
|
||||
json = json_load_file(fname, 0, &error);
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
@@ -390,26 +390,26 @@ akerr_ErrorContext *tilemap_load(char *fname, tilemap *dest)
|
||||
error.line,
|
||||
error.text
|
||||
);
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "tileheight", &dest->tileheight));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "tilewidth", &dest->tilewidth));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "height", &dest->height));
|
||||
CATCH(errctx, get_json_integer_value((json_t *)json, "width", &dest->width));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "tileheight", &dest->tileheight));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "tilewidth", &dest->tilewidth));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "height", &dest->height));
|
||||
CATCH(errctx, akgl_get_json_integer_value((json_t *)json, "width", &dest->width));
|
||||
|
||||
dest->orientation = 0;
|
||||
if ( (dest->width * dest->height) >= (TILEMAP_MAX_WIDTH * TILEMAP_MAX_HEIGHT) ) {
|
||||
if ( (dest->width * dest->height) >= (AKGL_TILEMAP_MAX_WIDTH * AKGL_TILEMAP_MAX_HEIGHT) ) {
|
||||
FAIL_RETURN(errctx, AKERR_OUTOFBOUNDS, "Map exceeds the maximum size");
|
||||
}
|
||||
|
||||
CATCH(errctx, tilemap_load_layers((tilemap *)dest, (json_t *)json));
|
||||
CATCH(errctx, tilemap_load_tilesets((tilemap *)dest, (json_t *)json));
|
||||
CATCH(errctx, akgl_tilemap_load_layers((akgl_Tilemap *)dest, (json_t *)json));
|
||||
CATCH(errctx, akgl_tilemap_load_tilesets((akgl_Tilemap *)dest, (json_t *)json));
|
||||
} CLEANUP {
|
||||
//IGNORE(heap_release_string(tmpstr));
|
||||
//IGNORE(akgl_heap_release_string(tmpstr));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_draw(SDL_Renderer *renderer, tilemap *map, SDL_FRect *viewport, int layeridx)
|
||||
akerr_ErrorContext *akgl_tilemap_draw(SDL_Renderer *renderer, akgl_Tilemap *map, SDL_FRect *viewport, int layeridx)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
SDL_FRect dest = {.x = 0, .y = 0, .w = 0, .h = 0};;
|
||||
@@ -439,8 +439,8 @@ akerr_ErrorContext *tilemap_draw(SDL_Renderer *renderer, tilemap *map, SDL_FRect
|
||||
* 0 and 8 would not be rendered. 1, 9, 6, and E would be partially rendered at their corner.
|
||||
* 2,3,4,5 and A,B,C,D would be partially rendered with a slice from their center.
|
||||
*/
|
||||
FAIL_ZERO_RETURN(errctx, map, AKERR_NULLPOINTER, "tilemap_draw received NULL pointer to tilemap");
|
||||
FAIL_ZERO_RETURN(errctx, viewport, AKERR_NULLPOINTER, "tilemap_draw received NULL pointer to viewport");
|
||||
FAIL_ZERO_RETURN(errctx, map, AKERR_NULLPOINTER, "akgl_tilemap_draw received NULL pointer to tilemap");
|
||||
FAIL_ZERO_RETURN(errctx, viewport, AKERR_NULLPOINTER, "akgl_tilemap_draw received NULL pointer to viewport");
|
||||
|
||||
/* Only try to render the stuff that is partially within the viewport */
|
||||
|
||||
@@ -519,7 +519,7 @@ akerr_ErrorContext *tilemap_draw(SDL_Renderer *renderer, tilemap *map, SDL_FRect
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *tilemap_draw_tileset(SDL_Renderer *renderer, tilemap *map, int tilesetidx)
|
||||
akerr_ErrorContext *akgl_tilemap_draw_tileset(SDL_Renderer *renderer, akgl_Tilemap *map, int tilesetidx)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
SDL_FRect dest;
|
||||
@@ -531,8 +531,8 @@ akerr_ErrorContext *tilemap_draw_tileset(SDL_Renderer *renderer, tilemap *map, i
|
||||
* by proving that we can reconstruct the original tileset image)
|
||||
*/
|
||||
|
||||
FAIL_ZERO_RETURN(errctx, map, AKERR_NULLPOINTER, "tilemap_draw_tileset received NULL pointer to tilemap");
|
||||
FAIL_NONZERO_RETURN(errctx, (tilesetidx >= map->numtilesets), AKERR_OUTOFBOUNDS, "tilemap_draw_tileset received a tileset index out of bounds");
|
||||
FAIL_ZERO_RETURN(errctx, map, AKERR_NULLPOINTER, "akgl_tilemap_draw_tileset received NULL pointer to tilemap");
|
||||
FAIL_NONZERO_RETURN(errctx, (tilesetidx >= map->numtilesets), AKERR_OUTOFBOUNDS, "akgl_tilemap_draw_tileset received a tileset index out of bounds");
|
||||
|
||||
for ( tilenum = 0; tilenum < map->tilesets[tilesetidx].tilecount; tilenum++) {
|
||||
// Render this tile to the correct screen position
|
||||
|
||||
48
src/util.c
48
src/util.c
@@ -10,7 +10,7 @@
|
||||
#include <sdl3game/registry.h>
|
||||
#include <sdl3game/game.h>
|
||||
|
||||
akerr_ErrorContext *rectangle_points(RectanglePoints *dest, SDL_FRect *rect)
|
||||
akerr_ErrorContext *akgl_rectangle_points(RectanglePoints *dest, SDL_FRect *rect)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL RectanglePoints reference");
|
||||
@@ -26,7 +26,7 @@ akerr_ErrorContext *rectangle_points(RectanglePoints *dest, SDL_FRect *rect)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *collide_point_rectangle(point *p, RectanglePoints *rp, bool *collide)
|
||||
akerr_ErrorContext *akgl_collide_point_rectangle(point *p, RectanglePoints *rp, bool *collide)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, p, AKERR_NULLPOINTER, "NULL Point reference");
|
||||
@@ -41,7 +41,7 @@ akerr_ErrorContext *collide_point_rectangle(point *p, RectanglePoints *rp, bool
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *collide_rectangles(SDL_FRect *r1, SDL_FRect *r2, bool *collide)
|
||||
akerr_ErrorContext *akgl_collide_rectangles(SDL_FRect *r1, SDL_FRect *r2, bool *collide)
|
||||
{
|
||||
RectanglePoints r1p;
|
||||
RectanglePoints r2p;
|
||||
@@ -51,39 +51,39 @@ akerr_ErrorContext *collide_rectangles(SDL_FRect *r1, SDL_FRect *r2, bool *colli
|
||||
FAIL_ZERO_RETURN(errctx, collide, AKERR_NULLPOINTER, "NULL collision flag reference");
|
||||
|
||||
ATTEMPT {
|
||||
CATCH(errctx, rectangle_points(&r1p, r1));
|
||||
CATCH(errctx, rectangle_points(&r2p, r2));
|
||||
CATCH(errctx, akgl_rectangle_points(&r1p, r1));
|
||||
CATCH(errctx, akgl_rectangle_points(&r2p, r2));
|
||||
|
||||
// is the upper left corner of r1 contacting r2?
|
||||
CATCH(errctx, collide_point_rectangle(&r1p.topleft, &r2p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r1p.topleft, &r2p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the upper left corner of r2 contacting r1?
|
||||
CATCH(errctx, collide_point_rectangle(&r2p.topleft, &r1p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r2p.topleft, &r1p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the top right corner of r1 contacting r2?
|
||||
CATCH(errctx, collide_point_rectangle(&r1p.topright, &r2p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r1p.topright, &r2p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the top right corner of r2 contacting r1?
|
||||
CATCH(errctx, collide_point_rectangle(&r2p.topright, &r1p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r2p.topright, &r1p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the bottom left corner of r1 contacting r2?
|
||||
CATCH(errctx, collide_point_rectangle(&r1p.bottomleft, &r2p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r1p.bottomleft, &r2p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the bottom left corner of r2 contacting r1?
|
||||
CATCH(errctx, collide_point_rectangle(&r2p.bottomleft, &r1p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r2p.bottomleft, &r1p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the bottom right corner of r1 contacting r2?
|
||||
CATCH(errctx, collide_point_rectangle(&r1p.bottomright, &r2p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r1p.bottomright, &r2p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
// is the bottom right corner of r2 contacting r1?
|
||||
CATCH(errctx, collide_point_rectangle(&r2p.bottomright, &r1p, collide));
|
||||
CATCH(errctx, akgl_collide_point_rectangle(&r2p.bottomright, &r1p, collide));
|
||||
if ( *collide == true ) { SUCCEED_RETURN(errctx); }
|
||||
|
||||
} CLEANUP {
|
||||
@@ -95,7 +95,7 @@ akerr_ErrorContext *collide_rectangles(SDL_FRect *r1, SDL_FRect *r2, bool *colli
|
||||
}
|
||||
|
||||
|
||||
akerr_ErrorContext *compare_sdl_surfaces(SDL_Surface *s1, SDL_Surface *s2)
|
||||
akerr_ErrorContext *akgl_compare_sdl_surfaces(SDL_Surface *s1, SDL_Surface *s2)
|
||||
{
|
||||
PREPARE_ERROR(errctx);
|
||||
FAIL_ZERO_RETURN(errctx, s1, AKERR_NULLPOINTER, "NULL Surface pointer");
|
||||
@@ -104,21 +104,21 @@ akerr_ErrorContext *compare_sdl_surfaces(SDL_Surface *s1, SDL_Surface *s2)
|
||||
SUCCEED_RETURN(errctx);
|
||||
}
|
||||
|
||||
akerr_ErrorContext *render_and_compare(SDL_Texture *t1, SDL_Texture *t2, int x, int y, int w, int h, char *writeout)
|
||||
akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, int x, int y, int w, int h, char *writeout)
|
||||
{
|
||||
SDL_Surface *s1 = NULL;
|
||||
SDL_Surface *s2 = NULL;
|
||||
SDL_FRect src = {.x = x, .y = y, .w = w, .h = h};
|
||||
SDL_FRect dest = {.x = x, .y = y, .w = w, .h = h};
|
||||
SDL_Rect read = {.x = x, .y = y, .w = w, .h = h};
|
||||
string *tmpstring = NULL;
|
||||
akgl_String *tmpstring = NULL;
|
||||
|
||||
PREPARE_ERROR(errctx);
|
||||
ATTEMPT {
|
||||
FAIL_ZERO_BREAK(errctx, t1, AKERR_NULLPOINTER, "NULL texture");
|
||||
FAIL_ZERO_BREAK(errctx, t2, AKERR_NULLPOINTER, "NULL texture");
|
||||
|
||||
CATCH(errctx, heap_next_string(&tmpstring));
|
||||
CATCH(errctx, akgl_heap_next_string(&tmpstring));
|
||||
SDL_RenderClear(renderer);
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
@@ -127,13 +127,13 @@ akerr_ErrorContext *render_and_compare(SDL_Texture *t1, SDL_Texture *t2, int x,
|
||||
t1,
|
||||
&src,
|
||||
&dest),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Failed to render test texture");
|
||||
s1 = SDL_RenderReadPixels(renderer, &read);
|
||||
FAIL_ZERO_BREAK(errctx, s1, AKERR_SDL, "Failed to read pixels from renderer");
|
||||
FAIL_ZERO_BREAK(errctx, s1, AKGL_ERR_SDL, "Failed to read pixels from renderer");
|
||||
|
||||
if ( writeout != NULL ) {
|
||||
snprintf((char *)&tmpstring->data, MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), writeout);
|
||||
snprintf((char *)&tmpstring->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), writeout);
|
||||
FAIL_ZERO_BREAK(
|
||||
errctx,
|
||||
IMG_SavePNG(s1, (char *)&tmpstring->data),
|
||||
@@ -152,18 +152,18 @@ akerr_ErrorContext *render_and_compare(SDL_Texture *t1, SDL_Texture *t2, int x,
|
||||
t2,
|
||||
&src,
|
||||
&dest),
|
||||
AKERR_SDL,
|
||||
AKGL_ERR_SDL,
|
||||
"Failed to render test texture");
|
||||
s2 = SDL_RenderReadPixels(renderer, &read);
|
||||
FAIL_ZERO_BREAK(errctx, s2, AKERR_SDL, "Failed to read pixels from renderer");
|
||||
FAIL_ZERO_BREAK(errctx, s2, AKGL_ERR_SDL, "Failed to read pixels from renderer");
|
||||
|
||||
CATCH(errctx, compare_sdl_surfaces(s1, s2));
|
||||
CATCH(errctx, akgl_compare_sdl_surfaces(s1, s2));
|
||||
} CLEANUP {
|
||||
if ( s1 != NULL )
|
||||
SDL_DestroySurface(s1);
|
||||
if ( s2 != NULL )
|
||||
SDL_DestroySurface(s2);
|
||||
IGNORE(heap_release_string(tmpstring));
|
||||
IGNORE(akgl_heap_release_string(tmpstring));
|
||||
} PROCESS(errctx) {
|
||||
} FINISH(errctx, true);
|
||||
SUCCEED_RETURN(errctx);
|
||||
|
||||
Reference in New Issue
Block a user