if you're working on production code with this, i'd wait for a better answer, but a couple interesting options that might work for you...
SELECT * FROM ( SELECT *, (used < copies and used > 0) AS copies_avail FROM level ORDER BY copies_avail desc, IF(copies_avail, price, -price) ASC ) AS x GROUP BY uc;
(you can just use the inner section if you want to specify a uc in a where clause)
similar option that's even more interesting (trying not to say hackish =p) would be
SELECT * FROM ( SELECT * FROM level ORDER BY IF(used < copies AND used > 0, price, -price + 10000) ASC ) AS x GROUP BY uc;
(where 10000 is much higher than any expected price in the table)
anyway... believe the output of both of these match your edited results, but are probably horrible performance wise. if you do get stuck doing something like this, you could probably store the copies_avail query result in the table to avoid the filesort?
also, curious about the case where used = 0 and copies > 0 - couldn't tell from your description if it should be sorted with the price asc or price desc group. in these examples, it's with price desc.