From: hgn Date: Mon, 19 Jul 2021 13:58:57 +0000 (+0100) Subject: basic map loader X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=76a1eafbf120872d709ce6544ae3dd91e1b94a0d;p=fishladder.git basic map loader --- diff --git a/fishladder.c b/fishladder.c index 20bb051..e2d5ec1 100644 --- a/fishladder.c +++ b/fishladder.c @@ -38,6 +38,160 @@ int main( int argc, char *argv[] ) vg_init( argc, argv, "FishLadder" ); } +#define CELL_FLAG_INPUT 0x1 +#define CELL_FLAG_OUTPUT 0x2 + #define CELL_FLAG_IO (CELL_FLAG_INPUT|CELL_FLAG_OUTPUT) +#define CELL_FLAG_WALL 0x4 + +static struct +{ + u32 x,y; + + struct cell + { + u32 flags; + char *conditions; + } + * cells; + + u32 *io; +} +map; + +static void map_free(void) +{ + for( int i = 0; i < arrlen( map.io ); i ++ ) + { + arrfree( map.cells[ map.io[i] ].conditions ); + } + + arrfree( map.cells ); + arrfree( map.io ); + map.x = 0; + map.y = 0; + map.cells = NULL; + map.io = NULL; +} + +static int map_load( const char *str ) +{ + map_free(); + + char *c = str; + + // Scan for width + for(;; map.x ++) + { + if( str[map.x] == ';' ) + break; + else if( !str[map.x] ) + { + vg_error( "Unexpected EOF when parsing level!\n" ); + return 0; + } + } + + struct cell *row = arraddnptr( map.cells, map.x ); + int cx = 0; + int reg_start = 0, reg_end = 0; + + for(;;) + { + if( !*c ) + break; + + if( *c == ';' ) + { + c ++; + + // Parse attribs + if( *c != '\n' ) + { + while( *c ) + { + if( reg_start < reg_end ) + { + if( *c >= 'a' && *c <= 'z' ) + { + arrpush( map.cells[ map.io[ reg_start ] ].conditions, *c ); + } + else + { + if( *c == ',' || *c == '\n' ) + { + reg_start ++; + + if( *c == '\n' ) + break; + } + else + { + vg_error( "Unkown attrib '%c' (row: %u)\n", *c, map.y ); + return 0; + } + } + } + else + { + vg_error( "Over-assigned values (row: %u)\n", map.y ); + return 0; + } + + c ++; + } + } + + if( reg_start != reg_end ) + { + vg_error( "Not enough values assigned (row: %u, %u of %u)\n", map.y, reg_start, reg_end ); + return 0; + } + + if( cx != map.x ) + { + vg_error( "Map row underflow (row: %u, %u<%u)\n", map.y, cx, map.x ); + return 0; + } + + row = arraddnptr( map.cells, map.x ); + cx = 0; + map.y ++; + reg_end = reg_start = arrlen( map.io ); + } + else + { + if( cx == map.x ) + { + vg_error( "Map row overflow (row: %u, %u>%u)\n", map.y, cx, map.x ); + return 0; + } + + row[ cx ].conditions = NULL; + + // Parse the various cell types + if( *c == '+' || *c == '-' ) + { + arrpush( map.io, cx + map.y*map.x ); + row[ cx ++ ].flags = *c == '+'? CELL_FLAG_INPUT: CELL_FLAG_OUTPUT; + reg_end ++; + } + else if( *c == '#' ) + { + row[ cx ++ ].flags = CELL_FLAG_WALL; + } + else + { + row[ cx ++ ].flags = 0x00; + } + } + + c ++; + } + + vg_success( "Map loaded! (%u:%u)\n", map.x, map.y ); + return 1; +} + void vg_update(void) { // Update camera @@ -128,11 +282,21 @@ void vg_start(void) glEnableVertexAttribArray( 0 ); VG_CHECK_GL(); + + map_load + ( + "###########;\n" + "# + #;abab\n" + "# #;\n" + "# #;\n" + "# - - #;aa,bb\n" + "###########;\n" + ); } void vg_free(void) { - + map_free(); } void vg_ui(void)