Thanks for playing & for the kind words! Glad you liked it.
So each washable object is broken up into sections, let's say 4 separate parts to wash. Each section then has its own pixel data, contained in a matrix data structure (just an array of boolean or integer values for "cleaned" or "not cleaned").
Whenever pixels are washed, the dirty section updates its cached pixel data, and knows its percent completion state (for example, 50 out of 256 pixels cleaned so far = about 20% cleaned). Once it reaches 100% cleaned, it lets the washable object know it's finished. Then the washable object just waits until all of its sections are washed (in this case, 4 out of 4 sections).
You can see the pixel data being created in Tiled here: