17#define RETROTILE_PRESENT
19typedef int16_t retrotile_coord_t;
21#ifndef RETROTILE_TRACE_CHARS
22# define RETROTILE_TRACE_CHARS 0
25#ifndef RETROTILE_NAME_SZ_MAX
27# define RETROTILE_NAME_SZ_MAX 10
30#ifndef RETROTILE_PROP_NAME_SZ_MAX
32# define RETROTILE_PROP_NAME_SZ_MAX 10
35#ifndef RETROTILE_TILE_SCALE_DEFAULT
37# define RETROTILE_TILE_SCALE_DEFAULT 1.0f
40#ifndef RETROTILE_TRACE_LVL
42# define RETROTILE_TRACE_LVL 0
45#ifndef RETROTILE_VORONOI_DEFAULT_SPB
46# define RETROTILE_VORONOI_DEFAULT_SPB 8
49#ifndef RETROTILE_VORONOI_DEFAULT_DRIFT
50# define RETROTILE_VORONOI_DEFAULT_DRIFT 4
53#ifdef MPARSER_TRACE_NAMES
54# define retrotile_mstate_name( state ) gc_retrotile_mstate_names[state]
56# define retrotile_mstate_name( state ) state
59#ifndef RETROTILE_PARSER_FLAG_LITERAL_PATHS
65# define RETROTILE_PARSER_FLAG_LITERAL_PATHS 0x02
73#define RETROTILE_PARSER_MODE_MAP 0
80#define RETROTILE_PARSER_MODE_DEFS 1
82#define RETROTILE_CLASS_TABLE( f ) \
84 f( MOBILE, mobile, 1 ) \
103#define RETROTILE_TILE_FLAG_BLOCK 0x01
109#define RETROTILE_TILE_FLAG_RESERVED1 0x02
115#define RETROTILE_TILE_FLAG_RESERVED2 0x04
121#define RETROTILE_TILE_FLAG_RESERVED3 0x08
129#define RETROTILE_PROP_TYPE_OTHER 0
135#define RETROTILE_PROP_TYPE_STRING 1
141#define RETROTILE_PROP_TYPE_FILE 2
147#define RETROTILE_PROP_TYPE_INT 3
159#define RETROTILE_DS_FLAG_INIT_DATA 0x02
164#define RETROTILE_IDX_FMT "%u"
181 retrotile_coord_t warp_x;
182 retrotile_coord_t warp_y;
188 struct RETRO3DP_MODEL model;
190#ifdef RETROGXC_PRESENT
191 ssize_t image_cache_id;
194 struct RETROFLAT_BITMAP image;
205 uint16_t layer_class;
268 int16_t tiles_changed;
275#define retrotile_get_tile( tilemap, layer, x, y ) \
276 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
278#define retrotile_set_tile( tilemap, layer, x, y, new_val ) \
279 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
281#define retrotile_get_tiles_p( layer ) \
282 ((retroflat_tile_t*)(((uint8_t*)(layer)) + \
283 sizeof( struct RETROTILE_LAYER )))
288# define retrotile_clear_tiles( t, layer, i ) \
289 assert( 1 == sizeof( retroflat_tile_t ) ); \
292 (t)->tiles_w * (t)->tiles_h * sizeof( retroflat_tile_t ) > i ; \
295 retrotile_get_tiles_p( layer )[i] = -1; \
298# define retrotile_clear_tiles( t, layer, i ) \
299 memset( retrotile_get_tiles_p( layer ), -1, \
300 (t)->tiles_w * (t)->tiles_h * sizeof( retroflat_tile_t ) )
309 const char* dirname,
const char* filename, MAUG_MHANDLE* p_tm_h,
310 struct MDATA_VECTOR* p_td, mparser_wait_cb_t wait_cb,
void* wait_data,
311 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
322 mparser_wait_cb_t wait_cb;
324 retroflat_ms_t wait_last;
325 size_t layer_tile_iter;
329 size_t last_prop_name_sz;
333 size_t pass_layer_iter;
342 retrotile_tj_parse_cb tj_parse_cb;
349 void* custom_token_cb_data;
350 struct MJSON_PARSER jparser;
353 uint16_t layer_class;
357#define RETROTILE_PARSER_MSTATE_TABLE( f ) \
358 f( MTILESTATE_NONE, 0, "", 0, 0 ) \
359 f( MTILESTATE_HEIGHT, 1, "height", 0 , 0 ) \
360 f( MTILESTATE_WIDTH, 2, "width", 0 , 0 ) \
361 f( MTILESTATE_LAYERS, 3, "layers", 0 , 0 ) \
362 f( MTILESTATE_LAYER_DATA, 4, "data", 15 , 0 ) \
363 f( MTILESTATE_LAYER_NAME, 5, "name", 15 , 0 ) \
364 f( MTILESTATE_TILES, 6, "tiles", 0 , 1 ) \
365 f( MTILESTATE_TILES_ID, 7, "id", 6 , 1 ) \
366 f( MTILESTATE_TILES_IMAGE, 8, "image", 6 , 1 ) \
367 f( MTILESTATE_TILESETS, 9, "tilesets", 0 , 0 ) \
368 f( MTILESTATE_TILESETS_SRC, 10, "source", 9 , 0 ) \
369 f( MTILESTATE_TILESETS_FGID, 11, "firstgid", 9 , 0 ) \
370 f( MTILESTATE_TILESETS_PROP, 12, "firstgid", 9 , 0 ) \
371 f( MTILESTATE_GRID, 13, "grid", 0 , 1 ) \
372 f( MTILESTATE_TILES_PROP, 14, "properties", 6 , 1 ) \
373 f( MTILESTATE_LAYER, 15, "layers", 3 , 0 ) \
374 f( MTILESTATE_TILES_PROP_NAME, 16, "name", 14 , 1 ) \
375 f( MTILESTATE_TILES_PROP_TYPE, 17, "type", 14 , 1 ) \
376 f( MTILESTATE_TILES_PROP_VAL, 18, "value", 14 , 1 ) \
377 f( MTILESTATE_PROP, 19, "properties", 0 , 0 ) \
378 f( MTILESTATE_PROP_NAME, 20, "name", 19 , 0 ) \
379 f( MTILESTATE_PROP_TYPE, 21, "type", 19 , 0 ) \
380 f( MTILESTATE_PROP_VAL, 22, "value", 19 , 0 ) \
381 f( MTILESTATE_LAYER_CLASS, 23, "class", 15 , 0 ) \
382 f( MTILESTATE_TILES_CLASS, 24, "type", 6 , 1 ) \
383 f( MTILESTATE_NAME, 25, "name", 0 , 1 ) \
384 f( MTILESTATE_WANGSETS, 26, "wangsets", 0 , 1 ) \
385 f( MTILESTATE_TPROP, 27, "properties", 0 , 1 ) \
386 f( MTILESTATE_TPROP_NAME, 28, "name", 27 , 1 ) \
387 f( MTILESTATE_TPROP_TYPE, 29, "type", 27 , 1 ) \
388 f( MTILESTATE_TPROP_VAL, 30, "value", 27 , 1 )
435 const char* dirname,
const char* filename, MAUG_MHANDLE* p_tilemap_h,
437 mparser_wait_cb_t wait_cb,
void* wait_data,
438 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
450 void* animation_cb_data, int16_t iter );
454 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
455 retrotile_ani_cb animation_cb,
void* animation_cb_data );
468 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
469 retrotile_ani_cb animation_cb,
void* animation_cb_data );
483 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
484 retrotile_ani_cb animation_cb,
void* animation_cb_data );
495 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
496 retrotile_ani_cb animation_cb,
void* animation_cb_data );
506 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
507 retrotile_ani_cb animation_cb,
void* animation_cb_data );
512 struct RETROTILE* tilemap, uint32_t layer_idx );
515 MAUG_MHANDLE* p_tilemap_h,
size_t w,
size_t h,
size_t layers_count,
516 const char* tilemap_name,
const char* tileset_name );
518void retrotile_format_asset_path(
525 struct RETROFLAT_BITMAP* target,
534#if RETROTILE_TRACE_LVL > 0
535# define retrotile_parser_mstate( parser, new_mstate ) \
536 parser->mstate = new_mstate; \
538 RETROTILE_TRACE_LVL, "parser mstate: %d", parser->mstate );
540# define retrotile_parser_mstate( parser, new_mstate ) \
541 parser->mstate = new_mstate;
544# define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \
545 MAUG_CONST uint8_t SEG_MCONST name = idx;
547RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
549#ifdef MPARSER_TRACE_NAMES
550# define RETROTILE_PARSER_MSTATE_TABLE_NAME( name, idx, tokn, parent, m ) \
553static MAUG_CONST
char* SEG_MCONST gc_retrotile_mstate_names[] = {
554 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_NAME )
559# define RETROTILE_PARSER_MSTATE_TABLE_TOKEN( name, idx, tokn, parent, m ) \
562static MAUG_CONST
char* SEG_MCONST gc_retrotile_mstate_tokens[] = {
563 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_TOKEN )
567# define RETROTILE_PARSER_MSTATE_TABLE_PARNT( name, idx, tokn, parent, m ) \
570static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_parents[] = {
571 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_PARNT )
575# define RETROTILE_PARSER_MSTATE_TABLE_MODE( name, idx, tokn, parent, m ) \
578static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_modes[] = {
579 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_MODE )
583# define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \
584 MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A = i;
586RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
590static void retrotile_parser_match_token(
596 while(
'\0' != gc_retrotile_mstate_tokens[j][0] ) {
599 maug_strlen( gc_retrotile_mstate_tokens[j] ) != token_sz ||
601 token, gc_retrotile_mstate_tokens[j], token_sz + 1
612 parser->mstate != gc_retrotile_mstate_parents[j]
614#ifdef RETROTILE_TRACE_TOKENS
617 "found token \"%s\" "
618#ifdef MPARSER_TRACE_NAMES
619 "but incorrect parent %s (%d) (needs %s (%d))!",
621 "but incorrect parent %d (needs %d)!",
624#ifdef MPARSER_TRACE_NAMES
625 retrotile_mstate_name( parser->mstate ),
627 retrotile_mstate_name( gc_retrotile_mstate_parents[j] ),
628 gc_retrotile_mstate_parents[j]
631 gc_retrotile_mstate_parents[j]
638 }
else if( parser->
mode != gc_retrotile_mstate_modes[j] ) {
639#ifdef RETROTILE_TRACE_TOKENS
643 gc_retrotile_mstate_modes[j] );
650#ifdef RETROTILE_TRACE_TOKENS
653 "found token \"%s\" "
654#ifdef MPARSER_TRACE_NAMES
655 "under correct parent %s (%d)!",
657 "under correct parent %d!",
660#ifdef MPARSER_TRACE_NAMES
661 retrotile_mstate_name( parser->mstate ),
669 retrotile_parser_mstate( parser, j );
678 void* jparser_void,
const char* token,
size_t token_sz,
void* parser_arg
683 size_t tileset_id_parsed = 0;
694 parser, token, token_sz, parser_arg ))
699 if( MJSON_PSTATE_OBJECT_VAL != mjson_parser_pstate( &(parser->jparser) ) ) {
701 retrotile_parser_match_token( token, token_sz, parser );
705 if( MTILESTATE_TILES_ID == parser->mstate ) {
706 retrotile_parser_mstate( parser, MTILESTATE_TILES );
707 if( 0 == parser->pass ) {
709 tileset_id_parsed = maug_atou32( token, token_sz, 10 );
712#if RETROTILE_TRACE_LVL > 0
719 assert( 0 < mdata_vector_ct( parser->p_tile_defs ) );
721#if RETROTILE_TRACE_LVL > 0
727 retrotile_parser_mstate( parser, MTILESTATE_TILES );
729 }
else if( MTILESTATE_TILES_IMAGE == parser->mstate ) {
730 if( 1 == parser->pass ) {
732 mdata_vector_lock( parser->p_tile_defs );
733 tile_def = mdata_vector_get(
736 assert( NULL != tile_def );
743 mfile_assign_path( tile_def->image_path, token, 0 );
746 tile_def->image_path, token, MFILE_ASSIGN_FLAG_TRIM_EXT );
752#if RETROTILE_TRACE_LVL > 0
758 retrotile_parser_mstate( parser, MTILESTATE_TILES );
760 }
else if( MTILESTATE_TILES_CLASS == parser->mstate ) {
761 if( 1 == parser->pass ) {
768 mdata_vector_lock( parser->p_tile_defs );
769 tile_def = mdata_vector_get(
772 assert( NULL != tile_def );
773 assert( 0 == tile_def->tile_class );
775#if RETROTILE_TRACE_LVL > 0
776 #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \
777 } else if( 0 == maug_strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \
778 tile_def->tile_class = RETROTILE_CLASS_ ## A; \
779 debug_printf( RETROTILE_TRACE_LVL, \
780 "set tile " SIZE_T_FMT " type: " #a " (%u)", \
781 parser->tileset_id_cur, tile_def->tile_class );
783 #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \
784 } else if( 0 == maug_strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \
785 tile_def->tile_class = RETROTILE_CLASS_ ## A;
789 RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_SET )
791 tile_def->tile_class = RETROTILE_CLASS_TILE;
792#if RETROTILE_TRACE_LVL > 0
794 "set tile " SIZE_T_FMT
" type: tile (%u)",
799 retrotile_parser_mstate( parser, MTILESTATE_TILES );
801 }
else if( MTILESTATE_TILES_PROP_NAME == parser->mstate ) {
802#if RETROTILE_TRACE_LVL > 0
807 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
809 }
else if( MTILESTATE_TILES_PROP_TYPE == parser->mstate ) {
810#if RETROTILE_TRACE_LVL > 0
815 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
817 }
else if( MTILESTATE_TILES_PROP_VAL == parser->mstate ) {
821 if( 1 == parser->pass ) {
822 mdata_vector_lock( parser->p_tile_defs );
823 tile_def = mdata_vector_get(
826 assert( NULL != tile_def );
828 if( 0 == maug_strncmp(
"warp_dest", parser->
last_prop_name, 10 ) ) {
831#if RETROTILE_TRACE_LVL > 0
837 }
else if( 0 == maug_strncmp(
"warp_x", parser->
last_prop_name, 7 ) ) {
838 tile_def->warp_x = maug_atos32( token, token_sz );
839#if RETROTILE_TRACE_LVL > 0
845 }
else if( 0 == maug_strncmp(
"warp_y", parser->
last_prop_name, 7 ) ) {
846 tile_def->warp_y = maug_atos32( token, token_sz );
847#if RETROTILE_TRACE_LVL > 0
853 }
else if( 0 == maug_strncmp(
"color", parser->
last_prop_name, 7 ) ) {
855#define RETROFLAT_COLOR_TABLE_TILPRP( idx, name_l, name_u, r, g, b, cgc, cgd ) \
856 } else if( 0 == maug_strncmp( token, #name_l, token_sz ) ) { \
857 tile_def->color = RETROFLAT_COLOR_ ## name_u;
863#if RETROTILE_TRACE_LVL > 0
873 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
875 }
else if( MTILESTATE_NAME == parser->mstate ) {
877#if RETROTILE_TRACE_LVL > 0
882 retrotile_parser_mstate( parser, 0 );
884 }
else if( MTILESTATE_TPROP_NAME == parser->mstate ) {
888 parser->last_prop_name_sz = token_sz;
889 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
891 }
else if( MTILESTATE_TPROP_TYPE == parser->mstate ) {
892#if RETROTILE_TRACE_LVL > 0
897 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
899 }
else if( MTILESTATE_TPROP_VAL == parser->mstate ) {
902 retrotile_parser_mstate( parser, MTILESTATE_TPROP );
907 mdata_vector_unlock( parser->p_tile_defs );
920 void* jparser_void,
const char* token,
size_t token_sz,
void* parser_arg
932 parser, token, token_sz, parser_arg ))
937 if( MJSON_PSTATE_LIST == mjson_parser_pstate( &(parser->jparser) ) ) {
947 MTILESTATE_LAYER_DATA == parser->mstate
962 assert( NULL != parser->t );
963 tiles_layer = retrotile_get_layer_p(
964 parser->t, parser->pass_layer_iter );
965 assert( NULL != tiles_layer );
968 tiles_layer->layer_class = parser->layer_class;
970 tiles = retrotile_get_tiles_p( tiles_layer );
979 assert( NULL != token );
980 assert( NULL != parser );
981 assert( NULL != tiles );
984 parser->layer_tile_iter >=
989 "tile " SIZE_T_FMT
" outside of layer tile buffer size "
991 parser->layer_tile_iter,
993 retval = MERROR_OVERFLOW;
997 assert( 0 == tiles[parser->layer_tile_iter] );
999 tiles[parser->layer_tile_iter] = maug_atou32(
1000 token, token_sz, 10 );
1003 parser->layer_tile_iter++;
1007 MJSON_PSTATE_OBJECT_VAL ==
1008 mjson_parser_pstate( &(parser->jparser) )
1019 if( MTILESTATE_TILESETS_FGID == parser->mstate ) {
1020 if( 1 == parser->pass ) {
1021 parser->t->
tileset_fgid = maug_atou32( token, token_sz, 10 );
1022#if RETROTILE_TRACE_LVL > 0
1028 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
1030 }
else if( MTILESTATE_TILESETS_SRC == parser->mstate ) {
1031 if( 1 == parser->pass ) {
1032#if RETROTILE_TRACE_LVL > 0
1035 parser->tj_parse_cb(
1036 parser->dirname, token, NULL, parser->p_tile_defs,
1037 parser->wait_cb, parser->wait_data,
1039 parser->passes_max, parser->flags );
1041 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
1043 }
else if( MTILESTATE_HEIGHT == parser->mstate ) {
1044 if( 0 == parser->pass ) {
1046 parser->tiles_h = maug_atou32( token, token_sz, 10 );
1047#if RETROTILE_TRACE_LVL > 0
1053 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1055 }
else if( MTILESTATE_WIDTH == parser->mstate ) {
1056 if( 0 == parser->pass ) {
1058 parser->tiles_w = maug_atou32( token, token_sz, 10 );
1059#if RETROTILE_TRACE_LVL > 0
1065 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1067 }
else if( MTILESTATE_LAYER_NAME == parser->mstate ) {
1069 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1071 }
else if( MTILESTATE_LAYER_CLASS == parser->mstate ) {
1073 if( 0 == maug_strncmp(
"mobile", token, 7 ) ) {
1074#if RETROTILE_TRACE_LVL > 0
1076 "layer " SIZE_T_FMT
" type: mobile",
1077 parser->pass_layer_iter );
1079 parser->layer_class = RETROTILE_CLASS_MOBILE;
1081#if RETROTILE_TRACE_LVL > 0
1083 "layer " SIZE_T_FMT
" type: tile",
1084 parser->pass_layer_iter );
1086 parser->layer_class = RETROTILE_CLASS_TILE;
1088 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1090 }
else if( MTILESTATE_PROP_NAME == parser->mstate ) {
1094 parser->last_prop_name_sz = token_sz;
1095 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1097 }
else if( MTILESTATE_PROP_TYPE == parser->mstate ) {
1098#if RETROTILE_TRACE_LVL > 0
1103 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1105 }
else if( MTILESTATE_PROP_VAL == parser->mstate ) {
1108#if RETROTILE_TRACE_LVL > 0
1115 retrotile_parser_mstate( parser, MTILESTATE_PROP );
1120 retrotile_parser_match_token( token, token_sz, parser );
1130 struct MJSON_PARSER* jparser,
void* parg
1134 if( MTILESTATE_LAYER_DATA == parser->mstate ) {
1136#if RETROTILE_TRACE_LVL > 0
1138 parser->layer_tile_iter );
1140 assert( parser->layer_tile_iter > 0 );
1141 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1143 }
else if( MTILESTATE_LAYERS == parser->mstate ) {
1145 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1147 }
else if( MTILESTATE_TILESETS == parser->mstate ) {
1149 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1151 }
else if( MTILESTATE_TILES_PROP == parser->mstate ) {
1153 retrotile_parser_mstate( parser, MTILESTATE_TILES );
1155 }
else if( MTILESTATE_TILES == parser->mstate ) {
1157 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1159 }
else if( MTILESTATE_PROP == parser->mstate ) {
1160 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1162 }
else if( MTILESTATE_TPROP == parser->mstate ) {
1163 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1172 struct MJSON_PARSER* jparser,
void* parg
1176 if( MTILESTATE_LAYERS == parser->mstate ) {
1180 parser->layer_tile_iter = 0;
1181 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
1190 struct MJSON_PARSER* jparser,
void* parg
1194 if( MTILESTATE_LAYER == parser->mstate ) {
1196#if RETROTILE_TRACE_LVL > 0
1198 "incrementing pass layer to " SIZE_T_FMT
" after " SIZE_T_FMT
1200 parser->pass_layer_iter + 1, parser->layer_tile_iter );
1202 parser->pass_layer_iter++;
1203 retrotile_parser_mstate( parser, MTILESTATE_LAYERS );
1205 }
else if( MTILESTATE_GRID == parser->mstate ) {
1206 retrotile_parser_mstate( parser, MTILESTATE_NONE );
1217 if( 0 == maug_strncmp(
"string", token, 7 ) ) {
1219 }
else if( 0 == maug_strncmp(
"file", token, 5 ) ) {
1221 }
else if( 0 == maug_strncmp(
"int", token, 4 ) ) {
1231 mfix_t static_rotate_out = 0;
1238 if( 0 == maug_strncmp( dir,
"NW", 3 ) ) {
1239 static_rotate_out = mfix_from_f( 90.0f );
1240 }
else if( 0 == maug_strncmp( dir,
"SW", 3 ) ) {
1241 static_rotate_out = mfix_from_f( 180.0f );
1242 }
else if( 0 == maug_strncmp( dir,
"SE", 3 ) ) {
1243 static_rotate_out = mfix_from_f( 270.0f );
1245 }
else if( 0 == maug_strncmp( dir,
"W", 2 ) ) {
1246 static_rotate_out = mfix_from_f( 90.0f );
1247 }
else if( 0 == maug_strncmp( dir,
"S", 2 ) ) {
1248 static_rotate_out = mfix_from_f( 180.0f );
1249 }
else if( 0 == maug_strncmp( dir,
"E", 2 ) ) {
1250 static_rotate_out = mfix_from_f( 270.0f );
1253 static_rotate_out = 0;
1256 return static_rotate_out;
1262 const char* dirname,
const char* filename, MAUG_MHANDLE* p_tilemap_h,
1263 struct MDATA_VECTOR* p_tile_defs, mparser_wait_cb_t wait_cb,
void* wait_data,
1264 mparser_parse_token_cb token_cb,
void* token_cb_data, uint8_t passes,
1268 MAUG_MHANDLE parser_h = (MAUG_MHANDLE)NULL;
1273 char* filename_ext = NULL;
1277 maug_cleanup_if_null_alloc( MAUG_MHANDLE, parser_h );
1279 maug_mlock( parser_h, parser );
1283 parser->flags = flags;
1286 parser->custom_token_cb_data = token_cb_data;
1291#if RETROTILE_TRACE_LVL > 0
1293 "increasing parse passes to minimum, 2!" );
1298 parser->passes_max = passes;
1306#if RETROTILE_TRACE_LVL > 0
1311 maug_cleanup_if_not_ok();
1314 for( parser->pass = 0 ; passes > parser->pass ; parser->pass++ ) {
1315#if RETROTILE_TRACE_LVL > 0
1324 maug_mzero( &(parser->jparser.base),
sizeof(
struct MJSON_PARSER ) );
1326 parser->wait_cb = wait_cb;
1327 parser->wait_data = wait_data;
1328 parser->jparser.base.wait_cb = wait_cb;
1329 parser->jparser.base.wait_data = wait_data;
1332 filename_ext = maug_strrchr( filename,
'.' );
1333 if( NULL == filename_ext ) {
1334 error_printf(
"could not parse filename extension!" );
1335 retval = MERROR_FILE;
1338 if(
's' == filename_ext[2] ) {
1339#if RETROTILE_TRACE_LVL > 0
1341 "(tile_defs pass %u)", parser->pass );
1344 parser->jparser.token_parser = retrotile_parser_parse_tiledef_token;
1345 parser->jparser.token_parser_arg = parser;
1346 parser->jparser.close_list = retrotile_json_close_list;
1347 parser->jparser.close_list_arg = parser;
1348 parser->jparser.close_obj = retrotile_json_close_obj;
1349 parser->jparser.close_obj_arg = parser;
1354 parser->p_tile_defs = p_tile_defs;
1356 assert( NULL != p_tile_defs );
1357 if( 1 == parser->pass ) {
1362#if RETROTILE_TRACE_LVL > 0
1372#if RETROTILE_TRACE_LVL > 0
1377 parser->jparser.close_list = retrotile_json_close_list;
1378 parser->jparser.close_list_arg = parser;
1379 parser->jparser.open_obj = retrotile_json_open_obj;
1380 parser->jparser.open_obj_arg = parser;
1381 parser->jparser.close_obj = retrotile_json_close_obj;
1382 parser->jparser.close_obj_arg = parser;
1383 parser->jparser.token_parser = retrotile_parser_parse_token;
1384 parser->jparser.token_parser_arg = parser;
1385 parser->p_tile_defs = p_tile_defs;
1387 assert( NULL != p_tilemap_h );
1388 assert( NULL != p_tile_defs );
1389 if( 1 == parser->pass ) {
1391 retval = retrotile_alloc(
1392 p_tilemap_h, parser->tiles_w, parser->tiles_h,
1394 parser->tileset_name );
1395 maug_cleanup_if_not_ok();
1396 maug_mlock( *p_tilemap_h, parser->t );
1398 parser->pass_layer_iter = 0;
1401 while( tile_file.has_bytes( &tile_file ) ) {
1402 tile_file.read_int( &tile_file, (uint8_t*)&c, 1, 0 );
1403#if RETROTILE_TRACE_CHARS > 0
1404 debug_printf( RETROTILE_TRACE_CHARS,
"%c", c );
1406 retval = mjson_parse_c( &(parser->jparser), c );
1407 if( MERROR_OK != retval ) {
1408 error_printf(
"error parsing JSON!" );
1413 tile_file.seek( &tile_file, 0 );
1415 filename_ext = maug_strrchr( filename,
'.' );
1416 if( NULL == filename_ext ) {
1417 error_printf(
"could not parse filename extension!" );
1418 retval = MERROR_FILE;
1421 if(
's' != filename_ext[2] ) {
1422#if RETROTILE_TRACE_LVL > 0
1424 "pass %u found " SIZE_T_FMT
" layers",
1425 parser->pass, parser->pass_layer_iter );
1430#if RETROTILE_TRACE_LVL > 0
1433 filename_path, retval );
1438 if( NULL != parser ) {
1439 if( NULL != parser->t ) {
1440 maug_munlock( *p_tilemap_h, parser->t );
1442 maug_munlock( parser_h, parser );
1445 if( (MAUG_MHANDLE)NULL != parser_h ) {
1446 maug_mfree( parser_h );
1460 if( 8 > rand() % 10 ) {
1462 avg -= (min_z / tuning) + (rand() % (max_z / tuning));
1482static void retrotile_gen_diamond_square_corners(
1483 int16_t corners_x[2][2], int16_t corners_y[2][2],
1496 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
1497 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
1500 corners_x[iter_x][iter_y] =
1502 if( 0 > corners_x[iter_x][iter_y] ) {
1503 corners_x[iter_x][iter_y] += 1;
1507 corners_y[iter_x][iter_y] =
1509 if( 0 > corners_y[iter_x][iter_y] ) {
1510 corners_y[iter_x][iter_y] += 1;
1516 assert( 0 <= corners_x[0][0] );
1517 assert( 0 <= corners_y[0][0] );
1518 assert( t->
tiles_w > corners_x[0][0] );
1519 assert( t->
tiles_h > corners_y[0][0] );
1522 top_left_z = retrotile_get_tile(
1527 if( 0 > top_left_z ) {
1530 corners_x[0][0] >= 0 ? corners_x[0][0] : 0,
1531 corners_y[0][0] >= 0 ? corners_y[0][0] : 0 ) = max_z;
1536 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
1537 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
1539 tile_iter = &(retrotile_get_tile(
1541 corners_x[iter_x][iter_y],
1542 corners_y[iter_x][iter_y] ));
1545 if( -1 != *tile_iter ) {
1546#if RETROTILE_TRACE_LVL > 0
1549 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
1552 corners_x[iter_x][iter_y],
1553 corners_y[iter_x][iter_y] ) );
1559 *tile_iter = retrotile_gen_diamond_square_rand(
1560 min_z, max_z, tuning, top_left_z );
1562#if RETROTILE_TRACE_LVL > 0
1564 "missing corner coord %d x %d: %d",
1565 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
1575 int16_t corners_x[2][2], int16_t corners_y[2][2],
1584 for( iter_y = 0 ; 2 > iter_y ; iter_y++ ) {
1585 for( iter_x = 0 ; 2 > iter_x ; iter_x++ ) {
1586 tile_iter = &(retrotile_get_tile(
1588 corners_x[iter_x][iter_y],
1589 corners_y[iter_x][iter_y] ));
1590 assert( -1 != *tile_iter );
1611 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1612 retrotile_ani_cb animation_cb,
void* animation_cb_data
1616#if RETROTILE_TRACE_LVL > 0
1621 int16_t corners_x[2][2];
1622 int16_t corners_y[2][2];
1626 MAUG_MHANDLE data_ds_h = (MAUG_MHANDLE)NULL;
1632 uint8_t free_ds_data = 0;
1633#ifdef MAUG_NO_STDLIB
1642 #define _retrotile_ds_update_statistics( data, tile ) \
1644 if( (data)->highest_generated < (tile) && 32767 > (tile) ) { \
1645 (data)->highest_generated = (tile); \
1647 if( (data)->lowest_generated > (tile) && 0 < (tile) ) { \
1648 (data)->lowest_generated = (tile); \
1651 layer = retrotile_get_layer_p( t, layer_idx );
1659 if( NULL == data ) {
1662 maug_cleanup_if_null_alloc( MAUG_MHANDLE, data_ds_h );
1664 maug_mlock( data_ds_h, data_ds );
1671 retrotile_clear_tiles( t, layer, i );
1679 data_ds->lowest_generated = 32767;
1686 assert( NULL != data_ds );
1689 if( 0 == data_ds->
sect_w ) {
1690#if RETROTILE_TRACE_LVL > 0
1701#if RETROTILE_TRACE_LVL > 0
1708#if RETROTILE_TRACE_LVL > 0
1713 retrotile_gen_diamond_square_corners(
1714 corners_x, corners_y, min_z, max_z, tuning, data_ds, layer, t );
1718#if RETROTILE_TRACE_LVL > 0
1721 "%d return: reached innermost point", iter_depth );
1727 retrotile_gen_diamond_square_avg( corners_x, corners_y, t, layer );
1729#if RETROTILE_TRACE_LVL > 0
1733 tile_iter = &(retrotile_get_tile(
1737 if( -1 != *tile_iter ) {
1738#if RETROTILE_TRACE_LVL > 0
1746 _retrotile_ds_update_statistics( data_ds, avg );
1755 iter_y = data_ds->
sect_y ;
1760 iter_x = data_ds->
sect_x ;
1764 data_ds_sub.sect_x = data_ds->
sect_x + iter_x;
1766 data_ds_sub.sect_y = data_ds->
sect_y + iter_y;
1770 data_ds_sub.sect_w_half = data_ds_sub.sect_w >> 1;
1771 data_ds_sub.sect_h_half = data_ds_sub.sect_h >> 1;
1772 data_ds_sub.lowest_generated = 32767;
1773 data_ds_sub.highest_generated = 0;
1775#if RETROTILE_TRACE_LVL > 0
1779 data_ds_sub.sect_x, data_ds_sub.sect_y, data_ds_sub.sect_w );
1783 t, min_z, max_z, tuning, layer_idx, flags, &data_ds_sub,
1784 animation_cb, animation_cb_data );
1785 maug_cleanup_if_not_ok();
1787 _retrotile_ds_update_statistics(
1788 data_ds, data_ds_sub.highest_generated );
1789 _retrotile_ds_update_statistics(
1790 data_ds, data_ds_sub.lowest_generated );
1796 NULL != animation_cb
1798 retval = animation_cb( animation_cb_data, iter_y );
1799 maug_cleanup_if_not_ok();
1802#if RETROTILE_TRACE_LVL > 0
1809 if( free_ds_data && NULL != data_ds ) {
1810 maug_munlock( data_ds_h, data_ds );
1813 if( free_ds_data && (MAUG_MHANDLE)NULL != data_ds_h ) {
1814 maug_mfree( data_ds_h );
1824 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1825 retrotile_ani_cb animation_cb,
void* animation_cb_data
1829 int16_t offset_x = 0,
1834 int16_t spb = RETROTILE_VORONOI_DEFAULT_SPB;
1835 int16_t drift = RETROTILE_VORONOI_DEFAULT_DRIFT;
1836 MAUG_MHANDLE temp_grid_h = (MAUG_MHANDLE)NULL;
1840 int8_t side_iter = 0;
1841#ifdef MAUG_NO_STDLIB
1845 layer = retrotile_get_layer_p( t, 0 );
1847 tiles = retrotile_get_tiles_p( layer );
1850 retrotile_clear_tiles( t, layer, i );
1853 for( y = 0 ; t->
tiles_w > y ; y += spb ) {
1854 for( x = 0 ; t->
tiles_w > x ; x += spb ) {
1855 offset_x = x + ((drift * -1) + (rand() % drift));
1856 offset_y = y + ((drift * -1) + (rand() % drift));
1859 if( 0 > offset_x ) {
1862 if( offset_x >= t->
tiles_w ) {
1865 if( 0 > offset_y ) {
1868 if( offset_y >= t->
tiles_h ) {
1872 retrotile_get_tile( t, layer, offset_x, offset_y ) =
1873 min_z + (rand() % max_z);
1877 temp_grid_h = maug_malloc(
1879 maug_cleanup_if_null_alloc( MAUG_MHANDLE, temp_grid_h );
1881 maug_mlock( temp_grid_h, temp_grid );
1885 while( !finished ) {
1886 if( NULL != animation_cb ) {
1887 retval = animation_cb( animation_cb_data, -1 );
1888 maug_cleanup_if_not_ok();
1900 for( y = 0 ; t->
tiles_h > y ; y++ ) {
1901 for( x = 0 ; t->
tiles_w > x ; x++ ) {
1902 if( -1 == retrotile_get_tile( t, layer, x, y ) ) {
1913 for( side_iter = 0 ; 4 > side_iter ; side_iter++ ) {
1914#if RETROTILE_TRACE_LVL > 0
1916 SIZE_T_FMT
" (%d), " SIZE_T_FMT
" (%d) ("
1917 SIZE_T_FMT
", " SIZE_T_FMT
")",
1919 gc_retroflat_offsets4_x[side_iter],
1921 gc_retroflat_offsets4_y[side_iter],
1928 t->
tiles_w > x + gc_retroflat_offsets4_x[side_iter] &&
1929 t->
tiles_h > y + gc_retroflat_offsets4_y[side_iter] &&
1931 ((y + gc_retroflat_offsets4_y[side_iter]) *
1933 (x + gc_retroflat_offsets4_x[side_iter])]
1936 retrotile_get_tile( t, layer,
1937 x + gc_retroflat_offsets4_x[side_iter],
1938 y + gc_retroflat_offsets4_y[side_iter] ) =
1939 retrotile_get_tile( t, layer, x, y );
1949 if( NULL != temp_grid ) {
1950 maug_munlock( temp_grid_h, temp_grid );
1953 if( (MAUG_MHANDLE)NULL != temp_grid_h ) {
1954 maug_mfree( temp_grid_h );
1964 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
1965 retrotile_ani_cb animation_cb,
void* animation_cb_data
1970 int16_t side_iter = 0,
1976 assert( NULL != t );
1977 layer = retrotile_get_layer_p( t, layer_idx );
1978 assert( NULL != layer );
1980 for( y = 0 ; t->
tiles_h > y ; y++ ) {
1981 if( NULL != animation_cb ) {
1982 retval = animation_cb( animation_cb_data, y );
1983 maug_cleanup_if_not_ok();
1985 for( x = 0 ; t->
tiles_w > x ; x++ ) {
1991 for( side_iter = 0 ; 8 > side_iter ; side_iter++ ) {
1993 t->
tiles_w <= x + gc_retroflat_offsets8_x[side_iter] ||
1994 t->
tiles_h <= y + gc_retroflat_offsets8_y[side_iter]
2000#if RETROTILE_TRACE_LVL > 0
2003 "si %d: x, y: " SIZE_T_FMT
" (+%d), " SIZE_T_FMT
2004 " (+%d) idx: " SIZE_T_FMT,
2006 x + gc_retroflat_offsets8_x[side_iter],
2007 gc_retroflat_offsets8_x[side_iter],
2008 y + gc_retroflat_offsets8_y[side_iter],
2009 gc_retroflat_offsets8_y[side_iter],
2010 ((y + gc_retroflat_offsets8_y[side_iter]) * t->
tiles_w) +
2011 x + gc_retroflat_offsets8_x[side_iter] );
2013 sides_sum += retrotile_get_tile(
2015 x + gc_retroflat_offsets8_x[side_iter],
2016 y + gc_retroflat_offsets8_y[side_iter] );
2019 retrotile_get_tile( t, layer, x, y ) = sides_sum / sides_avail;
2032 uint32_t tuning,
size_t layer_idx, uint8_t flags,
void* data,
2033 retrotile_ani_cb animation_cb,
void* animation_cb_data
2044 int16_t ctr_iter = 0,
2048 assert( NULL != t );
2049 layer = retrotile_get_layer_p( t, layer_idx );
2050 assert( NULL != layer );
2053 for( i = 0 ; 0 <= borders[i].center ; i++ ) {
2054 borders[i].tiles_changed = 0;
2057#if RETROTILE_TRACE_LVL > 0
2061 for( y = 0 ; t->
tiles_h > y ; y++ ) {
2062 for( x = 0 ; t->
tiles_w > x ; x++ ) {
2064 while( 0 <= borders[i].center ) {
2066 ctr_iter = retrotile_get_tile( t, layer, x, y );
2067#if RETROTILE_TRACE_LVL > 0
2069 "x: " SIZE_T_FMT
", y: " SIZE_T_FMT
", 0x%04x vs 0x%04x",
2070 x, y, ctr_iter, borders[i].center );
2072 if( ctr_iter != borders[i].center ) {
2077#if RETROTILE_TRACE_LVL > 0
2082 for( side = 0 ; 8 > side ; side += 2 ) {
2084 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2085 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2091 outside_iter = retrotile_get_tile( t, layer,
2092 x + gc_retroflat_offsets8_x[side],
2093 y + gc_retroflat_offsets8_y[side] );
2097 if( side + 4 < 8 ) {
2098 x_plus_1 = x + gc_retroflat_offsets8_x[side + 4];
2099 y_plus_1 = y + gc_retroflat_offsets8_y[side + 4];
2101 x_plus_1 = x + gc_retroflat_offsets8_x[side - 4];
2102 y_plus_1 = y + gc_retroflat_offsets8_y[side - 4];
2106 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
2107 outside_iter == borders[i].outside &&
2108 outside_iter == retrotile_get_tile( t, layer,
2109 x_plus_1, y_plus_1 )
2113 retrotile_get_tile( t, layer, x, y ) =
2115 borders[i].tiles_changed++;
2122 for( side = 0 ; 8 > side ; side += 2 ) {
2124 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2125 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2131 outside_iter = retrotile_get_tile( t, layer,
2132 x + gc_retroflat_offsets8_x[side],
2133 y + gc_retroflat_offsets8_y[side] );
2137 if( side + 2 < 8 ) {
2138 x_plus_1 = x + gc_retroflat_offsets8_x[side + 2];
2139 y_plus_1 = y + gc_retroflat_offsets8_y[side + 2];
2141 x_plus_1 = x + gc_retroflat_offsets8_x[0];
2142 y_plus_1 = y + gc_retroflat_offsets8_y[0];
2146 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
2147 outside_iter == borders[i].outside &&
2148 outside_iter == retrotile_get_tile( t, layer,
2149 x_plus_1, y_plus_1 )
2152 retrotile_get_tile( t, layer, x, y ) =
2153 borders[i].
mod_to[side + 1 < 8 ? side + 1 : 0];
2154 borders[i].tiles_changed++;
2160 for( side = 0 ; 8 > side ; side += 2 ) {
2162 x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
2163 y + gc_retroflat_offsets8_y[side] > t->
tiles_h
2169 outside_iter = retrotile_get_tile( t, layer,
2170 x + gc_retroflat_offsets8_x[side],
2171 y + gc_retroflat_offsets8_y[side] );
2173 if( outside_iter == borders[i].outside ) {
2175#if RETROTILE_TRACE_LVL > 0
2178 retrotile_get_tile( t, layer, x, y ) =
2180 borders[i].tiles_changed++;
2198 struct RETROTILE* tilemap, uint32_t layer_idx
2201 uint8_t* tilemap_buf = (uint8_t*)tilemap;
2204 error_printf(
"invalid layer " U32_FMT
2205 " requested (of " U32_FMT
")!",
2211 tilemap_buf +=
sizeof(
struct RETROTILE );
2213 while( layer_idx > 0 ) {
2214 tilemap_buf += layer_iter->
total_sz;
2225 MAUG_MHANDLE* p_tilemap_h,
size_t w,
size_t h,
size_t layers_count,
2226 const char* tilemap_name,
const char* tileset_name
2230 size_t tilemap_sz = 0;
2234 tilemap_sz =
sizeof(
struct RETROTILE ) +
2238#if RETROTILE_TRACE_LVL > 0
2241 " tiles, " SIZE_T_FMT
" layers (" SIZE_T_FMT
" bytes)...",
2242 w, h, layers_count, tilemap_sz );
2245 *p_tilemap_h = maug_malloc( 1, tilemap_sz );
2246 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_tilemap_h );
2248 maug_mlock( *p_tilemap_h, tilemap );
2249 maug_cleanup_if_null_alloc(
struct RETROTILE*, tilemap );
2251 maug_mzero( tilemap, tilemap_sz );
2264 layer_iter = retrotile_get_layer_p( tilemap, i );
2265 assert( NULL != layer_iter );
2268 maug_cleanup_if_not_ok();
2274 if( NULL != tilemap ) {
2275 maug_munlock( *p_tilemap_h, tilemap );
2283void retrotile_format_asset_path(
2290 parser->dirname, afile );
2297#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
2301#if RETROTILE_TRACE_LVL > 0
2303 "clearing " SIZE_T_FMT
" vertical viewport pixels (" SIZE_T_FMT
2305 y_max, y_max / RETROFLAT_TILE_H );
2308 retroflat_viewport_lock_refresh();
2309 for( y = 0 ; y_max > y ; y += RETROFLAT_TILE_H ) {
2310 for( x = 0 ; retroflat_viewport_screen_w() > x ; x += RETROFLAT_TILE_W ) {
2311 retroflat_viewport_set_refresh( x, y, -1 );
2317 retroflat_viewport_unlock_refresh();
2327 struct RETROFLAT_BITMAP* target,
2339 layer = retrotile_get_layer_p( t, 0 );
2341 mdata_vector_lock( t_defs );
2346 y = ((retroflat_viewport_world_y() >>
2347 RETROFLAT_TILE_H_BITS) << RETROFLAT_TILE_H_BITS) ;
2348 y < (int)retroflat_viewport_world_y() +
2349 (int)retroflat_viewport_screen_h() ;
2350 y += RETROFLAT_TILE_H
2353 x = ((retroflat_viewport_world_x() >>
2354 RETROFLAT_TILE_W_BITS) << RETROFLAT_TILE_W_BITS) ;
2355 x < (int)retroflat_viewport_world_x() +
2356 (int)retroflat_viewport_screen_w() ;
2357 x += RETROFLAT_TILE_W
2362 (
int)retroflat_viewport_world_w() <= x ||
2363 (
int)retroflat_viewport_world_h() <= y
2369 x_tile = x >> RETROFLAT_TILE_W_BITS;
2370 y_tile = y >> RETROFLAT_TILE_H_BITS;
2372 tile_id = retrotile_get_tile( t, layer, x_tile, y_tile );
2373 t_def = mdata_vector_get(
2375 if( NULL == t_def ) {
2377 "invalid tile ID: %d (- " SIZE_T_FMT
" = " SIZE_T_FMT
")",
2381 assert( NULL != t_def );
2383#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
2385 retroflat_viewport_lock_refresh();
2386 if( !retroflat_viewport_tile_is_stale(
2387 x - retroflat_viewport_world_x(),
2388 y - retroflat_viewport_world_y(), tile_id
2390 retroflat_viewport_unlock_refresh();
2399 retroflat_viewport_set_refresh(
2400 x - retroflat_viewport_world_x(),
2401 y - retroflat_viewport_world_y(), tile_id );
2402 retroflat_viewport_unlock_refresh();
2405#ifdef RETROGXC_PRESENT
2406 retrogxc_blit_bitmap( target, t_def->image_cache_id,
2410 RETROFLAT_TILE_W, RETROFLAT_TILE_H,
2417 RETROFLAT_TILE_W, RETROFLAT_TILE_H,
2425 mdata_vector_unlock( t_defs );
2434# define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \
2435 extern MAUG_CONST uint8_t SEG_MCONST name;
2437RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
2439# define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \
2440 extern MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A;
2442RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:28
#define MAUG_PATH_SZ_MAX
Maximum size allocated for asset paths.
Definition mfile.h:36
MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
Open a file and read it into memory or memory-map it.
#define MERROR_PREEMPT
Indicates MLISP_AST_NODE can be executed again on next step iter pass.
Definition merror.h:67
char retroflat_asset_path[MAUG_PATH_SZ_MAX+1]
Path/name used to load an asset from disk.
Definition mfile.h:130
MERROR_RETVAL retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, size_t s_x, size_t s_y, int16_t d_x, int16_t d_y, size_t w, size_t h, int16_t instance)
Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
#define retroflat_instance_tile(instance)
Declare that a given instance ID is for a tile, rather than a sprite.
Definition retroflt.h:575
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition retroflt.h:325
#define RETROFLAT_COLOR_TABLE(f)
This macro defines all colors supported by RetroFlat for primative operations, particularly using ret...
Definition retroflt.h:306
#define retroflat_viewport_screen_y(world_y)
Return the screenspace Y coordinate at which something at the given world coordinate should be drawn.
Definition retroflt.h:1544
#define retroflat_viewport_screen_x(world_x)
Return the screenspace X coordinate at which something at the given world coordinate should be drawn.
Definition retroflt.h:1537
size_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:870
#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:159
#define RETROTILE_PROP_TYPE_FILE
Value for RETROTILE_PARSER::last_prop_type indicating file path.
Definition retrotil.h:141
#define RETROTILE_PROP_TYPE_STRING
Value for RETROTILE_PARSER::last_prop_type indicating string.
Definition retrotil.h:135
#define RETROTILE_PROP_TYPE_INT
Value for RETROTILE_PARSER::last_prop_type indicating integer.
Definition retrotil.h:147
#define RETROTILE_PROP_TYPE_OTHER
Value for RETROTILE_PARSER::last_prop_type indicating other type.
Definition retrotil.h:129
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 char *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:37
#define RETROTILE_PROP_NAME_SZ_MAX
Maximum number of chars in a parsed property name.
Definition retrotil.h:32
#define RETROTILE_PARSER_MODE_DEFS
Value for RETROTILE_PARSER::mode indicating the parser is currently parsing tile definitions.
Definition retrotil.h:80
#define RETROTILE_TRACE_LVL
If defined, bring debug printf statements up to this level.
Definition retrotil.h:42
#define RETROTILE_PARSER_MODE_MAP
Value for RETROTILE_PARSER::mode indicating the parser is currently parsing a tilemap.
Definition retrotil.h:73
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:27
#define RETROTILE_PARSER_FLAG_LITERAL_PATHS
Flag for RETROTILE_PARSER::flags indicating to use literal image asset paths.
Definition retrotil.h:65
A vector of uniformly-sized objects, stored contiguously.
Definition mdata.h:105
This is not currently used for anything, but is provided as a a convenience for game logic.
Definition retrotil.h:212
Definition retrotil.h:267
retroflat_tile_t mod_to[8]
If the center and outside match, use this mod-to.
Definition retrotil.h:272
Internal data structure used by retrotile_gen_diamond_square_iter().
Definition retrotil.h:250
int16_t sect_y
Starting Y of subsector in a given iteration.
Definition retrotil.h:254
int16_t sect_w
Width of subsector in a given iteration.
Definition retrotil.h:256
int16_t sect_w_half
Half of the width of subsector in a given iteration.
Definition retrotil.h:260
int16_t sect_x
Starting X of subsector in a given iteration.
Definition retrotil.h:252
int16_t sect_h
Height of subsector in a given iteration.
Definition retrotil.h:258
int16_t sect_h_half
Half of the height of subsector in a given iteration.
Definition retrotil.h:262
Definition retrotil.h:200
size_t total_sz
Size of the layer in bytes (including this struct header).
Definition retrotil.h:204
size_t sz
Size of this struct (useful for serializing).
Definition retrotil.h:202
Definition retrotil.h:314
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:348
char tilemap_name[RETROTILE_NAME_SZ_MAX+1]
The name to give to the new tilemap.
Definition retrotil.h:331
char last_prop_name[RETROTILE_PROP_NAME_SZ_MAX+1]
The name of the last property key/value pair parsed.
Definition retrotil.h:327
uint8_t mode
Value indicating the current type of object being parsed into.
Definition retrotil.h:321
size_t tileset_id_cur
Highest tileset ID on first pass and next ID to be assigned on second.
Definition retrotil.h:338
Definition retrotil.h:166
mfix_t static_rotation
Field indicating how many degrees the tile should always be rotated before drawin on-screen....
Definition retrotil.h:180
size_t sz
Size of this struct (useful for serializing).
Definition retrotil.h:168
int8_t no_serial
Dummy field; do not serialize fields after this!
Definition retrotil.h:184
A struct representing a tilemap.
Definition retrotil.h:224
size_t tiles_h
Height of all layers of the tilemap in tiles.
Definition retrotil.h:236
uint32_t total_sz
Size of the tilemap in bytes (including this struct header).
Definition retrotil.h:230
size_t tileset_fgid
First GID in the accompanying tileset.
Definition retrotil.h:234
float tile_scale
Amount by which to scale tiles (convenience property).
Definition retrotil.h:243
size_t tiles_w
Width of all layers of the tilemap in tiles.
Definition retrotil.h:238
uint32_t layers_count
Number of tile layers in this tilemap.
Definition retrotil.h:232
size_t sz
Size of this struct (useful for serializing).
Definition retrotil.h:226