Ok, so I managed to get a clean way of swapping tiles so the next thing is to cause tiles to fall and fill in if there isn't a tile below them. I've tried a ton of ways and keep getting very unpredictable results.
Best, though messy, way I came up with involves setting a variable to either 0 or 1. 1 if it does not overlap another box (tried with and without offset, identical results). If it is overlapping at offset of (0,3) set to 0. If it's 1 move vertically 1.
Obviously this is way messy and over-complicated. Also it's broken. The offset doesn't seem to recognize positive/negative, so it only falls if there's a gap both below and above.
The use of a variable seems redundant, but if I don't use it, nothing happens. The same conditions that set it to 0 or 1 don't do anything when just told to move the tiles.
I'd really really appreciate some help.