all campaign levels are done
[fishladder.git] / fishladder.c
index e344844a9dbef28b4799ecf53c62cadbca2b0a57..d4640be4b2f08e27c15113af77bd07bfe819f5e8 100644 (file)
@@ -564,7 +564,7 @@ static int map_load( const char *str, const char *name )
                                                struct cell_terminal *terminal = &world.io[ reg_start ];
                                                struct terminal_run *run = &terminal->runs[ terminal->run_count-1 ];
 
-                                               if( *c >= 'a' && *c <= 'z' )
+                                               if( (*c >= 'a' && *c <= 'z') || *c == ' ' )
                                                {                                                       
                                                        run->conditions[ run->condition_count ++ ] = *c;
                                                }
@@ -745,6 +745,9 @@ static int map_load( const char *str, const char *name )
                        turtle_dir[1] = pcell(term->pos)->state & FLAG_INPUT? 1: -1;
                        original_y = turtle_dir[1];
                        
+                       info_buffer[((turtle[1]*64)+turtle[0])*4] = 0;  
+                       v2i_add( turtle_dir, turtle, turtle );
+                       
                        for( int i = 0; i < 100; i ++ )
                        {
                                info_buffer[((turtle[1]*64)+turtle[0])*4] = 0;
@@ -1330,7 +1333,7 @@ void vg_update(void)
                
                while( world.sim_frame < world.sim_target )
                {
-                       sfx_set_playrnd( &audio_random, &audio_system_balls_switching, 0, 9 );
+                       sfx_set_playrnd( &audio_random, &audio_system_balls_switching, 0, 8 );
 
                        // Update splitter deltas
                        for( int i = 0; i < world.h*world.w; i ++ )
@@ -1608,11 +1611,15 @@ void vg_update(void)
                                {
                                        if( world.sim_frame < term->runs[ world.sim_run ].condition_count )
                                        {
+                                               char emit = term->runs[ world.sim_run ].conditions[ world.sim_frame ];
+                                               if( emit == ' ' )
+                                                       continue;
+                                       
                                                struct fish *fish = &world.fishes[ world.num_fishes ];
                                                v2i_copy( term->pos, fish->pos );
                                                
                                                fish->state = k_fish_state_alive;
-                                               fish->payload = term->runs[ world.sim_run ].conditions[ world.sim_frame ];
+                                               fish->payload = emit;
                                                
                                                struct cell *cell_ptr = pcell( fish->pos );
                                                
@@ -1964,6 +1971,8 @@ static void wbutton_run( enum e_world_button btn_name )
                {
                        btn->pressed ^= 0x1;
                }
+               
+               sfx_set_play( &audio_clicks, &audio_system_ui, btn->pressed?1:0 );
        }
        
        // Drawing
@@ -2292,9 +2301,35 @@ void vg_render(void)
                                                (arr_base + (float)term->pos[1] + (float)(term->run_count-1)*0.2f) - run_offset:
                                                (float)term->pos[1] + arr_base + run_offset;
                        
-                       if( k & 0x1 )
+                       v4f bar_colour;
+                       int bar_draw = 0;
+                       
+                       if( is_simulation_running() )
+                       {
+                               if( k == world.sim_run )
+                               {
+                                       float a = fabsf(sinf( vg_time * 2.0f )) * 0.075f + 0.075f;
+                                       
+                                       v4_copy( (v4f){ 1.0f, 1.0f, 1.0f, a }, bar_colour );
+                               }
+                               else
+                                       v4_copy( (v4f){ 0.0f, 0.0f, 0.0f, 0.13f }, bar_colour );
+                               
+                               bar_draw = 1;
+                       }
+                       else if( 1 || k & 0x1 )
+                       {
+                               if( k & 0x1 )
+                                       v4_copy( (v4f){ 1.0f, 1.0f, 1.0f, 0.07f }, bar_colour );
+                               else
+                                       v4_copy( (v4f){ 0.0f, 0.0f, 0.0f, 0.13f }, bar_colour );                        
+                                                       
+                               bar_draw = 1;
+                       }
+                       
+                       if( bar_draw )
                        {
-                               glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1.0f, 1.0f, 1.0f, 0.1f );
+                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, bar_colour );
                                glUniform3f( SHADER_UNIFORM( shader_tile_colour, "uOffset" ), (float)term->pos[0], y_position - 0.1f, 1.0f );
                                draw_mesh( 2, 2 );
                        }
@@ -2309,14 +2344,18 @@ void vg_render(void)
                        
                                if( is_input )
                                {
-                                       colour_code_v3( term->runs[k].conditions[j], dot_colour );
-                                       glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
-                               
-                                       // Draw filled if tick not passed, draw empty if empty
-                                       if( (world.sim_frame > j && world.sim_run >= k) || world.sim_run > k )
-                                               draw_mesh( empty_start, empty_count );
-                                       else
-                                               draw_mesh( filled_start, filled_count );
+                                       char cc = term->runs[k].conditions[j];
+                                       if( cc != ' ' )
+                                       {                                       
+                                               colour_code_v3( cc, dot_colour );
+                                               glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, dot_colour );
+                                       
+                                               // Draw filled if tick not passed, draw empty if empty
+                                               if( (world.sim_frame > j && world.sim_run >= k) || world.sim_run > k )
+                                                       draw_mesh( empty_start, empty_count );
+                                               else
+                                                       draw_mesh( filled_start, filled_count );
+                                       }
                                }
                                else
                                {
@@ -2469,14 +2508,16 @@ void vg_ui(void)
                        
                        for( int i = 0; i < 3; i ++ )
                        {
-                               if( i == pack_selection )
+                               int pack_is_unlocked = pack_infos[i].levels[0].unlocked;
+                       
+                               if( i == pack_selection || !pack_is_unlocked )
                                        gui_override_colours( &flcol_list_locked );
-
-                               if( gui_button( 2000 + i ) == k_button_click )
+                               
+                               if( gui_button( 2000 + i ) == k_button_click && pack_is_unlocked )
                                        pack_selection = i;
                                
                                ui_global_ctx.cursor[1] += 2;
-                               gui_text( pack_infos[i].name, 4, 0 );
+                               gui_text( pack_is_unlocked? pack_infos[i].name: "???", 4, 0 );
                                gui_end_right();
                                
                                gui_reset_colours();