diff --git a/include/akgl/error.h b/include/akgl/error.h index 0a29976..73df5eb 100644 --- a/include/akgl/error.h +++ b/include/akgl/error.h @@ -10,11 +10,11 @@ // e.g., combining two element of PATH_MAX into a string buffer of AKGL_STRING_MAX_LENGTH. // We have to draw a line in the sand somewhere or we will just let our buffers grow forever // to keep the compiler happy. -#define DISABLE_GCC_WARNING_FORMAT_TRUNCATION \ - _Pragma("GCC diagnostic push") \ +#define DISABLE_GCC_WARNING_FORMAT_TRUNCATION \ + _Pragma("GCC diagnostic push") \ _Pragma("GCC diagnostic ignored \"-Wformat-truncation\"") -#define RESTORE_GCC_WARNINGS \ +#define RESTORE_GCC_WARNINGS \ _Pragma("GCC diagnostic pop") #define AKGL_ERR_SDL (AKERR_LAST_ERRNO_VALUE + 18) diff --git a/include/akgl/game.h b/include/akgl/game.h index f47894f..0d25d18 100644 --- a/include/akgl/game.h +++ b/include/akgl/game.h @@ -140,5 +140,5 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_state_unlock(void); * @throws AKERR_* Propagates an error reported by a delegated operation. */ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_update(akgl_Iterator *opflags); - + #endif //_AKGL_GAME_H_ diff --git a/include/akgl/physics.h b/include/akgl/physics.h index d1787fb..faf51c4 100644 --- a/include/akgl/physics.h +++ b/include/akgl/physics.h @@ -26,7 +26,7 @@ typedef struct akgl_PhysicsBackend { double gravity_y; double gravity_z; SDL_Time gravity_time; - SDL_Time timer_gravity; + SDL_Time timer_gravity; } akgl_PhysicsBackend; /** diff --git a/include/akgl/staticstring.h b/include/akgl/staticstring.h index e4efa6f..d8033c3 100644 --- a/include/akgl/staticstring.h +++ b/include/akgl/staticstring.h @@ -15,8 +15,8 @@ /** @brief Provides a fixed-capacity, heap-managed string buffer. */ typedef struct { - int refcount; - char data[AKGL_MAX_STRING_LENGTH]; + int refcount; + char data[AKGL_MAX_STRING_LENGTH]; } akgl_String; /** diff --git a/include/akgl/util.h b/include/akgl/util.h index 628e73e..e8e6f24 100644 --- a/include/akgl/util.h +++ b/include/akgl/util.h @@ -11,17 +11,17 @@ /** @brief Represents a two-dimensional point. */ typedef struct point { - int x; - int y; - int z; + int x; + int y; + int z; } point; /** @brief Stores the corners of an axis-aligned rectangle. */ typedef struct RectanglePoints { - point topleft; - point topright; - point bottomleft; - point bottomright; + point topleft; + point topright; + point bottomleft; + point bottomright; } RectanglePoints; #define AKGL_COLLIDE_RECTANGLES(r1x, r1y, r1w, r1h, r2x, r2y, r2w, r2h) ((r1x < (r2x + r2w)) || ((r1x + r1w) > r2x) diff --git a/src/actor.c b/src/actor.c index f520e80..3acc71c 100644 --- a/src/actor.c +++ b/src/actor.c @@ -28,14 +28,14 @@ akerr_ErrorContext *akgl_actor_initialize(akgl_Actor *obj, char *name) obj->curSpriteReversing = false; obj->scale = 1.0; obj->movement_controls_face = true; - + 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(AKGL_REGISTRY_ACTOR, name, (void *)obj), @@ -111,7 +111,7 @@ akerr_ErrorContext *akgl_actor_logic_changeframe(akgl_Actor *obj, akgl_Sprite *c } else { // we are at the end of the animation and we either loop forward or do not loop obj->curSpriteFrameId = 0; - } + } // we are not looping in reverse and we are not at the end of the animation } else { obj->curSpriteFrameId += 1; @@ -149,7 +149,7 @@ akerr_ErrorContext *akgl_actor_update(akgl_Actor *obj) PREPARE_ERROR(errctx); SDL_Time curtime = 0; 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"); @@ -169,7 +169,7 @@ akerr_ErrorContext *akgl_actor_update(akgl_Actor *obj) // or changeframefunc, both of which should never return AKERR_KEY... SUCCEED_RETURN(errctx); } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } @@ -186,10 +186,10 @@ static akerr_ErrorContext *actor_visible(akgl_Actor *obj, SDL_FRect *camera, boo { PREPARE_ERROR(errctx); akgl_Sprite *curSprite = NULL; - + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor"); FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference"); - + ATTEMPT { CATCH(errctx, akgl_character_sprite_get(obj->basechar, obj->state, &curSprite)); } CLEANUP { @@ -199,7 +199,7 @@ static akerr_ErrorContext *actor_visible(akgl_Actor *obj, SDL_FRect *camera, boo *visible = false; SUCCEED_RETURN(errctx); } FINISH(errctx, true); - + if ( (obj->x < (camera->x - curSprite->width)) || (obj->x > (camera->x + camera->w)) || (obj->y < (camera->y - curSprite->height)) || @@ -218,10 +218,10 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj) bool visible = false; SDL_FRect src; SDL_FRect dest; - + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL actor"); FAIL_ZERO_RETURN(errctx, obj->basechar, AKERR_NULLPOINTER, "Actor has NULL base character reference"); - + ATTEMPT { CATCH(errctx, akgl_character_sprite_get(obj->basechar, obj->state, &curSprite)); CATCH(errctx, actor_visible(obj, camera, &visible)); @@ -232,7 +232,7 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj) // If an actor doesn't have a sprite for a state, just log it and move on LOG_ERROR(errctx); } FINISH(errctx, true); - + if ( ! visible ) { SUCCEED_RETURN(errctx); } @@ -254,7 +254,7 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj) } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); - + if ( obj->parent != NULL ) { dest.x = (obj->parent->x + obj->x - camera->x); dest.y = (obj->parent->y + obj->y - camera->y); @@ -271,21 +271,21 @@ akerr_ErrorContext *akgl_actor_render(akgl_Actor *obj) akerr_ErrorContext *akgl_actor_add_child(akgl_Actor *obj, akgl_Actor *child) { - int i = 0; - PREPARE_ERROR(errctx); - FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL parent pointer"); - 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 < AKGL_ACTOR_MAX_CHILDREN ; i++ ) { - if ( obj->children[i] == NULL ) { - obj->children[i] = child; - child->parent = obj; - child->refcount += 1; - SUCCEED_RETURN(errctx); + int i = 0; + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL parent pointer"); + 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 < AKGL_ACTOR_MAX_CHILDREN ; i++ ) { + if ( obj->children[i] == NULL ) { + obj->children[i] = child; + child->parent = obj; + child->refcount += 1; + SUCCEED_RETURN(errctx); + } } - } - FAIL_RETURN(errctx, AKERR_OUTOFBOUNDS, "Parent object has no remaining child slots left"); + FAIL_RETURN(errctx, AKERR_OUTOFBOUNDS, "Parent object has no remaining child slots left"); } void akgl_registry_iterate_actor(void *userdata, SDL_PropertiesID registry, const char *name) diff --git a/src/assets.c b/src/assets.c index 2b09bc9..9570e21 100644 --- a/src/assets.c +++ b/src/assets.c @@ -14,46 +14,46 @@ akerr_ErrorContext *akgl_load_start_bgm(char *fname) { - PREPARE_ERROR(errctx); - //akgl_String *tmpstr = NULL; - MIX_Track *bgmtrack = NULL; - SDL_PropertiesID bgmprops = 0; + PREPARE_ERROR(errctx); + //akgl_String *tmpstr = NULL; + MIX_Track *bgmtrack = NULL; + SDL_PropertiesID bgmprops = 0; - ATTEMPT { - 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, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname); - SDL_Log("Loading music asset from %s", fname); - bgm = MIX_LoadAudio(akgl_mixer, fname, true); - FAIL_ZERO_BREAK(errctx, bgm, AKERR_NULLPOINTER, "Failed to load music asset %s : %s", fname, SDL_GetError()); + ATTEMPT { + 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)); - bgmtrack = MIX_CreateTrack(akgl_mixer); - FAIL_ZERO_BREAK(errctx, bgmtrack, AKERR_NULLPOINTER, "Failed to create audio track for background music: %s", SDL_GetError()); + //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(akgl_mixer, fname, true); + FAIL_ZERO_BREAK(errctx, bgm, AKERR_NULLPOINTER, "Failed to load music asset %s : %s", fname, SDL_GetError()); - akgl_tracks[AKGL_GAME_AUDIO_TRACK_BGM] = bgmtrack; - - FAIL_ZERO_BREAK( - errctx, - MIX_SetTrackAudio(bgmtrack, bgm), - AKGL_ERR_SDL, - "%s", - SDL_GetError()); + bgmtrack = MIX_CreateTrack(akgl_mixer); + FAIL_ZERO_BREAK(errctx, bgmtrack, AKERR_NULLPOINTER, "Failed to create audio track for background music: %s", SDL_GetError()); - SDL_SetNumberProperty(bgmprops, MIX_PROP_PLAY_LOOPS_NUMBER, -1); - - if (!MIX_PlayTrack(bgmtrack, bgmprops)) { - FAIL_BREAK(errctx, AKGL_ERR_SDL, "Failed to play music asset %s", fname); - } - } CLEANUP { - //IGNORE(akgl_heap_release_string(tmpstr)); - if ( errctx != NULL ) { - if ( errctx->status != 0 && bgm != NULL) { - MIX_DestroyAudio(bgm); - } - } - } PROCESS(errctx) { - } FINISH(errctx, true); - SUCCEED_RETURN(errctx); + akgl_tracks[AKGL_GAME_AUDIO_TRACK_BGM] = bgmtrack; + + FAIL_ZERO_BREAK( + errctx, + MIX_SetTrackAudio(bgmtrack, bgm), + AKGL_ERR_SDL, + "%s", + SDL_GetError()); + + SDL_SetNumberProperty(bgmprops, MIX_PROP_PLAY_LOOPS_NUMBER, -1); + + if (!MIX_PlayTrack(bgmtrack, bgmprops)) { + FAIL_BREAK(errctx, AKGL_ERR_SDL, "Failed to play music asset %s", fname); + } + } CLEANUP { + //IGNORE(akgl_heap_release_string(tmpstr)); + if ( errctx != NULL ) { + if ( errctx->status != 0 && bgm != NULL) { + MIX_DestroyAudio(bgm); + } + } + } PROCESS(errctx) { + } FINISH(errctx, true); + SUCCEED_RETURN(errctx); } diff --git a/src/character.c b/src/character.c index 0f0a159..3f9ea54 100644 --- a/src/character.c +++ b/src/character.c @@ -27,10 +27,10 @@ akerr_ErrorContext *akgl_character_initialize(akgl_Character *obj, char *name) 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 = &akgl_character_sprite_add; obj->sprite_get = &akgl_character_sprite_get; - + FAIL_ZERO_RETURN( errctx, SDL_SetPointerProperty(AKGL_REGISTRY_CHARACTER, name, (void *)obj), @@ -106,7 +106,7 @@ static akerr_ErrorContext *akgl_character_load_json_state_int_from_strings(json_ 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, akgl_heap_next_string(&tmpstring)); for ( i = 0; i < json_array_size((json_t *)states) ; i++ ) { @@ -140,7 +140,7 @@ static akerr_ErrorContext *akgl_character_load_json_inner(json_t *json, akgl_Cha akgl_String *tmpstr = NULL; akgl_String *tmpstr2 = NULL; int stateval = 0; - + ATTEMPT { CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &tmpstr)); CATCH(errctx, akgl_character_initialize((akgl_Character *)obj, tmpstr->data)); @@ -155,15 +155,15 @@ static akerr_ErrorContext *akgl_character_load_json_inner(json_t *json, akgl_Cha NULL ); CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &tmpstr2)); - + 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, akgl_get_json_string_value((json_t *)curmapping, "sprite", &tmpstr)); FAIL_ZERO_BREAK( errctx, spriteptr, - AKERR_NULLPOINTER, + AKERR_NULLPOINTER, "Character %s for state %b references sprite %s but not found in the registry", tmpstr2->data, stateval, @@ -190,7 +190,7 @@ akerr_ErrorContext *akgl_character_load_json(char *filename) json_error_t error; akgl_Character *obj = NULL; //akgl_String *tmpstr = NULL; - + FAIL_ZERO_RETURN(errctx, filename, AKERR_NULLPOINTER, "Received null filename"); ATTEMPT { CATCH(errctx, akgl_heap_next_character(&obj)); diff --git a/src/controller.c b/src/controller.c index c328699..2cca3f5 100644 --- a/src/controller.c +++ b/src/controller.c @@ -19,7 +19,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_list_keyboards(void) PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, keyboards, AKERR_NULLPOINTER, "%s", SDL_GetError()); - + for (int i = 0; i < count; i++) { const char *name = SDL_GetKeyboardNameForID(keyboards[i]); SDL_Log("Keyboard %d: ID %u, Name: %s\n", i, keyboards[i], name); @@ -80,7 +80,7 @@ akerr_ErrorContext *akgl_controller_handle_event(void *appstate, SDL_Event *even // This controlmap processes this control eventButtonComboMatch = ( ((event->type == SDL_EVENT_GAMEPAD_BUTTON_DOWN || - event->type == SDL_EVENT_GAMEPAD_BUTTON_UP) && + event->type == SDL_EVENT_GAMEPAD_BUTTON_UP) && event->gbutton.which == curmap->jsid && event->gbutton.button == curcontrol->button) || ((event->type == SDL_EVENT_KEY_DOWN || @@ -104,7 +104,7 @@ akerr_ErrorContext *akgl_controller_handle_event(void *appstate, SDL_Event *even } } } -_akgl_controller_handle_event_success: + _akgl_controller_handle_event_success: } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); @@ -121,7 +121,7 @@ _akgl_controller_handle_event_success: akerr_ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event) { akgl_Actor *player = NULL; - + PREPARE_ERROR(errctx); FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate"); @@ -130,39 +130,39 @@ akerr_ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event) FAIL_ZERO_RETURN(errctx, player, AKERR_NULLPOINTER, "Player actor does not exist"); if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN || - event->key.key == SDLK_DOWN ) { + event->key.key == SDLK_DOWN ) { SDL_Log("Processing dpad down : state %d", player->state); AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_DOWN); if ( !player->movement_controls_face ) { - AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL); - AKGL_BITMASK_ADD(player->state, AKGL_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 ) { + event->key.key == SDLK_UP ) { SDL_Log("Processing dpad up"); AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_UP); if ( !player->movement_controls_face ) { - AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL); - AKGL_BITMASK_ADD(player->state, AKGL_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 ) { + event->key.key == SDLK_LEFT ) { SDL_Log("Processing dpad left"); AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_LEFT); if ( !player->movement_controls_face ) { - AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL); - AKGL_BITMASK_ADD(player->state, AKGL_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 ) { + event->key.key == SDLK_RIGHT ) { SDL_Log("Processing dpad right"); AKGL_BITMASK_ADD(player->state, AKGL_ACTOR_STATE_MOVING_RIGHT); if ( !player->movement_controls_face ) { - AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_FACE_ALL); - AKGL_BITMASK_ADD(player->state, AKGL_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); } @@ -179,7 +179,7 @@ akerr_ErrorContext *gamepad_handle_button_down(void *appstate, SDL_Event *event) akerr_ErrorContext *gamepad_handle_button_up(void *appstate, SDL_Event *event) { akgl_Actor *player = NULL; - + PREPARE_ERROR(errctx); FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate"); @@ -188,25 +188,25 @@ akerr_ErrorContext *gamepad_handle_button_up(void *appstate, SDL_Event *event) FAIL_ZERO_RETURN(errctx, player, AKERR_NULLPOINTER, "Player actor does not exist"); if ( event->gbutton.button == SDL_GAMEPAD_BUTTON_DPAD_DOWN || - event->key.key == SDLK_DOWN ) { + event->key.key == SDLK_DOWN ) { SDL_Log("processing down release"); 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 ) { + event->key.key == SDLK_UP ) { SDL_Log("processing up release"); 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) { + event->key.key == SDLK_RIGHT) { SDL_Log("processing right release"); 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 ) { + event->key.key == SDLK_LEFT ) { SDL_Log("processing left release"); AKGL_BITMASK_DEL(player->state, AKGL_ACTOR_STATE_MOVING_LEFT); player->curSpriteFrameId = 0; @@ -227,24 +227,24 @@ akerr_ErrorContext *gamepad_handle_added(void *appstate, SDL_Event *event) SDL_JoystickID which; SDL_Gamepad *gamepad = NULL; char *mapping = NULL; - + PREPARE_ERROR(errctx); FAIL_ZERO_RETURN(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate"); FAIL_ZERO_RETURN(errctx, event, AKERR_NULLPOINTER, "NULL event"); - + which = event->gbutton.which; gamepad = SDL_GetGamepadFromID(which); - + if (!gamepad) { SDL_Log("Gamepad #%u add, but not opened: %s", (unsigned int) which, SDL_GetError()); gamepad = SDL_OpenGamepad(which); SDL_Log("Gamepad #%u opened: %s", (unsigned int) which, SDL_GetError()); mapping = SDL_GetGamepadMapping(gamepad); if ( mapping == NULL ) { - SDL_Log("Gamepad #%u has no mapping!", (unsigned int) which); + SDL_Log("Gamepad #%u has no mapping!", (unsigned int) which); } else if ( mapping != NULL ) { - SDL_Log("Gamepad #%u mapping : %s", (unsigned int) which, mapping); - SDL_free(mapping); + SDL_Log("Gamepad #%u mapping : %s", (unsigned int) which, mapping); + SDL_free(mapping); } } else { SDL_Log("Gamepad #%u ('%s') added", (unsigned int) which, SDL_GetGamepadName(gamepad)); @@ -270,7 +270,7 @@ akerr_ErrorContext *gamepad_handle_removed(void *appstate, SDL_Event *event) which = event->gbutton.which; gamepad = SDL_GetGamepadFromID(which); - + if (gamepad) { SDL_CloseGamepad(gamepad); /* the joystick was unplugged. */ } @@ -292,14 +292,14 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_pushmap(int controlmapid, akg } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); - SUCCEED_RETURN(errctx); + SUCCEED_RETURN(errctx); } akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, char *actorname, int kbid, int jsid) { akgl_ControlMap *controlmap; akgl_Control control; - + PREPARE_ERROR(errctx); ATTEMPT { // set up the control map @@ -308,12 +308,12 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha controlmap = &GAME_ControlMaps[controlmapid]; controlmap->kbid = kbid; controlmap->jsid = jsid; - + controlmap->target = SDL_GetPointerProperty(AKGL_REGISTRY_ACTOR, actorname, NULL); FAIL_ZERO_BREAK(errctx, controlmap->target, AKGL_ERR_REGISTRY, "Actor %s not found in registry", actorname); // ---- KEYBOARD CONTROLS ---- - + // Move down control.key = SDLK_DOWN; control.event_on = SDL_EVENT_KEY_DOWN; @@ -329,7 +329,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha 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; @@ -337,7 +337,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha 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; @@ -363,7 +363,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha 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; @@ -371,7 +371,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha 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; @@ -379,9 +379,9 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_controller_default(int controlmapid, cha 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); - + } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); diff --git a/src/draw.c b/src/draw.c index e7b9b01..52e6820 100644 --- a/src/draw.c +++ b/src/draw.c @@ -12,8 +12,8 @@ void akgl_draw_background(int w, int h) { SDL_Color col[2] = { - { 0x66, 0x66, 0x66, 0xff }, - { 0x99, 0x99, 0x99, 0xff }, + { 0x66, 0x66, 0x66, 0xff }, + { 0x99, 0x99, 0x99, 0xff }, }; int i, x, y; SDL_FRect rect; @@ -22,14 +22,14 @@ void akgl_draw_background(int w, int h) rect.w = (float)dx; rect.h = (float)dy; for (y = 0; y < h; y += dy) { - for (x = 0; x < w; x += dx) { - /* use an 8x8 checkerboard pattern */ - i = (((x ^ y) >> 3) & 1); - SDL_SetRenderDrawColor(renderer->sdl_renderer, col[i].r, col[i].g, col[i].b, col[i].a); + for (x = 0; x < w; x += dx) { + /* use an 8x8 checkerboard pattern */ + i = (((x ^ y) >> 3) & 1); + SDL_SetRenderDrawColor(renderer->sdl_renderer, col[i].r, col[i].g, col[i].b, col[i].a); - rect.x = (float)x; - rect.y = (float)y; - SDL_RenderFillRect(renderer->sdl_renderer, &rect); - } + rect.x = (float)x; + rect.y = (float)y; + SDL_RenderFillRect(renderer->sdl_renderer, &rect); + } } } diff --git a/src/game.c b/src/game.c index e34ae21..ea36527 100644 --- a/src/game.c +++ b/src/game.c @@ -52,7 +52,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init() { int screenwidth = 0; int screenheight = 0; - + int i = 0; PREPARE_ERROR(e); strncpy((char *)&game.libversion, AKGL_VERSION, 32); @@ -75,13 +75,13 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init() PASS(e, akgl_registry_init_music()); PASS(e, akgl_registry_init_properties()); PASS(e, akgl_registry_init_actor_state_strings()); - + SDL_SetAppMetadata(game.name, game.version, game.uri); for ( i = 0 ; i < AKGL_MAX_CONTROL_MAPS; i++ ) { memset(&GAME_ControlMaps[i], 0x00, sizeof(akgl_ControlMap)); } - + FAIL_ZERO_RETURN( e, SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD | SDL_INIT_AUDIO), @@ -123,7 +123,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_init() renderer = &_akgl_renderer; physics = &_akgl_physics; gamemap = &_akgl_gamemap; - + PASS(e, akgl_game_state_unlock()); SUCCEED_RETURN(e); } @@ -358,27 +358,27 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_load_objectnamemap(FILE *fp, SDL_Pr // corrupt name table as a successful load. while ( done == false ) { ATTEMPT { - CATCH(e, aksl_fread((void *)&objname, 1, namelength, fp)); - CATCH(e, aksl_fread((void *)&ptr, 1, ptrlength, fp)); - // End of the map - if ( ptr == 0x00 && objname[0] == 0x00 ) { - done = true; - break; - } - // The map allows us to say "Object X has a reference to object Y at - // address Z. The object they had at address Z was named A. Our current - // instance of object named A is at address B. So we map address Z to - // address B, so that we can reconnect function pointers on objects loaded - // from the save game state." - - // SDL_Properties objects can only use string keys, so we can't use the - // old pointer as a key without first converting it to a string. - CATCH(e, aksl_memset((void *)&ptrstring, 0x00, 32)); - snprintf((char *)&ptrstring, 32, "%p", ptr); - SDL_SetPointerProperty( - map, - ptrstring, - SDL_GetPointerProperty(registry, objname, NULL)); + CATCH(e, aksl_fread((void *)&objname, 1, namelength, fp)); + CATCH(e, aksl_fread((void *)&ptr, 1, ptrlength, fp)); + // End of the map + if ( ptr == 0x00 && objname[0] == 0x00 ) { + done = true; + break; + } + // The map allows us to say "Object X has a reference to object Y at + // address Z. The object they had at address Z was named A. Our current + // instance of object named A is at address B. So we map address Z to + // address B, so that we can reconnect function pointers on objects loaded + // from the save game state." + + // SDL_Properties objects can only use string keys, so we can't use the + // old pointer as a key without first converting it to a string. + CATCH(e, aksl_memset((void *)&ptrstring, 0x00, 32)); + snprintf((char *)&ptrstring, 32, "%p", ptr); + SDL_SetPointerProperty( + map, + ptrstring, + SDL_GetPointerProperty(registry, objname, NULL)); } CLEANUP { } PROCESS(e) { } FINISH(e, true); @@ -404,9 +404,9 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_load_versioncmp(char *versiontype, FAIL_ZERO_RETURN(e, versiontype, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, curversion, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, newversion, AKERR_NULLPOINTER, "NULL argument"); - + ATTEMPT { - // Check save game library version + // Check save game library version FAIL_NONZERO_BREAK( e, semver_parse((const char *)curversion, ¤t_version), @@ -445,10 +445,10 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_load(char *fpath) SDL_PropertiesID spritesheetmap; SDL_PropertiesID charactermap; FILE *fp = NULL; - + PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, fpath, AKERR_NULLPOINTER, "NULL file path"); - + ATTEMPT { CATCH(e, aksl_fopen(fpath, "rb", &fp)); CATCH(e, aksl_fread((void *)&savegame, 1, sizeof(akgl_Game), fp)); @@ -464,28 +464,28 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_load(char *fpath) strncmp((char *)&savegame.uri, (char *)&game.uri, 256), AKERR_API, "Savegame is not compatible with this game"); - + memcpy((void *)&game, (void *)&savegame, sizeof(akgl_Game)); // Load actor name map actormap = SDL_CreateProperties(); - CATCH(e, akgl_game_load_objectnamemap(fp, actormap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Actor *), AKGL_REGISTRY_ACTOR)); + CATCH(e, akgl_game_load_objectnamemap(fp, actormap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Actor *), AKGL_REGISTRY_ACTOR)); // Load sprite name map spritemap = SDL_CreateProperties(); - CATCH(e, akgl_game_load_objectnamemap(fp, spritemap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Sprite *), AKGL_REGISTRY_SPRITE)); + CATCH(e, akgl_game_load_objectnamemap(fp, spritemap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Sprite *), AKGL_REGISTRY_SPRITE)); // Load spritesheet name map spritesheetmap = SDL_CreateProperties(); - CATCH(e, akgl_game_load_objectnamemap(fp, spritesheetmap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_SpriteSheet *), AKGL_REGISTRY_SPRITESHEET)); + CATCH(e, akgl_game_load_objectnamemap(fp, spritesheetmap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_SpriteSheet *), AKGL_REGISTRY_SPRITESHEET)); // Load character name map charactermap = SDL_CreateProperties(); - CATCH(e, akgl_game_load_objectnamemap(fp, charactermap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Character *), AKGL_REGISTRY_CHARACTER)); - // Now that we have all of our pointer maps built, we can load the actual binary objects and reset their pointers + CATCH(e, akgl_game_load_objectnamemap(fp, charactermap, AKGL_ACTOR_MAX_NAME_LENGTH, sizeof(akgl_Character *), AKGL_REGISTRY_CHARACTER)); + // Now that we have all of our pointer maps built, we can load the actual binary objects and reset their pointers } CLEANUP { if ( fp != NULL ) { fclose(fp); } } PROCESS(e) { } FINISH(e, true); - + SUCCEED_RETURN(e); } @@ -502,7 +502,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_update(akgl_Iterator *opflags) if ( opflags == NULL ) { opflags = &defflags; } - + PASS(e, akgl_game_state_lock()); akgl_game_updateFPS(); @@ -521,8 +521,8 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_game_update(akgl_Iterator *opflags) } else { actor->scale = 1.0; } - PASS(e, actor->updatefunc(actor)); - } + PASS(e, actor->updatefunc(actor)); + } } PASS(e, physics->simulate(physics, NULL)); PASS(e, renderer->draw_world(renderer, NULL)); diff --git a/src/heap.c b/src/heap.c index c61c83b..87a4794 100644 --- a/src/heap.c +++ b/src/heap.c @@ -146,7 +146,7 @@ akerr_ErrorContext *akgl_heap_release_character(akgl_Character *basechar) akgl_Iterator opflags; FAIL_ZERO_RETURN(errctx, basechar, AKERR_NULLPOINTER, "NULL character reference"); AKGL_BITMASK_CLEAR(opflags.flags); - + if ( basechar->refcount > 0 ) { basechar->refcount -= 1; } @@ -201,4 +201,3 @@ akerr_ErrorContext *akgl_heap_release_string(akgl_String *ptr) } SUCCEED_RETURN(errctx); } - diff --git a/src/json_helpers.c b/src/json_helpers.c index 2503857..af46851 100644 --- a/src/json_helpers.c +++ b/src/json_helpers.c @@ -15,135 +15,135 @@ 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"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_object(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = value; - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_object(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = value; + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_boolean(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = json_boolean_value(value); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_boolean(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = json_boolean_value(value); + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_integer(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = json_integer_value(value); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL object pointer"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_integer(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = json_integer_value(value); + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_number(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = json_number_value(value); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_number(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = json_number_value(value); + SUCCEED_RETURN(errctx); } akerr_ErrorContext AKERR_NOIGNORE *akgl_get_json_double_value(json_t *obj, char *key, double *dest) { - PREPARE_ERROR(errctx); - FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_number(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = json_number_value(value); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_number(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = json_number_value(value); + SUCCEED_RETURN(errctx); } akerr_ErrorContext *akgl_get_json_string_value(json_t *obj, char *key, akgl_String **dest) { - json_t *value = NULL; - PREPARE_ERROR(errctx); - FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); - FAIL_ZERO_RETURN(errctx, key, AKERR_NULLPOINTER, "NULL pointer reference"); - FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = NULL; + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); + FAIL_ZERO_RETURN(errctx, key, AKERR_NULLPOINTER, "NULL pointer reference"); + FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL pointer reference"); - value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - ATTEMPT { - if ( *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), AKGL_MAX_STRING_LENGTH); - SUCCEED_RETURN(errctx); + value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + ATTEMPT { + if ( *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), AKGL_MAX_STRING_LENGTH); + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_object_get(obj, key); - FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); - FAIL_ZERO_RETURN(errctx, (json_is_array(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); - *dest = value; - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = json_object_get(obj, key); + FAIL_ZERO_RETURN(errctx, value, AKERR_KEY, "Key %s not found in object", key); + FAIL_ZERO_RETURN(errctx, (json_is_array(value)), AKERR_TYPE, "Key %s in object has incorrect type", key); + *dest = value; + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_array_get(array, index); - FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); - FAIL_ZERO_RETURN(errctx, (json_is_object(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); - *dest = value; - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = json_array_get(array, index); + FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); + FAIL_ZERO_RETURN(errctx, (json_is_object(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); + *dest = value; + SUCCEED_RETURN(errctx); } 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"); - json_t *value = json_array_get(array, index); - FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); - FAIL_ZERO_RETURN(errctx, (json_is_integer(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); - *dest = json_integer_value(value); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference"); + json_t *value = json_array_get(array, index); + FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); + FAIL_ZERO_RETURN(errctx, (json_is_integer(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); + *dest = json_integer_value(value); + SUCCEED_RETURN(errctx); } 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"); - FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL destination pointer reference"); - json_t *value = json_array_get(array, index); - FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); - FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); - ATTEMPT { - if ( *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), AKGL_MAX_STRING_LENGTH); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, array, AKERR_NULLPOINTER, "NULL pointer reference"); + FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL destination pointer reference"); + json_t *value = json_array_get(array, index); + FAIL_ZERO_RETURN(errctx, value, AKERR_OUTOFBOUNDS, "Index %d out of bounds for array", index); + FAIL_ZERO_RETURN(errctx, (json_is_string(value)), AKERR_TYPE, "Index %d in object has incorrect type", index); + ATTEMPT { + if ( *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), AKGL_MAX_STRING_LENGTH); + SUCCEED_RETURN(errctx); } akerr_ErrorContext AKERR_NOIGNORE *akgl_get_json_with_default(akerr_ErrorContext *err, void *defval, void *dest, uint32_t defsize) @@ -153,11 +153,11 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_get_json_with_default(akerr_ErrorContext SUCCEED_RETURN(e); } int docopy = 0; - + FAIL_ZERO_RETURN(e, err, AKERR_NULLPOINTER, "err"); FAIL_ZERO_RETURN(e, defval, AKERR_NULLPOINTER, "defval"); FAIL_ZERO_RETURN(e, dest, AKERR_NULLPOINTER, "dest"); - + ATTEMPT { } CLEANUP { } PROCESS(err) { @@ -165,6 +165,6 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_get_json_with_default(akerr_ErrorContext } HANDLE_GROUP(err, AKERR_INDEX) { memcpy(dest, defval, defsize); } FINISH(err, true); - + SUCCEED_RETURN(e); } diff --git a/src/physics.c b/src/physics.c index dd5296f..7be8778 100644 --- a/src/physics.c +++ b/src/physics.c @@ -37,7 +37,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_init_null(akgl_PhysicsBackend *s { PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, self, AKERR_NULLPOINTER, "self"); - + self->gravity = akgl_physics_null_gravity; self->collide = akgl_physics_null_collide; self->move = akgl_physics_null_move; @@ -65,7 +65,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_arcade_gravity(akgl_PhysicsBacke // Assume Z origin is - (behind the camera) actor->ez -= (self->gravity_z * dt); } - + SUCCEED_RETURN(e); } @@ -84,7 +84,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_arcade_move(struct akgl_PhysicsB FAIL_ZERO_RETURN(e, actor, AKERR_NULLPOINTER, "actor"); actor->x += actor->vx * dt; actor->y += actor->vy * dt; - actor->z += actor->vz * dt; + actor->z += actor->vz * dt; SUCCEED_RETURN(e); } @@ -94,7 +94,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_init_arcade(akgl_PhysicsBackend PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, self, AKERR_NULLPOINTER, "self"); PASS(e, akgl_heap_next_string(&tmp)); - + self->gravity = akgl_physics_arcade_gravity; self->collide = akgl_physics_arcade_collide; self->move = akgl_physics_arcade_move; @@ -117,7 +117,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_init_arcade(akgl_PhysicsBackend IGNORE(akgl_heap_release_string(tmp)); } PROCESS(e) { } FINISH(e, true); - + SUCCEED_RETURN(e); } @@ -143,8 +143,8 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_simulate(akgl_PhysicsBackend *se if ( opflags == NULL ) { opflags = &defflags; } - - + + for ( int i = 0; i < AKGL_MAX_HEAP_ACTOR; i++ ) { actor = &HEAP_ACTOR[i]; if ( actor->refcount == 0 ) { @@ -164,21 +164,21 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_simulate(akgl_PhysicsBackend *se continue; } } - + // thrust is a function of acceleration on a given axis if ( AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_LEFT) || - AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_RIGHT) ) { + AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_RIGHT) ) { actor->tx += actor->ax * dt; } if ( AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_UP) || - AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_DOWN) ) { + AKGL_BITMASK_HAS(actor->state, AKGL_ACTOR_STATE_MOVING_DOWN) ) { actor->ty += actor->ay * dt; } // velocity equals thrust unless thrust exceeds max speed if ( fabsf(actor->tx) > fabsf(actor->sx) ) { if ( actor->tx < 0 ) { - actor->tx = -actor->sx; + actor->tx = -actor->sx; } else { actor->tx = actor->sx; } @@ -216,14 +216,14 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_simulate(akgl_PhysicsBackend *se actor->vy = actor->ey + actor->ty; actor->vz = actor->ez + actor->tz; - PASS(e, self->move(self, actor, dt)); + PASS(e, self->move(self, actor, dt)); } CLEANUP { } PROCESS(e) { } HANDLE(e, AKGL_ERR_LOGICINTERRUPT) { // noop } FINISH(e, true); } - self->gravity_time = curtime; + self->gravity_time = curtime; SUCCEED_RETURN(e); } @@ -233,7 +233,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_physics_factory(akgl_PhysicsBackend *sel PREPARE_ERROR(e); FAIL_ZERO_RETURN(e, self, AKERR_NULLPOINTER, "self"); FAIL_ZERO_RETURN(e, type, AKERR_NULLPOINTER, "type"); - + if ( strncmp(type->data, "null", 4) == 0) { PASS(e, akgl_physics_init_null(self)); SUCCEED_RETURN(e); diff --git a/src/registry.c b/src/registry.c index ffc3681..1607b01 100644 --- a/src/registry.c +++ b/src/registry.c @@ -95,7 +95,7 @@ akerr_ErrorContext *akgl_registry_init_actor_state_strings() akerr_ErrorContext *akgl_registry_init_sprite() { - PREPARE_ERROR(errctx); + PREPARE_ERROR(errctx); AKGL_REGISTRY_SPRITE = SDL_CreateProperties(); FAIL_ZERO_RETURN(errctx, AKGL_REGISTRY_SPRITE, AKERR_NULLPOINTER, "Error initializing sprite registry"); SUCCEED_RETURN(errctx); @@ -123,7 +123,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_registry_load_properties(char *fname) json_t *props = NULL; const char *pkey = NULL; json_t *pvalue = NULL; - + json_error_t error; akgl_String *tmpstr; @@ -189,4 +189,3 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_get_property(char *name, akgl_String **d } FINISH(e, true); SUCCEED_RETURN(e); } - diff --git a/src/renderer.c b/src/renderer.c index 8f70a45..f44fafd 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -30,14 +30,14 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_render_init2d(akgl_RenderBackend *self) SDL_Log("Initializing screen (%sx%s = %dx%d)", width->data, height->data, screenwidth, screenheight); PASS(e, akgl_heap_release_string(width)); PASS(e, akgl_heap_release_string(height)); - + FAIL_ZERO_RETURN( e, SDL_CreateWindowAndRenderer(game.uri, screenwidth, screenheight, 0, &window, &self->sdl_renderer), AKGL_ERR_SDL, "Couldn't create window/renderer: %s", SDL_GetError()); - + camera->x = 0; camera->y = 0; camera->w = screenwidth; @@ -133,9 +133,9 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_render_2d_draw_world(akgl_RenderBackend if ( actor->layer != i ) { continue; } - PASS(e, actor->renderfunc(actor)); + PASS(e, actor->renderfunc(actor)); } } - - SUCCEED_RETURN(e); + + SUCCEED_RETURN(e); } diff --git a/src/sprite.c b/src/sprite.c index ce3a949..01bfa59 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -85,10 +85,10 @@ static akerr_ErrorContext *akgl_sprite_load_json_spritesheet(json_t *json, akgl_ IGNORE(akgl_heap_release_string(tmpstr)); } PROCESS(errctx) { } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } - + akerr_ErrorContext *akgl_sprite_load_json(char *filename) { PREPARE_ERROR(errctx); @@ -100,7 +100,7 @@ akerr_ErrorContext *akgl_sprite_load_json(char *filename) akgl_String *spritename = NULL; akgl_String *filename_copy = NULL; int i = 0; - + FAIL_ZERO_RETURN(errctx, filename, AKERR_NULLPOINTER, "Received null filename"); ATTEMPT { CATCH(errctx, akgl_heap_next_sprite(&obj)); @@ -125,7 +125,7 @@ akerr_ErrorContext *akgl_sprite_load_json(char *filename) AKERR_NULLPOINTER, "Error while loading sprite from %s on line %d: %s", filename, error.line, error.text ); - + CATCH(errctx, akgl_sprite_load_json_spritesheet((json_t *)json, &sheet, dirname(filename_copy->data))); CATCH(errctx, akgl_get_json_string_value((json_t *)json, "name", &spritename)); CATCH(errctx, @@ -134,14 +134,14 @@ akerr_ErrorContext *akgl_sprite_load_json(char *filename) spritename->data, (akgl_SpriteSheet *)sheet) ); - + 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", &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, 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++ ) { @@ -166,7 +166,7 @@ akerr_ErrorContext *akgl_sprite_initialize(akgl_Sprite *spr, char *name, akgl_Sp 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(akgl_Sprite)); memcpy(spr->name, name, AKGL_SPRITE_MAX_NAME_LENGTH); spr->sheet = sheet; @@ -191,14 +191,14 @@ akerr_ErrorContext *akgl_spritesheet_initialize(akgl_SpriteSheet *sheet, int spr memset(sheet, 0x00, sizeof(akgl_SpriteSheet)); //CATCH(errctx, akgl_heap_next_string(&tmpstr)); - + //CATCH(errctx, akgl_string_initialize(tmpstr, NULL)); strncpy((char *)&sheet->name, filename, AKGL_SPRITE_SHEET_MAX_FILENAME_LENGTH); - + //snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), filename); sheet->texture = IMG_LoadTexture(renderer->sdl_renderer, filename); FAIL_ZERO_BREAK(errctx, sheet->texture, AKGL_ERR_SDL, "Failed loading asset %s : %s", filename, SDL_GetError()); - + FAIL_ZERO_BREAK( errctx, SDL_SetPointerProperty(AKGL_REGISTRY_SPRITESHEET, (char *)sheet->name, (void *)sheet), diff --git a/src/staticstring.c b/src/staticstring.c index 002ae81..8dd51cf 100644 --- a/src/staticstring.c +++ b/src/staticstring.c @@ -9,15 +9,15 @@ 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, AKGL_MAX_STRING_LENGTH); - } else { - memset(&obj->data, 0x00, sizeof(akgl_String)); - } - obj->refcount = 1; - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, obj, AKERR_NULLPOINTER, "Attempted to initialize NULL string reference"); + if ( init != NULL ) { + strncpy((char *)&obj->data, init, AKGL_MAX_STRING_LENGTH); + } else { + memset(&obj->data, 0x00, sizeof(akgl_String)); + } + obj->refcount = 1; + SUCCEED_RETURN(errctx); } akerr_ErrorContext *akgl_string_copy(akgl_String *src, akgl_String *dst, int count) diff --git a/src/text.c b/src/text.c index 8cf305e..4bf6dfe 100644 --- a/src/text.c +++ b/src/text.c @@ -13,7 +13,7 @@ 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"); @@ -35,7 +35,7 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_text_rendertextat(TTF_Font *font, char * 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"); diff --git a/src/tilemap.c b/src/tilemap.c index 8aa135f..380dd1c 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -60,7 +60,7 @@ akerr_ErrorContext *akgl_get_json_tilemap_property(json_t *obj, char *key, char } } PROCESS(errctx) { } FINISH(errctx, true); - + FAIL_RETURN(errctx, AKERR_KEY, "Property not found in properties map"); } @@ -68,12 +68,12 @@ akerr_ErrorContext *akgl_get_json_properties_string(json_t *obj, char *key, akgl { PREPARE_ERROR(errctx); json_t *property; - + PASS(errctx, akgl_get_json_tilemap_property(obj, key, "string", &property)); PASS(errctx, akgl_heap_next_string(dest)); PASS(errctx, akgl_string_initialize(*dest, NULL)); PASS(errctx, akgl_get_json_string_value(property, "value", dest)); - + SUCCEED_RETURN(errctx); } @@ -83,7 +83,7 @@ akerr_ErrorContext *akgl_get_json_properties_integer(json_t *obj, char *key, int json_t *property = NULL; PASS(errctx, akgl_get_json_tilemap_property(obj, key, "int", &property)); PASS(errctx, akgl_get_json_integer_value(property, "value", dest)); - + SUCCEED_RETURN(errctx); } @@ -101,7 +101,7 @@ akerr_ErrorContext *akgl_get_json_properties_number(json_t *obj, char *key, floa json_t *property = NULL; PASS(errctx, akgl_get_json_tilemap_property(obj, key, "number", &property)); PASS(errctx, akgl_get_json_number_value(property, "value", dest)); - + SUCCEED_RETURN(errctx); } @@ -119,7 +119,7 @@ akerr_ErrorContext *akgl_get_json_properties_float(json_t *obj, char *key, float json_t *property = NULL; PASS(errctx, akgl_get_json_tilemap_property(obj, key, "float", &property)); PASS(errctx, akgl_get_json_number_value(property, "value", dest)); - + SUCCEED_RETURN(errctx); } @@ -137,7 +137,7 @@ akerr_ErrorContext *akgl_get_json_properties_double(json_t *obj, char *key, doub json_t *property = NULL; PASS(errctx, akgl_get_json_tilemap_property(obj, key, "float", &property)); PASS(errctx, akgl_get_json_double_value(property, "value", dest)); - + SUCCEED_RETURN(errctx); } @@ -146,7 +146,7 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilema PREPARE_ERROR(e); akgl_String *tmpstr = NULL; akgl_String *tmppath = NULL; - + PASS(e, akgl_get_json_integer_value((json_t *)tileset, "columns", &dest->tilesets[tsidx].columns)); PASS(e, akgl_get_json_integer_value((json_t *)tileset, "firstgid", &dest->tilesets[tsidx].firstgid)); PASS(e, akgl_get_json_integer_value((json_t *)tileset, "imageheight", &dest->tilesets[tsidx].imageheight)); @@ -164,8 +164,8 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilema (char *)&tmpstr->data, AKGL_TILEMAP_MAX_TILESET_NAME_SIZE ); - - CATCH(e, akgl_get_json_string_value((json_t *)tileset, "image", &tmpstr)); + + CATCH(e, akgl_get_json_string_value((json_t *)tileset, "image", &tmpstr)); CATCH(e, akgl_path_relative((char *)&dirname->data, (char *)&tmpstr->data, tmppath)); strncpy((char *)&dest->tilesets[tsidx].imagefilename, tmppath->data, AKGL_MAX_STRING_LENGTH); } CLEANUP { @@ -173,10 +173,10 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilema IGNORE(akgl_heap_release_string(tmppath)); } PROCESS(e) { } FINISH(e, true); - + dest->tilesets[tsidx].texture = IMG_LoadTexture(renderer->sdl_renderer, (char *)&dest->tilesets[tsidx].imagefilename); FAIL_ZERO_RETURN(e, dest->tilesets[tsidx].texture, AKERR_NULLPOINTER, "Failed loading tileset image : %s", SDL_GetError()); - + SUCCEED_RETURN(e); } @@ -199,7 +199,7 @@ akerr_ErrorContext *akgl_tilemap_compute_tileset_offsets(akgl_Tilemap *dest, int for (j = 0; j <= (dest->tilesets[tilesetidx].tilecount); j++) { /* * For a given 8x2 tilemap like this with 10x10 tiles and 0 spacing and 0 margin - * + * * 01234567 * 89ABCDEF * @@ -221,7 +221,7 @@ akerr_ErrorContext *akgl_tilemap_compute_tileset_offsets(akgl_Tilemap *dest, int x_offset = (j * (dest->tilesets[tilesetidx].tilewidth + dest->tilesets[tilesetidx].spacing)); y_offset = dest->tilesets[tilesetidx].spacing; } - + dest->tilesets[tilesetidx].tile_offsets[j][0] = x_offset; dest->tilesets[tilesetidx].tile_offsets[j][1] = y_offset; /* SDL_Log("Tileset %s index (%d, %d) is offset (%d, %d)", @@ -233,8 +233,8 @@ akerr_ErrorContext *akgl_tilemap_compute_tileset_offsets(akgl_Tilemap *dest, int // SDL_Log("Processed %d total tiles for tileset", j); } SUCCEED_RETURN(errctx); -} - +} + akerr_ErrorContext *akgl_tilemap_load_tilesets(akgl_Tilemap *dest, json_t *root, akgl_String *dirname) { PREPARE_ERROR(errctx); @@ -244,7 +244,7 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets(akgl_Tilemap *dest, json_t *root, json_t *tilesets = NULL; json_t *jstileset = NULL; int i; - + dest->numtilesets = 0; ATTEMPT { CATCH(errctx, akgl_get_json_array_value(root, "tilesets", &tilesets)) @@ -257,7 +257,7 @@ akerr_ErrorContext *akgl_tilemap_load_tilesets(akgl_Tilemap *dest, json_t *root, } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } @@ -275,7 +275,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_object_actor(akgl_TilemapObject *cur PREPARE_ERROR(errctx); akgl_String *tmpstr = NULL; akgl_Actor *actorobj = NULL; - + 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"); @@ -304,7 +304,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_object_actor(akgl_TilemapObject *cur } } PROCESS(errctx) { } FINISH(errctx, true); - + actorobj->layer = layerid; actorobj->x = curobj->x; actorobj->y = curobj->y; @@ -340,7 +340,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_objects(akgl_Tilemap *dest, json_t * PASS(errctx, akgl_get_json_number_value((json_t *)layerdatavalue, "x", &curobj->x)); PASS(errctx, akgl_get_json_number_value((json_t *)layerdatavalue, "y", &curobj->y)); PASS(errctx, akgl_get_json_boolean_value((json_t *)layerdatavalue, "visible", &curobj->visible)); - + PASS(errctx, akgl_get_json_string_value((json_t *)layerdatavalue, "type", &tmpstr)); if ( strcmp(tmpstr->data, "actor") == 0 ) { PASS(errctx, akgl_tilemap_load_layer_object_actor(curobj, layerdatavalue, layerid, dirname)); @@ -354,11 +354,11 @@ akerr_ErrorContext *akgl_tilemap_load_layer_objects(akgl_Tilemap *dest, json_t * dest->p_vanishing_y = curobj->y; PASS(errctx, akgl_get_json_integer_value((json_t *)layerdatavalue, "height", &dest->p_vanishing_h)); PASS(errctx, akgl_get_json_properties_float((json_t *)layerdatavalue, "scale", &dest->p_vanishing_scale)); - } - } + } + } layerdatavalue = NULL; } - + SUCCEED_RETURN(errctx); } @@ -387,7 +387,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_tile(akgl_Tilemap *dest, json_t *roo } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } @@ -417,15 +417,15 @@ akerr_ErrorContext *akgl_tilemap_load_layer_image(akgl_Tilemap *dest, json_t *ro CATCH(errctx, akgl_get_json_string_value(root, "image", &tmpstr)); DISABLE_GCC_WARNING_FORMAT_TRUNCATION - snprintf((char *)&fpath->data, - AKGL_TILEMAP_MAX_TILESET_FILENAME_SIZE, - "%s/%s", - dirname->data, - tmpstr->data - ); + snprintf((char *)&fpath->data, + AKGL_TILEMAP_MAX_TILESET_FILENAME_SIZE, + "%s/%s", + dirname->data, + tmpstr->data + ); RESTORE_GCC_WARNINGS - - dest->layers[layerid].texture = IMG_LoadTexture(renderer->sdl_renderer, (char *)fpath->data); + + dest->layers[layerid].texture = IMG_LoadTexture(renderer->sdl_renderer, (char *)fpath->data); FAIL_ZERO_BREAK(errctx, dest->layers[layerid].texture, AKGL_ERR_SDL, "%s", SDL_GetError()); dest->layers[layerid].width = dest->layers[layerid].texture->w; dest->layers[layerid].height = dest->layers[layerid].texture->h; @@ -434,7 +434,7 @@ akerr_ErrorContext *akgl_tilemap_load_layer_image(akgl_Tilemap *dest, json_t *ro IGNORE(akgl_heap_release_string(fpath)); } PROCESS(errctx) { } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } @@ -450,7 +450,7 @@ akerr_ErrorContext *akgl_tilemap_load_layers(akgl_Tilemap *dest, json_t *root, a int i; int layerid = 0; int tmpint = 0; - + ATTEMPT { CATCH(errctx, akgl_get_json_array_value(root, "layers", &layers)); dest->numlayers = json_array_size((json_t *)layers); @@ -500,7 +500,7 @@ akerr_ErrorContext *akgl_tilemap_load_physics(akgl_Tilemap *dest, json_t *root) json_t *props = NULL; akgl_String *tmpval = NULL; double defzero = 0.0; - + ATTEMPT { CATCH(e, akgl_heap_next_string(&tmpval)); CATCH(e, akgl_get_json_array_value((json_t *)root, "properties", &props)); @@ -523,7 +523,7 @@ akerr_ErrorContext *akgl_tilemap_load_physics(akgl_Tilemap *dest, json_t *root) ); PASS(e, akgl_physics_factory(&dest->physics, tmpval)); dest->use_own_physics = true; - + CATCH(e, akgl_get_json_with_default( akgl_get_json_properties_double( root, "physics.gravity.x", &dest->physics.gravity_x @@ -572,7 +572,7 @@ akerr_ErrorContext *akgl_tilemap_load_physics(akgl_Tilemap *dest, json_t *root) } HANDLE(e, AKERR_KEY) { SDL_Log("Map uses game physics"); } FINISH(e, true); - + SUCCEED_RETURN(e); } @@ -583,7 +583,7 @@ akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest) //akgl_String *tmpstr = NULL; json_error_t error; akgl_String *dirnamestr = NULL; - + FAIL_ZERO_RETURN(errctx, fname, AKERR_NULLPOINTER, "load_tilemap received null filename"); FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "load_tilemap received null tilemap"); @@ -598,7 +598,7 @@ akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest) //SDL_snprintf(tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), fname); CATCH(errctx, aksl_realpath(fname, (char *)&dirnamestr->data)); dirname((char *)&dirnamestr->data); - + json = json_load_file(fname, 0, &error); FAIL_ZERO_BREAK( errctx, @@ -696,13 +696,13 @@ akerr_ErrorContext *akgl_tilemap_draw(akgl_Tilemap *map, SDL_FRect *viewport, in dest.x = 0; dest.y = 0; src.w = map->layers[layeridx].width; - src.h = map->layers[layeridx].height; + src.h = map->layers[layeridx].height; dest.w = map->layers[layeridx].width; dest.h = map->layers[layeridx].height; PASS(errctx, renderer->draw_texture(renderer, map->layers[layeridx].texture, &src, &dest, 0, NULL, SDL_FLIP_NONE)); SUCCEED_RETURN(errctx); } - + dest.x = 0; dest.y = 0; dest.w = map->tilewidth; @@ -778,7 +778,7 @@ akerr_ErrorContext *akgl_tilemap_draw_tileset(akgl_Tilemap *map, int tilesetidx) 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 // FIXME: These conditionals are probably not very efficient. Need a better way of getting diff --git a/src/util.c b/src/util.c index ee7ad7e..5b8f3aa 100644 --- a/src/util.c +++ b/src/util.c @@ -38,14 +38,14 @@ akerr_ErrorContext *akgl_path_relative_root(char *root, char *path, akgl_String int rootlen; int pathlen; int count; - + FAIL_ZERO_RETURN(e, root, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, path, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, dst, AKERR_NULLPOINTER, "NULL argument"); PASS(e, akgl_heap_next_string(&strbuf)); PASS(e, akgl_heap_next_string(&pathbuf)); - + ATTEMPT { // Is it relative to the root? rootlen = strlen(root); @@ -54,10 +54,10 @@ akerr_ErrorContext *akgl_path_relative_root(char *root, char *path, akgl_String FAIL_RETURN(e, AKERR_OUTOFBOUNDS, "Total path length (%d) is greater than maximum akgl_String length (%d)", (rootlen + pathlen), AKGL_MAX_STRING_LENGTH); } DISABLE_GCC_WARNING_FORMAT_TRUNCATION - CATCH(e, aksl_sprintf(&count, (char *)&pathbuf->data, "%s/%s", root, path)); + CATCH(e, aksl_sprintf(&count, (char *)&pathbuf->data, "%s/%s", root, path)); RESTORE_GCC_WARNINGS - CATCH(e, aksl_realpath((char *)&pathbuf->data, (char *)&strbuf->data)); - CATCH(e, akgl_string_copy(strbuf, dst, 0)); + CATCH(e, aksl_realpath((char *)&pathbuf->data, (char *)&strbuf->data)); + CATCH(e, akgl_string_copy(strbuf, dst, 0)); } CLEANUP { IGNORE(akgl_heap_release_string(strbuf)); IGNORE(akgl_heap_release_string(pathbuf)); @@ -71,18 +71,18 @@ akerr_ErrorContext *akgl_path_relative(char *root, char *path, akgl_String *dst) PREPARE_ERROR(e); akgl_String *strbuf; char *result; - + FAIL_ZERO_RETURN(e, root, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, path, AKERR_NULLPOINTER, "NULL argument"); FAIL_ZERO_RETURN(e, dst, AKERR_NULLPOINTER, "NULL argument"); PASS(e, akgl_heap_next_string(&strbuf)); - + ATTEMPT { // Is path relative to our current working directory? CATCH(e, aksl_realpath(path, (char *)&strbuf->data)); // Yes it is. strbuf->data contains the absolute path. - CATCH(e, akgl_string_copy(strbuf, dst, 0)); + CATCH(e, akgl_string_copy(strbuf, dst, 0)); } CLEANUP { IGNORE(akgl_heap_release_string(strbuf)); } PROCESS(e) { @@ -111,102 +111,102 @@ akerr_ErrorContext *akgl_path_relative_from(char *path, char *from, akgl_String PASS(e, akgl_heap_next_string(&dirnamestr)); PASS(e, aksl_realpath(from, (char *)&dirnamestr->data)); dirname((char *)&dirnamestr->data); - + SUCCEED_RETURN(e); } akerr_ErrorContext *akgl_rectangle_points(RectanglePoints *dest, SDL_FRect *rect) { - PREPARE_ERROR(errctx); - FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL RectanglePoints reference"); - FAIL_ZERO_RETURN(errctx, rect, AKERR_NULLPOINTER, "NULL Rectangle reference"); - dest->topleft.x = rect->x; - dest->topleft.y = rect->y; - dest->bottomleft.x = rect->x; - dest->bottomleft.y = rect->y + rect->h; - dest->topright.x = rect->x + rect->w; - dest->topright.y = rect->y; - dest->bottomright.x = rect->x + rect->w; - dest->bottomright.y = rect->y + rect->h; - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "NULL RectanglePoints reference"); + FAIL_ZERO_RETURN(errctx, rect, AKERR_NULLPOINTER, "NULL Rectangle reference"); + dest->topleft.x = rect->x; + dest->topleft.y = rect->y; + dest->bottomleft.x = rect->x; + dest->bottomleft.y = rect->y + rect->h; + dest->topright.x = rect->x + rect->w; + dest->topright.y = rect->y; + dest->bottomright.x = rect->x + rect->w; + dest->bottomright.y = rect->y + rect->h; + SUCCEED_RETURN(errctx); } 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"); - FAIL_ZERO_RETURN(errctx, rp, AKERR_NULLPOINTER, "NULL RectanglePoints reference"); - FAIL_ZERO_RETURN(errctx, collide, AKERR_NULLPOINTER, "NULL boolean reference"); - if ( (p->x >= rp->topleft.x) && (p->y >= rp->topleft.y) && - (p->x <= rp->bottomright.x) && (p->y <= rp->bottomright.y) ) { - *collide = true; - } else { - *collide = false; - } - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, p, AKERR_NULLPOINTER, "NULL Point reference"); + FAIL_ZERO_RETURN(errctx, rp, AKERR_NULLPOINTER, "NULL RectanglePoints reference"); + FAIL_ZERO_RETURN(errctx, collide, AKERR_NULLPOINTER, "NULL boolean reference"); + if ( (p->x >= rp->topleft.x) && (p->y >= rp->topleft.y) && + (p->x <= rp->bottomright.x) && (p->y <= rp->bottomright.y) ) { + *collide = true; + } else { + *collide = false; + } + SUCCEED_RETURN(errctx); } akerr_ErrorContext *akgl_collide_rectangles(SDL_FRect *r1, SDL_FRect *r2, bool *collide) { - RectanglePoints r1p; - RectanglePoints r2p; - PREPARE_ERROR(errctx); - FAIL_ZERO_RETURN(errctx, r1, AKERR_NULLPOINTER, "NULL rectangle reference"); - FAIL_ZERO_RETURN(errctx, r2, AKERR_NULLPOINTER, "NULL rectangle reference"); - FAIL_ZERO_RETURN(errctx, collide, AKERR_NULLPOINTER, "NULL collision flag reference"); - - ATTEMPT { - 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, 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, 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, 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, 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, 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, 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, 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, akgl_collide_point_rectangle(&r2p.bottomright, &r1p, collide)); - if ( *collide == true ) { SUCCEED_RETURN(errctx); } + RectanglePoints r1p; + RectanglePoints r2p; + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, r1, AKERR_NULLPOINTER, "NULL rectangle reference"); + FAIL_ZERO_RETURN(errctx, r2, AKERR_NULLPOINTER, "NULL rectangle reference"); + FAIL_ZERO_RETURN(errctx, collide, AKERR_NULLPOINTER, "NULL collision flag reference"); - } CLEANUP { - } PROCESS(errctx) { - } FINISH(errctx, true); - - *collide = false; - SUCCEED_RETURN(errctx); + ATTEMPT { + 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, 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, 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, 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, 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, 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, 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, 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, akgl_collide_point_rectangle(&r2p.bottomright, &r1p, collide)); + if ( *collide == true ) { SUCCEED_RETURN(errctx); } + + } CLEANUP { + } PROCESS(errctx) { + } FINISH(errctx, true); + + *collide = false; + SUCCEED_RETURN(errctx); } 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"); - FAIL_ZERO_RETURN(errctx, s2, AKERR_NULLPOINTER, "NULL Surface pointer"); - FAIL_NONZERO_RETURN(errctx, memcmp(s1->pixels, s2->pixels, (s1->pitch * s1->h)), AKERR_VALUE, "Comparison surfaces are not equal"); - SUCCEED_RETURN(errctx); + PREPARE_ERROR(errctx); + FAIL_ZERO_RETURN(errctx, s1, AKERR_NULLPOINTER, "NULL Surface pointer"); + FAIL_ZERO_RETURN(errctx, s2, AKERR_NULLPOINTER, "NULL Surface pointer"); + FAIL_NONZERO_RETURN(errctx, memcmp(s1->pixels, s2->pixels, (s1->pitch * s1->h)), AKERR_VALUE, "Comparison surfaces are not equal"); + SUCCEED_RETURN(errctx); } akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, int x, int y, int w, int h, char *writeout) @@ -228,7 +228,7 @@ akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, in CATCH(errctx, renderer->draw_texture(renderer, t1, &src, &dest, 0, NULL, SDL_FLIP_NONE)); s1 = SDL_RenderReadPixels(renderer->sdl_renderer, &read); FAIL_ZERO_BREAK(errctx, s1, AKGL_ERR_SDL, "Failed to read pixels from renderer"); - + if ( writeout != NULL ) { snprintf((char *)&tmpstring->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), writeout); FAIL_ZERO_BREAK( @@ -239,13 +239,13 @@ akerr_ErrorContext *akgl_render_and_compare(SDL_Texture *t1, SDL_Texture *t2, in (char *)&tmpstring->data, SDL_GetError()); } - + SDL_RenderClear(renderer->sdl_renderer); - + CATCH(errctx, renderer->draw_texture(renderer, t1, &src, &dest, 0, NULL, SDL_FLIP_NONE)); s2 = SDL_RenderReadPixels(renderer->sdl_renderer, &read); FAIL_ZERO_BREAK(errctx, s2, AKGL_ERR_SDL, "Failed to read pixels from renderer"); - + CATCH(errctx, akgl_compare_sdl_surfaces(s1, s2)); } CLEANUP { if ( s1 != NULL ) diff --git a/tests/actor.c b/tests/actor.c index 82ddd1e..085ea34 100644 --- a/tests/actor.c +++ b/tests/actor.c @@ -1,4 +1,4 @@ -#define UNHANDLED_ERROR_TERMINATION_BEHAVIOR \ +#define UNHANDLED_ERROR_TERMINATION_BEHAVIOR \ handle_unhandled_error(errctx); #include @@ -58,7 +58,7 @@ akerr_ErrorContext *akgl_actor_render_noop(akgl_Actor *obj) akerr_ErrorContext *test_registry_actor_iterator_nullpointers(void) { PREPARE_ERROR(errctx); - + akerr_ErrorUnhandledErrorHandler defaulthandler = akerr_handler_unhandled_error; akerr_handler_unhandled_error = handle_unhandled_error_noexit; @@ -151,7 +151,7 @@ akerr_ErrorContext *test_registry_actor_iterator_updaterender(void) } FINISH(unhandled_error_context, true); akerr_handler_unhandled_error = defaulthandler; - + SUCCEED_RETURN(errctx); } @@ -159,7 +159,7 @@ akerr_ErrorContext *test_akgl_actor_set_character(void) { akgl_Actor *testactor = NULL; akgl_Character *testchar = NULL; - + PREPARE_ERROR(errctx); ATTEMPT { @@ -167,10 +167,10 @@ akerr_ErrorContext *test_akgl_actor_set_character(void) } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Handled\n"); + printf("Handled\n"); } FINISH(errctx, true); - + ATTEMPT { CATCH(errctx, akgl_heap_next_actor(&testactor)); @@ -178,13 +178,13 @@ akerr_ErrorContext *test_akgl_actor_set_character(void) testactor->layer = 0; testactor->updatefunc = &akgl_actor_update_noop; testactor->renderfunc = &akgl_actor_render_noop; - + CATCH(errctx, akgl_actor_set_character(testactor, "test")); } CLEANUP { - IGNORE(akgl_heap_release_actor(testactor)); + IGNORE(akgl_heap_release_actor(testactor)); } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Handled\n"); + printf("Handled\n"); } FINISH(errctx, true); ATTEMPT { @@ -195,13 +195,13 @@ akerr_ErrorContext *test_akgl_actor_set_character(void) testactor->layer = 0; testactor->updatefunc = &akgl_actor_update_noop; testactor->renderfunc = &akgl_actor_render_noop; - + CATCH(errctx, akgl_character_initialize(testchar, "test")); - + CATCH(errctx, akgl_actor_set_character(testactor, "test")); } CLEANUP { - IGNORE(akgl_heap_release_actor(testactor)); - IGNORE(akgl_heap_release_character(testchar)); + IGNORE(akgl_heap_release_actor(testactor)); + IGNORE(akgl_heap_release_character(testchar)); } PROCESS(errctx) { } FINISH(errctx, true); @@ -248,7 +248,7 @@ akerr_ErrorContext *test_actor_manage_children(void) // Expected behavior SDL_Log("addchild throws AKERR_RELATIONSHIP when child already has a parent"); } FINISH(errctx, true); - + ATTEMPT { CATCH(errctx, akgl_heap_next_actor(&child)); CATCH(errctx, parent->addchild(parent, child)); @@ -284,7 +284,7 @@ akerr_ErrorContext *test_actor_manage_children(void) "Child %s was not removed from the registry", (char *)&tmpstring->data); } -_test_actor_addchild_heaprelease_cleanup: + _test_actor_addchild_heaprelease_cleanup: } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); @@ -309,7 +309,7 @@ _test_actor_addchild_heaprelease_cleanup: } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); - + SUCCEED_RETURN(errctx); } diff --git a/tests/bitmasks.c b/tests/bitmasks.c index 92a95a2..0a4c9cd 100644 --- a/tests/bitmasks.c +++ b/tests/bitmasks.c @@ -3,29 +3,29 @@ int main(void) { - int mask = 0; - AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_ALIVE); - if ( mask != AKGL_ACTOR_STATE_ALIVE ) - return 1; - AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_LEFT); - if ( mask != (AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_FACE_LEFT) ) - return 1; - AKGL_BITMASK_DEL(mask, AKGL_ACTOR_STATE_ALIVE); - if ( mask != (AKGL_ACTOR_STATE_FACE_LEFT) ) - return 1; - AKGL_BITMASK_CLEAR(mask); - if ( mask != 0 ) - return 1; - AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_LEFT); - if ( !(AKGL_BITMASK_HAS(mask, AKGL_ACTOR_STATE_FACE_LEFT)) ) - return 1; - mask = AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_FACE_UP; - AKGL_BITMASK_DEL(mask, AKGL_ACTOR_STATE_FACE_ALL); - if ( mask != AKGL_ACTOR_STATE_ALIVE ) - return 1; - AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_MOVING_DOWN); - AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_DOWN); - if ( mask != (AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_MOVING_DOWN | AKGL_ACTOR_STATE_FACE_DOWN) ) - return 1; - return 0; + int mask = 0; + AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_ALIVE); + if ( mask != AKGL_ACTOR_STATE_ALIVE ) + return 1; + AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_LEFT); + if ( mask != (AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_FACE_LEFT) ) + return 1; + AKGL_BITMASK_DEL(mask, AKGL_ACTOR_STATE_ALIVE); + if ( mask != (AKGL_ACTOR_STATE_FACE_LEFT) ) + return 1; + AKGL_BITMASK_CLEAR(mask); + if ( mask != 0 ) + return 1; + AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_LEFT); + if ( !(AKGL_BITMASK_HAS(mask, AKGL_ACTOR_STATE_FACE_LEFT)) ) + return 1; + mask = AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_FACE_UP; + AKGL_BITMASK_DEL(mask, AKGL_ACTOR_STATE_FACE_ALL); + if ( mask != AKGL_ACTOR_STATE_ALIVE ) + return 1; + AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_MOVING_DOWN); + AKGL_BITMASK_ADD(mask, AKGL_ACTOR_STATE_FACE_DOWN); + if ( mask != (AKGL_ACTOR_STATE_ALIVE | AKGL_ACTOR_STATE_MOVING_DOWN | AKGL_ACTOR_STATE_FACE_DOWN) ) + return 1; + return 0; } diff --git a/tests/character.c b/tests/character.c index 955bc98..2cb4412 100644 --- a/tests/character.c +++ b/tests/character.c @@ -86,7 +86,7 @@ akerr_ErrorContext *test_character_iterate_state_sprites() akgl_Sprite *testsprite = NULL; akgl_Sprite *testsprite2 = NULL; akgl_Iterator opflags = {.flags = AKGL_ITERATOR_OP_RELEASE, .layerid = 0}; - + PREPARE_ERROR(errctx); ATTEMPT { CATCH(errctx, akgl_heap_next_character(&testchar)); @@ -126,7 +126,7 @@ akerr_ErrorContext *test_character_iterate_state_sprites() } CLEANUP { IGNORE(akgl_heap_release_sprite(testsprite)); IGNORE(akgl_heap_release_sprite(testsprite2)); - IGNORE(akgl_heap_release_character(testchar)); + IGNORE(akgl_heap_release_character(testchar)); } PROCESS(errctx) { } FINISH(errctx, true); SUCCEED_RETURN(errctx); @@ -140,7 +140,7 @@ akerr_ErrorContext *test_akgl_character_load_json() akgl_Sprite *comparesprite = NULL; int tsrc = 0; int tsrc2 = 0; - + PREPARE_ERROR(errctx); ATTEMPT { CATCH(errctx, akgl_heap_next_character(&testcharacter)); @@ -158,7 +158,7 @@ akerr_ErrorContext *test_akgl_character_load_json() testsprite2, AKERR_KEY, "Sprite 2 loaded from json but not in registry"); - + CATCH(errctx, akgl_character_load_json("assets/testcharacter.json")); testcharacter = SDL_GetPointerProperty(AKGL_REGISTRY_CHARACTER, "testcharacter", NULL); FAIL_ZERO_BREAK( @@ -196,11 +196,11 @@ int main(void) PREPARE_ERROR(errctx); ATTEMPT { SDL_SetAppMetadata("SDL3-GameTest", "0.1", "net.aklabs.sdl3-gametest"); - + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO )) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't initialize SDL: %s", SDL_GetError()); } - + if (!SDL_CreateWindowAndRenderer("net/aklabs/libakgl/test_character", 640, 480, SDL_WINDOW_HIDDEN, &window, &renderer)) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't create window/renderer: %s", SDL_GetError()); } diff --git a/tests/charviewer.c b/tests/charviewer.c index a688668..102e63a 100644 --- a/tests/charviewer.c +++ b/tests/charviewer.c @@ -19,14 +19,14 @@ int numsprites = 8; char *spritepaths[] = { - "assets/sprites/little_guy_walking_left.json", - "assets/sprites/little_guy_walking_right.json", - "assets/sprites/little_guy_walking_up.json", - "assets/sprites/little_guy_walking_down.json", - "assets/sprites/little_guy_facing_left.json", - "assets/sprites/little_guy_facing_right.json", - "assets/sprites/little_guy_facing_up.json", - "assets/sprites/little_guy_facing_down.json" + "assets/sprites/little_guy_walking_left.json", + "assets/sprites/little_guy_walking_right.json", + "assets/sprites/little_guy_walking_up.json", + "assets/sprites/little_guy_walking_down.json", + "assets/sprites/little_guy_facing_left.json", + "assets/sprites/little_guy_facing_right.json", + "assets/sprites/little_guy_facing_up.json", + "assets/sprites/little_guy_facing_down.json" }; int main(void) @@ -34,15 +34,15 @@ int main(void) PREPARE_ERROR(errctx); SDL3GControlMap *controlmap; actor *actorptr = NULL; - + ATTEMPT { - + SDL_SetAppMetadata("SDL3-GameTest", "0.1", "net.aklabs.sdl3-gametest"); - + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO )) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't initialize SDL: %s", SDL_GetError()); } - + if (!SDL_CreateWindowAndRenderer("net/aklabs/libakgl/test_sprite", 640, 480, 0, &window, &renderer)) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't create window/renderer: %s", SDL_GetError()); } @@ -55,7 +55,7 @@ int main(void) strcpy((char *)&game.uri, "net.aklabs.libakgl.charviewer"); game.screenwidth = 640; game.screenheight = 480; - + CATCH(errctx, akgl_GAME_init()); for ( int i = 0; i < numsprites ; i++) { @@ -96,7 +96,7 @@ int main(void) controlmap->controls[1].target_del_state_off = AKGL_ACTOR_STATE_MOVING_UP; controlmap->controls[1].event_on = SDL_EVENT_KEY_DOWN; controlmap->controls[1].event_off = SDL_EVENT_KEY_UP; - + // Move left controlmap->controls[2].key = SDLK_LEFT; //controlmap->controls[2].target_state_gate = AKGL_ACTOR_STATE_MOVING_LEFT; @@ -105,13 +105,13 @@ int main(void) controlmap->controls[2].target_del_state_off = AKGL_ACTOR_STATE_MOVING_LEFT; controlmap->controls[2].event_on = SDL_EVENT_KEY_DOWN; controlmap->controls[2].event_off = SDL_EVENT_KEY_UP; - + // Move right controlmap->controls[3].key = SDLK_RIGHT; //controlmap->controls[3].target_state_gate = AKGL_ACTOR_STATE_MOVING_RIGHT; controlmap->controls[3].target_add_state_on = AKGL_ACTOR_STATE_MOVING_RIGHT | AKGL_ACTOR_STATE_FACE_RIGHT; controlmap->controls[3].target_del_state_on = AKGL_ACTOR_STATE_MOVING_LEFT | AKGL_ACTOR_STATE_FACE_ALL; - controlmap->controls[3].target_del_state_off = AKGL_ACTOR_STATE_MOVING_RIGHT; + controlmap->controls[3].target_del_state_off = AKGL_ACTOR_STATE_MOVING_RIGHT; controlmap->controls[3].event_on = SDL_EVENT_KEY_DOWN; controlmap->controls[3].event_off = SDL_EVENT_KEY_UP; } CLEANUP { @@ -120,6 +120,6 @@ int main(void) LOG_ERROR(errctx); return 1; } FINISH_NORETURN(errctx); - + return 0; } diff --git a/tests/registry.c b/tests/registry.c index 345fb0f..44b353d 100644 --- a/tests/registry.c +++ b/tests/registry.c @@ -17,7 +17,7 @@ akerr_ErrorContext *test_akgl_registry_init(RegistryFuncPtr funcptr) SDL_calloc_func calloc_func; SDL_realloc_func realloc_func; SDL_free_func free_func; - + SDL_GetMemoryFunctions( &malloc_func, &calloc_func, @@ -54,7 +54,7 @@ akerr_ErrorContext *test_akgl_registry_init_creation_failures(void) } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Sucess\n"); + printf("Sucess\n"); } FINISH(errctx, true); ATTEMPT { @@ -62,7 +62,7 @@ akerr_ErrorContext *test_akgl_registry_init_creation_failures(void) } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Sucess\n"); + printf("Sucess\n"); } FINISH(errctx, true); ATTEMPT { @@ -70,7 +70,7 @@ akerr_ErrorContext *test_akgl_registry_init_creation_failures(void) } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Sucess\n"); + printf("Sucess\n"); } FINISH(errctx, true); ATTEMPT { @@ -78,7 +78,7 @@ akerr_ErrorContext *test_akgl_registry_init_creation_failures(void) } CLEANUP { } PROCESS(errctx) { } HANDLE(errctx, AKERR_NULLPOINTER) { - printf("Sucess\n"); + printf("Sucess\n"); } FINISH(errctx, true); SUCCEED_RETURN(errctx); } diff --git a/tests/sprite.c b/tests/sprite.c index fcdd575..d03f935 100644 --- a/tests/sprite.c +++ b/tests/sprite.c @@ -16,53 +16,53 @@ akerr_ErrorContext *test_akgl_spritesheet_initialize(void) { - PREPARE_ERROR(errctx); - akgl_SpriteSheet *sheet = NULL; - SDL_Texture *image = NULL; - akgl_String *tmpstr = NULL; - // Does the image file get loaded? - // Is the image file loaded correctly? (Surface comparison) - // Is the spritesheet in the registry? - ATTEMPT { - CATCH(errctx, akgl_heap_next_spritesheet(&sheet)); - CATCH(errctx, akgl_heap_next_string(&tmpstr)); - - snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); - CATCH(errctx, akgl_spritesheet_initialize(sheet, 48, 48, "assets/spritesheet.png")); - FAIL_ZERO_BREAK(errctx, sheet->texture, AKERR_VALUE, "akgl_spritesheet_initialize failed to load the sprite texture"); - FAIL_NONZERO_BREAK( - errctx, - ((sheet->texture->w != 576) || (sheet->texture->h != 384)), - AKERR_VALUE, - "Loaded texture was not the correct size"); - - snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); - image = IMG_LoadTexture(renderer->sdl_renderer, (char *)&tmpstr->data); - FAIL_ZERO_BREAK(errctx, image, AKGL_ERR_SDL, "Failed to load comparison image"); + PREPARE_ERROR(errctx); + akgl_SpriteSheet *sheet = NULL; + SDL_Texture *image = NULL; + akgl_String *tmpstr = NULL; + // Does the image file get loaded? + // Is the image file loaded correctly? (Surface comparison) + // Is the spritesheet in the registry? + ATTEMPT { + CATCH(errctx, akgl_heap_next_spritesheet(&sheet)); + CATCH(errctx, akgl_heap_next_string(&tmpstr)); - CATCH( - errctx, - akgl_render_and_compare( - sheet->texture, - image, - 0, 0, 576, 384, - "test_spritesheet_loaded_image.png") - ); + snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); + CATCH(errctx, akgl_spritesheet_initialize(sheet, 48, 48, "assets/spritesheet.png")); + FAIL_ZERO_BREAK(errctx, sheet->texture, AKERR_VALUE, "akgl_spritesheet_initialize failed to load the sprite texture"); + FAIL_NONZERO_BREAK( + errctx, + ((sheet->texture->w != 576) || (sheet->texture->h != 384)), + AKERR_VALUE, + "Loaded texture was not the correct size"); - FAIL_ZERO_BREAK( - errctx, - SDL_GetPointerProperty(AKGL_REGISTRY_SPRITESHEET, "assets/spritesheet.png", NULL), - AKERR_KEY, - "Spritesheet was not placed in the registry"); - - } CLEANUP { - IGNORE(akgl_heap_release_string(tmpstr)); - IGNORE(akgl_heap_release_spritesheet(sheet)); - if ( image != NULL ) - SDL_DestroyTexture(image); - } PROCESS(errctx) { - } FINISH(errctx, true); - SUCCEED_RETURN(errctx); + snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); + image = IMG_LoadTexture(renderer->sdl_renderer, (char *)&tmpstr->data); + FAIL_ZERO_BREAK(errctx, image, AKGL_ERR_SDL, "Failed to load comparison image"); + + CATCH( + errctx, + akgl_render_and_compare( + sheet->texture, + image, + 0, 0, 576, 384, + "test_spritesheet_loaded_image.png") + ); + + FAIL_ZERO_BREAK( + errctx, + SDL_GetPointerProperty(AKGL_REGISTRY_SPRITESHEET, "assets/spritesheet.png", NULL), + AKERR_KEY, + "Spritesheet was not placed in the registry"); + + } CLEANUP { + IGNORE(akgl_heap_release_string(tmpstr)); + IGNORE(akgl_heap_release_spritesheet(sheet)); + if ( image != NULL ) + SDL_DestroyTexture(image); + } PROCESS(errctx) { + } FINISH(errctx, true); + SUCCEED_RETURN(errctx); } akerr_ErrorContext *test_akgl_sprite_initialize(void) @@ -71,28 +71,28 @@ akerr_ErrorContext *test_akgl_sprite_initialize(void) akgl_SpriteSheet *testsheet = NULL; akgl_Sprite *testsprite = NULL; akgl_String *tmpstr = NULL; - + // Does the sprite get loaded? // Do all frames of the sprite get loaded? // Are all the frames of the sprite what we expect? (Surface comparison) // Is the sprite added to the registry? ATTEMPT { - CATCH(errctx, akgl_heap_next_spritesheet(&testsheet)); - CATCH(errctx, akgl_heap_next_sprite(&testsprite)); - CATCH(errctx, akgl_heap_next_string(&tmpstr)); - - snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); - CATCH(errctx, akgl_spritesheet_initialize(testsheet, 48, 48, "assets/spritesheet.png")); - FAIL_ZERO_BREAK(errctx, testsheet, AKERR_VALUE, "akgl_spritesheet_initialize failed"); + CATCH(errctx, akgl_heap_next_spritesheet(&testsheet)); + CATCH(errctx, akgl_heap_next_sprite(&testsprite)); + CATCH(errctx, akgl_heap_next_string(&tmpstr)); + + snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); + CATCH(errctx, akgl_spritesheet_initialize(testsheet, 48, 48, "assets/spritesheet.png")); + FAIL_ZERO_BREAK(errctx, testsheet, AKERR_VALUE, "akgl_spritesheet_initialize failed"); + + CATCH(errctx, akgl_sprite_initialize(testsprite, "test", testsheet)); + FAIL_NONZERO_BREAK(errctx, (testsprite->sheet != testsheet), AKERR_VALUE, "Initialized sprite uses wrong sheet"); + FAIL_ZERO_BREAK( + errctx, + SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "test", NULL), + AKERR_KEY, + "Sprite was not placed in the registry"); - CATCH(errctx, akgl_sprite_initialize(testsprite, "test", testsheet)); - FAIL_NONZERO_BREAK(errctx, (testsprite->sheet != testsheet), AKERR_VALUE, "Initialized sprite uses wrong sheet"); - FAIL_ZERO_BREAK( - errctx, - SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "test", NULL), - AKERR_KEY, - "Sprite was not placed in the registry"); - } CLEANUP { IGNORE(akgl_heap_release_sprite(testsprite)); IGNORE(akgl_heap_release_string(tmpstr)); @@ -108,65 +108,65 @@ akerr_ErrorContext *test_akgl_sprite_load_json(void) akgl_Sprite *testsprite2 = NULL; akgl_String *tmpstr = NULL; SDL_Texture *image = NULL; - + // Does the sprite get loaded? // Do all frames of the sprite get loaded? // Are all the frames of the sprite what we expect? (Surface comparison) // Is the sprite added to the registry? ATTEMPT { - CATCH(errctx, akgl_heap_next_string(&tmpstr)); - - CATCH(errctx, akgl_sprite_load_json("assets/testsprite.json")); - testsprite = SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "testsprite", NULL); - FAIL_ZERO_BREAK( - errctx, - testsprite, - AKERR_KEY, - "akgl_sprite_load_json succeeds but sprite is not placed in the registry"); + CATCH(errctx, akgl_heap_next_string(&tmpstr)); - FAIL_ZERO_BREAK(errctx, (testsprite->width == 48), AKERR_VALUE, "width incorrect (48 : %d)", testsprite->width); - FAIL_ZERO_BREAK(errctx, (testsprite->height == 48), AKERR_VALUE, "height incorrect (48 : %d)", testsprite->height); - FAIL_ZERO_BREAK(errctx, (testsprite->speed == 100000000), AKERR_VALUE, "speed incorrect (100 : %d)", testsprite->speed); - FAIL_ZERO_BREAK(errctx, (testsprite->loop == true), AKERR_VALUE, "loop incorrect (1 : %d)", testsprite->loop); - FAIL_ZERO_BREAK(errctx, (testsprite->loopReverse == true), AKERR_VALUE, "loopReverse incorrect (1 : %d)", testsprite->loopReverse); - FAIL_ZERO_BREAK(errctx, (testsprite->frames == 3), AKERR_VALUE, "frame count incorrect (3 : %d)", testsprite->frames); - FAIL_ZERO_BREAK(errctx, (testsprite->frameids[0] == 12), AKERR_VALUE, "frameids[0] incorrect (12 : %d)", testsprite->frameids[0]); - FAIL_ZERO_BREAK(errctx, (testsprite->frameids[1] == 13), AKERR_VALUE, "frameids[1] incorrect (13 : %d)", testsprite->frameids[1]); - FAIL_ZERO_BREAK(errctx, (testsprite->frameids[2] == 14), AKERR_VALUE, "frameids[2] incorrect (14 : %d)", testsprite->frameids[2]); - FAIL_NONZERO_BREAK(errctx, strcmp(testsprite->name, "testsprite"), AKERR_VALUE, "name incorrect (testsprite : %s)", (char *)testsprite->name); + CATCH(errctx, akgl_sprite_load_json("assets/testsprite.json")); + testsprite = SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "testsprite", NULL); + FAIL_ZERO_BREAK( + errctx, + testsprite, + AKERR_KEY, + "akgl_sprite_load_json succeeds but sprite is not placed in the registry"); - // Is it using the right spritesheet? - - snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); - image = IMG_LoadTexture(renderer->sdl_renderer, (char *)&tmpstr->data); - FAIL_ZERO_BREAK(errctx, image, AKGL_ERR_SDL, "Failed to load comparison image"); + FAIL_ZERO_BREAK(errctx, (testsprite->width == 48), AKERR_VALUE, "width incorrect (48 : %d)", testsprite->width); + FAIL_ZERO_BREAK(errctx, (testsprite->height == 48), AKERR_VALUE, "height incorrect (48 : %d)", testsprite->height); + FAIL_ZERO_BREAK(errctx, (testsprite->speed == 100000000), AKERR_VALUE, "speed incorrect (100 : %d)", testsprite->speed); + FAIL_ZERO_BREAK(errctx, (testsprite->loop == true), AKERR_VALUE, "loop incorrect (1 : %d)", testsprite->loop); + FAIL_ZERO_BREAK(errctx, (testsprite->loopReverse == true), AKERR_VALUE, "loopReverse incorrect (1 : %d)", testsprite->loopReverse); + FAIL_ZERO_BREAK(errctx, (testsprite->frames == 3), AKERR_VALUE, "frame count incorrect (3 : %d)", testsprite->frames); + FAIL_ZERO_BREAK(errctx, (testsprite->frameids[0] == 12), AKERR_VALUE, "frameids[0] incorrect (12 : %d)", testsprite->frameids[0]); + FAIL_ZERO_BREAK(errctx, (testsprite->frameids[1] == 13), AKERR_VALUE, "frameids[1] incorrect (13 : %d)", testsprite->frameids[1]); + FAIL_ZERO_BREAK(errctx, (testsprite->frameids[2] == 14), AKERR_VALUE, "frameids[2] incorrect (14 : %d)", testsprite->frameids[2]); + FAIL_NONZERO_BREAK(errctx, strcmp(testsprite->name, "testsprite"), AKERR_VALUE, "name incorrect (testsprite : %s)", (char *)testsprite->name); - CATCH( - errctx, - akgl_render_and_compare( - testsprite->sheet->texture, - image, - 0, 0, 576, 384, - "test_sprite_loaded_from_json_sheet.png" - ) - ); + // Is it using the right spritesheet? - // If we load a second sprite using the same sheet name, do they use the same sheet in memory? - snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/testsprite2.json"); - CATCH(errctx, akgl_sprite_load_json("assets/testsprite2.json")); - testsprite2 = SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "testsprite2", NULL); - FAIL_ZERO_BREAK( - errctx, - testsprite, - AKERR_KEY, - "akgl_sprite_load_json succeeds but second sprite is not placed in the registry"); + snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/spritesheet.png"); + image = IMG_LoadTexture(renderer->sdl_renderer, (char *)&tmpstr->data); + FAIL_ZERO_BREAK(errctx, image, AKGL_ERR_SDL, "Failed to load comparison image"); + + CATCH( + errctx, + akgl_render_and_compare( + testsprite->sheet->texture, + image, + 0, 0, 576, 384, + "test_sprite_loaded_from_json_sheet.png" + ) + ); + + // If we load a second sprite using the same sheet name, do they use the same sheet in memory? + snprintf((char *)&tmpstr->data, AKGL_MAX_STRING_LENGTH, "%s%s", SDL_GetBasePath(), "assets/testsprite2.json"); + CATCH(errctx, akgl_sprite_load_json("assets/testsprite2.json")); + testsprite2 = SDL_GetPointerProperty(AKGL_REGISTRY_SPRITE, "testsprite2", NULL); + FAIL_ZERO_BREAK( + errctx, + testsprite, + AKERR_KEY, + "akgl_sprite_load_json succeeds but second sprite is not placed in the registry"); + + FAIL_ZERO_BREAK( + errctx, + (testsprite->sheet == testsprite2->sheet), + AKERR_VALUE, + "Previously loaded spritesheets are not reused"); - FAIL_ZERO_BREAK( - errctx, - (testsprite->sheet == testsprite2->sheet), - AKERR_VALUE, - "Previously loaded spritesheets are not reused"); - } CLEANUP { if ( testsprite != NULL ) { IGNORE(akgl_heap_release_sprite(testsprite)); @@ -185,16 +185,16 @@ akerr_ErrorContext *test_akgl_sprite_load_json(void) int main(void) { PREPARE_ERROR(errctx); - + ATTEMPT { renderer = &_akgl_renderer; - + SDL_SetAppMetadata("SDL3-GameTest", "0.1", "net.aklabs.sdl3-gametest"); - + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO )) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't initialize SDL: %s", SDL_GetError()); } - + if (!SDL_CreateWindowAndRenderer("net/aklabs/libakgl/test_sprite", 640, 480, 0, &window, &renderer->sdl_renderer)) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't create window/renderer: %s", SDL_GetError()); } diff --git a/tests/staticstring.c b/tests/staticstring.c index 6eab9d2..da94cca 100644 --- a/tests/staticstring.c +++ b/tests/staticstring.c @@ -8,19 +8,19 @@ void reset_string_heap(void); akerr_ErrorContext *test_fresh_heap_gives_strings(void) { - akgl_String *ptr = NULL; - - PREPARE_ERROR(errctx); - for ( int i = 0; i < AKGL_MAX_HEAP_STRING - 1; i++ ) { - ATTEMPT { - CATCH(errctx, akgl_heap_next_string(&ptr)); - } CLEANUP { - reset_string_heap(); - } PROCESS(errctx) { - } FINISH(errctx, true); - } + akgl_String *ptr = NULL; - return 0; + PREPARE_ERROR(errctx); + for ( int i = 0; i < AKGL_MAX_HEAP_STRING - 1; i++ ) { + ATTEMPT { + CATCH(errctx, akgl_heap_next_string(&ptr)); + } CLEANUP { + reset_string_heap(); + } PROCESS(errctx) { + } FINISH(errctx, true); + } + + return 0; } akerr_ErrorContext *test_string_heap_error_when_no_strings_left(void) @@ -95,7 +95,7 @@ akerr_ErrorContext *test_strcpy_to_all_strings_no_segfault(void) } PROCESS(errctx) { } FINISH(errctx, true); SUCCEED_RETURN(errctx); -} +} akerr_ErrorContext *test_akgl_string_initialize(void) { @@ -111,7 +111,7 @@ akerr_ErrorContext *test_akgl_string_initialize(void) CATCH(errctx, akgl_string_initialize(ptr, "Test value")); FAIL_NONZERO_BREAK(errctx, strcmp((char *)&ptr->data, "Test value"), AKERR_VALUE, "Expected 'Test value', got %s", (char *)&ptr->data); - CATCH(errctx, akgl_heap_release_string(NULL)); + CATCH(errctx, akgl_heap_release_string(NULL)); FAIL_BREAK(errctx, AKGL_ERR_BEHAVIOR, "Failure to properly handle NULL pointer"); } CLEANUP { } PROCESS(errctx) { @@ -130,7 +130,7 @@ void reset_string_heap(void) int main(void) { - + PREPARE_ERROR(errctx); ATTEMPT { printf("test_fresh_heap_gives_string ....\n"); @@ -150,6 +150,6 @@ int main(void) } CLEANUP { } PROCESS(errctx) { } FINISH_NORETURN(errctx); - + return 0; } diff --git a/tests/testutil.h b/tests/testutil.h index 2e59ded..9484fa2 100644 --- a/tests/testutil.h +++ b/tests/testutil.h @@ -21,9 +21,9 @@ #include /** @brief Fail the enclosing ATTEMPT block unless @p cond holds. */ -#define TEST_ASSERT(e, cond, ...) \ - if ( ! (cond) ) { \ - FAIL_BREAK(e, AKGL_ERR_BEHAVIOR, __VA_ARGS__); \ +#define TEST_ASSERT(e, cond, ...) \ + if ( ! (cond) ) { \ + FAIL_BREAK(e, AKGL_ERR_BEHAVIOR, __VA_ARGS__); \ } /** @@ -33,25 +33,25 @@ * paths in a row without draining AKERR_ARRAY_ERROR. Pass 0 for @p expected to * require success. */ -#define TEST_EXPECT_STATUS(e, expected, stmt, desc) \ - { \ - akerr_ErrorContext *__tec = (stmt); \ - int __tst = ( __tec == NULL ) ? 0 : __tec->status; \ - if ( __tec != NULL ) { \ - __tec->handled = true; \ - __tec = akerr_release_error(__tec); \ - } \ - if ( __tst != (expected) ) { \ - FAIL_BREAK( \ - e, \ - AKGL_ERR_BEHAVIOR, \ - "%s: expected status %d (%s), got %d (%s)", \ - desc, \ - (int)(expected), \ - akerr_name_for_status((int)(expected), NULL), \ - __tst, \ - akerr_name_for_status(__tst, NULL)); \ - } \ +#define TEST_EXPECT_STATUS(e, expected, stmt, desc) \ + { \ + akerr_ErrorContext *__tec = (stmt); \ + int __tst = ( __tec == NULL ) ? 0 : __tec->status; \ + if ( __tec != NULL ) { \ + __tec->handled = true; \ + __tec = akerr_release_error(__tec); \ + } \ + if ( __tst != (expected) ) { \ + FAIL_BREAK( \ + e, \ + AKGL_ERR_BEHAVIOR, \ + "%s: expected status %d (%s), got %d (%s)", \ + desc, \ + (int)(expected), \ + akerr_name_for_status((int)(expected), NULL), \ + __tst, \ + akerr_name_for_status(__tst, NULL)); \ + } \ } /** @brief Require that @p stmt succeeds, reporting @p desc if it does not. */ diff --git a/tests/tilemap.c b/tests/tilemap.c index 5fec53a..5ba93b9 100644 --- a/tests/tilemap.c +++ b/tests/tilemap.c @@ -18,7 +18,7 @@ akerr_ErrorContext *test_tilemap_akgl_get_json_tilemap_property(void) json_error_t jsonerr; akgl_String *tmpstr = NULL; int propnum; - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -97,7 +97,7 @@ akerr_ErrorContext *test_akgl_tilemap_compute_tileset_offsets(void) &gamemap->tilesets[0].tile_offsets[3][1], // Tile 3 Y }; int i = 0; - + memset((void *)gamemap, 0x00, sizeof(akgl_Tilemap)); gamemap->tilesets[0].tilecount = 4; gamemap->tilesets[0].columns = 2; @@ -194,7 +194,7 @@ akerr_ErrorContext *test_akgl_tilemap_load_layer_tile(void) json_error_t errdata; memset((void *)gamemap, 0x00, sizeof(akgl_Tilemap)); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -212,7 +212,7 @@ akerr_ErrorContext *test_akgl_tilemap_load_layer_tile(void) (gamemap->layers[0].data[2] != 3) || (gamemap->layers[0].data[3] != 4) ) { FAIL_BREAK(errctx, AKERR_VALUE, "Test tilemap layer 0 tiles loaded with incorrect values (check gdb)"); - } + } } CLEANUP { if ( pathstr != NULL ) { IGNORE(akgl_heap_release_string(pathstr)); @@ -234,7 +234,7 @@ akerr_ErrorContext *test_akgl_tilemap_load_layers(void) int i = 0; memset((void *)gamemap, 0x00, sizeof(akgl_Tilemap)); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -267,13 +267,13 @@ akerr_ErrorContext *test_akgl_tilemap_load_layers(void) FAIL_BREAK(errctx, AKERR_VALUE, "Map layer 2 should have 1 loaded object (testactor) and nothing else (see gdb)"); } // Layer 1 and 3 should have no objects - for ( i = 0; i < AKGL_TILEMAP_MAX_OBJECTS_PER_LAYER ; i++ ) { + for ( i = 0; i < AKGL_TILEMAP_MAX_OBJECTS_PER_LAYER ; i++ ) { if ( gamemap->layers[0].objects[i].id != 0 ) { FAIL(errctx, AKERR_VALUE, "Map layers 1 and 3 should have no objects loaded but found objects"); goto _test_akgl_tilemap_load_layers_cleanup; } } - for ( i = 0; i < AKGL_TILEMAP_MAX_OBJECTS_PER_LAYER ; i++ ) { + for ( i = 0; i < AKGL_TILEMAP_MAX_OBJECTS_PER_LAYER ; i++ ) { if ( gamemap->layers[2].objects[i].id != 0 ) { FAIL(errctx, AKERR_VALUE, "Map layers 1 and 3 should have no objects loaded but found objects"); goto _test_akgl_tilemap_load_layers_cleanup; @@ -291,7 +291,7 @@ akerr_ErrorContext *test_akgl_tilemap_load_layers(void) ) { FAIL_BREAK(errctx, AKERR_VALUE, "Map layers 1 and 3 should have tile data but it is incorrect"); } -_test_akgl_tilemap_load_layers_cleanup: + _test_akgl_tilemap_load_layers_cleanup: } CLEANUP { if ( pathstr != NULL ) { IGNORE(akgl_heap_release_string(pathstr)); @@ -313,7 +313,7 @@ akerr_ErrorContext *test_akgl_tilemap_load_tilesets(void) SDL_Texture *image = NULL; memset((void *)gamemap, 0x00, sizeof(akgl_Tilemap)); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -385,7 +385,7 @@ akerr_ErrorContext *test_akgl_tilemap_load(void) akerr_ErrorContext *test_akgl_tilemap_draw(void) { PREPARE_ERROR(errctx); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -399,7 +399,7 @@ akerr_ErrorContext *test_akgl_tilemap_draw(void) akerr_ErrorContext *test_akgl_tilemap_draw_tileset(void) { PREPARE_ERROR(errctx); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; @@ -412,16 +412,16 @@ akerr_ErrorContext *test_akgl_tilemap_draw_tileset(void) int main(void) { PREPARE_ERROR(errctx); - + ATTEMPT { gamemap = &_akgl_gamemap; renderer = &_akgl_renderer; SDL_SetAppMetadata("SDL3-GameTest", "0.1", "net.aklabs.sdl3-gametest"); - + if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO )) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't initialize SDL: %s", SDL_GetError()); } - + if (!SDL_CreateWindowAndRenderer("net/aklabs/libakgl/test_sprite", 768, 576, 0, &window, &renderer->sdl_renderer)) { FAIL_BREAK(errctx, AKGL_ERR_SDL, "Couldn't create window/renderer: %s", SDL_GetError()); } @@ -445,6 +445,5 @@ int main(void) } CLEANUP { } PROCESS(errctx) { } FINISH_NORETURN(errctx); - -} +} diff --git a/tests/util.c b/tests/util.c index d8a4645..ff9f6b7 100644 --- a/tests/util.c +++ b/tests/util.c @@ -26,7 +26,7 @@ akerr_ErrorContext *test_akgl_rectangle_points_nullpointers(void) } HANDLE(errctx, AKERR_NULLPOINTER) { // noop } FINISH(errctx, true); - + ATTEMPT { CATCH(errctx, akgl_rectangle_points(&points, NULL)); FAIL_BREAK(errctx, AKGL_ERR_BEHAVIOR, "akgl_rectangle_points fails to FAIL with NULL RectanglePoints pointer"); @@ -50,7 +50,7 @@ akerr_ErrorContext *test_akgl_rectangle_points_math(void) RectanglePoints points; SDL_FRect testrect = {.x = 0, .y = 0, .w = 32, .h = 32}; memset((void *)&points, 0x00, sizeof(RectanglePoints)); - + PREPARE_ERROR(errctx); ATTEMPT { CATCH(errctx, akgl_rectangle_points(&points, &testrect)); @@ -83,7 +83,7 @@ akerr_ErrorContext *test_akgl_collide_point_rectangle_nullpointers(void) point testpoint; RectanglePoints testrectpoints; bool testcollide; - + PREPARE_ERROR(errctx); ATTEMPT { @@ -138,7 +138,7 @@ akerr_ErrorContext *test_akgl_collide_point_rectangle_logic(void) RectanglePoints testrectpoints; bool testcollide = false; PREPARE_ERROR(errctx); - + ATTEMPT { CATCH(errctx, akgl_rectangle_points(&testrectpoints, &testrect)); CATCH(errctx, akgl_collide_point_rectangle(&testpoint, &testrectpoints, &testcollide)); @@ -163,7 +163,7 @@ akerr_ErrorContext *test_akgl_collide_rectangles_nullpointers(void) SDL_FRect testrect1; SDL_FRect testrect2; bool testcollide; - + PREPARE_ERROR(errctx); ATTEMPT { @@ -216,9 +216,9 @@ akerr_ErrorContext *test_akgl_collide_rectangles_logic(void) SDL_FRect testrect1 = { .x = 0, .y = 0, .w = 32, .h = 32}; SDL_FRect testrect2 = { .x = 30, .y = 30, .w = 40, .h = 40}; bool testcollide = false; - + PREPARE_ERROR(errctx); - + ATTEMPT { // Collision overlapping on the top left CATCH(errctx, akgl_collide_rectangles(&testrect1, &testrect2, &testcollide)); @@ -298,7 +298,7 @@ akerr_ErrorContext *test_akgl_collide_rectangles_logic(void) if ( testcollide == true ) { FAIL_BREAK(errctx, AKGL_ERR_BEHAVIOR, "Invalid collision reported"); } - + } CLEANUP { } PROCESS(errctx) { } FINISH(errctx, true); diff --git a/util/charviewer.c b/util/charviewer.c index 4e80699..0ad1faa 100644 --- a/util/charviewer.c +++ b/util/charviewer.c @@ -29,7 +29,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) char *characterjson = NULL; char pathbuf[4096]; char cwdbuf[1024]; - + if ( argc < 3 ) { SDL_Log("charviewer [CHARACTER_FILE] [SPRITE ...]"); return SDL_APP_FAILURE; @@ -39,9 +39,9 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) characterjson = argv[1]; memset((char *)&pathbuf, 0x00, 4096); memset((char *)&cwdbuf, 0x00, 1024); - + ATTEMPT { - + FAIL_ZERO_BREAK(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate pointer"); FAIL_ZERO_BREAK(errctx, getcwd((char *)&cwdbuf, 1024), AKERR_NULLPOINTER, "Couldn't get current working directory"); @@ -79,7 +79,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) memset((char *)&pathbuf, 0x00, 4096); } - ATTEMPT { + ATTEMPT { if ( characterjson[0] != '/' ) { sprintf((char *)&pathbuf, "%s/%s", (char *)&cwdbuf, characterjson); } else { @@ -105,7 +105,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) SDL_Log("Opening gamepad %d", gamepadids[0]); FAIL_ZERO_BREAK(errctx, SDL_OpenGamepad(gamepadids[0]), AKGL_ERR_SDL, "%s", SDL_GetError()); CATCH(errctx, akgl_controller_default(0, "player", 0, gamepadids[0])); - + } CLEANUP { } PROCESS(errctx) { } HANDLE_DEFAULT(errctx) { @@ -123,7 +123,7 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) ATTEMPT { FAIL_ZERO_BREAK(errctx, appstate, AKERR_NULLPOINTER, "NULL appstate pointer"); FAIL_ZERO_BREAK(errctx, event, AKERR_NULLPOINTER, "NULL event pointer"); - + CATCH(errctx, akgl_controller_handle_event(appstate, event)); if (event->type == SDL_EVENT_QUIT) { return SDL_APP_SUCCESS; /* end the program, reporting success to the OS. */ @@ -140,7 +140,7 @@ SDL_AppResult SDL_AppIterate(void *appstate) akgl_Iterator opflags; PREPARE_ERROR(errctx); - + AKGL_BITMASK_CLEAR(opflags.flags); AKGL_BITMASK_ADD(opflags.flags, AKGL_ITERATOR_OP_UPDATE); AKGL_BITMASK_ADD(opflags.flags, AKGL_ITERATOR_OP_RENDER);