diff --git a/include/akgl/SDL_GameControllerDB.h b/include/akgl/SDL_GameControllerDB.h index f680c47..37a4925 100644 --- a/include/akgl/SDL_GameControllerDB.h +++ b/include/akgl/SDL_GameControllerDB.h @@ -1,7 +1,7 @@ #ifndef _SDL_GAMECONTROLLERDB_H_ #define _SDL_GAMECONTROLLERDB_H_ -// Taken from https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/refs/heads/master/gamecontrollerdb.txt on Wed May 13 10:44:28 PM EDT 2026 +// Taken from https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/refs/heads/master/gamecontrollerdb.txt on Wed May 13 11:34:15 PM EDT 2026 #define AKGL_SDL_GAMECONTROLLER_DB_LEN 2228 diff --git a/include/akgl/tilemap.h b/include/akgl/tilemap.h index abf6dd8..bbfd930 100644 --- a/include/akgl/tilemap.h +++ b/include/akgl/tilemap.h @@ -91,6 +91,8 @@ typedef struct { int p_vanishing_y; int p_foreground_h; int p_vanishing_h; + float p_foreground_scale; + float p_vanishing_scale; float p_scale; float p_rate; akgl_Tileset tilesets[AKGL_TILEMAP_MAX_TILESETS]; diff --git a/src/tilemap.c b/src/tilemap.c index 8f33958..395be42 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -35,7 +35,7 @@ akerr_ErrorContext *akgl_get_json_tilemap_property(json_t *obj, char *key, char } CATCH(errctx, akgl_get_json_string_value(property, "type", &tmpstr)); if ( strcmp(tmpstr->data, type) != 0 ) { - FAIL_BREAK(errctx, AKERR_TYPE, "Character property is present but is incorrect type"); + FAIL_BREAK(errctx, AKERR_TYPE, "Object property is present but is incorrect type"); } *dest = property; SUCCEED_RETURN(errctx); @@ -82,6 +82,20 @@ akerr_ErrorContext *akgl_get_json_properties_integer(json_t *obj, char *key, int SUCCEED_RETURN(errctx); } +akerr_ErrorContext *akgl_get_json_properties_number(json_t *obj, char *key, float *dest) +{ + PREPARE_ERROR(errctx); + json_t *property = NULL; + ATTEMPT { + CATCH(errctx, akgl_get_json_tilemap_property(obj, key, "number", &property)); + CATCH(errctx, akgl_get_json_number_value(property, "value", dest)); + } CLEANUP { + } PROCESS(errctx) { + } FINISH(errctx, true); + + SUCCEED_RETURN(errctx); +} + akerr_ErrorContext *akgl_tilemap_load_tilesets_each(json_t *tileset, akgl_Tilemap *dest, int tsidx) { PREPARE_ERROR(errctx); @@ -282,9 +296,11 @@ akerr_ErrorContext *akgl_tilemap_load_layer_objects(akgl_Tilemap *dest, json_t * if ( strcmp((char *)curobj->name, "p_foreground") == 0 ) { dest->p_foreground_y = curobj->y; CATCH(errctx, akgl_get_json_integer_value((json_t *)layerdatavalue, "height", &dest->p_foreground_h)); + CATCH(errctx, akgl_get_json_properties_number((json_t *)layerdatavalue, "scale", &dest->p_foreground_scale)); } else if ( strcmp((char *)curobj->name, "p_vanishing") == 0 ) { dest->p_vanishing_y = curobj->y; CATCH(errctx, akgl_get_json_integer_value((json_t *)layerdatavalue, "height", &dest->p_vanishing_h)); + CATCH(errctx, akgl_get_json_properties_number((json_t *)layerdatavalue, "scale", &dest->p_vanishing_scale)); } } @@ -418,7 +434,8 @@ akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest) FAIL_ZERO_RETURN(errctx, dest, AKERR_NULLPOINTER, "load_tilemap received null tilemap"); memset(dest, 0x00, sizeof(akgl_Tilemap)); - + dest->p_foreground_scale = 1.0; + dest->p_vanishing_scale = 1.0; ATTEMPT { //CATCH(errctx, akgl_heap_next_string(&tmpstr)); @@ -450,15 +467,14 @@ akerr_ErrorContext *akgl_tilemap_load(char *fname, akgl_Tilemap *dest) if ( dest->p_foreground_y && dest->p_vanishing_y ) { // How much bigger is the foreground vs the vanishing point? // if vanishing is height 16, and foreground is height 32, that is a 2x scale difference - dest->p_scale = (dest->p_foreground_h / dest->p_vanishing_h); - SDL_Log("Map perspective scale is (%d/%d) = %f", dest->p_foreground_h, dest->p_vanishing_h, dest->p_scale); - // Sprites are always size 1.0 at the foreground, so how much do we need to + /* dest->p_scale = ((float)dest->p_foreground_h / (float)dest->p_vanishing_h); */ + /* SDL_Log("Map perspective scale is (%d/%d) = %f", dest->p_foreground_h, dest->p_vanishing_h, dest->p_scale); */ + // Sprites are scale N (default 1.0) at the foreground, so how much do we need to // scale them for every pixel above foreground_y before they reach vanishing_y? // If vanishing is at 320 and foreground is at 640, that is a 320 line difference - // If our scaling rate is 2x, then our rate is ((1.0 - (1.0 / 2.0)) / 320.0), or - // 0.0015625% scale per pixel. - // At position 640, - dest->p_rate = (1.0 / (dest->p_foreground_y - dest->p_vanishing_y)) / dest->p_scale; + // If our scaling rate is 2x, then our rate is (((N=1.0) / (640 - 320)) / (dest->p_scale = 2)), or + // 0.0066% scale per pixel. + dest->p_rate = ((dest->p_foreground_scale - dest->p_vanishing_scale) / (dest->p_foreground_y - dest->p_vanishing_y)); SDL_Log("Map perspective rate is %f", dest->p_rate); } } CLEANUP { @@ -647,11 +663,11 @@ akerr_ErrorContext AKERR_NOIGNORE *akgl_tilemap_scale_actor(akgl_Tilemap *map, a FAIL_ZERO_RETURN(e, actor, AKERR_NULLPOINTER, "NULL actor"); if ( actor->y <= map->p_vanishing_y ) { - actor->scale = 1.0 / map->p_scale; + actor->scale = map->p_vanishing_scale; } else if ( actor->y >= map->p_foreground_y ) { - actor->scale = 1.0; + actor->scale = map->p_foreground_scale; } else { - actor->scale = 1.0 - (map->p_rate * (map->p_foreground_y - actor->y)); + actor->scale = map->p_foreground_scale - (map->p_rate * (map->p_foreground_y - actor->y)); } SUCCEED_RETURN(e); }