17#define RETROTILE_PRESENT
19#ifndef RETROTILE_TRACE_CHARS
20# define RETROTILE_TRACE_CHARS 0
23#ifndef RETROTILE_NAME_SZ_MAX
25# define RETROTILE_NAME_SZ_MAX 10
28#ifndef RETROTILE_PROP_NAME_SZ_MAX
30# define RETROTILE_PROP_NAME_SZ_MAX 10
33#ifndef RETROTILE_TILE_SCALE_DEFAULT
35# define RETROTILE_TILE_SCALE_DEFAULT 1.0f
38#ifndef RETROTILE_TRACE_LVL
40# define RETROTILE_TRACE_LVL 0
43#ifndef RETROTILE_VORONOI_DEFAULT_SPB
44# define RETROTILE_VORONOI_DEFAULT_SPB 8
47#ifndef RETROTILE_VORONOI_DEFAULT_DRIFT
48# define RETROTILE_VORONOI_DEFAULT_DRIFT 4
51#ifdef MPARSER_TRACE_NAMES
52# define retrotile_mstate_name( state ) gc_retrotile_mstate_names[state]
54# define retrotile_mstate_name( state ) state
57#ifndef RETROTILE_PARSER_FLAG_LITERAL_PATHS
63# define RETROTILE_PARSER_FLAG_LITERAL_PATHS 0x02
71#define RETROTILE_PARSER_MODE_MAP 0
78#define RETROTILE_PARSER_MODE_DEFS 1
80#define RETROTILE_CLASS_TABLE( f ) \
82 f( MOBILE, mobile, 1 ) \
101#define RETROTILE_TILE_FLAG_BLOCK 0x01
107#define RETROTILE_TILE_FLAG_RESERVED1 0x02
113#define RETROTILE_TILE_FLAG_RESERVED2 0x04
119#define RETROTILE_TILE_FLAG_RESERVED3 0x08
127#define RETROTILE_PROP_TYPE_OTHER 0
133#define RETROTILE_PROP_TYPE_STRING 1
139#define RETROTILE_PROP_TYPE_FILE 2
145#define RETROTILE_PROP_TYPE_INT 3
157#define RETROTILE_DS_FLAG_INIT_DATA 0x02
162#define RETROTILE_IDX_FMT "%u"
179 retrotile_coord_t warp_x;
180 retrotile_coord_t warp_y;
186 struct RETRO3DP_MODEL model;
188#ifdef RETROGXC_PRESENT
189 ssize_t image_cache_id;
192 struct RETROFLAT_BITMAP image;
203 uint16_t layer_class;
266 int16_t tiles_changed;
273#define retrotile_get_tile( tilemap, layer, x, y ) \
274 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
276#define retrotile_set_tile( tilemap, layer, x, y, new_val ) \
277 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
279#define retrotile_get_tiles_p( layer ) \
280 ((retroflat_tile_t*)(((uint8_t*)(layer)) + \
281 sizeof( struct RETROTILE_LAYER )))
286# define retrotile_clear_tiles( t, layer, i ) \
287 assert( 1 == sizeof( retroflat_tile_t ) ); \
290 (t)->tiles_w * (t)->tiles_h * sizeof( retroflat_tile_t ) > i ; \
293 retrotile_get_tiles_p( layer )[i] = -1; \
296# define retrotile_clear_tiles( t, layer, i ) \
297 memset( retrotile_get_tiles_p( layer ), -1, \
298 (t)->tiles_w * (t)->tiles_h * sizeof( retroflat_tile_t ) )
307 const char* dirname,
const char* filename, MAUG_MHANDLE* p_tm_h,
308 struct MDATA_VECTOR* p_td, mparser_wait_cb_t wait_cb,
void* wait_data,
309 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
320 mparser_wait_cb_t wait_cb;
322 retroflat_ms_t wait_last;
323 size_t layer_tile_iter;
327 size_t last_prop_name_sz;
331 size_t pass_layer_iter;
340 retrotile_tj_parse_cb tj_parse_cb;
347 void* custom_token_cb_data;
348 struct MJSON_PARSER jparser;
351 uint16_t layer_class;
355#define RETROTILE_PARSER_MSTATE_TABLE( f ) \
356 f( MTILESTATE_NONE, 0, "", 0, 0 ) \
357 f( MTILESTATE_HEIGHT, 1, "height", 0 , 0 ) \
358 f( MTILESTATE_WIDTH, 2, "width", 0 , 0 ) \
359 f( MTILESTATE_LAYERS, 3, "layers", 0 , 0 ) \
360 f( MTILESTATE_LAYER_DATA, 4, "data", 15
, 0 ) \
361 f( MTILESTATE_LAYER_NAME, 5, "name", 15
, 0 ) \
362 f( MTILESTATE_TILES, 6, "tiles", 0 , 1 ) \
363 f( MTILESTATE_TILES_ID, 7, "id", 6
, 1 ) \
364 f( MTILESTATE_TILES_IMAGE, 8, "image", 6
, 1 ) \
365 f( MTILESTATE_TILESETS, 9, "tilesets", 0 , 0 ) \
366 f( MTILESTATE_TILESETS_SRC, 10, "source", 9
, 0 ) \
367 f( MTILESTATE_TILESETS_FGID, 11, "firstgid", 9
, 0 ) \
368 f( MTILESTATE_TILESETS_PROP, 12, "firstgid", 9
, 0 ) \
369 f( MTILESTATE_GRID, 13, "grid", 0 , 1 ) \
370 f( MTILESTATE_TILES_PROP, 14, "properties", 6
, 1 ) \
371 f( MTILESTATE_LAYER, 15, "layers",
3 , 0 ) \
372 f( MTILESTATE_TILES_PROP_NAME, 16, "name", 14
, 1 ) \
373 f( MTILESTATE_TILES_PROP_TYPE, 17, "type", 14
, 1 ) \
374 f( MTILESTATE_TILES_PROP_VAL, 18, "value", 14
, 1 ) \
375 f( MTILESTATE_PROP, 19, "properties", 0
, 0 ) \
376 f( MTILESTATE_PROP_NAME, 20, "name", 19
, 0 ) \
377 f( MTILESTATE_PROP_TYPE, 21, "type", 19
, 0 ) \
378 f( MTILESTATE_PROP_VAL, 22, "value", 19
, 0 ) \
379 f( MTILESTATE_LAYER_CLASS, 23, "class", 15
, 0 ) \
380 f( MTILESTATE_TILES_CLASS, 24, "type", 6
, 1 ) \
381 f( MTILESTATE_NAME, 25, "name", 0 , 1 ) \
382 f( MTILESTATE_WANGSETS, 26, "wangsets", 0 , 1 ) \
383 f( MTILESTATE_TPROP, 27, "properties", 0
, 1 ) \
384 f( MTILESTATE_TPROP_NAME, 28, "name", 27
, 1 ) \
385 f( MTILESTATE_TPROP_TYPE, 29, "type", 27
, 1 ) \
386 f( MTILESTATE_TPROP_VAL, 30, "value", 27
, 1 )
433 const maug_path dirname,
const char* filename, MAUG_MHANDLE* p_tilemap_h,
435 mparser_wait_cb_t wait_cb,
void* wait_data,
436 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
448 void* animation_cb_data, int16_t iter );
452 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
453 retrotile_ani_cb animation_cb,
void* animation_cb_data );
466 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
467 retrotile_ani_cb animation_cb,
void* animation_cb_data );
481 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
482 retrotile_ani_cb animation_cb,
void* animation_cb_data );
493 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
494 retrotile_ani_cb animation_cb,
void* animation_cb_data );
504 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
505 retrotile_ani_cb animation_cb,
void* animation_cb_data );
510 struct RETROTILE* tilemap, uint32_t layer_idx );
513 MAUG_MHANDLE* p_tilemap_h,
size_t w,
size_t h,
size_t layers_count,
514 const char* tilemap_name,
const char* tileset_name );
516void retrotile_format_asset_path(
526#if RETROTILE_TRACE_LVL > 0
527# define retrotile_parser_mstate( parser, new_mstate ) \
528 parser->mstate = new_mstate; \
530 RETROTILE_TRACE_LVL, "parser mstate: %d", parser->mstate );
532# define retrotile_parser_mstate( parser, new_mstate ) \
533 parser->mstate = new_mstate;
536# define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \
537 MAUG_CONST uint8_t SEG_MCONST name = idx;
539RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
541#ifdef MPARSER_TRACE_NAMES
542# define RETROTILE_PARSER_MSTATE_TABLE_NAME( name, idx, tokn, parent, m ) \
545static MAUG_CONST
char* SEG_MCONST gc_retrotile_mstate_names[] = {
546 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_NAME )
551# define RETROTILE_PARSER_MSTATE_TABLE_TOKEN( name, idx, tokn, parent, m ) \
554static MAUG_CONST
char* SEG_MCONST gc_retrotile_mstate_tokens[] = {
555 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_TOKEN )
559# define RETROTILE_PARSER_MSTATE_TABLE_PARNT( name, idx, tokn, parent, m ) \
562static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_parents[] = {
563 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_PARNT )
567# define RETROTILE_PARSER_MSTATE_TABLE_MODE( name, idx, tokn, parent, m ) \
570static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_modes[] = {
571 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_MODE )
575# define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \
576 MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A = i;
578RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
582static void retrotile_parser_match_token(
588 while(
'\0' != gc_retrotile_mstate_tokens[j][0] ) {
591 maug_strlen( gc_retrotile_mstate_tokens[j] ) != token_sz ||
593 token, gc_retrotile_mstate_tokens[j], token_sz + 1
604 parser->mstate != gc_retrotile_mstate_parents[j]
606#ifdef RETROTILE_TRACE_TOKENS
609 "found token \"%s\" "
610#ifdef MPARSER_TRACE_NAMES
611 "but incorrect parent %s (%d) (needs %s (%d))!",
613 "but incorrect parent %d (needs %d)!",
616#ifdef MPARSER_TRACE_NAMES
617 retrotile_mstate_name( parser->mstate ),
619 retrotile_mstate_name( gc_retrotile_mstate_parents[j] ),
620 gc_retrotile_mstate_parents[j]
623 gc_retrotile_mstate_parents[j]
630 }
else if( parser->
mode != gc_retrotile_mstate_modes[j] ) {
631#ifdef RETROTILE_TRACE_TOKENS
635 gc_retrotile_mstate_modes[j] );
642#ifdef RETROTILE_TRACE_TOKENS
645 "found token \"%s\" "
646#ifdef MPARSER_TRACE_NAMES
647 "under correct parent %s (%d)!",
649 "under correct parent %d!",
652#ifdef MPARSER_TRACE_NAMES
653 retrotile_mstate_name( parser->mstate ),
661 retrotile_parser_mstate( parser, j );
670 void* jparser_void,
const char* token,
size_t token_sz,
void* parser_arg
675 size_t tileset_id_parsed = 0;
686 parser, token, token_sz, parser_arg ))
691 if( MJSON_PSTATE_OBJECT_VAL != mjson_parser_pstate( &(parser->jparser) ) ) {
693 retrotile_parser_match_token( token, token_sz, parser );
697 if( MTILESTATE_TILES_ID == parser->mstate ) {
698 retrotile_parser_mstate( parser, MTILESTATE_TILES );
699 if( 0 == parser->pass ) {
701 tileset_id_parsed = maug_atou32( token, token_sz, 10 );
704#if RETROTILE_TRACE_LVL > 0
713#if RETROTILE_TRACE_LVL > 0
719 retrotile_parser_mstate( parser, MTILESTATE_TILES );
721 }
else if( MTILESTATE_TILES_IMAGE == parser->mstate ) {
722 if( 1 == parser->pass ) {
725 tile_def = mdata_vector_get(
728 assert( NULL != tile_def );
738 tile_def->image_path, token, MFILE_ASSIGN_FLAG_TRIM_EXT );
744#if RETROTILE_TRACE_LVL > 0
750 retrotile_parser_mstate( parser, MTILESTATE_TILES );
752 }
else if( MTILESTATE_TILES_CLASS == parser->mstate ) {
753 if( 1 == parser->pass ) {
761 tile_def = mdata_vector_get(
764 assert( NULL != tile_def );
765 assert( 0 == tile_def->tile_class );
767#if RETROTILE_TRACE_LVL > 0
768 #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \
769 } else if( 0 == maug_strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \
770 tile_def->tile_class = RETROTILE_CLASS_ ## A; \
771 debug_printf( RETROTILE_TRACE_LVL, \
772 "set tile " SIZE_T_FMT " type: " #a " (%u)", \
773 parser->tileset_id_cur, tile_def->tile_class );
775 #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \
776 } else if( 0 == maug_strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \
777 tile_def->tile_class = RETROTILE_CLASS_ ## A;
781 RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_SET )
783 tile_def->tile_class = RETROTILE_CLASS_TILE;
784#if RETROTILE_TRACE_LVL > 0
786 "set tile " SIZE_T_FMT
" type: tile (%u)",
791 retrotile_parser_mstate( parser, MTILESTATE_TILES );
793 }
else if( MTILESTATE_TILES_PROP_NAME == parser->mstate ) {
794#if RETROTILE_TRACE_LVL > 0
799 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
801 }
else if( MTILESTATE_TILES_PROP_TYPE == parser->mstate ) {
802#if RETROTILE_TRACE_LVL > 0
807 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
809 }
else if( MTILESTATE_TILES_PROP_VAL == parser->mstate ) {
813 if( 1 == parser->pass ) {
815 tile_def = mdata_vector_get(
818 assert( NULL != tile_def );
820 if( 0 == maug_strncmp(
"warp_dest", parser->
last_prop_name, 10 ) ) {
823#if RETROTILE_TRACE_LVL > 0
829 }
else if( 0 == maug_strncmp(
"warp_x", parser->
last_prop_name, 7 ) ) {
830 tile_def->warp_x = maug_atos32( token, token_sz );
831#if RETROTILE_TRACE_LVL > 0
837 }
else if( 0 == maug_strncmp(
"warp_y", parser->
last_prop_name, 7 ) ) {
838 tile_def->warp_y = maug_atos32( token, token_sz );
839#if RETROTILE_TRACE_LVL > 0
845 }
else if( 0 == maug_strncmp(
"color", parser->
last_prop_name, 7 ) ) {
847#define RETROFLAT_COLOR_TABLE_TILPRP( idx, name_l, name_u, r, g, b, cgc, cgd ) \
848 } else if( 0 == maug_strncmp( token, #name_l, token_sz ) ) { \
849 tile_def->color = RETROFLAT_COLOR_ ## name_u;
855#if RETROTILE_TRACE_LVL > 0
865 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
867 }
else if( MTILESTATE_NAME == parser->mstate ) {
869#if RETROTILE_TRACE_LVL > 0
874 retrotile_parser_mstate( parser, 0 );
876 }
else if( MTILESTATE_TPROP_NAME == parser->mstate ) {
880 parser->last_prop_name_sz = token_sz;
881 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
883 }
else if( MTILESTATE_TPROP_TYPE == parser->mstate ) {
884#if RETROTILE_TRACE_LVL > 0
889 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
891 }
else if( MTILESTATE_TPROP_VAL == parser->mstate ) {
894 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
912 void* jparser_void,
const char* token,
size_t token_sz,
void* parser_arg
924 parser, token, token_sz, parser_arg ))
929 if( MJSON_PSTATE_LIST == mjson_parser_pstate( &(parser->jparser) ) ) {
939 MTILESTATE_LAYER_DATA == parser->mstate
954 assert( NULL != parser->t );
955 tiles_layer = retrotile_get_layer_p(
956 parser->t, parser->pass_layer_iter );
957 assert( NULL != tiles_layer );
960 tiles_layer->layer_class = parser->layer_class;
962 tiles = retrotile_get_tiles_p( tiles_layer );
971 assert( NULL != token );
972 assert( NULL != parser );
973 assert( NULL != tiles );
976 parser->layer_tile_iter >=
981 "tile " SIZE_T_FMT
" outside of layer tile buffer size "
983 parser->layer_tile_iter,
985 retval = MERROR_OVERFLOW;
989 assert( 0 == tiles[parser->layer_tile_iter] );
991 tiles[parser->layer_tile_iter] = maug_atou32(
992 token, token_sz, 10 );
995 parser->layer_tile_iter++;
999 MJSON_PSTATE_OBJECT_VAL ==
1000 mjson_parser_pstate( &(parser->jparser) )
1011 if( MTILESTATE_TILESETS_FGID == parser->mstate ) {
1012 if( 1 == parser->pass ) {
1013 parser->t->
tileset_fgid = maug_atou32( token, token_sz, 10 );
1014#if RETROTILE_TRACE_LVL > 0
1020 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
1022 }
else if( MTILESTATE_TILESETS_SRC == parser->mstate ) {
1023 if( 1 == parser->pass ) {
1024#if RETROTILE_TRACE_LVL > 0
1027 parser->tj_parse_cb(
1028 parser->dirname, token, NULL, parser->p_tile_defs,
1029 parser->wait_cb, parser->wait_data,
1031 parser->passes_max, parser->flags );
1033 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
1035 }
else if( MTILESTATE_HEIGHT == parser->mstate ) {
1036 if( 0 == parser->pass ) {
1038 parser->tiles_h = maug_atou32( token, token_sz, 10 );
1039#if RETROTILE_TRACE_LVL > 0
1045 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1047 }
else if( MTILESTATE_WIDTH == parser->mstate ) {
1048 if( 0 == parser->pass ) {
1050 parser->tiles_w = maug_atou32( token, token_sz, 10 );
1051#if RETROTILE_TRACE_LVL > 0
1057 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1059 }
else if( MTILESTATE_LAYER_NAME == parser->mstate ) {
1061 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1063 }
else if( MTILESTATE_LAYER_CLASS == parser->mstate ) {
1065 if( 0 == maug_strncmp(
"mobile", token, 7 ) ) {
1066#if RETROTILE_TRACE_LVL > 0
1068 "layer " SIZE_T_FMT
" type: mobile",
1069 parser->pass_layer_iter );
1071 parser->layer_class = RETROTILE_CLASS_MOBILE;
1073#if RETROTILE_TRACE_LVL > 0
1075 "layer " SIZE_T_FMT
" type: tile",
1076 parser->pass_layer_iter );
1078 parser->layer_class = RETROTILE_CLASS_TILE;
1080 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1082 }
else if( MTILESTATE_PROP_NAME == parser->mstate ) {
1086 parser->last_prop_name_sz = token_sz;
1087 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1089 }
else if( MTILESTATE_PROP_TYPE == parser->mstate ) {
1090#if RETROTILE_TRACE_LVL > 0
1095 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1097 }
else if( MTILESTATE_PROP_VAL == parser->mstate ) {
1100#if RETROTILE_TRACE_LVL > 0
1107 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1112 retrotile_parser_match_token( token, token_sz, parser );
1122 struct MJSON_PARSER* jparser,
void* parg
1126 if( MTILESTATE_LAYER_DATA == parser->mstate ) {
1128#if RETROTILE_TRACE_LVL > 0
1130 parser->layer_tile_iter );
1132 assert( parser->layer_tile_iter > 0 );
1133 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1135 }
else if( MTILESTATE_LAYERS == parser->mstate ) {
1137 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1139 }
else if( MTILESTATE_TILESETS == parser->mstate ) {
1141 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1143 }
else if( MTILESTATE_TILES_PROP == parser->mstate ) {
1145 retrotile_parser_mstate( parser, MTILESTATE_TILES );
1147 }
else if( MTILESTATE_TILES == parser->mstate ) {
1149 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1151 }
else if( MTILESTATE_PROP == parser->mstate ) {
1152 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1154 }
else if( MTILESTATE_TPROP == parser->mstate ) {
1155 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1164 struct MJSON_PARSER* jparser,
void* parg
1168 if( MTILESTATE_LAYERS == parser->mstate ) {
1172 parser->layer_tile_iter = 0;
1173 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1182 struct MJSON_PARSER* jparser,
void* parg
1186 if( MTILESTATE_LAYER == parser->mstate ) {
1188#if RETROTILE_TRACE_LVL > 0
1190 "incrementing pass layer to " SIZE_T_FMT
" after " SIZE_T_FMT
1192 parser->pass_layer_iter + 1, parser->layer_tile_iter );
1194 parser->pass_layer_iter++;
1195 retrotile_parser_mstate( parser, MTILESTATE_LAYERS );
1197 }
else if( MTILESTATE_GRID == parser->mstate ) {
1198 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1209 if( 0 == maug_strncmp(
"string", token, 7 ) ) {
1211 }
else if( 0 == maug_strncmp(
"file", token, 5 ) ) {
1213 }
else if( 0 == maug_strncmp(
"int", token, 4 ) ) {
1223 mfix_t static_rotate_out = 0;
1230 if( 0 == maug_strncmp( dir,
"NW", 3 ) ) {
1231 static_rotate_out = mfix_from_f( 90.0f );
1232 }
else if( 0 == maug_strncmp( dir,
"SW", 3 ) ) {
1233 static_rotate_out = mfix_from_f( 180.0f );
1234 }
else if( 0 == maug_strncmp( dir,
"SE", 3 ) ) {
1235 static_rotate_out = mfix_from_f( 270.0f );
1237 }
else if( 0 == maug_strncmp( dir,
"W", 2 ) ) {
1238 static_rotate_out = mfix_from_f( 90.0f );
1239 }
else if( 0 == maug_strncmp( dir,
"S", 2 ) ) {
1240 static_rotate_out = mfix_from_f( 180.0f );
1241 }
else if( 0 == maug_strncmp( dir,
"E", 2 ) ) {
1242 static_rotate_out = mfix_from_f( 270.0f );
1245 static_rotate_out = 0;
1248 return static_rotate_out;
1254 const maug_path dirname,
const char* filename, MAUG_MHANDLE* p_tilemap_h,
1255 struct MDATA_VECTOR* p_tile_defs, mparser_wait_cb_t wait_cb,
void* wait_data,
1256 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
1260 MAUG_MHANDLE parser_h = (MAUG_MHANDLE)NULL;
1265 char* filename_ext = NULL;
1270 maug_mlock( parser_h, parser );
1274 parser->flags = flags;
1277 parser->custom_token_cb_data = token_cb_data;
1280 maug_cleanup_if_not_ok();
1283#if RETROTILE_TRACE_LVL > 0
1285 "increasing parse passes to minimum, 2!" );
1290 parser->passes_max = passes;
1293 retrotile_format_asset_path( filename_path, filename, parser );
1295#if RETROTILE_TRACE_LVL > 0
1300 maug_cleanup_if_not_ok();
1303 for( parser->pass = 0 ; passes > parser->pass ; parser->pass++ ) {
1304#if RETROTILE_TRACE_LVL > 0
1313 maug_mzero( &(parser->jparser.base),
sizeof(
struct MJSON_PARSER ) );
1315 parser->wait_cb = wait_cb;
1316 parser->wait_data = wait_data;
1317 parser->jparser.base.wait_cb = wait_cb;
1318 parser->jparser.base.wait_data = wait_data;
1321 filename_ext = maug_strrchr( filename,
'.' );
1322 if( NULL == filename_ext ) {
1323 error_printf(
"could not parse filename extension!" );
1324 retval = MERROR_FILE;
1327 if(
's' == filename_ext[2] ) {
1328#if RETROTILE_TRACE_LVL > 0
1330 "(tile_defs pass %u)", parser->pass );
1333 parser->jparser.token_parser = retrotile_parser_parse_tiledef_token;
1334 parser->jparser.token_parser_arg = parser;
1335 parser->jparser.close_list = retrotile_json_close_list;
1336 parser->jparser.close_list_arg = parser;
1337 parser->jparser.close_obj = retrotile_json_close_obj;
1338 parser->jparser.close_obj_arg = parser;
1343 parser->p_tile_defs = p_tile_defs;
1345 assert( NULL != p_tile_defs );
1346 if( 1 == parser->pass ) {
1351#if RETROTILE_TRACE_LVL > 0
1361#if RETROTILE_TRACE_LVL > 0
1366 parser->jparser.close_list = retrotile_json_close_list;
1367 parser->jparser.close_list_arg = parser;
1368 parser->jparser.open_obj = retrotile_json_open_obj;
1369 parser->jparser.open_obj_arg = parser;
1370 parser->jparser.close_obj = retrotile_json_close_obj;
1371 parser->jparser.close_obj_arg = parser;
1372 parser->jparser.token_parser = retrotile_parser_parse_token;
1373 parser->jparser.token_parser_arg = parser;
1374 parser->p_tile_defs = p_tile_defs;
1376 assert( NULL != p_tilemap_h );
1377 assert( NULL != p_tile_defs );
1378 if( 1 == parser->pass ) {
1380 retval = retrotile_alloc(
1381 p_tilemap_h, parser->tiles_w, parser->tiles_h,
1383 parser->tileset_name );
1384 maug_cleanup_if_not_ok();
1385 maug_mlock( *p_tilemap_h, parser->t );
1387 parser->pass_layer_iter = 0;
1390 while( mfile_has_bytes( &tile_file ) ) {
1391 mfile_read_int( &tile_file, (uint8_t*)&c, 1, 0 );
1392#if RETROTILE_TRACE_CHARS > 0
1393 debug_printf( RETROTILE_TRACE_CHARS,
"%c", c );
1395 retval = mjson_parse_c( &(parser->jparser), c );
1396 if( MERROR_OK != retval ) {
1397 error_printf(
"error parsing JSON!" );
1402 mfile_seek( &tile_file, 0 );
1404 filename_ext = maug_strrchr( filename,
'.' );
1405 if( NULL == filename_ext ) {
1406 error_printf(
"could not parse filename extension!" );
1407 retval = MERROR_FILE;
1410 if(
's' != filename_ext[2] ) {
1411#if RETROTILE_TRACE_LVL > 0
1413 "pass %u found " SIZE_T_FMT
" layers",
1414 parser->pass, parser->pass_layer_iter );
1419#if RETROTILE_TRACE_LVL > 0
1422 filename_path, retval );
1427 if( NULL != parser ) {
1428 if( NULL != parser->t ) {
1429 maug_munlock( *p_tilemap_h, parser->t );
1431 maug_munlock( parser_h, parser );
1434 if( (MAUG_MHANDLE)NULL != parser_h ) {
1435 maug_mfree( parser_h );
1449 if( 8 > rand() % 10 ) {
1451 avg -= (min_z / tuning) + (rand() % (max_z / tuning));
1471static void retrotile_gen_diamond_square_corners(
1472 int16_t corners_x[2][2], int16_t corners_y[2][2],
1485 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
1486 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
1489 corners_x[iter_x][iter_y] =
1491 if( 0 > corners_x[iter_x][iter_y] ) {
1492 corners_x[iter_x][iter_y] += 1;
1496 corners_y[iter_x][iter_y] =
1498 if( 0 > corners_y[iter_x][iter_y] ) {
1499 corners_y[iter_x][iter_y] += 1;
1505 assert( 0 <= corners_x[0][0] );
1506 assert( 0 <= corners_y[0][0] );
1507 assert( t->
tiles_w > corners_x[0][0] );
1508 assert( t->
tiles_h > corners_y[0][0] );
1511 top_left_z = retrotile_get_tile(
1516 if( 0 > top_left_z ) {
1519 corners_x[0][0] >= 0 ? corners_x[0][0] : 0,
1520 corners_y[0][0] >= 0 ? corners_y[0][0] : 0 ) = max_z;
1525 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
1526 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
1528 tile_iter = &(retrotile_get_tile(
1530 corners_x[iter_x][iter_y],
1531 corners_y[iter_x][iter_y] ));
1534 if( -1 != *tile_iter ) {
1535#if RETROTILE_TRACE_LVL > 0
1538 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
1541 corners_x[iter_x][iter_y],
1542 corners_y[iter_x][iter_y] ) );
1548 *tile_iter = retrotile_gen_diamond_square_rand(
1549 min_z, max_z, tuning, top_left_z );
1551#if RETROTILE_TRACE_LVL > 0
1553 "missing corner coord %d x %d: %d",
1554 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
1564 int16_t corners_x[2][2], int16_t corners_y[2][2],
1573 for( iter_y = 0 ; 2 > iter_y ; iter_y++ ) {
1574 for( iter_x = 0 ; 2 > iter_x ; iter_x++ ) {
1575 tile_iter = &(retrotile_get_tile(
1577 corners_x[iter_x][iter_y],
1578 corners_y[iter_x][iter_y] ));
1579 assert( -1 != *tile_iter );
1600 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1601 retrotile_ani_cb animation_cb,
void* animation_cb_data
1605#if RETROTILE_TRACE_LVL > 0
1610 int16_t corners_x[2][2];
1611 int16_t corners_y[2][2];
1615 MAUG_MHANDLE data_ds_h = (MAUG_MHANDLE)NULL;
1621 uint8_t free_ds_data = 0;
1622#ifdef MAUG_NO_STDLIB
1631 #define _retrotile_ds_update_statistics( data, tile ) \
1633 if( (data)->highest_generated < (tile) && 32767 > (tile) ) { \
1634 (data)->highest_generated = (tile); \
1636 if( (data)->lowest_generated > (tile) && 0 < (tile) ) { \
1637 (data)->lowest_generated = (tile); \
1640 layer = retrotile_get_layer_p( t, layer_idx );
1648 if( NULL == data ) {
1652 maug_mlock( data_ds_h, data_ds );
1659 retrotile_clear_tiles( t, layer, i );
1667 data_ds->lowest_generated = 32767;
1670 flags &= ~RETROTILE_DS_FLAG_INIT_DATA;
1674 assert( NULL != data_ds );
1677 if( 0 == data_ds->
sect_w ) {
1678#if RETROTILE_TRACE_LVL > 0
1689#if RETROTILE_TRACE_LVL > 0
1696#if RETROTILE_TRACE_LVL > 0
1701 retrotile_gen_diamond_square_corners(
1702 corners_x, corners_y, min_z, max_z, tuning, data_ds, layer, t );
1706#if RETROTILE_TRACE_LVL > 0
1709 "%d return: reached innermost point", iter_depth );
1715 retrotile_gen_diamond_square_avg( corners_x, corners_y, t, layer );
1717#if RETROTILE_TRACE_LVL > 0
1721 tile_iter = &(retrotile_get_tile(
1725 if( -1 != *tile_iter ) {
1726#if RETROTILE_TRACE_LVL > 0
1734 _retrotile_ds_update_statistics( data_ds, avg );
1743 iter_y = data_ds->
sect_y ;
1748 iter_x = data_ds->
sect_x ;
1752 data_ds_sub.sect_x = data_ds->
sect_x + iter_x;
1754 data_ds_sub.sect_y = data_ds->
sect_y + iter_y;
1758 data_ds_sub.sect_w_half = data_ds_sub.sect_w >> 1;
1759 data_ds_sub.sect_h_half = data_ds_sub.sect_h >> 1;
1760 data_ds_sub.lowest_generated = 32767;
1761 data_ds_sub.highest_generated = 0;
1763#if RETROTILE_TRACE_LVL > 0
1767 data_ds_sub.sect_x, data_ds_sub.sect_y, data_ds_sub.sect_w );
1771 t, min_z, max_z, tuning, layer_idx, flags, &data_ds_sub,
1772 animation_cb, animation_cb_data );
1773 maug_cleanup_if_not_ok();
1775 _retrotile_ds_update_statistics(
1776 data_ds, data_ds_sub.highest_generated );
1777 _retrotile_ds_update_statistics(
1778 data_ds, data_ds_sub.lowest_generated );
1784 NULL != animation_cb
1786 retval = animation_cb( animation_cb_data, iter_y );
1787 maug_cleanup_if_not_ok();
1790#if RETROTILE_TRACE_LVL > 0
1797 if( free_ds_data && NULL != data_ds ) {
1798 maug_munlock( data_ds_h, data_ds );
1801 if( free_ds_data && (MAUG_MHANDLE)NULL != data_ds_h ) {
1802 maug_mfree( data_ds_h );
1812 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1813 retrotile_ani_cb animation_cb,
void* animation_cb_data
1817 int16_t offset_x = 0,
1822 int16_t spb = RETROTILE_VORONOI_DEFAULT_SPB;
1823 int16_t drift = RETROTILE_VORONOI_DEFAULT_DRIFT;
1824 MAUG_MHANDLE temp_grid_h = (MAUG_MHANDLE)NULL;
1828 int8_t side_iter = 0;
1829#ifdef MAUG_NO_STDLIB
1833 layer = retrotile_get_layer_p( t, 0 );
1835 tiles = retrotile_get_tiles_p( layer );
1838 retrotile_clear_tiles( t, layer, i );
1841 for( y = 0 ; t->
tiles_w > y ; y += spb ) {
1842 for( x = 0 ; t->
tiles_w > x ; x += spb ) {
1843 offset_x = x + ((drift * -1) + (rand() % drift));
1844 offset_y = y + ((drift * -1) + (rand() % drift));
1847 if( 0 > offset_x ) {
1850 if( offset_x >= t->
tiles_w ) {
1853 if( 0 > offset_y ) {
1856 if( offset_y >= t->
tiles_h ) {
1860 retrotile_get_tile( t, layer, offset_x, offset_y ) =
1861 min_z + (rand() % max_z);
1868 maug_mlock( temp_grid_h, temp_grid );
1872 while( !finished ) {
1873 if( NULL != animation_cb ) {
1874 retval = animation_cb( animation_cb_data, -1 );
1875 maug_cleanup_if_not_ok();
1887 for( y = 0 ; t->
tiles_h > y ; y++ ) {
1888 for( x = 0 ; t->
tiles_w > x ; x++ ) {
1889 if( -1 == retrotile_get_tile( t, layer, x, y ) ) {
1900 for( side_iter = 0 ; 4 > side_iter ; side_iter++ ) {
1901#if RETROTILE_TRACE_LVL > 0
1903 SIZE_T_FMT
" (%d), " SIZE_T_FMT
" (%d) ("
1904 SIZE_T_FMT
", " SIZE_T_FMT
")",
1906 gc_retroflat_offsets4_x[side_iter],
1908 gc_retroflat_offsets4_y[side_iter],
1915 t->
tiles_w > x + gc_retroflat_offsets4_x[side_iter] &&
1916 t->
tiles_h > y + gc_retroflat_offsets4_y[side_iter] &&
1918 ((y + gc_retroflat_offsets4_y[side_iter]) *
1920 (x + gc_retroflat_offsets4_x[side_iter])]
1923 retrotile_get_tile( t, layer,
1924 x + gc_retroflat_offsets4_x[side_iter],
1925 y + gc_retroflat_offsets4_y[side_iter] ) =
1926 retrotile_get_tile( t, layer, x, y );
1936 if( NULL != temp_grid ) {
1937 maug_munlock( temp_grid_h, temp_grid );
1940 if( (MAUG_MHANDLE)NULL != temp_grid_h ) {
1941 maug_mfree( temp_grid_h );
1951 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1952 retrotile_ani_cb animation_cb,
void* animation_cb_data
1957 int16_t side_iter = 0,
1963 assert( NULL != t );
1964 layer = retrotile_get_layer_p( t, layer_idx );
1965 assert( NULL != layer );
1967 for( y = 0 ; t->
tiles_h > y ; y++ ) {
1968 if( NULL != animation_cb ) {
1969 retval = animation_cb( animation_cb_data, y );
1970 maug_cleanup_if_not_ok();
1972 for( x = 0 ; t->
tiles_w > x ; x++ ) {
1978 for( side_iter = 0 ; 8 > side_iter ; side_iter++ ) {
1980 t->
tiles_w <= x + gc_retroflat_offsets8_x[side_iter] ||
1981 t->
tiles_h <= y + gc_retroflat_offsets8_y[side_iter]
1987#if RETROTILE_TRACE_LVL > 0
1990 "si %d: x, y: " SIZE_T_FMT
" (+%d), " SIZE_T_FMT
1991 " (+%d) idx: " SIZE_T_FMT,
1993 x + gc_retroflat_offsets8_x[side_iter],
1994 gc_retroflat_offsets8_x[side_iter],
1995 y + gc_retroflat_offsets8_y[side_iter],
1996 gc_retroflat_offsets8_y[side_iter],
1997 ((y + gc_retroflat_offsets8_y[side_iter]) * t->
tiles_w) +
1998 x + gc_retroflat_offsets8_x[side_iter] );
2000 sides_sum += retrotile_get_tile(
2002 x + gc_retroflat_offsets8_x[side_iter],
2003 y + gc_retroflat_offsets8_y[side_iter] );
2006 retrotile_get_tile( t, layer, x, y ) = sides_sum / sides_avail;
2019 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
2020 retrotile_ani_cb animation_cb,
void* animation_cb_data
2031 int16_t ctr_iter = 0,
2035 assert( NULL != t );
2036 layer = retrotile_get_layer_p( t, layer_idx );
2037 assert( NULL != layer );
2040 for( i = 0 ; 0 <= borders[i].center ; i++ ) {
2041 borders[i].tiles_changed = 0;
2044#if RETROTILE_TRACE_LVL > 0
2048 for( y = 0 ; t->
tiles_h > y ; y++ ) {
2049 for( x = 0 ; t->
tiles_w > x ; x++ ) {
2051 while( 0 <= borders[i].center ) {
2053 ctr_iter = retrotile_get_tile( t, layer, x, y );
2054#if RETROTILE_TRACE_LVL > 0
2056 "x: " SIZE_T_FMT
", y: " SIZE_T_FMT
", 0x%04x vs 0x%04x",
2057 x, y, ctr_iter, borders[i].center );
2059 if( ctr_iter != borders[i].center ) {
2064#if RETROTILE_TRACE_LVL > 0
2069 for( side = 0 ; 8 > side ; side += 2 ) {
2071 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2072 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2078 outside_iter = retrotile_get_tile( t, layer,
2079 x + gc_retroflat_offsets8_x[side],
2080 y + gc_retroflat_offsets8_y[side] );
2084 if( side + 4 < 8 ) {
2085 x_plus_1 = x + gc_retroflat_offsets8_x[side + 4];
2086 y_plus_1 = y + gc_retroflat_offsets8_y[side + 4];
2088 x_plus_1 = x + gc_retroflat_offsets8_x[side - 4];
2089 y_plus_1 = y + gc_retroflat_offsets8_y[side - 4];
2093 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
2094 outside_iter == borders[i].outside &&
2095 outside_iter == retrotile_get_tile( t, layer,
2096 x_plus_1, y_plus_1 )
2100 retrotile_get_tile( t, layer, x, y ) =
2102 borders[i].tiles_changed++;
2109 for( side = 0 ; 8 > side ; side += 2 ) {
2111 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2112 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2118 outside_iter = retrotile_get_tile( t, layer,
2119 x + gc_retroflat_offsets8_x[side],
2120 y + gc_retroflat_offsets8_y[side] );
2124 if( side + 2 < 8 ) {
2125 x_plus_1 = x + gc_retroflat_offsets8_x[side + 2];
2126 y_plus_1 = y + gc_retroflat_offsets8_y[side + 2];
2128 x_plus_1 = x + gc_retroflat_offsets8_x[0];
2129 y_plus_1 = y + gc_retroflat_offsets8_y[0];
2133 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
2134 outside_iter == borders[i].outside &&
2135 outside_iter == retrotile_get_tile( t, layer,
2136 x_plus_1, y_plus_1 )
2139 retrotile_get_tile( t, layer, x, y ) =
2140 borders[i].
mod_to[side + 1 < 8 ? side + 1 : 0];
2141 borders[i].tiles_changed++;
2147 for( side = 0 ; 8 > side ; side += 2 ) {
2149 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2150 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2156 outside_iter = retrotile_get_tile( t, layer,
2157 x + gc_retroflat_offsets8_x[side],
2158 y + gc_retroflat_offsets8_y[side] );
2160 if( outside_iter == borders[i].outside ) {
2162#if RETROTILE_TRACE_LVL > 0
2165 retrotile_get_tile( t, layer, x, y ) =
2167 borders[i].tiles_changed++;
2185 struct RETROTILE* tilemap, uint32_t layer_idx
2188 uint8_t* tilemap_buf = (uint8_t*)tilemap;
2191 error_printf(
"invalid layer " U32_FMT
2192 " requested (of " U32_FMT
")!",
2198 tilemap_buf +=
sizeof(
struct RETROTILE );
2200 while( layer_idx > 0 ) {
2201 tilemap_buf += layer_iter->
total_sz;
2212 MAUG_MHANDLE* p_tilemap_h,
size_t w,
size_t h,
size_t layers_count,
2213 const char* tilemap_name,
const char* tileset_name
2217 size_t tilemap_sz = 0;
2221 tilemap_sz =
sizeof(
struct RETROTILE ) +
2225#if RETROTILE_TRACE_LVL > 0
2228 " tiles, " SIZE_T_FMT
" layers (" SIZE_T_FMT
" bytes)...",
2229 w, h, layers_count, tilemap_sz );
2232 maug_malloc_test( *p_tilemap_h, 1, tilemap_sz );
2234 maug_mlock( *p_tilemap_h, tilemap );
2235 maug_cleanup_if_null_alloc(
struct RETROTILE*, tilemap );
2237 maug_mzero( tilemap, tilemap_sz );
2250 layer_iter = retrotile_get_layer_p( tilemap, i );
2251 assert( NULL != layer_iter );
2254 maug_cleanup_if_not_ok();
2260 if( NULL != tilemap ) {
2261 maug_munlock( *p_tilemap_h, tilemap );
2269void retrotile_format_asset_path(
2276 parser->dirname, afile );
2283# define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \
2284 extern MAUG_CONST uint8_t SEG_MCONST name;
2286RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
2288# define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \
2289 extern MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A;
2291RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:28
MERROR_RETVAL mfile_open_read(const maug_path filename, mfile_t *p_file)
Open a file and read it into memory or memory-map it.
#define MAUG_PATH_SZ_MAX
Maximum size allocated for asset paths.
Definition: mfile.h:38
#define MERROR_PREEMPT
Indicates MLISP_AST_NODE can be executed again on next step iter pass.
Definition: merror.h:67
MERROR_RETVAL mfile_assign_path(maug_path tgt, const maug_path src, uint8_t flags)
Copy a maug_path from one place to another, safely observing character limits, etc.
char maug_path[MAUG_PATH_SZ_MAX]
Path/name used to load an asset from disk or access other files.
Definition: mfile.h:138
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition: retroflt.h:328
#define RETROFLAT_COLOR_TABLE(f)
This macro defines all colors supported by RetroFlat for primative operations, particularly using ret...
Definition: retroflt.h:309
#define RETROTILE_DS_FLAG_INIT_DATA
Flag for retrotile_gen_diamond_square_iter() indicating that passed RETROTILE_DATA_DS object should b...
Definition: retrotil.h:157
MERROR_RETVAL retrotile_gen_smooth_iter(struct RETROTILE *t, retroflat_tile_t min_z, retroflat_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
Average the values in adjacent tiles over an already-generated tilemap.
MERROR_RETVAL retrotile_gen_borders_iter(struct RETROTILE *t, retroflat_tile_t min_z, retroflat_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
Given a list of RETROTILE_DATA_BORDER structs, this will search for occurrences of RETROTILE_DATA_BOR...
MERROR_RETVAL retrotile_gen_diamond_square_iter(struct RETROTILE *t, retroflat_tile_t min_z, retroflat_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
Generate tilemap terrain using diamond square algorithm.
MERROR_RETVAL retrotile_gen_voronoi_iter(struct RETROTILE *t, retroflat_tile_t min_z, retroflat_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
Generate tilemap terrain using voronoi graph.
int retrotile_parse_prop_type(const char *token, size_t token_sz)
Convert a Tiled "type" field to an integer suitable for use with RETROTILE_PARSER::last_prop_type.
MERROR_RETVAL retrotile_parse_json_file(const maug_path dirname, const char *filename, MAUG_MHANDLE *p_tilemap_h, struct MDATA_VECTOR *p_tile_defs, mparser_wait_cb_t wait_cb, void *wait_data, mparser_parse_token_cb token_cb, void *token_cb_data, uint8_t passes, uint8_t flags)
Parse the JSON file at the given path into a heap-allocated tilemap with a RETROTILE struct header.
mfix_t retrotile_static_rotation_from_dir(const char *dir)
Convert a less-or-equal-to-two-character string to a direction in degrees.
#define RETROTILE_TILE_SCALE_DEFAULT
Default value for RETROTILE::tile_scale.
Definition: retrotil.h:35
#define RETROTILE_PROP_NAME_SZ_MAX
Maximum number of chars in a parsed property name.
Definition: retrotil.h:30
#define RETROTILE_TRACE_LVL
If defined, bring debug printf statements up to this level.
Definition: retrotil.h:40
int16_t retroflat_tile_t
Value for an individual tile in a RETROTILE_LAYER.
Definition: retroflt.h:19
#define RETROTILE_NAME_SZ_MAX
Maximum number of chars in a RETROTILE::name.
Definition: retrotil.h:25
A vector of uniformly-sized objects, stored contiguously.
Definition: mdata.h:108
#define mdata_vector_lock(v)
Lock the vector. This should be done when items from the vector are actively being referenced,...
Definition: mdata.h:372
#define mdata_vector_fill(v, ct_new, sz)
Allocate and mark the new slots as active.
Definition: mdata.h:460
#define mdata_vector_unlock(v)
Unlock the vector so items may be added and removed.
Definition: mdata.h:405
#define mdata_vector_ct(v)
Number of items of MDATA_VECTOR::item_sz bytes actively stored in this vector.
Definition: mdata.h:448
This is not currently used for anything, but is provided as a a convenience for game logic.
Definition: retrotil.h:210
Definition: retrotil.h:265
retroflat_tile_t mod_to[8]
If the center and outside match, use this mod-to.
Definition: retrotil.h:270
Internal data structure used by retrotile_gen_diamond_square_iter().
Definition: retrotil.h:248
int16_t sect_y
Starting Y of subsector in a given iteration.
Definition: retrotil.h:252
int16_t sect_w
Width of subsector in a given iteration.
Definition: retrotil.h:254
int16_t sect_w_half
Half of the width of subsector in a given iteration.
Definition: retrotil.h:258
int16_t sect_x
Starting X of subsector in a given iteration.
Definition: retrotil.h:250
int16_t sect_h
Height of subsector in a given iteration.
Definition: retrotil.h:256
int16_t sect_h_half
Half of the height of subsector in a given iteration.
Definition: retrotil.h:260
Definition: retrotil.h:198
size_t total_sz
Size of the layer in bytes (including this struct header).
Definition: retrotil.h:202
size_t sz
Size of this struct (useful for serializing).
Definition: retrotil.h:200
Definition: retrotil.h:312
mparser_parse_token_cb custom_token_cb
Callback to parse engine-specific custom tokens from the tilemap JSON. Should return MERROR_PREEMPT i...
Definition: retrotil.h:346
#define RETROTILE_PROP_TYPE_FILE
Value for RETROTILE_PARSER::last_prop_type indicating file path.
Definition: retrotil.h:139
#define RETROTILE_PARSER_MODE_DEFS
Value for RETROTILE_PARSER::mode indicating the parser is currently parsing tile definitions.
Definition: retrotil.h:78
#define RETROTILE_PROP_TYPE_STRING
Value for RETROTILE_PARSER::last_prop_type indicating string.
Definition: retrotil.h:133
char tilemap_name[RETROTILE_NAME_SZ_MAX+1]
The name to give to the new tilemap.
Definition: retrotil.h:329
#define RETROTILE_PROP_TYPE_INT
Value for RETROTILE_PARSER::last_prop_type indicating integer.
Definition: retrotil.h:145
char last_prop_name[RETROTILE_PROP_NAME_SZ_MAX+1]
The name of the last property key/value pair parsed.
Definition: retrotil.h:325
#define RETROTILE_PARSER_MODE_MAP
Value for RETROTILE_PARSER::mode indicating the parser is currently parsing a tilemap.
Definition: retrotil.h:71
uint8_t mode
Value indicating the current type of object being parsed into.
Definition: retrotil.h:319
size_t tileset_id_cur
Highest tileset ID on first pass and next ID to be assigned on second.
Definition: retrotil.h:336
#define RETROTILE_PROP_TYPE_OTHER
Value for RETROTILE_PARSER::last_prop_type indicating other type.
Definition: retrotil.h:127
#define RETROTILE_PARSER_FLAG_LITERAL_PATHS
Flag for RETROTILE_PARSER::flags indicating to use literal image asset paths.
Definition: retrotil.h:63
Definition: retrotil.h:164
mfix_t static_rotation
Field indicating how many degrees the tile should always be rotated before drawin on-screen....
Definition: retrotil.h:178
size_t sz
Size of this struct (useful for serializing).
Definition: retrotil.h:166
int8_t no_serial
Dummy field; do not serialize fields after this!
Definition: retrotil.h:182
A struct representing a tilemap.
Definition: retrotil.h:222
size_t tiles_h
Height of all layers of the tilemap in tiles.
Definition: retrotil.h:234
uint32_t total_sz
Size of the tilemap in bytes (including this struct header).
Definition: retrotil.h:228
size_t tileset_fgid
First GID in the accompanying tileset.
Definition: retrotil.h:232
float tile_scale
Amount by which to scale tiles (convenience property).
Definition: retrotil.h:241
size_t tiles_w
Width of all layers of the tilemap in tiles.
Definition: retrotil.h:236
uint32_t layers_count
Number of tile layers in this tilemap.
Definition: retrotil.h:230
size_t sz
Size of this struct (useful for serializing).
Definition: retrotil.h:224