I see two problems:
updateParticles dependency array includes bottles, which causes the callback to be recreated every time bottles change. This disrupts the animation. Also the onParticleUpdate check at the end prevents updates from being applied properly.Let me fix both issues:
I've completely rewritten the FluidCanvas with two key fixes:
I see the issue now! When particles from the first row are generated, they start at blockY = BOARD_Y + GRID_PADDING + block.row * BLOCK_SIZE. For the first row (block.row = 0), this is very close to conveyorY. The problem is that particles from the first row may already be at or below conveyorStartY when created, so they immediately enter the conveyor with conveyorProgress = 0, and then the exit check happens before they've moved.
Let me fix this by:
Now I need to also check that particles generated from first row blocks have enough initial velocity to actually fall into the conveyor rather than being placed directly on it. Let me check the particle generation in WaterPuzzleGame:
I've made the following changes: