X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=fishladder.c;h=7cda200bd7727d537cc849e214f27d7c3c3e5ec1;hb=e00ea4ccba1891970699f9b5b78ba1ebaada2974;hp=03d391de1838959d6436db660cc6801622c6c30b;hpb=5cd0365349b88c7774e0e18c0cad591156512c1f;p=fishladder.git diff --git a/fishladder.c b/fishladder.c index 03d391d..7cda200 100644 --- a/fishladder.c +++ b/fishladder.c @@ -5,6 +5,35 @@ #include "vg/vg.h" #include "fishladder_resources.h" +/* + Todo for release: + Tutorial levels: + 1. Transport + 2. Split + 3. Merge (and explode) + 4. Principle 1 (divide colours) + 5. Principle 2 (combine colours) + + Trainee levels: + Simple maths (x3) + Colour ordering (x2) + Routing problems (x2) + + Medium levels: + Reverse order + + New things to program: + UI text element renderer (SDF) DONE(sorta) + Particle system thing for ball collision + Level descriptions / titles HALF + Row Gridlines for I/O + Play button / Speed controller + + + After release: + +*/ + const char *level_pack_1[] = { "level0", "level1", @@ -326,7 +355,7 @@ struct world int num_fishes; - char map_name[128]; + char map_name[64]; struct career_level *ptr_career_level; u32 score; @@ -373,9 +402,9 @@ static int map_load( const char *str, const char *name ) // Scan for width for(;; world.w ++) { - if( str[world.w] == ';' ) + if( c[world.w] == ';' ) break; - else if( !str[world.w] ) + else if( !c[world.w] ) { vg_error( "Unexpected EOF when parsing level\n" ); return 0; @@ -1237,7 +1266,7 @@ void vg_update(void) world.tile_y = floorf( world.tile_pos[1] ); // Tilemap editing - if( !world.simulating ) + if( !world.simulating && !gui_want_mouse() ) { v2_copy( vg_mouse_ws, drag_to_co ); @@ -1601,9 +1630,11 @@ void vg_update(void) (fj_prev[0] == fi->pos[0]) && (fj_prev[1] == fi->pos[1]) )? 1: 0; - + if( collide_next_frame || collide_this_frame ) { + sw_set_achievement( "BANG" ); + // Shatter death (+0.5s) float death_time = collide_this_frame? 0.0f: 0.5f; @@ -1718,6 +1749,9 @@ void vg_update(void) } else { + if( world.sim_run > 0 ) + sw_set_achievement( "GOOD_ENOUGH" ); + vg_error( "Level failed :(\n" ); } @@ -1931,6 +1965,27 @@ void vg_render(void) } + // Level title + ui_begin( &ui_global_ctx, 512, 256 ); + + ui_global_ctx.override_colour = 0xff9a8a89; + //ui_text( &ui_global_ctx, world.map_title, 6, 0 ); + ui_global_ctx.override_colour = 0xffffffff; + + ui_resolve( &ui_global_ctx ); + + m3x3f world_text; + m3x3_copy( vg_pv, world_text ); + m3x3_translate( world_text, (v3f){ 1.55f, 1.9f, 0.0f } ); + m3x3_rotate( world_text, VG_PIf*0.5f ); + m3x3_scale( world_text, (v3f){0.01f,-0.01f,0.01f} ); + + ui_draw( &ui_global_ctx, world_text ); + + // Main + // ========================================================================================= + + use_mesh( &world.tile ); SHADER_USE( shader_tile_main ); m2x2f subtransform; @@ -2277,12 +2332,63 @@ void vg_render(void) level_ui_space[1] -= 0.01f; draw_numbers( level_ui_space, i ); } - - //use_mesh( &world.numbers ); - //draw_numbers( (v3f){ 0.0f, -0.5f, 0.1f }, 128765 ); } void vg_ui(void) { - ui_test(); + ui_global_ctx.cursor[0] = 0; + ui_global_ctx.cursor[1] = 0; + ui_global_ctx.cursor[2] = 256; + + gui_fill_y(); + + ui_global_ctx.id_base = 4 << 16; + + gui_new_node(); + { + gui_fill_rect( ui_global_ctx.cursor, 0xff5577ff ); + + gui_text( "MARBLE COMPUTING", 4, 0 ); + + ui_global_ctx.cursor[1] += 45; + ui_global_ctx.cursor[3] = 709; + + // Level scroll view + gui_new_node(); + { + gui_fill_rect( ui_global_ctx.cursor, 0xffff7729 ); + gui_set_clip( ui_global_ctx.cursor ); + + ui_global_ctx.cursor[2] = 16; + gui_align_right(); + + static struct ui_scrollbar sb = { + .bar_height = 400 + }; + ui_scrollbar( &ui_global_ctx, &sb, 0 ); + + ui_global_ctx.cursor[2] = 240; + ui_global_ctx.cursor[3] = 50; + gui_align_left(); + + ui_px content_height = vg_list_size(cmp_levels_basic)*ui_global_ctx.cursor[3]; + ui_global_ctx.cursor[1] -= ui_calculate_content_scroll( &sb, content_height ); + + for( int i = 0; i < vg_list_size(cmp_levels_basic); i ++ ) + { + struct cmp_level *lvl_info = &cmp_levels_basic[i]; + + gui_new_node(); + { + gui_fill_rect( ui_global_ctx.cursor, i&0x1?0xff23fce45:0xff8722f8 ); + gui_text( lvl_info->title, 3, 0 ); + } + gui_end_down(); + } + + gui_release_clip(); + } + gui_end_down(); + } + gui_end(); }