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;
 
  187   struct RETRO3DP_MODEL model;
 
  189#ifdef RETROGXC_PRESENT 
  190   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 char* 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(
 
  523   struct RETROFLAT_BITMAP* target,
 
  532#if RETROTILE_TRACE_LVL > 0 
  533#  define retrotile_parser_mstate( parser, new_mstate ) \ 
  534      parser->mstate = new_mstate; \ 
  536         RETROTILE_TRACE_LVL, "parser mstate: %d", parser->mstate );
 
  538#  define retrotile_parser_mstate( parser, new_mstate ) \ 
  539      parser->mstate = new_mstate; 
  542#  define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \ 
  543      MAUG_CONST uint8_t SEG_MCONST name = idx; 
  545RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
 
  547#ifdef MPARSER_TRACE_NAMES 
  548#  define RETROTILE_PARSER_MSTATE_TABLE_NAME( name, idx, tokn, parent, m ) \ 
  551static MAUG_CONST 
char* SEG_MCONST gc_retrotile_mstate_names[] = {
 
  552   RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_NAME )
 
  557#  define RETROTILE_PARSER_MSTATE_TABLE_TOKEN( name, idx, tokn, parent, m ) \ 
  560static MAUG_CONST 
char* SEG_MCONST gc_retrotile_mstate_tokens[] = {
 
  561   RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_TOKEN )
 
  565#  define RETROTILE_PARSER_MSTATE_TABLE_PARNT( name, idx, tokn, parent, m ) \ 
  568static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_parents[] = {
 
  569   RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_PARNT )
 
  573#  define RETROTILE_PARSER_MSTATE_TABLE_MODE( name, idx, tokn, parent, m ) \ 
  576static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_modes[] = {
 
  577   RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_MODE )
 
  581#  define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \ 
  582      MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A = i; 
  584RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
 
  588static void retrotile_parser_match_token(
 
  594   while( 
'\0' != gc_retrotile_mstate_tokens[j][0] ) {
 
  597         maug_strlen( gc_retrotile_mstate_tokens[j] ) != token_sz ||
 
  599            token, gc_retrotile_mstate_tokens[j], token_sz
 
  610         parser->mstate != gc_retrotile_mstate_parents[j]
 
  612#ifdef RETROTILE_TRACE_TOKENS 
  615            "found token \"%s\" " 
  616#ifdef MPARSER_TRACE_NAMES
 
  617               "but incorrect parent %s (%d) (needs %s (%d))!",
 
  619               "but incorrect parent %d (needs %d)!",
 
  622#ifdef MPARSER_TRACE_NAMES
 
  623            retrotile_mstate_name( parser->mstate ),
 
  625            retrotile_mstate_name( gc_retrotile_mstate_parents[j] ),
 
  626            gc_retrotile_mstate_parents[j]
 
  629            gc_retrotile_mstate_parents[j]
 
  636      } 
else if( parser->
mode != gc_retrotile_mstate_modes[j] ) {
 
  637#ifdef RETROTILE_TRACE_TOKENS 
  641            gc_retrotile_mstate_modes[j] );
 
  648#ifdef RETROTILE_TRACE_TOKENS 
  651            "found token \"%s\" " 
  652#ifdef MPARSER_TRACE_NAMES
 
  653               "under correct parent %s (%d)!",
 
  655               "under correct parent %d!",
 
  658#ifdef MPARSER_TRACE_NAMES
 
  659            retrotile_mstate_name( parser->mstate ),
 
  667         retrotile_parser_mstate( parser, j );
 
  676   void* jparser_void, 
const char* token, 
size_t token_sz, 
void* parser_arg
 
  681   size_t tileset_id_parsed = 0;
 
  692         parser, token, token_sz, parser_arg ))
 
  697   if( MJSON_PSTATE_OBJECT_VAL != mjson_parser_pstate( &(parser->jparser) ) ) {
 
  699      retrotile_parser_match_token( token, token_sz, parser );
 
  703   if( MTILESTATE_TILES_ID == parser->mstate ) {
 
  704      retrotile_parser_mstate( parser, MTILESTATE_TILES );
 
  705      if( 0 == parser->pass ) {
 
  707         tileset_id_parsed = maug_atou32( token, token_sz, 10 );
 
  710#if RETROTILE_TRACE_LVL > 0 
  719#if RETROTILE_TRACE_LVL > 0 
  725      retrotile_parser_mstate( parser, MTILESTATE_TILES );
 
  727   } 
else if( MTILESTATE_TILES_IMAGE == parser->mstate ) {
 
  728      if( 1 == parser->pass ) {
 
  731         tile_def = mdata_vector_get(
 
  734         assert( NULL != tile_def );
 
  741            mfile_assign_path( tile_def->image_path, token, 0 );
 
  744               tile_def->image_path, token, MFILE_ASSIGN_FLAG_TRIM_EXT );
 
  750#if RETROTILE_TRACE_LVL > 0 
  756      retrotile_parser_mstate( parser, MTILESTATE_TILES );
 
  758   } 
else if( MTILESTATE_TILES_CLASS == parser->mstate ) {
 
  759      if( 1 == parser->pass ) {
 
  767         tile_def = mdata_vector_get(
 
  770         assert( NULL != tile_def );
 
  771         assert( 0 == tile_def->tile_class );
 
  773#if RETROTILE_TRACE_LVL > 0 
  774         #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \ 
  775            } else if( 0 == strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \ 
  776               tile_def->tile_class = RETROTILE_CLASS_ ## A; \ 
  777               debug_printf( RETROTILE_TRACE_LVL, \ 
  778                  "set tile " SIZE_T_FMT " type: " #a " (%u)", \
 
  779                  parser->tileset_id_cur, tile_def->tile_class );
 
  781         #define RETROTILE_CLASS_TABLE_SET( A, a, i ) \ 
  782            } else if( 0 == strncmp( #a, token, maug_strlen( #a ) + 1 ) ) { \ 
  783               tile_def->tile_class = RETROTILE_CLASS_ ## A; 
  787         RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_SET )
 
  789            tile_def->tile_class = RETROTILE_CLASS_TILE;
 
  790#if RETROTILE_TRACE_LVL > 0 
  792               "set tile " SIZE_T_FMT 
" type: tile (%u)",
 
  797      retrotile_parser_mstate( parser, MTILESTATE_TILES );
 
  799   } 
else if( MTILESTATE_TILES_PROP_NAME == parser->mstate ) {
 
  800#if RETROTILE_TRACE_LVL > 0 
  805      retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
 
  807   } 
else if( MTILESTATE_TILES_PROP_TYPE == parser->mstate ) {
 
  808#if RETROTILE_TRACE_LVL > 0 
  813      retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
 
  815   } 
else if( MTILESTATE_TILES_PROP_VAL == parser->mstate ) {
 
  819      if( 1 == parser->pass ) {
 
  821         tile_def = mdata_vector_get(
 
  824         assert( NULL != tile_def );
 
  829#if RETROTILE_TRACE_LVL > 0 
  835         } 
else if( 0 == strncmp( 
"warp_x", parser->
last_prop_name, 7 ) ) {
 
  836            tile_def->warp_x = maug_atos32( token, token_sz );
 
  837#if RETROTILE_TRACE_LVL > 0 
  843         } 
else if( 0 == strncmp( 
"warp_y", parser->
last_prop_name, 7 ) ) {
 
  844            tile_def->warp_y = maug_atos32( token, token_sz );
 
  845#if RETROTILE_TRACE_LVL > 0 
  855      retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
 
  857   } 
else if( MTILESTATE_NAME == parser->mstate ) {
 
  859#if RETROTILE_TRACE_LVL > 0 
  864      retrotile_parser_mstate( parser, 0 );
 
  866   } 
else if( MTILESTATE_TPROP_NAME == parser->mstate ) {
 
  870      parser->last_prop_name_sz = token_sz;
 
  871      retrotile_parser_mstate( parser, MTILESTATE_TPROP );
 
  873   } 
else if( MTILESTATE_TPROP_TYPE == parser->mstate ) {
 
  874#if RETROTILE_TRACE_LVL > 0 
  879      retrotile_parser_mstate( parser, MTILESTATE_TPROP );
 
  881   } 
else if( MTILESTATE_TPROP_VAL == parser->mstate ) {
 
  884      retrotile_parser_mstate( parser, MTILESTATE_TPROP );
 
  902   void* jparser_void, 
const char* token, 
size_t token_sz, 
void* parser_arg
 
  914         parser, token, token_sz, parser_arg ))
 
  919   if( MJSON_PSTATE_LIST == mjson_parser_pstate( &(parser->jparser) ) ) {
 
  929         MTILESTATE_LAYER_DATA == parser->mstate
 
  944         assert( NULL != parser->t );
 
  945         tiles_layer = retrotile_get_layer_p(
 
  946            parser->t, parser->pass_layer_iter );
 
  947         assert( NULL != tiles_layer );
 
  950         tiles_layer->layer_class = parser->layer_class;
 
  952         tiles = retrotile_get_tiles_p( tiles_layer );
 
  961         assert( NULL != token );
 
  962         assert( NULL != parser );
 
  963         assert( NULL != tiles );
 
  966            parser->layer_tile_iter >=
 
  971               "tile " SIZE_T_FMT 
" outside of layer tile buffer size " 
  973               parser->layer_tile_iter,
 
  975            retval = MERROR_OVERFLOW;
 
  979         assert( 0 == tiles[parser->layer_tile_iter] );
 
  981         tiles[parser->layer_tile_iter] = atoi( token );
 
  984      parser->layer_tile_iter++;
 
  988      MJSON_PSTATE_OBJECT_VAL == 
 
  989         mjson_parser_pstate( &(parser->jparser) )
 
 1000      if( MTILESTATE_TILESETS_FGID == parser->mstate ) {
 
 1001         if( 1 == parser->pass ) {
 
 1002            parser->t->
tileset_fgid = maug_atou32( token, token_sz, 10 );
 
 1003#if RETROTILE_TRACE_LVL > 0 
 1009         retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
 
 1011      } 
else if( MTILESTATE_TILESETS_SRC == parser->mstate ) {
 
 1012         if( 1 == parser->pass ) {
 
 1013#if RETROTILE_TRACE_LVL > 0 
 1016            parser->tj_parse_cb(
 
 1017               parser->dirname, token, NULL, parser->p_tile_defs,
 
 1018               parser->wait_cb, parser->wait_data,
 
 1020               parser->passes_max, parser->flags );
 
 1022         retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
 
 1024      } 
else if( MTILESTATE_HEIGHT == parser->mstate ) {
 
 1025         if( 0 == parser->pass ) {
 
 1027            parser->tiles_h = atoi( token );
 
 1028#if RETROTILE_TRACE_LVL > 0 
 1034         retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1036      } 
else if( MTILESTATE_WIDTH == parser->mstate ) {
 
 1037         if( 0 == parser->pass ) {
 
 1039            parser->tiles_w = atoi( token );
 
 1040#if RETROTILE_TRACE_LVL > 0 
 1046         retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1048      } 
else if( MTILESTATE_LAYER_NAME == parser->mstate ) {
 
 1050         retrotile_parser_mstate( parser, MTILESTATE_LAYER );
 
 1052      } 
else if( MTILESTATE_LAYER_CLASS == parser->mstate ) {
 
 1054         if( 0 == strncmp( 
"mobile", token, 7 ) ) {
 
 1055#if RETROTILE_TRACE_LVL > 0 
 1057               "layer " SIZE_T_FMT 
" type: mobile",
 
 1058               parser->pass_layer_iter );
 
 1060            parser->layer_class = RETROTILE_CLASS_MOBILE;
 
 1062#if RETROTILE_TRACE_LVL > 0 
 1064               "layer " SIZE_T_FMT 
" type: tile",
 
 1065               parser->pass_layer_iter );
 
 1067            parser->layer_class = RETROTILE_CLASS_TILE;
 
 1069         retrotile_parser_mstate( parser, MTILESTATE_LAYER );
 
 1071      } 
else if( MTILESTATE_PROP_NAME == parser->mstate ) {
 
 1075         parser->last_prop_name_sz = token_sz;
 
 1076         retrotile_parser_mstate( parser, MTILESTATE_PROP );
 
 1078      } 
else if( MTILESTATE_PROP_TYPE == parser->mstate ) {
 
 1079#if RETROTILE_TRACE_LVL > 0 
 1084         retrotile_parser_mstate( parser, MTILESTATE_PROP );
 
 1086      } 
else if( MTILESTATE_PROP_VAL == parser->mstate ) {
 
 1089#if RETROTILE_TRACE_LVL > 0 
 1096         retrotile_parser_mstate( parser, MTILESTATE_PROP );
 
 1101   retrotile_parser_match_token( token, token_sz, parser );
 
 1111   struct MJSON_PARSER* jparser, 
void* parg
 
 1115   if( MTILESTATE_LAYER_DATA == parser->mstate ) {
 
 1117#if RETROTILE_TRACE_LVL > 0 
 1119         parser->layer_tile_iter );
 
 1121      assert( parser->layer_tile_iter > 0 );
 
 1122      retrotile_parser_mstate( parser, MTILESTATE_LAYER );
 
 1124   } 
else if( MTILESTATE_LAYERS == parser->mstate ) {
 
 1126      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1128   } 
else if( MTILESTATE_TILESETS == parser->mstate ) {
 
 1130      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1132   } 
else if( MTILESTATE_TILES_PROP == parser->mstate ) {
 
 1134      retrotile_parser_mstate( parser, MTILESTATE_TILES );
 
 1136   } 
else if( MTILESTATE_TILES == parser->mstate ) {
 
 1138      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1140   } 
else if( MTILESTATE_PROP == parser->mstate ) {
 
 1141      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1143   } 
else if( MTILESTATE_TPROP == parser->mstate ) {
 
 1144      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1153   struct MJSON_PARSER* jparser, 
void* parg
 
 1157   if( MTILESTATE_LAYERS == parser->mstate ) {
 
 1161      parser->layer_tile_iter = 0;
 
 1162      retrotile_parser_mstate( parser, MTILESTATE_LAYER );
 
 1171   struct MJSON_PARSER* jparser, 
void* parg
 
 1175   if( MTILESTATE_LAYER == parser->mstate ) {
 
 1177#if RETROTILE_TRACE_LVL > 0 
 1179         "incrementing pass layer to " SIZE_T_FMT 
" after " SIZE_T_FMT
 
 1181         parser->pass_layer_iter + 1, parser->layer_tile_iter );
 
 1183      parser->pass_layer_iter++;
 
 1184      retrotile_parser_mstate( parser, MTILESTATE_LAYERS );
 
 1186   } 
else if( MTILESTATE_GRID == parser->mstate ) {
 
 1187      retrotile_parser_mstate( parser, MTILESTATE_NONE );
 
 1198   if( 0 == strncmp( 
"string", token, 7 ) ) {
 
 1200   } 
else if( 0 == strncmp( 
"file", token, 5 ) ) {
 
 1202   } 
else if( 0 == strncmp( 
"int", token, 4 ) ) {
 
 1212   mfix_t static_rotate_out = 0;
 
 1219   if( 0 == strncmp( dir, 
"NW", 2 ) ) {
 
 1220      static_rotate_out = mfix_from_f( 90.0f );
 
 1221   } 
else if( 0 == strncmp( dir, 
"SW", 2 ) ) {
 
 1222      static_rotate_out = mfix_from_f( 180.0f ); 
 
 1223   } 
else if( 0 == strncmp( dir, 
"SE", 2 ) ) {
 
 1224      static_rotate_out = mfix_from_f( 270.0f );
 
 1226   } 
else if( 0 == strncmp( dir, 
"W", 1 ) ) {
 
 1227      static_rotate_out = mfix_from_f( 90.0f );
 
 1228   } 
else if( 0 == strncmp( dir, 
"S", 1 ) ) {
 
 1229      static_rotate_out = mfix_from_f( 180.0f );
 
 1230   } 
else if( 0 == strncmp( dir, 
"E", 1 ) ) {
 
 1231      static_rotate_out = mfix_from_f( 270.0f );
 
 1234      static_rotate_out = 0;
 
 1237   return static_rotate_out;
 
 1243   const char* dirname, 
const char* filename, MAUG_MHANDLE* p_tilemap_h,
 
 1244   struct MDATA_VECTOR* p_tile_defs, mparser_wait_cb_t wait_cb, 
void* wait_data,
 
 1245   mparser_parse_token_cb token_cb, 
void* token_cb_data, uint8_t passes,
 
 1249   MAUG_MHANDLE parser_h = (MAUG_MHANDLE)NULL;
 
 1254   char* filename_ext = NULL;
 
 1258   maug_cleanup_if_null_alloc( MAUG_MHANDLE, parser_h );
 
 1260   maug_mlock( parser_h, parser );
 
 1264   parser->flags = flags;
 
 1267   parser->custom_token_cb_data = token_cb_data;
 
 1272#if RETROTILE_TRACE_LVL > 0 
 1274         "increasing parse passes to minimum, 2!" );
 
 1279   parser->passes_max = passes;
 
 1287#if RETROTILE_TRACE_LVL > 0 
 1292   maug_cleanup_if_not_ok();
 
 1295   for( parser->pass = 0 ; passes > parser->pass ; parser->pass++ ) {
 
 1296#if RETROTILE_TRACE_LVL > 0 
 1305      maug_mzero( &(parser->jparser.base), 
sizeof( 
struct MJSON_PARSER ) );
 
 1307      parser->wait_cb = wait_cb;
 
 1308      parser->wait_data = wait_data;
 
 1309      parser->jparser.base.wait_cb = wait_cb;
 
 1310      parser->jparser.base.wait_data = wait_data;
 
 1313      filename_ext = maug_strrchr( filename, 
'.' );
 
 1314      if( NULL == filename_ext ) {
 
 1315         error_printf( 
"could not parse filename extension!" );
 
 1316         retval = MERROR_FILE;
 
 1319      if( 
's' == filename_ext[2] ) {
 
 1320#if RETROTILE_TRACE_LVL > 0 
 1322            "(tile_defs pass %u)", parser->pass );
 
 1325         parser->jparser.token_parser = retrotile_parser_parse_tiledef_token;
 
 1326         parser->jparser.token_parser_arg = parser;
 
 1327         parser->jparser.close_list = retrotile_json_close_list;
 
 1328         parser->jparser.close_list_arg = parser;
 
 1329         parser->jparser.close_obj = retrotile_json_close_obj;
 
 1330         parser->jparser.close_obj_arg = parser;
 
 1335         parser->p_tile_defs = p_tile_defs;
 
 1337         assert( NULL != p_tile_defs );
 
 1338         if( 1 == parser->pass ) {
 
 1343#if RETROTILE_TRACE_LVL > 0 
 1353#if RETROTILE_TRACE_LVL > 0 
 1358         parser->jparser.close_list = retrotile_json_close_list;
 
 1359         parser->jparser.close_list_arg = parser;
 
 1360         parser->jparser.open_obj = retrotile_json_open_obj;
 
 1361         parser->jparser.open_obj_arg = parser;
 
 1362         parser->jparser.close_obj = retrotile_json_close_obj;
 
 1363         parser->jparser.close_obj_arg = parser;
 
 1364         parser->jparser.token_parser = retrotile_parser_parse_token;
 
 1365         parser->jparser.token_parser_arg = parser;
 
 1366         parser->p_tile_defs = p_tile_defs;
 
 1368         assert( NULL != p_tilemap_h );
 
 1369         assert( NULL != p_tile_defs );
 
 1370         if( 1 == parser->pass ) {
 
 1372            retval = retrotile_alloc(
 
 1373               p_tilemap_h, parser->tiles_w, parser->tiles_h,
 
 1375               parser->tileset_name );
 
 1376            maug_cleanup_if_not_ok();
 
 1377            maug_mlock( *p_tilemap_h, parser->t );
 
 1379         parser->pass_layer_iter = 0;
 
 1382      while( tile_file.has_bytes( &tile_file ) ) {
 
 1383         tile_file.read_int( &tile_file, (uint8_t*)&c, 1, 0 );
 
 1384#if RETROTILE_TRACE_CHARS > 0 
 1385         debug_printf( RETROTILE_TRACE_CHARS, 
"%c", c );
 
 1387         retval = mjson_parse_c( &(parser->jparser), c );
 
 1388         if( MERROR_OK != retval ) {
 
 1389            error_printf( 
"error parsing JSON!" );
 
 1394      tile_file.seek( &tile_file, 0 );
 
 1396      filename_ext = maug_strrchr( filename, 
'.' );
 
 1397      if( NULL == filename_ext ) {
 
 1398         error_printf( 
"could not parse filename extension!" );
 
 1399         retval = MERROR_FILE;
 
 1402      if( 
's' != filename_ext[2] ) {
 
 1403#if RETROTILE_TRACE_LVL > 0 
 1405            "pass %u found " SIZE_T_FMT 
" layers",
 
 1406            parser->pass, parser->pass_layer_iter );
 
 1411#if RETROTILE_TRACE_LVL > 0 
 1414      filename_path, retval );
 
 1419   if( NULL != parser ) {
 
 1420      if( NULL != parser->t ) {
 
 1421         maug_munlock( *p_tilemap_h, parser->t );
 
 1423      maug_munlock( parser_h, parser );
 
 1426   if( (MAUG_MHANDLE)NULL != parser_h ) {
 
 1427      maug_mfree( parser_h );
 
 1441   if( 8 > rand() % 10 ) {
 
 1443      avg -= (min_z / tuning) + (rand() % (max_z / tuning));
 
 1463static void retrotile_gen_diamond_square_corners(
 
 1464   int16_t corners_x[2][2], int16_t corners_y[2][2],
 
 1477   for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
 
 1478      for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
 
 1481         corners_x[iter_x][iter_y] =
 
 1483         if( 0 > corners_x[iter_x][iter_y] ) {
 
 1484            corners_x[iter_x][iter_y] += 1;
 
 1488         corners_y[iter_x][iter_y] =
 
 1490         if( 0 > corners_y[iter_x][iter_y] ) {
 
 1491            corners_y[iter_x][iter_y] += 1;
 
 1497   assert( 0 <= corners_x[0][0] );
 
 1498   assert( 0 <= corners_y[0][0] );
 
 1499   assert( t->
tiles_w > corners_x[0][0] );
 
 1500   assert( t->
tiles_h > corners_y[0][0] );
 
 1503   top_left_z = retrotile_get_tile(
 
 1508   if( 0 > top_left_z ) {
 
 1511         corners_x[0][0] >= 0 ? corners_x[0][0] : 0,
 
 1512         corners_y[0][0] >= 0 ? corners_y[0][0] : 0 ) = max_z;
 
 1517   for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
 
 1518      for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
 
 1520         tile_iter = &(retrotile_get_tile(
 
 1522            corners_x[iter_x][iter_y],
 
 1523            corners_y[iter_x][iter_y] ));
 
 1526         if( -1 != *tile_iter ) {
 
 1527#if RETROTILE_TRACE_LVL > 0 
 1530               corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
 
 1533                  corners_x[iter_x][iter_y],
 
 1534                  corners_y[iter_x][iter_y] ) );
 
 1540         *tile_iter = retrotile_gen_diamond_square_rand(
 
 1541            min_z, max_z, tuning, top_left_z );
 
 1543#if RETROTILE_TRACE_LVL > 0 
 1545            "missing corner coord %d x %d: %d",
 
 1546            corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
 
 1556   int16_t corners_x[2][2], int16_t corners_y[2][2],
 
 1565   for( iter_y = 0 ; 2 > iter_y ; iter_y++ ) {
 
 1566      for( iter_x = 0 ; 2 > iter_x ; iter_x++ ) {
 
 1567         tile_iter = &(retrotile_get_tile(
 
 1569            corners_x[iter_x][iter_y],
 
 1570            corners_y[iter_x][iter_y] ));
 
 1571         assert( -1 != *tile_iter );
 
 1592   uint32_t tuning, 
size_t layer_idx, uint8_t flags, 
void* data,
 
 1593   retrotile_ani_cb animation_cb, 
void* animation_cb_data
 
 1597#if RETROTILE_TRACE_LVL > 0 
 1602   int16_t corners_x[2][2];
 
 1603   int16_t corners_y[2][2];
 
 1607   MAUG_MHANDLE data_ds_h = (MAUG_MHANDLE)NULL;
 
 1613   uint8_t free_ds_data = 0;
 
 1614#ifdef MAUG_NO_STDLIB 
 1623   #define _retrotile_ds_update_statistics( data, tile ) \ 
 1625      if( (data)->highest_generated < (tile) && 32767 > (tile) ) { \ 
 1626         (data)->highest_generated = (tile); \ 
 1628      if( (data)->lowest_generated > (tile) && 0 < (tile) ) { \ 
 1629         (data)->lowest_generated = (tile); \ 
 1632   layer = retrotile_get_layer_p( t, layer_idx );
 
 1640      if( NULL == data ) {
 
 1643         maug_cleanup_if_null_alloc( MAUG_MHANDLE, data_ds_h );
 
 1645         maug_mlock( data_ds_h, data_ds );
 
 1652      retrotile_clear_tiles( t, layer, i );
 
 1660      data_ds->lowest_generated = 32767;
 
 1663      flags &= ~RETROTILE_DS_FLAG_INIT_DATA;
 
 1667   assert( NULL != data_ds );
 
 1670   if( 0 == data_ds->
sect_w ) {
 
 1671#if RETROTILE_TRACE_LVL > 0 
 1682#if RETROTILE_TRACE_LVL > 0 
 1689#if RETROTILE_TRACE_LVL > 0 
 1694   retrotile_gen_diamond_square_corners(
 
 1695      corners_x, corners_y, min_z, max_z, tuning, data_ds, layer, t );
 
 1699#if RETROTILE_TRACE_LVL > 0 
 1702         "%d return: reached innermost point", iter_depth );
 
 1708      retrotile_gen_diamond_square_avg( corners_x, corners_y, t, layer );
 
 1710#if RETROTILE_TRACE_LVL > 0 
 1714   tile_iter = &(retrotile_get_tile(
 
 1718   if( -1 != *tile_iter ) {
 
 1719#if RETROTILE_TRACE_LVL > 0 
 1727   _retrotile_ds_update_statistics( data_ds, avg );
 
 1736      iter_y = data_ds->
sect_y ;
 
 1741         iter_x = data_ds->
sect_x ;
 
 1745         data_ds_sub.sect_x = data_ds->
sect_x + iter_x;
 
 1747         data_ds_sub.sect_y = data_ds->
sect_y + iter_y;
 
 1751         data_ds_sub.sect_w_half = data_ds_sub.sect_w >> 1;
 
 1752         data_ds_sub.sect_h_half = data_ds_sub.sect_h >> 1;
 
 1753         data_ds_sub.lowest_generated = 32767;
 
 1754         data_ds_sub.highest_generated = 0;
 
 1756#if RETROTILE_TRACE_LVL > 0 
 1760            data_ds_sub.sect_x, data_ds_sub.sect_y, data_ds_sub.sect_w );
 
 1764            t, min_z, max_z, tuning, layer_idx, flags, &data_ds_sub,
 
 1765            animation_cb, animation_cb_data );
 
 1766         maug_cleanup_if_not_ok();
 
 1768         _retrotile_ds_update_statistics(
 
 1769            data_ds, data_ds_sub.highest_generated );
 
 1770         _retrotile_ds_update_statistics(
 
 1771            data_ds, data_ds_sub.lowest_generated );
 
 1777      NULL != animation_cb
 
 1779      retval = animation_cb( animation_cb_data, iter_y );
 
 1780      maug_cleanup_if_not_ok();
 
 1783#if RETROTILE_TRACE_LVL > 0 
 1790   if( free_ds_data && NULL != data_ds ) {
 
 1791      maug_munlock( data_ds_h, data_ds );
 
 1794   if( free_ds_data && (MAUG_MHANDLE)NULL != data_ds_h ) {
 
 1795      maug_mfree( data_ds_h );
 
 1805   uint32_t tuning, 
size_t layer_idx, uint8_t flags, 
void* data,
 
 1806   retrotile_ani_cb animation_cb, 
void* animation_cb_data
 
 1810   int16_t offset_x = 0,
 
 1815   int16_t spb = RETROTILE_VORONOI_DEFAULT_SPB;
 
 1816   int16_t drift = RETROTILE_VORONOI_DEFAULT_DRIFT;
 
 1817   MAUG_MHANDLE temp_grid_h = (MAUG_MHANDLE)NULL;
 
 1821   int8_t side_iter = 0;
 
 1822#ifdef MAUG_NO_STDLIB 
 1826   layer = retrotile_get_layer_p( t, 0 );
 
 1828   tiles = retrotile_get_tiles_p( layer );
 
 1831   retrotile_clear_tiles( t, layer, i );
 
 1834   for( y = 0 ; t->
tiles_w > y ; y += spb ) {
 
 1835      for( x = 0 ; t->
tiles_w > x ; x += spb ) {
 
 1836         offset_x = x + ((drift * -1) + (rand() % drift));
 
 1837         offset_y = y + ((drift * -1) + (rand() % drift));
 
 1840         if( 0 > offset_x ) {
 
 1843         if( offset_x >= t->
tiles_w ) {
 
 1846         if( 0 > offset_y ) {
 
 1849         if( offset_y >= t->
tiles_h ) {
 
 1853         retrotile_get_tile( t, layer, offset_x, offset_y ) =
 
 1854            min_z + (rand() % max_z);
 
 1858   temp_grid_h = maug_malloc(
 
 1860   maug_cleanup_if_null_alloc( MAUG_MHANDLE, temp_grid_h );
 
 1862   maug_mlock( temp_grid_h, temp_grid );
 
 1866   while( !finished ) {
 
 1867      if( NULL != animation_cb ) {
 
 1868         retval = animation_cb( animation_cb_data, -1 );
 
 1869         maug_cleanup_if_not_ok();
 
 1881      for( y = 0 ; t->
tiles_h > y ; y++ ) {
 
 1882         for( x = 0 ; t->
tiles_w > x ; x++ ) {
 
 1883            if( -1 == retrotile_get_tile( t, layer, x, y ) ) {
 
 1894            for( side_iter = 0 ; 4 > side_iter ; side_iter++ ) {
 
 1895#if RETROTILE_TRACE_LVL > 0 
 1897                  SIZE_T_FMT 
" (%d), " SIZE_T_FMT 
" (%d) (" 
 1898                  SIZE_T_FMT 
", " SIZE_T_FMT 
")", 
 
 1900                  gc_retroflat_offsets4_x[side_iter],
 
 1902                  gc_retroflat_offsets4_y[side_iter],
 
 1909                  t->
tiles_w > x + gc_retroflat_offsets4_x[side_iter] &&
 
 1910                  t->
tiles_h > y + gc_retroflat_offsets4_y[side_iter] &&
 
 1912                     ((y + gc_retroflat_offsets4_y[side_iter]) *
 
 1914                           (x + gc_retroflat_offsets4_x[side_iter])]
 
 1917                  retrotile_get_tile( t, layer,
 
 1918                     x + gc_retroflat_offsets4_x[side_iter],
 
 1919                     y + gc_retroflat_offsets4_y[side_iter] ) =
 
 1920                        retrotile_get_tile( t, layer, x, y );
 
 1930   if( NULL != temp_grid ) {
 
 1931      maug_munlock( temp_grid_h, temp_grid );
 
 1934   if( (MAUG_MHANDLE)NULL != temp_grid_h ) {
 
 1935      maug_mfree( temp_grid_h );
 
 1945   uint32_t tuning, 
size_t layer_idx, uint8_t flags, 
void* data,
 
 1946   retrotile_ani_cb animation_cb, 
void* animation_cb_data
 
 1951   int16_t side_iter = 0,
 
 1957   assert( NULL != t );
 
 1958   layer = retrotile_get_layer_p( t, layer_idx );
 
 1959   assert( NULL != layer );
 
 1961   for( y = 0 ; t->
tiles_h > y ; y++ ) {
 
 1962      if( NULL != animation_cb ) {
 
 1963         retval = animation_cb( animation_cb_data, y );
 
 1964         maug_cleanup_if_not_ok();
 
 1966      for( x = 0 ; t->
tiles_w > x ; x++ ) {
 
 1972         for( side_iter = 0 ; 8 > side_iter ; side_iter++ ) {
 
 1974               t->
tiles_w <= x + gc_retroflat_offsets8_x[side_iter] ||
 
 1975               t->
tiles_h <= y + gc_retroflat_offsets8_y[side_iter]
 
 1981#if RETROTILE_TRACE_LVL > 0 
 1984               "si %d: x, y: " SIZE_T_FMT 
" (+%d), " SIZE_T_FMT
 
 1985                  " (+%d) idx: " SIZE_T_FMT,
 
 1987               x + gc_retroflat_offsets8_x[side_iter],
 
 1988               gc_retroflat_offsets8_x[side_iter],
 
 1989               y + gc_retroflat_offsets8_y[side_iter],
 
 1990               gc_retroflat_offsets8_y[side_iter],
 
 1991               ((y + gc_retroflat_offsets8_y[side_iter]) * t->
tiles_w) +
 
 1992                  x + gc_retroflat_offsets8_x[side_iter] );
 
 1994            sides_sum += retrotile_get_tile(
 
 1996               x + gc_retroflat_offsets8_x[side_iter],
 
 1997               y + gc_retroflat_offsets8_y[side_iter] );
 
 2000         retrotile_get_tile( t, layer, x, y ) = sides_sum / sides_avail;
 
 2013   uint32_t tuning, 
size_t layer_idx, uint8_t flags, 
void* data,
 
 2014   retrotile_ani_cb animation_cb, 
void* animation_cb_data
 
 2025   int16_t ctr_iter = 0,
 
 2029   assert( NULL != t );
 
 2030   layer = retrotile_get_layer_p( t, layer_idx );
 
 2031   assert( NULL != layer );
 
 2034   for( i = 0 ; 0 <= borders[i].center ; i++ ) {
 
 2035      borders[i].tiles_changed = 0;
 
 2038#if RETROTILE_TRACE_LVL > 0 
 2042   for( y = 0 ; t->
tiles_h > y ; y++ ) {
 
 2043      for( x = 0 ; t->
tiles_w > x ; x++ ) {
 
 2045         while( 0 <= borders[i].center ) {
 
 2047            ctr_iter = retrotile_get_tile( t, layer, x, y );
 
 2048#if RETROTILE_TRACE_LVL > 0 
 2050               "x: " SIZE_T_FMT 
", y: " SIZE_T_FMT 
", 0x%04x vs 0x%04x",
 
 2051               x, y, ctr_iter, borders[i].center );
 
 2053            if( ctr_iter != borders[i].center ) {
 
 2058#if RETROTILE_TRACE_LVL > 0 
 2063            for( side = 0 ; 8 > side ; side += 2 ) {
 
 2065                  x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
 
 2066                  y + gc_retroflat_offsets8_y[side] > t->
tiles_h 
 2072               outside_iter = retrotile_get_tile( t, layer,
 
 2073                  x + gc_retroflat_offsets8_x[side],
 
 2074                  y + gc_retroflat_offsets8_y[side] );
 
 2078               if( side + 4 < 8 ) {
 
 2079                  x_plus_1 = x + gc_retroflat_offsets8_x[side + 4];
 
 2080                  y_plus_1 = y + gc_retroflat_offsets8_y[side + 4];
 
 2082                  x_plus_1 = x + gc_retroflat_offsets8_x[side - 4];
 
 2083                  y_plus_1 = y + gc_retroflat_offsets8_y[side - 4];
 
 2087                  x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
 
 2088                  outside_iter == borders[i].outside &&
 
 2089                  outside_iter == retrotile_get_tile( t, layer,
 
 2090                     x_plus_1, y_plus_1 )
 
 2094                  retrotile_get_tile( t, layer, x, y ) =
 
 2096                  borders[i].tiles_changed++;
 
 2103            for( side = 0 ; 8 > side ; side += 2 ) {
 
 2105                  x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
 
 2106                  y + gc_retroflat_offsets8_y[side] > t->
tiles_h 
 2112               outside_iter = retrotile_get_tile( t, layer,
 
 2113                  x + gc_retroflat_offsets8_x[side],
 
 2114                  y + gc_retroflat_offsets8_y[side] );
 
 2118               if( side + 2 < 8 ) {
 
 2119                  x_plus_1 = x + gc_retroflat_offsets8_x[side + 2];
 
 2120                  y_plus_1 = y + gc_retroflat_offsets8_y[side + 2];
 
 2122                  x_plus_1 = x + gc_retroflat_offsets8_x[0];
 
 2123                  y_plus_1 = y + gc_retroflat_offsets8_y[0];
 
 2127                  x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
 
 2128                  outside_iter == borders[i].outside &&
 
 2129                  outside_iter == retrotile_get_tile( t, layer,
 
 2130                     x_plus_1, y_plus_1 )
 
 2133                  retrotile_get_tile( t, layer, x, y ) =
 
 2134                     borders[i].
mod_to[side + 1 < 8 ? side + 1 : 0];
 
 2135                  borders[i].tiles_changed++;
 
 2141            for( side = 0 ; 8 > side ; side += 2 ) {
 
 2143                  x + gc_retroflat_offsets8_x[side] > t->
tiles_w ||
 
 2144                  y + gc_retroflat_offsets8_y[side] > t->
tiles_h 
 2150               outside_iter = retrotile_get_tile( t, layer,
 
 2151                  x + gc_retroflat_offsets8_x[side],
 
 2152                  y + gc_retroflat_offsets8_y[side] );
 
 2154               if( outside_iter == borders[i].outside ) {
 
 2156#if RETROTILE_TRACE_LVL > 0 
 2159                  retrotile_get_tile( t, layer, x, y ) =
 
 2161                  borders[i].tiles_changed++;
 
 2179   struct RETROTILE* tilemap, uint32_t layer_idx
 
 2182   uint8_t* tilemap_buf = (uint8_t*)tilemap;
 
 2185      error_printf( 
"invalid layer " U32_FMT
 
 2186         " requested (of " U32_FMT 
")!",
 
 2192   tilemap_buf += 
sizeof( 
struct RETROTILE );
 
 2194   while( layer_idx > 0 ) {
 
 2195      tilemap_buf += layer_iter->
total_sz;
 
 2206   MAUG_MHANDLE* p_tilemap_h, 
size_t w, 
size_t h, 
size_t layers_count,
 
 2207   const char* tilemap_name, 
const char* tileset_name
 
 2211   size_t tilemap_sz = 0;
 
 2215   tilemap_sz = 
sizeof( 
struct RETROTILE ) +
 
 2219#if RETROTILE_TRACE_LVL > 0 
 2222      " tiles, " SIZE_T_FMT 
" layers (" SIZE_T_FMT 
" bytes)...",
 
 2223      w, h, layers_count, tilemap_sz );
 
 2226   *p_tilemap_h = maug_malloc( 1, tilemap_sz );
 
 2227   maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_tilemap_h );
 
 2229   maug_mlock( *p_tilemap_h, tilemap );
 
 2230   maug_cleanup_if_null_alloc( 
struct RETROTILE*, tilemap );
 
 2232   maug_mzero( tilemap, tilemap_sz );
 
 2245      layer_iter = retrotile_get_layer_p( tilemap, i );
 
 2246      assert( NULL != layer_iter );
 
 2249      maug_cleanup_if_not_ok();
 
 2255   if( NULL != tilemap ) {
 
 2256      maug_munlock( *p_tilemap_h, tilemap );
 
 2264void retrotile_format_asset_path(
 
 2271      parser->dirname, afile );
 
 2278#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 2282#if RETROTILE_TRACE_LVL > 0 
 2284      "clearing " SIZE_T_FMT 
" vertical viewport pixels (" SIZE_T_FMT
 
 2286      y_max, y_max / RETROFLAT_TILE_H );
 
 2290   for( y = 0 ; y_max > y ; y += RETROFLAT_TILE_H ) {
 
 2308   struct RETROFLAT_BITMAP* target,
 
 2320   layer = retrotile_get_layer_p( t, 0 );
 
 2328         RETROFLAT_TILE_H_BITS) << RETROFLAT_TILE_H_BITS) ;
 
 2331      y += RETROFLAT_TILE_H
 
 2335            RETROFLAT_TILE_W_BITS) << RETROFLAT_TILE_W_BITS) ;
 
 2338         x += RETROFLAT_TILE_W
 
 2350         x_tile = x >> RETROFLAT_TILE_W_BITS;
 
 2351         y_tile = y >> RETROFLAT_TILE_H_BITS;
 
 2353         tile_id = retrotile_get_tile( t, layer, x_tile, y_tile );
 
 2354         t_def = mdata_vector_get(
 
 2356         if( NULL == t_def ) {
 
 2358               "invalid tile ID: %d (- " SIZE_T_FMT 
" = " SIZE_T_FMT 
")",
 
 2362         assert( NULL != t_def );
 
 2364#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 2367         if( !retroflat_viewport_tile_is_stale(
 
 2386#ifdef RETROGXC_PRESENT 
 2387         retrogxc_blit_bitmap( target, t_def->image_cache_id,
 
 2391            RETROFLAT_TILE_W, RETROFLAT_TILE_H,
 
 2398            RETROFLAT_TILE_W, RETROFLAT_TILE_H,
 
 2415#  define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \ 
 2416      extern MAUG_CONST uint8_t SEG_MCONST name; 
 2418RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
 
 2420#  define RETROTILE_CLASS_TABLE_CONSTS( A, a, i ) \ 
 2421      extern MAUG_CONST uint8_t SEG_MCONST RETROTILE_CLASS_ ## A; 
 2423RETROTILE_CLASS_TABLE( RETROTILE_CLASS_TABLE_CONSTS )
 
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:19
#define MAUG_PATH_SZ_MAX
Maximum size allocated for asset paths.
Definition: mfile.h:35
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:58
char retroflat_asset_path[MAUG_PATH_SZ_MAX+1]
Path/name used to load an asset from disk.
Definition: mfile.h:129
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
#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:1526
#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:1519
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
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_TRACE_LVL
If defined, bring debug printf statements up to this level.
Definition: retrotil.h:42
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
A vector of uniformly-sized objects, stored contiguously.
Definition: mdata.h:93
#define mdata_vector_lock(v)
Lock the vector. This should be done when items from the vector are actively being referenced,...
Definition: mdata.h:320
#define mdata_vector_fill(v, ct_new, sz)
Allocate and mark the new slots as active.
Definition: mdata.h:408
#define mdata_vector_unlock(v)
Unlock the vector so items may be added and removed.
Definition: mdata.h:353
#define mdata_vector_ct(v)
Number of items of MDATA_VECTOR::item_sz bytes actively stored in this vector.
Definition: mdata.h:396
#define retroflat_viewport_screen_h()
Return the height of the viewport in pixels.
Definition: retroflt.h:1418
#define retroflat_viewport_world_y()
Return the current viewport Y position in the world in pixels.
Definition: retroflt.h:1366
#define retroflat_viewport_world_x()
Return the current viewport X position in the world in pixels.
Definition: retroflt.h:1358
#define retroflat_viewport_world_w()
Return the current width of the world in pixels.
Definition: retroflt.h:1383
#define retroflat_viewport_screen_w()
Return the width of the viewport in pixels.
Definition: retroflt.h:1411
#define retroflat_viewport_world_h()
Return the current height of the world in pixels.
Definition: retroflt.h:1390
#define retroflat_viewport_unlock_refresh()
Unlock access to RETROFLAT_VIEWPORT::refresh_grid in memory.
Definition: retroflt.h:1481
#define retroflat_viewport_lock_refresh()
Lock access to RETROFLAT_VIEWPORT::refresh_grid in memory.
Definition: retroflt.h:1471
#define retroflat_viewport_set_refresh(x, y, tid)
Set the tile at the given screen pixel coordinates to the given tile ID.
Definition: retroflt.h:1495
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:141
#define RETROTILE_PARSER_MODE_DEFS
Value for RETROTILE_PARSER::mode indicating the parser is currently parsing tile definitions.
Definition: retrotil.h:80
#define RETROTILE_PROP_TYPE_STRING
Value for RETROTILE_PARSER::last_prop_type indicating string.
Definition: retrotil.h:135
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:147
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:73
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:129
#define RETROTILE_PARSER_FLAG_LITERAL_PATHS
Flag for RETROTILE_PARSER::flags indicating to use literal image asset paths.
Definition: retrotil.h:65
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: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