split/merge working with water
authorhgn <hgodden00@gmail.com>
Thu, 23 Sep 2021 18:29:47 +0000 (19:29 +0100)
committerhgn <hgodden00@gmail.com>
Thu, 23 Sep 2021 18:29:47 +0000 (19:29 +0100)
fishladder.c

index 27bea90b33cd203526803093f5c7b51d482293fa..287a1ea3d6d1c3f61ea1ff322c887cc7c8cd523c 100644 (file)
@@ -35,8 +35,10 @@ m3x3f m_mdl;
 #define FLAG_OUTPUT 0x2
 #define FLAG_CANAL 0x4
 #define FLAG_WALL 0x8
-#define FLAG_DROP 0x10
+#define FLAG_DROP_L 0x10
 #define FLAG_SPLIT 0x20
+#define FLAG_MERGER 0x40
+#define FLAG_DROP_R 0x80
 
 struct world
 {
@@ -45,6 +47,7 @@ struct world
                u32 state;
                u8 water[2];
                u8 config;
+               u8 water_dir;
        }
        *data;
        
@@ -219,7 +222,14 @@ void vg_start(void)
        float quad_mesh[] =
        {
                0.05f, 0.05f, 0.05f, 0.95f, 0.95f, 0.95f,
-               0.05f, 0.05f, 0.95f, 0.95f, 0.95f, 0.05f
+               0.05f, 0.05f, 0.95f, 0.95f, 0.95f, 0.05f,
+               
+               0.48f, 0.48f, 0.5f, 0.52f, 0.52f, 0.52f, // Static dot
+               0.375f, 0.25f, 0.5f, 0.75f, 0.625f, 0.25f, // Downwards pointing arrow
+               0.25f, 0.625f, 0.75f, 0.5f, 0.25f, 0.375f, // Left
+               0.625f, 0.75f, 0.5f, 0.25f, 0.375f, 0.75f, // up
+               0.75f, 0.375f, 0.25f, 0.5f, 0.75f, 0.625f
+               
        };
        
        glBindVertexArray( world.tile_vao );
@@ -399,7 +409,7 @@ void vg_update(void)
                        } else config = 0xF;
                        
                        world.data[ y*world.w+x ].config = config;
-                       world.data[ y*world.w+x ].state &= ~(FLAG_DROP|FLAG_SPLIT);
+                       world.data[ y*world.w+x ].state &= ~(FLAG_DROP_L|FLAG_DROP_R|FLAG_SPLIT|FLAG_MERGER);
                }
        }
        
@@ -412,14 +422,15 @@ void vg_update(void)
                        
                        u8 config = world.data[y*world.w+x].config;
                        
-                       if( config == 0x7 )
+                       if( config == 0x7 ) // splitter
                        {
-                               world.data[y*world.w+x ].state |= (FLAG_SPLIT | FLAG_DROP);
+                               world.data[y*world.w+x ].state |= (FLAG_SPLIT | FLAG_DROP_L | FLAG_DROP_R);
                        }
                        else if( config == 0xD )
                        {
-                               world.data[y*world.w+x-1].state |= FLAG_DROP;
-                               world.data[y*world.w+x+1].state |= FLAG_DROP;
+                               world.data[y*world.w+x-1].state |= FLAG_DROP_R;
+                               world.data[y*world.w+x+1].state |= FLAG_DROP_L;
+                               world.data[y*world.w+x].state |= FLAG_MERGER;
                        }
                }
        
@@ -502,7 +513,7 @@ void vg_update(void)
                        {
                                struct cell *cell = &world.data[y*world.w+x];
 
-                               if( cell->state & (FLAG_OUTPUT|FLAG_DROP) )
+                               if( cell->state & FLAG_OUTPUT )
                                        cell->water[ buffer_next ] = 16;
                                else
                                {
@@ -511,12 +522,31 @@ void vg_update(void)
                                        
                                        if( cell->state & FLAG_CANAL )
                                        {
-                                               v2i dirs[] = {{1,0},{0,1},{-1,0},{0,-1}};
+                                               v2i dirs[] = {{1,0},{-1,0},{0,-1}};
                                                
                                                for( int i = 0; i < vg_list_size( dirs ); i ++ )
                                                {
                                                        struct cell *neighbour = &world.data[(y+dirs[i][1])*world.w+x+dirs[i][0]];
                                                        
+                                                       // Non canals will be ignored
+                                                       if( !(neighbour->state & (FLAG_CANAL|FLAG_OUTPUT)) )
+                                                               continue;
+                                                       
+                                                       // Only vertical pulls allowed on neighbour splitters
+                                                       if( (neighbour->state & FLAG_SPLIT) && i != 2 )
+                                                               continue;
+                                                       
+                                                       // Only vertical pulls allowed for mergers
+                                                       if( (cell->state & FLAG_MERGER) && i != 2 )
+                                                               continue;
+                                                       
+                                                       // Test for renewall cases if we have drop L/R check if i matches direction.
+                                                       if( (((cell->state & FLAG_DROP_L)&&i==1) || ((cell->state & FLAG_DROP_R)&&i==0)) && neighbour->water[ buffer_id ] )
+                                                       {
+                                                               cell->water[ buffer_next ] = 16;
+                                                               has_source = 1;
+                                                       }
+                                                       else
                                                        if( neighbour->water[ buffer_id ] > cell->water[ buffer_next ]+1 )
                                                        {
                                                                has_source = 1;
@@ -569,12 +599,20 @@ void vg_render(void)
                        if( world.selected == y*world.w + x )
                                v3_muls( colour, sinf( vg_time )*0.25f + 0.5f, colour );
                        
-                       if( cell->state & (FLAG_DROP|FLAG_SPLIT) )
-                               v4_copy( (v4f){ 0.75f, 0.75f, 0.02f, 1.0f }, colour );
+                       //if( cell->state & (FLAG_SPLIT) )
+                       //      v4_copy( (v4f){ 0.75f, 0.75f, 0.02f, 1.0f }, colour );
+                       //if( cell->state & (FLAG_MERGER) )
+                       //      v4_copy( (v4f){ 0.75f, 0.02f, 0.75f, 1.0f }, colour );
                        
                        glUniform4fv( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1, colour );
                        
                        glDrawArrays( GL_TRIANGLES, 0, 6 );
+                       
+                       if( cell->state & FLAG_CANAL )
+                       {
+                               glUniform4f( SHADER_UNIFORM( shader_tile_colour, "uColour" ), 1.0f, 1.0f, 1.0f, 1.0f );
+                               glDrawArrays( GL_TRIANGLES, 6, 3 );
+                       }
                }
        }
 }